@pie-element/ebsr 9.2.0-next.1 → 9.2.0

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,732 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
-
7
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
-
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
-
11
- var _index = require("../index");
12
-
13
- var _utils = require("../utils");
14
-
15
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
-
17
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
18
-
19
- var PART_A = 'partA';
20
- var PART_B = 'partB';
21
- jest.mock('../utils', function () {
22
- return {
23
- isResponseCorrect: jest.fn()
24
- };
25
- });
26
- describe('controller', function () {
27
- var result, question, session, env;
28
- beforeEach(function () {
29
- question = {
30
- partA: {
31
- choiceMode: 'checkbox',
32
- feedbackEnabled: true,
33
- choices: [{
34
- value: 'yellow',
35
- label: 'Yellow',
36
- correct: true,
37
- feedback: {
38
- type: 'custom',
39
- value: 'foo'
40
- }
41
- }, {
42
- value: 'green',
43
- label: 'Green',
44
- feedback: {
45
- type: 'default'
46
- }
47
- }],
48
- choicePrefix: 'numbers',
49
- prompt: "prompt ".concat(PART_A),
50
- promptEnabled: true,
51
- lockChoiceOrder: true,
52
- partialScoring: false
53
- },
54
- partB: {
55
- choiceMode: 'checkbox',
56
- feedbackEnabled: true,
57
- choices: [{
58
- value: 'orange',
59
- label: 'Orange',
60
- correct: true,
61
- feedback: {
62
- type: 'custom',
63
- value: 'foo'
64
- }
65
- }, {
66
- value: 'purple',
67
- label: 'Purple',
68
- feedback: {
69
- type: 'default'
70
- }
71
- }, {
72
- value: 'c',
73
- correct: true
74
- }],
75
- choicePrefix: 'numbers',
76
- prompt: "prompt ".concat(PART_B),
77
- promptEnabled: true,
78
- lockChoiceOrder: true,
79
- partialScoring: false
80
- }
81
- };
82
- });
83
- describe('outcome partialScoring test', function () {
84
- var mkQuestion = function mkQuestion(extra) {
85
- return _objectSpread({
86
- partA: {
87
- choiceMode: 'radio',
88
- feedbackEnabled: true,
89
- choices: [{
90
- value: 'yellow',
91
- label: 'Yellow',
92
- correct: true,
93
- feedback: {
94
- type: 'custom',
95
- value: 'foo'
96
- }
97
- }, {
98
- value: 'blue',
99
- label: 'Blue',
100
- correct: true,
101
- feedback: {
102
- type: 'custom',
103
- value: 'foo'
104
- }
105
- }, {
106
- value: 'green',
107
- label: 'Green',
108
- feedback: {
109
- type: 'default'
110
- }
111
- }],
112
- choicePrefix: 'numbers',
113
- prompt: "prompt ".concat(PART_A),
114
- promptEnabled: true,
115
- lockChoiceOrder: true
116
- },
117
- partB: {
118
- choiceMode: 'radio',
119
- feedbackEnabled: true,
120
- choices: [{
121
- value: 'orange',
122
- label: 'Orange',
123
- correct: true,
124
- feedback: {
125
- type: 'custom',
126
- value: 'foo'
127
- }
128
- }, {
129
- value: 'red',
130
- label: 'Red',
131
- correct: true,
132
- feedback: {
133
- type: 'custom',
134
- value: 'foo'
135
- }
136
- }, {
137
- value: 'purple',
138
- label: 'Purple',
139
- feedback: {
140
- type: 'default'
141
- }
142
- }],
143
- choicePrefix: 'numbers',
144
- prompt: "prompt ".concat(PART_B),
145
- promptEnabled: true,
146
- lockChoiceOrder: true
147
- },
148
- partialScoring: false
149
- }, extra);
150
- };
151
-
152
- var assertOutcome = function assertOutcome(message, extra, value1, value2, env, expected, expectedMax) {
153
- it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
154
- var question, result;
155
- return _regenerator["default"].wrap(function _callee$(_context) {
156
- while (1) {
157
- switch (_context.prev = _context.next) {
158
- case 0:
159
- question = mkQuestion(extra);
160
- _context.next = 3;
161
- return (0, _index.outcome)(question, {
162
- value: {
163
- partA: {
164
- value: value1
165
- },
166
- partB: {
167
- value: value2
168
- }
169
- }
170
- }, env);
171
-
172
- case 3:
173
- result = _context.sent;
174
- expect(result.score).toEqual(expected);
175
- expect(result.max).toEqual(expectedMax);
176
-
177
- case 6:
178
- case "end":
179
- return _context.stop();
180
- }
181
- }
182
- }, _callee);
183
- })));
184
- };
185
-
186
- assertOutcome('element.partialScoring = true, partA correct, partB correct', {
187
- partialScoring: true
188
- }, ['yellow', 'blue'], ['orange', 'red'], {
189
- mode: 'evaluate'
190
- }, 2, 2);
191
- assertOutcome('element.partialScoring = true, partA correct, partB partially correct', {
192
- partialScoring: true
193
- }, ['yellow', 'blue'], ['orange'], {
194
- mode: 'evaluate'
195
- }, 1, 2);
196
- assertOutcome('element.partialScoring = true, partA correct, partB incorrect', {
197
- partialScoring: true
198
- }, ['yellow', 'blue'], [], {
199
- mode: 'evaluate'
200
- }, 1, 2);
201
- assertOutcome('element.partialScoring = true, partA incorrect, partB correct', {
202
- partialScoring: true
203
- }, [], ['orange', 'red'], {
204
- mode: 'evaluate'
205
- }, 0, 2);
206
- assertOutcome('element.partialScoring = true, partA partially correct, partB partially correct', {
207
- partialScoring: true
208
- }, ['yellow'], ['orange'], {
209
- mode: 'evaluate'
210
- }, 0, 2);
211
- assertOutcome('element.partialScoring = true, partA incorrect, partB partially correct', {
212
- partialScoring: true
213
- }, ['yellow'], ['orange'], {
214
- mode: 'evaluate'
215
- }, 0, 2);
216
- assertOutcome('element.partialScoring = true, partA incorrect, partB incorrect', {
217
- partialScoring: true
218
- }, ['yellow'], ['orange'], {
219
- mode: 'evaluate'
220
- }, 0, 2);
221
- assertOutcome('element.partialScoring = false, partA correct, partB correct', {
222
- partialScoring: false
223
- }, ['yellow', 'blue'], ['orange', 'red'], {
224
- mode: 'evaluate'
225
- }, 1, 1);
226
- assertOutcome('element.partialScoring = false, partA incorrect, partB correct', {
227
- partialScoring: false
228
- }, ['yellow'], ['orange', 'red'], {
229
- mode: 'evaluate'
230
- }, 0, 1);
231
- assertOutcome('element.partialScoring = false, partA correct, partB incorrect', {
232
- partialScoring: false
233
- }, ['yellow', 'blue'], ['orange'], {
234
- mode: 'evaluate'
235
- }, 0, 1);
236
- assertOutcome('element.partialScoring = false, partA incorrect, partB incorrect', {
237
- partialScoring: false
238
- }, [], [], {
239
- mode: 'evaluate'
240
- }, 0, 1);
241
- });
242
- describe('outcome', function () {
243
- describe('dichotomous', function () {
244
- var returnsScoreOf = function returnsScoreOf(message, values1, values2, score) {
245
- it("".concat(message, " => ").concat(score), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
246
- var result;
247
- return _regenerator["default"].wrap(function _callee2$(_context2) {
248
- while (1) {
249
- switch (_context2.prev = _context2.next) {
250
- case 0:
251
- _context2.next = 2;
252
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
253
- partialScoring: false
254
- }), {
255
- value: {
256
- partA: {
257
- value: values1
258
- },
259
- partB: {
260
- value: values2
261
- }
262
- }
263
- });
264
-
265
- case 2:
266
- result = _context2.sent;
267
- expect(result.score).toEqual(score);
268
- expect(result.max).toEqual(1);
269
-
270
- case 5:
271
- case "end":
272
- return _context2.stop();
273
- }
274
- }
275
- }, _callee2);
276
- })));
277
- };
278
-
279
- returnsScoreOf('both correct', ['yellow'], ['orange', 'c'], 1); // both correct
280
-
281
- returnsScoreOf('both incorrect', ['green'], ['purple'], 0); // both wrong
282
-
283
- returnsScoreOf('partA incorrect, partB correct', ['green'], ['orange', 'c'], 0); // first wrong, second correct
284
-
285
- returnsScoreOf('partA correct, partB incorrect', ['yellow'], ['purple'], 0); // first correct, second wrong
286
- });
287
- describe('partial scoring', function () {
288
- var returnsScoreOf = function returnsScoreOf(message, values1, values2, score) {
289
- it("".concat(message, " => ").concat(score), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
290
- var result;
291
- return _regenerator["default"].wrap(function _callee3$(_context3) {
292
- while (1) {
293
- switch (_context3.prev = _context3.next) {
294
- case 0:
295
- _context3.next = 2;
296
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
297
- partialScoring: true
298
- }), {
299
- value: {
300
- partA: {
301
- value: values1
302
- },
303
- partB: {
304
- value: values2
305
- }
306
- }
307
- });
308
-
309
- case 2:
310
- result = _context3.sent;
311
- expect(result.score).toBeCloseTo(score);
312
- expect(result.max).toEqual(2);
313
-
314
- case 5:
315
- case "end":
316
- return _context3.stop();
317
- }
318
- }
319
- }, _callee3);
320
- })));
321
- };
322
-
323
- returnsScoreOf('both correct', ['yellow'], ['orange', 'c'], 2);
324
- returnsScoreOf('both incorrect', [], [], 0);
325
- returnsScoreOf('partA correct, partB incorrect', ['yellow'], [], 1);
326
- returnsScoreOf('partA correct, partB partially correct', ['yellow'], ['c'], 1);
327
- returnsScoreOf('partA incorrect, partB correct', ['green'], ['orange', 'c'], 0);
328
- returnsScoreOf('partA partially correct, partB correct', ['green', 'yellow'], ['orange', 'c'], 0);
329
- });
330
-
331
- var returnsScoreWhen = function returnsScoreWhen(session) {
332
- it("returns empty: true if session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
333
- var result;
334
- return _regenerator["default"].wrap(function _callee4$(_context4) {
335
- while (1) {
336
- switch (_context4.prev = _context4.next) {
337
- case 0:
338
- _context4.next = 2;
339
- return (0, _index.outcome)(question, session);
340
-
341
- case 2:
342
- result = _context4.sent;
343
- expect(result).toEqual({
344
- score: 0,
345
- scoreA: 0,
346
- scoreB: 0,
347
- empty: true
348
- });
349
-
350
- case 4:
351
- case "end":
352
- return _context4.stop();
353
- }
354
- }
355
- }, _callee4);
356
- })));
357
- };
358
-
359
- returnsScoreWhen(undefined);
360
- returnsScoreWhen(null);
361
- returnsScoreWhen({});
362
- });
363
- describe('model', function () {
364
- var capitalize = function capitalize(value) {
365
- return value.charAt(0).toUpperCase() + value.slice(1);
366
- };
367
-
368
- describe('mode: gather', function () {
369
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
370
- return _regenerator["default"].wrap(function _callee5$(_context5) {
371
- while (1) {
372
- switch (_context5.prev = _context5.next) {
373
- case 0:
374
- session = {};
375
- env = {
376
- mode: 'gather'
377
- };
378
- _context5.next = 4;
379
- return (0, _index.model)(question, session, env);
380
-
381
- case 4:
382
- result = _context5.sent;
383
-
384
- case 5:
385
- case "end":
386
- return _context5.stop();
387
- }
388
- }
389
- }, _callee5);
390
- })));
391
- it('returns disabled', function () {
392
- expect(result.disabled).toEqual(false);
393
- });
394
- it('returns mode', function () {
395
- expect(result.mode).toEqual('gather');
396
- });
397
-
398
- var returnsPrompt = function returnsPrompt(part) {
399
- it("returns ".concat(part, " prompt"), function () {
400
- expect(result[part].prompt).toEqual("prompt ".concat(part));
401
- });
402
- };
403
-
404
- var returnsChoiceMode = function returnsChoiceMode(part) {
405
- it("returns ".concat(part, " choiceMode"), function () {
406
- expect(result[part].choiceMode).toEqual('checkbox');
407
- });
408
- };
409
-
410
- var returnsKeyMode = function returnsKeyMode(part) {
411
- it("returns ".concat(part, " choicePrefix"), function () {
412
- expect(result[part].choicePrefix).toEqual('numbers');
413
- });
414
- };
415
-
416
- var returnsComplete = function returnsComplete(part, min) {
417
- it("returns ".concat(part, " complete"), function () {
418
- expect(result[part].complete).toEqual({
419
- min: min
420
- });
421
- });
422
- };
423
-
424
- var doesNotReturnCorrect = function doesNotReturnCorrect(part) {
425
- it("does not return ".concat(part, " responseCorrect"), function () {
426
- expect(result[part].responseCorrect).toBe(undefined);
427
- });
428
- };
429
-
430
- var returnsChoices = function returnsChoices(part, value1, value2) {
431
- it("returns ".concat(part, " choices"), function () {
432
- expect(result[part].choices).toEqual(expect.arrayContaining([{
433
- value: value1,
434
- label: capitalize(value1),
435
- rationale: null
436
- }, {
437
- value: value2,
438
- label: capitalize(value2),
439
- rationale: null
440
- }]));
441
- });
442
- };
443
-
444
- returnsPrompt(PART_A);
445
- returnsPrompt(PART_B);
446
- returnsChoiceMode(PART_A);
447
- returnsChoiceMode(PART_B);
448
- returnsKeyMode(PART_A);
449
- returnsKeyMode(PART_B);
450
- returnsComplete(PART_A, 1);
451
- returnsComplete(PART_B, 2);
452
- returnsChoices(PART_A, 'yellow', 'green');
453
- returnsChoices(PART_B, 'orange', 'purple');
454
- doesNotReturnCorrect(PART_A);
455
- doesNotReturnCorrect(PART_B);
456
- });
457
- describe('model - with updateSession', function () {
458
- it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
459
- var updateSession;
460
- return _regenerator["default"].wrap(function _callee6$(_context6) {
461
- while (1) {
462
- switch (_context6.prev = _context6.next) {
463
- case 0:
464
- session = {
465
- id: '1',
466
- element: 'ebsr-element'
467
- };
468
- env = {
469
- mode: 'gather'
470
- };
471
- updateSession = jest.fn().mockResolvedValue();
472
- _context6.next = 5;
473
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
474
- partA: _objectSpread(_objectSpread({}, question.partA), {}, {
475
- lockChoiceOrder: false
476
- }),
477
- partB: _objectSpread(_objectSpread({}, question.partB), {}, {
478
- lockChoiceOrder: false
479
- })
480
- }), session, env, updateSession);
481
-
482
- case 5:
483
- expect(updateSession).toHaveBeenCalledWith('1', 'ebsr-element', {
484
- shuffledValues: {
485
- partA: expect.arrayContaining(['yellow', 'green']),
486
- partB: expect.arrayContaining(['orange', 'purple'])
487
- }
488
- });
489
-
490
- case 6:
491
- case "end":
492
- return _context6.stop();
493
- }
494
- }
495
- }, _callee6);
496
- })));
497
- });
498
- describe('model - without valid updateSession', function () {
499
- var assertModel = function assertModel(updateSession) {
500
- it("does not throw error if updateSession is ".concat(updateSession), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
501
- return _regenerator["default"].wrap(function _callee7$(_context7) {
502
- while (1) {
503
- switch (_context7.prev = _context7.next) {
504
- case 0:
505
- session = {
506
- id: '1',
507
- element: 'ebsr-element',
508
- shuffledValues: {
509
- partA: [],
510
- partB: []
511
- }
512
- };
513
- env = {
514
- mode: 'gather'
515
- };
516
- _context7.next = 4;
517
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
518
- partA: _objectSpread(_objectSpread({}, question.partA), {}, {
519
- lockChoiceOrder: false
520
- }),
521
- partB: _objectSpread(_objectSpread({}, question.partB), {}, {
522
- lockChoiceOrder: false
523
- })
524
- }), session, env);
525
-
526
- case 4:
527
- case "end":
528
- return _context7.stop();
529
- }
530
- }
531
- }, _callee7);
532
- })));
533
- };
534
-
535
- assertModel(undefined);
536
- assertModel(null);
537
- assertModel('text');
538
- });
539
- describe('mode: view', function () {
540
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
541
- return _regenerator["default"].wrap(function _callee8$(_context8) {
542
- while (1) {
543
- switch (_context8.prev = _context8.next) {
544
- case 0:
545
- session = {};
546
- env = {
547
- mode: 'view'
548
- };
549
- _context8.next = 4;
550
- return (0, _index.model)(question, session, env);
551
-
552
- case 4:
553
- result = _context8.sent;
554
-
555
- case 5:
556
- case "end":
557
- return _context8.stop();
558
- }
559
- }
560
- }, _callee8);
561
- })));
562
- it('returns disabled', function () {
563
- expect(result.disabled).toEqual(true);
564
- });
565
- });
566
- describe('mode: evaluate', function () {
567
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
568
- return _regenerator["default"].wrap(function _callee9$(_context9) {
569
- while (1) {
570
- switch (_context9.prev = _context9.next) {
571
- case 0:
572
- session = {};
573
- env = {
574
- mode: 'evaluate'
575
- };
576
-
577
- _utils.isResponseCorrect.mockReturnValue(false);
578
-
579
- _context9.next = 5;
580
- return (0, _index.model)(question, session, env);
581
-
582
- case 5:
583
- result = _context9.sent;
584
- return _context9.abrupt("return", result);
585
-
586
- case 7:
587
- case "end":
588
- return _context9.stop();
589
- }
590
- }
591
- }, _callee9);
592
- })));
593
-
594
- var returnsChoicesWCorrect = function returnsChoicesWCorrect(part, value1, value2) {
595
- it("returns ".concat(part, " choices w/ correct"), function () {
596
- expect(result[part].choices).toEqual(expect.arrayContaining([{
597
- value: value1,
598
- label: capitalize(value1),
599
- correct: true,
600
- feedback: 'foo',
601
- rationale: null
602
- }, {
603
- value: value2,
604
- label: capitalize(value2),
605
- correct: false,
606
- feedback: 'Incorrect',
607
- rationale: null
608
- }]));
609
- });
610
- };
611
-
612
- var returnsChoicesWCorrectFeedbackDisabled = function returnsChoicesWCorrectFeedbackDisabled(part, value1, value2) {
613
- // feedback enabled for partB and disabled for partA
614
- it("returns ".concat(part, " choices w/ correct even if feedbackEnabled is false"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
615
- var res;
616
- return _regenerator["default"].wrap(function _callee10$(_context10) {
617
- while (1) {
618
- switch (_context10.prev = _context10.next) {
619
- case 0:
620
- _context10.next = 2;
621
- return (0, _index.model)(_objectSpread(_objectSpread({}, question), {}, {
622
- partA: _objectSpread(_objectSpread({}, question.partA), {}, {
623
- feedbackEnabled: false
624
- }),
625
- partB: _objectSpread(_objectSpread({}, question.partB), {}, {
626
- feedbackEnabled: false
627
- })
628
- }), session, env);
629
-
630
- case 2:
631
- res = _context10.sent;
632
- expect(result[part].choices).toEqual(expect.arrayContaining([{
633
- value: value1,
634
- label: capitalize(value1),
635
- correct: true,
636
- feedback: 'foo',
637
- rationale: null
638
- }, {
639
- value: value2,
640
- label: capitalize(value2),
641
- correct: false,
642
- feedback: 'Incorrect',
643
- rationale: null
644
- }]));
645
-
646
- case 4:
647
- case "end":
648
- return _context10.stop();
649
- }
650
- }
651
- }, _callee10);
652
- })));
653
- };
654
-
655
- var returnsIsResponseCorrect = function returnsIsResponseCorrect(part) {
656
- it("returns ".concat(part, " is response correct"), function () {
657
- expect(result[part].responseCorrect).toEqual(false);
658
- });
659
- }; // Second param will be correct (yellow for A; orange for B)
660
-
661
-
662
- returnsChoicesWCorrect(PART_A, 'yellow', 'green');
663
- returnsChoicesWCorrect(PART_B, 'orange', 'purple'); // Second param will be correct (yellow for A; orange for B)
664
-
665
- returnsChoicesWCorrectFeedbackDisabled(PART_A, 'yellow', 'green');
666
- returnsChoicesWCorrectFeedbackDisabled(PART_B, 'orange', 'purple');
667
- returnsIsResponseCorrect(PART_A);
668
- returnsIsResponseCorrect(PART_B);
669
- });
670
- describe('correct response', function () {
671
- it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
672
- var sess;
673
- return _regenerator["default"].wrap(function _callee11$(_context11) {
674
- while (1) {
675
- switch (_context11.prev = _context11.next) {
676
- case 0:
677
- _context11.next = 2;
678
- return (0, _index.createCorrectResponseSession)(question, {
679
- mode: 'gather',
680
- role: 'instructor'
681
- });
682
-
683
- case 2:
684
- sess = _context11.sent;
685
- expect(sess).toEqual({
686
- id: '1',
687
- value: {
688
- partA: {
689
- id: 'partA',
690
- value: ['yellow']
691
- },
692
- partB: {
693
- id: 'partB',
694
- value: ['orange', 'c']
695
- }
696
- }
697
- });
698
-
699
- case 4:
700
- case "end":
701
- return _context11.stop();
702
- }
703
- }
704
- }, _callee11);
705
- })));
706
- it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
707
- var noResult;
708
- return _regenerator["default"].wrap(function _callee12$(_context12) {
709
- while (1) {
710
- switch (_context12.prev = _context12.next) {
711
- case 0:
712
- _context12.next = 2;
713
- return (0, _index.createCorrectResponseSession)(question, {
714
- mode: 'gather',
715
- role: 'student'
716
- });
717
-
718
- case 2:
719
- noResult = _context12.sent;
720
- expect(noResult).toBeNull();
721
-
722
- case 4:
723
- case "end":
724
- return _context12.stop();
725
- }
726
- }
727
- }, _callee12);
728
- })));
729
- });
730
- });
731
- });
732
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJQQVJUX0EiLCJQQVJUX0IiLCJqZXN0IiwibW9jayIsImlzUmVzcG9uc2VDb3JyZWN0IiwiZm4iLCJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJwYXJ0QSIsImNob2ljZU1vZGUiLCJmZWVkYmFja0VuYWJsZWQiLCJjaG9pY2VzIiwidmFsdWUiLCJsYWJlbCIsImNvcnJlY3QiLCJmZWVkYmFjayIsInR5cGUiLCJjaG9pY2VQcmVmaXgiLCJwcm9tcHQiLCJwcm9tcHRFbmFibGVkIiwibG9ja0Nob2ljZU9yZGVyIiwicGFydGlhbFNjb3JpbmciLCJwYXJ0QiIsIm1rUXVlc3Rpb24iLCJleHRyYSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwidmFsdWUxIiwidmFsdWUyIiwiZXhwZWN0ZWQiLCJleHBlY3RlZE1heCIsIml0IiwiZXhwZWN0Iiwic2NvcmUiLCJ0b0VxdWFsIiwibWF4IiwibW9kZSIsInJldHVybnNTY29yZU9mIiwidmFsdWVzMSIsInZhbHVlczIiLCJ0b0JlQ2xvc2VUbyIsInJldHVybnNTY29yZVdoZW4iLCJKU09OIiwic3RyaW5naWZ5Iiwic2NvcmVBIiwic2NvcmVCIiwiZW1wdHkiLCJ1bmRlZmluZWQiLCJjYXBpdGFsaXplIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsImRpc2FibGVkIiwicmV0dXJuc1Byb21wdCIsInBhcnQiLCJyZXR1cm5zQ2hvaWNlTW9kZSIsInJldHVybnNLZXlNb2RlIiwicmV0dXJuc0NvbXBsZXRlIiwibWluIiwiY29tcGxldGUiLCJkb2VzTm90UmV0dXJuQ29ycmVjdCIsInJlc3BvbnNlQ29ycmVjdCIsInRvQmUiLCJyZXR1cm5zQ2hvaWNlcyIsImFycmF5Q29udGFpbmluZyIsInJhdGlvbmFsZSIsImlkIiwiZWxlbWVudCIsInVwZGF0ZVNlc3Npb24iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwic2h1ZmZsZWRWYWx1ZXMiLCJhc3NlcnRNb2RlbCIsIm1vY2tSZXR1cm5WYWx1ZSIsInJldHVybnNDaG9pY2VzV0NvcnJlY3QiLCJyZXR1cm5zQ2hvaWNlc1dDb3JyZWN0RmVlZGJhY2tEaXNhYmxlZCIsInJlcyIsInJldHVybnNJc1Jlc3BvbnNlQ29ycmVjdCIsInJvbGUiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQSxJQUFNQSxNQUFNLEdBQUcsT0FBZjtBQUNBLElBQU1DLE1BQU0sR0FBRyxPQUFmO0FBRUFDLElBQUksQ0FBQ0MsSUFBTCxDQUFVLFVBQVYsRUFBc0I7QUFBQSxTQUFPO0FBQzNCQyxJQUFBQSxpQkFBaUIsRUFBRUYsSUFBSSxDQUFDRyxFQUFMO0FBRFEsR0FBUDtBQUFBLENBQXRCO0FBSUFDLFFBQVEsQ0FBQyxZQUFELEVBQWUsWUFBTTtBQUMzQixNQUFJQyxNQUFKLEVBQVlDLFFBQVosRUFBc0JDLE9BQXRCLEVBQStCQyxHQUEvQjtBQUVBQyxFQUFBQSxVQUFVLENBQUMsWUFBTTtBQUNmSCxJQUFBQSxRQUFRLEdBQUc7QUFDVEksTUFBQUEsS0FBSyxFQUFFO0FBQ0xDLFFBQUFBLFVBQVUsRUFBRSxVQURQO0FBRUxDLFFBQUFBLGVBQWUsRUFBRSxJQUZaO0FBR0xDLFFBQUFBLE9BQU8sRUFBRSxDQUNQO0FBQ0VDLFVBQUFBLEtBQUssRUFBRSxRQURUO0FBRUVDLFVBQUFBLEtBQUssRUFBRSxRQUZUO0FBR0VDLFVBQUFBLE9BQU8sRUFBRSxJQUhYO0FBSUVDLFVBQUFBLFFBQVEsRUFBRTtBQUNSQyxZQUFBQSxJQUFJLEVBQUUsUUFERTtBQUVSSixZQUFBQSxLQUFLLEVBQUU7QUFGQztBQUpaLFNBRE8sRUFVUDtBQUNFQSxVQUFBQSxLQUFLLEVBQUUsT0FEVDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsT0FGVDtBQUdFRSxV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QUFDZ0QsUUFBRCxDQUFOLENBQWlCQyxRQUFqQjs7QUFMZ0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBaEMsR0FBRjtBQU9ELEtBdEJPLENBQVI7QUF1QkQsR0ExUU8sQ0FBUjtBQTJRRCxDQXBrQk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgaXNSZXNwb25zZUNvcnJlY3QgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IFBBUlRfQSA9ICdwYXJ0QSc7XG5jb25zdCBQQVJUX0IgPSAncGFydEInO1xuXG5qZXN0Lm1vY2soJy4uL3V0aWxzJywgKCkgPT4gKHtcbiAgaXNSZXNwb25zZUNvcnJlY3Q6IGplc3QuZm4oKSxcbn0pKTtcblxuZGVzY3JpYmUoJ2NvbnRyb2xsZXInLCAoKSA9PiB7XG4gIGxldCByZXN1bHQsIHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnY7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcXVlc3Rpb24gPSB7XG4gICAgICBwYXJ0QToge1xuICAgICAgICBjaG9pY2VNb2RlOiAnY2hlY2tib3gnLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ3llbGxvdycsXG4gICAgICAgICAgICBsYWJlbDogJ1llbGxvdycsXG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2dyZWVuJyxcbiAgICAgICAgICAgIGxhYmVsOiAnR3JlZW4nLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICAgICAgcHJvbXB0OiBgcHJvbXB0ICR7UEFSVF9BfWAsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHBhcnRCOiB7XG4gICAgICAgIGNob2ljZU1vZGU6ICdjaGVja2JveCcsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnb3JhbmdlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncHVycGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJyxcbiAgICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2MnLFxuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjaG9pY2VQcmVmaXg6ICdudW1iZXJzJyxcbiAgICAgICAgcHJvbXB0OiBgcHJvbXB0ICR7UEFSVF9CfWAsXG4gICAgICAgIHByb21wdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZSBwYXJ0aWFsU2NvcmluZyB0ZXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IG1rUXVlc3Rpb24gPSAoZXh0cmEpID0+ICh7XG4gICAgICBwYXJ0QToge1xuICAgICAgICBjaG9pY2VNb2RlOiAncmFkaW8nLFxuICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ3llbGxvdycsXG4gICAgICAgICAgICBsYWJlbDogJ1llbGxvdycsXG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnZm9vJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogJ2JsdWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdCbHVlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnZ3JlZW4nLFxuICAgICAgICAgICAgbGFiZWw6ICdHcmVlbicsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNob2ljZVByZWZpeDogJ251bWJlcnMnLFxuICAgICAgICBwcm9tcHQ6IGBwcm9tcHQgJHtQQVJUX0F9YCxcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHBhcnRCOiB7XG4gICAgICAgIGNob2ljZU1vZGU6ICdyYWRpbycsXG4gICAgICAgIGZlZWRiYWNrRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAnb3JhbmdlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnT3JhbmdlJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncmVkJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkJyxcbiAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICBmZWVkYmFjazoge1xuICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdmb28nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAncHVycGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUHVycGxlJyxcbiAgICAgICAgICAgIGZlZWRiYWNrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY2hvaWNlUHJlZml4OiAnbnVtYmVycycsXG4gICAgICAgIHByb21wdDogYHByb21wdCAke1BBUlRfQn1gLFxuICAgICAgICBwcm9tcHRFbmFibGVkOiB0cnVlLFxuICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICB9LFxuICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgLi4uZXh0cmEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCB2YWx1ZTEsIHZhbHVlMiwgZW52LCBleHBlY3RlZCwgZXhwZWN0ZWRNYXgpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBta1F1ZXN0aW9uKGV4dHJhKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgeyB2YWx1ZTogeyBwYXJ0QTogeyB2YWx1ZTogdmFsdWUxIH0sIHBhcnRCOiB7IHZhbHVlOiB2YWx1ZTIgfSB9IH0sIGVudik7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgICBleHBlY3QocmVzdWx0Lm1heCkudG9FcXVhbChleHBlY3RlZE1heCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgcGFydEEgY29ycmVjdCwgcGFydEIgY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdycsICdibHVlJ10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMixcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIGNvcnJlY3QsIHBhcnRCIHBhcnRpYWxseSBjb3JyZWN0JyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIFsneWVsbG93JywgJ2JsdWUnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgWyd5ZWxsb3cnLCAnYmx1ZSddLFxuICAgICAgW10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDEsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgW10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIHBhcnRpYWxseSBjb3JyZWN0LCBwYXJ0QiBwYXJ0aWFsbHkgY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdyddLFxuICAgICAgWydvcmFuZ2UnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUsIHBhcnRBIGluY29ycmVjdCwgcGFydEIgcGFydGlhbGx5IGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgWyd5ZWxsb3cnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGluY29ycmVjdCcsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICBbJ3llbGxvdyddLFxuICAgICAgWydvcmFuZ2UnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDIsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICBbJ3llbGxvdycsICdibHVlJ10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBpbmNvcnJlY3QsIHBhcnRCIGNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFsneWVsbG93J10sXG4gICAgICBbJ29yYW5nZScsICdyZWQnXSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFsneWVsbG93JywgJ2JsdWUnXSxcbiAgICAgIFsnb3JhbmdlJ10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgcGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdkaWNob3RvbW91cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHJldHVybnNTY29yZU9mID0gKG1lc3NhZ2UsIHZhbHVlczEsIHZhbHVlczIsIHNjb3JlKSA9PiB7XG4gICAgICAgIGl0KGAke21lc3NhZ2V9ID0+ICR7c2NvcmV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAgICB7IC4uLnF1ZXN0aW9uLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6IHsgcGFydEE6IHsgdmFsdWU6IHZhbHVlczEgfSwgcGFydEI6IHsgdmFsdWU6IHZhbHVlczIgfSB9IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0LnNjb3JlKS50b0VxdWFsKHNjb3JlKTtcbiAgICAgICAgICBleHBlY3QocmVzdWx0Lm1heCkudG9FcXVhbCgxKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm5zU2NvcmVPZignYm90aCBjb3JyZWN0JywgWyd5ZWxsb3cnXSwgWydvcmFuZ2UnLCAnYyddLCAxKTsgLy8gYm90aCBjb3JyZWN0XG4gICAgICByZXR1cm5zU2NvcmVPZignYm90aCBpbmNvcnJlY3QnLCBbJ2dyZWVuJ10sIFsncHVycGxlJ10sIDApOyAvLyBib3RoIHdyb25nXG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbiddLCBbJ29yYW5nZScsICdjJ10sIDApOyAvLyBmaXJzdCB3cm9uZywgc2Vjb25kIGNvcnJlY3RcbiAgICAgIHJldHVybnNTY29yZU9mKCdwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ3B1cnBsZSddLCAwKTsgLy8gZmlyc3QgY29ycmVjdCwgc2Vjb25kIHdyb25nXG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncGFydGlhbCBzY29yaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmV0dXJuc1Njb3JlT2YgPSAobWVzc2FnZSwgdmFsdWVzMSwgdmFsdWVzMiwgc2NvcmUpID0+IHtcbiAgICAgICAgaXQoYCR7bWVzc2FnZX0gPT4gJHtzY29yZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICAgIHsgLi4ucXVlc3Rpb24sIHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiB7IHBhcnRBOiB7IHZhbHVlOiB2YWx1ZXMxIH0sIHBhcnRCOiB7IHZhbHVlOiB2YWx1ZXMyIH0gfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdC5zY29yZSkudG9CZUNsb3NlVG8oc2NvcmUpO1xuICAgICAgICAgIGV4cGVjdChyZXN1bHQubWF4KS50b0VxdWFsKDIpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybnNTY29yZU9mKCdib3RoIGNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ29yYW5nZScsICdjJ10sIDIpO1xuICAgICAgcmV0dXJuc1Njb3JlT2YoJ2JvdGggaW5jb3JyZWN0JywgW10sIFtdLCAwKTtcbiAgICAgIHJldHVybnNTY29yZU9mKCdwYXJ0QSBjb3JyZWN0LCBwYXJ0QiBpbmNvcnJlY3QnLCBbJ3llbGxvdyddLCBbXSwgMSk7XG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgY29ycmVjdCwgcGFydEIgcGFydGlhbGx5IGNvcnJlY3QnLCBbJ3llbGxvdyddLCBbJ2MnXSwgMSk7XG4gICAgICByZXR1cm5zU2NvcmVPZigncGFydEEgaW5jb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbiddLCBbJ29yYW5nZScsICdjJ10sIDApO1xuICAgICAgcmV0dXJuc1Njb3JlT2YoJ3BhcnRBIHBhcnRpYWxseSBjb3JyZWN0LCBwYXJ0QiBjb3JyZWN0JywgWydncmVlbicsICd5ZWxsb3cnXSwgWydvcmFuZ2UnLCAnYyddLCAwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybnNTY29yZVdoZW4gPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHJldHVybnMgZW1wdHk6IHRydWUgaWYgc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoeyBzY29yZTogMCwgc2NvcmVBOiAwLCBzY29yZUI6IDAsIGVtcHR5OiB0cnVlIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybnNTY29yZVdoZW4odW5kZWZpbmVkKTtcbiAgICByZXR1cm5zU2NvcmVXaGVuKG51bGwpO1xuICAgIHJldHVybnNTY29yZVdoZW4oe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgY29uc3QgY2FwaXRhbGl6ZSA9ICh2YWx1ZSkgPT4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiBnYXRoZXInLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGRpc2FibGVkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmRpc2FibGVkKS50b0VxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBtb2RlJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0Lm1vZGUpLnRvRXF1YWwoJ2dhdGhlcicpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJldHVybnNQcm9tcHQgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IHByb21wdGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLnByb21wdCkudG9FcXVhbChgcHJvbXB0ICR7cGFydH1gKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlTW9kZSA9IChwYXJ0KSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlTW9kZWAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZU1vZGUpLnRvRXF1YWwoJ2NoZWNrYm94Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmV0dXJuc0tleU1vZGUgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IGNob2ljZVByZWZpeGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZVByZWZpeCkudG9FcXVhbCgnbnVtYmVycycpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJldHVybnNDb21wbGV0ZSA9IChwYXJ0LCBtaW4pID0+IHtcbiAgICAgICAgaXQoYHJldHVybnMgJHtwYXJ0fSBjb21wbGV0ZWAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNvbXBsZXRlKS50b0VxdWFsKHsgbWluIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGRvZXNOb3RSZXR1cm5Db3JyZWN0ID0gKHBhcnQpID0+IHtcbiAgICAgICAgaXQoYGRvZXMgbm90IHJldHVybiAke3BhcnR9IHJlc3BvbnNlQ29ycmVjdGAsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLnJlc3BvbnNlQ29ycmVjdCkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJldHVybnNDaG9pY2VzID0gKHBhcnQsIHZhbHVlMSwgdmFsdWUyKSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlc2AsICgpID0+IHtcbiAgICAgICAgICBleHBlY3QocmVzdWx0W3BhcnRdLmNob2ljZXMpLnRvRXF1YWwoXG4gICAgICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAgICAgICAgICAgeyB2YWx1ZTogdmFsdWUxLCBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogdmFsdWUyLCBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTIpLCByYXRpb25hbGU6IG51bGwgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuc1Byb21wdChQQVJUX0EpO1xuICAgICAgcmV0dXJuc1Byb21wdChQQVJUX0IpO1xuXG4gICAgICByZXR1cm5zQ2hvaWNlTW9kZShQQVJUX0EpO1xuICAgICAgcmV0dXJuc0Nob2ljZU1vZGUoUEFSVF9CKTtcblxuICAgICAgcmV0dXJuc0tleU1vZGUoUEFSVF9BKTtcbiAgICAgIHJldHVybnNLZXlNb2RlKFBBUlRfQik7XG5cbiAgICAgIHJldHVybnNDb21wbGV0ZShQQVJUX0EsIDEpO1xuICAgICAgcmV0dXJuc0NvbXBsZXRlKFBBUlRfQiwgMik7XG5cbiAgICAgIHJldHVybnNDaG9pY2VzKFBBUlRfQSwgJ3llbGxvdycsICdncmVlbicpO1xuICAgICAgcmV0dXJuc0Nob2ljZXMoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICBkb2VzTm90UmV0dXJuQ29ycmVjdChQQVJUX0EpO1xuICAgICAgZG9lc05vdFJldHVybkNvcnJlY3QoUEFSVF9CKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlbCAtIHdpdGggdXBkYXRlU2Vzc2lvbicsICgpID0+IHtcbiAgICAgIGl0KCdjYWxscyB1cGRhdGVTZXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0geyBpZDogJzEnLCBlbGVtZW50OiAnZWJzci1lbGVtZW50JyB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcbiAgICAgICAgYXdhaXQgbW9kZWwoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBwYXJ0QToge1xuICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QSxcbiAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJ0Qjoge1xuICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QixcbiAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIGVudixcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuICAgICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAnZWJzci1lbGVtZW50Jywge1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiB7XG4gICAgICAgICAgICBwYXJ0QTogZXhwZWN0LmFycmF5Q29udGFpbmluZyhbJ3llbGxvdycsICdncmVlbiddKSxcbiAgICAgICAgICAgIHBhcnRCOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsnb3JhbmdlJywgJ3B1cnBsZSddKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aG91dCB2YWxpZCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXNzZXJ0TW9kZWwgPSAodXBkYXRlU2Vzc2lvbikgPT4ge1xuICAgICAgICBpdChgZG9lcyBub3QgdGhyb3cgZXJyb3IgaWYgdXBkYXRlU2Vzc2lvbiBpcyAke3VwZGF0ZVNlc3Npb259YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2Vic3ItZWxlbWVudCcsXG4gICAgICAgICAgICBzaHVmZmxlZFZhbHVlczogeyBwYXJ0QTogW10sIHBhcnRCOiBbXSB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuXG4gICAgICAgICAgYXdhaXQgbW9kZWwoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICBwYXJ0QToge1xuICAgICAgICAgICAgICAgIC4uLnF1ZXN0aW9uLnBhcnRBLFxuICAgICAgICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBhcnRCOiB7XG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb24ucGFydEIsXG4gICAgICAgICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgYXNzZXJ0TW9kZWwodW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydE1vZGVsKG51bGwpO1xuICAgICAgYXNzZXJ0TW9kZWwoJ3RleHQnKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiB2aWV3JywgKCkgPT4ge1xuICAgICAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHNlc3Npb24gPSB7fTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycgfTtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuZGlzYWJsZWQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtb2RlOiBldmFsdWF0ZScsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZXNzaW9uID0ge307XG4gICAgICAgIGVudiA9IHsgbW9kZTogJ2V2YWx1YXRlJyB9O1xuICAgICAgICBpc1Jlc3BvbnNlQ29ycmVjdC5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlc1dDb3JyZWN0ID0gKHBhcnQsIHZhbHVlMSwgdmFsdWUyKSA9PiB7XG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlcyB3LyBjb3JyZWN0YCwgKCkgPT4ge1xuICAgICAgICAgIGV4cGVjdChyZXN1bHRbcGFydF0uY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlMSxcbiAgICAgICAgICAgICAgICBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZTIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNhcGl0YWxpemUodmFsdWUyKSxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zQ2hvaWNlc1dDb3JyZWN0RmVlZGJhY2tEaXNhYmxlZCA9IChwYXJ0LCB2YWx1ZTEsIHZhbHVlMikgPT4ge1xuICAgICAgICAvLyBmZWVkYmFjayBlbmFibGVkIGZvciBwYXJ0QiBhbmQgZGlzYWJsZWQgZm9yIHBhcnRBXG4gICAgICAgIGl0KGByZXR1cm5zICR7cGFydH0gY2hvaWNlcyB3LyBjb3JyZWN0IGV2ZW4gaWYgZmVlZGJhY2tFbmFibGVkIGlzIGZhbHNlYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCByZXMgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAgIHBhcnRBOiB7XG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb24ucGFydEEsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGFydEI6IHtcbiAgICAgICAgICAgICAgICAuLi5xdWVzdGlvbi5wYXJ0QixcbiAgICAgICAgICAgICAgICBmZWVkYmFja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGV4cGVjdChyZXN1bHRbcGFydF0uY2hvaWNlcykudG9FcXVhbChcbiAgICAgICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlMSxcbiAgICAgICAgICAgICAgICBsYWJlbDogY2FwaXRhbGl6ZSh2YWx1ZTEpLFxuICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2s6ICdmb28nLFxuICAgICAgICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZTIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNhcGl0YWxpemUodmFsdWUyKSxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmZWVkYmFjazogJ0luY29ycmVjdCcsXG4gICAgICAgICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXR1cm5zSXNSZXNwb25zZUNvcnJlY3QgPSAocGFydCkgPT4ge1xuICAgICAgICBpdChgcmV0dXJucyAke3BhcnR9IGlzIHJlc3BvbnNlIGNvcnJlY3RgLCAoKSA9PiB7XG4gICAgICAgICAgZXhwZWN0KHJlc3VsdFtwYXJ0XS5yZXNwb25zZUNvcnJlY3QpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFNlY29uZCBwYXJhbSB3aWxsIGJlIGNvcnJlY3QgKHllbGxvdyBmb3IgQTsgb3JhbmdlIGZvciBCKVxuICAgICAgcmV0dXJuc0Nob2ljZXNXQ29ycmVjdChQQVJUX0EsICd5ZWxsb3cnLCAnZ3JlZW4nKTtcbiAgICAgIHJldHVybnNDaG9pY2VzV0NvcnJlY3QoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICAvLyBTZWNvbmQgcGFyYW0gd2lsbCBiZSBjb3JyZWN0ICh5ZWxsb3cgZm9yIEE7IG9yYW5nZSBmb3IgQilcbiAgICAgIHJldHVybnNDaG9pY2VzV0NvcnJlY3RGZWVkYmFja0Rpc2FibGVkKFBBUlRfQSwgJ3llbGxvdycsICdncmVlbicpO1xuICAgICAgcmV0dXJuc0Nob2ljZXNXQ29ycmVjdEZlZWRiYWNrRGlzYWJsZWQoUEFSVF9CLCAnb3JhbmdlJywgJ3B1cnBsZScpO1xuXG4gICAgICByZXR1cm5zSXNSZXNwb25zZUNvcnJlY3QoUEFSVF9BKTtcbiAgICAgIHJldHVybnNJc1Jlc3BvbnNlQ29ycmVjdChQQVJUX0IpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NvcnJlY3QgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIGVudiBpcyBjb3JyZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHtcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBwYXJ0QTogeyBpZDogJ3BhcnRBJywgdmFsdWU6IFsneWVsbG93J10gfSxcbiAgICAgICAgICAgIHBhcnRCOiB7IGlkOiAncGFydEInLCB2YWx1ZTogWydvcmFuZ2UnLCAnYyddIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3JldHVybnMgbnVsbCBlbnYgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=