@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,725 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _index = require("../index");
|
|
6
|
+
var _plot = require("@pie-lib/plot");
|
|
7
|
+
var _testUtils = require("@pie-lib/test-utils");
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _utils = require("../../../../__tests__/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
|
+
var xy = _plot.utils.xy;
|
|
13
|
+
var xyLabel = function xyLabel(x, y, label) {
|
|
14
|
+
return {
|
|
15
|
+
x: x,
|
|
16
|
+
y: y,
|
|
17
|
+
label: label
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
describe('lineTool', function () {
|
|
21
|
+
describe('addPoint', function () {
|
|
22
|
+
var toolbar;
|
|
23
|
+
beforeEach(function () {
|
|
24
|
+
toolbar = (0, _index.lineTool)('lineType', function () {
|
|
25
|
+
return /*#__PURE__*/_react["default"].createElement("div", null);
|
|
26
|
+
})();
|
|
27
|
+
});
|
|
28
|
+
it('returns a building mark when no existing mark', function () {
|
|
29
|
+
var result = toolbar.addPoint(xy(1, 1));
|
|
30
|
+
expect(result).toEqual({
|
|
31
|
+
type: 'lineType',
|
|
32
|
+
building: true,
|
|
33
|
+
from: xy(1, 1)
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('returns a complete mark when adding second point', function () {
|
|
37
|
+
var result = toolbar.addPoint(xy(1, 1), {
|
|
38
|
+
from: xy(0, 0)
|
|
39
|
+
});
|
|
40
|
+
expect(result).toEqual({
|
|
41
|
+
building: false,
|
|
42
|
+
from: xy(0, 0),
|
|
43
|
+
to: xy(1, 1)
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('returns same mark if point equals existing from point', function () {
|
|
47
|
+
var existingMark = {
|
|
48
|
+
from: xy(1, 1),
|
|
49
|
+
building: true
|
|
50
|
+
};
|
|
51
|
+
var result = toolbar.addPoint(xy(1, 1), existingMark);
|
|
52
|
+
expect(result).toEqual(existingMark);
|
|
53
|
+
});
|
|
54
|
+
it('handles adding point with root property', function () {
|
|
55
|
+
var existingMark = {
|
|
56
|
+
root: xy(1, 1),
|
|
57
|
+
building: true
|
|
58
|
+
};
|
|
59
|
+
var result = toolbar.addPoint(xy(1, 1), existingMark);
|
|
60
|
+
expect(result).toEqual(existingMark);
|
|
61
|
+
});
|
|
62
|
+
it('creates different types correctly', function () {
|
|
63
|
+
var lineA = (0, _index.lineTool)('lineA', function () {
|
|
64
|
+
return /*#__PURE__*/_react["default"].createElement("div", null);
|
|
65
|
+
})();
|
|
66
|
+
var lineB = (0, _index.lineTool)('lineB', function () {
|
|
67
|
+
return /*#__PURE__*/_react["default"].createElement("div", null);
|
|
68
|
+
})();
|
|
69
|
+
var resultA = lineA.addPoint(xy(1, 1));
|
|
70
|
+
var resultB = lineB.addPoint(xy(1, 1));
|
|
71
|
+
expect(resultA.type).toBe('lineA');
|
|
72
|
+
expect(resultB.type).toBe('lineB');
|
|
73
|
+
});
|
|
74
|
+
it('preserves building state correctly', function () {
|
|
75
|
+
var building = toolbar.addPoint(xy(1, 1));
|
|
76
|
+
expect(building.building).toBe(true);
|
|
77
|
+
var complete = toolbar.addPoint(xy(2, 2), building);
|
|
78
|
+
expect(complete.building).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('Component property', function () {
|
|
82
|
+
it('stores the provided Component', function () {
|
|
83
|
+
var TestComp = function TestComp() {
|
|
84
|
+
return /*#__PURE__*/_react["default"].createElement("div", null, "Test");
|
|
85
|
+
};
|
|
86
|
+
var tool = (0, _index.lineTool)('test', TestComp)();
|
|
87
|
+
expect(tool.Component).toBe(TestComp);
|
|
88
|
+
});
|
|
89
|
+
it('stores the correct type', function () {
|
|
90
|
+
var tool = (0, _index.lineTool)('customType', function () {
|
|
91
|
+
return /*#__PURE__*/_react["default"].createElement("div", null);
|
|
92
|
+
})();
|
|
93
|
+
expect(tool.type).toBe('customType');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('lineToolComponent', function () {
|
|
98
|
+
var Comp;
|
|
99
|
+
var mark;
|
|
100
|
+
var onChange;
|
|
101
|
+
beforeEach(function () {
|
|
102
|
+
onChange = jest.fn();
|
|
103
|
+
Comp = (0, _index.lineToolComponent)(function () {
|
|
104
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
105
|
+
"data-testid": "line-component"
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
mark = {
|
|
109
|
+
from: xy(0, 0),
|
|
110
|
+
to: xy(1, 1),
|
|
111
|
+
type: 'line'
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
var renderComponent = function renderComponent(extras) {
|
|
115
|
+
var defaults = {
|
|
116
|
+
mark: mark,
|
|
117
|
+
onChange: onChange,
|
|
118
|
+
graphProps: (0, _utils.graphProps)()
|
|
119
|
+
};
|
|
120
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
121
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, props));
|
|
122
|
+
};
|
|
123
|
+
describe('rendering', function () {
|
|
124
|
+
it('renders without crashing', function () {
|
|
125
|
+
var _renderComponent = renderComponent(),
|
|
126
|
+
container = _renderComponent.container;
|
|
127
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
it('renders with building mark', function () {
|
|
130
|
+
var buildingMark = {
|
|
131
|
+
from: xy(0, 0),
|
|
132
|
+
building: true,
|
|
133
|
+
type: 'line'
|
|
134
|
+
};
|
|
135
|
+
var _renderComponent2 = renderComponent({
|
|
136
|
+
mark: buildingMark
|
|
137
|
+
}),
|
|
138
|
+
container = _renderComponent2.container;
|
|
139
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
140
|
+
});
|
|
141
|
+
it('renders with background mark', function () {
|
|
142
|
+
var bgMark = {
|
|
143
|
+
from: xy(0, 0),
|
|
144
|
+
to: xy(1, 1),
|
|
145
|
+
isBackground: true,
|
|
146
|
+
type: 'line'
|
|
147
|
+
};
|
|
148
|
+
var _renderComponent3 = renderComponent({
|
|
149
|
+
mark: bgMark
|
|
150
|
+
}),
|
|
151
|
+
container = _renderComponent3.container;
|
|
152
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
153
|
+
});
|
|
154
|
+
it('renders with disabled mark', function () {
|
|
155
|
+
var disabledMark = {
|
|
156
|
+
from: xy(0, 0),
|
|
157
|
+
to: xy(1, 1),
|
|
158
|
+
disabled: true,
|
|
159
|
+
type: 'line'
|
|
160
|
+
};
|
|
161
|
+
var _renderComponent4 = renderComponent({
|
|
162
|
+
mark: disabledMark
|
|
163
|
+
}),
|
|
164
|
+
container = _renderComponent4.container;
|
|
165
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
166
|
+
});
|
|
167
|
+
it('renders with correctness states', function () {
|
|
168
|
+
var correctMark = {
|
|
169
|
+
from: xy(0, 0),
|
|
170
|
+
to: xy(1, 1),
|
|
171
|
+
correctness: 'correct',
|
|
172
|
+
type: 'line'
|
|
173
|
+
};
|
|
174
|
+
var _renderComponent5 = renderComponent({
|
|
175
|
+
mark: correctMark
|
|
176
|
+
}),
|
|
177
|
+
container = _renderComponent5.container;
|
|
178
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
179
|
+
});
|
|
180
|
+
it('renders with middle point', function () {
|
|
181
|
+
var markWithMiddle = {
|
|
182
|
+
from: xy(0, 0),
|
|
183
|
+
to: xy(1, 1),
|
|
184
|
+
middle: xy(0.5, 0.5),
|
|
185
|
+
type: 'line'
|
|
186
|
+
};
|
|
187
|
+
var _renderComponent6 = renderComponent({
|
|
188
|
+
mark: markWithMiddle
|
|
189
|
+
}),
|
|
190
|
+
container = _renderComponent6.container;
|
|
191
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
192
|
+
});
|
|
193
|
+
it('renders with fill color', function () {
|
|
194
|
+
var coloredMark = {
|
|
195
|
+
from: xy(0, 0),
|
|
196
|
+
to: xy(1, 1),
|
|
197
|
+
fill: '#ff0000',
|
|
198
|
+
type: 'line'
|
|
199
|
+
};
|
|
200
|
+
var _renderComponent7 = renderComponent({
|
|
201
|
+
mark: coloredMark
|
|
202
|
+
}),
|
|
203
|
+
container = _renderComponent7.container;
|
|
204
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
205
|
+
});
|
|
206
|
+
it('renders with gssLineData', function () {
|
|
207
|
+
var gssLineData = {
|
|
208
|
+
selectedTool: 'lineA'
|
|
209
|
+
};
|
|
210
|
+
var _renderComponent8 = renderComponent({
|
|
211
|
+
gssLineData: gssLineData
|
|
212
|
+
}),
|
|
213
|
+
container = _renderComponent8.container;
|
|
214
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
215
|
+
});
|
|
216
|
+
it('renders with labelNode', function () {
|
|
217
|
+
var labelNode = document.createElement('foreignObject');
|
|
218
|
+
var _renderComponent9 = renderComponent({
|
|
219
|
+
labelNode: labelNode
|
|
220
|
+
}),
|
|
221
|
+
container = _renderComponent9.container;
|
|
222
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
223
|
+
});
|
|
224
|
+
it('renders with coordinatesOnHover enabled', function () {
|
|
225
|
+
var _renderComponent0 = renderComponent({
|
|
226
|
+
coordinatesOnHover: true
|
|
227
|
+
}),
|
|
228
|
+
container = _renderComponent0.container;
|
|
229
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
230
|
+
});
|
|
231
|
+
it('renders with labelModeEnabled', function () {
|
|
232
|
+
var _renderComponent1 = renderComponent({
|
|
233
|
+
labelModeEnabled: true
|
|
234
|
+
}),
|
|
235
|
+
container = _renderComponent1.container;
|
|
236
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('state management', function () {
|
|
240
|
+
it('initializes with empty state', function () {
|
|
241
|
+
var _renderComponent10 = renderComponent(),
|
|
242
|
+
container = _renderComponent10.container;
|
|
243
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
244
|
+
// State should be empty initially
|
|
245
|
+
});
|
|
246
|
+
it('handles mark updates through props', function () {
|
|
247
|
+
var _renderComponent11 = renderComponent(),
|
|
248
|
+
rerender = _renderComponent11.rerender,
|
|
249
|
+
container = _renderComponent11.container;
|
|
250
|
+
var updatedMark = {
|
|
251
|
+
from: xy(1, 1),
|
|
252
|
+
to: xy(2, 2),
|
|
253
|
+
type: 'line'
|
|
254
|
+
};
|
|
255
|
+
rerender(/*#__PURE__*/_react["default"].createElement(Comp, {
|
|
256
|
+
mark: updatedMark,
|
|
257
|
+
onChange: onChange,
|
|
258
|
+
graphProps: (0, _utils.graphProps)()
|
|
259
|
+
}));
|
|
260
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('background mark handling', function () {
|
|
264
|
+
it('disables from point when mark is background', function () {
|
|
265
|
+
var bgMark = {
|
|
266
|
+
from: xy(0, 0),
|
|
267
|
+
to: xy(1, 1),
|
|
268
|
+
isBackground: true,
|
|
269
|
+
type: 'line'
|
|
270
|
+
};
|
|
271
|
+
var _renderComponent12 = renderComponent({
|
|
272
|
+
mark: bgMark
|
|
273
|
+
}),
|
|
274
|
+
container = _renderComponent12.container;
|
|
275
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
276
|
+
// from.disabled should be true
|
|
277
|
+
});
|
|
278
|
+
it('disables to point when mark is background', function () {
|
|
279
|
+
var bgMark = {
|
|
280
|
+
from: xy(0, 0),
|
|
281
|
+
to: xy(1, 1),
|
|
282
|
+
isBackground: true,
|
|
283
|
+
type: 'line'
|
|
284
|
+
};
|
|
285
|
+
var _renderComponent13 = renderComponent({
|
|
286
|
+
mark: bgMark
|
|
287
|
+
}),
|
|
288
|
+
container = _renderComponent13.container;
|
|
289
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
290
|
+
// to.disabled should be true
|
|
291
|
+
});
|
|
292
|
+
it('disables middle point when mark is background', function () {
|
|
293
|
+
var bgMark = {
|
|
294
|
+
from: xy(0, 0),
|
|
295
|
+
to: xy(1, 1),
|
|
296
|
+
middle: xy(0.5, 0.5),
|
|
297
|
+
isBackground: true,
|
|
298
|
+
type: 'line'
|
|
299
|
+
};
|
|
300
|
+
var _renderComponent14 = renderComponent({
|
|
301
|
+
mark: bgMark
|
|
302
|
+
}),
|
|
303
|
+
container = _renderComponent14.container;
|
|
304
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
305
|
+
// middle.disabled should be true
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('edge cases', function () {
|
|
309
|
+
it('handles mark without to point', function () {
|
|
310
|
+
var incompleteMark = {
|
|
311
|
+
from: xy(0, 0),
|
|
312
|
+
type: 'line'
|
|
313
|
+
};
|
|
314
|
+
var _renderComponent15 = renderComponent({
|
|
315
|
+
mark: incompleteMark
|
|
316
|
+
}),
|
|
317
|
+
container = _renderComponent15.container;
|
|
318
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
319
|
+
});
|
|
320
|
+
it('handles mark with only from point', function () {
|
|
321
|
+
var singlePointMark = {
|
|
322
|
+
from: xy(0, 0),
|
|
323
|
+
building: true,
|
|
324
|
+
type: 'line'
|
|
325
|
+
};
|
|
326
|
+
var _renderComponent16 = renderComponent({
|
|
327
|
+
mark: singlePointMark
|
|
328
|
+
}),
|
|
329
|
+
container = _renderComponent16.container;
|
|
330
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
331
|
+
});
|
|
332
|
+
it('handles different line types', function () {
|
|
333
|
+
var parabola = {
|
|
334
|
+
from: xy(0, 0),
|
|
335
|
+
to: xy(1, 1),
|
|
336
|
+
type: 'parabola'
|
|
337
|
+
};
|
|
338
|
+
var sine = {
|
|
339
|
+
from: xy(0, 0),
|
|
340
|
+
to: xy(1, 1),
|
|
341
|
+
type: 'sine'
|
|
342
|
+
};
|
|
343
|
+
var absolute = {
|
|
344
|
+
from: xy(0, 0),
|
|
345
|
+
to: xy(1, 1),
|
|
346
|
+
type: 'absolute'
|
|
347
|
+
};
|
|
348
|
+
var exponential = {
|
|
349
|
+
from: xy(0, 0),
|
|
350
|
+
to: xy(1, 1),
|
|
351
|
+
type: 'exponential'
|
|
352
|
+
};
|
|
353
|
+
(0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
|
|
354
|
+
mark: parabola,
|
|
355
|
+
onChange: onChange,
|
|
356
|
+
graphProps: (0, _utils.graphProps)()
|
|
357
|
+
}));
|
|
358
|
+
(0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
|
|
359
|
+
mark: sine,
|
|
360
|
+
onChange: onChange,
|
|
361
|
+
graphProps: (0, _utils.graphProps)()
|
|
362
|
+
}));
|
|
363
|
+
(0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
|
|
364
|
+
mark: absolute,
|
|
365
|
+
onChange: onChange,
|
|
366
|
+
graphProps: (0, _utils.graphProps)()
|
|
367
|
+
}));
|
|
368
|
+
(0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, {
|
|
369
|
+
mark: exponential,
|
|
370
|
+
onChange: onChange,
|
|
371
|
+
graphProps: (0, _utils.graphProps)()
|
|
372
|
+
}));
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('lineBase', function () {
|
|
377
|
+
var Comp;
|
|
378
|
+
var onChange;
|
|
379
|
+
var changeMarkProps;
|
|
380
|
+
var onClick;
|
|
381
|
+
beforeEach(function () {
|
|
382
|
+
onChange = jest.fn();
|
|
383
|
+
changeMarkProps = jest.fn();
|
|
384
|
+
onClick = jest.fn();
|
|
385
|
+
Comp = (0, _index.lineBase)(function () {
|
|
386
|
+
return /*#__PURE__*/_react["default"].createElement("text", {
|
|
387
|
+
"data-testid": "line-base"
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
var renderComponent = function renderComponent(extras) {
|
|
392
|
+
var defaults = {
|
|
393
|
+
onChange: onChange,
|
|
394
|
+
changeMarkProps: changeMarkProps,
|
|
395
|
+
onClick: onClick,
|
|
396
|
+
graphProps: (0, _utils.graphProps)(),
|
|
397
|
+
from: xy(0, 0),
|
|
398
|
+
to: xy(1, 1)
|
|
399
|
+
};
|
|
400
|
+
var props = _objectSpread(_objectSpread({}, defaults), extras);
|
|
401
|
+
return (0, _testUtils.render)(/*#__PURE__*/_react["default"].createElement(Comp, props));
|
|
402
|
+
};
|
|
403
|
+
var labelNode = document.createElement('foreignObject');
|
|
404
|
+
var renderWithLabels = function renderWithLabels() {
|
|
405
|
+
var extras = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
406
|
+
return renderComponent(_objectSpread(_objectSpread({}, extras), {}, {
|
|
407
|
+
labelNode: labelNode,
|
|
408
|
+
from: xyLabel(0, 0, 'A'),
|
|
409
|
+
to: xyLabel(1, 1, 'B')
|
|
410
|
+
}));
|
|
411
|
+
};
|
|
412
|
+
describe('rendering', function () {
|
|
413
|
+
it('renders without crashing', function () {
|
|
414
|
+
var _renderComponent17 = renderComponent(),
|
|
415
|
+
container = _renderComponent17.container;
|
|
416
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
417
|
+
});
|
|
418
|
+
it('renders with labels', function () {
|
|
419
|
+
var _renderWithLabels = renderWithLabels(),
|
|
420
|
+
container = _renderWithLabels.container;
|
|
421
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
422
|
+
});
|
|
423
|
+
it('renders with middle point label', function () {
|
|
424
|
+
var _renderComponent18 = renderComponent({
|
|
425
|
+
labelNode: labelNode,
|
|
426
|
+
middle: xyLabel(0.5, 0.5, 'M')
|
|
427
|
+
}),
|
|
428
|
+
container = _renderComponent18.container;
|
|
429
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
430
|
+
});
|
|
431
|
+
it('renders with only from label', function () {
|
|
432
|
+
var _renderComponent19 = renderComponent({
|
|
433
|
+
labelNode: labelNode,
|
|
434
|
+
from: xyLabel(0, 0, 'Start'),
|
|
435
|
+
to: xy(1, 1)
|
|
436
|
+
}),
|
|
437
|
+
container = _renderComponent19.container;
|
|
438
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
439
|
+
});
|
|
440
|
+
it('renders with only to label', function () {
|
|
441
|
+
var _renderComponent20 = renderComponent({
|
|
442
|
+
labelNode: labelNode,
|
|
443
|
+
from: xy(0, 0),
|
|
444
|
+
to: xyLabel(1, 1, 'End')
|
|
445
|
+
}),
|
|
446
|
+
container = _renderComponent20.container;
|
|
447
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
448
|
+
});
|
|
449
|
+
it('renders with all three labels', function () {
|
|
450
|
+
var _renderComponent21 = renderComponent({
|
|
451
|
+
labelNode: labelNode,
|
|
452
|
+
from: xyLabel(0, 0, 'A'),
|
|
453
|
+
to: xyLabel(1, 1, 'B'),
|
|
454
|
+
middle: xyLabel(0.5, 0.5, 'M')
|
|
455
|
+
}),
|
|
456
|
+
container = _renderComponent21.container;
|
|
457
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
describe('gssLineData handling', function () {
|
|
461
|
+
it('renders normally without gssLineData', function () {
|
|
462
|
+
var _renderComponent22 = renderComponent(),
|
|
463
|
+
container = _renderComponent22.container;
|
|
464
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
465
|
+
});
|
|
466
|
+
it('renders with gssLineData when solutionSet is selected', function () {
|
|
467
|
+
var gssLineData = {
|
|
468
|
+
selectedTool: 'solutionSet'
|
|
469
|
+
};
|
|
470
|
+
var _renderComponent23 = renderComponent({
|
|
471
|
+
gssLineData: gssLineData
|
|
472
|
+
}),
|
|
473
|
+
container = _renderComponent23.container;
|
|
474
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
475
|
+
});
|
|
476
|
+
it('renders with gssLineData when lineA is selected', function () {
|
|
477
|
+
var gssLineData = {
|
|
478
|
+
selectedTool: 'lineA'
|
|
479
|
+
};
|
|
480
|
+
var _renderComponent24 = renderComponent({
|
|
481
|
+
gssLineData: gssLineData
|
|
482
|
+
}),
|
|
483
|
+
container = _renderComponent24.container;
|
|
484
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
485
|
+
});
|
|
486
|
+
it('renders with gssLineData when lineB is selected', function () {
|
|
487
|
+
var gssLineData = {
|
|
488
|
+
selectedTool: 'lineB'
|
|
489
|
+
};
|
|
490
|
+
var _renderComponent25 = renderComponent({
|
|
491
|
+
gssLineData: gssLineData
|
|
492
|
+
}),
|
|
493
|
+
container = _renderComponent25.container;
|
|
494
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
describe('disabled state', function () {
|
|
498
|
+
it('renders when disabled', function () {
|
|
499
|
+
var _renderComponent26 = renderComponent({
|
|
500
|
+
disabled: true
|
|
501
|
+
}),
|
|
502
|
+
container = _renderComponent26.container;
|
|
503
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
504
|
+
});
|
|
505
|
+
it('renders when not disabled', function () {
|
|
506
|
+
var _renderComponent27 = renderComponent({
|
|
507
|
+
disabled: false
|
|
508
|
+
}),
|
|
509
|
+
container = _renderComponent27.container;
|
|
510
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
describe('correctness states', function () {
|
|
514
|
+
it('renders with correct state', function () {
|
|
515
|
+
var _renderComponent28 = renderComponent({
|
|
516
|
+
correctness: 'correct'
|
|
517
|
+
}),
|
|
518
|
+
container = _renderComponent28.container;
|
|
519
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
520
|
+
});
|
|
521
|
+
it('renders with incorrect state', function () {
|
|
522
|
+
var _renderComponent29 = renderComponent({
|
|
523
|
+
correctness: 'incorrect'
|
|
524
|
+
}),
|
|
525
|
+
container = _renderComponent29.container;
|
|
526
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
527
|
+
});
|
|
528
|
+
it('renders with missing state', function () {
|
|
529
|
+
var _renderComponent30 = renderComponent({
|
|
530
|
+
correctness: 'missing'
|
|
531
|
+
}),
|
|
532
|
+
container = _renderComponent30.container;
|
|
533
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
534
|
+
});
|
|
535
|
+
it('renders without correctness', function () {
|
|
536
|
+
var _renderComponent31 = renderComponent({
|
|
537
|
+
correctness: undefined
|
|
538
|
+
}),
|
|
539
|
+
container = _renderComponent31.container;
|
|
540
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
describe('fill color', function () {
|
|
544
|
+
it('renders with custom fill color', function () {
|
|
545
|
+
var _renderComponent32 = renderComponent({
|
|
546
|
+
fill: '#ff0000'
|
|
547
|
+
}),
|
|
548
|
+
container = _renderComponent32.container;
|
|
549
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
550
|
+
});
|
|
551
|
+
it('renders without fill color', function () {
|
|
552
|
+
var _renderComponent33 = renderComponent({
|
|
553
|
+
fill: undefined
|
|
554
|
+
}),
|
|
555
|
+
container = _renderComponent33.container;
|
|
556
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
describe('coordinates on hover', function () {
|
|
560
|
+
it('renders with coordinatesOnHover enabled', function () {
|
|
561
|
+
var _renderComponent34 = renderComponent({
|
|
562
|
+
coordinatesOnHover: true
|
|
563
|
+
}),
|
|
564
|
+
container = _renderComponent34.container;
|
|
565
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
566
|
+
});
|
|
567
|
+
it('renders with coordinatesOnHover disabled', function () {
|
|
568
|
+
var _renderComponent35 = renderComponent({
|
|
569
|
+
coordinatesOnHover: false
|
|
570
|
+
}),
|
|
571
|
+
container = _renderComponent35.container;
|
|
572
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
573
|
+
});
|
|
574
|
+
});
|
|
575
|
+
describe('label mode', function () {
|
|
576
|
+
it('renders with labelModeEnabled', function () {
|
|
577
|
+
var _renderComponent36 = renderComponent({
|
|
578
|
+
labelModeEnabled: true,
|
|
579
|
+
labelNode: labelNode
|
|
580
|
+
}),
|
|
581
|
+
container = _renderComponent36.container;
|
|
582
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
583
|
+
});
|
|
584
|
+
it('renders without labelModeEnabled', function () {
|
|
585
|
+
var _renderComponent37 = renderComponent({
|
|
586
|
+
labelModeEnabled: false,
|
|
587
|
+
labelNode: labelNode
|
|
588
|
+
}),
|
|
589
|
+
container = _renderComponent37.container;
|
|
590
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
591
|
+
});
|
|
592
|
+
});
|
|
593
|
+
describe('drag callbacks', function () {
|
|
594
|
+
it('renders with onDragStart callback', function () {
|
|
595
|
+
var onDragStart = jest.fn();
|
|
596
|
+
var _renderComponent38 = renderComponent({
|
|
597
|
+
onDragStart: onDragStart
|
|
598
|
+
}),
|
|
599
|
+
container = _renderComponent38.container;
|
|
600
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
601
|
+
});
|
|
602
|
+
it('renders with onDragStop callback', function () {
|
|
603
|
+
var onDragStop = jest.fn();
|
|
604
|
+
var _renderComponent39 = renderComponent({
|
|
605
|
+
onDragStop: onDragStop
|
|
606
|
+
}),
|
|
607
|
+
container = _renderComponent39.container;
|
|
608
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
609
|
+
});
|
|
610
|
+
it('renders with both drag callbacks', function () {
|
|
611
|
+
var onDragStart = jest.fn();
|
|
612
|
+
var onDragStop = jest.fn();
|
|
613
|
+
var _renderComponent40 = renderComponent({
|
|
614
|
+
onDragStart: onDragStart,
|
|
615
|
+
onDragStop: onDragStop
|
|
616
|
+
}),
|
|
617
|
+
container = _renderComponent40.container;
|
|
618
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
619
|
+
});
|
|
620
|
+
});
|
|
621
|
+
describe('edge cases', function () {
|
|
622
|
+
it('handles equal from and to points', function () {
|
|
623
|
+
var _renderComponent41 = renderComponent({
|
|
624
|
+
from: xy(1, 1),
|
|
625
|
+
to: xy(1, 1)
|
|
626
|
+
}),
|
|
627
|
+
container = _renderComponent41.container;
|
|
628
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
629
|
+
});
|
|
630
|
+
it('handles negative coordinates', function () {
|
|
631
|
+
var _renderComponent42 = renderComponent({
|
|
632
|
+
from: xy(-5, -5),
|
|
633
|
+
to: xy(-1, -1)
|
|
634
|
+
}),
|
|
635
|
+
container = _renderComponent42.container;
|
|
636
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
637
|
+
});
|
|
638
|
+
it('handles large coordinate values', function () {
|
|
639
|
+
var _renderComponent43 = renderComponent({
|
|
640
|
+
from: xy(100, 100),
|
|
641
|
+
to: xy(200, 200)
|
|
642
|
+
}),
|
|
643
|
+
container = _renderComponent43.container;
|
|
644
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
645
|
+
});
|
|
646
|
+
it('handles decimal coordinates', function () {
|
|
647
|
+
var _renderComponent44 = renderComponent({
|
|
648
|
+
from: xy(0.5, 0.5),
|
|
649
|
+
to: xy(1.5, 1.5)
|
|
650
|
+
}),
|
|
651
|
+
container = _renderComponent44.container;
|
|
652
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
653
|
+
});
|
|
654
|
+
it('handles vertical lines', function () {
|
|
655
|
+
var _renderComponent45 = renderComponent({
|
|
656
|
+
from: xy(1, 0),
|
|
657
|
+
to: xy(1, 5)
|
|
658
|
+
}),
|
|
659
|
+
container = _renderComponent45.container;
|
|
660
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
661
|
+
});
|
|
662
|
+
it('handles horizontal lines', function () {
|
|
663
|
+
var _renderComponent46 = renderComponent({
|
|
664
|
+
from: xy(0, 1),
|
|
665
|
+
to: xy(5, 1)
|
|
666
|
+
}),
|
|
667
|
+
container = _renderComponent46.container;
|
|
668
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
669
|
+
});
|
|
670
|
+
it('handles empty label strings', function () {
|
|
671
|
+
var _renderComponent47 = renderComponent({
|
|
672
|
+
labelNode: labelNode,
|
|
673
|
+
from: xyLabel(0, 0, ''),
|
|
674
|
+
to: xyLabel(1, 1, '')
|
|
675
|
+
}),
|
|
676
|
+
container = _renderComponent47.container;
|
|
677
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
678
|
+
});
|
|
679
|
+
});
|
|
680
|
+
describe('integration scenarios', function () {
|
|
681
|
+
it('renders complete line with all features', function () {
|
|
682
|
+
var _renderComponent48 = renderComponent({
|
|
683
|
+
from: xyLabel(0, 0, 'Start'),
|
|
684
|
+
to: xyLabel(5, 5, 'End'),
|
|
685
|
+
middle: xyLabel(2.5, 2.5, 'Middle'),
|
|
686
|
+
labelNode: labelNode,
|
|
687
|
+
coordinatesOnHover: true,
|
|
688
|
+
labelModeEnabled: true,
|
|
689
|
+
disabled: false,
|
|
690
|
+
correctness: 'correct',
|
|
691
|
+
fill: '#00ff00',
|
|
692
|
+
gssLineData: {
|
|
693
|
+
selectedTool: 'lineA'
|
|
694
|
+
},
|
|
695
|
+
onDragStart: jest.fn(),
|
|
696
|
+
onDragStop: jest.fn()
|
|
697
|
+
}),
|
|
698
|
+
container = _renderComponent48.container;
|
|
699
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
700
|
+
});
|
|
701
|
+
it('renders disabled background line', function () {
|
|
702
|
+
var _renderComponent49 = renderComponent({
|
|
703
|
+
from: xy(0, 0),
|
|
704
|
+
to: xy(1, 1),
|
|
705
|
+
disabled: true,
|
|
706
|
+
correctness: 'incorrect'
|
|
707
|
+
}),
|
|
708
|
+
container = _renderComponent49.container;
|
|
709
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
710
|
+
});
|
|
711
|
+
it('renders solution set mode', function () {
|
|
712
|
+
var _renderComponent50 = renderComponent({
|
|
713
|
+
from: xy(0, 0),
|
|
714
|
+
to: xy(1, 1),
|
|
715
|
+
gssLineData: {
|
|
716
|
+
selectedTool: 'solutionSet'
|
|
717
|
+
},
|
|
718
|
+
labelNode: labelNode
|
|
719
|
+
}),
|
|
720
|
+
container = _renderComponent50.container;
|
|
721
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
722
|
+
});
|
|
723
|
+
});
|
|
724
|
+
});
|
|
725
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX3Bsb3QiLCJfdGVzdFV0aWxzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91dGlscyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwieHkiLCJ1dGlscyIsInh5TGFiZWwiLCJ4IiwieSIsImxhYmVsIiwiZGVzY3JpYmUiLCJ0b29sYmFyIiwiYmVmb3JlRWFjaCIsImxpbmVUb29sIiwiY3JlYXRlRWxlbWVudCIsIml0IiwicmVzdWx0IiwiYWRkUG9pbnQiLCJleHBlY3QiLCJ0b0VxdWFsIiwidHlwZSIsImJ1aWxkaW5nIiwiZnJvbSIsInRvIiwiZXhpc3RpbmdNYXJrIiwicm9vdCIsImxpbmVBIiwibGluZUIiLCJyZXN1bHRBIiwicmVzdWx0QiIsInRvQmUiLCJjb21wbGV0ZSIsIlRlc3RDb21wIiwidG9vbCIsIkNvbXBvbmVudCIsIkNvbXAiLCJtYXJrIiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJsaW5lVG9vbENvbXBvbmVudCIsInJlbmRlckNvbXBvbmVudCIsImV4dHJhcyIsImRlZmF1bHRzIiwiZ3JhcGhQcm9wcyIsImdldEdyYXBoUHJvcHMiLCJwcm9wcyIsInJlbmRlciIsIl9yZW5kZXJDb21wb25lbnQiLCJjb250YWluZXIiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJidWlsZGluZ01hcmsiLCJfcmVuZGVyQ29tcG9uZW50MiIsImJnTWFyayIsImlzQmFja2dyb3VuZCIsIl9yZW5kZXJDb21wb25lbnQzIiwiZGlzYWJsZWRNYXJrIiwiZGlzYWJsZWQiLCJfcmVuZGVyQ29tcG9uZW50NCIsImNvcnJlY3RNYXJrIiwiY29ycmVjdG5lc3MiLCJfcmVuZGVyQ29tcG9uZW50NSIsIm1hcmtXaXRoTWlkZGxlIiwibWlkZGxlIiwiX3JlbmRlckNvbXBvbmVudDYiLCJjb2xvcmVkTWFyayIsImZpbGwiLCJfcmVuZGVyQ29tcG9uZW50NyIsImdzc0xpbmVEYXRhIiwic2VsZWN0ZWRUb29sIiwiX3JlbmRlckNvbXBvbmVudDgiLCJsYWJlbE5vZGUiLCJkb2N1bWVudCIsIl9yZW5kZXJDb21wb25lbnQ5IiwiX3JlbmRlckNvbXBvbmVudDAiLCJjb29yZGluYXRlc09uSG92ZXIiLCJfcmVuZGVyQ29tcG9uZW50MSIsImxhYmVsTW9kZUVuYWJsZWQiLCJfcmVuZGVyQ29tcG9uZW50MTAiLCJfcmVuZGVyQ29tcG9uZW50MTEiLCJyZXJlbmRlciIsInVwZGF0ZWRNYXJrIiwiX3JlbmRlckNvbXBvbmVudDEyIiwiX3JlbmRlckNvbXBvbmVudDEzIiwiX3JlbmRlckNvbXBvbmVudDE0IiwiaW5jb21wbGV0ZU1hcmsiLCJfcmVuZGVyQ29tcG9uZW50MTUiLCJzaW5nbGVQb2ludE1hcmsiLCJfcmVuZGVyQ29tcG9uZW50MTYiLCJwYXJhYm9sYSIsInNpbmUiLCJhYnNvbHV0ZSIsImV4cG9uZW50aWFsIiwiY2hhbmdlTWFya1Byb3BzIiwib25DbGljayIsImxpbmVCYXNlIiwicmVuZGVyV2l0aExhYmVscyIsInVuZGVmaW5lZCIsIl9yZW5kZXJDb21wb25lbnQxNyIsIl9yZW5kZXJXaXRoTGFiZWxzIiwiX3JlbmRlckNvbXBvbmVudDE4IiwiX3JlbmRlckNvbXBvbmVudDE5IiwiX3JlbmRlckNvbXBvbmVudDIwIiwiX3JlbmRlckNvbXBvbmVudDIxIiwiX3JlbmRlckNvbXBvbmVudDIyIiwiX3JlbmRlckNvbXBvbmVudDIzIiwiX3JlbmRlckNvbXBvbmVudDI0IiwiX3JlbmRlckNvbXBvbmVudDI1IiwiX3JlbmRlckNvbXBvbmVudDI2IiwiX3JlbmRlckNvbXBvbmVudDI3IiwiX3JlbmRlckNvbXBvbmVudDI4IiwiX3JlbmRlckNvbXBvbmVudDI5IiwiX3JlbmRlckNvbXBvbmVudDMwIiwiX3JlbmRlckNvbXBvbmVudDMxIiwiX3JlbmRlckNvbXBvbmVudDMyIiwiX3JlbmRlckNvbXBvbmVudDMzIiwiX3JlbmRlckNvbXBvbmVudDM0IiwiX3JlbmRlckNvbXBvbmVudDM1IiwiX3JlbmRlckNvbXBvbmVudDM2IiwiX3JlbmRlckNvbXBvbmVudDM3Iiwib25EcmFnU3RhcnQiLCJfcmVuZGVyQ29tcG9uZW50MzgiLCJvbkRyYWdTdG9wIiwiX3JlbmRlckNvbXBvbmVudDM5IiwiX3JlbmRlckNvbXBvbmVudDQwIiwiX3JlbmRlckNvbXBvbmVudDQxIiwiX3JlbmRlckNvbXBvbmVudDQyIiwiX3JlbmRlckNvbXBvbmVudDQzIiwiX3JlbmRlckNvbXBvbmVudDQ0IiwiX3JlbmRlckNvbXBvbmVudDQ1IiwiX3JlbmRlckNvbXBvbmVudDQ2IiwiX3JlbmRlckNvbXBvbmVudDQ3IiwiX3JlbmRlckNvbXBvbmVudDQ4IiwiX3JlbmRlckNvbXBvbmVudDQ5IiwiX3JlbmRlckNvbXBvbmVudDUwIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Rvb2xzL3NoYXJlZC9saW5lL19fdGVzdHNfXy9pbmRleC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsaW5lQmFzZSwgbGluZVRvb2wsIGxpbmVUb29sQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAcGllLWxpYi9wbG90JztcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ0BwaWUtbGliL3Rlc3QtdXRpbHMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdyYXBoUHJvcHMgYXMgZ2V0R3JhcGhQcm9wcyB9IGZyb20gJy4uLy4uLy4uLy4uL19fdGVzdHNfXy91dGlscyc7XG5cbmNvbnN0IHsgeHkgfSA9IHV0aWxzO1xuY29uc3QgeHlMYWJlbCA9ICh4LCB5LCBsYWJlbCkgPT4gKHsgeCwgeSwgbGFiZWwgfSk7XG5cbmRlc2NyaWJlKCdsaW5lVG9vbCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2FkZFBvaW50JywgKCkgPT4ge1xuICAgIGxldCB0b29sYmFyO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICB0b29sYmFyID0gbGluZVRvb2woJ2xpbmVUeXBlJywgKCkgPT4gPGRpdiAvPikoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgYnVpbGRpbmcgbWFyayB3aGVuIG5vIGV4aXN0aW5nIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b29sYmFyLmFkZFBvaW50KHh5KDEsIDEpKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICB0eXBlOiAnbGluZVR5cGUnLFxuICAgICAgICBidWlsZGluZzogdHJ1ZSxcbiAgICAgICAgZnJvbTogeHkoMSwgMSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgY29tcGxldGUgbWFyayB3aGVuIGFkZGluZyBzZWNvbmQgcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b29sYmFyLmFkZFBvaW50KHh5KDEsIDEpLCB7IGZyb206IHh5KDAsIDApIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIGJ1aWxkaW5nOiBmYWxzZSxcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgc2FtZSBtYXJrIGlmIHBvaW50IGVxdWFscyBleGlzdGluZyBmcm9tIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNYXJrID0geyBmcm9tOiB4eSgxLCAxKSwgYnVpbGRpbmc6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvb2xiYXIuYWRkUG9pbnQoeHkoMSwgMSksIGV4aXN0aW5nTWFyayk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4aXN0aW5nTWFyayk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhZGRpbmcgcG9pbnQgd2l0aCByb290IHByb3BlcnR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdNYXJrID0geyByb290OiB4eSgxLCAxKSwgYnVpbGRpbmc6IHRydWUgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRvb2xiYXIuYWRkUG9pbnQoeHkoMSwgMSksIGV4aXN0aW5nTWFyayk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4aXN0aW5nTWFyayk7XG4gICAgfSk7XG5cbiAgICBpdCgnY3JlYXRlcyBkaWZmZXJlbnQgdHlwZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbGluZUEgPSBsaW5lVG9vbCgnbGluZUEnLCAoKSA9PiA8ZGl2IC8+KSgpO1xuICAgICAgY29uc3QgbGluZUIgPSBsaW5lVG9vbCgnbGluZUInLCAoKSA9PiA8ZGl2IC8+KSgpO1xuXG4gICAgICBjb25zdCByZXN1bHRBID0gbGluZUEuYWRkUG9pbnQoeHkoMSwgMSkpO1xuICAgICAgY29uc3QgcmVzdWx0QiA9IGxpbmVCLmFkZFBvaW50KHh5KDEsIDEpKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdEEudHlwZSkudG9CZSgnbGluZUEnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRCLnR5cGUpLnRvQmUoJ2xpbmVCJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlc2VydmVzIGJ1aWxkaW5nIHN0YXRlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkaW5nID0gdG9vbGJhci5hZGRQb2ludCh4eSgxLCAxKSk7XG4gICAgICBleHBlY3QoYnVpbGRpbmcuYnVpbGRpbmcpLnRvQmUodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlID0gdG9vbGJhci5hZGRQb2ludCh4eSgyLCAyKSwgYnVpbGRpbmcpO1xuICAgICAgZXhwZWN0KGNvbXBsZXRlLmJ1aWxkaW5nKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NvbXBvbmVudCBwcm9wZXJ0eScsICgpID0+IHtcbiAgICBpdCgnc3RvcmVzIHRoZSBwcm92aWRlZCBDb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBUZXN0Q29tcCA9ICgpID0+IDxkaXY+VGVzdDwvZGl2PjtcbiAgICAgIGNvbnN0IHRvb2wgPSBsaW5lVG9vbCgndGVzdCcsIFRlc3RDb21wKSgpO1xuICAgICAgZXhwZWN0KHRvb2wuQ29tcG9uZW50KS50b0JlKFRlc3RDb21wKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdG9yZXMgdGhlIGNvcnJlY3QgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRvb2wgPSBsaW5lVG9vbCgnY3VzdG9tVHlwZScsICgpID0+IDxkaXYgLz4pKCk7XG4gICAgICBleHBlY3QodG9vbC50eXBlKS50b0JlKCdjdXN0b21UeXBlJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaW5lVG9vbENvbXBvbmVudCcsICgpID0+IHtcbiAgbGV0IENvbXA7XG4gIGxldCBtYXJrO1xuICBsZXQgb25DaGFuZ2U7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgQ29tcCA9IGxpbmVUb29sQ29tcG9uZW50KCgpID0+IDx0ZXh0IGRhdGEtdGVzdGlkPVwibGluZS1jb21wb25lbnRcIiAvPik7XG4gICAgbWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ2xpbmUnIH07XG4gIH0pO1xuXG4gIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IChleHRyYXMpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICAgIG1hcmssXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGdyYXBoUHJvcHM6IGdldEdyYXBoUHJvcHMoKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJ1aWxkaW5nIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGluZ01hcmsgPSB7IGZyb206IHh5KDAsIDApLCBidWlsZGluZzogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogYnVpbGRpbmdNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBiYWNrZ3JvdW5kIG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7IGZyb206IHh5KDAsIDApLCB0bzogeHkoMSwgMSksIGlzQmFja2dyb3VuZDogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogYmdNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBkaXNhYmxlZCBtYXJrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGlzYWJsZWRNYXJrID0geyBmcm9tOiB4eSgwLCAwKSwgdG86IHh5KDEsIDEpLCBkaXNhYmxlZDogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogZGlzYWJsZWRNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjb3JyZWN0bmVzcyBzdGF0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb3JyZWN0TWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgY29ycmVjdG5lc3M6ICdjb3JyZWN0JywgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogY29ycmVjdE1hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1pZGRsZSBwb2ludCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtXaXRoTWlkZGxlID0geyBmcm9tOiB4eSgwLCAwKSwgdG86IHh5KDEsIDEpLCBtaWRkbGU6IHh5KDAuNSwgMC41KSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogbWFya1dpdGhNaWRkbGUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGZpbGwgY29sb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb2xvcmVkTWFyayA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgZmlsbDogJyNmZjAwMDAnLCB0eXBlOiAnbGluZScgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBjb2xvcmVkTWFyayB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZ3NzTGluZURhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnc3NMaW5lRGF0YSA9IHsgc2VsZWN0ZWRUb29sOiAnbGluZUEnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgZ3NzTGluZURhdGEgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVsTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZvcmVpZ25PYmplY3QnKTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBsYWJlbE5vZGUgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGNvb3JkaW5hdGVzT25Ib3ZlciBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBsYWJlbE1vZGVFbmFibGVkOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RhdGUgbWFuYWdlbWVudCcsICgpID0+IHtcbiAgICBpdCgnaW5pdGlhbGl6ZXMgd2l0aCBlbXB0eSBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIC8vIFN0YXRlIHNob3VsZCBiZSBlbXB0eSBpbml0aWFsbHlcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1hcmsgdXBkYXRlcyB0aHJvdWdoIHByb3BzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyByZXJlbmRlciwgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRNYXJrID0geyBmcm9tOiB4eSgxLCAxKSwgdG86IHh5KDIsIDIpLCB0eXBlOiAnbGluZScgfTtcblxuICAgICAgcmVyZW5kZXIoPENvbXAgbWFyaz17dXBkYXRlZE1hcmt9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiYWNrZ3JvdW5kIG1hcmsgaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ2Rpc2FibGVzIGZyb20gcG9pbnQgd2hlbiBtYXJrIGlzIGJhY2tncm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyBmcm9tLmRpc2FibGVkIHNob3VsZCBiZSB0cnVlXG4gICAgfSk7XG5cbiAgICBpdCgnZGlzYWJsZXMgdG8gcG9pbnQgd2hlbiBtYXJrIGlzIGJhY2tncm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiZ01hcmsgPSB7XG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyB0by5kaXNhYmxlZCBzaG91bGQgYmUgdHJ1ZVxuICAgIH0pO1xuXG4gICAgaXQoJ2Rpc2FibGVzIG1pZGRsZSBwb2ludCB3aGVuIG1hcmsgaXMgYmFja2dyb3VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJnTWFyayA9IHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgbWlkZGxlOiB4eSgwLjUsIDAuNSksXG4gICAgICAgIGlzQmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBiZ01hcmsgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAvLyBtaWRkbGUuZGlzYWJsZWQgc2hvdWxkIGJlIHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhbmRsZXMgbWFyayB3aXRob3V0IHRvIHBvaW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5jb21wbGV0ZU1hcmsgPSB7IGZyb206IHh5KDAsIDApLCB0eXBlOiAnbGluZScgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBtYXJrOiBpbmNvbXBsZXRlTWFyayB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIG1hcmsgd2l0aCBvbmx5IGZyb20gcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVQb2ludE1hcmsgPSB7IGZyb206IHh5KDAsIDApLCBidWlsZGluZzogdHJ1ZSwgdHlwZTogJ2xpbmUnIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgbWFyazogc2luZ2xlUG9pbnRNYXJrIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgZGlmZmVyZW50IGxpbmUgdHlwZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhYm9sYSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ3BhcmFib2xhJyB9O1xuICAgICAgY29uc3Qgc2luZSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ3NpbmUnIH07XG4gICAgICBjb25zdCBhYnNvbHV0ZSA9IHsgZnJvbTogeHkoMCwgMCksIHRvOiB4eSgxLCAxKSwgdHlwZTogJ2Fic29sdXRlJyB9O1xuICAgICAgY29uc3QgZXhwb25lbnRpYWwgPSB7IGZyb206IHh5KDAsIDApLCB0bzogeHkoMSwgMSksIHR5cGU6ICdleHBvbmVudGlhbCcgfTtcblxuICAgICAgcmVuZGVyKDxDb21wIG1hcms9e3BhcmFib2xhfSBvbkNoYW5nZT17b25DaGFuZ2V9IGdyYXBoUHJvcHM9e2dldEdyYXBoUHJvcHMoKX0gLz4pO1xuICAgICAgcmVuZGVyKDxDb21wIG1hcms9e3NpbmV9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICByZW5kZXIoPENvbXAgbWFyaz17YWJzb2x1dGV9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgICByZW5kZXIoPENvbXAgbWFyaz17ZXhwb25lbnRpYWx9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gZ3JhcGhQcm9wcz17Z2V0R3JhcGhQcm9wcygpfSAvPik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdsaW5lQmFzZScsICgpID0+IHtcbiAgbGV0IENvbXA7XG4gIGxldCBvbkNoYW5nZTtcbiAgbGV0IGNoYW5nZU1hcmtQcm9wcztcbiAgbGV0IG9uQ2xpY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gICAgY2hhbmdlTWFya1Byb3BzID0gamVzdC5mbigpO1xuICAgIG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgQ29tcCA9IGxpbmVCYXNlKCgpID0+IDx0ZXh0IGRhdGEtdGVzdGlkPVwibGluZS1iYXNlXCIgLz4pO1xuICB9KTtcblxuICBjb25zdCByZW5kZXJDb21wb25lbnQgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGNoYW5nZU1hcmtQcm9wcyxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBncmFwaFByb3BzOiBnZXRHcmFwaFByb3BzKCksXG4gICAgICBmcm9tOiB4eSgwLCAwKSxcbiAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICB9O1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5kZWZhdWx0cywgLi4uZXh0cmFzIH07XG4gICAgcmV0dXJuIHJlbmRlcig8Q29tcCB7Li4ucHJvcHN9IC8+KTtcbiAgfTtcblxuICBjb25zdCBsYWJlbE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JlaWduT2JqZWN0Jyk7XG4gIGNvbnN0IHJlbmRlcldpdGhMYWJlbHMgPSAoZXh0cmFzID0ge30pID0+XG4gICAgcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgIC4uLmV4dHJhcyxcbiAgICAgIGxhYmVsTm9kZTogbGFiZWxOb2RlLFxuICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnQScpLFxuICAgICAgdG86IHh5TGFiZWwoMSwgMSwgJ0InKSxcbiAgICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVyaW5nJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoTGFiZWxzKCk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG1pZGRsZSBwb2ludCBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIG1pZGRsZTogeHlMYWJlbCgwLjUsIDAuNSwgJ00nKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBvbmx5IGZyb20gbGFiZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBmcm9tOiB4eUxhYmVsKDAsIDAsICdTdGFydCcpLFxuICAgICAgICB0bzogeHkoMSwgMSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggb25seSB0byBsYWJlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGZyb206IHh5KDAsIDApLFxuICAgICAgICB0bzogeHlMYWJlbCgxLCAxLCAnRW5kJyksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggYWxsIHRocmVlIGxhYmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICAgIGZyb206IHh5TGFiZWwoMCwgMCwgJ0EnKSxcbiAgICAgICAgdG86IHh5TGFiZWwoMSwgMSwgJ0InKSxcbiAgICAgICAgbWlkZGxlOiB4eUxhYmVsKDAuNSwgMC41LCAnTScpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnc3NMaW5lRGF0YSBoYW5kbGluZycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBub3JtYWxseSB3aXRob3V0IGdzc0xpbmVEYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCgpO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIHNvbHV0aW9uU2V0IGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ3NvbHV0aW9uU2V0JyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIGxpbmVBIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ2xpbmVBJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBnc3NMaW5lRGF0YSB3aGVuIGxpbmVCIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZ3NzTGluZURhdGEgPSB7IHNlbGVjdGVkVG9vbDogJ2xpbmVCJyB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGdzc0xpbmVEYXRhIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGlzYWJsZWQgc3RhdGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgd2hlbiBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdoZW4gbm90IGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGRpc2FibGVkOiBmYWxzZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvcnJlY3RuZXNzIHN0YXRlcycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGNvcnJlY3Qgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggaW5jb3JyZWN0IHN0YXRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggbWlzc2luZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogJ21pc3NpbmcnIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjb3JyZWN0bmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBjb3JyZWN0bmVzczogdW5kZWZpbmVkIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsbCBjb2xvcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGN1c3RvbSBmaWxsIGNvbG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGZpbGw6ICcjZmYwMDAwJyB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgZmlsbCBjb2xvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoeyBmaWxsOiB1bmRlZmluZWQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb29yZGluYXRlcyBvbiBob3ZlcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGNvb3JkaW5hdGVzT25Ib3ZlciBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogdHJ1ZSB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggY29vcmRpbmF0ZXNPbkhvdmVyIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IGNvb3JkaW5hdGVzT25Ib3ZlcjogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbCBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIHdpdGggbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiB0cnVlLFxuICAgICAgICBsYWJlbE5vZGUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgbGFiZWxNb2RlRW5hYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBsYWJlbE1vZGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkcmFnIGNhbGxiYWNrcycsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb25EcmFnU3RhcnQgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG9uRHJhZ1N0b3AgY2FsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdG9wID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7IG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIGJvdGggZHJhZyBjYWxsYmFja3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvbkRyYWdTdGFydCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG9uRHJhZ1N0b3AgPSBqZXN0LmZuKCk7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHsgb25EcmFnU3RhcnQsIG9uRHJhZ1N0b3AgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdoYW5kbGVzIGVxdWFsIGZyb20gYW5kIHRvIHBvaW50cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgxLCAxKSxcbiAgICAgICAgdG86IHh5KDEsIDEpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBuZWdhdGl2ZSBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgtNSwgLTUpLFxuICAgICAgICB0bzogeHkoLTEsIC0xKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbGFyZ2UgY29vcmRpbmF0ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMTAwLCAxMDApLFxuICAgICAgICB0bzogeHkoMjAwLCAyMDApLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBkZWNpbWFsIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGZyb206IHh5KDAuNSwgMC41KSxcbiAgICAgICAgdG86IHh5KDEuNSwgMS41KSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgdmVydGljYWwgbGluZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMSwgMCksXG4gICAgICAgIHRvOiB4eSgxLCA1KSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgaG9yaXpvbnRhbCBsaW5lcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJDb21wb25lbnQoe1xuICAgICAgICBmcm9tOiB4eSgwLCAxKSxcbiAgICAgICAgdG86IHh5KDUsIDEpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBlbXB0eSBsYWJlbCBzdHJpbmdzJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlckNvbXBvbmVudCh7XG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnJyksXG4gICAgICAgIHRvOiB4eUxhYmVsKDEsIDEsICcnKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW50ZWdyYXRpb24gc2NlbmFyaW9zJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIGNvbXBsZXRlIGxpbmUgd2l0aCBhbGwgZmVhdHVyZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHlMYWJlbCgwLCAwLCAnU3RhcnQnKSxcbiAgICAgICAgdG86IHh5TGFiZWwoNSwgNSwgJ0VuZCcpLFxuICAgICAgICBtaWRkbGU6IHh5TGFiZWwoMi41LCAyLjUsICdNaWRkbGUnKSxcbiAgICAgICAgbGFiZWxOb2RlLFxuICAgICAgICBjb29yZGluYXRlc09uSG92ZXI6IHRydWUsXG4gICAgICAgIGxhYmVsTW9kZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgY29ycmVjdG5lc3M6ICdjb3JyZWN0JyxcbiAgICAgICAgZmlsbDogJyMwMGZmMDAnLFxuICAgICAgICBnc3NMaW5lRGF0YTogeyBzZWxlY3RlZFRvb2w6ICdsaW5lQScgfSxcbiAgICAgICAgb25EcmFnU3RhcnQ6IGplc3QuZm4oKSxcbiAgICAgICAgb25EcmFnU3RvcDogamVzdC5mbigpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBkaXNhYmxlZCBiYWNrZ3JvdW5kIGxpbmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0JyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgc29sdXRpb24gc2V0IG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyQ29tcG9uZW50KHtcbiAgICAgICAgZnJvbTogeHkoMCwgMCksXG4gICAgICAgIHRvOiB4eSgxLCAxKSxcbiAgICAgICAgZ3NzTGluZURhdGE6IHsgc2VsZWN0ZWRUb29sOiAnc29sdXRpb25TZXQnIH0sXG4gICAgICAgIGxhYmVsTm9kZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQTBFLFNBQUFNLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxHQUFBZCxNQUFBLENBQUFlLGdCQUFBLENBQUFs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
|