@pie-element/inline-dropdown 10.2.2-beta.3 → 10.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -29
- package/configure/CHANGELOG.md +48 -28
- package/configure/lib/inline-dropdown-toolbar.js +5 -6
- package/configure/lib/inline-dropdown-toolbar.js.map +1 -1
- package/configure/package.json +4 -4
- package/controller/CHANGELOG.md +6 -42
- package/controller/package.json +1 -1
- package/package.json +5 -5
- package/configure/lib/__tests__/inline-dropdown-toolbar.test.js +0 -1654
- package/configure/lib/__tests__/main.test.js +0 -598
- package/configure/lib/__tests__/markupUtils.test.js +0 -107
- package/controller/lib/__tests__/index.test.js +0 -705
- package/docs/demo/pie.manifest.json +0 -11
|
@@ -1,705 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _index = require("../index");
|
|
5
|
-
var _defaults = _interopRequireDefault(require("../defaults"));
|
|
6
|
-
describe('inline-dropdown', () => {
|
|
7
|
-
let result, question, session, env;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
question = {
|
|
10
|
-
displayType: 'block',
|
|
11
|
-
language: 'english',
|
|
12
|
-
lockChoiceOrder: false,
|
|
13
|
-
choices: {
|
|
14
|
-
0: [{
|
|
15
|
-
correct: false,
|
|
16
|
-
value: '9719395',
|
|
17
|
-
label: '20,000'
|
|
18
|
-
}, {
|
|
19
|
-
correct: false,
|
|
20
|
-
value: '9719396',
|
|
21
|
-
label: '17,000'
|
|
22
|
-
}, {
|
|
23
|
-
correct: false,
|
|
24
|
-
value: '9719397',
|
|
25
|
-
label: '16,100'
|
|
26
|
-
}, {
|
|
27
|
-
correct: true,
|
|
28
|
-
value: '9719398',
|
|
29
|
-
label: '16,000',
|
|
30
|
-
rationale: 'rationale for choice'
|
|
31
|
-
}]
|
|
32
|
-
},
|
|
33
|
-
element: 'inline-dropdown-element',
|
|
34
|
-
rationale: '',
|
|
35
|
-
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 ______________.</span></strong>\n</p>\n<p>\n <strong><span style="color: #000000;"> </span></strong>\n</p>',
|
|
36
|
-
scoringType: 'auto',
|
|
37
|
-
teacherInstructions: true,
|
|
38
|
-
studentInstructions: false,
|
|
39
|
-
partialScoring: false,
|
|
40
|
-
markup: '{{0}}',
|
|
41
|
-
id: '2421310',
|
|
42
|
-
alternateResponses: null
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
describe('edge cases', () => {
|
|
46
|
-
it('is ok is session is empty', async () => {
|
|
47
|
-
session = {};
|
|
48
|
-
env = {
|
|
49
|
-
mode: 'evaluate'
|
|
50
|
-
};
|
|
51
|
-
const r = await (0, _index.model)(question, {}, {
|
|
52
|
-
mode: 'evaluate'
|
|
53
|
-
});
|
|
54
|
-
expect(r).toBeDefined();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
describe('model - with updateSession', () => {
|
|
58
|
-
it('calls updateSession', async () => {
|
|
59
|
-
session = {
|
|
60
|
-
id: '1',
|
|
61
|
-
element: 'inline-dropdown-element'
|
|
62
|
-
};
|
|
63
|
-
env = {
|
|
64
|
-
mode: 'gather'
|
|
65
|
-
};
|
|
66
|
-
const updateSession = jest.fn().mockResolvedValue();
|
|
67
|
-
await (0, _index.model)(question, session, env, updateSession);
|
|
68
|
-
expect(updateSession).toHaveBeenCalledWith('1', 'inline-dropdown-element', expect.objectContaining({
|
|
69
|
-
shuffledValues: {
|
|
70
|
-
0: expect.arrayContaining(['9719395', '9719396', '9719397', '9719398'])
|
|
71
|
-
}
|
|
72
|
-
}));
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
const question = {
|
|
77
|
-
displayType: 'block',
|
|
78
|
-
language: 'english',
|
|
79
|
-
prompt: 'Use the drop-downs to complete the sentence',
|
|
80
|
-
markup: '<div><p>The {{0}} jumped {{1}} the {{2}}</p></div>',
|
|
81
|
-
choices: {
|
|
82
|
-
0: [{
|
|
83
|
-
label: 'cow ',
|
|
84
|
-
value: '0',
|
|
85
|
-
correct: true,
|
|
86
|
-
rationale: 'rationale cow'
|
|
87
|
-
}, {
|
|
88
|
-
label: 'dog ',
|
|
89
|
-
value: '1',
|
|
90
|
-
correct: false,
|
|
91
|
-
rationale: 'rationale dog'
|
|
92
|
-
}, {
|
|
93
|
-
label: 'cat ',
|
|
94
|
-
value: '2',
|
|
95
|
-
correct: false,
|
|
96
|
-
rationale: 'rationale cat'
|
|
97
|
-
}],
|
|
98
|
-
1: [{
|
|
99
|
-
label: 'over ',
|
|
100
|
-
value: '0',
|
|
101
|
-
correct: true,
|
|
102
|
-
rationale: 'rationale over'
|
|
103
|
-
}, {
|
|
104
|
-
label: 'under ',
|
|
105
|
-
value: '1',
|
|
106
|
-
correct: false,
|
|
107
|
-
rationale: 'rationale under'
|
|
108
|
-
}, {
|
|
109
|
-
label: 'across ',
|
|
110
|
-
value: '2',
|
|
111
|
-
correct: false,
|
|
112
|
-
rationale: 'rationale across'
|
|
113
|
-
}],
|
|
114
|
-
2: [{
|
|
115
|
-
label: 'moon ',
|
|
116
|
-
value: '0',
|
|
117
|
-
correct: true,
|
|
118
|
-
rationale: 'rationale moon'
|
|
119
|
-
}, {
|
|
120
|
-
label: 'sun',
|
|
121
|
-
value: '2',
|
|
122
|
-
correct: false,
|
|
123
|
-
rationale: 'rationale sun'
|
|
124
|
-
}, {
|
|
125
|
-
label: 'house ',
|
|
126
|
-
value: '3',
|
|
127
|
-
correct: false,
|
|
128
|
-
rationale: 'rationale house'
|
|
129
|
-
}]
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
describe('controller', () => {
|
|
133
|
-
describe('model', () => {
|
|
134
|
-
let q;
|
|
135
|
-
const updateSession = jest.fn().mockResolvedValue();
|
|
136
|
-
it('output when session is defined', async () => {
|
|
137
|
-
const m = await (0, _index.model)(question, {
|
|
138
|
-
value: {
|
|
139
|
-
0: '0',
|
|
140
|
-
1: '0',
|
|
141
|
-
2: '0'
|
|
142
|
-
}
|
|
143
|
-
}, {
|
|
144
|
-
mode: 'evaluate'
|
|
145
|
-
}, updateSession);
|
|
146
|
-
expect(m).toEqual(expect.objectContaining({
|
|
147
|
-
feedback: {
|
|
148
|
-
0: 'correct',
|
|
149
|
-
1: 'correct',
|
|
150
|
-
2: 'correct'
|
|
151
|
-
},
|
|
152
|
-
responseCorrect: true
|
|
153
|
-
}));
|
|
154
|
-
});
|
|
155
|
-
const returnModel = session => {
|
|
156
|
-
it(`output when session is ${JSON.stringify(session)}`, async () => {
|
|
157
|
-
const m = await (0, _index.model)(question, session, {
|
|
158
|
-
mode: 'evaluate'
|
|
159
|
-
}, updateSession);
|
|
160
|
-
expect(m).toEqual(expect.objectContaining({
|
|
161
|
-
feedback: {
|
|
162
|
-
0: 'incorrect',
|
|
163
|
-
1: 'incorrect',
|
|
164
|
-
2: 'incorrect'
|
|
165
|
-
},
|
|
166
|
-
responseCorrect: false
|
|
167
|
-
}));
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
returnModel(undefined);
|
|
171
|
-
returnModel(null);
|
|
172
|
-
returnModel({});
|
|
173
|
-
const choicesWithNullRationale = {
|
|
174
|
-
0: [{
|
|
175
|
-
label: 'cow ',
|
|
176
|
-
value: '0',
|
|
177
|
-
correct: true,
|
|
178
|
-
rationale: null
|
|
179
|
-
}, {
|
|
180
|
-
label: 'dog ',
|
|
181
|
-
value: '1',
|
|
182
|
-
correct: false,
|
|
183
|
-
rationale: null
|
|
184
|
-
}, {
|
|
185
|
-
label: 'cat ',
|
|
186
|
-
value: '2',
|
|
187
|
-
correct: false,
|
|
188
|
-
rationale: null
|
|
189
|
-
}],
|
|
190
|
-
1: [{
|
|
191
|
-
label: 'over ',
|
|
192
|
-
value: '0',
|
|
193
|
-
correct: true,
|
|
194
|
-
rationale: null
|
|
195
|
-
}, {
|
|
196
|
-
label: 'under ',
|
|
197
|
-
value: '1',
|
|
198
|
-
correct: false,
|
|
199
|
-
rationale: null
|
|
200
|
-
}, {
|
|
201
|
-
label: 'across ',
|
|
202
|
-
value: '2',
|
|
203
|
-
correct: false,
|
|
204
|
-
rationale: null
|
|
205
|
-
}],
|
|
206
|
-
2: [{
|
|
207
|
-
label: 'moon ',
|
|
208
|
-
value: '0',
|
|
209
|
-
correct: true,
|
|
210
|
-
rationale: null
|
|
211
|
-
}, {
|
|
212
|
-
label: 'sun',
|
|
213
|
-
value: '2',
|
|
214
|
-
correct: false,
|
|
215
|
-
rationale: null
|
|
216
|
-
}, {
|
|
217
|
-
label: 'house ',
|
|
218
|
-
value: '3',
|
|
219
|
-
correct: false,
|
|
220
|
-
rationale: null
|
|
221
|
-
}]
|
|
222
|
-
};
|
|
223
|
-
const assertGather = (label, extra, session, expected) => {
|
|
224
|
-
it(`'mode: gather, ${label}'`, async () => {
|
|
225
|
-
q = {
|
|
226
|
-
...question,
|
|
227
|
-
alternateResponse: {
|
|
228
|
-
2: ['2']
|
|
229
|
-
},
|
|
230
|
-
lockChoiceOrder: true,
|
|
231
|
-
teacherInstructions: 'Teacher Instructions',
|
|
232
|
-
rationale: 'Rationale',
|
|
233
|
-
...extra
|
|
234
|
-
};
|
|
235
|
-
const result = await (0, _index.model)(q, {
|
|
236
|
-
id: '1',
|
|
237
|
-
element: 'explicit-constructed-response',
|
|
238
|
-
...session
|
|
239
|
-
}, {
|
|
240
|
-
mode: 'gather'
|
|
241
|
-
}, updateSession);
|
|
242
|
-
expect(result).toEqual({
|
|
243
|
-
...question,
|
|
244
|
-
disabled: false,
|
|
245
|
-
mode: 'gather',
|
|
246
|
-
feedback: {},
|
|
247
|
-
responseCorrect: undefined,
|
|
248
|
-
choices: choicesWithNullRationale,
|
|
249
|
-
...expected
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
};
|
|
253
|
-
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
|
|
254
|
-
rationale: null,
|
|
255
|
-
teacherInstructions: null
|
|
256
|
-
});
|
|
257
|
-
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
258
|
-
promptEnabled: false,
|
|
259
|
-
rationaleEnabled: false,
|
|
260
|
-
teacherInstructionsEnabled: false,
|
|
261
|
-
studentInstructionsEnabled: false
|
|
262
|
-
}, {}, {
|
|
263
|
-
prompt: null,
|
|
264
|
-
rationale: null,
|
|
265
|
-
teacherInstructions: null
|
|
266
|
-
});
|
|
267
|
-
const assertView = (label, extra, session, expected) => {
|
|
268
|
-
it(`'mode: view, ${label}'`, async () => {
|
|
269
|
-
q = {
|
|
270
|
-
...question,
|
|
271
|
-
alternateResponse: {
|
|
272
|
-
2: ['2']
|
|
273
|
-
},
|
|
274
|
-
lockChoiceOrder: true,
|
|
275
|
-
teacherInstructions: 'Teacher Instructions',
|
|
276
|
-
rationale: 'Rationale',
|
|
277
|
-
...extra
|
|
278
|
-
};
|
|
279
|
-
const result = await (0, _index.model)(q, {
|
|
280
|
-
id: '1',
|
|
281
|
-
element: 'explicit-constructed-response',
|
|
282
|
-
...session
|
|
283
|
-
}, {
|
|
284
|
-
mode: 'view',
|
|
285
|
-
role: 'instructor'
|
|
286
|
-
}, updateSession);
|
|
287
|
-
expect(result).toEqual({
|
|
288
|
-
...question,
|
|
289
|
-
mode: 'view',
|
|
290
|
-
disabled: true,
|
|
291
|
-
feedback: {},
|
|
292
|
-
responseCorrect: undefined,
|
|
293
|
-
...expected
|
|
294
|
-
});
|
|
295
|
-
});
|
|
296
|
-
};
|
|
297
|
-
assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled set to false', {
|
|
298
|
-
promptEnabled: false,
|
|
299
|
-
rationaleEnabled: false,
|
|
300
|
-
teacherInstructionsEnabled: false,
|
|
301
|
-
studentInstructionsEnabled: false,
|
|
302
|
-
choiceRationaleEnabled: false
|
|
303
|
-
}, {}, {
|
|
304
|
-
prompt: null,
|
|
305
|
-
rationale: null,
|
|
306
|
-
teacherInstructions: null,
|
|
307
|
-
choices: choicesWithNullRationale
|
|
308
|
-
});
|
|
309
|
-
assertView(' + role: instructor, promptEnabled, rationaleEnabled, teacherInstructionsEnabled and choiceRationaleEnabled unset', {}, {}, {
|
|
310
|
-
teacherInstructions: 'Teacher Instructions',
|
|
311
|
-
rationale: 'Rationale'
|
|
312
|
-
});
|
|
313
|
-
const assertViewStudent = (label, extra, session, expected) => {
|
|
314
|
-
it(`'mode: view, ${label}'`, async () => {
|
|
315
|
-
q = {
|
|
316
|
-
...question,
|
|
317
|
-
alternateResponse: {
|
|
318
|
-
2: ['2']
|
|
319
|
-
},
|
|
320
|
-
lockChoiceOrder: true,
|
|
321
|
-
teacherInstructions: 'Teacher Instructions',
|
|
322
|
-
rationale: 'Rationale',
|
|
323
|
-
...extra
|
|
324
|
-
};
|
|
325
|
-
const result = await (0, _index.model)(q, {
|
|
326
|
-
id: '1',
|
|
327
|
-
element: 'explicit-constructed-response',
|
|
328
|
-
...session
|
|
329
|
-
}, {
|
|
330
|
-
mode: 'view',
|
|
331
|
-
role: 'student'
|
|
332
|
-
});
|
|
333
|
-
expect(result).toEqual({
|
|
334
|
-
...question,
|
|
335
|
-
mode: 'view',
|
|
336
|
-
disabled: true,
|
|
337
|
-
feedback: {},
|
|
338
|
-
responseCorrect: undefined,
|
|
339
|
-
choices: choicesWithNullRationale,
|
|
340
|
-
...expected
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
};
|
|
344
|
-
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
345
|
-
promptEnabled: false,
|
|
346
|
-
rationaleEnabled: false,
|
|
347
|
-
teacherInstructionsEnabled: false,
|
|
348
|
-
studentInstructionsEnabled: false
|
|
349
|
-
}, {}, {
|
|
350
|
-
prompt: null,
|
|
351
|
-
rationale: null,
|
|
352
|
-
teacherInstructions: null
|
|
353
|
-
});
|
|
354
|
-
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
|
|
355
|
-
rationale: null,
|
|
356
|
-
teacherInstructions: null
|
|
357
|
-
});
|
|
358
|
-
const assertEvaluate = (label, extra, session, expected) => {
|
|
359
|
-
it(`'mode: evaluate, ${label}'`, async () => {
|
|
360
|
-
q = {
|
|
361
|
-
...question,
|
|
362
|
-
alternateResponse: {
|
|
363
|
-
0: ['2'],
|
|
364
|
-
1: ['2'],
|
|
365
|
-
2: ['2']
|
|
366
|
-
},
|
|
367
|
-
lockChoiceOrder: true,
|
|
368
|
-
teacherInstructions: 'Teacher Instructions',
|
|
369
|
-
rationale: 'Rationale',
|
|
370
|
-
choiceRationaleEnabled: true,
|
|
371
|
-
...extra
|
|
372
|
-
};
|
|
373
|
-
const result = await (0, _index.model)(q, {
|
|
374
|
-
id: '1',
|
|
375
|
-
element: 'explicit-constructed-response',
|
|
376
|
-
...session
|
|
377
|
-
}, {
|
|
378
|
-
mode: 'evaluate',
|
|
379
|
-
role: 'instructor'
|
|
380
|
-
}, updateSession);
|
|
381
|
-
expect(result).toEqual({
|
|
382
|
-
...question,
|
|
383
|
-
teacherInstructions: 'Teacher Instructions',
|
|
384
|
-
rationale: 'Rationale',
|
|
385
|
-
mode: 'evaluate',
|
|
386
|
-
disabled: true,
|
|
387
|
-
...expected
|
|
388
|
-
});
|
|
389
|
-
});
|
|
390
|
-
};
|
|
391
|
-
assertEvaluate('- correct answer', {}, {
|
|
392
|
-
value: {
|
|
393
|
-
0: '0',
|
|
394
|
-
1: '0',
|
|
395
|
-
2: '0'
|
|
396
|
-
}
|
|
397
|
-
}, {
|
|
398
|
-
feedback: {
|
|
399
|
-
0: 'correct',
|
|
400
|
-
1: 'correct',
|
|
401
|
-
2: 'correct'
|
|
402
|
-
},
|
|
403
|
-
responseCorrect: true
|
|
404
|
-
});
|
|
405
|
-
assertEvaluate('- partially correct answer', {}, {
|
|
406
|
-
value: {
|
|
407
|
-
0: '0',
|
|
408
|
-
1: '0',
|
|
409
|
-
2: '1'
|
|
410
|
-
}
|
|
411
|
-
}, {
|
|
412
|
-
feedback: {
|
|
413
|
-
0: 'correct',
|
|
414
|
-
1: 'correct',
|
|
415
|
-
2: 'incorrect'
|
|
416
|
-
},
|
|
417
|
-
responseCorrect: false
|
|
418
|
-
});
|
|
419
|
-
assertEvaluate('- partially correct answer using alternates', {}, {
|
|
420
|
-
value: {
|
|
421
|
-
0: '2',
|
|
422
|
-
1: '1',
|
|
423
|
-
2: '2'
|
|
424
|
-
}
|
|
425
|
-
}, {
|
|
426
|
-
feedback: {
|
|
427
|
-
0: 'correct',
|
|
428
|
-
1: 'incorrect',
|
|
429
|
-
2: 'correct'
|
|
430
|
-
},
|
|
431
|
-
responseCorrect: false
|
|
432
|
-
});
|
|
433
|
-
assertEvaluate('- incorrect answer', {}, {
|
|
434
|
-
value: {
|
|
435
|
-
0: '1',
|
|
436
|
-
1: '1',
|
|
437
|
-
2: '1'
|
|
438
|
-
}
|
|
439
|
-
}, {
|
|
440
|
-
feedback: {
|
|
441
|
-
0: 'incorrect',
|
|
442
|
-
1: 'incorrect',
|
|
443
|
-
2: 'incorrect'
|
|
444
|
-
},
|
|
445
|
-
responseCorrect: false
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
describe('get score', () => {
|
|
449
|
-
const assertScore = (session, expected) => {
|
|
450
|
-
it('return score', () => {
|
|
451
|
-
const score = (0, _index.getScore)(question, session);
|
|
452
|
-
expect(score).toEqual(expected);
|
|
453
|
-
});
|
|
454
|
-
};
|
|
455
|
-
assertScore({
|
|
456
|
-
value: {
|
|
457
|
-
0: '0',
|
|
458
|
-
1: '0',
|
|
459
|
-
2: '0'
|
|
460
|
-
}
|
|
461
|
-
}, 1);
|
|
462
|
-
assertScore({
|
|
463
|
-
value: {
|
|
464
|
-
0: '0',
|
|
465
|
-
1: '0',
|
|
466
|
-
2: '1'
|
|
467
|
-
}
|
|
468
|
-
}, 0.67);
|
|
469
|
-
assertScore({
|
|
470
|
-
value: {
|
|
471
|
-
0: '0',
|
|
472
|
-
1: '1',
|
|
473
|
-
2: '1'
|
|
474
|
-
}
|
|
475
|
-
}, 0.33);
|
|
476
|
-
assertScore({
|
|
477
|
-
value: {
|
|
478
|
-
0: '1',
|
|
479
|
-
1: '1',
|
|
480
|
-
2: '1'
|
|
481
|
-
}
|
|
482
|
-
}, 0);
|
|
483
|
-
const returnScore = session => {
|
|
484
|
-
it(`score = 0 when session is ${JSON.stringify(session)}`, () => {
|
|
485
|
-
expect((0, _index.getScore)(question, session)).toEqual(0);
|
|
486
|
-
});
|
|
487
|
-
};
|
|
488
|
-
returnScore(undefined);
|
|
489
|
-
returnScore(null);
|
|
490
|
-
returnScore({});
|
|
491
|
-
});
|
|
492
|
-
describe('outcome partialScoring test', () => {
|
|
493
|
-
const assertOutcome = (message, extra, sessionValue, env, expected) => {
|
|
494
|
-
it(message, async () => {
|
|
495
|
-
const result = await (0, _index.outcome)({
|
|
496
|
-
...question,
|
|
497
|
-
...extra
|
|
498
|
-
}, sessionValue, env);
|
|
499
|
-
expect(result).toEqual(expect.objectContaining(expected));
|
|
500
|
-
});
|
|
501
|
-
};
|
|
502
|
-
assertOutcome('element.partialScoring = true', {
|
|
503
|
-
partialScoring: true
|
|
504
|
-
}, {
|
|
505
|
-
value: {
|
|
506
|
-
0: '0',
|
|
507
|
-
1: '0',
|
|
508
|
-
2: '1'
|
|
509
|
-
}
|
|
510
|
-
}, {
|
|
511
|
-
mode: 'evaluate'
|
|
512
|
-
}, {
|
|
513
|
-
score: 0.67
|
|
514
|
-
});
|
|
515
|
-
assertOutcome('element.partialScoring = false', {
|
|
516
|
-
partialScoring: false
|
|
517
|
-
}, {
|
|
518
|
-
value: {
|
|
519
|
-
0: '0',
|
|
520
|
-
1: '0',
|
|
521
|
-
2: '1'
|
|
522
|
-
}
|
|
523
|
-
}, {
|
|
524
|
-
mode: 'evaluate'
|
|
525
|
-
}, {
|
|
526
|
-
score: 0
|
|
527
|
-
});
|
|
528
|
-
assertOutcome('element.partialScoring = false, env.partialScoring = true', {
|
|
529
|
-
partialScoring: false
|
|
530
|
-
}, {
|
|
531
|
-
value: {
|
|
532
|
-
0: '0',
|
|
533
|
-
1: '0',
|
|
534
|
-
2: '1'
|
|
535
|
-
}
|
|
536
|
-
}, {
|
|
537
|
-
mode: 'evaluate',
|
|
538
|
-
partialScoring: true
|
|
539
|
-
}, {
|
|
540
|
-
score: 0
|
|
541
|
-
});
|
|
542
|
-
assertOutcome('element.partialScoring = true, env.partialScoring = false', {
|
|
543
|
-
partialScoring: true
|
|
544
|
-
}, {
|
|
545
|
-
value: {
|
|
546
|
-
0: '0',
|
|
547
|
-
1: '0',
|
|
548
|
-
2: '1'
|
|
549
|
-
}
|
|
550
|
-
}, {
|
|
551
|
-
mode: 'evaluate',
|
|
552
|
-
partialScoring: false
|
|
553
|
-
}, {
|
|
554
|
-
score: 0
|
|
555
|
-
});
|
|
556
|
-
});
|
|
557
|
-
describe('outcome', () => {
|
|
558
|
-
const assertOutcome = (partialScoring, sessionValue, expected) => {
|
|
559
|
-
it(`partial score ${partialScoring ? 'enabled' : 'disabled'}`, async () => {
|
|
560
|
-
const result = await (0, _index.outcome)({
|
|
561
|
-
...question,
|
|
562
|
-
partialScoring
|
|
563
|
-
}, sessionValue);
|
|
564
|
-
expect(result).toEqual(expect.objectContaining(expected));
|
|
565
|
-
});
|
|
566
|
-
};
|
|
567
|
-
assertOutcome(true, {
|
|
568
|
-
value: {
|
|
569
|
-
0: '0',
|
|
570
|
-
1: '0',
|
|
571
|
-
2: '0'
|
|
572
|
-
}
|
|
573
|
-
}, {
|
|
574
|
-
score: 1,
|
|
575
|
-
empty: false
|
|
576
|
-
});
|
|
577
|
-
assertOutcome(true, {
|
|
578
|
-
value: {
|
|
579
|
-
0: '0',
|
|
580
|
-
1: '0',
|
|
581
|
-
2: '1'
|
|
582
|
-
}
|
|
583
|
-
}, {
|
|
584
|
-
score: 0.67,
|
|
585
|
-
empty: false
|
|
586
|
-
});
|
|
587
|
-
assertOutcome(true, {
|
|
588
|
-
value: {
|
|
589
|
-
0: '0',
|
|
590
|
-
1: '1',
|
|
591
|
-
2: '1'
|
|
592
|
-
}
|
|
593
|
-
}, {
|
|
594
|
-
score: 0.33,
|
|
595
|
-
empty: false
|
|
596
|
-
});
|
|
597
|
-
assertOutcome(true, {
|
|
598
|
-
value: {
|
|
599
|
-
0: '1',
|
|
600
|
-
1: '1',
|
|
601
|
-
2: '1'
|
|
602
|
-
}
|
|
603
|
-
}, {
|
|
604
|
-
score: 0,
|
|
605
|
-
empty: false
|
|
606
|
-
});
|
|
607
|
-
assertOutcome(false, {
|
|
608
|
-
value: {
|
|
609
|
-
0: '0',
|
|
610
|
-
1: '0',
|
|
611
|
-
2: '0'
|
|
612
|
-
}
|
|
613
|
-
}, {
|
|
614
|
-
score: 1,
|
|
615
|
-
empty: false
|
|
616
|
-
});
|
|
617
|
-
assertOutcome(false, {
|
|
618
|
-
value: {
|
|
619
|
-
0: '0',
|
|
620
|
-
1: '0',
|
|
621
|
-
2: '1'
|
|
622
|
-
}
|
|
623
|
-
}, {
|
|
624
|
-
score: 0,
|
|
625
|
-
empty: false
|
|
626
|
-
});
|
|
627
|
-
assertOutcome(false, {
|
|
628
|
-
value: {
|
|
629
|
-
0: '0',
|
|
630
|
-
1: '1',
|
|
631
|
-
2: '1'
|
|
632
|
-
}
|
|
633
|
-
}, {
|
|
634
|
-
score: 0,
|
|
635
|
-
empty: false
|
|
636
|
-
});
|
|
637
|
-
assertOutcome(false, {
|
|
638
|
-
value: {
|
|
639
|
-
0: '1',
|
|
640
|
-
1: '1',
|
|
641
|
-
2: '1'
|
|
642
|
-
}
|
|
643
|
-
}, {
|
|
644
|
-
score: 0,
|
|
645
|
-
empty: false
|
|
646
|
-
});
|
|
647
|
-
const returnModel = session => {
|
|
648
|
-
it(`empty: true when session is ${JSON.stringify(session)}`, async () => {
|
|
649
|
-
const m = await (0, _index.outcome)(question, session);
|
|
650
|
-
expect(m).toEqual(expect.objectContaining({
|
|
651
|
-
score: 0,
|
|
652
|
-
empty: true
|
|
653
|
-
}));
|
|
654
|
-
});
|
|
655
|
-
};
|
|
656
|
-
returnModel(undefined);
|
|
657
|
-
returnModel(null);
|
|
658
|
-
returnModel({});
|
|
659
|
-
});
|
|
660
|
-
describe('correct response', () => {
|
|
661
|
-
it('returns correct response if role is instructor and mode is gather', async () => {
|
|
662
|
-
const sess = await (0, _index.createCorrectResponseSession)(question, {
|
|
663
|
-
mode: 'gather',
|
|
664
|
-
role: 'instructor'
|
|
665
|
-
});
|
|
666
|
-
expect(sess).toEqual({
|
|
667
|
-
id: '1',
|
|
668
|
-
value: {
|
|
669
|
-
0: '0',
|
|
670
|
-
1: '0',
|
|
671
|
-
2: '0'
|
|
672
|
-
}
|
|
673
|
-
});
|
|
674
|
-
});
|
|
675
|
-
it('returns correct response if role is instructor and mode is view', async () => {
|
|
676
|
-
const sess = await (0, _index.createCorrectResponseSession)(question, {
|
|
677
|
-
mode: 'view',
|
|
678
|
-
role: 'instructor'
|
|
679
|
-
});
|
|
680
|
-
expect(sess).toEqual({
|
|
681
|
-
id: '1',
|
|
682
|
-
value: {
|
|
683
|
-
0: '0',
|
|
684
|
-
1: '0',
|
|
685
|
-
2: '0'
|
|
686
|
-
}
|
|
687
|
-
});
|
|
688
|
-
});
|
|
689
|
-
it('returns null if mode is evaluate', async () => {
|
|
690
|
-
const noResult = await (0, _index.createCorrectResponseSession)(question, {
|
|
691
|
-
mode: 'evaluate',
|
|
692
|
-
role: 'instructor'
|
|
693
|
-
});
|
|
694
|
-
expect(noResult).toBeNull();
|
|
695
|
-
});
|
|
696
|
-
it('returns null if role is student', async () => {
|
|
697
|
-
const noResult = await (0, _index.createCorrectResponseSession)(question, {
|
|
698
|
-
mode: 'gather',
|
|
699
|
-
role: 'student'
|
|
700
|
-
});
|
|
701
|
-
expect(noResult).toBeNull();
|
|
702
|
-
});
|
|
703
|
-
});
|
|
704
|
-
});
|
|
705
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaW5kZXgiLCJyZXF1aXJlIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsImRlc2NyaWJlIiwicmVzdWx0IiwicXVlc3Rpb24iLCJzZXNzaW9uIiwiZW52IiwiYmVmb3JlRWFjaCIsImRpc3BsYXlUeXBlIiwibGFuZ3VhZ2UiLCJsb2NrQ2hvaWNlT3JkZXIiLCJjaG9pY2VzIiwiY29ycmVjdCIsInZhbHVlIiwibGFiZWwiLCJyYXRpb25hbGUiLCJlbGVtZW50IiwicHJvbXB0Iiwic2NvcmluZ1R5cGUiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zIiwic3R1ZGVudEluc3RydWN0aW9ucyIsInBhcnRpYWxTY29yaW5nIiwibWFya3VwIiwiaWQiLCJhbHRlcm5hdGVSZXNwb25zZXMiLCJpdCIsIm1vZGUiLCJyIiwibW9kZWwiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInVwZGF0ZVNlc3Npb24iLCJqZXN0IiwiZm4iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwib2JqZWN0Q29udGFpbmluZyIsInNodWZmbGVkVmFsdWVzIiwiYXJyYXlDb250YWluaW5nIiwicSIsIm0iLCJ0b0VxdWFsIiwiZmVlZGJhY2siLCJyZXNwb25zZUNvcnJlY3QiLCJyZXR1cm5Nb2RlbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUiLCJhc3NlcnRHYXRoZXIiLCJleHRyYSIsImV4cGVjdGVkIiwiYWx0ZXJuYXRlUmVzcG9uc2UiLCJkaXNhYmxlZCIsInByb21wdEVuYWJsZWQiLCJyYXRpb25hbGVFbmFibGVkIiwidGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQiLCJzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZCIsImFzc2VydFZpZXciLCJyb2xlIiwiY2hvaWNlUmF0aW9uYWxlRW5hYmxlZCIsImFzc2VydFZpZXdTdHVkZW50IiwiYXNzZXJ0RXZhbHVhdGUiLCJhc3NlcnRTY29yZSIsInNjb3JlIiwiZ2V0U2NvcmUiLCJyZXR1cm5TY29yZSIsImFzc2VydE91dGNvbWUiLCJtZXNzYWdlIiwic2Vzc2lvblZhbHVlIiwib3V0Y29tZSIsImVtcHR5Iiwic2VzcyIsImNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24iLCJub1Jlc3VsdCIsInRvQmVOdWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9pbmRleC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNjb3JlLCBvdXRjb21lLCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uLCBtb2RlbCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5cbmRlc2NyaWJlKCdpbmxpbmUtZHJvcGRvd24nLCAoKSA9PiB7XG4gIGxldCByZXN1bHQsIHF1ZXN0aW9uLCBzZXNzaW9uLCBlbnY7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcXVlc3Rpb24gPSB7XG4gICAgICBkaXNwbGF5VHlwZTogJ2Jsb2NrJyxcbiAgICAgIGxhbmd1YWdlOiAnZW5nbGlzaCcsXG4gICAgICBsb2NrQ2hvaWNlT3JkZXI6IGZhbHNlLFxuICAgICAgY2hvaWNlczoge1xuICAgICAgICAwOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTUnLFxuICAgICAgICAgICAgbGFiZWw6ICcyMCwwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTYnLFxuICAgICAgICAgICAgbGFiZWw6ICcxNywwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJzk3MTkzOTcnLFxuICAgICAgICAgICAgbGFiZWw6ICcxNiwxMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ycmVjdDogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnOTcxOTM5OCcsXG4gICAgICAgICAgICBsYWJlbDogJzE2LDAwMCcsXG4gICAgICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZm9yIGNob2ljZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBlbGVtZW50OiAnaW5saW5lLWRyb3Bkb3duLWVsZW1lbnQnLFxuICAgICAgcmF0aW9uYWxlOiAnJyxcbiAgICAgIHByb21wdDpcbiAgICAgICAgJzxwPlxcbiAgPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwOyBmb250LWZhbWlseTogQXJpYWw7XCI+RWwgbsO6bWVybyAxNiwxMDE8L3NwYW4+PC9zdHJvbmc+IDxzdHJvbmc+PHNwYW4gc3R5bGU9XCJjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IEFyaWFsO1wiPnJlZG9uZGVhZG8gYWw8L3NwYW4+PC9zdHJvbmc+IDxzdHJvbmc+PHNwYW4gc3R5bGU9XCJjb2xvcjogIzAwMDAwMDsgZm9udC1mYW1pbHk6IEFyaWFsO1wiPm1pbGxhciBtw6FzIGNlcmNhbm8gZXMmbmJzcDtfX19fX19fX19fX19fXy48L3NwYW4+PC9zdHJvbmc+XFxuPC9wPlxcbjxwPlxcbiAgPHN0cm9uZz48c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwMDAwO1wiPiZuYnNwOzwvc3Bhbj48L3N0cm9uZz5cXG48L3A+JyxcbiAgICAgIHNjb3JpbmdUeXBlOiAnYXV0bycsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiB0cnVlLFxuICAgICAgc3R1ZGVudEluc3RydWN0aW9uczogZmFsc2UsXG4gICAgICBwYXJ0aWFsU2NvcmluZzogZmFsc2UsXG4gICAgICBtYXJrdXA6ICd7ezB9fScsXG4gICAgICBpZDogJzI0MjEzMTAnLFxuICAgICAgYWx0ZXJuYXRlUmVzcG9uc2VzOiBudWxsLFxuICAgIH07XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCdpcyBvayBpcyBzZXNzaW9uIGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgZW52ID0geyBtb2RlOiAnZXZhbHVhdGUnIH07XG4gICAgICBjb25zdCByID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHt9LCB7IG1vZGU6ICdldmFsdWF0ZScgfSk7XG4gICAgICBleHBlY3QocikudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21vZGVsIC0gd2l0aCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyB1cGRhdGVTZXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHsgaWQ6ICcxJywgZWxlbWVudDogJ2lubGluZS1kcm9wZG93bi1lbGVtZW50JyB9O1xuICAgICAgZW52ID0geyBtb2RlOiAnZ2F0aGVyJyB9O1xuICAgICAgY29uc3QgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuICAgICAgYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudiwgdXBkYXRlU2Vzc2lvbik7XG4gICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICcxJyxcbiAgICAgICAgJ2lubGluZS1kcm9wZG93bi1lbGVtZW50JyxcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHNodWZmbGVkVmFsdWVzOiB7IDA6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWyc5NzE5Mzk1JywgJzk3MTkzOTYnLCAnOTcxOTM5NycsICc5NzE5Mzk4J10pIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuY29uc3QgcXVlc3Rpb24gPSB7XG4gIGRpc3BsYXlUeXBlOiAnYmxvY2snLFxuICBsYW5ndWFnZTogJ2VuZ2xpc2gnLFxuICBwcm9tcHQ6ICdVc2UgdGhlIGRyb3AtZG93bnMgdG8gY29tcGxldGUgdGhlIHNlbnRlbmNlJyxcbiAgbWFya3VwOiAnPGRpdj48cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD48L2Rpdj4nLFxuICBjaG9pY2VzOiB7XG4gICAgMDogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvdyAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgY293JyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZG9nICcsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgZG9nJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgY2F0JyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICAxOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnb3ZlciAnLFxuICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgb3ZlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3VuZGVyICcsXG4gICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGU6ICdyYXRpb25hbGUgdW5kZXInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdhY3Jvc3MgJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBhY3Jvc3MnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIDI6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBtb29uJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgY29ycmVjdDogZmFsc2UsXG4gICAgICAgIHJhdGlvbmFsZTogJ3JhdGlvbmFsZSBzdW4nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdob3VzZSAnLFxuICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlOiAncmF0aW9uYWxlIGhvdXNlJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgbGV0IHE7XG4gICAgY29uc3QgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuXG4gICAgaXQoJ291dHB1dCB3aGVuIHNlc3Npb24gaXMgZGVmaW5lZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBhd2FpdCBtb2RlbChxdWVzdGlvbiwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzAnIH0gfSwgeyBtb2RlOiAnZXZhbHVhdGUnIH0sIHVwZGF0ZVNlc3Npb24pO1xuXG4gICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBvdXRwdXQgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIHsgbW9kZTogJ2V2YWx1YXRlJyB9LCB1cGRhdGVTZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBmZWVkYmFjazogeyAwOiAnaW5jb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuXG4gICAgY29uc3QgY2hvaWNlc1dpdGhOdWxsUmF0aW9uYWxlID0ge1xuICAgICAgMDogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdjb3cgJyxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdkb2cgJyxcbiAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnY2F0ICcsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdvdmVyICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAndW5kZXIgJyxcbiAgICAgICAgICB2YWx1ZTogJzEnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnYWNyb3NzICcsXG4gICAgICAgICAgdmFsdWU6ICcyJyxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgMjogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdtb29uICcsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnc3VuJyxcbiAgICAgICAgICB2YWx1ZTogJzInLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnaG91c2UgJyxcbiAgICAgICAgICB2YWx1ZTogJzMnLFxuICAgICAgICAgIGNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIHJhdGlvbmFsZTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2VydEdhdGhlciA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IGdhdGhlciwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG1vZGU6ICdnYXRoZXInIH0sXG4gICAgICAgICAgdXBkYXRlU2Vzc2lvbixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgZmVlZGJhY2s6IHt9LFxuICAgICAgICAgIHJlc3BvbnNlQ29ycmVjdDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNob2ljZXM6IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIG5vdCBzZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0VmlldyA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IHZpZXcsICR7bGFiZWx9J2AsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcSA9IHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBhbHRlcm5hdGVSZXNwb25zZTogeyAyOiBbJzInXSB9LFxuICAgICAgICAgIGxvY2tDaG9pY2VPcmRlcjogdHJ1ZSxcbiAgICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHJhdGlvbmFsZTogJ1JhdGlvbmFsZScsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAndmlldycsIHJvbGU6ICdpbnN0cnVjdG9yJyB9LFxuICAgICAgICAgIHVwZGF0ZVNlc3Npb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkLCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBhbmQgY2hvaWNlUmF0aW9uYWxlRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBjaG9pY2VSYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcHJvbXB0OiBudWxsLFxuICAgICAgICByYXRpb25hbGU6IG51bGwsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IG51bGwsXG4gICAgICAgIGNob2ljZXM6IGNob2ljZXNXaXRoTnVsbFJhdGlvbmFsZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFZpZXcoXG4gICAgICAnICsgcm9sZTogaW5zdHJ1Y3RvciwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCwgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgYW5kIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXdTdHVkZW50ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDI6IFsnMiddIH0sXG4gICAgICAgICAgbG9ja0Nob2ljZU9yZGVyOiB0cnVlLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7IGlkOiAnMScsIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsIC4uLnNlc3Npb24gfSxcbiAgICAgICAgICB7IG1vZGU6ICd2aWV3Jywgcm9sZTogJ3N0dWRlbnQnIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgbW9kZTogJ3ZpZXcnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzV2l0aE51bGxSYXRpb25hbGUsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXdTdHVkZW50KFxuICAgICAgJyArIHJvbGU6IHN0dWRlbnQsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogbnVsbCxcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0Vmlld1N0dWRlbnQoXG4gICAgICAnICsgcm9sZTogc3R1ZGVudCwgcHJvbXB0RW5hYmxlZCwgcmF0aW9uYWxlRW5hYmxlZCBhbmQgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQgdW5zZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBudWxsLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgYXNzZXJ0RXZhbHVhdGUgPSAobGFiZWwsIGV4dHJhLCBzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCdtb2RlOiBldmFsdWF0ZSwgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGFsdGVybmF0ZVJlc3BvbnNlOiB7IDA6IFsnMiddLCAxOiBbJzInXSwgMjogWycyJ10gfSxcbiAgICAgICAgICBsb2NrQ2hvaWNlT3JkZXI6IHRydWUsXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIGNob2ljZVJhdGlvbmFsZUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgLi4uZXh0cmEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAgeyBpZDogJzEnLCBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLCAuLi5zZXNzaW9uIH0sXG4gICAgICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCByb2xlOiAnaW5zdHJ1Y3RvcicgfSxcbiAgICAgICAgICB1cGRhdGVTZXNzaW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICBtb2RlOiAnZXZhbHVhdGUnLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIC4uLmV4cGVjdGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRFdmFsdWF0ZShcbiAgICAgICctIGNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgICAxOiAnMCcsXG4gICAgICAgICAgMjogJzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRFdmFsdWF0ZShcbiAgICAgICctIHBhcnRpYWxseSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMCcsXG4gICAgICAgICAgMTogJzAnLFxuICAgICAgICAgIDI6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXIgdXNpbmcgYWx0ZXJuYXRlcycsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnMicsXG4gICAgICAgICAgMTogJzEnLFxuICAgICAgICAgIDI6ICcyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBpbmNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICcxJyxcbiAgICAgICAgICAxOiAnMScsXG4gICAgICAgICAgMjogJzEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0IHNjb3JlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydFNjb3JlID0gKHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdCgncmV0dXJuIHNjb3JlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBzY29yZSA9IGdldFNjb3JlKHF1ZXN0aW9uLCBzZXNzaW9uKTtcblxuICAgICAgICBleHBlY3Qoc2NvcmUpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0sIDEpO1xuXG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgMC42Nyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcxJywgMjogJzEnIH0gfSwgMC4zMyk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnMScsIDE6ICcxJywgMjogJzEnIH0gfSwgMCk7XG5cbiAgICBjb25zdCByZXR1cm5TY29yZSA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgc2NvcmUgPSAwIHdoZW4gc2Vzc2lvbiBpcyAke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KGdldFNjb3JlKHF1ZXN0aW9uLCBzZXNzaW9uKSkudG9FcXVhbCgwKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm5TY29yZSh1bmRlZmluZWQpO1xuICAgIHJldHVyblNjb3JlKG51bGwpO1xuICAgIHJldHVyblNjb3JlKHt9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ291dGNvbWUgcGFydGlhbFNjb3JpbmcgdGVzdCcsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKG1lc3NhZ2UsIGV4dHJhLCBzZXNzaW9uVmFsdWUsIGVudiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KG1lc3NhZ2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3V0Y29tZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2Vzc2lvblZhbHVlLFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKGV4cGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gdHJ1ZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwLjY3IH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBlbnYucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBlbnYucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnLCBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKHBhcnRpYWxTY29yaW5nLCBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgcGFydGlhbCBzY29yZSAke3BhcnRpYWxTY29yaW5nID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICBwYXJ0aWFsU2NvcmluZyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKGV4cGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjY3LCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLjMzLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcwJywgMTogJzAnLCAyOiAnMCcgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnMCcsIDE6ICcwJywgMjogJzEnIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJzAnLCAxOiAnMScsIDI6ICcxJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICcxJywgMTogJzEnLCAyOiAnMScgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBjb25zdCByZXR1cm5Nb2RlbCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICBpdChgZW1wdHk6IHRydWUgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgb3V0Y29tZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KG0pLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBzY29yZTogMCwgZW1wdHk6IHRydWUgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBjb3JyZWN0IHJlc3BvbnNlIGlmIHJvbGUgaXMgaW5zdHJ1Y3RvciBhbmQgbW9kZSBpcyBnYXRoZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCByZXNwb25zZSBpZiByb2xlIGlzIGluc3RydWN0b3IgYW5kIG1vZGUgaXMgdmlldycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICd2aWV3JyxcbiAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzZXNzKS50b0VxdWFsKHsgaWQ6ICcxJywgdmFsdWU6IHsgMDogJzAnLCAxOiAnMCcsIDI6ICcwJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdldmFsdWF0ZScsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qobm9SZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBudWxsIGlmIHJvbGUgaXMgc3R1ZGVudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG5vUmVzdWx0ID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAnZ2F0aGVyJyxcbiAgICAgICAgcm9sZTogJ3N0dWRlbnQnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChub1Jlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBQyxzQkFBQSxD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LENBQUMsa0JBQWtCLEVBQUUsTUFBTTtJQUNqQ3VCLEVBQUUsQ0FBQyxtRUFBbUUsRUFBRSxZQUFZO01BQ2xGLE1BQU0rQyxJQUFJLEdBQUcsTUFBTSxJQUFBQyxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUN4RHNCLElBQUksRUFBRSxRQUFRO1FBQ2RpQyxJQUFJLEVBQUU7TUFDUixDQUFDLENBQUM7TUFFRjlCLE1BQU0sQ0FBQzJDLElBQUksQ0FBQyxDQUFDL0IsT0FBTyxDQUFDO1FBQUVsQixFQUFFLEVBQUUsR0FBRztRQUFFVixLQUFLLEVBQUU7VUFBRSxDQUFDLEVBQUUsR0FBRztVQUFFLENBQUMsRUFBRSxHQUFHO1VBQUUsQ0FBQyxFQUFFO1FBQUk7TUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUZZLEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxZQUFZO01BQ2hGLE1BQU0rQyxJQUFJLEdBQUcsTUFBTSxJQUFBQyxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUN4RHNCLElBQUksRUFBRSxNQUFNO1FBQ1ppQyxJQUFJLEVBQUU7TUFDUixDQUFDLENBQUM7TUFFRjlCLE1BQU0sQ0FBQzJDLElBQUksQ0FBQyxDQUFDL0IsT0FBTyxDQUFDO1FBQUVsQixFQUFFLEVBQUUsR0FBRztRQUFFVixLQUFLLEVBQUU7VUFBRSxDQUFDLEVBQUUsR0FBRztVQUFFLENBQUMsRUFBRSxHQUFHO1VBQUUsQ0FBQyxFQUFFO1FBQUk7TUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUZZLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFZO01BQ2pELE1BQU1pRCxRQUFRLEdBQUcsTUFBTSxJQUFBRCxtQ0FBNEIsRUFBQ3JFLFFBQVEsRUFBRTtRQUM1RHNCLElBQUksRUFBRSxVQUFVO1FBQ2hCaUMsSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BRUY5QixNQUFNLENBQUM2QyxRQUFRLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0lBRUZsRCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsWUFBWTtNQUNoRCxNQUFNaUQsUUFBUSxHQUFHLE1BQU0sSUFBQUQsbUNBQTRCLEVBQUNyRSxRQUFRLEVBQUU7UUFDNURzQixJQUFJLEVBQUUsUUFBUTtRQUNkaUMsSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUFDO01BRUY5QixNQUFNLENBQUM2QyxRQUFRLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
|