@pie-element/explicit-constructed-response 11.2.2-beta.3 → 11.2.3

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.
@@ -1,503 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
- var _react = require("@testing-library/react");
6
- var _react2 = _interopRequireDefault(require("react"));
7
- var _styles = require("@mui/material/styles");
8
- var _alternateResponses = require("../alternateResponses");
9
- var _defaults = _interopRequireDefault(require("../defaults"));
10
- var _markupUtils = require("../markupUtils");
11
- jest.mock('../alternateSection', () => ({
12
- __esModule: true,
13
- default: props => /*#__PURE__*/_react2.default.createElement("div", (0, _extends2.default)({
14
- "data-testid": "alternate-section"
15
- }, props))
16
- }));
17
- const theme = (0, _styles.createTheme)();
18
- const model = {
19
- markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
20
- disabled: false,
21
- choices: {
22
- 0: [{
23
- label: 'cow',
24
- value: '0'
25
- }, {
26
- label: 'cattle',
27
- value: '1'
28
- }, {
29
- label: 'calf',
30
- value: '2'
31
- }],
32
- 1: [{
33
- label: 'over',
34
- value: '0'
35
- }, {
36
- label: 'past',
37
- value: '1'
38
- }, {
39
- label: 'beyond',
40
- value: '2'
41
- }],
42
- 2: [{
43
- label: 'moon',
44
- value: '0'
45
- }]
46
- },
47
- maxLengthPerChoice: [6, 6, 4],
48
- prompt: 'Complete the sentence'
49
- };
50
- const prepareModel = (model = {}) => {
51
- const joinedObj = {
52
- ..._defaults.default.model,
53
- ...model
54
- };
55
- const slateMarkup = joinedObj.slateMarkup || (0, _markupUtils.createSlateMarkup)(joinedObj.markup, joinedObj.choices);
56
- const processedMarkup = (0, _markupUtils.processMarkup)(slateMarkup);
57
- return {
58
- ...joinedObj,
59
- slateMarkup,
60
- markup: processedMarkup
61
- };
62
- };
63
- describe('AlternateResponses', () => {
64
- let onChange = jest.fn();
65
- let onLengthChange = jest.fn();
66
- beforeEach(() => {
67
- jest.clearAllMocks();
68
- });
69
-
70
- // Helper function to create a properly initialized test instance
71
- const createTestInstance = (modelOverrides = {}, propsOverrides = {}) => {
72
- const testProps = {
73
- onChange,
74
- onLengthChange,
75
- classes: {},
76
- model: prepareModel({
77
- ...model,
78
- ...modelOverrides
79
- }),
80
- maxLengthPerChoiceEnabled: false,
81
- ...propsOverrides
82
- };
83
- const testInstance = new _alternateResponses.AlternateResponses(testProps);
84
- // Initialize state manually since we're not mounting
85
- testInstance.state = {
86
- maxLengthPerChoice: []
87
- };
88
-
89
- // Mock setState to capture state updates
90
- testInstance.setState = jest.fn(newState => {
91
- testInstance.state = {
92
- ...testInstance.state,
93
- ...newState
94
- };
95
- });
96
- return testInstance;
97
- };
98
- const renderAlternateResponses = extras => {
99
- const defaults = {
100
- onChange,
101
- onLengthChange,
102
- classes: {},
103
- model: prepareModel({
104
- ...model,
105
- ...extras
106
- }),
107
- maxLengthPerChoiceEnabled: true
108
- };
109
- const props = {
110
- ...defaults
111
- };
112
- return (0, _react.render)(/*#__PURE__*/_react2.default.createElement(_styles.ThemeProvider, {
113
- theme: theme
114
- }, /*#__PURE__*/_react2.default.createElement(_alternateResponses.AlternateResponses, props)));
115
- };
116
- describe('logic', () => {
117
- describe('updateChoicesIfNeeded', () => {
118
- it('sets state, updates edited choice', () => {
119
- const testInstance = createTestInstance();
120
- const newChoices = {
121
- 0: [{
122
- label: 'cow',
123
- value: '0'
124
- }, {
125
- label: 'cattle',
126
- value: '1'
127
- }, {
128
- label: 'calf',
129
- value: '2'
130
- }],
131
- 1: [{
132
- label: 'under',
133
- value: '0'
134
- }, {
135
- label: 'past',
136
- value: '1'
137
- }, {
138
- label: 'beyond',
139
- value: '2'
140
- }],
141
- 2: [{
142
- label: 'moon',
143
- value: '0'
144
- }]
145
- };
146
- testInstance.updateChoicesIfNeeded({
147
- model: {
148
- ...model,
149
- choices: newChoices
150
- },
151
- maxLengthPerChoiceEnabled: false
152
- });
153
- expect(testInstance.state).toEqual(expect.objectContaining({
154
- choices: newChoices,
155
- values: {
156
- 0: {
157
- label: 'cow',
158
- value: '0'
159
- },
160
- 1: {
161
- label: 'under',
162
- value: '0'
163
- }
164
- }
165
- }));
166
- });
167
- it('sets state, if a choice has an alternate', () => {
168
- const testInstance = createTestInstance();
169
- const newChoices = {
170
- 0: [{
171
- label: 'cow',
172
- value: '0'
173
- }, {
174
- label: 'cattle',
175
- value: '1'
176
- }, {
177
- label: 'calf',
178
- value: '2'
179
- }],
180
- 1: [{
181
- label: 'under',
182
- value: '0'
183
- }, {
184
- label: 'past',
185
- value: '1'
186
- }, {
187
- label: 'beyond',
188
- value: '2'
189
- }],
190
- 2: [{
191
- label: 'sun',
192
- value: '0'
193
- }, {
194
- label: 'star',
195
- value: '1'
196
- }]
197
- };
198
- testInstance.updateChoicesIfNeeded({
199
- model: {
200
- ...model,
201
- choices: newChoices
202
- },
203
- maxLengthPerChoiceEnabled: false
204
- });
205
- expect(testInstance.state).toEqual(expect.objectContaining({
206
- choices: newChoices,
207
- values: {
208
- 0: {
209
- label: 'cow',
210
- value: '0'
211
- },
212
- 1: {
213
- label: 'under',
214
- value: '0'
215
- },
216
- 2: {
217
- label: 'sun',
218
- value: '0'
219
- }
220
- }
221
- }));
222
- });
223
- it('sets state if some choices are removed', () => {
224
- const testInstance = createTestInstance();
225
- const newChoices = {
226
- 0: [{
227
- label: 'cow',
228
- value: '0'
229
- }, {
230
- label: 'cattle',
231
- value: '1'
232
- }, {
233
- label: 'calf',
234
- value: '2'
235
- }]
236
- };
237
- testInstance.updateChoicesIfNeeded({
238
- model: {
239
- ...model,
240
- choices: newChoices
241
- },
242
- maxLengthPerChoiceEnabled: false
243
- });
244
- expect(testInstance.state).toEqual(expect.objectContaining({
245
- choices: newChoices,
246
- values: {
247
- 0: {
248
- label: 'cow',
249
- value: '0'
250
- }
251
- }
252
- }));
253
- });
254
- it('does not change state', () => {
255
- const testInstance = createTestInstance();
256
-
257
- // Initialize state
258
- testInstance.updateChoicesIfNeeded({
259
- model,
260
- maxLengthPerChoiceEnabled: false
261
- });
262
-
263
- // Call again with same model
264
- testInstance.updateChoicesIfNeeded({
265
- model,
266
- maxLengthPerChoiceEnabled: false
267
- });
268
- expect(testInstance.state).toEqual(expect.objectContaining({
269
- choices: model.choices,
270
- values: {
271
- 0: {
272
- label: 'cow',
273
- value: '0'
274
- },
275
- 1: {
276
- label: 'over',
277
- value: '0'
278
- }
279
- }
280
- }));
281
- });
282
- });
283
- describe('getRemainingChoices', () => {
284
- it('adds an alternate if selecting a choice', () => {
285
- const testInstance = createTestInstance();
286
-
287
- // Initialize state
288
- testInstance.updateChoicesIfNeeded({
289
- model,
290
- maxLengthPerChoiceEnabled: false
291
- });
292
- const remainingChoices = testInstance.getRemainingChoices();
293
- expect(remainingChoices).toEqual([{
294
- label: 'moon',
295
- value: '2'
296
- }]);
297
- });
298
- });
299
- describe('onChoiceChanged', () => {
300
- it('changes new alternate', () => {
301
- const testInstance = createTestInstance();
302
-
303
- // Initialize state
304
- testInstance.updateChoicesIfNeeded({
305
- model,
306
- maxLengthPerChoiceEnabled: false
307
- });
308
- testInstance.onChoiceChanged({
309
- label: 'New Choice',
310
- value: '1'
311
- }, 2);
312
- expect(onChange).toBeCalledWith({
313
- ...model.choices,
314
- 2: [{
315
- label: 'moon',
316
- value: '0'
317
- }, {
318
- label: 'New Choice',
319
- value: '1'
320
- }]
321
- });
322
- });
323
- it('changes existing alternate', () => {
324
- const testInstance = createTestInstance();
325
-
326
- // Initialize state
327
- testInstance.updateChoicesIfNeeded({
328
- model,
329
- maxLengthPerChoiceEnabled: false
330
- });
331
- testInstance.onChoiceChanged({
332
- label: 'New Choice Edited',
333
- value: '1'
334
- }, 2);
335
- expect(onChange).toBeCalledWith({
336
- ...model.choices,
337
- 2: [{
338
- label: 'moon',
339
- value: '0'
340
- }, {
341
- label: 'New Choice Edited',
342
- value: '1'
343
- }]
344
- });
345
- });
346
- });
347
- describe('onChoiceRemoved', () => {
348
- it('removes choice from section', () => {
349
- const testInstance = createTestInstance();
350
-
351
- // Initialize state
352
- testInstance.updateChoicesIfNeeded({
353
- model,
354
- maxLengthPerChoiceEnabled: false
355
- });
356
- testInstance.onChoiceRemoved('1', '1');
357
- const expectedChoices = {
358
- ...model.choices,
359
- 1: [{
360
- label: 'over',
361
- value: '0'
362
- }, {
363
- label: 'beyond',
364
- value: '2'
365
- }]
366
- };
367
- expect(onChange).toBeCalledWith(expectedChoices);
368
- });
369
- it('does not throw error if parameters are not correct', () => {
370
- const testInstance = createTestInstance();
371
-
372
- // Initialize state
373
- testInstance.updateChoicesIfNeeded({
374
- model,
375
- maxLengthPerChoiceEnabled: false
376
- });
377
- testInstance.onChoiceRemoved('11', '1');
378
- expect(onChange).toBeCalledWith(model.choices);
379
- });
380
- });
381
- describe('onSectionSelect', () => {
382
- it('removing a selection', () => {
383
- const testInstance = createTestInstance({
384
- choices: {
385
- 0: [{
386
- label: 'cow',
387
- value: '0'
388
- }, {
389
- label: 'cattle',
390
- value: '1'
391
- }, {
392
- label: 'calf',
393
- value: '2'
394
- }],
395
- 1: [{
396
- label: 'over',
397
- value: '0'
398
- }, {
399
- label: 'past',
400
- value: '1'
401
- }, {
402
- label: 'beyond',
403
- value: '2'
404
- }],
405
- 2: [{
406
- label: 'moon',
407
- value: '0'
408
- }]
409
- }
410
- });
411
-
412
- // Initialize state
413
- testInstance.updateChoicesIfNeeded({
414
- model: {
415
- ...model,
416
- choices: {
417
- 0: [{
418
- label: 'cow',
419
- value: '0'
420
- }, {
421
- label: 'cattle',
422
- value: '1'
423
- }, {
424
- label: 'calf',
425
- value: '2'
426
- }],
427
- 1: [{
428
- label: 'over',
429
- value: '0'
430
- }, {
431
- label: 'past',
432
- value: '1'
433
- }, {
434
- label: 'beyond',
435
- value: '2'
436
- }],
437
- 2: [{
438
- label: 'moon',
439
- value: '0'
440
- }]
441
- }
442
- },
443
- maxLengthPerChoiceEnabled: false
444
- });
445
- testInstance.onSectionSelect(undefined, '0');
446
- expect(onChange).toBeCalledWith({
447
- 0: [{
448
- label: 'cow',
449
- value: '0'
450
- }],
451
- 1: [{
452
- label: 'over',
453
- value: '0'
454
- }, {
455
- label: 'past',
456
- value: '1'
457
- }, {
458
- label: 'beyond',
459
- value: '2'
460
- }],
461
- 2: [{
462
- label: 'moon',
463
- value: '0'
464
- }]
465
- });
466
- });
467
- it('selecting a response', () => {
468
- const testInstance = createTestInstance();
469
-
470
- // Initialize state
471
- testInstance.updateChoicesIfNeeded({
472
- model,
473
- maxLengthPerChoiceEnabled: false
474
- });
475
- const stateBefore = {
476
- ...testInstance.state
477
- };
478
- testInstance.onSectionSelect({
479
- label: 'moon',
480
- value: '0'
481
- }, '2');
482
- expect(testInstance.state.choices).toEqual({
483
- ...stateBefore.choices,
484
- 2: [{
485
- label: 'moon',
486
- value: '0'
487
- }, {
488
- label: '',
489
- value: '1'
490
- }]
491
- });
492
- expect(testInstance.state.values).toEqual({
493
- ...stateBefore.values,
494
- 2: {
495
- label: 'moon',
496
- value: '0'
497
- }
498
- });
499
- });
500
- });
501
- });
502
- });
503
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVzIiwiX2FsdGVybmF0ZVJlc3BvbnNlcyIsIl9kZWZhdWx0cyIsIl9tYXJrdXBVdGlscyIsImplc3QiLCJtb2NrIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJwcm9wcyIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJ0aGVtZSIsImNyZWF0ZVRoZW1lIiwibW9kZWwiLCJtYXJrdXAiLCJkaXNhYmxlZCIsImNob2ljZXMiLCJsYWJlbCIsInZhbHVlIiwibWF4TGVuZ3RoUGVyQ2hvaWNlIiwicHJvbXB0IiwicHJlcGFyZU1vZGVsIiwiam9pbmVkT2JqIiwic2Vuc2libGVEZWZhdWx0cyIsInNsYXRlTWFya3VwIiwiY3JlYXRlU2xhdGVNYXJrdXAiLCJwcm9jZXNzZWRNYXJrdXAiLCJwcm9jZXNzTWFya3VwIiwiZGVzY3JpYmUiLCJvbkNoYW5nZSIsImZuIiwib25MZW5ndGhDaGFuZ2UiLCJiZWZvcmVFYWNoIiwiY2xlYXJBbGxNb2NrcyIsImNyZWF0ZVRlc3RJbnN0YW5jZSIsIm1vZGVsT3ZlcnJpZGVzIiwicHJvcHNPdmVycmlkZXMiLCJ0ZXN0UHJvcHMiLCJjbGFzc2VzIiwibWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZCIsInRlc3RJbnN0YW5jZSIsIkFsdGVybmF0ZVJlc3BvbnNlcyIsInN0YXRlIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInJlbmRlckFsdGVybmF0ZVJlc3BvbnNlcyIsImV4dHJhcyIsImRlZmF1bHRzIiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsIml0IiwibmV3Q2hvaWNlcyIsInVwZGF0ZUNob2ljZXNJZk5lZWRlZCIsImV4cGVjdCIsInRvRXF1YWwiLCJvYmplY3RDb250YWluaW5nIiwidmFsdWVzIiwicmVtYWluaW5nQ2hvaWNlcyIsImdldFJlbWFpbmluZ0Nob2ljZXMiLCJvbkNob2ljZUNoYW5nZWQiLCJ0b0JlQ2FsbGVkV2l0aCIsIm9uQ2hvaWNlUmVtb3ZlZCIsImV4cGVjdGVkQ2hvaWNlcyIsIm9uU2VjdGlvblNlbGVjdCIsInVuZGVmaW5lZCIsInN0YXRlQmVmb3JlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9hbHRlcm5hdGVSZXNwb25zZXMudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVGhlbWVQcm92aWRlciwgY3JlYXRlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5cbmltcG9ydCB7IEFsdGVybmF0ZVJlc3BvbnNlcyB9IGZyb20gJy4uL2FsdGVybmF0ZVJlc3BvbnNlcyc7XG5pbXBvcnQgc2Vuc2libGVEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5pbXBvcnQgeyBjcmVhdGVTbGF0ZU1hcmt1cCwgcHJvY2Vzc01hcmt1cCB9IGZyb20gJy4uL21hcmt1cFV0aWxzJztcblxuamVzdC5tb2NrKCcuLi9hbHRlcm5hdGVTZWN0aW9uJywgKCkgPT4gKHtcbiAgX19lc01vZHVsZTogdHJ1ZSxcbiAgZGVmYXVsdDogKHByb3BzKSA9PiA8ZGl2IGRhdGEtdGVzdGlkPVwiYWx0ZXJuYXRlLXNlY3Rpb25cIiB7Li4ucHJvcHN9IC8+LFxufSkpO1xuXG5jb25zdCB0aGVtZSA9IGNyZWF0ZVRoZW1lKCk7XG5cbmNvbnN0IG1vZGVsID0ge1xuICBtYXJrdXA6ICc8cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD4nLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGNob2ljZXM6IHtcbiAgICAwOiBbXG4gICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgIF0sXG4gICAgMTogW1xuICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScgfSxcbiAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgXSxcbiAgICAyOiBbeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnIH1dLFxuICB9LFxuICBtYXhMZW5ndGhQZXJDaG9pY2U6IFs2LCA2LCA0XSxcbiAgcHJvbXB0OiAnQ29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbn07XG5cbmNvbnN0IHByZXBhcmVNb2RlbCA9IChtb2RlbCA9IHt9KSA9PiB7XG4gIGNvbnN0IGpvaW5lZE9iaiA9IHtcbiAgICAuLi5zZW5zaWJsZURlZmF1bHRzLm1vZGVsLFxuICAgIC4uLm1vZGVsLFxuICB9O1xuICBjb25zdCBzbGF0ZU1hcmt1cCA9IGpvaW5lZE9iai5zbGF0ZU1hcmt1cCB8fCBjcmVhdGVTbGF0ZU1hcmt1cChqb2luZWRPYmoubWFya3VwLCBqb2luZWRPYmouY2hvaWNlcyk7XG4gIGNvbnN0IHByb2Nlc3NlZE1hcmt1cCA9IHByb2Nlc3NNYXJrdXAoc2xhdGVNYXJrdXApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uam9pbmVkT2JqLFxuICAgIHNsYXRlTWFya3VwLFxuICAgIG1hcmt1cDogcHJvY2Vzc2VkTWFya3VwLFxuICB9O1xufTtcblxuZGVzY3JpYmUoJ0FsdGVybmF0ZVJlc3BvbnNlcycsICgpID0+IHtcbiAgbGV0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuICBsZXQgb25MZW5ndGhDaGFuZ2UgPSBqZXN0LmZuKCk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBwcm9wZXJseSBpbml0aWFsaXplZCB0ZXN0IGluc3RhbmNlXG4gIGNvbnN0IGNyZWF0ZVRlc3RJbnN0YW5jZSA9IChtb2RlbE92ZXJyaWRlcyA9IHt9LCBwcm9wc092ZXJyaWRlcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgdGVzdFByb3BzID0ge1xuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkxlbmd0aENoYW5nZSxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5tb2RlbE92ZXJyaWRlcyxcbiAgICAgIH0pLFxuICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAuLi5wcm9wc092ZXJyaWRlcyxcbiAgICB9O1xuXG4gICAgY29uc3QgdGVzdEluc3RhbmNlID0gbmV3IEFsdGVybmF0ZVJlc3BvbnNlcyh0ZXN0UHJvcHMpO1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgbWFudWFsbHkgc2luY2Ugd2UncmUgbm90IG1vdW50aW5nXG4gICAgdGVzdEluc3RhbmNlLnN0YXRlID0geyBtYXhMZW5ndGhQZXJDaG9pY2U6IFtdIH07XG5cbiAgICAvLyBNb2NrIHNldFN0YXRlIHRvIGNhcHR1cmUgc3RhdGUgdXBkYXRlc1xuICAgIHRlc3RJbnN0YW5jZS5zZXRTdGF0ZSA9IGplc3QuZm4oKG5ld1N0YXRlKSA9PiB7XG4gICAgICB0ZXN0SW5zdGFuY2Uuc3RhdGUgPSB7IC4uLnRlc3RJbnN0YW5jZS5zdGF0ZSwgLi4ubmV3U3RhdGUgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXN0SW5zdGFuY2U7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyQWx0ZXJuYXRlUmVzcG9uc2VzID0gKGV4dHJhcykgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkxlbmd0aENoYW5nZSxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbCh7XG4gICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAuLi5leHRyYXMsXG4gICAgICB9KSxcbiAgICAgIG1heExlbmd0aFBlckNob2ljZUVuYWJsZWQ6IHRydWUsXG4gICAgfTtcbiAgICBjb25zdCBwcm9wcyA9IHsgLi4uZGVmYXVsdHMgfTtcblxuICAgIHJldHVybiByZW5kZXIoXG4gICAgICA8VGhlbWVQcm92aWRlciB0aGVtZT17dGhlbWV9PlxuICAgICAgICA8QWx0ZXJuYXRlUmVzcG9uc2VzIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvVGhlbWVQcm92aWRlcj5cbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdsb2dpYycsICgpID0+IHtcbiAgICBkZXNjcmliZSgndXBkYXRlQ2hvaWNlc0lmTmVlZGVkJywgKCkgPT4ge1xuICAgICAgaXQoJ3NldHMgc3RhdGUsIHVwZGF0ZXMgZWRpdGVkIGNob2ljZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7XG5cbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAwOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgMTogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ3VuZGVyJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ3Bhc3QnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnYmV5b25kJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgMjogW3sgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcwJyB9XSxcbiAgICAgICAgfTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2UudXBkYXRlQ2hvaWNlc0lmTmVlZGVkKHtcbiAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0ZXN0SW5zdGFuY2Uuc3RhdGUpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgICAwOiB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAxOiB7IGxhYmVsOiAndW5kZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzZXRzIHN0YXRlLCBpZiBhIGNob2ljZSBoYXMgYW4gYWx0ZXJuYXRlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTtcblxuICAgICAgICBjb25zdCBuZXdDaG9pY2VzID0ge1xuICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnY2F0dGxlJywgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2NhbGYnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAxOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAndW5kZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAncGFzdCcsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAyOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnc3VuJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ3N0YXInLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2UudXBkYXRlQ2hvaWNlc0lmTmVlZGVkKHtcbiAgICAgICAgICBtb2RlbDoge1xuICAgICAgICAgICAgLi4ubW9kZWwsXG4gICAgICAgICAgICBjaG9pY2VzOiBuZXdDaG9pY2VzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0ZXN0SW5zdGFuY2Uuc3RhdGUpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgICAwOiB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAxOiB7IGxhYmVsOiAndW5kZXInLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgIDI6IHsgbGFiZWw6ICdzdW4nLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzZXRzIHN0YXRlIGlmIHNvbWUgY2hvaWNlcyBhcmUgcmVtb3ZlZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7XG5cbiAgICAgICAgY29uc3QgbmV3Q2hvaWNlcyA9IHtcbiAgICAgICAgICAwOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGVzdEluc3RhbmNlLnVwZGF0ZUNob2ljZXNJZk5lZWRlZCh7XG4gICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgIC4uLm1vZGVsLFxuICAgICAgICAgICAgY2hvaWNlczogbmV3Q2hvaWNlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QodGVzdEluc3RhbmNlLnN0YXRlKS50b0VxdWFsKFxuICAgICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICAgIGNob2ljZXM6IG5ld0Nob2ljZXMsXG4gICAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgICAgMDogeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IGNoYW5nZSBzdGF0ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZVxuICAgICAgICB0ZXN0SW5zdGFuY2UudXBkYXRlQ2hvaWNlc0lmTmVlZGVkKHtcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2FsbCBhZ2FpbiB3aXRoIHNhbWUgbW9kZWxcbiAgICAgICAgdGVzdEluc3RhbmNlLnVwZGF0ZUNob2ljZXNJZk5lZWRlZCh7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0ZXN0SW5zdGFuY2Uuc3RhdGUpLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgY2hvaWNlczogbW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgICAwOiB7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAxOiB7IGxhYmVsOiAnb3ZlcicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdnZXRSZW1haW5pbmdDaG9pY2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ2FkZHMgYW4gYWx0ZXJuYXRlIGlmIHNlbGVjdGluZyBhIGNob2ljZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZVxuICAgICAgICB0ZXN0SW5zdGFuY2UudXBkYXRlQ2hvaWNlc0lmTmVlZGVkKHtcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVtYWluaW5nQ2hvaWNlcyA9IHRlc3RJbnN0YW5jZS5nZXRSZW1haW5pbmdDaG9pY2VzKCk7XG5cbiAgICAgICAgZXhwZWN0KHJlbWFpbmluZ0Nob2ljZXMpLnRvRXF1YWwoW3sgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcyJyB9XSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbkNob2ljZUNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBpdCgnY2hhbmdlcyBuZXcgYWx0ZXJuYXRlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlXG4gICAgICAgIHRlc3RJbnN0YW5jZS51cGRhdGVDaG9pY2VzSWZOZWVkZWQoe1xuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25DaG9pY2VDaGFuZ2VkKHsgbGFiZWw6ICdOZXcgQ2hvaWNlJywgdmFsdWU6ICcxJyB9LCAyKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvQmVDYWxsZWRXaXRoKHtcbiAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgIDI6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ05ldyBDaG9pY2UnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NoYW5nZXMgZXhpc3RpbmcgYWx0ZXJuYXRlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBjcmVhdGVUZXN0SW5zdGFuY2UoKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlXG4gICAgICAgIHRlc3RJbnN0YW5jZS51cGRhdGVDaG9pY2VzSWZOZWVkZWQoe1xuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIG1heExlbmd0aFBlckNob2ljZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0ZXN0SW5zdGFuY2Uub25DaG9pY2VDaGFuZ2VkKHsgbGFiZWw6ICdOZXcgQ2hvaWNlIEVkaXRlZCcsIHZhbHVlOiAnMScgfSwgMik7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0JlQ2FsbGVkV2l0aCh7XG4gICAgICAgICAgLi4ubW9kZWwuY2hvaWNlcyxcbiAgICAgICAgICAyOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOZXcgQ2hvaWNlIEVkaXRlZCcsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlUmVtb3ZlZCcsICgpID0+IHtcbiAgICAgIGl0KCdyZW1vdmVzIGNob2ljZSBmcm9tIHNlY3Rpb24nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICAgICAgdGVzdEluc3RhbmNlLnVwZGF0ZUNob2ljZXNJZk5lZWRlZCh7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vbkNob2ljZVJlbW92ZWQoJzEnLCAnMScpO1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkQ2hvaWNlcyA9IHtcbiAgICAgICAgICAuLi5tb2RlbC5jaG9pY2VzLFxuICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdvdmVyJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoZXhwZWN0ZWRDaG9pY2VzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgdGhyb3cgZXJyb3IgaWYgcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RJbnN0YW5jZSA9IGNyZWF0ZVRlc3RJbnN0YW5jZSgpO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICAgICAgdGVzdEluc3RhbmNlLnVwZGF0ZUNob2ljZXNJZk5lZWRlZCh7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vbkNob2ljZVJlbW92ZWQoJzExJywgJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvQmVDYWxsZWRXaXRoKG1vZGVsLmNob2ljZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25TZWN0aW9uU2VsZWN0JywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbW92aW5nIGEgc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0SW5zdGFuY2UgPSBjcmVhdGVUZXN0SW5zdGFuY2Uoe1xuICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgIDA6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NvdycsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhbGYnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMTogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnb3ZlcicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ3Bhc3QnLCB2YWx1ZTogJzEnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgMjogW3sgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlXG4gICAgICAgIHRlc3RJbnN0YW5jZS51cGRhdGVDaG9pY2VzSWZOZWVkZWQoe1xuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICAuLi5tb2RlbCxcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ2NhdHRsZScsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnY2FsZicsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMTogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdvdmVyJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdiZXlvbmQnLCB2YWx1ZTogJzInIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vblNlY3Rpb25TZWxlY3QodW5kZWZpbmVkLCAnMCcpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoe1xuICAgICAgICAgIDA6IFt7IGxhYmVsOiAnY293JywgdmFsdWU6ICcwJyB9XSxcbiAgICAgICAgICAxOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnb3ZlcicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ2JleW9uZCcsIHZhbHVlOiAnMicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcgfV0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzZWxlY3RpbmcgYSByZXNwb25zZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdEluc3RhbmNlID0gY3JlYXRlVGVzdEluc3RhbmNlKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZVxuICAgICAgICB0ZXN0SW5zdGFuY2UudXBkYXRlQ2hvaWNlc0lmTmVlZGVkKHtcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2VFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGVCZWZvcmUgPSB7IC4uLnRlc3RJbnN0YW5jZS5zdGF0ZSB9O1xuXG4gICAgICAgIHRlc3RJbnN0YW5jZS5vblNlY3Rpb25TZWxlY3QoeyBsYWJlbDogJ21vb24nLCB2YWx1ZTogJzAnIH0sICcyJyk7XG5cbiAgICAgICAgZXhwZWN0KHRlc3RJbnN0YW5jZS5zdGF0ZS5jaG9pY2VzKS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5zdGF0ZUJlZm9yZS5jaG9pY2VzLFxuICAgICAgICAgIDI6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdtb29uJywgdmFsdWU6ICcwJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJycsIHZhbHVlOiAnMScgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHRlc3RJbnN0YW5jZS5zdGF0ZS52YWx1ZXMpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnN0YXRlQmVmb3JlLnZhbHVlcyxcbiAgICAgICAgICAyOiB7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAg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