@pie-element/inline-dropdown 8.3.2-tip-tap.3 → 8.3.2-tip-tap.5

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,948 +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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
-
11
- var _index = require("../index");
12
-
13
- var _defaults = _interopRequireDefault(require("../defaults"));
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
- describe('inline-dropdown', function () {
20
- var result, question, session, env;
21
- beforeEach(function () {
22
- question = {
23
- displayType: 'block',
24
- language: 'english',
25
- lockChoiceOrder: false,
26
- choices: {
27
- 0: [{
28
- correct: false,
29
- value: '9719395',
30
- label: '20,000'
31
- }, {
32
- correct: false,
33
- value: '9719396',
34
- label: '17,000'
35
- }, {
36
- correct: false,
37
- value: '9719397',
38
- label: '16,100'
39
- }, {
40
- correct: true,
41
- value: '9719398',
42
- label: '16,000',
43
- rationale: 'rationale for choice'
44
- }]
45
- },
46
- element: 'inline-dropdown-element',
47
- rationale: '',
48
- prompt: '<p>\n <strong><span style="color: #000000; font-family: Arial;">El número 16,101</span></strong> <strong><span style="color: #000000; font-family: Arial;">redondeado al</span></strong> <strong><span style="color: #000000; font-family: Arial;">millar más cercano es&nbsp;______________.</span></strong>\n</p>\n<p>\n <strong><span style="color: #000000;">&nbsp;</span></strong>\n</p>',
49
- scoringType: 'auto',
50
- teacherInstructions: true,
51
- studentInstructions: false,
52
- partialScoring: false,
53
- markup: '{{0}}',
54
- id: '2421310',
55
- alternateResponses: null
56
- };
57
- });
58
- describe('edge cases', function () {
59
- it('is ok is session is empty', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
60
- var r;
61
- return _regenerator["default"].wrap(function _callee$(_context) {
62
- while (1) {
63
- switch (_context.prev = _context.next) {
64
- case 0:
65
- session = {};
66
- env = {
67
- mode: 'evaluate'
68
- };
69
- _context.next = 4;
70
- return (0, _index.model)(question, {}, {
71
- mode: 'evaluate'
72
- });
73
-
74
- case 4:
75
- r = _context.sent;
76
- expect(r).toBeDefined();
77
-
78
- case 6:
79
- case "end":
80
- return _context.stop();
81
- }
82
- }
83
- }, _callee);
84
- })));
85
- });
86
- describe('model - with updateSession', function () {
87
- it('calls updateSession', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
88
- var updateSession;
89
- return _regenerator["default"].wrap(function _callee2$(_context2) {
90
- while (1) {
91
- switch (_context2.prev = _context2.next) {
92
- case 0:
93
- session = {
94
- id: '1',
95
- element: 'inline-dropdown-element'
96
- };
97
- env = {
98
- mode: 'gather'
99
- };
100
- updateSession = jest.fn().mockResolvedValue();
101
- _context2.next = 5;
102
- return (0, _index.model)(question, session, env, updateSession);
103
-
104
- case 5:
105
- expect(updateSession).toHaveBeenCalledWith('1', 'inline-dropdown-element', {
106
- shuffledValues: expect.arrayContaining(['9719395', '9719396', '9719397', '9719398'])
107
- });
108
-
109
- case 6:
110
- case "end":
111
- return _context2.stop();
112
- }
113
- }
114
- }, _callee2);
115
- })));
116
- });
117
- });
118
- var question = {
119
- displayType: 'block',
120
- language: 'english',
121
- prompt: 'Use the drop-downs to complete the sentence',
122
- markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
123
- choices: {
124
- 0: [{
125
- label: 'cow ',
126
- value: '0',
127
- correct: true,
128
- rationale: 'rationale cow'
129
- }, {
130
- label: 'dog ',
131
- value: '1',
132
- correct: false,
133
- rationale: 'rationale dog'
134
- }, {
135
- label: 'cat ',
136
- value: '2',
137
- correct: false,
138
- rationale: 'rationale cat'
139
- }],
140
- 1: [{
141
- label: 'over ',
142
- value: '0',
143
- correct: true,
144
- rationale: 'rationale over'
145
- }, {
146
- label: 'under ',
147
- value: '1',
148
- correct: false,
149
- rationale: 'rationale under'
150
- }, {
151
- label: 'across ',
152
- value: '2',
153
- correct: false,
154
- rationale: 'rationale across'
155
- }],
156
- 2: [{
157
- label: 'moon ',
158
- value: '0',
159
- correct: true,
160
- rationale: 'rationale moon'
161
- }, {
162
- label: 'sun',
163
- value: '2',
164
- correct: false,
165
- rationale: 'rationale sun'
166
- }, {
167
- label: 'house ',
168
- value: '3',
169
- correct: false,
170
- rationale: 'rationale house'
171
- }]
172
- }
173
- };
174
- describe('controller', function () {
175
- describe('model', function () {
176
- var q;
177
- var updateSession = jest.fn().mockResolvedValue();
178
- it('output when session is defined', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
179
- var m;
180
- return _regenerator["default"].wrap(function _callee3$(_context3) {
181
- while (1) {
182
- switch (_context3.prev = _context3.next) {
183
- case 0:
184
- _context3.next = 2;
185
- return (0, _index.model)(question, {
186
- value: {
187
- 0: '0',
188
- 1: '0',
189
- 2: '0'
190
- }
191
- }, {
192
- mode: 'evaluate'
193
- }, updateSession);
194
-
195
- case 2:
196
- m = _context3.sent;
197
- expect(m).toEqual(expect.objectContaining({
198
- feedback: {
199
- 0: 'correct',
200
- 1: 'correct',
201
- 2: 'correct'
202
- },
203
- responseCorrect: true
204
- }));
205
-
206
- case 4:
207
- case "end":
208
- return _context3.stop();
209
- }
210
- }
211
- }, _callee3);
212
- })));
213
-
214
- var returnModel = function returnModel(session) {
215
- it("output when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
216
- var m;
217
- return _regenerator["default"].wrap(function _callee4$(_context4) {
218
- while (1) {
219
- switch (_context4.prev = _context4.next) {
220
- case 0:
221
- _context4.next = 2;
222
- return (0, _index.model)(question, session, {
223
- mode: 'evaluate'
224
- }, updateSession);
225
-
226
- case 2:
227
- m = _context4.sent;
228
- expect(m).toEqual(expect.objectContaining({
229
- feedback: {
230
- 0: 'incorrect',
231
- 1: 'incorrect',
232
- 2: 'incorrect'
233
- },
234
- responseCorrect: false
235
- }));
236
-
237
- case 4:
238
- case "end":
239
- return _context4.stop();
240
- }
241
- }
242
- }, _callee4);
243
- })));
244
- };
245
-
246
- returnModel(undefined);
247
- returnModel(null);
248
- returnModel({});
249
- var choicesWithNullRationale = {
250
- 0: [{
251
- label: 'cow ',
252
- value: '0',
253
- correct: true,
254
- rationale: null
255
- }, {
256
- label: 'dog ',
257
- value: '1',
258
- correct: false,
259
- rationale: null
260
- }, {
261
- label: 'cat ',
262
- value: '2',
263
- correct: false,
264
- rationale: null
265
- }],
266
- 1: [{
267
- label: 'over ',
268
- value: '0',
269
- correct: true,
270
- rationale: null
271
- }, {
272
- label: 'under ',
273
- value: '1',
274
- correct: false,
275
- rationale: null
276
- }, {
277
- label: 'across ',
278
- value: '2',
279
- correct: false,
280
- rationale: null
281
- }],
282
- 2: [{
283
- label: 'moon ',
284
- value: '0',
285
- correct: true,
286
- rationale: null
287
- }, {
288
- label: 'sun',
289
- value: '2',
290
- correct: false,
291
- rationale: null
292
- }, {
293
- label: 'house ',
294
- value: '3',
295
- correct: false,
296
- rationale: null
297
- }]
298
- };
299
-
300
- var assertGather = function assertGather(label, extra, session, expected) {
301
- it("'mode: gather, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
302
- var result;
303
- return _regenerator["default"].wrap(function _callee5$(_context5) {
304
- while (1) {
305
- switch (_context5.prev = _context5.next) {
306
- case 0:
307
- q = _objectSpread(_objectSpread({}, question), {}, {
308
- alternateResponse: {
309
- 2: ['2']
310
- },
311
- lockChoiceOrder: true,
312
- teacherInstructions: 'Teacher Instructions',
313
- rationale: 'Rationale'
314
- }, extra);
315
- _context5.next = 3;
316
- return (0, _index.model)(q, _objectSpread({
317
- id: '1',
318
- element: 'explicit-constructed-response'
319
- }, session), {
320
- mode: 'gather'
321
- }, updateSession);
322
-
323
- case 3:
324
- result = _context5.sent;
325
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
326
- disabled: false,
327
- mode: 'gather',
328
- feedback: {},
329
- responseCorrect: undefined,
330
- choices: choicesWithNullRationale
331
- }, expected));
332
-
333
- case 5:
334
- case "end":
335
- return _context5.stop();
336
- }
337
- }
338
- }, _callee5);
339
- })));
340
- };
341
-
342
- assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
343
- rationale: null,
344
- teacherInstructions: null
345
- });
346
- assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
347
- promptEnabled: false,
348
- rationaleEnabled: false,
349
- teacherInstructionsEnabled: false,
350
- studentInstructionsEnabled: false
351
- }, {}, {
352
- prompt: null,
353
- rationale: null,
354
- teacherInstructions: null
355
- });
356
-
357
- var assertView = function assertView(label, extra, session, expected) {
358
- it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
359
- var result;
360
- return _regenerator["default"].wrap(function _callee6$(_context6) {
361
- while (1) {
362
- switch (_context6.prev = _context6.next) {
363
- case 0:
364
- q = _objectSpread(_objectSpread({}, question), {}, {
365
- alternateResponse: {
366
- 2: ['2']
367
- },
368
- lockChoiceOrder: true,
369
- teacherInstructions: 'Teacher Instructions',
370
- rationale: 'Rationale'
371
- }, extra);
372
- _context6.next = 3;
373
- return (0, _index.model)(q, _objectSpread({
374
- id: '1',
375
- element: 'explicit-constructed-response'
376
- }, session), {
377
- mode: 'view',
378
- role: 'instructor'
379
- }, updateSession);
380
-
381
- case 3:
382
- result = _context6.sent;
383
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
384
- mode: 'view',
385
- disabled: true,
386
- feedback: {},
387
- responseCorrect: undefined
388
- }, expected));
389
-
390
- case 5:
391
- case "end":
392
- return _context6.stop();
393
- }
394
- }
395
- }, _callee6);
396
- })));
397
- };
398
-
399
- assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled set to false', {
400
- promptEnabled: false,
401
- rationaleEnabled: false,
402
- teacherInstructionsEnabled: false,
403
- studentInstructionsEnabled: false,
404
- choiceRationaleEnabled: false
405
- }, {}, {
406
- prompt: null,
407
- rationale: null,
408
- teacherInstructions: null,
409
- choices: choicesWithNullRationale
410
- });
411
- assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled unset', {}, {}, {
412
- teacherInstructions: 'Teacher Instructions',
413
- rationale: 'Rationale'
414
- });
415
-
416
- var assertViewStudent = function assertViewStudent(label, extra, session, expected) {
417
- it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
418
- var result;
419
- return _regenerator["default"].wrap(function _callee7$(_context7) {
420
- while (1) {
421
- switch (_context7.prev = _context7.next) {
422
- case 0:
423
- q = _objectSpread(_objectSpread({}, question), {}, {
424
- alternateResponse: {
425
- 2: ['2']
426
- },
427
- lockChoiceOrder: true,
428
- teacherInstructions: 'Teacher Instructions',
429
- rationale: 'Rationale'
430
- }, extra);
431
- _context7.next = 3;
432
- return (0, _index.model)(q, _objectSpread({
433
- id: '1',
434
- element: 'explicit-constructed-response'
435
- }, session), {
436
- mode: 'view',
437
- role: 'student'
438
- });
439
-
440
- case 3:
441
- result = _context7.sent;
442
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
443
- mode: 'view',
444
- disabled: true,
445
- feedback: {},
446
- responseCorrect: undefined,
447
- choices: choicesWithNullRationale
448
- }, expected));
449
-
450
- case 5:
451
- case "end":
452
- return _context7.stop();
453
- }
454
- }
455
- }, _callee7);
456
- })));
457
- };
458
-
459
- assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
460
- promptEnabled: false,
461
- rationaleEnabled: false,
462
- teacherInstructionsEnabled: false,
463
- studentInstructionsEnabled: false
464
- }, {}, {
465
- prompt: null,
466
- rationale: null,
467
- teacherInstructions: null
468
- });
469
- assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
470
- rationale: null,
471
- teacherInstructions: null
472
- });
473
-
474
- var assertEvaluate = function assertEvaluate(label, extra, session, expected) {
475
- it("'mode: evaluate, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
476
- var result;
477
- return _regenerator["default"].wrap(function _callee8$(_context8) {
478
- while (1) {
479
- switch (_context8.prev = _context8.next) {
480
- case 0:
481
- q = _objectSpread(_objectSpread({}, question), {}, {
482
- alternateResponse: {
483
- 0: ['2'],
484
- 1: ['2'],
485
- 2: ['2']
486
- },
487
- lockChoiceOrder: true,
488
- teacherInstructions: 'Teacher Instructions',
489
- rationale: 'Rationale',
490
- choiceRationaleEnabled: true
491
- }, extra);
492
- _context8.next = 3;
493
- return (0, _index.model)(q, _objectSpread({
494
- id: '1',
495
- element: 'explicit-constructed-response'
496
- }, session), {
497
- mode: 'evaluate',
498
- role: 'instructor'
499
- }, updateSession);
500
-
501
- case 3:
502
- result = _context8.sent;
503
- expect(result).toEqual(_objectSpread(_objectSpread({}, question), {}, {
504
- teacherInstructions: 'Teacher Instructions',
505
- rationale: 'Rationale',
506
- mode: 'evaluate',
507
- disabled: true
508
- }, expected));
509
-
510
- case 5:
511
- case "end":
512
- return _context8.stop();
513
- }
514
- }
515
- }, _callee8);
516
- })));
517
- };
518
-
519
- assertEvaluate('- correct answer', {}, {
520
- value: {
521
- 0: '0',
522
- 1: '0',
523
- 2: '0'
524
- }
525
- }, {
526
- feedback: {
527
- 0: 'correct',
528
- 1: 'correct',
529
- 2: 'correct'
530
- },
531
- responseCorrect: true
532
- });
533
- assertEvaluate('- partially correct answer', {}, {
534
- value: {
535
- 0: '0',
536
- 1: '0',
537
- 2: '1'
538
- }
539
- }, {
540
- feedback: {
541
- 0: 'correct',
542
- 1: 'correct',
543
- 2: 'incorrect'
544
- },
545
- responseCorrect: false
546
- });
547
- assertEvaluate('- partially correct answer using alternates', {}, {
548
- value: {
549
- 0: '2',
550
- 1: '1',
551
- 2: '2'
552
- }
553
- }, {
554
- feedback: {
555
- 0: 'correct',
556
- 1: 'incorrect',
557
- 2: 'correct'
558
- },
559
- responseCorrect: false
560
- });
561
- assertEvaluate('- incorrect answer', {}, {
562
- value: {
563
- 0: '1',
564
- 1: '1',
565
- 2: '1'
566
- }
567
- }, {
568
- feedback: {
569
- 0: 'incorrect',
570
- 1: 'incorrect',
571
- 2: 'incorrect'
572
- },
573
- responseCorrect: false
574
- });
575
- });
576
- describe('get score', function () {
577
- var assertScore = function assertScore(session, expected) {
578
- it('return score', function () {
579
- var score = (0, _index.getScore)(question, session);
580
- expect(score).toEqual(expected);
581
- });
582
- };
583
-
584
- assertScore({
585
- value: {
586
- 0: '0',
587
- 1: '0',
588
- 2: '0'
589
- }
590
- }, 1);
591
- assertScore({
592
- value: {
593
- 0: '0',
594
- 1: '0',
595
- 2: '1'
596
- }
597
- }, 0.67);
598
- assertScore({
599
- value: {
600
- 0: '0',
601
- 1: '1',
602
- 2: '1'
603
- }
604
- }, 0.33);
605
- assertScore({
606
- value: {
607
- 0: '1',
608
- 1: '1',
609
- 2: '1'
610
- }
611
- }, 0);
612
-
613
- var returnScore = function returnScore(session) {
614
- it("score = 0 when session is ".concat(JSON.stringify(session)), function () {
615
- expect((0, _index.getScore)(question, session)).toEqual(0);
616
- });
617
- };
618
-
619
- returnScore(undefined);
620
- returnScore(null);
621
- returnScore({});
622
- });
623
- describe('outcome partialScoring test', function () {
624
- var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
625
- it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
626
- var result;
627
- return _regenerator["default"].wrap(function _callee9$(_context9) {
628
- while (1) {
629
- switch (_context9.prev = _context9.next) {
630
- case 0:
631
- _context9.next = 2;
632
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
633
-
634
- case 2:
635
- result = _context9.sent;
636
- expect(result).toEqual(expect.objectContaining(expected));
637
-
638
- case 4:
639
- case "end":
640
- return _context9.stop();
641
- }
642
- }
643
- }, _callee9);
644
- })));
645
- };
646
-
647
- assertOutcome('element.partialScoring = true', {
648
- partialScoring: true
649
- }, {
650
- value: {
651
- 0: '0',
652
- 1: '0',
653
- 2: '1'
654
- }
655
- }, {
656
- mode: 'evaluate'
657
- }, {
658
- score: 0.67
659
- });
660
- assertOutcome('element.partialScoring = false', {
661
- partialScoring: false
662
- }, {
663
- value: {
664
- 0: '0',
665
- 1: '0',
666
- 2: '1'
667
- }
668
- }, {
669
- mode: 'evaluate'
670
- }, {
671
- score: 0
672
- });
673
- assertOutcome('element.partialScoring = false, env.partialScoring = true', {
674
- partialScoring: false
675
- }, {
676
- value: {
677
- 0: '0',
678
- 1: '0',
679
- 2: '1'
680
- }
681
- }, {
682
- mode: 'evaluate',
683
- partialScoring: true
684
- }, {
685
- score: 0
686
- });
687
- assertOutcome('element.partialScoring = true, env.partialScoring = false', {
688
- partialScoring: true
689
- }, {
690
- value: {
691
- 0: '0',
692
- 1: '0',
693
- 2: '1'
694
- }
695
- }, {
696
- mode: 'evaluate',
697
- partialScoring: false
698
- }, {
699
- score: 0
700
- });
701
- });
702
- describe('outcome', function () {
703
- var assertOutcome = function assertOutcome(partialScoring, sessionValue, expected) {
704
- it("partial score ".concat(partialScoring ? 'enabled' : 'disabled'), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
705
- var result;
706
- return _regenerator["default"].wrap(function _callee10$(_context10) {
707
- while (1) {
708
- switch (_context10.prev = _context10.next) {
709
- case 0:
710
- _context10.next = 2;
711
- return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
712
- partialScoring: partialScoring
713
- }), sessionValue);
714
-
715
- case 2:
716
- result = _context10.sent;
717
- expect(result).toEqual(expected);
718
-
719
- case 4:
720
- case "end":
721
- return _context10.stop();
722
- }
723
- }
724
- }, _callee10);
725
- })));
726
- };
727
-
728
- assertOutcome(true, {
729
- value: {
730
- 0: '0',
731
- 1: '0',
732
- 2: '0'
733
- }
734
- }, {
735
- score: 1,
736
- empty: false
737
- });
738
- assertOutcome(true, {
739
- value: {
740
- 0: '0',
741
- 1: '0',
742
- 2: '1'
743
- }
744
- }, {
745
- score: 0.67,
746
- empty: false
747
- });
748
- assertOutcome(true, {
749
- value: {
750
- 0: '0',
751
- 1: '1',
752
- 2: '1'
753
- }
754
- }, {
755
- score: 0.33,
756
- empty: false
757
- });
758
- assertOutcome(true, {
759
- value: {
760
- 0: '1',
761
- 1: '1',
762
- 2: '1'
763
- }
764
- }, {
765
- score: 0,
766
- empty: false
767
- });
768
- assertOutcome(false, {
769
- value: {
770
- 0: '0',
771
- 1: '0',
772
- 2: '0'
773
- }
774
- }, {
775
- score: 1,
776
- empty: false
777
- });
778
- assertOutcome(false, {
779
- value: {
780
- 0: '0',
781
- 1: '0',
782
- 2: '1'
783
- }
784
- }, {
785
- score: 0,
786
- empty: false
787
- });
788
- assertOutcome(false, {
789
- value: {
790
- 0: '0',
791
- 1: '1',
792
- 2: '1'
793
- }
794
- }, {
795
- score: 0,
796
- empty: false
797
- });
798
- assertOutcome(false, {
799
- value: {
800
- 0: '1',
801
- 1: '1',
802
- 2: '1'
803
- }
804
- }, {
805
- score: 0,
806
- empty: false
807
- });
808
-
809
- var returnModel = function returnModel(session) {
810
- it("empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
811
- var m;
812
- return _regenerator["default"].wrap(function _callee11$(_context11) {
813
- while (1) {
814
- switch (_context11.prev = _context11.next) {
815
- case 0:
816
- _context11.next = 2;
817
- return (0, _index.outcome)(question, session);
818
-
819
- case 2:
820
- m = _context11.sent;
821
- expect(m).toEqual(expect.objectContaining({
822
- score: 0,
823
- empty: true
824
- }));
825
-
826
- case 4:
827
- case "end":
828
- return _context11.stop();
829
- }
830
- }
831
- }, _callee11);
832
- })));
833
- };
834
-
835
- returnModel(undefined);
836
- returnModel(null);
837
- returnModel({});
838
- });
839
- describe('correct response', function () {
840
- it('returns correct response if role is instructor and mode is gather', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
841
- var sess;
842
- return _regenerator["default"].wrap(function _callee12$(_context12) {
843
- while (1) {
844
- switch (_context12.prev = _context12.next) {
845
- case 0:
846
- _context12.next = 2;
847
- return (0, _index.createCorrectResponseSession)(question, {
848
- mode: 'gather',
849
- role: 'instructor'
850
- });
851
-
852
- case 2:
853
- sess = _context12.sent;
854
- expect(sess).toEqual({
855
- id: '1',
856
- value: {
857
- 0: '0',
858
- 1: '0',
859
- 2: '0'
860
- }
861
- });
862
-
863
- case 4:
864
- case "end":
865
- return _context12.stop();
866
- }
867
- }
868
- }, _callee12);
869
- })));
870
- it('returns correct response if role is instructor and mode is view', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
871
- var sess;
872
- return _regenerator["default"].wrap(function _callee13$(_context13) {
873
- while (1) {
874
- switch (_context13.prev = _context13.next) {
875
- case 0:
876
- _context13.next = 2;
877
- return (0, _index.createCorrectResponseSession)(question, {
878
- mode: 'view',
879
- role: 'instructor'
880
- });
881
-
882
- case 2:
883
- sess = _context13.sent;
884
- expect(sess).toEqual({
885
- id: '1',
886
- value: {
887
- 0: '0',
888
- 1: '0',
889
- 2: '0'
890
- }
891
- });
892
-
893
- case 4:
894
- case "end":
895
- return _context13.stop();
896
- }
897
- }
898
- }, _callee13);
899
- })));
900
- it('returns null if mode is evaluate', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
901
- var noResult;
902
- return _regenerator["default"].wrap(function _callee14$(_context14) {
903
- while (1) {
904
- switch (_context14.prev = _context14.next) {
905
- case 0:
906
- _context14.next = 2;
907
- return (0, _index.createCorrectResponseSession)(question, {
908
- mode: 'evaluate',
909
- role: 'instructor'
910
- });
911
-
912
- case 2:
913
- noResult = _context14.sent;
914
- expect(noResult).toBeNull();
915
-
916
- case 4:
917
- case "end":
918
- return _context14.stop();
919
- }
920
- }
921
- }, _callee14);
922
- })));
923
- it('returns null if role is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
924
- var noResult;
925
- return _regenerator["default"].wrap(function _callee15$(_context15) {
926
- while (1) {
927
- switch (_context15.prev = _context15.next) {
928
- case 0:
929
- _context15.next = 2;
930
- return (0, _index.createCorrectResponseSession)(question, {
931
- mode: 'gather',
932
- role: 'student'
933
- });
934
-
935
- case 2:
936
- noResult = _context15.sent;
937
- expect(noResult).toBeNull();
938
-
939
- case 4:
940
- case "end":
941
- return _context15.stop();
942
- }
943
- }
944
- }, _callee15);
945
- })));
946
- });
947
- });
948
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsInJlc3VsdCIsInF1ZXN0aW9uIiwic2Vzc2lvbiIsImVudiIsImJlZm9yZUVhY2giLCJkaXNwbGF5VHlwZSIsImxhbmd1YWdlIiwibG9ja0Nob2ljZU9yZGVyIiwiY2hvaWNlcyIsImNvcnJlY3QiLCJ2YWx1ZSIsImxhYmVsIiwicmF0aW9uYWxlIiwiZWxlbWVudCIsInByb21wdCIsInNjb3JpbmdUeXBlIiwidGVhY2hlckluc3RydWN0aW9ucyIsInN0dWRlbnRJbnN0cnVjdGlvbnMiLCJwYXJ0aWFsU2NvcmluZyIsIm1hcmt1cCIsImlkIiwiYWx0ZXJuYXRlUmVzcG9uc2VzIiwiaXQiLCJtb2RlIiwiciIsImV4cGVjdCIsInRvQmVEZWZpbmVkIiwidXBkYXRlU2Vzc2lvbiIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJzaHVmZmxlZFZhbHVlcyIsImFycmF5Q29udGFpbmluZyIsInEiLCJtIiwidG9FcXVhbCIsIm9iamVjdENvbnRhaW5pbmciLCJmZWVkYmFjayIsInJlc3BvbnNlQ29ycmVjdCIsInJldHVybk1vZGVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsImNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSIsImFzc2VydEdhdGhlciIsImV4dHJhIiwiZXhwZWN0ZWQiLCJhbHRlcm5hdGVSZXNwb25zZSIsImRpc2FibGVkIiwicHJvbXB0RW5hYmxlZCIsInJhdGlvbmFsZUVuYWJsZWQiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCIsInN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkIiwiYXNzZXJ0VmlldyIsInJvbGUiLCJjaG9pY2VSYXRpb25hbGVFbmFibGVkIiwiYXNzZXJ0Vmlld1N0dWRlbnQiLCJhc3NlcnRFdmFsdWF0ZSIsImFzc2VydFNjb3JlIiwic2NvcmUiLCJyZXR1cm5TY29yZSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwic2Vzc2lvblZhbHVlIiwiZW1wdHkiLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFFQUEsUUFBUSxDQUFDLGlCQUFELEVBQW9CLFlBQU07QUFDaEMsTUFBSUMsTUFBSixFQUFZQyxRQUFaLEVBQXNCQyxPQUF0QixFQUErQkMsR0FBL0I7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZkgsSUFBQUEsUUFBUSxHQUFHO0FBQ1RJLE1BQUFBLFdBQVcsRUFBRSxPQURKO0FBRVRDLE1BQUFBLFFBQVEsRUFBRSxTQUZEO0FBR1RDLE1BQUFBLGVBQWUsRUFBRSxLQUhSO0FBSVRDLE1BQUFBLE9BQU8sRUFBRTtBQUNQLFdBQUcsQ0FDRDtBQUNFQyxVQUFBQSxPQUFPLEVBQUUsS0FEWDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsU0FGVDtBQUdFQyxVQUFBQSxLQUFLLEVBQUU7QUFIVCxTQURDLEVBTUQ7QUFDRUYsVUFBQUEsT0FBTyxFQUFFLEtBRFg7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFNBRlQ7QUFHRUMsVUFBQUEsS0FBSyxFQUFFO0FBSFQsU0FOQyxFQVdEO0FBQ0VGLFVBQUFBLE9BQU8sRUFBRSxLQURYO0FBRUVDLFVBQUFBLEtBQUssRUFBRSxTQUZUO0FBR0VDLFVBQUFBLEtBQUssRUFBRTtBQUhULFNBWEMsRUFnQkQ7QUFDRUYsVUFBQUEsT0FBTyxFQUFFLElBRFg7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLFNBRlQ7QUFHRUMsVUFBQUEsS0FBSyxFQUFFLFFBSFQ7QUFJRUMsVUFBQUEsU0FBUyxFQUFFO0FBSmIsU0FoQkM7QUFESSxPQUpBO0FBNkJUQyxNQUFBQSxPQUFPLEVBQUUseUJBN0JBO0FBOEJURCxNQUFBQSxTQUFTLEVBQUUsRUE5QkY7QUErQlRFLE1BQUFBLE1BQU0sRUFDSixpWUFoQ087QUFpQ1RDLE1BQUFBLFdBQVcsRUFBRSxNQWpDSjtBQWtD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QXFDRCxDQTdmTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U2NvcmUsIG91dGNvbWUsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIG1vZGVsIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzJztcblxuZGVzY3JpYmUoJ2lubGluZS1kcm9wZG93bicsICgpID0+IHtcbiAgbGV0IHJlc3VsdCwgcXVlc3Rpb24sIHNlc3Npb24sIGVudjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBxdWVzdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlUeXBlOiAnYmxvY2snLFxuICAgICAgbGFuZ3VhZ2U6ICdlbmdsaXNoJyxcbiAgICAgIGxvY2tDaG9pY2VPcmRlcjogZmFsc2UsXG4gICAgICBjaG9pY2VzOiB7XG4gICAgICAgIDA6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NScsXG4gICAgICAgICAgICBsYWJlbDogJzIwLDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NicsXG4gICAgICAgICAgICBsYWJlbDogJzE3LDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5NycsXG4gICAgICAgICAgICBsYWJlbDogJzE2LDEwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICc5NzE5Mzk4JyxcbiAgICAgICAgICAgIGxhYmVsOiAnMTYsMDAwJyxcbiAgICAgICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBmb3IgY2hvaWNlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGVsZW1lbnQ6ICdpbmxpbmUtZHJvcGRvd24tZWxlbWVudCcsXG4gICAgICByYXRpb25hbGU6ICcnLFxuICAgICAgcHJvbXB0OlxuICAgICAgICAnPHA+XFxuICA8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7IGZvbnQtZmFtaWx5OiBBcmlhbDtcIj5FbCBuw7ptZXJvIDE2LDEwMTwvc3Bhbj48L3N0cm9uZz4gPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+cmVkb25kZWFkbyBhbDwvc3Bhbj48L3N0cm9uZz4gPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+bWlsbGFyIG3DoXMgY2VyY2FubyBlcyZuYnNwO19fX19fX19fX19fX19fLjwvc3Bhbj48L3N0cm9uZz5cXG48L3A+XFxuPHA+XFxuICA8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDAwMDA7XCI+Jm5ic3A7PC9zcGFuPjwvc3Ryb25nPlxcbjwvcD4nLFxuICAgICAgc2NvcmluZ1R5cGU6ICdhdXRvJyxcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IHRydWUsXG4gICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zOiBmYWxzZSxcbiAgICAgIHBhcnRpYWxTY29yaW5nOiBmYWxzZSxcbiAgICAgIG1hcmt1cDogJ3t7MH19JyxcbiAgICAgIGlkOiAnMjQyMTMxMCcsXG4gICAgICBhbHRlcm5hdGVSZXNwb25zZXM6IG51bGwsXG4gICAgfTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ2lzIG9rIGlzIHNlc3Npb24gaXMgZW1wdHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXNzaW9uID0ge307XG4gICAgICBlbnYgPSB7IG1vZGU6ICdldmFsdWF0ZScgfTtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwge30sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcbiAgICAgIGV4cGVjdChyKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbW9kZWwgLSB3aXRoIHVwZGF0ZVNlc3Npb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBzZXNzaW9uID0geyBpZDogJzEnLCBlbGVtZW50OiAnaW5saW5lLWRyb3Bkb3duLWVsZW1lbnQnIH07XG4gICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG4gICAgICBjb25zdCB1cGRhdGVTZXNzaW9uID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKCk7XG4gICAgICBhd2FpdCBtb2RlbChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52LCB1cGRhdGVTZXNzaW9uKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVTZXNzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnMScsICdpbmxpbmUtZHJvcGRvd24tZWxlbWVudCcsIHtcbiAgICAgICAgc2h1ZmZsZWRWYWx1ZXM6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWyc5NzE5Mzk1JywgJzk3MTkzOTYnLCAnOTcxOTM5NycsICc5NzE5Mzk4J10pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmNvbnN0IHF1ZXN0aW9uID0ge1xuICBkaXNwbGF5VHlwZTogJ2Jsb2NrJyxcbiAgbGFuZ3VhZ2U6ICdlbmdsaXNoJyxcbiAgcHJvbXB0OiAnVXNlIHRoZSBkcm9wLWRvd25zIHRvIGNvbXBsZXRlIHRoZSBzZW50ZW5jZScsXG4gIG1hcmt1cDogJzxkaXY+PHA+VGhlIHt7MH19IGp1bXBlZCB7ezF9fSB0aGUge3syfX08L3A+PC9kaXY+JyxcbiAgY2hvaWNlczoge1xuICAgIDA6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGNvdycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2RvZyAnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGRvZycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGNhdCcsXG4gICAgICB9LFxuICAgIF0sXG4gICAgMTogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ292ZXIgJyxcbiAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIG92ZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd1bmRlciAnLFxuICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIHVuZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgYWNyb3NzJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAyOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnbW9vbiAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgbW9vbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgc3VuJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBob3VzZScsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5kZXNjcmliZSgnY29udHJvbGxlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ21vZGVsJywgKCkgPT4ge1xuICAgIGxldCBxO1xuICAgIGNvbnN0IHVwZGF0ZVNlc3Npb24gPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoKTtcblxuICAgIGl0KCdvdXRwdXQgd2hlbiBzZXNzaW9uIGlzIGRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0sIHsgbW9kZTogJ2V2YWx1YXRlJyB9LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2NvcnJlY3QnIH0sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgb3V0cHV0IHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IGF3YWl0IG1vZGVsKHF1ZXN0aW9uLCBzZXNzaW9uLCB7IG1vZGU6ICdldmFsdWF0ZScgfSwgdXBkYXRlU2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoXG4gICAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5Nb2RlbCh1bmRlZmluZWQpO1xuICAgIHJldHVybk1vZGVsKG51bGwpO1xuICAgIHJldHVybk1vZGVsKHt9KTtcblxuICAgIGNvbnN0IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSA9IHtcbiAgICAgIDA6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnY293ICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnZG9nICcsXG4gICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2NhdCAnLFxuICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIDE6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnb3ZlciAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3VuZGVyICcsXG4gICAgICAgICAgdmFsdWU6ICcxJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2Fjcm9zcyAnLFxuICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIDI6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnbW9vbiAnLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ3N1bicsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ2hvdXNlICcsXG4gICAgICAgICAgdmFsdWU6ICczJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCBhc3NlcnRHYXRoZXIgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBnYXRoZXIsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtb2RlOiAnZ2F0aGVyJyB9LFxuICAgICAgICAgIHVwZGF0ZVNlc3Npb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBub3Qgc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEdhdGhlcihcbiAgICAgICdwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXcgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiB2aWV3LCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgYWx0ZXJuYXRlUmVzcG9uc2U6IHsgMjogWycyJ10gfSxcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHsgaWQ6ICcxJywgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJywgLi4uc2Vzc2lvbiB9LFxuICAgICAgICAgIHsgbW9kZTogJ3ZpZXcnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSxcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCwgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgYW5kIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQgc2V0IHRvIGZhbHNlJyxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHN0dWRlbnRJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgY2hvaWNlUmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRWaWV3KFxuICAgICAgJyArIHJvbGU6IGluc3RydWN0b3IsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQsIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIGFuZCBjaG9pY2VSYXRpb25hbGVFbmFibGVkIHVuc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3U3R1ZGVudCA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAndmlldycsIHJvbGU6ICdzdHVkZW50JyB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgY2hvaWNlczogY2hvaWNlc1dpdGhOdWxsUmF0aW9uYWxlLFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IG51bGwsXG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXdTdHVkZW50KFxuICAgICAgJyArIHJvbGU6IHN0dWRlbnQsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHVuc2V0JyxcbiAgICAgIHt9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydEV2YWx1YXRlID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogZXZhbHVhdGUsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAwOiBbJzInXSwgMTogWycyJ10sIDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICBjaG9pY2VSYXRpb25hbGVFbmFibGVkOiB0cnVlLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHsgaWQ6ICcxJywgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJywgLi4uc2Vzc2lvbiB9LFxuICAgICAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcm9sZTogJ2luc3RydWN0b3InIH0sXG4gICAgICAgICAgdXBkYXRlU2Vzc2lvbixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgMTogJzAnLFxuICAgICAgICAgIDI6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJzAnLFxuICAgICAgICAgIDE6ICcwJyxcbiAgICAgICAgICAyOiAnMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdjb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gcGFydGlhbGx5IGNvcnJlY3QgYW5zd2VyIHVzaW5nIGFsdGVybmF0ZXMnLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJzInLFxuICAgICAgICAgIDE6ICcxJyxcbiAgICAgICAgICAyOiAnMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmZWVkYmFjazogeyAwOiAnY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydEV2YWx1YXRlKFxuICAgICAgJy0gaW5jb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMScsXG4gICAgICAgICAgMTogJzEnLFxuICAgICAgICAgIDI6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdpbmNvcnJlY3QnLCAxOiAnaW5jb3JyZWN0JywgMjogJ2luY29ycmVjdCcgfSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCBzY29yZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTY29yZSA9IChzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoJ3JldHVybiBzY29yZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KHNjb3JlKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCAxKTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcxJyB9IH0sIDAuNjcpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIDAuMzMpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzEnLCAxOiAnMScsIDI6ICcxJyB9IH0sIDApO1xuXG4gICAgY29uc3QgcmV0dXJuU2NvcmUgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHNjb3JlID0gMCB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbikpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuU2NvcmUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5TY29yZShudWxsKTtcbiAgICByZXR1cm5TY29yZSh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lIHBhcnRpYWxTY29yaW5nIHRlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChtZXNzYWdlLCBleHRyYSwgc2Vzc2lvblZhbHVlLCBlbnYsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMC42NyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSBmYWxzZSwgZW52LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiBmYWxzZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcGFydGlhbFNjb3Jpbmc6IHRydWUgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZSwgZW52LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSxcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJywgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChwYXJ0aWFsU2NvcmluZywgc2Vzc2lvblZhbHVlLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYHBhcnRpYWwgc2NvcmUgJHtwYXJ0aWFsU2NvcmluZyA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgcGFydGlhbFNjb3JpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgZW1wdHk6IHRydWUgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBzY29yZTogMCwgZW1wdHk6IHRydWUgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiByb2xlIGlzIGluc3RydWN0b3IgYW5kIG1vZGUgaXMgdmlldycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHJvbGUgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==