@pie-element/charting 10.1.0 → 10.2.0-mui-update.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 +66 -0
- package/configure/CHANGELOG.md +66 -0
- package/configure/lib/__tests__/configure.test.js +215 -0
- package/configure/lib/__tests__/correctResponse.test.js +151 -0
- package/configure/lib/charting-config.js +150 -221
- package/configure/lib/charting-config.js.map +1 -1
- package/configure/lib/configure.js +280 -379
- package/configure/lib/configure.js.map +1 -1
- package/configure/lib/correct-response.js +184 -259
- package/configure/lib/correct-response.js.map +1 -1
- package/configure/lib/defaults.js +3 -5
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +100 -164
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/utils.js +25 -42
- package/configure/lib/utils.js.map +1 -1
- package/configure/package.json +12 -10
- package/controller/CHANGELOG.md +52 -0
- package/controller/lib/__tests__/index.test.js +1676 -0
- package/controller/lib/defaults.js +3 -5
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +162 -231
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +2 -2
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/main.test.js +40 -0
- package/lib/index.js +53 -100
- package/lib/index.js.map +1 -1
- package/lib/main.js +146 -209
- package/lib/main.js.map +1 -1
- package/package.json +12 -10
- package/LICENSE.md +0 -5
package/controller/lib/index.js
CHANGED
|
@@ -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,119 +9,82 @@ exports.model = model;
|
|
|
10
9
|
exports.normalize = void 0;
|
|
11
10
|
exports.outcome = outcome;
|
|
12
11
|
exports.validate = exports.setCorrectness = void 0;
|
|
13
|
-
|
|
14
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
15
|
-
|
|
16
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
-
|
|
18
12
|
var _debug = _interopRequireDefault(require("debug"));
|
|
19
|
-
|
|
20
13
|
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
21
|
-
|
|
22
14
|
var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
|
|
23
|
-
|
|
24
15
|
var _pick = _interopRequireDefault(require("lodash/pick"));
|
|
25
|
-
|
|
26
16
|
var _defaults = _interopRequireDefault(require("./defaults"));
|
|
27
|
-
|
|
28
17
|
var _controllerUtils = require("@pie-lib/controller-utils");
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
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; }
|
|
34
|
-
|
|
35
|
-
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; }
|
|
36
|
-
|
|
37
|
-
var log = (0, _debug["default"])('@pie-element:graphing:controller');
|
|
38
|
-
|
|
39
|
-
var lowerCase = function lowerCase(string) {
|
|
40
|
-
return (string || '').toLowerCase();
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
var checkLabelsEquality = function checkLabelsEquality(givenAnswerLabel, correctAnswerLabel) {
|
|
44
|
-
return lowerCase(givenAnswerLabel) === lowerCase(correctAnswerLabel);
|
|
45
|
-
};
|
|
46
|
-
|
|
18
|
+
const log = (0, _debug.default)('@pie-element:graphing:controller');
|
|
19
|
+
const lowerCase = string => (string || '').toLowerCase();
|
|
20
|
+
const checkLabelsEquality = (givenAnswerLabel, correctAnswerLabel) => lowerCase(givenAnswerLabel) === lowerCase(correctAnswerLabel);
|
|
47
21
|
exports.checkLabelsEquality = checkLabelsEquality;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}) : [];
|
|
58
|
-
};
|
|
59
|
-
|
|
22
|
+
const setCorrectness = (answers, partialScoring) => answers ? answers.map(answer => ({
|
|
23
|
+
...answer,
|
|
24
|
+
correctness: {
|
|
25
|
+
value: partialScoring ? 'incorrect' : 'correct',
|
|
26
|
+
label: partialScoring ? 'incorrect' : 'correct'
|
|
27
|
+
}
|
|
28
|
+
})) : [];
|
|
60
29
|
exports.setCorrectness = setCorrectness;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
};
|
|
65
|
-
|
|
30
|
+
const normalize = question => ({
|
|
31
|
+
..._defaults.default,
|
|
32
|
+
...question
|
|
33
|
+
});
|
|
66
34
|
exports.normalize = normalize;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var isPartialScoring = _controllerUtils.partialScoring.enabled({
|
|
35
|
+
const getScore = (question, session, env = {}) => {
|
|
36
|
+
const {
|
|
37
|
+
correctAnswer,
|
|
38
|
+
data: initialData = [],
|
|
39
|
+
scoringType
|
|
40
|
+
} = question;
|
|
41
|
+
let correctResponses = [];
|
|
42
|
+
const isPartialScoring = _controllerUtils.partialScoring.enabled({
|
|
77
43
|
partialScoring: scoringType !== undefined ? scoringType === 'partial scoring' : scoringType
|
|
78
44
|
}, env);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
var answers = setCorrectness(session && session.answer || defaultAnswers, isPartialScoring);
|
|
86
|
-
var result = 0;
|
|
87
|
-
|
|
45
|
+
const {
|
|
46
|
+
data: correctAnswers = []
|
|
47
|
+
} = correctAnswer || {};
|
|
48
|
+
const defaultAnswers = filterCategories(initialData);
|
|
49
|
+
let answers = setCorrectness(session && session.answer || defaultAnswers, isPartialScoring);
|
|
50
|
+
let result = 0;
|
|
88
51
|
if (isPartialScoring) {
|
|
89
52
|
// if score type is "partial scoring"
|
|
90
53
|
// maxScore is calculated based on the correct response
|
|
91
54
|
// score is calculated based on the given response
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
55
|
+
let maxScore = 0;
|
|
56
|
+
let score = 0;
|
|
57
|
+
const scoreForLabelAndValueEditable = (answer, corrAnswer) => {
|
|
58
|
+
const {
|
|
59
|
+
value,
|
|
60
|
+
label,
|
|
61
|
+
index
|
|
62
|
+
} = answer;
|
|
63
|
+
const valueIsCorrect = value === corrAnswer.value;
|
|
64
|
+
const labelIsCorrect = checkLabelsEquality(label, corrAnswer.label);
|
|
101
65
|
maxScore += 2;
|
|
102
|
-
|
|
103
66
|
if (valueIsCorrect) {
|
|
104
|
-
|
|
67
|
+
score += 1;
|
|
105
68
|
answer.correctness.value = 'correct';
|
|
106
69
|
}
|
|
107
|
-
|
|
108
70
|
if (labelIsCorrect) {
|
|
109
|
-
|
|
71
|
+
score += 1;
|
|
110
72
|
answer.correctness.label = 'correct';
|
|
111
73
|
}
|
|
112
|
-
|
|
113
74
|
if (valueIsCorrect && labelIsCorrect) {
|
|
114
75
|
correctResponses.push({
|
|
115
76
|
label: label,
|
|
116
77
|
index: index
|
|
117
78
|
});
|
|
118
79
|
}
|
|
119
|
-
};
|
|
120
|
-
|
|
80
|
+
};
|
|
121
81
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
82
|
+
// if given answer has more categories than the correct answers, the "extra" will be ignored
|
|
83
|
+
correctAnswers.forEach((corrAnswer, index) => {
|
|
84
|
+
const defaultAnswer = defaultAnswers[index];
|
|
85
|
+
const answer = answers[index];
|
|
125
86
|
|
|
87
|
+
// if there is a corresponding category at the same position in the given answer
|
|
126
88
|
if (answer) {
|
|
127
89
|
// if there is a corresponding category at the same position in the default answer
|
|
128
90
|
if (defaultAnswer) {
|
|
@@ -130,17 +92,17 @@ var getScore = function getScore(question, session) {
|
|
|
130
92
|
// it means that this category values only one point (only the value can be changed)
|
|
131
93
|
if (!defaultAnswer.editable && answer.interactive) {
|
|
132
94
|
maxScore += 1;
|
|
133
|
-
|
|
134
95
|
if (answer.value === corrAnswer.value) {
|
|
135
|
-
|
|
96
|
+
score += 1;
|
|
136
97
|
answer.correctness.value = 'correct';
|
|
137
98
|
correctResponses.push({
|
|
138
99
|
label: answer.label,
|
|
139
100
|
index: index
|
|
140
101
|
});
|
|
141
102
|
}
|
|
103
|
+
answer.correctness.label = 'correct';
|
|
142
104
|
|
|
143
|
-
|
|
105
|
+
// if category's label (in default answer) was editable
|
|
144
106
|
// it means that this category values 2 points (both label and value can be changed)
|
|
145
107
|
} else if (defaultAnswer.editable && answer.interactive) {
|
|
146
108
|
scoreForLabelAndValueEditable(answer, corrAnswer);
|
|
@@ -162,131 +124,120 @@ var getScore = function getScore(question, session) {
|
|
|
162
124
|
maxScore += 2;
|
|
163
125
|
}
|
|
164
126
|
});
|
|
165
|
-
result = maxScore ?
|
|
127
|
+
result = maxScore ? score / maxScore : 0;
|
|
166
128
|
} else {
|
|
167
129
|
// all-or-nothing scoring: overall score is 1 only if lengths and all values/labels match
|
|
168
|
-
result = correctAnswers.length === answers.length ? 1 : 0;
|
|
169
|
-
|
|
170
|
-
answers = answers.map(function (answer, index) {
|
|
171
|
-
var correctAnswer = correctAnswers[index];
|
|
172
|
-
var valueIsCorrect = correctAnswer ? answer.value === correctAnswer.value : false;
|
|
173
|
-
var labelIsCorrect = correctAnswer ? lowerCase(answer.label) === lowerCase(correctAnswer.label) : false;
|
|
130
|
+
result = correctAnswers.length === answers.length ? 1 : 0;
|
|
174
131
|
|
|
132
|
+
// regardless of overall result, mark each answer individually for user feedback
|
|
133
|
+
answers = answers.map((answer, index) => {
|
|
134
|
+
const correctAnswer = correctAnswers[index];
|
|
135
|
+
const valueIsCorrect = correctAnswer ? answer.value === correctAnswer.value : false;
|
|
136
|
+
const labelIsCorrect = correctAnswer ? lowerCase(answer.label) === lowerCase(correctAnswer.label) : false;
|
|
175
137
|
if (!valueIsCorrect || !labelIsCorrect) {
|
|
176
138
|
result = 0;
|
|
177
139
|
}
|
|
178
|
-
|
|
179
140
|
if (valueIsCorrect && labelIsCorrect) {
|
|
180
141
|
correctResponses.push({
|
|
181
142
|
label: answer.label,
|
|
182
|
-
index
|
|
143
|
+
index
|
|
183
144
|
});
|
|
184
145
|
}
|
|
185
|
-
|
|
186
|
-
|
|
146
|
+
return {
|
|
147
|
+
...answer,
|
|
187
148
|
correctness: {
|
|
188
149
|
value: valueIsCorrect ? 'correct' : 'incorrect',
|
|
189
150
|
label: labelIsCorrect ? 'correct' : 'incorrect'
|
|
190
151
|
}
|
|
191
|
-
}
|
|
152
|
+
};
|
|
192
153
|
});
|
|
193
154
|
}
|
|
194
|
-
|
|
195
|
-
var score = {
|
|
155
|
+
const score = {
|
|
196
156
|
score: parseFloat(result.toFixed(2)),
|
|
197
|
-
answers
|
|
157
|
+
answers
|
|
198
158
|
};
|
|
199
|
-
|
|
200
159
|
if (env.extraProps && env.extraProps.correctResponseEnabled) {
|
|
201
160
|
score.correctResponses = correctResponses;
|
|
202
161
|
}
|
|
203
|
-
|
|
204
162
|
return score;
|
|
205
|
-
}; // eslint-disable-next-line no-unused-vars
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
exports.getScore = getScore;
|
|
209
|
-
|
|
210
|
-
var filterCategories = function filterCategories(categories) {
|
|
211
|
-
return categories ? categories.map(function (_ref2) {
|
|
212
|
-
var deletable = _ref2.deletable,
|
|
213
|
-
rest = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
|
|
214
|
-
return rest;
|
|
215
|
-
}) : [];
|
|
216
163
|
};
|
|
217
164
|
|
|
165
|
+
// eslint-disable-next-line no-unused-vars
|
|
166
|
+
exports.getScore = getScore;
|
|
167
|
+
const filterCategories = categories => categories ? categories.map(({
|
|
168
|
+
deletable,
|
|
169
|
+
...rest
|
|
170
|
+
}) => rest) : [];
|
|
218
171
|
exports.filterCategories = filterCategories;
|
|
219
|
-
|
|
220
172
|
function model(question, session, env) {
|
|
221
|
-
return new Promise(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
173
|
+
return new Promise(resolve => {
|
|
174
|
+
const normalizedQuestion = normalize(question);
|
|
175
|
+
const {
|
|
176
|
+
addCategoryEnabled,
|
|
177
|
+
chartType,
|
|
178
|
+
data,
|
|
179
|
+
domain,
|
|
180
|
+
graph,
|
|
181
|
+
prompt,
|
|
182
|
+
promptEnabled,
|
|
183
|
+
range,
|
|
184
|
+
rationale,
|
|
185
|
+
title,
|
|
186
|
+
rationaleEnabled,
|
|
187
|
+
teacherInstructions,
|
|
188
|
+
teacherInstructionsEnabled,
|
|
189
|
+
correctAnswer,
|
|
190
|
+
scoringType,
|
|
191
|
+
studentNewCategoryDefaultLabel,
|
|
192
|
+
language,
|
|
193
|
+
extraCSSRules
|
|
194
|
+
} = normalizedQuestion;
|
|
195
|
+
const correctInfo = {
|
|
242
196
|
correctness: 'incorrect',
|
|
243
197
|
score: '0%'
|
|
244
198
|
};
|
|
245
|
-
|
|
246
|
-
addCategoryEnabled
|
|
247
|
-
chartType
|
|
199
|
+
const base = {
|
|
200
|
+
addCategoryEnabled,
|
|
201
|
+
chartType,
|
|
248
202
|
data: filterCategories(data),
|
|
249
|
-
domain
|
|
250
|
-
graph
|
|
203
|
+
domain,
|
|
204
|
+
graph,
|
|
251
205
|
prompt: promptEnabled ? prompt : null,
|
|
252
|
-
range
|
|
253
|
-
rationale
|
|
254
|
-
title
|
|
206
|
+
range,
|
|
207
|
+
rationale,
|
|
208
|
+
title,
|
|
255
209
|
size: graph,
|
|
256
210
|
showToggle: false,
|
|
257
211
|
correctness: correctInfo,
|
|
258
212
|
disabled: env.mode !== 'gather',
|
|
259
|
-
scoringType
|
|
260
|
-
studentNewCategoryDefaultLabel
|
|
261
|
-
language
|
|
262
|
-
env
|
|
263
|
-
extraCSSRules
|
|
213
|
+
scoringType,
|
|
214
|
+
studentNewCategoryDefaultLabel,
|
|
215
|
+
language,
|
|
216
|
+
env,
|
|
217
|
+
extraCSSRules
|
|
264
218
|
};
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
219
|
+
const scoreObject = getScore(normalizedQuestion, session, env);
|
|
220
|
+
const answers = filterCategories(scoreObject.answers);
|
|
268
221
|
if (env.mode === 'view') {
|
|
269
222
|
// eslint-disable-next-line no-unused-vars
|
|
270
|
-
base.correctedAnswer = answers.map(
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
223
|
+
base.correctedAnswer = answers.map(({
|
|
224
|
+
correctness,
|
|
225
|
+
...rest
|
|
226
|
+
}) => {
|
|
227
|
+
return {
|
|
228
|
+
...rest,
|
|
274
229
|
interactive: false
|
|
275
|
-
}
|
|
230
|
+
};
|
|
276
231
|
});
|
|
277
232
|
base.addCategoryEnabled = false;
|
|
278
233
|
}
|
|
279
|
-
|
|
280
234
|
if (env.mode === 'evaluate') {
|
|
281
|
-
var _correctAnswer$data;
|
|
282
|
-
|
|
283
235
|
base.correctedAnswer = answers;
|
|
284
236
|
base.correctAnswer = correctAnswer;
|
|
285
|
-
base.showToggle = !!
|
|
237
|
+
base.showToggle = !!correctAnswer?.data?.length && scoreObject.score !== 1;
|
|
286
238
|
base.addCategoryEnabled = false;
|
|
287
239
|
base.showKeyLegend = true;
|
|
288
240
|
}
|
|
289
|
-
|
|
290
241
|
if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
|
|
291
242
|
base.rationale = rationaleEnabled ? rationale : null;
|
|
292
243
|
base.teacherInstructions = teacherInstructionsEnabled ? teacherInstructions : null;
|
|
@@ -294,43 +245,45 @@ function model(question, session, env) {
|
|
|
294
245
|
base.rationale = null;
|
|
295
246
|
base.teacherInstructions = null;
|
|
296
247
|
}
|
|
297
|
-
|
|
298
248
|
log('base: ', base);
|
|
299
249
|
resolve(base);
|
|
300
250
|
});
|
|
301
251
|
}
|
|
302
|
-
|
|
303
252
|
function outcome(model, session, env) {
|
|
304
|
-
return new Promise(
|
|
305
|
-
|
|
306
|
-
|
|
253
|
+
return new Promise(resolve => {
|
|
254
|
+
const scoreObject = getScore(model, session, env);
|
|
255
|
+
const result = {
|
|
307
256
|
score: scoreObject.score,
|
|
308
|
-
empty: !session || (0, _isEmpty
|
|
257
|
+
empty: !session || (0, _isEmpty.default)(session)
|
|
309
258
|
};
|
|
310
|
-
|
|
311
259
|
if (env.extraProps && env.extraProps.correctResponseEnabled) {
|
|
312
260
|
result.extraProps = {
|
|
313
261
|
correctResponse: scoreObject.correctResponses
|
|
314
262
|
};
|
|
315
263
|
}
|
|
316
|
-
|
|
317
264
|
resolve(result);
|
|
318
265
|
});
|
|
319
266
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
return new Promise(function (resolve) {
|
|
267
|
+
const createCorrectResponseSession = (question, env) => {
|
|
268
|
+
return new Promise(resolve => {
|
|
323
269
|
if (env.mode !== 'evaluate' && env.role === 'instructor') {
|
|
324
|
-
|
|
325
|
-
|
|
270
|
+
const {
|
|
271
|
+
correctAnswer
|
|
272
|
+
} = question;
|
|
273
|
+
let answers = correctAnswer && correctAnswer.data;
|
|
326
274
|
|
|
275
|
+
// for IBX preview mode
|
|
327
276
|
if (env.mode === 'gather') {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
277
|
+
const {
|
|
278
|
+
data
|
|
279
|
+
} = question;
|
|
280
|
+
answers = (correctAnswer && correctAnswer.data || []).map((answer, index) => {
|
|
281
|
+
return {
|
|
282
|
+
...data[index],
|
|
283
|
+
...answer
|
|
284
|
+
};
|
|
331
285
|
});
|
|
332
286
|
}
|
|
333
|
-
|
|
334
287
|
resolve({
|
|
335
288
|
answer: answers,
|
|
336
289
|
id: '1'
|
|
@@ -339,78 +292,56 @@ var createCorrectResponseSession = function createCorrectResponseSession(questio
|
|
|
339
292
|
return resolve(null);
|
|
340
293
|
}
|
|
341
294
|
});
|
|
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
295
|
};
|
|
355
296
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
297
|
+
// remove all html tags
|
|
298
|
+
exports.createCorrectResponseSession = createCorrectResponseSession;
|
|
299
|
+
const getInnerText = html => (html || '').replaceAll(/<[^>]*>/g, '');
|
|
300
|
+
|
|
301
|
+
// remove all html tags except img, iframe and source tag for audio
|
|
302
|
+
const getContent = html => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
|
|
303
|
+
const validate = (model = {}, config = {}) => {
|
|
304
|
+
const {
|
|
305
|
+
correctAnswer,
|
|
306
|
+
data
|
|
307
|
+
} = model || {};
|
|
308
|
+
const {
|
|
309
|
+
data: correctData
|
|
310
|
+
} = correctAnswer || {};
|
|
311
|
+
const categories = correctData || [];
|
|
312
|
+
const errors = {};
|
|
313
|
+
const correctAnswerErrors = {};
|
|
314
|
+
const categoryErrors = {};
|
|
315
|
+
['teacherInstructions', 'prompt', 'rationale'].forEach(field => {
|
|
316
|
+
if (config[field]?.required && !getContent(model[field])) {
|
|
375
317
|
errors[field] = 'This field is required.';
|
|
376
318
|
}
|
|
377
319
|
});
|
|
378
|
-
categories.forEach(
|
|
379
|
-
|
|
380
|
-
|
|
320
|
+
categories.forEach((category, index) => {
|
|
321
|
+
const {
|
|
322
|
+
label
|
|
323
|
+
} = category;
|
|
381
324
|
if (!getInnerText(label)) {
|
|
382
325
|
categoryErrors[index] = 'Content should not be empty. ';
|
|
383
326
|
} else {
|
|
384
|
-
|
|
385
|
-
return c.label === label && index !== i;
|
|
386
|
-
});
|
|
387
|
-
|
|
327
|
+
const identicalAnswer = categories.some((c, i) => c.label === label && index !== i);
|
|
388
328
|
if (identicalAnswer) {
|
|
389
329
|
categoryErrors[index] = 'Category names should be unique. ';
|
|
390
330
|
}
|
|
391
331
|
}
|
|
392
332
|
});
|
|
393
|
-
|
|
394
333
|
if (categories.length < 1 || categories.length > 20) {
|
|
395
334
|
correctAnswerErrors.categoriesError = 'The correct answer should include between 1 and 20 categories.';
|
|
396
|
-
} else if ((0, _isEqual
|
|
397
|
-
return (0, _pick["default"])(category, 'value', 'label');
|
|
398
|
-
}), correctData.map(function (category) {
|
|
399
|
-
return (0, _pick["default"])(category, 'value', 'label');
|
|
400
|
-
}))) {
|
|
335
|
+
} else if ((0, _isEqual.default)(data.map(category => (0, _pick.default)(category, 'value', 'label')), correctData.map(category => (0, _pick.default)(category, 'value', 'label')))) {
|
|
401
336
|
correctAnswerErrors.identicalError = 'Correct answer should not be identical to the chart’s initial state';
|
|
402
337
|
}
|
|
403
|
-
|
|
404
|
-
if (!(0, _isEmpty["default"])(categoryErrors)) {
|
|
338
|
+
if (!(0, _isEmpty.default)(categoryErrors)) {
|
|
405
339
|
errors.categoryErrors = categoryErrors;
|
|
406
340
|
}
|
|
407
|
-
|
|
408
|
-
if (!(0, _isEmpty["default"])(correctAnswerErrors)) {
|
|
341
|
+
if (!(0, _isEmpty.default)(correctAnswerErrors)) {
|
|
409
342
|
errors.correctAnswerErrors = correctAnswerErrors;
|
|
410
343
|
}
|
|
411
|
-
|
|
412
344
|
return errors;
|
|
413
345
|
};
|
|
414
|
-
|
|
415
346
|
exports.validate = validate;
|
|
416
|
-
//# sourceMappingURL=index.js.map
|
|
347
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2lzRW1wdHkiLCJfcGljayIsIl9kZWZhdWx0cyIsIl9jb250cm9sbGVyVXRpbHMiLCJsb2ciLCJkZWJ1ZyIsImxvd2VyQ2FzZSIsInN0cmluZyIsInRvTG93ZXJDYXNlIiwiY2hlY2tMYWJlbHNFcXVhbGl0eSIsImdpdmVuQW5zd2VyTGFiZWwiLCJjb3JyZWN0QW5zd2VyTGFiZWwiLCJleHBvcnRzIiwic2V0Q29ycmVjdG5lc3MiLCJhbnN3ZXJzIiwicGFydGlhbFNjb3JpbmciLCJtYXAiLCJhbnN3ZXIiLCJjb3JyZWN0bmVzcyIsInZhbHVlIiwibGFiZWwiLCJub3JtYWxpemUiLCJxdWVzdGlvbiIsImRlZmF1bHRzIiwiZ2V0U2NvcmUiLCJzZXNzaW9uIiwiZW52IiwiY29ycmVjdEFuc3dlciIsImRhdGEiLCJpbml0aWFsRGF0YSIsInNjb3JpbmdUeXBlIiwiY29ycmVjdFJlc3BvbnNlcyIsImlzUGFydGlhbFNjb3JpbmciLCJlbmFibGVkIiwidW5kZWZpbmVkIiwiY29ycmVjdEFuc3dlcnMiLCJkZWZhdWx0QW5zd2VycyIsImZpbHRlckNhdGVnb3JpZXMiLCJyZXN1bHQiLCJtYXhTY29yZSIsInNjb3JlIiwic2NvcmVGb3JMYWJlbEFuZFZhbHVlRWRpdGFibGUiLCJjb3JyQW5zd2VyIiwiaW5kZXgiLCJ2YWx1ZUlzQ29ycmVjdCIsImxhYmVsSXNDb3JyZWN0IiwicHVzaCIsImZvckVhY2giLCJkZWZhdWx0QW5zd2VyIiwiZWRpdGFibGUiLCJpbnRlcmFjdGl2ZSIsImxlbmd0aCIsInBhcnNlRmxvYXQiLCJ0b0ZpeGVkIiwiZXh0cmFQcm9wcyIsImNvcnJlY3RSZXNwb25zZUVuYWJsZWQiLCJjYXRlZ29yaWVzIiwiZGVsZXRhYmxlIiwicmVzdCIsIm1vZGVsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJub3JtYWxpemVkUXVlc3Rpb24iLCJhZGRDYXRlZ29yeUVuYWJsZWQiLCJjaGFydFR5cGUiLCJkb21haW4iLCJncmFwaCIsInByb21wdCIsInByb21wdEVuYWJsZWQiLCJyYW5nZSIsInJhdGlvbmFsZSIsInRpdGxlIiwicmF0aW9uYWxlRW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJ0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCIsInN0dWRlbnROZXdDYXRlZ29yeURlZmF1bHRMYWJlbCIsImxhbmd1YWdlIiwiZXh0cmFDU1NSdWxlcyIsImNvcnJlY3RJbmZvIiwiYmFzZSIsInNpemUiLCJzaG93VG9nZ2xlIiwiZGlzYWJsZWQiLCJtb2RlIiwic2NvcmVPYmplY3QiLCJjb3JyZWN0ZWRBbnN3ZXIiLCJzaG93S2V5TGVnZW5kIiwicm9sZSIsIm91dGNvbWUiLCJlbXB0eSIsImlzRW1wdHkiLCJjb3JyZWN0UmVzcG9uc2UiLCJjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uIiwiaWQiLCJnZXRJbm5lclRleHQiLCJodG1sIiwicmVwbGFjZUFsbCIsImdldENvbnRlbnQiLCJyZXBsYWNlIiwidmFsaWRhdGUiLCJjb25maWciLCJjb3JyZWN0RGF0YSIsImVycm9ycyIsImNvcnJlY3RBbnN3ZXJFcnJvcnMiLCJjYXRlZ29yeUVycm9ycyIsImZpZWxkIiwicmVxdWlyZWQiLCJjYXRlZ29yeSIsImlkZW50aWNhbEFuc3dlciIsInNvbWUiLCJjIiwiaSIsImNhdGVnb3JpZXNFcnJvciIsImlzRXF1YWwiLCJwaWNrIiwiaWRlbnRpY2FsRXJyb3IiXSwic291cmNlcyI6WyIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5JztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC9waWNrJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJztcblxuaW1wb3J0IHsgcGFydGlhbFNjb3JpbmcgfSBmcm9tICdAcGllLWxpYi9jb250cm9sbGVyLXV0aWxzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtZWxlbWVudDpncmFwaGluZzpjb250cm9sbGVyJyk7XG5cbmNvbnN0IGxvd2VyQ2FzZSA9IChzdHJpbmcpID0+IChzdHJpbmcgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbmV4cG9ydCBjb25zdCBjaGVja0xhYmVsc0VxdWFsaXR5ID0gKGdpdmVuQW5zd2VyTGFiZWwsIGNvcnJlY3RBbnN3ZXJMYWJlbCkgPT5cbiAgbG93ZXJDYXNlKGdpdmVuQW5zd2VyTGFiZWwpID09PSBsb3dlckNhc2UoY29ycmVjdEFuc3dlckxhYmVsKTtcblxuZXhwb3J0IGNvbnN0IHNldENvcnJlY3RuZXNzID0gKGFuc3dlcnMsIHBhcnRpYWxTY29yaW5nKSA9PlxuICBhbnN3ZXJzXG4gICAgPyBhbnN3ZXJzLm1hcCgoYW5zd2VyKSA9PiAoe1xuICAgICAgLi4uYW5zd2VyLFxuICAgICAgY29ycmVjdG5lc3M6IHtcbiAgICAgICAgdmFsdWU6IHBhcnRpYWxTY29yaW5nID8gJ2luY29ycmVjdCcgOiAnY29ycmVjdCcsXG4gICAgICAgIGxhYmVsOiBwYXJ0aWFsU2NvcmluZyA/ICdpbmNvcnJlY3QnIDogJ2NvcnJlY3QnLFxuICAgICAgfSxcbiAgICB9KSlcbiAgICA6IFtdO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplID0gKHF1ZXN0aW9uKSA9PiAoeyAuLi5kZWZhdWx0cywgLi4ucXVlc3Rpb24gfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRTY29yZSA9IChxdWVzdGlvbiwgc2Vzc2lvbiwgZW52ID0ge30pID0+IHtcbiAgY29uc3QgeyBjb3JyZWN0QW5zd2VyLCBkYXRhOiBpbml0aWFsRGF0YSA9IFtdLCBzY29yaW5nVHlwZSB9ID0gcXVlc3Rpb247XG4gIGxldCBjb3JyZWN0UmVzcG9uc2VzID0gW107XG5cbiAgY29uc3QgaXNQYXJ0aWFsU2NvcmluZyA9IHBhcnRpYWxTY29yaW5nLmVuYWJsZWQoXG4gICAgeyBwYXJ0aWFsU2NvcmluZzogc2NvcmluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IHNjb3JpbmdUeXBlID09PSAncGFydGlhbCBzY29yaW5nJyA6IHNjb3JpbmdUeXBlIH0sXG4gICAgZW52LFxuICApO1xuXG4gIGNvbnN0IHsgZGF0YTogY29ycmVjdEFuc3dlcnMgPSBbXSB9ID0gY29ycmVjdEFuc3dlciB8fCB7fTtcbiAgY29uc3QgZGVmYXVsdEFuc3dlcnMgPSBmaWx0ZXJDYXRlZ29yaWVzKGluaXRpYWxEYXRhKTtcblxuICBsZXQgYW5zd2VycyA9IHNldENvcnJlY3RuZXNzKChzZXNzaW9uICYmIHNlc3Npb24uYW5zd2VyKSB8fCBkZWZhdWx0QW5zd2VycywgaXNQYXJ0aWFsU2NvcmluZyk7XG5cbiAgbGV0IHJlc3VsdCA9IDA7XG5cbiAgaWYgKGlzUGFydGlhbFNjb3JpbmcpIHtcbiAgICAvLyBpZiBzY29yZSB0eXBlIGlzIFwicGFydGlhbCBzY29yaW5nXCJcbiAgICAvLyBtYXhTY29yZSBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBjb3JyZWN0IHJlc3BvbnNlXG4gICAgLy8gc2NvcmUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVzcG9uc2VcbiAgICBsZXQgbWF4U2NvcmUgPSAwO1xuICAgIGxldCBzY29yZSA9IDA7XG5cbiAgICBjb25zdCBzY29yZUZvckxhYmVsQW5kVmFsdWVFZGl0YWJsZSA9IChhbnN3ZXIsIGNvcnJBbnN3ZXIpID0+IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIGxhYmVsLCBpbmRleCB9ID0gYW5zd2VyO1xuICAgICAgY29uc3QgdmFsdWVJc0NvcnJlY3QgPSB2YWx1ZSA9PT0gY29yckFuc3dlci52YWx1ZTtcbiAgICAgIGNvbnN0IGxhYmVsSXNDb3JyZWN0ID0gY2hlY2tMYWJlbHNFcXVhbGl0eShsYWJlbCwgY29yckFuc3dlci5sYWJlbCk7XG4gICAgICBtYXhTY29yZSArPSAyO1xuXG4gICAgICBpZiAodmFsdWVJc0NvcnJlY3QpIHtcbiAgICAgICAgc2NvcmUgKz0gMTtcbiAgICAgICAgYW5zd2VyLmNvcnJlY3RuZXNzLnZhbHVlID0gJ2NvcnJlY3QnO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFiZWxJc0NvcnJlY3QpIHtcbiAgICAgICAgc2NvcmUgKz0gMTtcbiAgICAgICAgYW5zd2VyLmNvcnJlY3RuZXNzLmxhYmVsID0gJ2NvcnJlY3QnO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWVJc0NvcnJlY3QgJiYgbGFiZWxJc0NvcnJlY3QpIHtcbiAgICAgICAgY29ycmVjdFJlc3BvbnNlcy5wdXNoKHsgbGFiZWw6IGxhYmVsLCBpbmRleDogaW5kZXggfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGlmIGdpdmVuIGFuc3dlciBoYXMgbW9yZSBjYXRlZ29yaWVzIHRoYW4gdGhlIGNvcnJlY3QgYW5zd2VycywgdGhlIFwiZXh0cmFcIiB3aWxsIGJlIGlnbm9yZWRcbiAgICBjb3JyZWN0QW5zd2Vycy5mb3JFYWNoKChjb3JyQW5zd2VyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdEFuc3dlciA9IGRlZmF1bHRBbnN3ZXJzW2luZGV4XTtcbiAgICAgIGNvbnN0IGFuc3dlciA9IGFuc3dlcnNbaW5kZXhdO1xuXG4gICAgICAvLyBpZiB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGdpdmVuIGFuc3dlclxuICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGRlZmF1bHQgYW5zd2VyXG4gICAgICAgIGlmIChkZWZhdWx0QW5zd2VyKSB7XG4gICAgICAgICAgLy8gaWYgY2F0ZWdvcnkncyBsYWJlbCAoaW4gZGVmYXVsdCBhbnN3ZXIpIHdhcyBub3QgZWRpdGFibGVcbiAgICAgICAgICAvLyBpdCBtZWFucyB0aGF0IHRoaXMgY2F0ZWdvcnkgdmFsdWVzIG9ubHkgb25lIHBvaW50IChvbmx5IHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZClcbiAgICAgICAgICBpZiAoIWRlZmF1bHRBbnN3ZXIuZWRpdGFibGUgJiYgYW5zd2VyLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBtYXhTY29yZSArPSAxO1xuXG4gICAgICAgICAgICBpZiAoYW5zd2VyLnZhbHVlID09PSBjb3JyQW5zd2VyLnZhbHVlKSB7XG4gICAgICAgICAgICAgIHNjb3JlICs9IDE7XG4gICAgICAgICAgICAgIGFuc3dlci5jb3JyZWN0bmVzcy52YWx1ZSA9ICdjb3JyZWN0JztcbiAgICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlcy5wdXNoKHsgbGFiZWw6IGFuc3dlci5sYWJlbCwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5zd2VyLmNvcnJlY3RuZXNzLmxhYmVsID0gJ2NvcnJlY3QnO1xuXG4gICAgICAgICAgICAvLyBpZiBjYXRlZ29yeSdzIGxhYmVsIChpbiBkZWZhdWx0IGFuc3dlcikgd2FzIGVkaXRhYmxlXG4gICAgICAgICAgICAvLyBpdCBtZWFucyB0aGF0IHRoaXMgY2F0ZWdvcnkgdmFsdWVzIDIgcG9pbnRzIChib3RoIGxhYmVsIGFuZCB2YWx1ZSBjYW4gYmUgY2hhbmdlZClcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRBbnN3ZXIuZWRpdGFibGUgJiYgYW5zd2VyLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBzY29yZUZvckxhYmVsQW5kVmFsdWVFZGl0YWJsZShhbnN3ZXIsIGNvcnJBbnN3ZXIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWFuc3dlci5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgYW5zd2VyLmNvcnJlY3RuZXNzLnZhbHVlID0gJ2NvcnJlY3QnO1xuICAgICAgICAgICAgYW5zd2VyLmNvcnJlY3RuZXNzLmxhYmVsID0gJ2NvcnJlY3QnO1xuICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlcy5wdXNoKHsgbGFiZWw6IGFuc3dlci5sYWJlbCwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBjb3JyZXNwb25kaW5nIGNhdGVnb3J5IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBkZWZhdWx0IGFuc3dlclxuICAgICAgICAgIHNjb3JlRm9yTGFiZWxBbmRWYWx1ZUVkaXRhYmxlKGFuc3dlciwgY29yckFuc3dlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vdCBhIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIGdpdmVuIGFuc3dlclxuICAgICAgICAvLyBpdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBhbnN3ZXIgaGFzIGxlc3MgY2F0ZWdvcmllcyB0aGFuIHRoZSBjb3JyZWN0IGFuc3dlclxuICAgICAgICBtYXhTY29yZSArPSAyO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0ID0gbWF4U2NvcmUgPyBzY29yZSAvIG1heFNjb3JlIDogMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBhbGwtb3Itbm90aGluZyBzY29yaW5nOiBvdmVyYWxsIHNjb3JlIGlzIDEgb25seSBpZiBsZW5ndGhzIGFuZCBhbGwgdmFsdWVzL2xhYmVscyBtYXRjaFxuICAgIHJlc3VsdCA9IGNvcnJlY3RBbnN3ZXJzLmxlbmd0aCA9PT0gYW5zd2Vycy5sZW5ndGggPyAxIDogMDtcblxuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygb3ZlcmFsbCByZXN1bHQsIG1hcmsgZWFjaCBhbnN3ZXIgaW5kaXZpZHVhbGx5IGZvciB1c2VyIGZlZWRiYWNrXG4gICAgYW5zd2VycyA9IGFuc3dlcnMubWFwKChhbnN3ZXIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjb3JyZWN0QW5zd2VyID0gY29ycmVjdEFuc3dlcnNbaW5kZXhdO1xuICAgICAgY29uc3QgdmFsdWVJc0NvcnJlY3QgPSBjb3JyZWN0QW5zd2VyID8gYW5zd2VyLnZhbHVlID09PSBjb3JyZWN0QW5zd2VyLnZhbHVlIDogZmFsc2U7XG4gICAgICBjb25zdCBsYWJlbElzQ29ycmVjdCA9IGNvcnJlY3RBbnN3ZXIgPyBsb3dlckNhc2UoYW5zd2VyLmxhYmVsKSA9PT0gbG93ZXJDYXNlKGNvcnJlY3RBbnN3ZXIubGFiZWwpIDogZmFsc2U7XG5cbiAgICAgIGlmICghdmFsdWVJc0NvcnJlY3QgfHwgIWxhYmVsSXNDb3JyZWN0KSB7XG4gICAgICAgIHJlc3VsdCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZUlzQ29ycmVjdCAmJiBsYWJlbElzQ29ycmVjdCkge1xuICAgICAgICBjb3JyZWN0UmVzcG9uc2VzLnB1c2goeyBsYWJlbDogYW5zd2VyLmxhYmVsLCBpbmRleCB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYW5zd2VyLFxuICAgICAgICBjb3JyZWN0bmVzczoge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZUlzQ29ycmVjdCA/ICdjb3JyZWN0JyA6ICdpbmNvcnJlY3QnLFxuICAgICAgICAgIGxhYmVsOiBsYWJlbElzQ29ycmVjdCA/ICdjb3JyZWN0JyA6ICdpbmNvcnJlY3QnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHNjb3JlID0ge1xuICAgIHNjb3JlOiBwYXJzZUZsb2F0KHJlc3VsdC50b0ZpeGVkKDIpKSxcbiAgICBhbnN3ZXJzLFxuICB9O1xuXG4gIGlmIChlbnYuZXh0cmFQcm9wcyAmJiBlbnYuZXh0cmFQcm9wcy5jb3JyZWN0UmVzcG9uc2VFbmFibGVkKSB7XG4gICAgc2NvcmUuY29ycmVjdFJlc3BvbnNlcyA9IGNvcnJlY3RSZXNwb25zZXM7XG4gIH1cblxuICByZXR1cm4gc2NvcmU7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydCBjb25zdCBmaWx0ZXJDYXRlZ29yaWVzID0gKGNhdGVnb3JpZXMpID0+IChjYXRlZ29yaWVzID8gY2F0ZWdvcmllcy5tYXAoKHsgZGVsZXRhYmxlLCAuLi5yZXN0IH0pID0+IHJlc3QpIDogW10pO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9kZWwocXVlc3Rpb24sIHNlc3Npb24sIGVudikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlc3Rpb24gPSBub3JtYWxpemUocXVlc3Rpb24pO1xuICAgIGNvbnN0IHtcbiAgICAgIGFkZENhdGVnb3J5RW5hYmxlZCxcbiAgICAgIGNoYXJ0VHlwZSxcbiAgICAgIGRhdGEsXG4gICAgICBkb21haW4sXG4gICAgICBncmFwaCxcbiAgICAgIHByb21wdCxcbiAgICAgIHByb21wdEVuYWJsZWQsXG4gICAgICByYW5nZSxcbiAgICAgIHJhdGlvbmFsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgcmF0aW9uYWxlRW5hYmxlZCxcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnMsXG4gICAgICB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCxcbiAgICAgIGNvcnJlY3RBbnN3ZXIsXG4gICAgICBzY29yaW5nVHlwZSxcbiAgICAgIHN0dWRlbnROZXdDYXRlZ29yeURlZmF1bHRMYWJlbCxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgZXh0cmFDU1NSdWxlcyxcbiAgICB9ID0gbm9ybWFsaXplZFF1ZXN0aW9uO1xuXG4gICAgY29uc3QgY29ycmVjdEluZm8gPSB7IGNvcnJlY3RuZXNzOiAnaW5jb3JyZWN0Jywgc2NvcmU6ICcwJScgfTtcblxuICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICBhZGRDYXRlZ29yeUVuYWJsZWQsXG4gICAgICBjaGFydFR5cGUsXG4gICAgICBkYXRhOiBmaWx0ZXJDYXRlZ29yaWVzKGRhdGEpLFxuICAgICAgZG9tYWluLFxuICAgICAgZ3JhcGgsXG4gICAgICBwcm9tcHQ6IHByb21wdEVuYWJsZWQgPyBwcm9tcHQgOiBudWxsLFxuICAgICAgcmFuZ2UsXG4gICAgICByYXRpb25hbGUsXG4gICAgICB0aXRsZSxcbiAgICAgIHNpemU6IGdyYXBoLFxuICAgICAgc2hvd1RvZ2dsZTogZmFsc2UsXG4gICAgICBjb3JyZWN0bmVzczogY29ycmVjdEluZm8sXG4gICAgICBkaXNhYmxlZDogZW52Lm1vZGUgIT09ICdnYXRoZXInLFxuICAgICAgc2NvcmluZ1R5cGUsXG4gICAgICBzdHVkZW50TmV3Q2F0ZWdvcnlEZWZhdWx0TGFiZWwsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGVudixcbiAgICAgIGV4dHJhQ1NTUnVsZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IHNjb3JlT2JqZWN0ID0gZ2V0U2NvcmUobm9ybWFsaXplZFF1ZXN0aW9uLCBzZXNzaW9uLCBlbnYpO1xuICAgIGNvbnN0IGFuc3dlcnMgPSBmaWx0ZXJDYXRlZ29yaWVzKHNjb3JlT2JqZWN0LmFuc3dlcnMpO1xuXG4gICAgaWYgKGVudi5tb2RlID09PSAndmlldycpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgYmFzZS5jb3JyZWN0ZWRBbnN3ZXIgPSBhbnN3ZXJzLm1hcCgoeyBjb3JyZWN0bmVzcywgLi4ucmVzdCB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLnJlc3QsIGludGVyYWN0aXZlOiBmYWxzZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIGJhc2UuYWRkQ2F0ZWdvcnlFbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGVudi5tb2RlID09PSAnZXZhbHVhdGUnKSB7XG4gICAgICBiYXNlLmNvcnJlY3RlZEFuc3dlciA9IGFuc3dlcnM7XG4gICAgICBiYXNlLmNvcnJlY3RBbnN3ZXIgPSBjb3JyZWN0QW5zd2VyO1xuICAgICAgYmFzZS5zaG93VG9nZ2xlID0gISFjb3JyZWN0QW5zd2VyPy5kYXRhPy5sZW5ndGggJiYgc2NvcmVPYmplY3Quc2NvcmUgIT09IDE7XG4gICAgICBiYXNlLmFkZENhdGVnb3J5RW5hYmxlZCA9IGZhbHNlO1xuICAgICAgYmFzZS5zaG93S2V5TGVnZW5kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZW52LnJvbGUgPT09ICdpbnN0cnVjdG9yJyAmJiAoZW52Lm1vZGUgPT09ICd2aWV3JyB8fCBlbnYubW9kZSA9PT0gJ2V2YWx1YXRlJykpIHtcbiAgICAgIGJhc2UucmF0aW9uYWxlID0gcmF0aW9uYWxlRW5hYmxlZCA/IHJhdGlvbmFsZSA6IG51bGw7XG4gICAgICBiYXNlLnRlYWNoZXJJbnN0cnVjdGlvbnMgPSB0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCA/IHRlYWNoZXJJbnN0cnVjdGlvbnMgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlLnJhdGlvbmFsZSA9IG51bGw7XG4gICAgICBiYXNlLnRlYWNoZXJJbnN0cnVjdGlvbnMgPSBudWxsO1xuICAgIH1cblxuICAgIGxvZygnYmFzZTogJywgYmFzZSk7XG4gICAgcmVzb2x2ZShiYXNlKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvdXRjb21lKG1vZGVsLCBzZXNzaW9uLCBlbnYpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2NvcmVPYmplY3QgPSBnZXRTY29yZShtb2RlbCwgc2Vzc2lvbiwgZW52KTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzY29yZTogc2NvcmVPYmplY3Quc2NvcmUsXG4gICAgICBlbXB0eTogIXNlc3Npb24gfHwgaXNFbXB0eShzZXNzaW9uKSxcbiAgICB9O1xuICAgIGlmIChlbnYuZXh0cmFQcm9wcyAmJiBlbnYuZXh0cmFQcm9wcy5jb3JyZWN0UmVzcG9uc2VFbmFibGVkKSB7XG4gICAgICByZXN1bHQuZXh0cmFQcm9wcyA9IHsgY29ycmVjdFJlc3BvbnNlOiBzY29yZU9iamVjdC5jb3JyZWN0UmVzcG9uc2VzIH07XG4gICAgfVxuICAgIHJlc29sdmUocmVzdWx0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDb3JyZWN0UmVzcG9uc2VTZXNzaW9uID0gKHF1ZXN0aW9uLCBlbnYpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGVudi5tb2RlICE9PSAnZXZhbHVhdGUnICYmIGVudi5yb2xlID09PSAnaW5zdHJ1Y3RvcicpIHtcbiAgICAgIGNvbnN0IHsgY29ycmVjdEFuc3dlciB9ID0gcXVlc3Rpb247XG5cbiAgICAgIGxldCBhbnN3ZXJzID0gY29ycmVjdEFuc3dlciAmJiBjb3JyZWN0QW5zd2VyLmRhdGE7XG5cbiAgICAgIC8vIGZvciBJQlggcHJldmlldyBtb2RlXG4gICAgICBpZiAoZW52Lm1vZGUgPT09ICdnYXRoZXInKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcXVlc3Rpb247XG5cbiAgICAgICAgYW5zd2VycyA9ICgoY29ycmVjdEFuc3dlciAmJiBjb3JyZWN0QW5zd2VyLmRhdGEpIHx8IFtdKS5tYXAoKGFuc3dlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZGF0YVtpbmRleF0sXG4gICAgICAgICAgICAuLi5hbnN3ZXIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBhbnN3ZXI6IGFuc3dlcnMsXG4gICAgICAgIGlkOiAnMScsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIHJlbW92ZSBhbGwgaHRtbCB0YWdzXG5jb25zdCBnZXRJbm5lclRleHQgPSAoaHRtbCkgPT4gKGh0bWwgfHwgJycpLnJlcGxhY2VBbGwoLzxbXj5dKj4vZywgJycpO1xuXG4vLyByZW1vdmUgYWxsIGh0bWwgdGFncyBleGNlcHQgaW1nLCBpZnJhbWUgYW5kIHNvdXJjZSB0YWcgZm9yIGF1ZGlvXG5jb25zdCBnZXRDb250ZW50ID0gKGh0bWwpID0+IChodG1sIHx8ICcnKS5yZXBsYWNlKC8oPCg/IWltZ3xpZnJhbWV8c291cmNlKShbXj5dKyk+KS9naSwgJycpO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGUgPSAobW9kZWwgPSB7fSwgY29uZmlnID0ge30pID0+IHtcbiAgY29uc3QgeyBjb3JyZWN0QW5zd2VyLCBkYXRhIH0gPSBtb2RlbCB8fCB7fTtcbiAgY29uc3QgeyBkYXRhOiBjb3JyZWN0RGF0YSB9ID0gY29ycmVjdEFuc3dlciB8fCB7fTtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IGNvcnJlY3REYXRhIHx8IFtdO1xuXG4gIGNvbnN0IGVycm9ycyA9IHt9O1xuICBjb25zdCBjb3JyZWN0QW5zd2VyRXJyb3JzID0ge307XG4gIGNvbnN0IGNhdGVnb3J5RXJyb3JzID0ge307XG5cbiAgWyd0ZWFjaGVySW5zdHJ1Y3Rpb25zJywgJ3Byb21wdCcsICdyYXRpb25hbGUnXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgIGlmIChjb25maWdbZmllbGRdPy5yZXF1aXJlZCAmJiAhZ2V0Q29udGVudChtb2RlbFtmaWVsZF0pKSB7XG4gICAgICBlcnJvcnNbZmllbGRdID0gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQuJztcbiAgICB9XG4gIH0pO1xuXG4gIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XG4gICAgY29uc3QgeyBsYWJlbCB9ID0gY2F0ZWdvcnk7XG5cbiAgICBpZiAoIWdldElubmVyVGV4dChsYWJlbCkpIHtcbiAgICAgIGNhdGVnb3J5RXJyb3JzW2luZGV4XSA9ICdDb250ZW50IHNob3VsZCBub3QgYmUgZW1wdHkuICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlkZW50aWNhbEFuc3dlciA9IGNhdGVnb3JpZXMuc29tZSgoYywgaSkgPT4gYy5sYWJlbCA9PT0gbGFiZWwgJiYgaW5kZXggIT09IGkpO1xuXG4gICAgICBpZiAoaWRlbnRpY2FsQW5zd2VyKSB7XG4gICAgICAgIGNhdGVnb3J5RXJyb3JzW2luZGV4XSA9ICdDYXRlZ29yeSBuYW1lcyBzaG91bGQgYmUgdW5pcXVlLiAnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGNhdGVnb3JpZXMubGVuZ3RoIDwgMSB8fCBjYXRlZ29yaWVzLmxlbmd0aCA+IDIwKSB7XG4gICAgY29ycmVjdEFuc3dlckVycm9ycy5jYXRlZ29yaWVzRXJyb3IgPSAnVGhlIGNvcnJlY3QgYW5zd2VyIHNob3VsZCBpbmNsdWRlIGJldHdlZW4gMSBhbmQgMjAgY2F0ZWdvcmllcy4nO1xuICB9IGVsc2UgaWYgKFxuICAgIGlzRXF1YWwoXG4gICAgICBkYXRhLm1hcCgoY2F0ZWdvcnkpID0+IHBpY2soY2F0ZWdvcnksICd2YWx1ZScsICdsYWJlbCcpKSxcbiAgICAgIGNvcnJlY3REYXRhLm1hcCgoY2F0ZWdvcnkpID0+IHBpY2soY2F0ZWdvcnksICd2YWx1ZScsICdsYWJlbCcpKSxcbiAgICApXG4gICkge1xuICAgIGNvcnJlY3RBbnN3ZXJFcnJvcnMuaWRlbnRpY2FsRXJyb3IgPSAnQ29ycmVjdCBhbnN3ZXIgc2hvdWxkIG5vdCBiZSBpZGVudGljYWwgdG8gdGhlIGNoYXJ04oCZcyBpbml0aWFsIHN0YXRlJztcbiAgfVxuXG4gIGlmICghaXNFbXB0eShjYXRlZ29yeUVycm9ycykpIHtcbiAgICBlcnJvcnMuY2F0ZWdvcnlFcnJvcnMgPSBjYXRlZ29yeUVycm9ycztcbiAgfVxuXG4gIGlmICghaXNFbXB0eShjb3JyZWN0QW5zd2VyRXJyb3JzKSkge1xuICAgIGVycm9ycy5jb3JyZWN0QW5zd2VyRXJyb3JzID0gY29ycmVjdEFuc3dlckVycm9ycztcbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUYsc0JBQUEsQ0FB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
|