@pie-element/explicit-constructed-response 11.0.1 → 11.1.0-beta.1

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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [11.1.0-next.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response@11.1.0-next.0...@pie-element/explicit-constructed-response@11.1.0-next.1) (2026-05-06)
7
+
8
+ ### Bug Fixes
9
+
10
+ - bump libs and shared modules PIE-440, PIE-436, PIE-439, PIE-519, PIE-216 ([932fc12](https://github.com/pie-framework/pie-elements/commit/932fc12557ba56a737cee005be898d54d5e590ef))
11
+
6
12
  ## [11.0.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response@11.0.0...@pie-element/explicit-constructed-response@11.0.1) (2026-04-28)
7
13
 
8
14
  **Note:** Version bump only for package @pie-element/explicit-constructed-response
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [10.1.0-next.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-configure@10.1.0-next.0...@pie-element/explicit-constructed-response-configure@10.1.0-next.1) (2026-05-06)
7
+
8
+ ### Bug Fixes
9
+
10
+ - bump libs and shared modules PIE-440, PIE-436, PIE-439, PIE-519, PIE-216 ([932fc12](https://github.com/pie-framework/pie-elements/commit/932fc12557ba56a737cee005be898d54d5e590ef))
11
+
6
12
  ## [10.0.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/explicit-constructed-response-configure@10.0.0...@pie-element/explicit-constructed-response-configure@10.0.1) (2026-04-28)
7
13
 
8
14
  **Note:** Version bump only for package @pie-element/explicit-constructed-response-configure
@@ -0,0 +1,503 @@
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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