@pie-lib/graphing-solution-set 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.
- package/lib/__tests__/bg.test.js +282 -0
- package/lib/__tests__/coordinates-label.test.js +276 -0
- package/lib/__tests__/graph-with-controls.test.js +256 -0
- package/lib/__tests__/graph.test.js +113 -0
- package/lib/__tests__/grid-setup.test.js +729 -0
- package/lib/__tests__/grid.test.js +29 -0
- package/lib/__tests__/labels.test.js +45 -0
- package/lib/__tests__/mark-label.test.js +133 -0
- package/lib/__tests__/toggle-bar.test.js +146 -0
- package/lib/__tests__/tool-menu.test.js +540 -0
- package/lib/__tests__/undo-redo.test.js +31 -0
- package/lib/__tests__/use-debounce.test.js +24 -0
- package/lib/__tests__/utils.js +70 -0
- package/lib/__tests__/utils.test.js +123 -0
- package/lib/axis/__tests__/arrow.test.js +60 -0
- package/lib/axis/__tests__/axes.test.js +160 -0
- package/lib/axis/arrow.js +1 -1
- package/lib/axis/axes.js +1 -1
- package/lib/axis/index.js +1 -1
- package/lib/bg.js +1 -1
- package/lib/container/__tests__/actions.test.js +108 -0
- package/lib/container/__tests__/index.test.js +346 -0
- package/lib/container/__tests__/marks.test.js +259 -0
- package/lib/container/__tests__/middleware.test.js +244 -0
- package/lib/container/__tests__/reducer.test.js +450 -0
- package/lib/container/actions.js +1 -1
- package/lib/container/index.js +1 -1
- package/lib/container/marks.js +1 -1
- package/lib/container/middleware.js +1 -1
- package/lib/container/reducer.js +1 -1
- package/lib/coordinates-label.js +1 -1
- package/lib/graph-with-controls.js +1 -1
- package/lib/graph.js +1 -1
- package/lib/grid-setup.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/index.js +1 -1
- package/lib/labels.js +1 -1
- package/lib/mark-label.js +1 -1
- package/lib/toggle-bar.js +1 -1
- package/lib/tool-menu.js +1 -1
- package/lib/tools/index.js +1 -1
- package/lib/tools/line/__tests__/component.test.js +45 -0
- package/lib/tools/line/component.js +1 -1
- package/lib/tools/line/index.js +1 -1
- package/lib/tools/polygon/__tests__/component.test.js +501 -0
- package/lib/tools/polygon/__tests__/index.test.js +92 -0
- package/lib/tools/polygon/__tests__/line.test.js +30 -0
- package/lib/tools/polygon/__tests__/polygon.test.js +61 -0
- package/lib/tools/polygon/component.js +1 -1
- package/lib/tools/polygon/index.js +1 -1
- package/lib/tools/polygon/line.js +1 -1
- package/lib/tools/polygon/polygon.js +1 -1
- package/lib/tools/shared/__tests__/arrow-head.test.js +45 -0
- package/lib/tools/shared/arrow-head.js +1 -1
- package/lib/tools/shared/line/__tests__/index.test.js +725 -0
- package/lib/tools/shared/line/__tests__/line-path.test.js +64 -0
- package/lib/tools/shared/line/__tests__/with-root-edge.test.js +618 -0
- package/lib/tools/shared/line/index.js +1 -1
- package/lib/tools/shared/line/line-path.js +1 -1
- package/lib/tools/shared/line/with-root-edge.js +1 -1
- package/lib/tools/shared/point/__tests__/arrow-point.test.js +127 -0
- package/lib/tools/shared/point/__tests__/arrow.test.js +619 -0
- package/lib/tools/shared/point/__tests__/base-point.test.js +122 -0
- package/lib/tools/shared/point/arrow-point.js +1 -1
- package/lib/tools/shared/point/arrow.js +1 -1
- package/lib/tools/shared/point/base-point.js +1 -1
- package/lib/tools/shared/point/index.js +1 -1
- package/lib/tools/shared/styles.js +1 -1
- package/lib/tools/shared/types.js +1 -1
- package/lib/undo-redo.js +1 -1
- package/lib/use-debounce.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +10 -13
- package/LICENSE.md +0 -5
|
@@ -0,0 +1,619 @@
|
|
|
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 _arrow = _interopRequireDefault(require("../arrow"));
|
|
8
|
+
var _utils = require("../../../../__tests__/utils");
|
|
9
|
+
var _utils2 = require("../../../../utils");
|
|
10
|
+
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; }
|
|
11
|
+
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; }
|
|
12
|
+
jest.mock('../../../../utils', function () {
|
|
13
|
+
return _objectSpread(_objectSpread({}, jest.requireActual('../../../../utils')), {}, {
|
|
14
|
+
thinnerShapesNeeded: jest.fn(function () {
|
|
15
|
+
return false;
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('Arrow', function () {
|
|
20
|
+
var onChange = jest.fn();
|
|
21
|
+
var renderComponent = function renderComponent(extras) {
|
|
22
|
+
var defaults = {
|
|
23
|
+
classes: {},
|
|
24
|
+
className: 'arrow-class',
|
|
25
|
+
onChange: onChange,
|
|
26
|
+
graphProps: (0, _utils.graphProps)(),
|
|
27
|
+
x: 5,
|
|
28
|
+
y: 10,
|
|
29
|
+
angle: 45
|
|
30
|
+
};
|
|
31
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
32
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], props));
|
|
33
|
+
};
|
|
34
|
+
beforeEach(function () {
|
|
35
|
+
onChange = jest.fn();
|
|
36
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(false);
|
|
37
|
+
});
|
|
38
|
+
describe('rendering', function () {
|
|
39
|
+
it('renders without crashing', function () {
|
|
40
|
+
var _renderComponent = renderComponent(),
|
|
41
|
+
container = _renderComponent.container;
|
|
42
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
it('renders a g element with correct class names', function () {
|
|
45
|
+
var _renderComponent2 = renderComponent({
|
|
46
|
+
classes: {
|
|
47
|
+
point: 'point-class'
|
|
48
|
+
},
|
|
49
|
+
className: 'custom-class'
|
|
50
|
+
}),
|
|
51
|
+
container = _renderComponent2.container;
|
|
52
|
+
var gElement = container.querySelector('g');
|
|
53
|
+
expect(gElement).toBeInTheDocument();
|
|
54
|
+
expect(gElement).toHaveClass('point-class');
|
|
55
|
+
expect(gElement).toHaveClass('custom-class');
|
|
56
|
+
});
|
|
57
|
+
it('renders ArrowHead component', function () {
|
|
58
|
+
var _renderComponent3 = renderComponent(),
|
|
59
|
+
container = _renderComponent3.container;
|
|
60
|
+
var polygon = container.querySelector('polygon');
|
|
61
|
+
expect(polygon).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
it('applies disabled class when disabled is true', function () {
|
|
64
|
+
var _renderComponent4 = renderComponent({
|
|
65
|
+
classes: {
|
|
66
|
+
point: 'point-class',
|
|
67
|
+
disabled: 'disabled-class'
|
|
68
|
+
},
|
|
69
|
+
disabled: true
|
|
70
|
+
}),
|
|
71
|
+
container = _renderComponent4.container;
|
|
72
|
+
var gElement = container.querySelector('g');
|
|
73
|
+
expect(gElement).toHaveClass('disabled-class');
|
|
74
|
+
});
|
|
75
|
+
it('does not apply disabled class when disabled is false', function () {
|
|
76
|
+
var _renderComponent5 = renderComponent({
|
|
77
|
+
classes: {
|
|
78
|
+
point: 'point-class',
|
|
79
|
+
disabled: 'disabled-class'
|
|
80
|
+
},
|
|
81
|
+
disabled: false
|
|
82
|
+
}),
|
|
83
|
+
container = _renderComponent5.container;
|
|
84
|
+
var gElement = container.querySelector('g');
|
|
85
|
+
expect(gElement).not.toHaveClass('disabled-class');
|
|
86
|
+
});
|
|
87
|
+
it('applies correctness class when provided', function () {
|
|
88
|
+
var _renderComponent6 = renderComponent({
|
|
89
|
+
classes: {
|
|
90
|
+
point: 'point-class',
|
|
91
|
+
correct: 'correct-class'
|
|
92
|
+
},
|
|
93
|
+
correctness: 'correct'
|
|
94
|
+
}),
|
|
95
|
+
container = _renderComponent6.container;
|
|
96
|
+
var gElement = container.querySelector('g');
|
|
97
|
+
expect(gElement).toHaveClass('correct-class');
|
|
98
|
+
});
|
|
99
|
+
it('applies incorrect correctness class', function () {
|
|
100
|
+
var _renderComponent7 = renderComponent({
|
|
101
|
+
classes: {
|
|
102
|
+
point: 'point-class',
|
|
103
|
+
incorrect: 'incorrect-class'
|
|
104
|
+
},
|
|
105
|
+
correctness: 'incorrect'
|
|
106
|
+
}),
|
|
107
|
+
container = _renderComponent7.container;
|
|
108
|
+
var gElement = container.querySelector('g');
|
|
109
|
+
expect(gElement).toHaveClass('incorrect-class');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('size calculation', function () {
|
|
113
|
+
it('uses size 14 when thinnerShapesNeeded returns false', function () {
|
|
114
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(false);
|
|
115
|
+
var _renderComponent8 = renderComponent({
|
|
116
|
+
x: 0,
|
|
117
|
+
y: 0
|
|
118
|
+
}),
|
|
119
|
+
container = _renderComponent8.container;
|
|
120
|
+
var polygon = container.querySelector('polygon');
|
|
121
|
+
|
|
122
|
+
// Expected points: "0,0 -14,-7 -14,7"
|
|
123
|
+
expect(polygon).toHaveAttribute('points');
|
|
124
|
+
var points = polygon.getAttribute('points');
|
|
125
|
+
expect(points).toContain('-14');
|
|
126
|
+
});
|
|
127
|
+
it('uses size 12 when thinnerShapesNeeded returns true', function () {
|
|
128
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(true);
|
|
129
|
+
var _renderComponent9 = renderComponent({
|
|
130
|
+
x: 0,
|
|
131
|
+
y: 0
|
|
132
|
+
}),
|
|
133
|
+
container = _renderComponent9.container;
|
|
134
|
+
var polygon = container.querySelector('polygon');
|
|
135
|
+
|
|
136
|
+
// Expected points: "0,0 -12,-6 -12,6"
|
|
137
|
+
expect(polygon).toHaveAttribute('points');
|
|
138
|
+
var points = polygon.getAttribute('points');
|
|
139
|
+
expect(points).toContain('-12');
|
|
140
|
+
});
|
|
141
|
+
it('calls thinnerShapesNeeded with graphProps', function () {
|
|
142
|
+
var gp = (0, _utils.graphProps)();
|
|
143
|
+
renderComponent({
|
|
144
|
+
graphProps: gp
|
|
145
|
+
});
|
|
146
|
+
expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('coordinate scaling', function () {
|
|
150
|
+
it('scales x and y coordinates using graphProps.scale', function () {
|
|
151
|
+
var mockScale = {
|
|
152
|
+
x: jest.fn(function (n) {
|
|
153
|
+
return n * 10;
|
|
154
|
+
}),
|
|
155
|
+
y: jest.fn(function (n) {
|
|
156
|
+
return n * 20;
|
|
157
|
+
})
|
|
158
|
+
};
|
|
159
|
+
var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
|
|
160
|
+
scale: mockScale
|
|
161
|
+
});
|
|
162
|
+
renderComponent({
|
|
163
|
+
x: 5,
|
|
164
|
+
y: 10,
|
|
165
|
+
graphProps: gp
|
|
166
|
+
});
|
|
167
|
+
expect(mockScale.x).toHaveBeenCalledWith(5);
|
|
168
|
+
expect(mockScale.y).toHaveBeenCalledWith(10);
|
|
169
|
+
});
|
|
170
|
+
it('renders arrow with scaled coordinates', function () {
|
|
171
|
+
var mockScale = {
|
|
172
|
+
x: jest.fn(function (n) {
|
|
173
|
+
return n * 2;
|
|
174
|
+
}),
|
|
175
|
+
y: jest.fn(function (n) {
|
|
176
|
+
return n * 3;
|
|
177
|
+
})
|
|
178
|
+
};
|
|
179
|
+
var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
|
|
180
|
+
scale: mockScale
|
|
181
|
+
});
|
|
182
|
+
var _renderComponent0 = renderComponent({
|
|
183
|
+
x: 5,
|
|
184
|
+
y: 10,
|
|
185
|
+
graphProps: gp,
|
|
186
|
+
angle: 0
|
|
187
|
+
}),
|
|
188
|
+
container = _renderComponent0.container;
|
|
189
|
+
var polygon = container.querySelector('polygon');
|
|
190
|
+
|
|
191
|
+
// scaledX = 5 * 2 = 10, scaledY = 10 * 3 = 30
|
|
192
|
+
// Expected points: "10,30 -4,23 -4,37" (with size 14)
|
|
193
|
+
var points = polygon.getAttribute('points');
|
|
194
|
+
expect(points).toContain('10');
|
|
195
|
+
expect(points).toContain('30');
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('angle rotation', function () {
|
|
199
|
+
it('applies rotation transform with negative angle', function () {
|
|
200
|
+
var _renderComponent1 = renderComponent({
|
|
201
|
+
x: 5,
|
|
202
|
+
y: 10,
|
|
203
|
+
angle: 45
|
|
204
|
+
}),
|
|
205
|
+
container = _renderComponent1.container;
|
|
206
|
+
var polygon = container.querySelector('polygon');
|
|
207
|
+
var transform = polygon.getAttribute('transform');
|
|
208
|
+
|
|
209
|
+
// Angle should be negated: rotate(-45, 5, 10)
|
|
210
|
+
expect(transform).toContain('rotate(-45');
|
|
211
|
+
expect(transform).toContain('5');
|
|
212
|
+
expect(transform).toContain('10');
|
|
213
|
+
});
|
|
214
|
+
it('handles zero angle', function () {
|
|
215
|
+
var _renderComponent10 = renderComponent({
|
|
216
|
+
x: 3,
|
|
217
|
+
y: 7,
|
|
218
|
+
angle: 0
|
|
219
|
+
}),
|
|
220
|
+
container = _renderComponent10.container;
|
|
221
|
+
var polygon = container.querySelector('polygon');
|
|
222
|
+
var transform = polygon.getAttribute('transform');
|
|
223
|
+
|
|
224
|
+
// will convert -0 to 0
|
|
225
|
+
expect(transform).toMatch(/rotate\((-)?0/);
|
|
226
|
+
expect(transform).toContain('3');
|
|
227
|
+
expect(transform).toContain('7');
|
|
228
|
+
});
|
|
229
|
+
it('handles negative angle', function () {
|
|
230
|
+
var _renderComponent11 = renderComponent({
|
|
231
|
+
x: 2,
|
|
232
|
+
y: 4,
|
|
233
|
+
angle: -30
|
|
234
|
+
}),
|
|
235
|
+
container = _renderComponent11.container;
|
|
236
|
+
var polygon = container.querySelector('polygon');
|
|
237
|
+
var transform = polygon.getAttribute('transform');
|
|
238
|
+
|
|
239
|
+
// -(-30) = 30
|
|
240
|
+
expect(transform).toContain('rotate(30');
|
|
241
|
+
expect(transform).toContain('2');
|
|
242
|
+
expect(transform).toContain('4');
|
|
243
|
+
});
|
|
244
|
+
it('handles 360 degree angle', function () {
|
|
245
|
+
var _renderComponent12 = renderComponent({
|
|
246
|
+
x: 1,
|
|
247
|
+
y: 1,
|
|
248
|
+
angle: 360
|
|
249
|
+
}),
|
|
250
|
+
container = _renderComponent12.container;
|
|
251
|
+
var polygon = container.querySelector('polygon');
|
|
252
|
+
var transform = polygon.getAttribute('transform');
|
|
253
|
+
expect(transform).toContain('rotate(-360');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('arrow points calculation', function () {
|
|
257
|
+
it('calculates correct points for arrow head', function () {
|
|
258
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(false);
|
|
259
|
+
var _renderComponent13 = renderComponent({
|
|
260
|
+
x: 0,
|
|
261
|
+
y: 0,
|
|
262
|
+
angle: 0
|
|
263
|
+
}),
|
|
264
|
+
container = _renderComponent13.container;
|
|
265
|
+
var polygon = container.querySelector('polygon');
|
|
266
|
+
|
|
267
|
+
// size = 14
|
|
268
|
+
// points = "0,0 -14,-7 -14, 7" (note the space after comma in the template literal)
|
|
269
|
+
var points = polygon.getAttribute('points');
|
|
270
|
+
expect(points).toContain('0,0');
|
|
271
|
+
expect(points).toContain('-14,-7');
|
|
272
|
+
expect(points).toMatch(/-14,\s*7/);
|
|
273
|
+
});
|
|
274
|
+
it('calculates points with scaled coordinates', function () {
|
|
275
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(false);
|
|
276
|
+
var mockScale = {
|
|
277
|
+
x: jest.fn(function (n) {
|
|
278
|
+
return n;
|
|
279
|
+
}),
|
|
280
|
+
y: jest.fn(function (n) {
|
|
281
|
+
return n;
|
|
282
|
+
})
|
|
283
|
+
};
|
|
284
|
+
var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
|
|
285
|
+
scale: mockScale
|
|
286
|
+
});
|
|
287
|
+
var _renderComponent14 = renderComponent({
|
|
288
|
+
x: 10,
|
|
289
|
+
y: 20,
|
|
290
|
+
graphProps: gp
|
|
291
|
+
}),
|
|
292
|
+
container = _renderComponent14.container;
|
|
293
|
+
var polygon = container.querySelector('polygon');
|
|
294
|
+
|
|
295
|
+
// scaledX = 10, scaledY = 20, size = 14
|
|
296
|
+
// points = "10,20 -4,13 -4, 27" (note the space after comma in the template literal)
|
|
297
|
+
var points = polygon.getAttribute('points');
|
|
298
|
+
expect(points).toContain('10,20');
|
|
299
|
+
expect(points).toContain('-4,13');
|
|
300
|
+
expect(points).toMatch(/-4,\s*27/);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
describe('props handling', function () {
|
|
304
|
+
it('passes through additional props to g element', function () {
|
|
305
|
+
var _renderComponent15 = renderComponent({
|
|
306
|
+
'data-test': 'arrow-test',
|
|
307
|
+
role: 'graphics-symbol'
|
|
308
|
+
}),
|
|
309
|
+
container = _renderComponent15.container;
|
|
310
|
+
var gElement = container.querySelector('g');
|
|
311
|
+
expect(gElement).toHaveAttribute('data-test', 'arrow-test');
|
|
312
|
+
expect(gElement).toHaveAttribute('role', 'graphics-symbol');
|
|
313
|
+
});
|
|
314
|
+
it('excludes filtered props from g element', function () {
|
|
315
|
+
var _renderComponent16 = renderComponent({
|
|
316
|
+
x: 5,
|
|
317
|
+
y: 10,
|
|
318
|
+
angle: 45,
|
|
319
|
+
disabled: false,
|
|
320
|
+
correctness: 'correct',
|
|
321
|
+
graphProps: (0, _utils.graphProps)()
|
|
322
|
+
}),
|
|
323
|
+
container = _renderComponent16.container;
|
|
324
|
+
var gElement = container.querySelector('g');
|
|
325
|
+
|
|
326
|
+
// These props should not be passed to the g element
|
|
327
|
+
expect(gElement).not.toHaveAttribute('x');
|
|
328
|
+
expect(gElement).not.toHaveAttribute('y');
|
|
329
|
+
expect(gElement).not.toHaveAttribute('angle');
|
|
330
|
+
expect(gElement).not.toHaveAttribute('disabled');
|
|
331
|
+
expect(gElement).not.toHaveAttribute('correctness');
|
|
332
|
+
expect(gElement).not.toHaveAttribute('graphProps');
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe('edge cases', function () {
|
|
336
|
+
it('handles zero coordinates', function () {
|
|
337
|
+
var _renderComponent17 = renderComponent({
|
|
338
|
+
x: 0,
|
|
339
|
+
y: 0,
|
|
340
|
+
angle: 0
|
|
341
|
+
}),
|
|
342
|
+
container = _renderComponent17.container;
|
|
343
|
+
var polygon = container.querySelector('polygon');
|
|
344
|
+
expect(polygon).toBeInTheDocument();
|
|
345
|
+
expect(polygon.getAttribute('points')).toBeTruthy();
|
|
346
|
+
expect(polygon.getAttribute('transform')).toBeTruthy();
|
|
347
|
+
});
|
|
348
|
+
it('handles negative coordinates', function () {
|
|
349
|
+
var _renderComponent18 = renderComponent({
|
|
350
|
+
x: -5,
|
|
351
|
+
y: -10,
|
|
352
|
+
angle: 0
|
|
353
|
+
}),
|
|
354
|
+
container = _renderComponent18.container;
|
|
355
|
+
var polygon = container.querySelector('polygon');
|
|
356
|
+
expect(polygon).toBeInTheDocument();
|
|
357
|
+
expect(polygon.getAttribute('points')).toBeTruthy();
|
|
358
|
+
expect(polygon.getAttribute('transform')).toBeTruthy();
|
|
359
|
+
});
|
|
360
|
+
it('handles large coordinates', function () {
|
|
361
|
+
var _renderComponent19 = renderComponent({
|
|
362
|
+
x: 1000,
|
|
363
|
+
y: 2000,
|
|
364
|
+
angle: 0
|
|
365
|
+
}),
|
|
366
|
+
container = _renderComponent19.container;
|
|
367
|
+
var polygon = container.querySelector('polygon');
|
|
368
|
+
expect(polygon).toBeInTheDocument();
|
|
369
|
+
});
|
|
370
|
+
it('handles fractional coordinates', function () {
|
|
371
|
+
var _renderComponent20 = renderComponent({
|
|
372
|
+
x: 3.5,
|
|
373
|
+
y: 7.25,
|
|
374
|
+
angle: 22.5
|
|
375
|
+
}),
|
|
376
|
+
container = _renderComponent20.container;
|
|
377
|
+
var polygon = container.querySelector('polygon');
|
|
378
|
+
expect(polygon).toBeInTheDocument();
|
|
379
|
+
expect(polygon.getAttribute('transform')).toContain('rotate(-22.5');
|
|
380
|
+
});
|
|
381
|
+
it('renders with empty classes prop', function () {
|
|
382
|
+
var _render = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
383
|
+
x: 5,
|
|
384
|
+
y: 10,
|
|
385
|
+
angle: 45,
|
|
386
|
+
graphProps: (0, _utils.graphProps)(),
|
|
387
|
+
classes: {}
|
|
388
|
+
})),
|
|
389
|
+
container = _render.container;
|
|
390
|
+
var gElement = container.querySelector('g');
|
|
391
|
+
expect(gElement).toBeInTheDocument();
|
|
392
|
+
});
|
|
393
|
+
it('renders without className prop', function () {
|
|
394
|
+
var _render2 = (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
395
|
+
x: 5,
|
|
396
|
+
y: 10,
|
|
397
|
+
angle: 45,
|
|
398
|
+
graphProps: (0, _utils.graphProps)(),
|
|
399
|
+
classes: {}
|
|
400
|
+
})),
|
|
401
|
+
container = _render2.container;
|
|
402
|
+
var gElement = container.querySelector('g');
|
|
403
|
+
expect(gElement).toBeInTheDocument();
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
describe('graphProps integration', function () {
|
|
407
|
+
it('works with different domain and range values', function () {
|
|
408
|
+
var gp = (0, _utils.graphProps)(-10, 10, -20, 20);
|
|
409
|
+
var _renderComponent21 = renderComponent({
|
|
410
|
+
graphProps: gp
|
|
411
|
+
}),
|
|
412
|
+
container = _renderComponent21.container;
|
|
413
|
+
expect(container.querySelector('polygon')).toBeInTheDocument();
|
|
414
|
+
expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
|
|
415
|
+
});
|
|
416
|
+
it('works with custom size in graphProps', function () {
|
|
417
|
+
var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
|
|
418
|
+
size: {
|
|
419
|
+
width: 800,
|
|
420
|
+
height: 600
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
var _renderComponent22 = renderComponent({
|
|
424
|
+
graphProps: gp
|
|
425
|
+
}),
|
|
426
|
+
container = _renderComponent22.container;
|
|
427
|
+
expect(container.querySelector('polygon')).toBeInTheDocument();
|
|
428
|
+
});
|
|
429
|
+
it('handles graphProps with small step values', function () {
|
|
430
|
+
var gp = _objectSpread(_objectSpread({}, (0, _utils.graphProps)()), {}, {
|
|
431
|
+
domain: {
|
|
432
|
+
min: 0,
|
|
433
|
+
max: 10,
|
|
434
|
+
step: 0.1
|
|
435
|
+
},
|
|
436
|
+
range: {
|
|
437
|
+
min: 0,
|
|
438
|
+
max: 10,
|
|
439
|
+
step: 0.1
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(true);
|
|
443
|
+
var _renderComponent23 = renderComponent({
|
|
444
|
+
graphProps: gp
|
|
445
|
+
}),
|
|
446
|
+
container = _renderComponent23.container;
|
|
447
|
+
var polygon = container.querySelector('polygon');
|
|
448
|
+
|
|
449
|
+
// Should use size 12 for thinner shapes
|
|
450
|
+
expect(polygon).toBeInTheDocument();
|
|
451
|
+
expect(_utils2.thinnerShapesNeeded).toHaveBeenCalledWith(gp);
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
describe('multiple correctness states', function () {
|
|
455
|
+
it('handles partial correctness', function () {
|
|
456
|
+
var _renderComponent24 = renderComponent({
|
|
457
|
+
classes: {
|
|
458
|
+
point: 'point-class',
|
|
459
|
+
partial: 'partial-class'
|
|
460
|
+
},
|
|
461
|
+
correctness: 'partial'
|
|
462
|
+
}),
|
|
463
|
+
container = _renderComponent24.container;
|
|
464
|
+
var gElement = container.querySelector('g');
|
|
465
|
+
expect(gElement).toHaveClass('partial-class');
|
|
466
|
+
});
|
|
467
|
+
it('handles undefined correctness', function () {
|
|
468
|
+
var _renderComponent25 = renderComponent({
|
|
469
|
+
classes: {
|
|
470
|
+
point: 'point-class'
|
|
471
|
+
},
|
|
472
|
+
correctness: undefined
|
|
473
|
+
}),
|
|
474
|
+
container = _renderComponent25.container;
|
|
475
|
+
var gElement = container.querySelector('g');
|
|
476
|
+
expect(gElement).toHaveClass('point-class');
|
|
477
|
+
});
|
|
478
|
+
it('handles null correctness', function () {
|
|
479
|
+
var _renderComponent26 = renderComponent({
|
|
480
|
+
classes: {
|
|
481
|
+
point: 'point-class'
|
|
482
|
+
},
|
|
483
|
+
correctness: null
|
|
484
|
+
}),
|
|
485
|
+
container = _renderComponent26.container;
|
|
486
|
+
var gElement = container.querySelector('g');
|
|
487
|
+
expect(gElement).toHaveClass('point-class');
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
describe('combined states', function () {
|
|
491
|
+
it('handles disabled and correct states together', function () {
|
|
492
|
+
var _renderComponent27 = renderComponent({
|
|
493
|
+
classes: {
|
|
494
|
+
point: 'point-class',
|
|
495
|
+
disabled: 'disabled-class',
|
|
496
|
+
correct: 'correct-class'
|
|
497
|
+
},
|
|
498
|
+
disabled: true,
|
|
499
|
+
correctness: 'correct'
|
|
500
|
+
}),
|
|
501
|
+
container = _renderComponent27.container;
|
|
502
|
+
var gElement = container.querySelector('g');
|
|
503
|
+
expect(gElement).toHaveClass('point-class');
|
|
504
|
+
expect(gElement).toHaveClass('disabled-class');
|
|
505
|
+
expect(gElement).toHaveClass('correct-class');
|
|
506
|
+
});
|
|
507
|
+
it('handles disabled and incorrect states together', function () {
|
|
508
|
+
var _renderComponent28 = renderComponent({
|
|
509
|
+
classes: {
|
|
510
|
+
point: 'point-class',
|
|
511
|
+
disabled: 'disabled-class',
|
|
512
|
+
incorrect: 'incorrect-class'
|
|
513
|
+
},
|
|
514
|
+
disabled: true,
|
|
515
|
+
correctness: 'incorrect'
|
|
516
|
+
}),
|
|
517
|
+
container = _renderComponent28.container;
|
|
518
|
+
var gElement = container.querySelector('g');
|
|
519
|
+
expect(gElement).toHaveClass('point-class');
|
|
520
|
+
expect(gElement).toHaveClass('disabled-class');
|
|
521
|
+
expect(gElement).toHaveClass('incorrect-class');
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
describe('re-rendering', function () {
|
|
525
|
+
it('updates when x coordinate changes', function () {
|
|
526
|
+
var _renderComponent29 = renderComponent({
|
|
527
|
+
x: 5,
|
|
528
|
+
y: 10,
|
|
529
|
+
angle: 0
|
|
530
|
+
}),
|
|
531
|
+
container = _renderComponent29.container,
|
|
532
|
+
rerender = _renderComponent29.rerender;
|
|
533
|
+
var polygon = container.querySelector('polygon');
|
|
534
|
+
var initialPoints = polygon.getAttribute('points');
|
|
535
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
536
|
+
x: 15,
|
|
537
|
+
y: 10,
|
|
538
|
+
angle: 0,
|
|
539
|
+
graphProps: (0, _utils.graphProps)(),
|
|
540
|
+
classes: {},
|
|
541
|
+
className: "arrow-class"
|
|
542
|
+
}));
|
|
543
|
+
polygon = container.querySelector('polygon');
|
|
544
|
+
var newPoints = polygon.getAttribute('points');
|
|
545
|
+
expect(newPoints).not.toBe(initialPoints);
|
|
546
|
+
});
|
|
547
|
+
it('updates when y coordinate changes', function () {
|
|
548
|
+
var _renderComponent30 = renderComponent({
|
|
549
|
+
x: 5,
|
|
550
|
+
y: 10,
|
|
551
|
+
angle: 0
|
|
552
|
+
}),
|
|
553
|
+
container = _renderComponent30.container,
|
|
554
|
+
rerender = _renderComponent30.rerender;
|
|
555
|
+
var polygon = container.querySelector('polygon');
|
|
556
|
+
var initialPoints = polygon.getAttribute('points');
|
|
557
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
558
|
+
x: 5,
|
|
559
|
+
y: 20,
|
|
560
|
+
angle: 0,
|
|
561
|
+
graphProps: (0, _utils.graphProps)(),
|
|
562
|
+
classes: {},
|
|
563
|
+
className: "arrow-class"
|
|
564
|
+
}));
|
|
565
|
+
polygon = container.querySelector('polygon');
|
|
566
|
+
var newPoints = polygon.getAttribute('points');
|
|
567
|
+
expect(newPoints).not.toBe(initialPoints);
|
|
568
|
+
});
|
|
569
|
+
it('updates when angle changes', function () {
|
|
570
|
+
var _renderComponent31 = renderComponent({
|
|
571
|
+
x: 5,
|
|
572
|
+
y: 10,
|
|
573
|
+
angle: 0
|
|
574
|
+
}),
|
|
575
|
+
container = _renderComponent31.container,
|
|
576
|
+
rerender = _renderComponent31.rerender;
|
|
577
|
+
var polygon = container.querySelector('polygon');
|
|
578
|
+
var initialTransform = polygon.getAttribute('transform');
|
|
579
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
580
|
+
x: 5,
|
|
581
|
+
y: 10,
|
|
582
|
+
angle: 90,
|
|
583
|
+
graphProps: (0, _utils.graphProps)(),
|
|
584
|
+
classes: {},
|
|
585
|
+
className: "arrow-class"
|
|
586
|
+
}));
|
|
587
|
+
polygon = container.querySelector('polygon');
|
|
588
|
+
var newTransform = polygon.getAttribute('transform');
|
|
589
|
+
expect(newTransform).not.toBe(initialTransform);
|
|
590
|
+
expect(newTransform).toContain('rotate(-90');
|
|
591
|
+
});
|
|
592
|
+
it('updates when thinnerShapesNeeded result changes', function () {
|
|
593
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(false);
|
|
594
|
+
var _renderComponent32 = renderComponent({
|
|
595
|
+
x: 0,
|
|
596
|
+
y: 0,
|
|
597
|
+
angle: 0
|
|
598
|
+
}),
|
|
599
|
+
container = _renderComponent32.container,
|
|
600
|
+
rerender = _renderComponent32.rerender;
|
|
601
|
+
var polygon = container.querySelector('polygon');
|
|
602
|
+
var initialPoints = polygon.getAttribute('points');
|
|
603
|
+
_utils2.thinnerShapesNeeded.mockReturnValue(true);
|
|
604
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_arrow["default"], {
|
|
605
|
+
x: 0,
|
|
606
|
+
y: 0,
|
|
607
|
+
angle: 0,
|
|
608
|
+
graphProps: (0, _utils.graphProps)(),
|
|
609
|
+
classes: {},
|
|
610
|
+
className: "arrow-class"
|
|
611
|
+
}));
|
|
612
|
+
polygon = container.querySelector('polygon');
|
|
613
|
+
var newPoints = polygon.getAttribute('points');
|
|
614
|
+
// Points should change due to size change (14 vs 12)
|
|
615
|
+
expect(newPoints).not.toBe(initialPoints);
|
|
616
|
+
});
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdFV0aWxzIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYXJyb3ciLCJfdXRpbHMiLCJfdXRpbHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsInJlcXVpcmVBY3R1YWwiLCJ0aGlubmVyU2hhcGVzTmVlZGVkIiwiZm4iLCJkZXNjcmliZSIsIm9uQ2hhbmdlIiwicmVuZGVyQ29tcG9uZW50IiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwiY2xhc3NOYW1lIiwiZ3JhcGhQcm9wcyIsIngiLCJ5IiwiYW5nbGUiLCJwcm9wcyIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJiZWZvcmVFYWNoIiwibW9ja1JldHVyblZhbHVlIiwiaXQiLCJfcmVuZGVyQ29tcG9uZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwiZmlyc3RDaGlsZCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlckNvbXBvbmVudDIiLCJwb2ludCIsImdFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInRvSGF2ZUNsYXNzIiwiX3JlbmRlckNvbXBvbmVudDMiLCJwb2x5Z29uIiwiX3JlbmRlckNvbXBvbmVudDQiLCJkaXNhYmxlZCIsIl9yZW5kZXJDb21wb25lbnQ1Iiwibm90IiwiX3JlbmRlckNvbXBvbmVudDYiLCJjb3JyZWN0IiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50NyIsImluY29ycmVjdCIsIl9yZW5kZXJDb21wb25lbnQ4IiwidG9IYXZlQXR0cmlidXRlIiwicG9pbnRzIiwiZ2V0QXR0cmlidXRlIiwidG9Db250YWluIiwiX3JlbmRlckNvbXBvbmVudDkiLCJncCIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwibW9ja1NjYWxlIiwibiIsInNjYWxlIiwiX3JlbmRlckNvbXBvbmVudDAiLCJfcmVuZGVyQ29tcG9uZW50MSIsInRyYW5zZm9ybSIsIl9yZW5kZXJDb21wb25lbnQxMCIsInRvTWF0Y2giLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJfcmVuZGVyQ29tcG9uZW50MTIiLCJfcmVuZGVyQ29tcG9uZW50MTMiLCJfcmVuZGVyQ29tcG9uZW50MTQiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJyb2xlIiwiX3JlbmRlckNvbXBvbmVudDE2IiwiX3JlbmRlckNvbXBvbmVudDE3IiwidG9CZVRydXRoeSIsIl9yZW5kZXJDb21wb25lbnQxOCIsIl9yZW5kZXJDb21wb25lbnQxOSIsIl9yZW5kZXJDb21wb25lbnQyMCIsIl9yZW5kZXIiLCJfcmVuZGVyMiIsIl9yZW5kZXJDb21wb25lbnQyMSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsIl9yZW5kZXJDb21wb25lbnQyMiIsImRvbWFpbiIsIm1pbiIsIm1heCIsInN0ZXAiLCJyYW5nZSIsIl9yZW5kZXJDb21wb25lbnQyMyIsIl9yZW5kZXJDb21wb25lbnQyNCIsInBhcnRpYWwiLCJfcmVuZGVyQ29tcG9uZW50MjUiLCJ1bmRlZmluZWQiLCJfcmVuZGVyQ29tcG9uZW50MjYiLCJfcmVuZGVyQ29tcG9uZW50MjciLCJfcmVuZGVyQ29tcG9uZW50MjgiLCJfcmVuZGVyQ29tcG9uZW50MjkiLCJyZXJlbmRlciIsImluaXRpYWxQb2ludHMiLCJuZXdQb2ludHMiLCJ0b0JlIiwiX3JlbmRlckNvbXBvbmVudDMwIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiaW5pdGlhbFRyYW5zZm9ybSIsIm5ld1RyYW5zZm9ybSIsIl9yZW5kZXJDb21wb25lbnQzMiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90b29scy9zaGFyZWQvcG9pbnQvX190ZXN0c19fL2Fycm93LnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBcnJvdyBmcm9tICcuLi9hcnJvdyc7XG5pbXBvcnQgeyBncmFwaFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vLi4vX190ZXN0c19fL3V0aWxzJztcbmltcG9ydCB7IHRoaW5uZXJTaGFwZXNOZWVkZWQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmplc3QubW9jaygnLi4vLi4vLi4vLi4vdXRpbHMnLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoJy4uLy4uLy4uLy4uL3V0aWxzJyksXG4gIHRoaW5uZXJTaGFwZXNOZWVkZWQ6IGplc3QuZm4oKCkgPT4gZmFsc2UpLFxufSkpO1xuXG5kZXNjcmliZSgnQXJyb3cnLCAoKSA9PiB7XG4gIGxldCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcblxuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGNsYXNzTmFtZTogJ2Fycm93LWNsYXNzJyxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgICAgeDogNSxcbiAgICAgIHk6IDEwLFxuICAgICAgYW5nbGU6IDQ1LFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzLCAuLi5leHRyYXMgfTtcbiAgICByZXR1cm4gcmVuZGVyKDxBcnJvdyB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGEgZyBlbGVtZW50IHdpdGggY29ycmVjdCBjbGFzcyBuYW1lcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnIH0sXG4gICAgICAgIGNsYXNzTmFtZTogJ2N1c3RvbS1jbGFzcycsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ3BvaW50LWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdjdXN0b20tY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIEFycm93SGVhZCBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGxpZXMgZGlzYWJsZWQgY2xhc3Mgd2hlbiBkaXNhYmxlZCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcG9pbnQ6ICdwb2ludC1jbGFzcycsIGRpc2FibGVkOiAnZGlzYWJsZWQtY2xhc3MnIH0sXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdkaXNhYmxlZC1jbGFzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFwcGx5IGRpc2FibGVkIGNsYXNzIHdoZW4gZGlzYWJsZWQgaXMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJywgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycgfSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLm5vdC50b0hhdmVDbGFzcygnZGlzYWJsZWQtY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGNvcnJlY3RuZXNzIGNsYXNzIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJywgY29ycmVjdDogJ2NvcnJlY3QtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnY29ycmVjdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2NvcnJlY3QtY2xhc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGluY29ycmVjdCBjb3JyZWN0bmVzcyBjbGFzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnLCBpbmNvcnJlY3Q6ICdpbmNvcnJlY3QtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygnaW5jb3JyZWN0LWNsYXNzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaXplIGNhbGN1bGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCd1c2VzIHNpemUgMTQgd2hlbiB0aGlubmVyU2hhcGVzTmVlZGVkIHJldHVybnMgZmFsc2UnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMCwgeTogMCB9KTtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuXG4gICAgICAvLyBFeHBlY3RlZCBwb2ludHM6IFwiMCwwIC0xNCwtNyAtMTQsN1wiXG4gICAgICBleHBlY3QocG9seWdvbikudG9IYXZlQXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignLTE0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBzaXplIDEyIHdoZW4gdGhpbm5lclNoYXBlc05lZWRlZCByZXR1cm5zIHRydWUnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiAwLCB5OiAwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIEV4cGVjdGVkIHBvaW50czogXCIwLDAgLTEyLC02IC0xMiw2XCJcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0hhdmVBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgY29uc3QgcG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgZXhwZWN0KHBvaW50cykudG9Db250YWluKCctMTInKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyB0aGlubmVyU2hhcGVzTmVlZGVkIHdpdGggZ3JhcGhQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgcmVuZGVyQ29tcG9uZW50KHsgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBleHBlY3QodGhpbm5lclNoYXBlc05lZWRlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZ3ApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29vcmRpbmF0ZSBzY2FsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzY2FsZXMgeCBhbmQgeSBjb29yZGluYXRlcyB1c2luZyBncmFwaFByb3BzLnNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1NjYWxlID0ge1xuICAgICAgICB4OiBqZXN0LmZuKChuKSA9PiBuICogMTApLFxuICAgICAgICB5OiBqZXN0LmZuKChuKSA9PiBuICogMjApLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdwID0ge1xuICAgICAgICAuLi5ncmFwaFByb3BzKCksXG4gICAgICAgIHNjYWxlOiBtb2NrU2NhbGUsXG4gICAgICB9O1xuXG4gICAgICByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgZ3JhcGhQcm9wczogZ3AgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU2NhbGUueCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSk7XG4gICAgICBleHBlY3QobW9ja1NjYWxlLnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGFycm93IHdpdGggc2NhbGVkIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1NjYWxlID0ge1xuICAgICAgICB4OiBqZXN0LmZuKChuKSA9PiBuICogMiksXG4gICAgICAgIHk6IGplc3QuZm4oKG4pID0+IG4gKiAzKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDUsIHk6IDEwLCBncmFwaFByb3BzOiBncCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcblxuICAgICAgLy8gc2NhbGVkWCA9IDUgKiAyID0gMTAsIHNjYWxlZFkgPSAxMCAqIDMgPSAzMFxuICAgICAgLy8gRXhwZWN0ZWQgcG9pbnRzOiBcIjEwLDMwIC00LDIzIC00LDM3XCIgKHdpdGggc2l6ZSAxNClcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMTAnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FuZ2xlIHJvdGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIHJvdGF0aW9uIHRyYW5zZm9ybSB3aXRoIG5lZ2F0aXZlIGFuZ2xlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDUsIHk6IDEwLCBhbmdsZTogNDUgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgLy8gQW5nbGUgc2hvdWxkIGJlIG5lZ2F0ZWQ6IHJvdGF0ZSgtNDUsIDUsIDEwKVxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTQ1Jyk7XG4gICAgICBleHBlY3QodHJhbnNmb3JtKS50b0NvbnRhaW4oJzUnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignMTAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHplcm8gYW5nbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMywgeTogNywgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgLy8gd2lsbCBjb252ZXJ0IC0wIHRvIDBcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvTWF0Y2goL3JvdGF0ZVxcKCgtKT8wLyk7XG4gICAgICBleHBlY3QodHJhbnNmb3JtKS50b0NvbnRhaW4oJzMnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignNycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVnYXRpdmUgYW5nbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMiwgeTogNCwgYW5nbGU6IC0zMCB9KTtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScpO1xuXG4gICAgICAvLyAtKC0zMCkgPSAzMFxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoMzAnKTtcbiAgICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvQ29udGFpbignMicpO1xuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCc0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyAzNjAgZGVncmVlIGFuZ2xlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDEsIHk6IDEsIGFuZ2xlOiAzNjAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgZXhwZWN0KHRyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTM2MCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXJyb3cgcG9pbnRzIGNhbGN1bGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYWxjdWxhdGVzIGNvcnJlY3QgcG9pbnRzIGZvciBhcnJvdyBoZWFkJywgKCkgPT4ge1xuICAgICAgdGhpbm5lclNoYXBlc05lZWRlZC5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIHNpemUgPSAxNFxuICAgICAgLy8gcG9pbnRzID0gXCIwLDAgLTE0LC03IC0xNCwgN1wiIChub3RlIHRoZSBzcGFjZSBhZnRlciBjb21tYSBpbiB0aGUgdGVtcGxhdGUgbGl0ZXJhbClcbiAgICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIGV4cGVjdChwb2ludHMpLnRvQ29udGFpbignMCwwJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJy0xNCwtNycpO1xuICAgICAgZXhwZWN0KHBvaW50cykudG9NYXRjaCgvLTE0LFxccyo3Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsY3VsYXRlcyBwb2ludHMgd2l0aCBzY2FsZWQgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCBtb2NrU2NhbGUgPSB7XG4gICAgICAgIHg6IGplc3QuZm4oKG4pID0+IG4pLFxuICAgICAgICB5OiBqZXN0LmZuKChuKSA9PiBuKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzY2FsZTogbW9ja1NjYWxlLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDEwLCB5OiAyMCwgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcblxuICAgICAgLy8gc2NhbGVkWCA9IDEwLCBzY2FsZWRZID0gMjAsIHNpemUgPSAxNFxuICAgICAgLy8gcG9pbnRzID0gXCIxMCwyMCAtNCwxMyAtNCwgMjdcIiAobm90ZSB0aGUgc3BhY2UgYWZ0ZXIgY29tbWEgaW4gdGhlIHRlbXBsYXRlIGxpdGVyYWwpXG4gICAgICBjb25zdCBwb2ludHMgPSBwb2x5Z29uLmdldEF0dHJpYnV0ZSgncG9pbnRzJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJzEwLDIwJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b0NvbnRhaW4oJy00LDEzJyk7XG4gICAgICBleHBlY3QocG9pbnRzKS50b01hdGNoKC8tNCxcXHMqMjcvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb3BzIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdwYXNzZXMgdGhyb3VnaCBhZGRpdGlvbmFsIHByb3BzIHRvIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICAnZGF0YS10ZXN0JzogJ2Fycm93LXRlc3QnLFxuICAgICAgICByb2xlOiAnZ3JhcGhpY3Mtc3ltYm9sJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtdGVzdCcsICdhcnJvdy10ZXN0Jyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUF0dHJpYnV0ZSgncm9sZScsICdncmFwaGljcy1zeW1ib2wnKTtcbiAgICB9KTtcblxuICAgIGl0KCdleGNsdWRlcyBmaWx0ZXJlZCBwcm9wcyBmcm9tIGcgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICB4OiA1LFxuICAgICAgICB5OiAxMCxcbiAgICAgICAgYW5nbGU6IDQ1LFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnY29ycmVjdCcsXG4gICAgICAgIGdyYXBoUHJvcHM6IGdyYXBoUHJvcHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuXG4gICAgICAvLyBUaGVzZSBwcm9wcyBzaG91bGQgbm90IGJlIHBhc3NlZCB0byB0aGUgZyBlbGVtZW50XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLm5vdC50b0hhdmVBdHRyaWJ1dGUoJ3gnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkubm90LnRvSGF2ZUF0dHJpYnV0ZSgneScpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdhbmdsZScpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdjb3JyZWN0bmVzcycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS5ub3QudG9IYXZlQXR0cmlidXRlKCdncmFwaFByb3BzJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIHplcm8gY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMCwgeTogMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVnYXRpdmUgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogLTUsIHk6IC0xMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbGFyZ2UgY29vcmRpbmF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogMTAwMCwgeTogMjAwMCwgYW5nbGU6IDAgfSk7XG4gICAgICBjb25zdCBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZnJhY3Rpb25hbCBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiAzLjUsIHk6IDcuMjUsIGFuZ2xlOiAyMi41IH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBleHBlY3QocG9seWdvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChwb2x5Z29uLmdldEF0dHJpYnV0ZSgndHJhbnNmb3JtJykpLnRvQ29udGFpbigncm90YXRlKC0yMi41Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IGNsYXNzZXMgcHJvcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEFycm93IHg9ezV9IHk9ezEwfSBhbmdsZT17NDV9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IC8+KTtcbiAgICAgIGNvbnN0IGdFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2cnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY2xhc3NOYW1lIHByb3AnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxBcnJvdyB4PXs1fSB5PXsxMH0gYW5nbGU9ezQ1fSBncmFwaFByb3BzPXtncmFwaFByb3BzKCl9IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdncmFwaFByb3BzIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCd3b3JrcyB3aXRoIGRpZmZlcmVudCBkb21haW4gYW5kIHJhbmdlIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygtMTAsIDEwLCAtMjAsIDIwKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBncmFwaFByb3BzOiBncCB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHRoaW5uZXJTaGFwZXNOZWVkZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGdwKTtcbiAgICB9KTtcblxuICAgIGl0KCd3b3JrcyB3aXRoIGN1c3RvbSBzaXplIGluIGdyYXBoUHJvcHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBncCA9IHtcbiAgICAgICAgLi4uZ3JhcGhQcm9wcygpLFxuICAgICAgICBzaXplOiB7XG4gICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZ3JhcGhQcm9wczogZ3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGdyYXBoUHJvcHMgd2l0aCBzbWFsbCBzdGVwIHZhbHVlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGdwID0ge1xuICAgICAgICAuLi5ncmFwaFByb3BzKCksXG4gICAgICAgIGRvbWFpbjogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxuICAgICAgICByYW5nZTogeyBtaW46IDAsIG1heDogMTAsIHN0ZXA6IDAuMSB9LFxuICAgICAgfTtcbiAgICAgIHRoaW5uZXJTaGFwZXNOZWVkZWQubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdyYXBoUHJvcHM6IGdwIH0pO1xuICAgICAgY29uc3QgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG5cbiAgICAgIC8vIFNob3VsZCB1c2Ugc2l6ZSAxMiBmb3IgdGhpbm5lciBzaGFwZXNcbiAgICAgIGV4cGVjdChwb2x5Z29uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHRoaW5uZXJTaGFwZXNOZWVkZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGdwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ211bHRpcGxlIGNvcnJlY3RuZXNzIHN0YXRlcycsICgpID0+IHtcbiAgICBpdCgnaGFuZGxlcyBwYXJ0aWFsIGNvcnJlY3RuZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGNsYXNzZXM6IHsgcG9pbnQ6ICdwb2ludC1jbGFzcycsIHBhcnRpYWw6ICdwYXJ0aWFsLWNsYXNzJyB9LFxuICAgICAgICBjb3JyZWN0bmVzczogJ3BhcnRpYWwnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwYXJ0aWFsLWNsYXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyB1bmRlZmluZWQgY29ycmVjdG5lc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgY2xhc3NlczogeyBwb2ludDogJ3BvaW50LWNsYXNzJyB9LFxuICAgICAgICBjb3JyZWN0bmVzczogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwb2ludC1jbGFzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbnVsbCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7IHBvaW50OiAncG9pbnQtY2xhc3MnIH0sXG4gICAgICAgIGNvcnJlY3RuZXNzOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBnRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdnJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdwb2ludC1jbGFzcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tYmluZWQgc3RhdGVzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIGRpc2FibGVkIGFuZCBjb3JyZWN0IHN0YXRlcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgcG9pbnQ6ICdwb2ludC1jbGFzcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycsXG4gICAgICAgICAgY29ycmVjdDogJ2NvcnJlY3QtY2xhc3MnLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygncG9pbnQtY2xhc3MnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2Rpc2FibGVkLWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdjb3JyZWN0LWNsYXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkaXNhYmxlZCBhbmQgaW5jb3JyZWN0IHN0YXRlcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgcG9pbnQ6ICdwb2ludC1jbGFzcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICdkaXNhYmxlZC1jbGFzcycsXG4gICAgICAgICAgaW5jb3JyZWN0OiAnaW5jb3JyZWN0LWNsYXNzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZ0VsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgZXhwZWN0KGdFbGVtZW50KS50b0hhdmVDbGFzcygncG9pbnQtY2xhc3MnKTtcbiAgICAgIGV4cGVjdChnRWxlbWVudCkudG9IYXZlQ2xhc3MoJ2Rpc2FibGVkLWNsYXNzJyk7XG4gICAgICBleHBlY3QoZ0VsZW1lbnQpLnRvSGF2ZUNsYXNzKCdpbmNvcnJlY3QtY2xhc3MnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlLXJlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgndXBkYXRlcyB3aGVuIHggY29vcmRpbmF0ZSBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgYW5nbGU6IDAgfSk7XG4gICAgICBsZXQgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBpbml0aWFsUG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuXG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17MTV9IHk9ezEwfSBhbmdsZT17MH0gZ3JhcGhQcm9wcz17Z3JhcGhQcm9wcygpfSBjbGFzc2VzPXt7fX0gY2xhc3NOYW1lPVwiYXJyb3ctY2xhc3NcIiAvPik7XG5cbiAgICAgIHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgbmV3UG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuICAgICAgZXhwZWN0KG5ld1BvaW50cykubm90LnRvQmUoaW5pdGlhbFBvaW50cyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyB3aGVuIHkgY29vcmRpbmF0ZSBjaGFuZ2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIsIHJlcmVuZGVyIH0gPSByZW5kZXJDb21wb25lbnQoeyB4OiA1LCB5OiAxMCwgYW5nbGU6IDAgfSk7XG4gICAgICBsZXQgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBpbml0aWFsUG9pbnRzID0gcG9seWdvbi5nZXRBdHRyaWJ1dGUoJ3BvaW50cycpO1xuXG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17NX0geT17MjB9IGFuZ2xlPXswfSBncmFwaFByb3BzPXtncmFwaFByb3BzKCl9IGNsYXNzZXM9e3t9fSBjbGFzc05hbWU9XCJhcnJvdy1jbGFzc1wiIC8+KTtcblxuICAgICAgcG9seWdvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdwb2x5Z29uJyk7XG4gICAgICBjb25zdCBuZXdQb2ludHMgPSBwb2x5Z29uLmdldEF0dHJpYnV0ZSgncG9pbnRzJyk7XG4gICAgICBleHBlY3QobmV3UG9pbnRzKS5ub3QudG9CZShpbml0aWFsUG9pbnRzKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIHdoZW4gYW5nbGUgY2hhbmdlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgeDogNSwgeTogMTAsIGFuZ2xlOiAwIH0pO1xuICAgICAgbGV0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgaW5pdGlhbFRyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcblxuICAgICAgcmVyZW5kZXIoPEFycm93IHg9ezV9IHk9ezEwfSBhbmdsZT17OTB9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IGNsYXNzTmFtZT1cImFycm93LWNsYXNzXCIgLz4pO1xuXG4gICAgICBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IG5ld1RyYW5zZm9ybSA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nKTtcbiAgICAgIGV4cGVjdChuZXdUcmFuc2Zvcm0pLm5vdC50b0JlKGluaXRpYWxUcmFuc2Zvcm0pO1xuICAgICAgZXhwZWN0KG5ld1RyYW5zZm9ybSkudG9Db250YWluKCdyb3RhdGUoLTkwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyB3aGVuIHRoaW5uZXJTaGFwZXNOZWVkZWQgcmVzdWx0IGNoYW5nZXMnLCAoKSA9PiB7XG4gICAgICB0aGlubmVyU2hhcGVzTmVlZGVkLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciwgcmVyZW5kZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IHg6IDAsIHk6IDAsIGFuZ2xlOiAwIH0pO1xuICAgICAgbGV0IHBvbHlnb24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcigncG9seWdvbicpO1xuICAgICAgY29uc3QgaW5pdGlhbFBvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcblxuICAgICAgdGhpbm5lclNoYXBlc05lZWRlZC5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgICByZXJlbmRlcig8QXJyb3cgeD17MH0geT17MH0gYW5nbGU9ezB9IGdyYXBoUHJvcHM9e2dyYXBoUHJvcHMoKX0gY2xhc3Nlcz17e319IGNsYXNzTmFtZT1cImFycm93LWNsYXNzXCIgLz4pO1xuXG4gICAgICBwb2x5Z29uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3BvbHlnb24nKTtcbiAgICAgIGNvbnN0IG5ld1BvaW50cyA9IHBvbHlnb24uZ2V0QXR0cmlidXRlKCdwb2ludHMnKTtcbiAgICAgIC8vIFBvaW50cyBzaG91bGQgY2hhbmdlIGR1ZSB0byBzaXplIGNoYW5nZSAoMTQgdnMgMTIpXG4gICAgICBleHBlY3QobmV3UG9pbnRzKS5ub3QudG9CZShpbml0aWFsUG9pbnRzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLFVBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUF3RCxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxD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
|