@pie-element/inline-dropdown 8.3.4-next.3 → 9.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.js"],"names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition"],"mappings":";;;;;;eAAe;AACbA,EAAAA,iBAAiB,EAAE,EADN;AAEbC,EAAAA,sBAAsB,EAAE,IAFX;AAGbC,EAAAA,OAAO,EAAE,EAHI;AAIbC,EAAAA,QAAQ,EAAE,KAJG;AAKbC,EAAAA,WAAW,EAAE,OALA;AAMbC,EAAAA,MAAM,EAAE,EANK;AAObC,EAAAA,IAAI,EAAE,QAPO;AAQbC,EAAAA,MAAM,EAAE,EARK;AASbC,EAAAA,aAAa,EAAE,IATF;AAUbC,EAAAA,SAAS,EAAE,EAVE;AAWbC,EAAAA,gBAAgB,EAAE,IAXL;AAYbC,EAAAA,OAAO,EAAE,IAZI;AAabC,EAAAA,0BAA0B,EAAE,IAbf;AAcbC,EAAAA,mBAAmB,EAAE,EAdR;AAebC,EAAAA,0BAA0B,EAAE,IAff;AAgBbC,EAAAA,qBAAqB,EAAE;AAhBV,C","sourcesContent":["export default {\n alternateResponse: {},\n choiceRationaleEnabled: true,\n choices: {},\n disabled: false,\n displayType: 'block',\n markup: '',\n mode: 'gather',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n shuffle: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n"],"file":"defaults.js"}
1
+ {"version":3,"file":"defaults.js","names":["alternateResponse","choiceRationaleEnabled","choices","disabled","displayType","markup","mode","prompt","promptEnabled","rationale","rationaleEnabled","shuffle","studentInstructionsEnabled","teacherInstructions","teacherInstructionsEnabled","toolbarEditorPosition"],"sources":["../src/defaults.js"],"sourcesContent":["export default {\n alternateResponse: {},\n choiceRationaleEnabled: true,\n choices: {},\n disabled: false,\n displayType: 'block',\n markup: '',\n mode: 'gather',\n prompt: '',\n promptEnabled: true,\n rationale: '',\n rationaleEnabled: true,\n shuffle: true,\n studentInstructionsEnabled: true,\n teacherInstructions: '',\n teacherInstructionsEnabled: true,\n toolbarEditorPosition: 'bottom',\n};\n"],"mappings":";;;;;;iCAAe;EACbA,iBAAiB,EAAE,CAAC,CAAC;EACrBC,sBAAsB,EAAE,IAAI;EAC5BC,OAAO,EAAE,CAAC,CAAC;EACXC,QAAQ,EAAE,KAAK;EACfC,WAAW,EAAE,OAAO;EACpBC,MAAM,EAAE,EAAE;EACVC,IAAI,EAAE,QAAQ;EACdC,MAAM,EAAE,EAAE;EACVC,aAAa,EAAE,IAAI;EACnBC,SAAS,EAAE,EAAE;EACbC,gBAAgB,EAAE,IAAI;EACtBC,OAAO,EAAE,IAAI;EACbC,0BAA0B,EAAE,IAAI;EAChCC,mBAAmB,EAAE,EAAE;EACvBC,0BAA0B,EAAE,IAAI;EAChCC,qBAAqB,EAAE;AACzB,CAAC","ignoreList":[]}
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -10,40 +9,23 @@ exports.model = model;
10
9
  exports.normalize = void 0;
11
10
  exports.outcome = outcome;
12
11
  exports.validate = void 0;
13
-
14
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
15
-
16
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
-
18
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
-
20
12
  var _map = _interopRequireDefault(require("lodash/map"));
21
-
22
13
  var _reduce = _interopRequireDefault(require("lodash/reduce"));
23
-
24
14
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
25
-
26
15
  var _controllerUtils = require("@pie-lib/controller-utils");
27
-
28
16
  var _defaults = _interopRequireDefault(require("./defaults"));
29
-
30
17
  var _utils = require("./utils");
31
-
32
- 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; }
33
-
34
- 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; }
35
-
36
- var getFeedback = function getFeedback(correct) {
18
+ const getFeedback = correct => {
37
19
  if (correct) {
38
20
  return 'correct';
39
21
  }
40
-
41
22
  return 'incorrect';
42
23
  };
24
+ const normalize = question => ({
25
+ ..._defaults.default,
26
+ ...question
27
+ });
43
28
 
44
- var normalize = function normalize(question) {
45
- return _objectSpread(_objectSpread({}, _defaults["default"]), question);
46
- };
47
29
  /**
48
30
  *
49
31
  * @param {*} question
@@ -51,235 +33,137 @@ var normalize = function normalize(question) {
51
33
  * @param {*} env
52
34
  * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.
53
35
  */
54
-
55
-
56
36
  exports.normalize = normalize;
57
-
58
- function model(question, session, env, updateSession) {
59
- return new Promise( /*#__PURE__*/function () {
60
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(resolve) {
61
- var normalizedQuestion, _ref2, _ref2$value, value, choices, feedback, allCorrectResponses, respAreaLength, correctResponses, _loop, i, _ret, lockChoiceOrder, shuffledValues, keys, us, _i, _session$shuffledValu, key, storedValues, teacherInstructions, rationale, choicesWillNullRationales, out;
62
-
63
- return _regenerator["default"].wrap(function _callee$(_context) {
64
- while (1) {
65
- switch (_context.prev = _context.next) {
66
- case 0:
67
- normalizedQuestion = normalize(question);
68
- _ref2 = session || {}, _ref2$value = _ref2.value, value = _ref2$value === void 0 ? {} : _ref2$value;
69
- choices = (0, _reduce["default"])(normalizedQuestion.choices, function (obj, area, key) {
70
- obj[key] = (0, _map["default"])(area, function (choice) {
71
- return choice;
72
- });
73
- return obj;
74
- }, {});
75
- feedback = {};
76
-
77
- if (!(env.mode === 'evaluate')) {
78
- _context.next = 17;
79
- break;
80
- }
81
-
82
- allCorrectResponses = (0, _utils.getAllCorrectResponses)(normalizedQuestion);
83
- respAreaLength = Object.keys(allCorrectResponses).length;
84
- correctResponses = 0;
85
-
86
- _loop = function _loop(i) {
87
- var result = (0, _reduce["default"])(allCorrectResponses, function (obj, choices, key) {
88
- var answer = value && value[key] || '';
89
- var correctChoice = choices[i] || '';
90
- var isCorrect = answer && correctChoice && correctChoice === answer;
91
- obj.feedback[key] = getFeedback(isCorrect);
92
-
93
- if (isCorrect) {
94
- obj.correctResponses += 1;
95
- }
96
-
97
- return obj;
98
- }, {
99
- correctResponses: 0,
100
- feedback: {}
101
- });
102
-
103
- if (result.correctResponses >= correctResponses) {
104
- correctResponses = result.correctResponses;
105
- feedback = result.feedback;
106
- }
107
-
108
- if (result.correctResponses === respAreaLength) {
109
- return "break";
110
- }
111
- };
112
-
113
- i = 0;
114
-
115
- case 10:
116
- if (!(i < respAreaLength)) {
117
- _context.next = 17;
118
- break;
119
- }
120
-
121
- _ret = _loop(i);
122
-
123
- if (!(_ret === "break")) {
124
- _context.next = 14;
125
- break;
126
- }
127
-
128
- return _context.abrupt("break", 17);
129
-
130
- case 14:
131
- i++;
132
- _context.next = 10;
133
- break;
134
-
135
- case 17:
136
- lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
137
-
138
- if (lockChoiceOrder) {
139
- _context.next = 33;
140
- break;
141
- }
142
-
143
- shuffledValues = {};
144
- keys = Object.keys(choices);
145
-
146
- us = function us(part) {
147
- return function (id, element, update) {
148
- return new Promise(function (resolve) {
149
- shuffledValues[part] = update.shuffledValues;
150
- resolve();
151
- });
152
- };
153
- };
154
-
155
- _i = 0;
156
-
157
- case 23:
158
- if (!(_i < keys.length)) {
159
- _context.next = 32;
160
- break;
161
- }
162
-
163
- key = keys[_i];
164
- storedValues = session === null || session === void 0 ? void 0 : (_session$shuffledValu = session.shuffledValues) === null || _session$shuffledValu === void 0 ? void 0 : _session$shuffledValu[key];
165
- _context.next = 28;
166
- return (0, _controllerUtils.getShuffledChoices)(choices[key], // the shuffledValues structure was updated to an object like { choice_key: [] }
167
- // and we need to override shuffledValues if it's not an array
168
- {
169
- shuffledValues: Array.isArray(storedValues) ? storedValues : []
170
- }, us(key), 'value');
171
-
172
- case 28:
173
- choices[key] = _context.sent;
174
-
175
- case 29:
176
- _i++;
177
- _context.next = 23;
178
- break;
179
-
180
- case 32:
181
- if (!(0, _isEmpty["default"])(shuffledValues)) {
182
- if (session && updateSession && typeof updateSession === 'function') {
183
- updateSession(session.id, session.element, {
184
- shuffledValues: shuffledValues
185
- })["catch"](function (e) {
186
- // eslint-disable-next-line no-console
187
- console.error('update session failed', e);
188
- });
189
- }
190
- }
191
-
192
- case 33:
193
- teacherInstructions = null;
194
- rationale = null;
195
- choicesWillNullRationales = (Object.keys(choices) || []).reduce(function (acc, currentValue) {
196
- acc[currentValue] = (choices[currentValue] || []).map(function (choice) {
197
- return _objectSpread(_objectSpread({}, choice), {}, {
198
- rationale: null
199
- });
200
- });
201
- return acc;
202
- }, {});
203
-
204
- if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
205
- rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
206
- teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
207
- choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
208
- } else {
209
- rationale = null;
210
- teacherInstructions = null;
211
- choices = choicesWillNullRationales;
212
- }
213
-
214
- out = {
215
- disabled: env.mode !== 'gather',
216
- mode: env.mode,
217
- prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
218
- displayType: normalizedQuestion.displayType,
219
- markup: normalizedQuestion.markup,
220
- choices: choices,
221
- feedback: feedback,
222
- responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
223
- rationale: rationale,
224
- teacherInstructions: teacherInstructions,
225
- language: normalizedQuestion.language,
226
- extraCSSRules: normalizedQuestion.extraCSSRules
227
- };
228
- resolve(out);
229
-
230
- case 39:
231
- case "end":
232
- return _context.stop();
233
- }
37
+ async function model(question, session, env, updateSession) {
38
+ const normalizedQuestion = normalize(question);
39
+ const {
40
+ value = {}
41
+ } = session || {};
42
+ let choices = (0, _reduce.default)(normalizedQuestion.choices, (obj, area, key) => {
43
+ obj[key] = (0, _map.default)(area, choice => choice);
44
+ return obj;
45
+ }, {});
46
+ let feedback = {};
47
+ if (env.mode === 'evaluate') {
48
+ const allCorrectResponses = (0, _utils.getAllCorrectResponses)(normalizedQuestion);
49
+ const respAreaLength = Object.keys(allCorrectResponses).length;
50
+ let correctResponses = 0;
51
+ for (let i = 0; i < respAreaLength; i++) {
52
+ const result = (0, _reduce.default)(allCorrectResponses, (obj, choices, key) => {
53
+ const answer = value && value[key] || '';
54
+ const correctChoice = choices[i] || '';
55
+ const isCorrect = answer && correctChoice && correctChoice === answer;
56
+ obj.feedback[key] = getFeedback(isCorrect);
57
+ if (isCorrect) {
58
+ obj.correctResponses += 1;
234
59
  }
235
- }, _callee);
236
- }));
237
-
238
- return function (_x) {
239
- return _ref.apply(this, arguments);
60
+ return obj;
61
+ }, {
62
+ correctResponses: 0,
63
+ feedback: {}
64
+ });
65
+ if (result.correctResponses >= correctResponses) {
66
+ correctResponses = result.correctResponses;
67
+ feedback = result.feedback;
68
+ }
69
+ if (result.correctResponses === respAreaLength) {
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ const lockChoiceOrder = (0, _controllerUtils.lockChoices)(normalizedQuestion, session, env);
75
+ if (!lockChoiceOrder) {
76
+ const shuffledValues = {};
77
+ const keys = Object.keys(choices);
78
+ const us = part => (id, element, update) => {
79
+ return new Promise(resolve => {
80
+ shuffledValues[part] = update.shuffledValues;
81
+ resolve();
82
+ });
240
83
  };
241
- }());
84
+ let i;
85
+ for (i = 0; i < keys.length; i++) {
86
+ const key = keys[i];
87
+ const storedValues = session?.shuffledValues?.[key];
88
+ choices[key] = await (0, _controllerUtils.getShuffledChoices)(choices[key],
89
+ // the shuffledValues structure was updated to an object like { choice_key: [] }
90
+ // and we need to override shuffledValues if it's not an array
91
+ {
92
+ shuffledValues: Array.isArray(storedValues) ? storedValues : []
93
+ }, us(key), 'value');
94
+ }
95
+ if (!(0, _isEmpty.default)(shuffledValues)) {
96
+ if (session && updateSession && typeof updateSession === 'function') {
97
+ updateSession(session.id, session.element, {
98
+ shuffledValues
99
+ }).catch(e => {
100
+ // eslint-disable-next-line no-console
101
+ console.error('update session failed', e);
102
+ });
103
+ }
104
+ }
105
+ }
106
+ let teacherInstructions = null;
107
+ let rationale = null;
108
+ const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {
109
+ acc[currentValue] = (choices[currentValue] || []).map(choice => ({
110
+ ...choice,
111
+ rationale: null
112
+ }));
113
+ return acc;
114
+ }, {});
115
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
116
+ rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;
117
+ teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
118
+ choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;
119
+ } else {
120
+ rationale = null;
121
+ teacherInstructions = null;
122
+ choices = choicesWillNullRationales;
123
+ }
124
+ const out = {
125
+ disabled: env.mode !== 'gather',
126
+ mode: env.mode,
127
+ prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
128
+ displayType: normalizedQuestion.displayType,
129
+ markup: normalizedQuestion.markup,
130
+ choices,
131
+ feedback,
132
+ responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,
133
+ rationale,
134
+ teacherInstructions,
135
+ language: normalizedQuestion.language,
136
+ extraCSSRules: normalizedQuestion.extraCSSRules
137
+ };
138
+ return out;
242
139
  }
243
-
244
- var getScore = function getScore(config, session) {
245
- var _ref3 = session || {},
246
- _ref3$value = _ref3.value,
247
- value = _ref3$value === void 0 ? {} : _ref3$value;
248
-
249
- var maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
250
- var allCorrectResponses = (0, _utils.getAllCorrectResponses)(config);
251
- var correctCount = 0;
252
-
253
- var _loop2 = function _loop2(i) {
254
- var result = (0, _reduce["default"])(allCorrectResponses, function (total, choices, key) {
255
- var answer = value && value[key] || '';
256
- var correctChoice = choices[i] || '';
257
-
140
+ const getScore = (config, session) => {
141
+ const {
142
+ value = {}
143
+ } = session || {};
144
+ const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;
145
+ const allCorrectResponses = (0, _utils.getAllCorrectResponses)(config);
146
+ let correctCount = 0;
147
+ for (let i = 0; i < maxScore; i++) {
148
+ const result = (0, _reduce.default)(allCorrectResponses, (total, choices, key) => {
149
+ const answer = value && value[key] || '';
150
+ const correctChoice = choices[i] || '';
258
151
  if (correctChoice && answer && correctChoice === answer) {
259
152
  return total;
260
153
  }
261
-
262
154
  return total - 1;
263
155
  }, maxScore);
264
-
265
156
  if (result > correctCount) {
266
157
  correctCount = result;
267
158
  }
268
-
269
159
  if (result === maxScore) {
270
- return "break";
160
+ break;
271
161
  }
272
- };
273
-
274
- for (var i = 0; i < maxScore; i++) {
275
- var _ret2 = _loop2(i);
276
-
277
- if (_ret2 === "break") break;
278
162
  }
279
-
280
- var str = (correctCount / maxScore).toFixed(2);
163
+ const str = (correctCount / maxScore).toFixed(2);
281
164
  return parseFloat(str);
282
165
  };
166
+
283
167
  /**
284
168
  *
285
169
  * The score is partial by default for checkbox mode, allOrNothing for radio mode.
@@ -292,97 +176,79 @@ var getScore = function getScore(config, session) {
292
176
  * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides
293
177
  * `model.partialScoring`.
294
178
  */
295
-
296
-
297
179
  exports.getScore = getScore;
298
-
299
- function outcome(model, session) {
300
- var env = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
301
- return new Promise(function (resolve) {
302
- if (!session || (0, _isEmpty["default"])(session)) {
180
+ function outcome(model, session, env = {}) {
181
+ return new Promise(resolve => {
182
+ if (!session || (0, _isEmpty.default)(session)) {
303
183
  resolve({
304
184
  score: 0,
305
185
  empty: true
306
186
  });
307
187
  }
308
-
309
- var partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
310
-
311
- var score = getScore(model, session);
188
+ const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
189
+ const score = getScore(model, session);
312
190
  resolve({
313
191
  score: partialScoringEnabled ? score : Math.floor(score),
314
192
  empty: false
315
193
  });
316
194
  });
317
195
  }
318
-
319
- var createCorrectResponseSession = function createCorrectResponseSession(question, env) {
320
- return new Promise(function (resolve) {
196
+ const createCorrectResponseSession = (question, env) => {
197
+ return new Promise(resolve => {
321
198
  if (env.mode !== 'evaluate' && env.role === 'instructor') {
322
- var choices = question.choices;
323
- var _value = {};
324
-
199
+ const {
200
+ choices
201
+ } = question;
202
+ const value = {};
325
203
  if (choices) {
326
- Object.keys(choices).forEach(function (key, i) {
327
- var correctChoices = choices[key] && choices[key].filter(function (c) {
328
- return c.correct;
329
- });
330
- _value[i] = correctChoices && correctChoices[0].value;
204
+ Object.keys(choices).forEach((key, i) => {
205
+ const correctChoices = choices[key] && choices[key].filter(c => c.correct);
206
+ value[i] = correctChoices && correctChoices[0].value;
331
207
  });
332
208
  }
333
-
334
209
  resolve({
335
210
  id: '1',
336
- value: _value
211
+ value
337
212
  });
338
213
  } else {
339
214
  resolve(null);
340
215
  }
341
216
  });
342
- }; // remove all html tags
343
-
344
-
345
- exports.createCorrectResponseSession = createCorrectResponseSession;
346
-
347
- var getInnerText = function getInnerText(html) {
348
- return (html || '').replaceAll(/<[^>]*>/g, '');
349
- }; // remove all html tags except img, iframe and source tag for audio
350
-
351
-
352
- var getContent = function getContent(html) {
353
- return (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
354
217
  };
355
218
 
356
- var validate = function validate() {
357
- var model = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
358
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
359
- var markup = model.markup,
360
- choices = model.choices;
361
- var maxResponseAreas = config.maxResponseAreas,
362
- maxResponseAreaChoices = config.maxResponseAreaChoices;
363
- var errors = {};
364
- ['teacherInstructions', 'prompt', 'rationale'].forEach(function (field) {
365
- var _config$field;
366
-
367
- if ((_config$field = config[field]) !== null && _config$field !== void 0 && _config$field.required && !getContent(model[field])) {
219
+ // remove all html tags
220
+ exports.createCorrectResponseSession = createCorrectResponseSession;
221
+ const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
222
+
223
+ // remove all html tags except img, iframe and source tag for audio
224
+ const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
225
+ const validate = (model = {}, config = {}) => {
226
+ const {
227
+ markup,
228
+ choices
229
+ } = model;
230
+ const {
231
+ maxResponseAreas,
232
+ maxResponseAreaChoices
233
+ } = config;
234
+ const errors = {};
235
+ ['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
236
+ if (config[field]?.required && !getContent(model[field])) {
368
237
  errors[field] = 'This field is required.';
369
238
  }
370
239
  });
371
- var nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
372
-
240
+ const nbOfResponseAreas = ((markup || '').match(/\{\{(\d+)\}\}/g) || []).length;
373
241
  if (nbOfResponseAreas > maxResponseAreas) {
374
- errors.responseAreasError = "No more than ".concat(maxResponseAreas, " response areas should be defined.");
242
+ errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;
375
243
  } else if (nbOfResponseAreas < 1) {
376
244
  errors.responseAreasError = 'There should be defined at least 1 response area.';
377
245
  }
378
-
379
- (Object.keys(choices) || []).forEach(function (choiceKey) {
246
+ (Object.keys(choices) || []).forEach(choiceKey => {
380
247
  if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {
381
- errors.responseAreaChoicesError = "No more than ".concat(maxResponseAreaChoices, " choices per response area should be defined.");
248
+ errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;
382
249
  }
383
250
  });
384
251
  return errors;
385
252
  };
386
-
387
253
  exports.validate = validate;
388
254
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["getFeedback","correct","normalize","question","defaults","model","session","env","updateSession","Promise","resolve","normalizedQuestion","value","choices","obj","area","key","choice","feedback","mode","allCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","shuffledValues","us","part","id","element","update","storedValues","Array","isArray","e","console","error","teacherInstructions","rationale","choicesWillNullRationales","reduce","acc","currentValue","map","role","rationaleEnabled","teacherInstructionsEnabled","choiceRationaleEnabled","out","disabled","prompt","promptEnabled","displayType","markup","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","getInnerText","html","replaceAll","getContent","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;;;;;AAEA,IAAMA,WAAW,GAAG,SAAdA,WAAc,CAACC,OAAD,EAAa;AAC/B,MAAIA,OAAJ,EAAa;AACX,WAAO,SAAP;AACD;;AAED,SAAO,WAAP;AACD,CAND;;AAQO,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAACC,QAAD;AAAA,yCAAoBC,oBAApB,GAAiCD,QAAjC;AAAA,CAAlB;AAEP;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASE,KAAT,CAAeF,QAAf,EAAyBG,OAAzB,EAAkCC,GAAlC,EAAuCC,aAAvC,EAAsD;AAC3D,SAAO,IAAIC,OAAJ;AAAA,6FAAY,iBAAOC,OAAP;AAAA;;AAAA;AAAA;AAAA;AAAA;AACXC,cAAAA,kBADW,GACUT,SAAS,CAACC,QAAD,CADnB;AAAA,sBAEMG,OAAO,IAAI,EAFjB,sBAETM,KAFS,EAETA,KAFS,4BAED,EAFC;AAGbC,cAAAA,OAHa,GAGH,wBACZF,kBAAkB,CAACE,OADP,EAEZ,UAACC,GAAD,EAAMC,IAAN,EAAYC,GAAZ,EAAoB;AAClBF,gBAAAA,GAAG,CAACE,GAAD,CAAH,GAAW,qBAAID,IAAJ,EAAU,UAACE,MAAD;AAAA,yBAAYA,MAAZ;AAAA,iBAAV,CAAX;AAEA,uBAAOH,GAAP;AACD,eANW,EAOZ,EAPY,CAHG;AAabI,cAAAA,QAba,GAaF,EAbE;;AAAA,oBAebX,GAAG,CAACY,IAAJ,KAAa,UAfA;AAAA;AAAA;AAAA;;AAgBTC,cAAAA,mBAhBS,GAgBa,mCAAuBT,kBAAvB,CAhBb;AAiBTU,cAAAA,cAjBS,GAiBQC,MAAM,CAACC,IAAP,CAAYH,mBAAZ,EAAiCI,MAjBzC;AAkBXC,cAAAA,gBAlBW,GAkBQ,CAlBR;;AAAA,qCAoBNC,CApBM;AAqBb,oBAAMC,MAAM,GAAG,wBACbP,mBADa,EAEb,UAACN,GAAD,EAAMD,OAAN,EAAeG,GAAf,EAAuB;AACrB,sBAAMY,MAAM,GAAIhB,KAAK,IAAIA,KAAK,CAACI,GAAD,CAAf,IAAyB,EAAxC;AACA,sBAAMa,aAAa,GAAGhB,OAAO,CAACa,CAAD,CAAP,IAAc,EAApC;AACA,sBAAMI,SAAS,GAAGF,MAAM,IAAIC,aAAV,IAA2BA,aAAa,KAAKD,MAA/D;AAEAd,kBAAAA,GAAG,CAACI,QAAJ,CAAaF,GAAb,IAAoBhB,WAAW,CAAC8B,SAAD,CAA/B;;AAEA,sBAAIA,SAAJ,EAAe;AACbhB,oBAAAA,GAAG,CAACW,gBAAJ,IAAwB,CAAxB;AACD;;AAED,yBAAOX,GAAP;AACD,iBAdY,EAeb;AAAEW,kBAAAA,gBAAgB,EAAE,CAApB;AAAuBP,kBAAAA,QAAQ,EAAE;AAAjC,iBAfa,CAAf;;AAkBA,oBAAIS,MAAM,CAACF,gBAAP,IAA2BA,gBAA/B,EAAiD;AAC/CA,kBAAAA,gBAAgB,GAAGE,MAAM,CAACF,gBAA1B;AACAP,kBAAAA,QAAQ,GAAGS,MAAM,CAACT,QAAlB;AACD;;AAED,oBAAIS,MAAM,CAACF,gBAAP,KAA4BJ,cAAhC,EAAgD;AAC9C;AACD;AA9CY;;AAoBNK,cAAAA,CApBM,GAoBF,CApBE;;AAAA;AAAA,oBAoBCA,CAAC,GAAGL,cApBL;AAAA;AAAA;AAAA;;AAAA,2BAoBNK,CApBM;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAoBqBA,cAAAA,CAAC,EApBtB;AAAA;AAAA;;AAAA;AAkDXK,cAAAA,eAlDW,GAkDO,kCAAYpB,kBAAZ,EAAgCL,OAAhC,EAAyCC,GAAzC,CAlDP;;AAAA,kBAoDZwB,eApDY;AAAA;AAAA;AAAA;;AAqDTC,cAAAA,cArDS,GAqDQ,EArDR;AAsDTT,cAAAA,IAtDS,GAsDFD,MAAM,CAACC,IAAP,CAAYV,OAAZ,CAtDE;;AAwDToB,cAAAA,EAxDS,GAwDJ,SAALA,EAAK,CAACC,IAAD;AAAA,uBAAU,UAACC,EAAD,EAAKC,OAAL,EAAcC,MAAd,EAAyB;AAC5C,yBAAO,IAAI5B,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BsB,oBAAAA,cAAc,CAACE,IAAD,CAAd,GAAuBG,MAAM,CAACL,cAA9B;AACAtB,oBAAAA,OAAO;AACR,mBAHM,CAAP;AAID,iBALU;AAAA,eAxDI;;AAiEVgB,cAAAA,EAAC,GAAG,CAjEM;;AAAA;AAAA,oBAiEHA,EAAC,GAAGH,IAAI,CAACC,MAjEN;AAAA;AAAA;AAAA;;AAkEPR,cAAAA,GAlEO,GAkEDO,IAAI,CAACG,EAAD,CAlEH;AAmEPY,cAAAA,YAnEO,GAmEQhC,OAnER,aAmEQA,OAnER,gDAmEQA,OAAO,CAAE0B,cAnEjB,0DAmEQ,sBAA0BhB,GAA1B,CAnER;AAAA;AAAA,qBAqEQ,yCACnBH,OAAO,CAACG,GAAD,CADY,EAEnB;AACA;AACA;AAAEgB,gBAAAA,cAAc,EAAEO,KAAK,CAACC,OAAN,CAAcF,YAAd,IAA8BA,YAA9B,GAA6C;AAA/D,eAJmB,EAKnBL,EAAE,CAACjB,GAAD,CALiB,EAMnB,OANmB,CArER;;AAAA;AAqEbH,cAAAA,OAAO,CAACG,GAAD,CArEM;;AAAA;AAiEcU,cAAAA,EAAC,EAjEf;AAAA;AAAA;;AAAA;AA+Ef,kBAAI,CAAC,yBAAQM,cAAR,CAAL,EAA8B;AAC5B,oBAAI1B,OAAO,IAAIE,aAAX,IAA4B,OAAOA,aAAP,KAAyB,UAAzD,EAAqE;AACnEA,kBAAAA,aAAa,CAACF,OAAO,CAAC6B,EAAT,EAAa7B,OAAO,CAAC8B,OAArB,EAA8B;AACzCJ,oBAAAA,cAAc,EAAdA;AADyC,mBAA9B,CAAb,UAES,UAACS,CAAD,EAAO;AACd;AACAC,oBAAAA,OAAO,CAACC,KAAR,CAAc,uBAAd,EAAuCF,CAAvC;AACD,mBALD;AAMD;AACF;;AAxFc;AA2FbG,cAAAA,mBA3Fa,GA2FS,IA3FT;AA4FbC,cAAAA,SA5Fa,GA4FD,IA5FC;AA8FXC,cAAAA,yBA9FW,GA8FiB,CAACxB,MAAM,CAACC,IAAP,CAAYV,OAAZ,KAAwB,EAAzB,EAA6BkC,MAA7B,CAAoC,UAACC,GAAD,EAAMC,YAAN,EAAuB;AAC3FD,gBAAAA,GAAG,CAACC,YAAD,CAAH,GAAoB,CAACpC,OAAO,CAACoC,YAAD,CAAP,IAAyB,EAA1B,EAA8BC,GAA9B,CAAkC,UAACjC,MAAD;AAAA,yDACjDA,MADiD;AAEpD4B,oBAAAA,SAAS,EAAE;AAFyC;AAAA,iBAAlC,CAApB;AAKA,uBAAOG,GAAP;AACD,eAPiC,EAO/B,EAP+B,CA9FjB;;AAuGjB,kBAAIzC,GAAG,CAAC4C,IAAJ,KAAa,YAAb,KAA8B5C,GAAG,CAACY,IAAJ,KAAa,MAAb,IAAuBZ,GAAG,CAACY,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjF0B,gBAAAA,SAAS,GAAGlC,kBAAkB,CAACyC,gBAAnB,GAAsCzC,kBAAkB,CAACkC,SAAzD,GAAqE,IAAjF;AACAD,gBAAAA,mBAAmB,GAAGjC,kBAAkB,CAAC0C,0BAAnB,GAClB1C,kBAAkB,CAACiC,mBADD,GAElB,IAFJ;AAIA/B,gBAAAA,OAAO,GAAGF,kBAAkB,CAAC2C,sBAAnB,GAA4C3C,kBAAkB,CAACE,OAA/D,GAAyEiC,yBAAnF;AACD,eAPD,MAOO;AACLD,gBAAAA,SAAS,GAAG,IAAZ;AACAD,gBAAAA,mBAAmB,GAAG,IAAtB;AACA/B,gBAAAA,OAAO,GAAGiC,yBAAV;AACD;;AAEKS,cAAAA,GApHW,GAoHL;AACVC,gBAAAA,QAAQ,EAAEjD,GAAG,CAACY,IAAJ,KAAa,QADb;AAEVA,gBAAAA,IAAI,EAAEZ,GAAG,CAACY,IAFA;AAGVsC,gBAAAA,MAAM,EAAE9C,kBAAkB,CAAC+C,aAAnB,GAAmC/C,kBAAkB,CAAC8C,MAAtD,GAA+D,IAH7D;AAIVE,gBAAAA,WAAW,EAAEhD,kBAAkB,CAACgD,WAJtB;AAKVC,gBAAAA,MAAM,EAAEjD,kBAAkB,CAACiD,MALjB;AAMV/C,gBAAAA,OAAO,EAAPA,OANU;AAOVK,gBAAAA,QAAQ,EAARA,QAPU;AASV2C,gBAAAA,eAAe,EAAEtD,GAAG,CAACY,IAAJ,KAAa,UAAb,GAA0B2C,QAAQ,CAACnD,kBAAD,EAAqBL,OAArB,CAAR,KAA0C,CAApE,GAAwEyD,SAT/E;AAUVlB,gBAAAA,SAAS,EAATA,SAVU;AAWVD,gBAAAA,mBAAmB,EAAnBA,mBAXU;AAYVoB,gBAAAA,QAAQ,EAAErD,kBAAkB,CAACqD,QAZnB;AAaVC,gBAAAA,aAAa,EAAEtD,kBAAkB,CAACsD;AAbxB,eApHK;AAoIjBvD,cAAAA,OAAO,CAAC6C,GAAD,CAAP;;AApIiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAZ;;AAAA;AAAA;AAAA;AAAA,MAAP;AAsID;;AAEM,IAAMO,QAAQ,GAAG,SAAXA,QAAW,CAACI,MAAD,EAAS5D,OAAT,EAAqB;AAC3C,cAAuBA,OAAO,IAAI,EAAlC;AAAA,0BAAQM,KAAR;AAAA,MAAQA,KAAR,4BAAgB,EAAhB;;AACA,MAAMuD,QAAQ,GAAGD,MAAM,IAAIA,MAAM,CAACrD,OAAjB,GAA2BS,MAAM,CAACC,IAAP,CAAY2C,MAAM,CAACrD,OAAnB,EAA4BW,MAAvD,GAAgE,CAAjF;AACA,MAAMJ,mBAAmB,GAAG,mCAAuB8C,MAAvB,CAA5B;AACA,MAAIE,YAAY,GAAG,CAAnB;;AAJ2C,+BAMlC1C,CANkC;AAOzC,QAAMC,MAAM,GAAG,wBACbP,mBADa,EAEb,UAACiD,KAAD,EAAQxD,OAAR,EAAiBG,GAAjB,EAAyB;AACvB,UAAMY,MAAM,GAAIhB,KAAK,IAAIA,KAAK,CAACI,GAAD,CAAf,IAAyB,EAAxC;AACA,UAAMa,aAAa,GAAGhB,OAAO,CAACa,CAAD,CAAP,IAAc,EAApC;;AAEA,UAAIG,aAAa,IAAID,MAAjB,IAA2BC,aAAa,KAAKD,MAAjD,EAAyD;AACvD,eAAOyC,KAAP;AACD;;AAED,aAAOA,KAAK,GAAG,CAAf;AACD,KAXY,EAYbF,QAZa,CAAf;;AAeA,QAAIxC,MAAM,GAAGyC,YAAb,EAA2B;AACzBA,MAAAA,YAAY,GAAGzC,MAAf;AACD;;AAED,QAAIA,MAAM,KAAKwC,QAAf,EAAyB;AACvB;AACD;AA5BwC;;AAM3C,OAAK,IAAIzC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGyC,QAApB,EAA8BzC,CAAC,EAA/B,EAAmC;AAAA,uBAA1BA,CAA0B;;AAAA,2BAqB/B;AAEH;;AAED,MAAM4C,GAAG,GAAG,CAACF,YAAY,GAAGD,QAAhB,EAA0BI,OAA1B,CAAkC,CAAlC,CAAZ;AAEA,SAAOC,UAAU,CAACF,GAAD,CAAjB;AACD,CAlCM;AAoCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AACO,SAASG,OAAT,CAAiBpE,KAAjB,EAAwBC,OAAxB,EAA2C;AAAA,MAAVC,GAAU,uEAAJ,EAAI;AAChD,SAAO,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAI,CAACJ,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCI,MAAAA,OAAO,CAAC;AAAEgE,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AAED,QAAMC,qBAAqB,GAAGC,gCAAeC,OAAf,CAAuBzE,KAAvB,EAA8BE,GAA9B,CAA9B;;AACA,QAAMmE,KAAK,GAAGZ,QAAQ,CAACzD,KAAD,EAAQC,OAAR,CAAtB;AAEAI,IAAAA,OAAO,CAAC;AACNgE,MAAAA,KAAK,EAAEE,qBAAqB,GAAGF,KAAH,GAAWK,IAAI,CAACC,KAAL,CAAWN,KAAX,CADjC;AAENC,MAAAA,KAAK,EAAE;AAFD,KAAD,CAAP;AAID,GAZM,CAAP;AAaD;;AAEM,IAAMM,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAC9E,QAAD,EAAWI,GAAX,EAAmB;AAC7D,SAAO,IAAIE,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIH,GAAG,CAACY,IAAJ,KAAa,UAAb,IAA2BZ,GAAG,CAAC4C,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAQtC,OAAR,GAAoBV,QAApB,CAAQU,OAAR;AACA,UAAMD,MAAK,GAAG,EAAd;;AAEA,UAAIC,OAAJ,EAAa;AACXS,QAAAA,MAAM,CAACC,IAAP,CAAYV,OAAZ,EAAqBqE,OAArB,CAA6B,UAAClE,GAAD,EAAMU,CAAN,EAAY;AACvC,cAAMyD,cAAc,GAAGtE,OAAO,CAACG,GAAD,CAAP,IAAgBH,OAAO,CAACG,GAAD,CAAP,CAAaoE,MAAb,CAAoB,UAACC,CAAD;AAAA,mBAAOA,CAAC,CAACpF,OAAT;AAAA,WAApB,CAAvC;AAEAW,UAAAA,MAAK,CAACc,CAAD,CAAL,GAAWyD,cAAc,IAAIA,cAAc,CAAC,CAAD,CAAd,CAAkBvE,KAA/C;AACD,SAJD;AAKD;;AAEDF,MAAAA,OAAO,CAAC;AACNyB,QAAAA,EAAE,EAAE,GADE;AAENvB,QAAAA,KAAK,EAALA;AAFM,OAAD,CAAP;AAID,KAhBD,MAgBO;AACLF,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GApBM,CAAP;AAqBD,CAtBM,C,CAwBP;;;;;AACA,IAAM4E,YAAY,GAAG,SAAfA,YAAe,CAACC,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,UAAb,CAAwB,UAAxB,EAAoC,EAApC,CAAV;AAAA,CAArB,C,CAEA;;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACF,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaG,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAAV;AAAA,CAAnB;;AAEO,IAAMC,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5BtF,KAA4B,uEAApB,EAAoB;AAAA,MAAhB6D,MAAgB,uEAAP,EAAO;AACnD,MAAQN,MAAR,GAA4BvD,KAA5B,CAAQuD,MAAR;AAAA,MAAgB/C,OAAhB,GAA4BR,KAA5B,CAAgBQ,OAAhB;AACA,MAAQ+E,gBAAR,GAAqD1B,MAArD,CAAQ0B,gBAAR;AAAA,MAA0BC,sBAA1B,GAAqD3B,MAArD,CAA0B2B,sBAA1B;AACA,MAAMC,MAAM,GAAG,EAAf;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,EAA+CZ,OAA/C,CAAuD,UAACa,KAAD,EAAW;AAAA;;AAChE,QAAI,iBAAA7B,MAAM,CAAC6B,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACP,UAAU,CAACpF,KAAK,CAAC0F,KAAD,CAAN,CAA1C,EAA0D;AACxDD,MAAAA,MAAM,CAACC,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;AAMA,MAAME,iBAAiB,GAAG,CAAC,CAACrC,MAAM,IAAI,EAAX,EAAesC,KAAf,CAAqB,gBAArB,KAA0C,EAA3C,EAA+C1E,MAAzE;;AAEA,MAAIyE,iBAAiB,GAAGL,gBAAxB,EAA0C;AACxCE,IAAAA,MAAM,CAACK,kBAAP,0BAA4CP,gBAA5C;AACD,GAFD,MAEO,IAAIK,iBAAiB,GAAG,CAAxB,EAA2B;AAChCH,IAAAA,MAAM,CAACK,kBAAP,GAA4B,mDAA5B;AACD;;AAED,GAAC7E,MAAM,CAACC,IAAP,CAAYV,OAAZ,KAAwB,EAAzB,EAA6BqE,OAA7B,CAAqC,UAACkB,SAAD,EAAe;AAClD,QAAIvF,OAAO,CAACuF,SAAD,CAAP,IAAsBvF,OAAO,CAACuF,SAAD,CAAP,CAAmB5E,MAAnB,GAA4BqE,sBAAtD,EAA8E;AAC5EC,MAAAA,MAAM,CAACO,wBAAP,0BAAkDR,sBAAlD;AACD;AACF,GAJD;AAMA,SAAOC,MAAP;AACD,CA1BM","sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport function model(question, session, env, updateSession) {\n return new Promise(async (resolve) => {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {},\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect = answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const shuffledValues = {};\n const keys = Object.keys(choices);\n\n const us = (part) => (id, element, update) => {\n return new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n };\n\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n const storedValues = session?.shuffledValues?.[key];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n // the shuffledValues structure was updated to an object like { choice_key: [] }\n // and we need to override shuffledValues if it's not an array\n { shuffledValues: Array.isArray(storedValues) ? storedValues : [] },\n us(key),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (session && updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n }, {});\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n rationale,\n teacherInstructions,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n resolve(out);\n });\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n empty: false,\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices = choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { markup, choices } = model;\n const { maxResponseAreas, maxResponseAreaChoices } = config;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n (Object.keys(choices) || []).forEach((choiceKey) => {\n if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {\n errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;\n }\n });\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["_map","_interopRequireDefault","require","_reduce","_isEmpty","_controllerUtils","_defaults","_utils","getFeedback","correct","normalize","question","defaults","exports","model","session","env","updateSession","normalizedQuestion","value","choices","reduce","obj","area","key","map","choice","feedback","mode","allCorrectResponses","getAllCorrectResponses","respAreaLength","Object","keys","length","correctResponses","i","result","answer","correctChoice","isCorrect","lockChoiceOrder","lockChoices","shuffledValues","us","part","id","element","update","Promise","resolve","storedValues","getShuffledChoices","Array","isArray","isEmpty","catch","e","console","error","teacherInstructions","rationale","choicesWillNullRationales","acc","currentValue","role","rationaleEnabled","teacherInstructionsEnabled","choiceRationaleEnabled","out","disabled","prompt","promptEnabled","displayType","markup","responseCorrect","getScore","undefined","language","extraCSSRules","config","maxScore","correctCount","total","str","toFixed","parseFloat","outcome","score","empty","partialScoringEnabled","partialScoring","enabled","Math","floor","createCorrectResponseSession","forEach","correctChoices","filter","c","getInnerText","html","replaceAll","getContent","replace","validate","maxResponseAreas","maxResponseAreaChoices","errors","field","required","nbOfResponseAreas","match","responseAreasError","choiceKey","responseAreaChoicesError"],"sources":["../src/index.js"],"sourcesContent":["import map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport isEmpty from 'lodash/isEmpty';\nimport { lockChoices, getShuffledChoices, partialScoring } from '@pie-lib/controller-utils';\nimport defaults from './defaults';\n\nimport { getAllCorrectResponses } from './utils';\n\nconst getFeedback = (correct) => {\n if (correct) {\n return 'correct';\n }\n\n return 'incorrect';\n};\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\n/**\n *\n * @param {*} question\n * @param {*} session\n * @param {*} env\n * @param {*} updateSession - optional - a function that will set the properties passed into it on the session.\n */\nexport async function model(question, session, env, updateSession) {\n const normalizedQuestion = normalize(question);\n const { value = {} } = session || {};\n let choices = reduce(\n normalizedQuestion.choices,\n (obj, area, key) => {\n obj[key] = map(area, (choice) => choice);\n\n return obj;\n },\n {},\n );\n\n let feedback = {};\n\n if (env.mode === 'evaluate') {\n const allCorrectResponses = getAllCorrectResponses(normalizedQuestion);\n const respAreaLength = Object.keys(allCorrectResponses).length;\n let correctResponses = 0;\n\n for (let i = 0; i < respAreaLength; i++) {\n const result = reduce(\n allCorrectResponses,\n (obj, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n const isCorrect = answer && correctChoice && correctChoice === answer;\n\n obj.feedback[key] = getFeedback(isCorrect);\n\n if (isCorrect) {\n obj.correctResponses += 1;\n }\n\n return obj;\n },\n { correctResponses: 0, feedback: {} },\n );\n\n if (result.correctResponses >= correctResponses) {\n correctResponses = result.correctResponses;\n feedback = result.feedback;\n }\n\n if (result.correctResponses === respAreaLength) {\n break;\n }\n }\n }\n\n const lockChoiceOrder = lockChoices(normalizedQuestion, session, env);\n\n if (!lockChoiceOrder) {\n const shuffledValues = {};\n const keys = Object.keys(choices);\n\n const us = (part) => (id, element, update) => {\n return new Promise((resolve) => {\n shuffledValues[part] = update.shuffledValues;\n resolve();\n });\n };\n\n let i;\n\n for (i = 0; i < keys.length; i++) {\n const key = keys[i];\n const storedValues = session?.shuffledValues?.[key];\n\n choices[key] = await getShuffledChoices(\n choices[key],\n // the shuffledValues structure was updated to an object like { choice_key: [] }\n // and we need to override shuffledValues if it's not an array\n { shuffledValues: Array.isArray(storedValues) ? storedValues : [] },\n us(key),\n 'value',\n );\n }\n\n if (!isEmpty(shuffledValues)) {\n if (session && updateSession && typeof updateSession === 'function') {\n updateSession(session.id, session.element, {\n shuffledValues,\n }).catch((e) => {\n // eslint-disable-next-line no-console\n console.error('update session failed', e);\n });\n }\n }\n }\n\n let teacherInstructions = null;\n let rationale = null;\n\n const choicesWillNullRationales = (Object.keys(choices) || []).reduce((acc, currentValue) => {\n acc[currentValue] = (choices[currentValue] || []).map((choice) => ({\n ...choice,\n rationale: null,\n }));\n\n return acc;\n }, {});\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n\n choices = normalizedQuestion.choiceRationaleEnabled ? normalizedQuestion.choices : choicesWillNullRationales;\n } else {\n rationale = null;\n teacherInstructions = null;\n choices = choicesWillNullRationales;\n }\n\n const out = {\n disabled: env.mode !== 'gather',\n mode: env.mode,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n displayType: normalizedQuestion.displayType,\n markup: normalizedQuestion.markup,\n choices,\n feedback,\n\n responseCorrect: env.mode === 'evaluate' ? getScore(normalizedQuestion, session) === 1 : undefined,\n rationale,\n teacherInstructions,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n return out;\n}\n\nexport const getScore = (config, session) => {\n const { value = {} } = session || {};\n const maxScore = config && config.choices ? Object.keys(config.choices).length : 0;\n const allCorrectResponses = getAllCorrectResponses(config);\n let correctCount = 0;\n\n for (let i = 0; i < maxScore; i++) {\n const result = reduce(\n allCorrectResponses,\n (total, choices, key) => {\n const answer = (value && value[key]) || '';\n const correctChoice = choices[i] || '';\n\n if (correctChoice && answer && correctChoice === answer) {\n return total;\n }\n\n return total - 1;\n },\n maxScore,\n );\n\n if (result > correctCount) {\n correctCount = result;\n }\n\n if (result === maxScore) {\n break;\n }\n }\n\n const str = (correctCount / maxScore).toFixed(2);\n\n return parseFloat(str);\n};\n\n/**\n *\n * The score is partial by default for checkbox mode, allOrNothing for radio mode.\n * To disable partial scoring for checkbox mode you either set model.partialScoring = false or env.partialScoring =\n * false. the value in `env` will override the value in `model`.\n * @param {Object} model - the main model\n * @param {boolean} model.partialScoring - is partial scoring enabled (if undefined set to to true)\n * @param {*} session\n * @param {Object} env\n * @param {boolean} env.partialScoring - is partial scoring enabled (if undefined default to true) This overrides\n * `model.partialScoring`.\n */\nexport function outcome(model, session, env = {}) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const score = getScore(model, session);\n\n resolve({\n score: partialScoringEnabled ? score : Math.floor(score),\n empty: false,\n });\n });\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { choices } = question;\n const value = {};\n\n if (choices) {\n Object.keys(choices).forEach((key, i) => {\n const correctChoices = choices[key] && choices[key].filter((c) => c.correct);\n\n value[i] = correctChoices && correctChoices[0].value;\n });\n }\n\n resolve({\n id: '1',\n value,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { markup, choices } = model;\n const { maxResponseAreas, maxResponseAreaChoices } = config;\n const errors = {};\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfResponseAreas = ((markup || '').match(/\\{\\{(\\d+)\\}\\}/g) || []).length;\n\n if (nbOfResponseAreas > maxResponseAreas) {\n errors.responseAreasError = `No more than ${maxResponseAreas} response areas should be defined.`;\n } else if (nbOfResponseAreas < 1) {\n errors.responseAreasError = 'There should be defined at least 1 response area.';\n }\n\n (Object.keys(choices) || []).forEach((choiceKey) => {\n if (choices[choiceKey] && choices[choiceKey].length > maxResponseAreaChoices) {\n errors.responseAreaChoicesError = `No more than ${maxResponseAreaChoices} choices per response area should be defined.`;\n }\n });\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,QAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,gBAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA,IAAAK,MAAA,GAAAL,OAAA;AAEA,MAAMM,WAAW,GAAIC,OAAO,IAAK;EAC/B,IAAIA,OAAO,EAAE;IACX,OAAO,SAAS;EAClB;EAEA,OAAO,WAAW;AACpB,CAAC;AAEM,MAAMC,SAAS,GAAIC,QAAQ,KAAM;EAAE,GAAGC,iBAAQ;EAAE,GAAGD;AAAS,CAAC,CAAC;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA;AANAE,OAAA,CAAAH,SAAA,GAAAA,SAAA;AAOO,eAAeI,KAAKA,CAACH,QAAQ,EAAEI,OAAO,EAAEC,GAAG,EAAEC,aAAa,EAAE;EAC/D,MAAMC,kBAAkB,GAAGR,SAAS,CAACC,QAAQ,CAAC;EAC9C,MAAM;IAAEQ,KAAK,GAAG,CAAC;EAAE,CAAC,GAAGJ,OAAO,IAAI,CAAC,CAAC;EACpC,IAAIK,OAAO,GAAG,IAAAC,eAAM,EAClBH,kBAAkB,CAACE,OAAO,EAC1B,CAACE,GAAG,EAAEC,IAAI,EAAEC,GAAG,KAAK;IAClBF,GAAG,CAACE,GAAG,CAAC,GAAG,IAAAC,YAAG,EAACF,IAAI,EAAGG,MAAM,IAAKA,MAAM,CAAC;IAExC,OAAOJ,GAAG;EACZ,CAAC,EACD,CAAC,CACH,CAAC;EAED,IAAIK,QAAQ,GAAG,CAAC,CAAC;EAEjB,IAAIX,GAAG,CAACY,IAAI,KAAK,UAAU,EAAE;IAC3B,MAAMC,mBAAmB,GAAG,IAAAC,6BAAsB,EAACZ,kBAAkB,CAAC;IACtE,MAAMa,cAAc,GAAGC,MAAM,CAACC,IAAI,CAACJ,mBAAmB,CAAC,CAACK,MAAM;IAC9D,IAAIC,gBAAgB,GAAG,CAAC;IAExB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,cAAc,EAAEK,CAAC,EAAE,EAAE;MACvC,MAAMC,MAAM,GAAG,IAAAhB,eAAM,EACnBQ,mBAAmB,EACnB,CAACP,GAAG,EAAEF,OAAO,EAAEI,GAAG,KAAK;QACrB,MAAMc,MAAM,GAAInB,KAAK,IAAIA,KAAK,CAACK,GAAG,CAAC,IAAK,EAAE;QAC1C,MAAMe,aAAa,GAAGnB,OAAO,CAACgB,CAAC,CAAC,IAAI,EAAE;QACtC,MAAMI,SAAS,GAAGF,MAAM,IAAIC,aAAa,IAAIA,aAAa,KAAKD,MAAM;QAErEhB,GAAG,CAACK,QAAQ,CAACH,GAAG,CAAC,GAAGhB,WAAW,CAACgC,SAAS,CAAC;QAE1C,IAAIA,SAAS,EAAE;UACblB,GAAG,CAACa,gBAAgB,IAAI,CAAC;QAC3B;QAEA,OAAOb,GAAG;MACZ,CAAC,EACD;QAAEa,gBAAgB,EAAE,CAAC;QAAER,QAAQ,EAAE,CAAC;MAAE,CACtC,CAAC;MAED,IAAIU,MAAM,CAACF,gBAAgB,IAAIA,gBAAgB,EAAE;QAC/CA,gBAAgB,GAAGE,MAAM,CAACF,gBAAgB;QAC1CR,QAAQ,GAAGU,MAAM,CAACV,QAAQ;MAC5B;MAEA,IAAIU,MAAM,CAACF,gBAAgB,KAAKJ,cAAc,EAAE;QAC9C;MACF;IACF;EACF;EAEA,MAAMU,eAAe,GAAG,IAAAC,4BAAW,EAACxB,kBAAkB,EAAEH,OAAO,EAAEC,GAAG,CAAC;EAErE,IAAI,CAACyB,eAAe,EAAE;IACpB,MAAME,cAAc,GAAG,CAAC,CAAC;IACzB,MAAMV,IAAI,GAAGD,MAAM,CAACC,IAAI,CAACb,OAAO,CAAC;IAEjC,MAAMwB,EAAE,GAAIC,IAAI,IAAK,CAACC,EAAE,EAAEC,OAAO,EAAEC,MAAM,KAAK;MAC5C,OAAO,IAAIC,OAAO,CAAEC,OAAO,IAAK;QAC9BP,cAAc,CAACE,IAAI,CAAC,GAAGG,MAAM,CAACL,cAAc;QAC5CO,OAAO,CAAC,CAAC;MACX,CAAC,CAAC;IACJ,CAAC;IAED,IAAId,CAAC;IAEL,KAAKA,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,IAAI,CAACC,MAAM,EAAEE,CAAC,EAAE,EAAE;MAChC,MAAMZ,GAAG,GAAGS,IAAI,CAACG,CAAC,CAAC;MACnB,MAAMe,YAAY,GAAGpC,OAAO,EAAE4B,cAAc,GAAGnB,GAAG,CAAC;MAEnDJ,OAAO,CAACI,GAAG,CAAC,GAAG,MAAM,IAAA4B,mCAAkB,EACrChC,OAAO,CAACI,GAAG,CAAC;MACZ;MACA;MACA;QAAEmB,cAAc,EAAEU,KAAK,CAACC,OAAO,CAACH,YAAY,CAAC,GAAGA,YAAY,GAAG;MAAG,CAAC,EACnEP,EAAE,CAACpB,GAAG,CAAC,EACP,OACF,CAAC;IACH;IAEA,IAAI,CAAC,IAAA+B,gBAAO,EAACZ,cAAc,CAAC,EAAE;MAC5B,IAAI5B,OAAO,IAAIE,aAAa,IAAI,OAAOA,aAAa,KAAK,UAAU,EAAE;QACnEA,aAAa,CAACF,OAAO,CAAC+B,EAAE,EAAE/B,OAAO,CAACgC,OAAO,EAAE;UACzCJ;QACF,CAAC,CAAC,CAACa,KAAK,CAAEC,CAAC,IAAK;UACd;UACAC,OAAO,CAACC,KAAK,CAAC,uBAAuB,EAAEF,CAAC,CAAC;QAC3C,CAAC,CAAC;MACJ;IACF;EACF;EAEA,IAAIG,mBAAmB,GAAG,IAAI;EAC9B,IAAIC,SAAS,GAAG,IAAI;EAEpB,MAAMC,yBAAyB,GAAG,CAAC9B,MAAM,CAACC,IAAI,CAACb,OAAO,CAAC,IAAI,EAAE,EAAEC,MAAM,CAAC,CAAC0C,GAAG,EAAEC,YAAY,KAAK;IAC3FD,GAAG,CAACC,YAAY,CAAC,GAAG,CAAC5C,OAAO,CAAC4C,YAAY,CAAC,IAAI,EAAE,EAAEvC,GAAG,CAAEC,MAAM,KAAM;MACjE,GAAGA,MAAM;MACTmC,SAAS,EAAE;IACb,CAAC,CAAC,CAAC;IAEH,OAAOE,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;EAEN,IAAI/C,GAAG,CAACiD,IAAI,KAAK,YAAY,KAAKjD,GAAG,CAACY,IAAI,KAAK,MAAM,IAAIZ,GAAG,CAACY,IAAI,KAAK,UAAU,CAAC,EAAE;IACjFiC,SAAS,GAAG3C,kBAAkB,CAACgD,gBAAgB,GAAGhD,kBAAkB,CAAC2C,SAAS,GAAG,IAAI;IACrFD,mBAAmB,GAAG1C,kBAAkB,CAACiD,0BAA0B,GAC/DjD,kBAAkB,CAAC0C,mBAAmB,GACtC,IAAI;IAERxC,OAAO,GAAGF,kBAAkB,CAACkD,sBAAsB,GAAGlD,kBAAkB,CAACE,OAAO,GAAG0C,yBAAyB;EAC9G,CAAC,MAAM;IACLD,SAAS,GAAG,IAAI;IAChBD,mBAAmB,GAAG,IAAI;IAC1BxC,OAAO,GAAG0C,yBAAyB;EACrC;EAEA,MAAMO,GAAG,GAAG;IACVC,QAAQ,EAAEtD,GAAG,CAACY,IAAI,KAAK,QAAQ;IAC/BA,IAAI,EAAEZ,GAAG,CAACY,IAAI;IACd2C,MAAM,EAAErD,kBAAkB,CAACsD,aAAa,GAAGtD,kBAAkB,CAACqD,MAAM,GAAG,IAAI;IAC3EE,WAAW,EAAEvD,kBAAkB,CAACuD,WAAW;IAC3CC,MAAM,EAAExD,kBAAkB,CAACwD,MAAM;IACjCtD,OAAO;IACPO,QAAQ;IAERgD,eAAe,EAAE3D,GAAG,CAACY,IAAI,KAAK,UAAU,GAAGgD,QAAQ,CAAC1D,kBAAkB,EAAEH,OAAO,CAAC,KAAK,CAAC,GAAG8D,SAAS;IAClGhB,SAAS;IACTD,mBAAmB;IACnBkB,QAAQ,EAAE5D,kBAAkB,CAAC4D,QAAQ;IACrCC,aAAa,EAAE7D,kBAAkB,CAAC6D;EACpC,CAAC;EAEH,OAAOV,GAAG;AACZ;AAEO,MAAMO,QAAQ,GAAGA,CAACI,MAAM,EAAEjE,OAAO,KAAK;EAC3C,MAAM;IAAEI,KAAK,GAAG,CAAC;EAAE,CAAC,GAAGJ,OAAO,IAAI,CAAC,CAAC;EACpC,MAAMkE,QAAQ,GAAGD,MAAM,IAAIA,MAAM,CAAC5D,OAAO,GAAGY,MAAM,CAACC,IAAI,CAAC+C,MAAM,CAAC5D,OAAO,CAAC,CAACc,MAAM,GAAG,CAAC;EAClF,MAAML,mBAAmB,GAAG,IAAAC,6BAAsB,EAACkD,MAAM,CAAC;EAC1D,IAAIE,YAAY,GAAG,CAAC;EAEpB,KAAK,IAAI9C,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6C,QAAQ,EAAE7C,CAAC,EAAE,EAAE;IACjC,MAAMC,MAAM,GAAG,IAAAhB,eAAM,EACnBQ,mBAAmB,EACnB,CAACsD,KAAK,EAAE/D,OAAO,EAAEI,GAAG,KAAK;MACvB,MAAMc,MAAM,GAAInB,KAAK,IAAIA,KAAK,CAACK,GAAG,CAAC,IAAK,EAAE;MAC1C,MAAMe,aAAa,GAAGnB,OAAO,CAACgB,CAAC,CAAC,IAAI,EAAE;MAEtC,IAAIG,aAAa,IAAID,MAAM,IAAIC,aAAa,KAAKD,MAAM,EAAE;QACvD,OAAO6C,KAAK;MACd;MAEA,OAAOA,KAAK,GAAG,CAAC;IAClB,CAAC,EACDF,QACF,CAAC;IAED,IAAI5C,MAAM,GAAG6C,YAAY,EAAE;MACzBA,YAAY,GAAG7C,MAAM;IACvB;IAEA,IAAIA,MAAM,KAAK4C,QAAQ,EAAE;MACvB;IACF;EACF;EAEA,MAAMG,GAAG,GAAG,CAACF,YAAY,GAAGD,QAAQ,EAAEI,OAAO,CAAC,CAAC,CAAC;EAEhD,OAAOC,UAAU,CAACF,GAAG,CAAC;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXAvE,OAAA,CAAA+D,QAAA,GAAAA,QAAA;AAYO,SAASW,OAAOA,CAACzE,KAAK,EAAEC,OAAO,EAAEC,GAAG,GAAG,CAAC,CAAC,EAAE;EAChD,OAAO,IAAIiC,OAAO,CAAEC,OAAO,IAAK;IAC9B,IAAI,CAACnC,OAAO,IAAI,IAAAwC,gBAAO,EAACxC,OAAO,CAAC,EAAE;MAChCmC,OAAO,CAAC;QAAEsC,KAAK,EAAE,CAAC;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;IACpC;IAEA,MAAMC,qBAAqB,GAAGC,+BAAc,CAACC,OAAO,CAAC9E,KAAK,EAAEE,GAAG,CAAC;IAChE,MAAMwE,KAAK,GAAGZ,QAAQ,CAAC9D,KAAK,EAAEC,OAAO,CAAC;IAEtCmC,OAAO,CAAC;MACNsC,KAAK,EAAEE,qBAAqB,GAAGF,KAAK,GAAGK,IAAI,CAACC,KAAK,CAACN,KAAK,CAAC;MACxDC,KAAK,EAAE;IACT,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;AAEO,MAAMM,4BAA4B,GAAGA,CAACpF,QAAQ,EAAEK,GAAG,KAAK;EAC7D,OAAO,IAAIiC,OAAO,CAAEC,OAAO,IAAK;IAC9B,IAAIlC,GAAG,CAACY,IAAI,KAAK,UAAU,IAAIZ,GAAG,CAACiD,IAAI,KAAK,YAAY,EAAE;MACxD,MAAM;QAAE7C;MAAQ,CAAC,GAAGT,QAAQ;MAC5B,MAAMQ,KAAK,GAAG,CAAC,CAAC;MAEhB,IAAIC,OAAO,EAAE;QACXY,MAAM,CAACC,IAAI,CAACb,OAAO,CAAC,CAAC4E,OAAO,CAAC,CAACxE,GAAG,EAAEY,CAAC,KAAK;UACvC,MAAM6D,cAAc,GAAG7E,OAAO,CAACI,GAAG,CAAC,IAAIJ,OAAO,CAACI,GAAG,CAAC,CAAC0E,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAAC1F,OAAO,CAAC;UAE5EU,KAAK,CAACiB,CAAC,CAAC,GAAG6D,cAAc,IAAIA,cAAc,CAAC,CAAC,CAAC,CAAC9E,KAAK;QACtD,CAAC,CAAC;MACJ;MAEA+B,OAAO,CAAC;QACNJ,EAAE,EAAE,GAAG;QACP3B;MACF,CAAC,CAAC;IACJ,CAAC,MAAM;MACL+B,OAAO,CAAC,IAAI,CAAC;IACf;EACF,CAAC,CAAC;AACJ,CAAC;;AAED;AAAArC,OAAA,CAAAkF,4BAAA,GAAAA,4BAAA;AACA,MAAMK,YAAY,GAAIC,IAAI,IAAK,CAACA,IAAI,IAAI,EAAE,EAAEC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;;AAEtE;AACA,MAAMC,UAAU,GAAIF,IAAI,IAAK,CAACA,IAAI,IAAI,EAAE,EAAEG,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;AAEpF,MAAMC,QAAQ,GAAGA,CAAC3F,KAAK,GAAG,CAAC,CAAC,EAAEkE,MAAM,GAAG,CAAC,CAAC,KAAK;EACnD,MAAM;IAAEN,MAAM;IAAEtD;EAAQ,CAAC,GAAGN,KAAK;EACjC,MAAM;IAAE4F,gBAAgB;IAAEC;EAAuB,CAAC,GAAG3B,MAAM;EAC3D,MAAM4B,MAAM,GAAG,CAAC,CAAC;EAEjB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,WAAW,CAAC,CAACZ,OAAO,CAAEa,KAAK,IAAK;IAChE,IAAI7B,MAAM,CAAC6B,KAAK,CAAC,EAAEC,QAAQ,IAAI,CAACP,UAAU,CAACzF,KAAK,CAAC+F,KAAK,CAAC,CAAC,EAAE;MACxDD,MAAM,CAACC,KAAK,CAAC,GAAG,yBAAyB;IAC3C;EACF,CAAC,CAAC;EAEF,MAAME,iBAAiB,GAAG,CAAC,CAACrC,MAAM,IAAI,EAAE,EAAEsC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE9E,MAAM;EAE/E,IAAI6E,iBAAiB,GAAGL,gBAAgB,EAAE;IACxCE,MAAM,CAACK,kBAAkB,GAAG,gBAAgBP,gBAAgB,oCAAoC;EAClG,CAAC,MAAM,IAAIK,iBAAiB,GAAG,CAAC,EAAE;IAChCH,MAAM,CAACK,kBAAkB,GAAG,mDAAmD;EACjF;EAEA,CAACjF,MAAM,CAACC,IAAI,CAACb,OAAO,CAAC,IAAI,EAAE,EAAE4E,OAAO,CAAEkB,SAAS,IAAK;IAClD,IAAI9F,OAAO,CAAC8F,SAAS,CAAC,IAAI9F,OAAO,CAAC8F,SAAS,CAAC,CAAChF,MAAM,GAAGyE,sBAAsB,EAAE;MAC5EC,MAAM,CAACO,wBAAwB,GAAG,gBAAgBR,sBAAsB,+CAA+C;IACzH;EACF,CAAC,CAAC;EAEF,OAAOC,MAAM;AACf,CAAC;AAAC/F,OAAA,CAAA4F,QAAA,GAAAA,QAAA","ignoreList":[]}