@pie-element/explicit-constructed-response 9.3.2-next.3 → 9.3.2-tip-tap.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/configure/CHANGELOG.md +11 -0
- package/configure/lib/__tests__/alternateResponses.test.js +335 -0
- package/configure/lib/__tests__/alternateSection.test.js +289 -0
- package/configure/lib/__tests__/ecr-toolbar.test.js +87 -0
- package/configure/lib/__tests__/main.test.js +320 -0
- package/configure/lib/__tests__/markupUtils.test.js +56 -0
- package/configure/lib/__tests__/utils.test.js +66 -0
- package/configure/lib/alternateResponses.js +1 -1
- package/configure/lib/alternateSection.js +3 -3
- package/configure/lib/alternateSection.js.map +1 -1
- package/configure/lib/defaults.js +1 -1
- package/configure/lib/ecr-toolbar.js +20 -23
- package/configure/lib/ecr-toolbar.js.map +1 -1
- package/configure/lib/index.js +1 -1
- package/configure/lib/main.js +11 -11
- package/configure/lib/main.js.map +1 -1
- package/configure/lib/markupUtils.js +1 -1
- package/configure/lib/utils.js +1 -1
- package/configure/package.json +5 -4
- package/controller/CHANGELOG.md +11 -0
- package/controller/lib/__tests__/index.spec.js +52 -0
- package/controller/lib/__tests__/index.test.js +1205 -0
- package/controller/lib/defaults.js +1 -1
- package/controller/lib/index.js +1 -1
- package/controller/package.json +1 -1
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/main.test.js +124 -0
- package/lib/index.js +1 -1
- package/lib/main.js +1 -1
- package/lib/main.js.map +1 -1
- package/lib/print.js +1 -1
- package/package.json +6 -5
- package/LICENSE.md +0 -5
- package/module/configure.js +0 -1
- package/module/controller.js +0 -7460
- package/module/demo.js +0 -45
- package/module/element.js +0 -1
- package/module/index.html +0 -21
- package/module/manifest.json +0 -22
- package/module/print-demo.js +0 -83
- package/module/print.html +0 -18
- package/module/print.js +0 -1
|
@@ -0,0 +1,1205 @@
|
|
|
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
|
+
jest.mock('@pie-lib/controller-utils', function () {
|
|
20
|
+
return {
|
|
21
|
+
getShuffledChoices: function getShuffledChoices(choices, session, updateSession, key) {
|
|
22
|
+
var currentShuffled = ((session || {}).shuffledValues || []).filter(function (v) {
|
|
23
|
+
return v;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
if (session && !currentShuffled.length && updateSession && typeof updateSession === 'function') {
|
|
27
|
+
updateSession();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return choices;
|
|
31
|
+
},
|
|
32
|
+
partialScoring: {
|
|
33
|
+
enabled: function enabled(config, env) {
|
|
34
|
+
config = config || {};
|
|
35
|
+
env = env || {};
|
|
36
|
+
|
|
37
|
+
if (config.partialScoring === false) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (env.partialScoring === false) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
var choice = function choice(l, v) {
|
|
52
|
+
return {
|
|
53
|
+
label: l,
|
|
54
|
+
value: v
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
var choices = {
|
|
59
|
+
0: [choice('cow', '0'), choice('cattle', '1'), choice('calf', '2')],
|
|
60
|
+
1: [choice('over', '0'), choice('past', '1'), choice('beyond', '2')],
|
|
61
|
+
2: [choice('moon', '0')]
|
|
62
|
+
};
|
|
63
|
+
var question = {
|
|
64
|
+
markup: '<p>The {{0}} jumped {{1}} the {{2}}</p>',
|
|
65
|
+
disabled: false,
|
|
66
|
+
choices: choices,
|
|
67
|
+
prompt: 'Complete the sentence',
|
|
68
|
+
note: 'The answer shown above is the most common correct answer for this item.',
|
|
69
|
+
language: 'english',
|
|
70
|
+
maxLengthPerChoiceEnabled: true,
|
|
71
|
+
playerSpellCheckEnabled: true,
|
|
72
|
+
displayType: 'block'
|
|
73
|
+
};
|
|
74
|
+
describe('controller', function () {
|
|
75
|
+
describe('model', function () {
|
|
76
|
+
var q, env;
|
|
77
|
+
it('output when session is defined', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
78
|
+
var m;
|
|
79
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
80
|
+
while (1) {
|
|
81
|
+
switch (_context.prev = _context.next) {
|
|
82
|
+
case 0:
|
|
83
|
+
_context.next = 2;
|
|
84
|
+
return (0, _index.model)(question, {
|
|
85
|
+
value: {
|
|
86
|
+
0: 'cow',
|
|
87
|
+
1: 'over',
|
|
88
|
+
2: 'moon'
|
|
89
|
+
}
|
|
90
|
+
}, {
|
|
91
|
+
mode: 'evaluate'
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
case 2:
|
|
95
|
+
m = _context.sent;
|
|
96
|
+
expect(m).toEqual(expect.objectContaining({
|
|
97
|
+
feedback: {
|
|
98
|
+
0: 'correct',
|
|
99
|
+
1: 'correct',
|
|
100
|
+
2: 'correct'
|
|
101
|
+
},
|
|
102
|
+
responseCorrect: true
|
|
103
|
+
}));
|
|
104
|
+
|
|
105
|
+
case 4:
|
|
106
|
+
case "end":
|
|
107
|
+
return _context.stop();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, _callee);
|
|
111
|
+
})));
|
|
112
|
+
|
|
113
|
+
var returnModel = function returnModel(session) {
|
|
114
|
+
it("output when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
115
|
+
var m;
|
|
116
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
117
|
+
while (1) {
|
|
118
|
+
switch (_context2.prev = _context2.next) {
|
|
119
|
+
case 0:
|
|
120
|
+
_context2.next = 2;
|
|
121
|
+
return (0, _index.model)(question, session, {
|
|
122
|
+
mode: 'evaluate'
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
case 2:
|
|
126
|
+
m = _context2.sent;
|
|
127
|
+
expect(m).toEqual(expect.objectContaining({
|
|
128
|
+
feedback: {
|
|
129
|
+
0: 'incorrect',
|
|
130
|
+
1: 'incorrect',
|
|
131
|
+
2: 'incorrect'
|
|
132
|
+
},
|
|
133
|
+
responseCorrect: false
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
case 4:
|
|
137
|
+
case "end":
|
|
138
|
+
return _context2.stop();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}, _callee2);
|
|
142
|
+
})));
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
returnModel(undefined);
|
|
146
|
+
returnModel(null);
|
|
147
|
+
returnModel({});
|
|
148
|
+
|
|
149
|
+
var assertGather = function assertGather(label, extra, session, expected) {
|
|
150
|
+
it("'mode: gather, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
151
|
+
var result;
|
|
152
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
153
|
+
while (1) {
|
|
154
|
+
switch (_context3.prev = _context3.next) {
|
|
155
|
+
case 0:
|
|
156
|
+
q = _objectSpread(_objectSpread({}, question), {}, {
|
|
157
|
+
teacherInstructions: 'Teacher Instructions',
|
|
158
|
+
rationale: 'Rationale'
|
|
159
|
+
}, extra);
|
|
160
|
+
env = {
|
|
161
|
+
mode: 'gather'
|
|
162
|
+
};
|
|
163
|
+
_context3.next = 4;
|
|
164
|
+
return (0, _index.model)(q, _objectSpread({
|
|
165
|
+
id: '1',
|
|
166
|
+
element: 'explicit-constructed-response'
|
|
167
|
+
}, session), env);
|
|
168
|
+
|
|
169
|
+
case 4:
|
|
170
|
+
result = _context3.sent;
|
|
171
|
+
expect(result).toEqual(_objectSpread(_objectSpread(_objectSpread({}, question), {}, {
|
|
172
|
+
disabled: false,
|
|
173
|
+
feedback: {},
|
|
174
|
+
responseCorrect: undefined,
|
|
175
|
+
maxLengthPerChoice: [10, 10, 7]
|
|
176
|
+
}, env), expected));
|
|
177
|
+
|
|
178
|
+
case 6:
|
|
179
|
+
case "end":
|
|
180
|
+
return _context3.stop();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}, _callee3);
|
|
184
|
+
})));
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled not set', {}, {}, {
|
|
188
|
+
rationale: _defaults["default"].rationale,
|
|
189
|
+
showNote: true,
|
|
190
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
191
|
+
});
|
|
192
|
+
assertGather('promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
193
|
+
promptEnabled: false,
|
|
194
|
+
rationaleEnabled: false,
|
|
195
|
+
teacherInstructionsEnabled: false,
|
|
196
|
+
studentInstructionsEnabled: false
|
|
197
|
+
}, {}, {
|
|
198
|
+
prompt: _defaults["default"].prompt,
|
|
199
|
+
rationale: _defaults["default"].rationale,
|
|
200
|
+
showNote: true,
|
|
201
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
var assertView = function assertView(label, extra, session, expected) {
|
|
205
|
+
it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
206
|
+
var result;
|
|
207
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
208
|
+
while (1) {
|
|
209
|
+
switch (_context4.prev = _context4.next) {
|
|
210
|
+
case 0:
|
|
211
|
+
q = _objectSpread(_objectSpread({}, question), {}, {
|
|
212
|
+
teacherInstructions: 'Teacher Instructions',
|
|
213
|
+
rationale: 'Rationale'
|
|
214
|
+
}, extra);
|
|
215
|
+
env = {
|
|
216
|
+
mode: 'view',
|
|
217
|
+
role: 'instructor'
|
|
218
|
+
};
|
|
219
|
+
_context4.next = 4;
|
|
220
|
+
return (0, _index.model)(q, _objectSpread({
|
|
221
|
+
id: '1',
|
|
222
|
+
element: 'explicit-constructed-response'
|
|
223
|
+
}, session), env);
|
|
224
|
+
|
|
225
|
+
case 4:
|
|
226
|
+
result = _context4.sent;
|
|
227
|
+
expect(result).toEqual(_objectSpread(_objectSpread(_objectSpread({}, question), {}, {
|
|
228
|
+
disabled: true,
|
|
229
|
+
feedback: {},
|
|
230
|
+
responseCorrect: undefined,
|
|
231
|
+
maxLengthPerChoice: [10, 10, 7]
|
|
232
|
+
}, env), expected));
|
|
233
|
+
|
|
234
|
+
case 6:
|
|
235
|
+
case "end":
|
|
236
|
+
return _context4.stop();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}, _callee4);
|
|
240
|
+
})));
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
244
|
+
promptEnabled: false,
|
|
245
|
+
rationaleEnabled: false,
|
|
246
|
+
teacherInstructionsEnabled: false,
|
|
247
|
+
studentInstructionsEnabled: false
|
|
248
|
+
}, {}, {
|
|
249
|
+
prompt: _defaults["default"].prompt,
|
|
250
|
+
rationale: _defaults["default"].rationale,
|
|
251
|
+
showNote: true,
|
|
252
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
253
|
+
});
|
|
254
|
+
assertView(' + role: instructor, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
|
|
255
|
+
teacherInstructions: 'Teacher Instructions',
|
|
256
|
+
showNote: true,
|
|
257
|
+
rationale: 'Rationale'
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
var assertViewStudent = function assertViewStudent(label, extra, session, expected) {
|
|
261
|
+
it("'mode: view, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
262
|
+
var result;
|
|
263
|
+
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
264
|
+
while (1) {
|
|
265
|
+
switch (_context5.prev = _context5.next) {
|
|
266
|
+
case 0:
|
|
267
|
+
q = _objectSpread(_objectSpread({}, question), {}, {
|
|
268
|
+
teacherInstructions: 'Teacher Instructions',
|
|
269
|
+
rationale: 'Rationale'
|
|
270
|
+
}, extra);
|
|
271
|
+
env = {
|
|
272
|
+
mode: 'view',
|
|
273
|
+
role: ' student'
|
|
274
|
+
};
|
|
275
|
+
_context5.next = 4;
|
|
276
|
+
return (0, _index.model)(q, _objectSpread({
|
|
277
|
+
id: '1',
|
|
278
|
+
element: 'explicit-constructed-response'
|
|
279
|
+
}, session), env);
|
|
280
|
+
|
|
281
|
+
case 4:
|
|
282
|
+
result = _context5.sent;
|
|
283
|
+
expect(result).toEqual(_objectSpread(_objectSpread(_objectSpread({}, question), {}, {
|
|
284
|
+
disabled: true,
|
|
285
|
+
feedback: {},
|
|
286
|
+
responseCorrect: undefined,
|
|
287
|
+
maxLengthPerChoice: [10, 10, 7]
|
|
288
|
+
}, env), expected));
|
|
289
|
+
|
|
290
|
+
case 6:
|
|
291
|
+
case "end":
|
|
292
|
+
return _context5.stop();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}, _callee5);
|
|
296
|
+
})));
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled set to false', {
|
|
300
|
+
promptEnabled: false,
|
|
301
|
+
rationaleEnabled: false,
|
|
302
|
+
teacherInstructionsEnabled: false,
|
|
303
|
+
studentInstructionsEnabled: false
|
|
304
|
+
}, {}, {
|
|
305
|
+
prompt: _defaults["default"].prompt,
|
|
306
|
+
rationale: _defaults["default"].rationale,
|
|
307
|
+
showNote: true,
|
|
308
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
309
|
+
});
|
|
310
|
+
assertViewStudent(' + role: student, promptEnabled, rationaleEnabled and teacherInstructionsEnabled unset', {}, {}, {
|
|
311
|
+
rationale: _defaults["default"].rationale,
|
|
312
|
+
showNote: true,
|
|
313
|
+
teacherInstructions: _defaults["default"].teacherInstructions
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
var assertEvaluate = function assertEvaluate(label, extra, session, expected) {
|
|
317
|
+
it("'mode: evaluate, ".concat(label, "'"), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
318
|
+
var result;
|
|
319
|
+
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
320
|
+
while (1) {
|
|
321
|
+
switch (_context6.prev = _context6.next) {
|
|
322
|
+
case 0:
|
|
323
|
+
q = _objectSpread(_objectSpread({}, question), {}, {
|
|
324
|
+
teacherInstructions: 'Teacher Instructions',
|
|
325
|
+
rationale: 'Rationale'
|
|
326
|
+
}, extra);
|
|
327
|
+
env = {
|
|
328
|
+
mode: 'evaluate',
|
|
329
|
+
role: 'instructor'
|
|
330
|
+
};
|
|
331
|
+
_context6.next = 4;
|
|
332
|
+
return (0, _index.model)(q, _objectSpread({
|
|
333
|
+
id: '1',
|
|
334
|
+
element: 'explicit-constructed-response'
|
|
335
|
+
}, session), env);
|
|
336
|
+
|
|
337
|
+
case 4:
|
|
338
|
+
result = _context6.sent;
|
|
339
|
+
expect(result).toEqual(_objectSpread(_objectSpread(_objectSpread({}, question), {}, {
|
|
340
|
+
teacherInstructions: 'Teacher Instructions',
|
|
341
|
+
rationale: 'Rationale',
|
|
342
|
+
disabled: true,
|
|
343
|
+
choices: {
|
|
344
|
+
0: [{
|
|
345
|
+
label: 'cow',
|
|
346
|
+
value: '0',
|
|
347
|
+
correct: true
|
|
348
|
+
}, {
|
|
349
|
+
label: 'cattle',
|
|
350
|
+
value: '1',
|
|
351
|
+
correct: true
|
|
352
|
+
}, {
|
|
353
|
+
label: 'calf',
|
|
354
|
+
value: '2',
|
|
355
|
+
correct: true
|
|
356
|
+
}],
|
|
357
|
+
1: [{
|
|
358
|
+
label: 'over',
|
|
359
|
+
value: '0',
|
|
360
|
+
correct: true
|
|
361
|
+
}, {
|
|
362
|
+
label: 'past',
|
|
363
|
+
value: '1',
|
|
364
|
+
correct: true
|
|
365
|
+
}, {
|
|
366
|
+
label: 'beyond',
|
|
367
|
+
value: '2',
|
|
368
|
+
correct: true
|
|
369
|
+
}],
|
|
370
|
+
2: [{
|
|
371
|
+
label: 'moon',
|
|
372
|
+
value: '0',
|
|
373
|
+
correct: true
|
|
374
|
+
}]
|
|
375
|
+
},
|
|
376
|
+
maxLengthPerChoice: [10, 10, 7]
|
|
377
|
+
}, env), expected));
|
|
378
|
+
|
|
379
|
+
case 6:
|
|
380
|
+
case "end":
|
|
381
|
+
return _context6.stop();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}, _callee6);
|
|
385
|
+
})));
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
assertEvaluate('- correct answer', {}, {
|
|
389
|
+
value: {
|
|
390
|
+
0: 'cow',
|
|
391
|
+
1: 'over',
|
|
392
|
+
2: 'moon'
|
|
393
|
+
}
|
|
394
|
+
}, {
|
|
395
|
+
feedback: {
|
|
396
|
+
0: 'correct',
|
|
397
|
+
1: 'correct',
|
|
398
|
+
2: 'correct'
|
|
399
|
+
},
|
|
400
|
+
showNote: true,
|
|
401
|
+
responseCorrect: true
|
|
402
|
+
});
|
|
403
|
+
assertEvaluate('- partially correct answer', {}, {
|
|
404
|
+
value: {
|
|
405
|
+
0: 'cow',
|
|
406
|
+
1: 'over',
|
|
407
|
+
2: 'sun'
|
|
408
|
+
}
|
|
409
|
+
}, {
|
|
410
|
+
feedback: {
|
|
411
|
+
0: 'correct',
|
|
412
|
+
1: 'correct',
|
|
413
|
+
2: 'incorrect'
|
|
414
|
+
},
|
|
415
|
+
showNote: true,
|
|
416
|
+
responseCorrect: false
|
|
417
|
+
});
|
|
418
|
+
assertEvaluate('- partially correct answer using alternates', {}, {
|
|
419
|
+
value: {
|
|
420
|
+
0: 'calf',
|
|
421
|
+
1: 'over',
|
|
422
|
+
2: 'sun'
|
|
423
|
+
}
|
|
424
|
+
}, {
|
|
425
|
+
feedback: {
|
|
426
|
+
0: 'correct',
|
|
427
|
+
1: 'correct',
|
|
428
|
+
2: 'incorrect'
|
|
429
|
+
},
|
|
430
|
+
showNote: true,
|
|
431
|
+
responseCorrect: false
|
|
432
|
+
});
|
|
433
|
+
assertEvaluate('- incorrect answer', {}, {
|
|
434
|
+
value: {
|
|
435
|
+
0: 'han',
|
|
436
|
+
1: 'above',
|
|
437
|
+
2: 'chicken'
|
|
438
|
+
}
|
|
439
|
+
}, {
|
|
440
|
+
feedback: {
|
|
441
|
+
0: 'incorrect',
|
|
442
|
+
1: 'incorrect',
|
|
443
|
+
2: 'incorrect'
|
|
444
|
+
},
|
|
445
|
+
showNote: true,
|
|
446
|
+
responseCorrect: false
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
describe('get score', function () {
|
|
450
|
+
var assertScore = function assertScore(session, expected) {
|
|
451
|
+
it('return score', function () {
|
|
452
|
+
var score = (0, _index.getScore)(question, session);
|
|
453
|
+
expect(score).toEqual(expected);
|
|
454
|
+
});
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
assertScore({
|
|
458
|
+
value: {
|
|
459
|
+
0: 'cow',
|
|
460
|
+
1: 'over',
|
|
461
|
+
2: 'moon'
|
|
462
|
+
}
|
|
463
|
+
}, 1);
|
|
464
|
+
assertScore({
|
|
465
|
+
value: {
|
|
466
|
+
0: 'cattle',
|
|
467
|
+
1: 'over',
|
|
468
|
+
2: 'moon'
|
|
469
|
+
}
|
|
470
|
+
}, 1);
|
|
471
|
+
assertScore({
|
|
472
|
+
value: {
|
|
473
|
+
0: 'calf',
|
|
474
|
+
1: 'over',
|
|
475
|
+
2: 'moon'
|
|
476
|
+
}
|
|
477
|
+
}, 1);
|
|
478
|
+
assertScore({
|
|
479
|
+
value: {
|
|
480
|
+
0: 'cow',
|
|
481
|
+
1: 'past',
|
|
482
|
+
2: 'moon'
|
|
483
|
+
}
|
|
484
|
+
}, 1);
|
|
485
|
+
assertScore({
|
|
486
|
+
value: {
|
|
487
|
+
0: 'cattle',
|
|
488
|
+
1: 'past',
|
|
489
|
+
2: 'moon'
|
|
490
|
+
}
|
|
491
|
+
}, 1);
|
|
492
|
+
assertScore({
|
|
493
|
+
value: {
|
|
494
|
+
0: 'calf',
|
|
495
|
+
1: 'past',
|
|
496
|
+
2: 'moon'
|
|
497
|
+
}
|
|
498
|
+
}, 1);
|
|
499
|
+
assertScore({
|
|
500
|
+
value: {
|
|
501
|
+
0: 'cow',
|
|
502
|
+
1: 'beyond',
|
|
503
|
+
2: 'moon'
|
|
504
|
+
}
|
|
505
|
+
}, 1);
|
|
506
|
+
assertScore({
|
|
507
|
+
value: {
|
|
508
|
+
0: 'cattle',
|
|
509
|
+
1: 'beyond',
|
|
510
|
+
2: 'moon'
|
|
511
|
+
}
|
|
512
|
+
}, 1);
|
|
513
|
+
assertScore({
|
|
514
|
+
value: {
|
|
515
|
+
0: 'calf',
|
|
516
|
+
1: 'beyond',
|
|
517
|
+
2: 'moon'
|
|
518
|
+
}
|
|
519
|
+
}, 1);
|
|
520
|
+
assertScore({
|
|
521
|
+
value: {
|
|
522
|
+
0: 'calf',
|
|
523
|
+
1: 'under',
|
|
524
|
+
2: 'moon'
|
|
525
|
+
}
|
|
526
|
+
}, 0.67);
|
|
527
|
+
assertScore({
|
|
528
|
+
value: {
|
|
529
|
+
0: 'cat',
|
|
530
|
+
1: 'under',
|
|
531
|
+
2: 'moon'
|
|
532
|
+
}
|
|
533
|
+
}, 0.33);
|
|
534
|
+
assertScore({
|
|
535
|
+
value: {
|
|
536
|
+
0: 'cat',
|
|
537
|
+
1: 'under',
|
|
538
|
+
2: 'sun'
|
|
539
|
+
}
|
|
540
|
+
}, 0);
|
|
541
|
+
|
|
542
|
+
var returnScore = function returnScore(session) {
|
|
543
|
+
it("score = 0 when session is ".concat(JSON.stringify(session)), function () {
|
|
544
|
+
expect((0, _index.getScore)(question, session)).toEqual(0);
|
|
545
|
+
});
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
returnScore(undefined);
|
|
549
|
+
returnScore(null);
|
|
550
|
+
returnScore({});
|
|
551
|
+
});
|
|
552
|
+
describe('outcome partialScoring test', function () {
|
|
553
|
+
var assertOutcome = function assertOutcome(message, extra, sessionValue, env, expected) {
|
|
554
|
+
it(message, /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
555
|
+
var result;
|
|
556
|
+
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
557
|
+
while (1) {
|
|
558
|
+
switch (_context7.prev = _context7.next) {
|
|
559
|
+
case 0:
|
|
560
|
+
_context7.next = 2;
|
|
561
|
+
return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), extra), sessionValue, env);
|
|
562
|
+
|
|
563
|
+
case 2:
|
|
564
|
+
result = _context7.sent;
|
|
565
|
+
expect(result).toEqual(expect.objectContaining(expected));
|
|
566
|
+
|
|
567
|
+
case 4:
|
|
568
|
+
case "end":
|
|
569
|
+
return _context7.stop();
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}, _callee7);
|
|
573
|
+
})));
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
assertOutcome('element.partialScoring = true', {
|
|
577
|
+
partialScoring: true
|
|
578
|
+
}, {
|
|
579
|
+
value: {
|
|
580
|
+
0: 'calf',
|
|
581
|
+
1: 'under',
|
|
582
|
+
2: 'moon'
|
|
583
|
+
}
|
|
584
|
+
}, {
|
|
585
|
+
mode: 'evaluate'
|
|
586
|
+
}, {
|
|
587
|
+
score: 0.67
|
|
588
|
+
});
|
|
589
|
+
assertOutcome('element.partialScoring = false', {
|
|
590
|
+
partialScoring: false
|
|
591
|
+
}, {
|
|
592
|
+
value: {
|
|
593
|
+
0: 'calf',
|
|
594
|
+
1: 'under',
|
|
595
|
+
2: 'moon'
|
|
596
|
+
}
|
|
597
|
+
}, {
|
|
598
|
+
mode: 'evaluate'
|
|
599
|
+
}, {
|
|
600
|
+
score: 0
|
|
601
|
+
});
|
|
602
|
+
assertOutcome('element.partialScoring = false, env.partialScoring = true', {
|
|
603
|
+
partialScoring: false
|
|
604
|
+
}, {
|
|
605
|
+
value: {
|
|
606
|
+
0: 'calf',
|
|
607
|
+
1: 'under',
|
|
608
|
+
2: 'moon'
|
|
609
|
+
}
|
|
610
|
+
}, {
|
|
611
|
+
mode: 'evaluate',
|
|
612
|
+
partialScoring: true
|
|
613
|
+
}, {
|
|
614
|
+
score: 0
|
|
615
|
+
});
|
|
616
|
+
assertOutcome('element.partialScoring = true, env.partialScoring = false', {
|
|
617
|
+
partialScoring: true
|
|
618
|
+
}, {
|
|
619
|
+
value: {
|
|
620
|
+
0: 'calf',
|
|
621
|
+
1: 'under',
|
|
622
|
+
2: 'moon'
|
|
623
|
+
}
|
|
624
|
+
}, {
|
|
625
|
+
mode: 'evaluate',
|
|
626
|
+
partialScoring: false
|
|
627
|
+
}, {
|
|
628
|
+
score: 0
|
|
629
|
+
});
|
|
630
|
+
});
|
|
631
|
+
describe('outcome', function () {
|
|
632
|
+
var assertOutcome = function assertOutcome(partialScoring, sessionValue, expected) {
|
|
633
|
+
it("partial score ".concat(partialScoring ? 'enabled' : ''), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
634
|
+
var result;
|
|
635
|
+
return _regenerator["default"].wrap(function _callee8$(_context8) {
|
|
636
|
+
while (1) {
|
|
637
|
+
switch (_context8.prev = _context8.next) {
|
|
638
|
+
case 0:
|
|
639
|
+
_context8.next = 2;
|
|
640
|
+
return (0, _index.outcome)(_objectSpread(_objectSpread({}, question), {}, {
|
|
641
|
+
partialScoring: partialScoring
|
|
642
|
+
}), sessionValue);
|
|
643
|
+
|
|
644
|
+
case 2:
|
|
645
|
+
result = _context8.sent;
|
|
646
|
+
expect(result).toEqual(expected);
|
|
647
|
+
|
|
648
|
+
case 4:
|
|
649
|
+
case "end":
|
|
650
|
+
return _context8.stop();
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}, _callee8);
|
|
654
|
+
})));
|
|
655
|
+
};
|
|
656
|
+
|
|
657
|
+
assertOutcome(true, {
|
|
658
|
+
value: {
|
|
659
|
+
0: 'cow',
|
|
660
|
+
1: 'over',
|
|
661
|
+
2: 'moon'
|
|
662
|
+
}
|
|
663
|
+
}, {
|
|
664
|
+
score: 1,
|
|
665
|
+
empty: false
|
|
666
|
+
});
|
|
667
|
+
assertOutcome(true, {
|
|
668
|
+
value: {
|
|
669
|
+
0: 'cattle',
|
|
670
|
+
1: 'over',
|
|
671
|
+
2: 'moon'
|
|
672
|
+
}
|
|
673
|
+
}, {
|
|
674
|
+
score: 1,
|
|
675
|
+
empty: false
|
|
676
|
+
});
|
|
677
|
+
assertOutcome(true, {
|
|
678
|
+
value: {
|
|
679
|
+
0: 'calf',
|
|
680
|
+
1: 'over',
|
|
681
|
+
2: 'moon'
|
|
682
|
+
}
|
|
683
|
+
}, {
|
|
684
|
+
score: 1,
|
|
685
|
+
empty: false
|
|
686
|
+
});
|
|
687
|
+
assertOutcome(true, {
|
|
688
|
+
value: {
|
|
689
|
+
0: 'cow',
|
|
690
|
+
1: 'past',
|
|
691
|
+
2: 'moon'
|
|
692
|
+
}
|
|
693
|
+
}, {
|
|
694
|
+
score: 1,
|
|
695
|
+
empty: false
|
|
696
|
+
});
|
|
697
|
+
assertOutcome(true, {
|
|
698
|
+
value: {
|
|
699
|
+
0: 'cattle',
|
|
700
|
+
1: 'past',
|
|
701
|
+
2: 'moon'
|
|
702
|
+
}
|
|
703
|
+
}, {
|
|
704
|
+
score: 1,
|
|
705
|
+
empty: false
|
|
706
|
+
});
|
|
707
|
+
assertOutcome(true, {
|
|
708
|
+
value: {
|
|
709
|
+
0: 'calf',
|
|
710
|
+
1: 'past',
|
|
711
|
+
2: 'moon'
|
|
712
|
+
}
|
|
713
|
+
}, {
|
|
714
|
+
score: 1,
|
|
715
|
+
empty: false
|
|
716
|
+
});
|
|
717
|
+
assertOutcome(true, {
|
|
718
|
+
value: {
|
|
719
|
+
0: 'cow',
|
|
720
|
+
1: 'beyond',
|
|
721
|
+
2: 'moon'
|
|
722
|
+
}
|
|
723
|
+
}, {
|
|
724
|
+
score: 1,
|
|
725
|
+
empty: false
|
|
726
|
+
});
|
|
727
|
+
assertOutcome(true, {
|
|
728
|
+
value: {
|
|
729
|
+
0: 'cattle',
|
|
730
|
+
1: 'beyond',
|
|
731
|
+
2: 'moon'
|
|
732
|
+
}
|
|
733
|
+
}, {
|
|
734
|
+
score: 1,
|
|
735
|
+
empty: false
|
|
736
|
+
});
|
|
737
|
+
assertOutcome(true, {
|
|
738
|
+
value: {
|
|
739
|
+
0: 'calf',
|
|
740
|
+
1: 'beyond',
|
|
741
|
+
2: 'moon'
|
|
742
|
+
}
|
|
743
|
+
}, {
|
|
744
|
+
score: 1,
|
|
745
|
+
empty: false
|
|
746
|
+
});
|
|
747
|
+
assertOutcome(true, {
|
|
748
|
+
value: {
|
|
749
|
+
0: 'calf',
|
|
750
|
+
1: 'under',
|
|
751
|
+
2: 'moon'
|
|
752
|
+
}
|
|
753
|
+
}, {
|
|
754
|
+
score: 0.67,
|
|
755
|
+
empty: false
|
|
756
|
+
});
|
|
757
|
+
assertOutcome(true, {
|
|
758
|
+
value: {
|
|
759
|
+
0: 'cat',
|
|
760
|
+
1: 'under',
|
|
761
|
+
2: 'moon'
|
|
762
|
+
}
|
|
763
|
+
}, {
|
|
764
|
+
score: 0.33,
|
|
765
|
+
empty: false
|
|
766
|
+
});
|
|
767
|
+
assertOutcome(true, {
|
|
768
|
+
value: {
|
|
769
|
+
0: 'cat',
|
|
770
|
+
1: 'under',
|
|
771
|
+
2: 'sun'
|
|
772
|
+
}
|
|
773
|
+
}, {
|
|
774
|
+
score: 0,
|
|
775
|
+
empty: false
|
|
776
|
+
});
|
|
777
|
+
assertOutcome(false, {
|
|
778
|
+
value: {
|
|
779
|
+
0: 'cow',
|
|
780
|
+
1: 'over',
|
|
781
|
+
2: 'moon'
|
|
782
|
+
}
|
|
783
|
+
}, {
|
|
784
|
+
score: 1,
|
|
785
|
+
empty: false
|
|
786
|
+
});
|
|
787
|
+
assertOutcome(false, {
|
|
788
|
+
value: {
|
|
789
|
+
0: 'cattle',
|
|
790
|
+
1: 'over',
|
|
791
|
+
2: 'moon'
|
|
792
|
+
}
|
|
793
|
+
}, {
|
|
794
|
+
score: 1,
|
|
795
|
+
empty: false
|
|
796
|
+
});
|
|
797
|
+
assertOutcome(false, {
|
|
798
|
+
value: {
|
|
799
|
+
0: 'calf',
|
|
800
|
+
1: 'over',
|
|
801
|
+
2: 'moon'
|
|
802
|
+
}
|
|
803
|
+
}, {
|
|
804
|
+
score: 1,
|
|
805
|
+
empty: false
|
|
806
|
+
});
|
|
807
|
+
assertOutcome(false, {
|
|
808
|
+
value: {
|
|
809
|
+
0: 'cow',
|
|
810
|
+
1: 'past',
|
|
811
|
+
2: 'moon'
|
|
812
|
+
}
|
|
813
|
+
}, {
|
|
814
|
+
score: 1,
|
|
815
|
+
empty: false
|
|
816
|
+
});
|
|
817
|
+
assertOutcome(false, {
|
|
818
|
+
value: {
|
|
819
|
+
0: 'cattle',
|
|
820
|
+
1: 'past',
|
|
821
|
+
2: 'moon'
|
|
822
|
+
}
|
|
823
|
+
}, {
|
|
824
|
+
score: 1,
|
|
825
|
+
empty: false
|
|
826
|
+
});
|
|
827
|
+
assertOutcome(false, {
|
|
828
|
+
value: {
|
|
829
|
+
0: 'calf',
|
|
830
|
+
1: 'past',
|
|
831
|
+
2: 'moon'
|
|
832
|
+
}
|
|
833
|
+
}, {
|
|
834
|
+
score: 1,
|
|
835
|
+
empty: false
|
|
836
|
+
});
|
|
837
|
+
assertOutcome(false, {
|
|
838
|
+
value: {
|
|
839
|
+
0: 'cow',
|
|
840
|
+
1: 'beyond',
|
|
841
|
+
2: 'moon'
|
|
842
|
+
}
|
|
843
|
+
}, {
|
|
844
|
+
score: 1,
|
|
845
|
+
empty: false
|
|
846
|
+
});
|
|
847
|
+
assertOutcome(false, {
|
|
848
|
+
value: {
|
|
849
|
+
0: 'cattle',
|
|
850
|
+
1: 'beyond',
|
|
851
|
+
2: 'moon'
|
|
852
|
+
}
|
|
853
|
+
}, {
|
|
854
|
+
score: 1,
|
|
855
|
+
empty: false
|
|
856
|
+
});
|
|
857
|
+
assertOutcome(false, {
|
|
858
|
+
value: {
|
|
859
|
+
0: 'calf',
|
|
860
|
+
1: 'beyond',
|
|
861
|
+
2: 'moon'
|
|
862
|
+
}
|
|
863
|
+
}, {
|
|
864
|
+
score: 1,
|
|
865
|
+
empty: false
|
|
866
|
+
});
|
|
867
|
+
assertOutcome(false, {
|
|
868
|
+
value: {
|
|
869
|
+
0: 'calf',
|
|
870
|
+
1: 'under',
|
|
871
|
+
2: 'moon'
|
|
872
|
+
}
|
|
873
|
+
}, {
|
|
874
|
+
score: 0,
|
|
875
|
+
empty: false
|
|
876
|
+
});
|
|
877
|
+
assertOutcome(false, {
|
|
878
|
+
value: {
|
|
879
|
+
0: 'cat',
|
|
880
|
+
1: 'under',
|
|
881
|
+
2: 'moon'
|
|
882
|
+
}
|
|
883
|
+
}, {
|
|
884
|
+
score: 0,
|
|
885
|
+
empty: false
|
|
886
|
+
});
|
|
887
|
+
assertOutcome(false, {
|
|
888
|
+
value: {
|
|
889
|
+
0: 'cat',
|
|
890
|
+
1: 'under',
|
|
891
|
+
2: 'sun'
|
|
892
|
+
}
|
|
893
|
+
}, {
|
|
894
|
+
score: 0,
|
|
895
|
+
empty: false
|
|
896
|
+
});
|
|
897
|
+
|
|
898
|
+
var returnModel = function returnModel(session) {
|
|
899
|
+
it("empty: true when session is ".concat(JSON.stringify(session)), /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
900
|
+
var m;
|
|
901
|
+
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
902
|
+
while (1) {
|
|
903
|
+
switch (_context9.prev = _context9.next) {
|
|
904
|
+
case 0:
|
|
905
|
+
_context9.next = 2;
|
|
906
|
+
return (0, _index.outcome)(question, session);
|
|
907
|
+
|
|
908
|
+
case 2:
|
|
909
|
+
m = _context9.sent;
|
|
910
|
+
expect(m).toEqual(expect.objectContaining({
|
|
911
|
+
score: 0,
|
|
912
|
+
empty: true
|
|
913
|
+
}));
|
|
914
|
+
|
|
915
|
+
case 4:
|
|
916
|
+
case "end":
|
|
917
|
+
return _context9.stop();
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
}, _callee9);
|
|
921
|
+
})));
|
|
922
|
+
};
|
|
923
|
+
|
|
924
|
+
returnModel(undefined);
|
|
925
|
+
returnModel(null);
|
|
926
|
+
returnModel({});
|
|
927
|
+
});
|
|
928
|
+
describe('prepareVal', function () {
|
|
929
|
+
it('should return empty string on null or undefined', function () {
|
|
930
|
+
expect((0, _index.prepareVal)(null)).toEqual('');
|
|
931
|
+
expect((0, _index.prepareVal)(undefined)).toEqual('');
|
|
932
|
+
});
|
|
933
|
+
it('should remove html tags', function () {
|
|
934
|
+
expect((0, _index.prepareVal)('<div>Foo Bar</div>')).toEqual('Foo Bar');
|
|
935
|
+
});
|
|
936
|
+
describe('correct response', function () {
|
|
937
|
+
var question;
|
|
938
|
+
beforeEach(function () {
|
|
939
|
+
question = {
|
|
940
|
+
choices: choices
|
|
941
|
+
};
|
|
942
|
+
});
|
|
943
|
+
it('returns correct response if env is correct', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
944
|
+
var sess;
|
|
945
|
+
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
946
|
+
while (1) {
|
|
947
|
+
switch (_context10.prev = _context10.next) {
|
|
948
|
+
case 0:
|
|
949
|
+
_context10.next = 2;
|
|
950
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
951
|
+
mode: 'gather',
|
|
952
|
+
role: 'instructor'
|
|
953
|
+
});
|
|
954
|
+
|
|
955
|
+
case 2:
|
|
956
|
+
sess = _context10.sent;
|
|
957
|
+
expect(sess).toEqual({
|
|
958
|
+
id: '1',
|
|
959
|
+
value: {
|
|
960
|
+
0: 'cow',
|
|
961
|
+
1: 'over',
|
|
962
|
+
2: 'moon'
|
|
963
|
+
}
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
case 4:
|
|
967
|
+
case "end":
|
|
968
|
+
return _context10.stop();
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
}, _callee10);
|
|
972
|
+
})));
|
|
973
|
+
it('returns null env is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
974
|
+
var noResult;
|
|
975
|
+
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
976
|
+
while (1) {
|
|
977
|
+
switch (_context11.prev = _context11.next) {
|
|
978
|
+
case 0:
|
|
979
|
+
_context11.next = 2;
|
|
980
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
981
|
+
mode: 'gather',
|
|
982
|
+
role: 'student'
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
case 2:
|
|
986
|
+
noResult = _context11.sent;
|
|
987
|
+
expect(noResult).toBeNull();
|
|
988
|
+
|
|
989
|
+
case 4:
|
|
990
|
+
case "end":
|
|
991
|
+
return _context11.stop();
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
}, _callee11);
|
|
995
|
+
})));
|
|
996
|
+
});
|
|
997
|
+
});
|
|
998
|
+
describe('correct response', function () {
|
|
999
|
+
it('returns correct response if role is instructor and mode is gather', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
1000
|
+
var sess;
|
|
1001
|
+
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
1002
|
+
while (1) {
|
|
1003
|
+
switch (_context12.prev = _context12.next) {
|
|
1004
|
+
case 0:
|
|
1005
|
+
_context12.next = 2;
|
|
1006
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
1007
|
+
mode: 'gather',
|
|
1008
|
+
role: 'instructor'
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
case 2:
|
|
1012
|
+
sess = _context12.sent;
|
|
1013
|
+
expect(sess).toEqual({
|
|
1014
|
+
id: '1',
|
|
1015
|
+
value: {
|
|
1016
|
+
0: 'cow',
|
|
1017
|
+
1: 'over',
|
|
1018
|
+
2: 'moon'
|
|
1019
|
+
}
|
|
1020
|
+
});
|
|
1021
|
+
|
|
1022
|
+
case 4:
|
|
1023
|
+
case "end":
|
|
1024
|
+
return _context12.stop();
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
}, _callee12);
|
|
1028
|
+
})));
|
|
1029
|
+
it('returns correct response if role is instructor and mode is view', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
|
|
1030
|
+
var sess;
|
|
1031
|
+
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
1032
|
+
while (1) {
|
|
1033
|
+
switch (_context13.prev = _context13.next) {
|
|
1034
|
+
case 0:
|
|
1035
|
+
_context13.next = 2;
|
|
1036
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
1037
|
+
mode: 'view',
|
|
1038
|
+
role: 'instructor'
|
|
1039
|
+
});
|
|
1040
|
+
|
|
1041
|
+
case 2:
|
|
1042
|
+
sess = _context13.sent;
|
|
1043
|
+
expect(sess).toEqual({
|
|
1044
|
+
id: '1',
|
|
1045
|
+
value: {
|
|
1046
|
+
0: 'cow',
|
|
1047
|
+
1: 'over',
|
|
1048
|
+
2: 'moon'
|
|
1049
|
+
}
|
|
1050
|
+
});
|
|
1051
|
+
|
|
1052
|
+
case 4:
|
|
1053
|
+
case "end":
|
|
1054
|
+
return _context13.stop();
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}, _callee13);
|
|
1058
|
+
})));
|
|
1059
|
+
it('returns null if mode is evaluate', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
|
|
1060
|
+
var noResult;
|
|
1061
|
+
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
1062
|
+
while (1) {
|
|
1063
|
+
switch (_context14.prev = _context14.next) {
|
|
1064
|
+
case 0:
|
|
1065
|
+
_context14.next = 2;
|
|
1066
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
1067
|
+
mode: 'evaluate',
|
|
1068
|
+
role: 'instructor'
|
|
1069
|
+
});
|
|
1070
|
+
|
|
1071
|
+
case 2:
|
|
1072
|
+
noResult = _context14.sent;
|
|
1073
|
+
expect(noResult).toBeNull();
|
|
1074
|
+
|
|
1075
|
+
case 4:
|
|
1076
|
+
case "end":
|
|
1077
|
+
return _context14.stop();
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
}, _callee14);
|
|
1081
|
+
})));
|
|
1082
|
+
it('returns null if role is student', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
|
|
1083
|
+
var noResult;
|
|
1084
|
+
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
1085
|
+
while (1) {
|
|
1086
|
+
switch (_context15.prev = _context15.next) {
|
|
1087
|
+
case 0:
|
|
1088
|
+
_context15.next = 2;
|
|
1089
|
+
return (0, _index.createCorrectResponseSession)(question, {
|
|
1090
|
+
mode: 'gather',
|
|
1091
|
+
role: 'student'
|
|
1092
|
+
});
|
|
1093
|
+
|
|
1094
|
+
case 2:
|
|
1095
|
+
noResult = _context15.sent;
|
|
1096
|
+
expect(noResult).toBeNull();
|
|
1097
|
+
|
|
1098
|
+
case 4:
|
|
1099
|
+
case "end":
|
|
1100
|
+
return _context15.stop();
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
}, _callee15);
|
|
1104
|
+
})));
|
|
1105
|
+
});
|
|
1106
|
+
describe('prepareChoice', function () {
|
|
1107
|
+
var assertPrepareChoice = function assertPrepareChoice(env, defaultFeedback, choice, expected) {
|
|
1108
|
+
var preparChoiceFn = (0, _index.prepareChoice)(env.mode, defaultFeedback);
|
|
1109
|
+
it("prepare choices in ".concat(env.mode, " mode: ").concat(JSON.stringify(choice), " -> ").concat(JSON.stringify(expected)), function () {
|
|
1110
|
+
expect(preparChoiceFn(choice)).toEqual(expected);
|
|
1111
|
+
});
|
|
1112
|
+
};
|
|
1113
|
+
|
|
1114
|
+
assertPrepareChoice({
|
|
1115
|
+
mode: 'gather'
|
|
1116
|
+
}, {
|
|
1117
|
+
correct: 'Correct',
|
|
1118
|
+
incorrect: 'Incorrect'
|
|
1119
|
+
}, {
|
|
1120
|
+
value: '0',
|
|
1121
|
+
label: 'cow'
|
|
1122
|
+
}, {
|
|
1123
|
+
value: '0',
|
|
1124
|
+
label: 'cow'
|
|
1125
|
+
});
|
|
1126
|
+
assertPrepareChoice({
|
|
1127
|
+
mode: 'view'
|
|
1128
|
+
}, {
|
|
1129
|
+
correct: 'Correct',
|
|
1130
|
+
incorrect: 'Incorrect'
|
|
1131
|
+
}, {
|
|
1132
|
+
value: '0',
|
|
1133
|
+
label: 'cow'
|
|
1134
|
+
}, {
|
|
1135
|
+
value: '0',
|
|
1136
|
+
label: 'cow'
|
|
1137
|
+
});
|
|
1138
|
+
assertPrepareChoice({
|
|
1139
|
+
mode: 'evaluate'
|
|
1140
|
+
}, {
|
|
1141
|
+
correct: 'Correct',
|
|
1142
|
+
incorrect: 'Incorrect'
|
|
1143
|
+
}, {
|
|
1144
|
+
value: '0',
|
|
1145
|
+
label: 'cow'
|
|
1146
|
+
}, {
|
|
1147
|
+
value: '0',
|
|
1148
|
+
label: 'cow',
|
|
1149
|
+
correct: true
|
|
1150
|
+
});
|
|
1151
|
+
assertPrepareChoice({
|
|
1152
|
+
mode: 'evaluate'
|
|
1153
|
+
}, {
|
|
1154
|
+
correct: 'Correct',
|
|
1155
|
+
incorrect: 'Incorrect'
|
|
1156
|
+
}, {
|
|
1157
|
+
value: '0',
|
|
1158
|
+
label: 'cow',
|
|
1159
|
+
feedback: {
|
|
1160
|
+
type: 'default'
|
|
1161
|
+
}
|
|
1162
|
+
}, {
|
|
1163
|
+
value: '0',
|
|
1164
|
+
label: 'cow',
|
|
1165
|
+
correct: true,
|
|
1166
|
+
feedback: 'Correct'
|
|
1167
|
+
});
|
|
1168
|
+
assertPrepareChoice({
|
|
1169
|
+
mode: 'evaluate'
|
|
1170
|
+
}, {
|
|
1171
|
+
correct: 'Correct',
|
|
1172
|
+
incorrect: 'Incorrect'
|
|
1173
|
+
}, {
|
|
1174
|
+
value: '0',
|
|
1175
|
+
label: 'cow',
|
|
1176
|
+
feedback: {
|
|
1177
|
+
type: 'custom'
|
|
1178
|
+
}
|
|
1179
|
+
}, {
|
|
1180
|
+
value: '0',
|
|
1181
|
+
label: 'cow',
|
|
1182
|
+
correct: true,
|
|
1183
|
+
feedback: undefined
|
|
1184
|
+
});
|
|
1185
|
+
assertPrepareChoice({
|
|
1186
|
+
mode: 'evaluate'
|
|
1187
|
+
}, {
|
|
1188
|
+
correct: 'Correct',
|
|
1189
|
+
incorrect: 'Incorrect'
|
|
1190
|
+
}, {
|
|
1191
|
+
value: '0',
|
|
1192
|
+
label: 'cow',
|
|
1193
|
+
feedback: {
|
|
1194
|
+
type: 'custom',
|
|
1195
|
+
value: 'Custom Feedback'
|
|
1196
|
+
}
|
|
1197
|
+
}, {
|
|
1198
|
+
value: '0',
|
|
1199
|
+
label: 'cow',
|
|
1200
|
+
correct: true,
|
|
1201
|
+
feedback: 'Custom Feedback'
|
|
1202
|
+
});
|
|
1203
|
+
});
|
|
1204
|
+
});
|
|
1205
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsImdldFNodWZmbGVkQ2hvaWNlcyIsImNob2ljZXMiLCJzZXNzaW9uIiwidXBkYXRlU2Vzc2lvbiIsImtleSIsImN1cnJlbnRTaHVmZmxlZCIsInNodWZmbGVkVmFsdWVzIiwiZmlsdGVyIiwidiIsImxlbmd0aCIsInBhcnRpYWxTY29yaW5nIiwiZW5hYmxlZCIsImNvbmZpZyIsImVudiIsImNob2ljZSIsImwiLCJsYWJlbCIsInZhbHVlIiwicXVlc3Rpb24iLCJtYXJrdXAiLCJkaXNhYmxlZCIsInByb21wdCIsIm5vdGUiLCJsYW5ndWFnZSIsIm1heExlbmd0aFBlckNob2ljZUVuYWJsZWQiLCJwbGF5ZXJTcGVsbENoZWNrRW5hYmxlZCIsImRpc3BsYXlUeXBlIiwiZGVzY3JpYmUiLCJxIiwiaXQiLCJtb2RlIiwibSIsImV4cGVjdCIsInRvRXF1YWwiLCJvYmplY3RDb250YWluaW5nIiwiZmVlZGJhY2siLCJyZXNwb25zZUNvcnJlY3QiLCJyZXR1cm5Nb2RlbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJhc3NlcnRHYXRoZXIiLCJleHRyYSIsImV4cGVjdGVkIiwidGVhY2hlckluc3RydWN0aW9ucyIsInJhdGlvbmFsZSIsImlkIiwiZWxlbWVudCIsInJlc3VsdCIsIm1heExlbmd0aFBlckNob2ljZSIsImRlZmF1bHRzIiwic2hvd05vdGUiLCJwcm9tcHRFbmFibGVkIiwicmF0aW9uYWxlRW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwic3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQiLCJhc3NlcnRWaWV3Iiwicm9sZSIsImFzc2VydFZpZXdTdHVkZW50IiwiYXNzZXJ0RXZhbHVhdGUiLCJjb3JyZWN0IiwiYXNzZXJ0U2NvcmUiLCJzY29yZSIsInJldHVyblNjb3JlIiwiYXNzZXJ0T3V0Y29tZSIsIm1lc3NhZ2UiLCJzZXNzaW9uVmFsdWUiLCJlbXB0eSIsImJlZm9yZUVhY2giLCJzZXNzIiwibm9SZXN1bHQiLCJ0b0JlTnVsbCIsImFzc2VydFByZXBhcmVDaG9pY2UiLCJkZWZhdWx0RmVlZGJhY2siLCJwcmVwYXJDaG9pY2VGbiIsImluY29ycmVjdCIsInR5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTs7Ozs7O0FBRUFBLElBQUksQ0FBQ0MsSUFBTCxDQUFVLDJCQUFWLEVBQXVDO0FBQUEsU0FBTztBQUM1Q0MsSUFBQUEsa0JBQWtCLEVBQUUsNEJBQUNDLE9BQUQsRUFBVUMsT0FBVixFQUFtQkMsYUFBbkIsRUFBa0NDLEdBQWxDLEVBQTBDO0FBQzVELFVBQU1DLGVBQWUsR0FBRyxDQUFDLENBQUNILE9BQU8sSUFBSSxFQUFaLEVBQWdCSSxjQUFoQixJQUFrQyxFQUFuQyxFQUF1Q0MsTUFBdkMsQ0FBOEMsVUFBQ0MsQ0FBRDtBQUFBLGVBQU9BLENBQVA7QUFBQSxPQUE5QyxDQUF4Qjs7QUFFQSxVQUFJTixPQUFPLElBQUksQ0FBQ0csZUFBZSxDQUFDSSxNQUE1QixJQUFzQ04sYUFBdEMsSUFBdUQsT0FBT0EsYUFBUCxLQUF5QixVQUFwRixFQUFnRztBQUM5RkEsUUFBQUEsYUFBYTtBQUNkOztBQUVELGFBQU9GLE9BQVA7QUFDRCxLQVQyQztBQVU1Q1MsSUFBQUEsY0FBYyxFQUFFO0FBQ2RDLE1BQUFBLE9BQU8sRUFBRSxpQkFBQ0MsTUFBRCxFQUFTQyxHQUFULEVBQWlCO0FBQ3hCRCxRQUFBQSxNQUFNLEdBQUdBLE1BQU0sSUFBSSxFQUFuQjtBQUNBQyxRQUFBQSxHQUFHLEdBQUdBLEdBQUcsSUFBSSxFQUFiOztBQUVBLFlBQUlELE1BQU0sQ0FBQ0YsY0FBUCxLQUEwQixLQUE5QixFQUFxQztBQUNuQyxpQkFBTyxLQUFQO0FBQ0Q7O0FBRUQsWUFBSUcsR0FBRyxDQUFDSCxjQUFKLEtBQXVCLEtBQTNCLEVBQWtDO0FBQ2hDLGlCQUFPLEtBQVA7QUFDRDs7QUFFRCxlQUFPLElBQVA7QUFDRDtB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QUFFO0FBQXpCO0FBQXRDLEtBSGlCLEVBSWpCO0FBQUVBLE1BQUFBLEtBQUssRUFBRSxHQUFUO0FBQWNELE1BQUFBLEtBQUssRUFBRSxLQUFyQjtBQUE0QjRDLE1BQUFBLE9BQU8sRUFBRSxJQUFyQztBQUEyQ3pCLE1BQUFBLFFBQVEsRUFBRTtBQUFyRCxLQUppQixDQUFuQjtBQU1ELEdBbERPLENBQVI7QUFtREQsQ0F6a0JPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2RlbCwgZ2V0U2NvcmUsIG91dGNvbWUsIHByZXBhcmVWYWwsIGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24sIHByZXBhcmVDaG9pY2UgfSBmcm9tICcuLi9pbmRleCc7XG5cbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5cbmplc3QubW9jaygnQHBpZS1saWIvY29udHJvbGxlci11dGlscycsICgpID0+ICh7XG4gIGdldFNodWZmbGVkQ2hvaWNlczogKGNob2ljZXMsIHNlc3Npb24sIHVwZGF0ZVNlc3Npb24sIGtleSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTaHVmZmxlZCA9ICgoc2Vzc2lvbiB8fCB7fSkuc2h1ZmZsZWRWYWx1ZXMgfHwgW10pLmZpbHRlcigodikgPT4gdik7XG5cbiAgICBpZiAoc2Vzc2lvbiAmJiAhY3VycmVudFNodWZmbGVkLmxlbmd0aCAmJiB1cGRhdGVTZXNzaW9uICYmIHR5cGVvZiB1cGRhdGVTZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cGRhdGVTZXNzaW9uKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNob2ljZXM7XG4gIH0sXG4gIHBhcnRpYWxTY29yaW5nOiB7XG4gICAgZW5hYmxlZDogKGNvbmZpZywgZW52KSA9PiB7XG4gICAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgICBlbnYgPSBlbnYgfHwge307XG5cbiAgICAgIGlmIChjb25maWcucGFydGlhbFNjb3JpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudi5wYXJ0aWFsU2NvcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9LFxufSkpO1xuXG5jb25zdCBjaG9pY2UgPSAobCwgdikgPT4gKHsgbGFiZWw6IGwsIHZhbHVlOiB2IH0pO1xuY29uc3QgY2hvaWNlcyA9IHtcbiAgMDogW2Nob2ljZSgnY293JywgJzAnKSwgY2hvaWNlKCdjYXR0bGUnLCAnMScpLCBjaG9pY2UoJ2NhbGYnLCAnMicpXSxcbiAgMTogW2Nob2ljZSgnb3ZlcicsICcwJyksIGNob2ljZSgncGFzdCcsICcxJyksIGNob2ljZSgnYmV5b25kJywgJzInKV0sXG4gIDI6IFtjaG9pY2UoJ21vb24nLCAnMCcpXSxcbn07XG5cbmNvbnN0IHF1ZXN0aW9uID0ge1xuICBtYXJrdXA6ICc8cD5UaGUge3swfX0ganVtcGVkIHt7MX19IHRoZSB7ezJ9fTwvcD4nLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGNob2ljZXMsXG4gIHByb21wdDogJ0NvbXBsZXRlIHRoZSBzZW50ZW5jZScsXG4gIG5vdGU6ICdUaGUgYW5zd2VyIHNob3duIGFib3ZlIGlzIHRoZSBtb3N0IGNvbW1vbiBjb3JyZWN0IGFuc3dlciBmb3IgdGhpcyBpdGVtLicsXG4gIGxhbmd1YWdlOiAnZW5nbGlzaCcsXG4gIG1heExlbmd0aFBlckNob2ljZUVuYWJsZWQ6IHRydWUsXG4gIHBsYXllclNwZWxsQ2hlY2tFbmFibGVkOiB0cnVlLFxuICBkaXNwbGF5VHlwZTogJ2Jsb2NrJyxcbn07XG5cbmRlc2NyaWJlKCdjb250cm9sbGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbW9kZWwnLCAoKSA9PiB7XG4gICAgbGV0IHEsIGVudjtcblxuICAgIGl0KCdvdXRwdXQgd2hlbiBzZXNzaW9uIGlzIGRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBtb2RlOiAnZXZhbHVhdGUnIH0pO1xuXG4gICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGZlZWRiYWNrOiB7IDA6ICdjb3JyZWN0JywgMTogJ2NvcnJlY3QnLCAyOiAnY29ycmVjdCcgfSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBvdXRwdXQgd2hlbiBzZXNzaW9uIGlzICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbil9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtID0gYXdhaXQgbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIHsgbW9kZTogJ2V2YWx1YXRlJyB9KTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChcbiAgICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgICBmZWVkYmFjazogeyAwOiAnaW5jb3JyZWN0JywgMTogJ2luY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybk1vZGVsKHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuTW9kZWwobnVsbCk7XG4gICAgcmV0dXJuTW9kZWwoe30pO1xuXG4gICAgY29uc3QgYXNzZXJ0R2F0aGVyID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogZ2F0aGVyLCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdnYXRoZXInIH07XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwoXG4gICAgICAgICAgcSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgICAgZWxlbWVudDogJ2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJyxcbiAgICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIC4uLmVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIG5vdCBzZXQnLFxuICAgICAge30sXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0R2F0aGVyKFxuICAgICAgJ3Byb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogZGVmYXVsdHMucHJvbXB0LFxuICAgICAgICByYXRpb25hbGU6IGRlZmF1bHRzLnJhdGlvbmFsZSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IGRlZmF1bHRzLnRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRWaWV3ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICdpbnN0cnVjdG9yJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgIGZlZWRiYWNrOiB7fSxcbiAgICAgICAgICByZXNwb25zZUNvcnJlY3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIC4uLmVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCBzZXQgdG8gZmFsc2UnLFxuICAgICAge1xuICAgICAgICBwcm9tcHRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmF0aW9uYWxlRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc3R1ZGVudEluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBwcm9tcHQ6IGRlZmF1bHRzLnByb21wdCxcbiAgICAgICAgcmF0aW9uYWxlOiBkZWZhdWx0cy5yYXRpb25hbGUsXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiBkZWZhdWx0cy50ZWFjaGVySW5zdHJ1Y3Rpb25zLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0VmlldyhcbiAgICAgICcgKyByb2xlOiBpbnN0cnVjdG9yLCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zOiAnVGVhY2hlciBJbnN0cnVjdGlvbnMnLFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGFzc2VydFZpZXdTdHVkZW50ID0gKGxhYmVsLCBleHRyYSwgc2Vzc2lvbiwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAnbW9kZTogdmlldywgJHtsYWJlbH0nYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBxID0ge1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgfTtcbiAgICAgICAgZW52ID0geyBtb2RlOiAndmlldycsIHJvbGU6ICcgc3R1ZGVudCcgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtb2RlbChcbiAgICAgICAgICBxLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgICBlbGVtZW50OiAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudixcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHtcbiAgICAgICAgICAuLi5xdWVzdGlvbixcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBmZWVkYmFjazoge30sXG4gICAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4TGVuZ3RoUGVyQ2hvaWNlOiBbMTAsIDEwLCA3XSxcbiAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgLi4uZXhwZWN0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydFZpZXdTdHVkZW50KFxuICAgICAgJyArIHJvbGU6IHN0dWRlbnQsIHByb21wdEVuYWJsZWQsIHJhdGlvbmFsZUVuYWJsZWQgYW5kIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIHNldCB0byBmYWxzZScsXG4gICAgICB7XG4gICAgICAgIHByb21wdEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICByYXRpb25hbGVFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzdHVkZW50SW5zdHJ1Y3Rpb25zRW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHByb21wdDogZGVmYXVsdHMucHJvbXB0LFxuICAgICAgICByYXRpb25hbGU6IGRlZmF1bHRzLnJhdGlvbmFsZSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IGRlZmF1bHRzLnRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRWaWV3U3R1ZGVudChcbiAgICAgICcgKyByb2xlOiBzdHVkZW50LCBwcm9tcHRFbmFibGVkLCByYXRpb25hbGVFbmFibGVkIGFuZCB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCB1bnNldCcsXG4gICAgICB7fSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICByYXRpb25hbGU6IGRlZmF1bHRzLnJhdGlvbmFsZSxcbiAgICAgICAgc2hvd05vdGU6IHRydWUsXG4gICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IGRlZmF1bHRzLnRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBhc3NlcnRFdmFsdWF0ZSA9IChsYWJlbCwgZXh0cmEsIHNlc3Npb24sIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgJ21vZGU6IGV2YWx1YXRlLCAke2xhYmVsfSdgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHEgPSB7XG4gICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgdGVhY2hlckluc3RydWN0aW9uczogJ1RlYWNoZXIgSW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICByYXRpb25hbGU6ICdSYXRpb25hbGUnLFxuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICB9O1xuICAgICAgICBlbnYgPSB7IG1vZGU6ICdldmFsdWF0ZScsIHJvbGU6ICdpbnN0cnVjdG9yJyB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsKFxuICAgICAgICAgIHEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICAgIGVsZW1lbnQ6ICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZScsXG4gICAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW52LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6ICdUZWFjaGVyIEluc3RydWN0aW9ucycsXG4gICAgICAgICAgcmF0aW9uYWxlOiAnUmF0aW9uYWxlJyxcbiAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBjaG9pY2VzOiB7XG4gICAgICAgICAgICAwOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjb3cnLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYXR0bGUnLCB2YWx1ZTogJzEnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdjYWxmJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDE6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ292ZXInLCB2YWx1ZTogJzAnLCBjb3JyZWN0OiB0cnVlIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdwYXN0JywgdmFsdWU6ICcxJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnYmV5b25kJywgdmFsdWU6ICcyJywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIDI6IFt7IGxhYmVsOiAnbW9vbicsIHZhbHVlOiAnMCcsIGNvcnJlY3Q6IHRydWUgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXhMZW5ndGhQZXJDaG9pY2U6IFsxMCwgMTAsIDddLFxuICAgICAgICAgIC4uLmVudixcbiAgICAgICAgICAuLi5leHBlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBjb3JyZWN0IGFuc3dlcicsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY293JyxcbiAgICAgICAgICAxOiAnb3ZlcicsXG4gICAgICAgICAgMjogJ21vb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdjb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXInLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgMDogJ2NvdycsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBwYXJ0aWFsbHkgY29ycmVjdCBhbnN3ZXIgdXNpbmcgYWx0ZXJuYXRlcycsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAwOiAnY2FsZicsXG4gICAgICAgICAgMTogJ292ZXInLFxuICAgICAgICAgIDI6ICdzdW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2NvcnJlY3QnLCAxOiAnY29ycmVjdCcsIDI6ICdpbmNvcnJlY3QnIH0sXG4gICAgICAgIHNob3dOb3RlOiB0cnVlLFxuICAgICAgICByZXNwb25zZUNvcnJlY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0RXZhbHVhdGUoXG4gICAgICAnLSBpbmNvcnJlY3QgYW5zd2VyJyxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIDA6ICdoYW4nLFxuICAgICAgICAgIDE6ICdhYm92ZScsXG4gICAgICAgICAgMjogJ2NoaWNrZW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmVlZGJhY2s6IHsgMDogJ2luY29ycmVjdCcsIDE6ICdpbmNvcnJlY3QnLCAyOiAnaW5jb3JyZWN0JyB9LFxuICAgICAgICBzaG93Tm90ZTogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2VDb3JyZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldCBzY29yZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRTY29yZSA9IChzZXNzaW9uLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoJ3JldHVybiBzY29yZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NvcmUgPSBnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbik7XG5cbiAgICAgICAgZXhwZWN0KHNjb3JlKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIDEpO1xuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgMSk7XG4gICAgYXNzZXJ0U2NvcmUoeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCAxKTtcblxuICAgIGFzc2VydFNjb3JlKHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjY3KTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LCAwLjMzKTtcbiAgICBhc3NlcnRTY29yZSh7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIDApO1xuXG4gICAgY29uc3QgcmV0dXJuU2NvcmUgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgaXQoYHNjb3JlID0gMCB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChnZXRTY29yZShxdWVzdGlvbiwgc2Vzc2lvbikpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuU2NvcmUodW5kZWZpbmVkKTtcbiAgICByZXR1cm5TY29yZShudWxsKTtcbiAgICByZXR1cm5TY29yZSh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvdXRjb21lIHBhcnRpYWxTY29yaW5nIHRlc3QnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0T3V0Y29tZSA9IChtZXNzYWdlLCBleHRyYSwgc2Vzc2lvblZhbHVlLCBlbnYsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChtZXNzYWdlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG91dGNvbWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ucXVlc3Rpb24sXG4gICAgICAgICAgICAuLi5leHRyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25WYWx1ZSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyhleHBlY3RlZCkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IHRydWUnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogdHJ1ZSB9LFxuICAgICAgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgc2NvcmU6IDAuNjcgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0T3V0Y29tZShcbiAgICAgICdlbGVtZW50LnBhcnRpYWxTY29yaW5nID0gZmFsc2UnLFxuICAgICAgeyBwYXJ0aWFsU2NvcmluZzogZmFsc2UgfSxcbiAgICAgIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAndW5kZXInLCAyOiAnbW9vbicgfSB9LFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IHNjb3JlOiAwIH0sXG4gICAgKTtcblxuICAgIGFzc2VydE91dGNvbWUoXG4gICAgICAnZWxlbWVudC5wYXJ0aWFsU2NvcmluZyA9IGZhbHNlLCBlbnYucGFydGlhbFNjb3JpbmcgPSB0cnVlJyxcbiAgICAgIHsgcGFydGlhbFNjb3Jpbmc6IGZhbHNlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IHRydWUsXG4gICAgICB9LFxuICAgICAgeyBzY29yZTogMCB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRPdXRjb21lKFxuICAgICAgJ2VsZW1lbnQucGFydGlhbFNjb3JpbmcgPSB0cnVlLCBlbnYucGFydGlhbFNjb3JpbmcgPSBmYWxzZScsXG4gICAgICB7IHBhcnRpYWxTY29yaW5nOiB0cnVlIH0sXG4gICAgICB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSxcbiAgICAgIHtcbiAgICAgICAgbW9kZTogJ2V2YWx1YXRlJyxcbiAgICAgICAgcGFydGlhbFNjb3Jpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgc2NvcmU6IDAgfSxcbiAgICApO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3V0Y29tZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPdXRjb21lID0gKHBhcnRpYWxTY29yaW5nLCBzZXNzaW9uVmFsdWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBpdChgcGFydGlhbCBzY29yZSAke3BhcnRpYWxTY29yaW5nID8gJ2VuYWJsZWQnIDogJyd9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXRjb21lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnF1ZXN0aW9uLFxuICAgICAgICAgICAgcGFydGlhbFNjb3JpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uVmFsdWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhdHRsZScsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdvdmVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NhbGYnLCAxOiAncGFzdCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKHRydWUsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnYmV5b25kJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZSh0cnVlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC42NywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMC4zMywgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUodHJ1ZSwgeyB2YWx1ZTogeyAwOiAnY2F0JywgMTogJ3VuZGVyJywgMjogJ3N1bicgfSB9LCB7IHNjb3JlOiAwLCBlbXB0eTogZmFsc2UgfSk7XG5cbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXR0bGUnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY293JywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ3Bhc3QnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2FsZicsIDE6ICdwYXN0JywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMSwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NvdycsIDE6ICdiZXlvbmQnLCAyOiAnbW9vbicgfSB9LCB7IHNjb3JlOiAxLCBlbXB0eTogZmFsc2UgfSk7XG4gICAgYXNzZXJ0T3V0Y29tZShmYWxzZSwgeyB2YWx1ZTogeyAwOiAnY2F0dGxlJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ2JleW9uZCcsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDEsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYWxmJywgMTogJ3VuZGVyJywgMjogJ21vb24nIH0gfSwgeyBzY29yZTogMCwgZW1wdHk6IGZhbHNlIH0pO1xuICAgIGFzc2VydE91dGNvbWUoZmFsc2UsIHsgdmFsdWU6IHsgMDogJ2NhdCcsIDE6ICd1bmRlcicsIDI6ICdtb29uJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcbiAgICBhc3NlcnRPdXRjb21lKGZhbHNlLCB7IHZhbHVlOiB7IDA6ICdjYXQnLCAxOiAndW5kZXInLCAyOiAnc3VuJyB9IH0sIHsgc2NvcmU6IDAsIGVtcHR5OiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IHJldHVybk1vZGVsID0gKHNlc3Npb24pID0+IHtcbiAgICAgIGl0KGBlbXB0eTogdHJ1ZSB3aGVuIHNlc3Npb24gaXMgJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBhd2FpdCBvdXRjb21lKHF1ZXN0aW9uLCBzZXNzaW9uKTtcblxuICAgICAgICBleHBlY3QobSkudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHNjb3JlOiAwLCBlbXB0eTogdHJ1ZSB9KSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuTW9kZWwodW5kZWZpbmVkKTtcbiAgICByZXR1cm5Nb2RlbChudWxsKTtcbiAgICByZXR1cm5Nb2RlbCh7fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcmVwYXJlVmFsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IHN0cmluZyBvbiBudWxsIG9yIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKG51bGwpKS50b0VxdWFsKCcnKTtcbiAgICAgIGV4cGVjdChwcmVwYXJlVmFsKHVuZGVmaW5lZCkpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgaHRtbCB0YWdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHByZXBhcmVWYWwoJzxkaXY+Rm9vIEJhcjwvZGl2PicpKS50b0VxdWFsKCdGb28gQmFyJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICAgIGxldCBxdWVzdGlvbjtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBxdWVzdGlvbiA9IHtcbiAgICAgICAgICBjaG9pY2VzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgZW52IGlzIGNvcnJlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgbW9kZTogJ2dhdGhlcicsXG4gICAgICAgICAgcm9sZTogJ2luc3RydWN0b3InLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyBudWxsIGVudiBpcyBzdHVkZW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcbiAgICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb3JyZWN0IHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIGdhdGhlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlc3MgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7XG4gICAgICAgIG1vZGU6ICdnYXRoZXInLFxuICAgICAgICByb2xlOiAnaW5zdHJ1Y3RvcicsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHNlc3MpLnRvRXF1YWwoeyBpZDogJzEnLCB2YWx1ZTogeyAwOiAnY293JywgMTogJ292ZXInLCAyOiAnbW9vbicgfSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGNvcnJlY3QgcmVzcG9uc2UgaWYgcm9sZSBpcyBpbnN0cnVjdG9yIGFuZCBtb2RlIGlzIHZpZXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXNzID0gYXdhaXQgY3JlYXRlQ29ycmVjdFJlc3BvbnNlU2Vzc2lvbihxdWVzdGlvbiwge1xuICAgICAgICBtb2RlOiAndmlldycsXG4gICAgICAgIHJvbGU6ICdpbnN0cnVjdG9yJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qoc2VzcykudG9FcXVhbCh7IGlkOiAnMScsIHZhbHVlOiB7IDA6ICdjb3cnLCAxOiAnb3ZlcicsIDI6ICdtb29uJyB9IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiBtb2RlIGlzIGV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9SZXN1bHQgPSBhd2FpdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uKHF1ZXN0aW9uLCB7IG1vZGU6ICdldmFsdWF0ZScsIHJvbGU6ICdpbnN0cnVjdG9yJyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgbnVsbCBpZiByb2xlIGlzIHN0dWRlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub1Jlc3VsdCA9IGF3YWl0IGNyZWF0ZUNvcnJlY3RSZXNwb25zZVNlc3Npb24ocXVlc3Rpb24sIHsgbW9kZTogJ2dhdGhlcicsIHJvbGU6ICdzdHVkZW50JyB9KTtcblxuICAgICAgZXhwZWN0KG5vUmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJlcGFyZUNob2ljZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRQcmVwYXJlQ2hvaWNlID0gKGVudiwgZGVmYXVsdEZlZWRiYWNrLCBjaG9pY2UsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBjb25zdCBwcmVwYXJDaG9pY2VGbiA9IHByZXBhcmVDaG9pY2UoZW52Lm1vZGUsIGRlZmF1bHRGZWVkYmFjayk7XG5cbiAgICAgIGl0KGBwcmVwYXJlIGNob2ljZXMgaW4gJHtlbnYubW9kZX0gbW9kZTogJHtKU09OLnN0cmluZ2lmeShjaG9pY2UpfSAtPiAke0pTT04uc3RyaW5naWZ5KGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChwcmVwYXJDaG9pY2VGbihjaG9pY2UpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZ2F0aGVyJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAndmlldycgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycgfSxcbiAgICApO1xuXG4gICAgYXNzZXJ0UHJlcGFyZUNob2ljZShcbiAgICAgIHsgbW9kZTogJ2V2YWx1YXRlJyB9LFxuICAgICAgeyBjb3JyZWN0OiAnQ29ycmVjdCcsIGluY29ycmVjdDogJ0luY29ycmVjdCcgfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdkZWZhdWx0JyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDb3JyZWN0JyB9LFxuICAgICk7XG5cbiAgICBhc3NlcnRQcmVwYXJlQ2hvaWNlKFxuICAgICAgeyBtb2RlOiAnZXZhbHVhdGUnIH0sXG4gICAgICB7IGNvcnJlY3Q6ICdDb3JyZWN0JywgaW5jb3JyZWN0OiAnSW5jb3JyZWN0JyB9LFxuICAgICAgeyB2YWx1ZTogJzAnLCBsYWJlbDogJ2NvdycsIGZlZWRiYWNrOiB7IHR5cGU6ICdjdXN0b20nIH0gfSxcbiAgICAgIHsgdmFsdWU6ICcwJywgbGFiZWw6ICdjb3cnLCBjb3JyZWN0OiB0cnVlLCBmZWVkYmFjazogdW5kZWZpbmVkIH0sXG4gICAgKTtcblxuICAgIGFzc2VydFByZXBhcmVDaG9pY2UoXG4gICAgICB7IG1vZGU6ICdldmFsdWF0ZScgfSxcbiAgICAgIHsgY29ycmVjdDogJ0NvcnJlY3QnLCBpbmNvcnJlY3Q6ICdJbmNvcnJlY3QnIH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgZmVlZGJhY2s6IHsgdHlwZTogJ2N1c3RvbScsIHZhbHVlOiAnQ3VzdG9tIEZlZWRiYWNrJyB9IH0sXG4gICAgICB7IHZhbHVlOiAnMCcsIGxhYmVsOiAnY293JywgY29ycmVjdDogdHJ1ZSwgZmVlZGJhY2s6ICdDdXN0b20gRmVlZGJhY2snIH0sXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|