@tekdi/sunbird-quml-player
Version:
The QuML player library components are powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms (mobile app, web portal, offline desktop app) to drive reusability and maintainability, hence reducing the redundant d
287 lines • 40.7 kB
JavaScript
import { Injectable } from '@angular/core';
import * as _ from 'lodash-es';
import { v4 as uuidv4 } from 'uuid';
import * as i0 from "@angular/core";
export class TransformationService {
getTransformedHierarchy(questionsetMetadata) {
let updatedMetadata = this.getTransformedQuestionSetMetadata(questionsetMetadata);
if (!_.isEmpty(updatedMetadata, 'children')) {
updatedMetadata.children = this.transformChildren(updatedMetadata.children);
}
return updatedMetadata;
}
getTransformedQuestionSetMetadata(data) {
data = this.processMaxScoreProperty(data);
data = _.omit(data, 'version');
data = this.processInstructions(data);
data = this.processBloomsLevel(data);
data = this.processBooleanProps(data);
data = this.processTimeLimits(data);
return data;
}
processMaxScoreProperty(data) {
if (_.has(data, 'maxScore')) {
const outcomeDeclaration = {
maxScore: {
cardinality: 'single',
type: 'integer',
defaultValue: data.maxScore
}
};
data = _.omit(data, 'maxScore');
data['outcomeDeclaration'] = outcomeDeclaration;
}
return data;
}
processInstructions(data) {
if (_.has(data, 'instructions.default')) {
data.instructions = data.instructions.default;
}
return data;
}
processBloomsLevel(data) {
if (_.has(data, 'bloomsLevel')) {
const bLevel = _.get(data, 'bloomsLevel');
_.unset(data, 'bloomsLevel');
_.set(data, 'complexityLevel', [bLevel.toString()]);
}
return data;
}
processBooleanProps(data) {
const booleanProps = ["showSolutions", "showFeedback", "showHints", "showTimer"];
const getBooleanValue = (str) => str === "Yes";
_.forEach(booleanProps, (prop) => {
if (_.has(data, prop)) {
const propVal = data[prop];
data[prop] = getBooleanValue(propVal);
}
});
return data;
}
processTimeLimits(data) {
let parsedTimeLimits;
if (_.has(data, 'timeLimits') && !_.isNull(data.timeLimits)) {
if (_.isString(data.timeLimits)) {
parsedTimeLimits = JSON.parse(data.timeLimits);
}
else {
parsedTimeLimits = data.timeLimits;
}
data.timeLimits = {
questionSet: {
min: 0,
max: parsedTimeLimits?.maxTime ? _.toInteger(parsedTimeLimits.maxTime) : 0
}
};
}
return data;
}
transformChildren(children) {
const self = this;
if (!_.isEmpty(children)) {
_.forEach(children, (ch) => {
if (_.has(ch, 'version')) {
_.unset(ch, 'version');
}
ch = this.processBloomsLevel(ch);
ch = this.processBooleanProps(ch);
if (_.get(ch, 'mimeType').toLowerCase() === 'application/vnd.sunbird.questionset') {
ch = this.processTimeLimits(ch);
ch = this.processInstructions(ch);
const nestedChildren = _.get(ch, 'children', []);
self.transformChildren(nestedChildren);
}
});
}
return children;
}
getTransformedQuestionMetadata(data) {
if (_.has(data, 'questions')) {
_.forEach(data.questions, (question) => {
if (!_.has(question, 'qumlVersion') || question.qumlVersion != 1.1) {
question = this.processResponseDeclaration(question);
question = this.processInteractions(question);
question = this.processSolutions(question);
question = this.processInstructions(question);
question = this.processHints(question);
question = this.processBloomsLevel(question);
question = this.processBooleanProps(question);
const ans = this.getAnswer(question);
if (!_.isEmpty(ans)) {
_.set(question, 'answer', ans);
}
}
});
return data;
}
}
processResponseDeclaration(data) {
let outcomeDeclaration = {};
if (_.isEqual(_.toLower(data.primaryCategory), 'subjective question')) {
data = this.processSubjectiveResponseDeclaration(data);
}
else {
let responseDeclaration = data.responseDeclaration;
if (!_.isEmpty(responseDeclaration)) {
for (const key in responseDeclaration) {
const responseData = responseDeclaration[key];
const maxScore = {
cardinality: _.get(responseData, 'cardinality', ''),
type: _.get(responseData, 'type', ''),
defaultValue: _.get(responseData, 'maxScore'),
};
delete responseData.maxScore;
outcomeDeclaration['maxScore'] = maxScore;
const correctResp = responseData.correctResponse || {};
delete correctResp.outcomes;
if (_.toLower(_.get(responseData, 'type')) === 'integer' && _.toLower(_.get(responseData, 'cardinality')) === 'single') {
const correctKey = correctResp.value;
correctResp.value = parseInt(correctKey, 10);
}
responseData.mapping = this.getUpdatedMapping(responseData);
responseDeclaration[key] = responseData;
}
data.responseDeclaration = responseDeclaration;
data['outcomeDeclaration'] = outcomeDeclaration;
}
}
return data;
}
processSubjectiveResponseDeclaration(subjectiveMetadata) {
let outcomeDeclaration = {};
delete subjectiveMetadata.responseDeclaration;
delete subjectiveMetadata.interactions;
if (_.has(subjectiveMetadata, 'maxScore') && !_.isNull(subjectiveMetadata.maxScore)) {
outcomeDeclaration = {
maxScore: {
cardinality: 'single',
type: 'integer',
defaultValue: subjectiveMetadata.maxScore
}
};
subjectiveMetadata.outcomeDeclaration = outcomeDeclaration;
return subjectiveMetadata;
}
return subjectiveMetadata;
}
getUpdatedMapping(responseData) {
const mappingData = responseData.mapping || [];
if (!_.isEmpty(mappingData)) {
const updatedMapping = mappingData.map(mapData => ({
value: mapData.response,
score: _.get(mapData, 'outcomes.score', 0),
}));
return updatedMapping;
}
return mappingData;
}
processInteractions(data) {
const interactions = _.get(data, 'interactions', {});
if (!_.isEmpty(interactions)) {
const validation = _.get(interactions, 'validation', {});
const resp1 = _.get(interactions, 'response1', {});
const resValData = _.get(interactions, 'response1.validation', {});
if (!_.isEmpty(resValData)) {
_.forEach(resValData, (value, key) => {
_.set(validation, key, value);
});
}
else {
_.set(resp1, 'validation', validation);
}
_.unset(interactions, 'validation');
_.set(interactions, 'response1', resp1);
_.set(data, 'interactions', interactions);
}
return data;
}
processSolutions(data) {
const solutions = _.get(data, 'solutions', []);
if (!_.isEmpty(solutions) && _.isArray(solutions)) {
const updatedSolutions = _.reduce(solutions, (result, solution) => {
result[_.get(solution, 'id')] = this.getSolutionString(solution, _.get(data, 'media', []));
return result;
}, {});
_.set(data, 'solutions', updatedSolutions);
}
return data;
}
getSolutionString(data, media) {
if (!_.isEmpty(data)) {
const type = _.get(data, 'type', '');
switch (type) {
case 'html': {
return _.get(data, 'value', '');
}
case 'video': {
const value = _.get(data, 'value', '');
const mediaData = _.find(media, (item) => _.isEqual(value, _.get(item, 'id', '')));
if (mediaData) {
const src = _.get(mediaData, 'src', '');
const thumbnail = _.get(mediaData, 'thumbnail', '');
const solutionStr = `<video data-asset-variable="media_identifier" width="400" controls poster="thumbnail_url">
<source type="video/mp4" src="media_source_url">
<source type="video/webm" src="media_source_url">
</video>`.replace('media_identifier', value).replace('thumbnail_url', thumbnail).replace(/media_source_url/g, src);
return solutionStr;
}
return '';
}
default: {
return '';
}
}
}
return '';
}
processHints(data) {
const hints = _.get(data, 'hints', []);
let updatedHints = {};
if (!_.isEmpty(hints)) {
_.forEach(hints, (hint) => {
_.merge(updatedHints, { [uuidv4()]: hint });
});
_.set(data, 'hints', updatedHints);
}
return data;
}
getAnswer(data) {
const interactions = _.get(data, 'interactions', {});
if (!_.isEqual(_.get(data, 'primaryCategory'), 'Subjective Question') && !_.isEmpty(interactions)) {
const responseData = _.get(data, 'responseDeclaration.response1', {});
const options = _.get(interactions, 'response1.options', {});
let formatedAnswer = '';
let answerData = _.get(responseData, 'cardinality');
if (answerData === 'single') {
const correctResp = _.get(_.get(responseData, 'correctResponse', {}), 'value', 0);
const label = options[correctResp];
formatedAnswer = `<div class="answer-container"><div class="answer-body">${label.label}</div></div>`;
}
else {
const correctResp = _.get(responseData, 'correctResponse.value');
let singleAns = '<div class="answer-body">answer_html</div>';
const answerList = [];
_.forEach(options, (option) => {
if (_.includes(correctResp, option.value)) {
const replAns = _.replace(singleAns, 'answer_html', _.get(option, 'label'));
answerList.push(replAns);
}
});
formatedAnswer = `<div class="answer-container">${answerList.join('')}</div>`;
}
return formatedAnswer;
}
else {
return _.get(data, 'answer', '');
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3F1bWwtbGlicmFyeS9zcmMvbGliL3NlcnZpY2VzL3RyYW5zZm9ybWF0aW9uLXNlcnZpY2UvdHJhbnNmb3JtYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtwQyxNQUFNLE9BQU8scUJBQXFCO0lBRWhDLHVCQUF1QixDQUFDLG1CQUFtQjtRQUN6QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDM0MsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELGlDQUFpQyxDQUFDLElBQUk7UUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxD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QUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztrSUFoVFUscUJBQXFCO3NJQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1hdGlvblNlcnZpY2Uge1xuXG4gIGdldFRyYW5zZm9ybWVkSGllcmFyY2h5KHF1ZXN0aW9uc2V0TWV0YWRhdGEpIHtcbiAgICBsZXQgdXBkYXRlZE1ldGFkYXRhID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFF1ZXN0aW9uU2V0TWV0YWRhdGEocXVlc3Rpb25zZXRNZXRhZGF0YSk7XG4gICAgaWYgKCFfLmlzRW1wdHkodXBkYXRlZE1ldGFkYXRhLCAnY2hpbGRyZW4nKSkge1xuICAgICAgdXBkYXRlZE1ldGFkYXRhLmNoaWxkcmVuID0gdGhpcy50cmFuc2Zvcm1DaGlsZHJlbih1cGRhdGVkTWV0YWRhdGEuY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlZE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0VHJhbnNmb3JtZWRRdWVzdGlvblNldE1ldGFkYXRhKGRhdGEpIHtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzTWF4U2NvcmVQcm9wZXJ0eShkYXRhKTtcbiAgICBkYXRhID0gXy5vbWl0KGRhdGEsICd2ZXJzaW9uJyk7XG4gICAgZGF0YSA9IHRoaXMucHJvY2Vzc0luc3RydWN0aW9ucyhkYXRhKTtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzQmxvb21zTGV2ZWwoZGF0YSk7XG4gICAgZGF0YSA9IHRoaXMucHJvY2Vzc0Jvb2xlYW5Qcm9wcyhkYXRhKTtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzVGltZUxpbWl0cyhkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NNYXhTY29yZVByb3BlcnR5KGRhdGEpIHtcbiAgICBpZiAoXy5oYXMoZGF0YSwgJ21heFNjb3JlJykpIHtcbiAgICAgIGNvbnN0IG91dGNvbWVEZWNsYXJhdGlvbiA9IHtcbiAgICAgICAgbWF4U2NvcmU6IHtcbiAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGF0YS5tYXhTY29yZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhID0gXy5vbWl0KGRhdGEsICdtYXhTY29yZScpO1xuICAgICAgZGF0YVsnb3V0Y29tZURlY2xhcmF0aW9uJ10gPSBvdXRjb21lRGVjbGFyYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm9jZXNzSW5zdHJ1Y3Rpb25zKGRhdGEpIHtcbiAgICBpZiAoXy5oYXMoZGF0YSwgJ2luc3RydWN0aW9ucy5kZWZhdWx0JykpIHtcbiAgICAgIGRhdGEuaW5zdHJ1Y3Rpb25zID0gZGF0YS5pbnN0cnVjdGlvbnMuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm9jZXNzQmxvb21zTGV2ZWwoZGF0YSkge1xuICAgIGlmIChfLmhhcyhkYXRhLCAnYmxvb21zTGV2ZWwnKSkge1xuICAgICAgY29uc3QgYkxldmVsID0gXy5nZXQoZGF0YSwgJ2Jsb29tc0xldmVsJyk7XG4gICAgICBfLnVuc2V0KGRhdGEsICdibG9vbXNMZXZlbCcpO1xuICAgICAgXy5zZXQoZGF0YSwgJ2NvbXBsZXhpdHlMZXZlbCcsIFtiTGV2ZWwudG9TdHJpbmcoKV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NCb29sZWFuUHJvcHMoZGF0YTogYW55KSB7XG4gICAgY29uc3QgYm9vbGVhblByb3BzID0gW1wic2hvd1NvbHV0aW9uc1wiLCBcInNob3dGZWVkYmFja1wiLCBcInNob3dIaW50c1wiLCBcInNob3dUaW1lclwiXTtcbiAgICBjb25zdCBnZXRCb29sZWFuVmFsdWUgPSAoc3RyOiBhbnkpID0+IHN0ciA9PT0gXCJZZXNcIjtcblxuICAgIF8uZm9yRWFjaChib29sZWFuUHJvcHMsIChwcm9wOiBhbnkpID0+IHtcbiAgICAgIGlmIChfLmhhcyhkYXRhLCBwcm9wKSkge1xuICAgICAgICBjb25zdCBwcm9wVmFsID0gZGF0YVtwcm9wXTtcbiAgICAgICAgZGF0YVtwcm9wXSA9IGdldEJvb2xlYW5WYWx1ZShwcm9wVmFsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvY2Vzc1RpbWVMaW1pdHMoZGF0YSkge1xuICBsZXQgcGFyc2VkVGltZUxpbWl0cztcbiAgaWYgKF8uaGFzKGRhdGEsICd0aW1lTGltaXRzJykgJiYgIV8uaXNOdWxsKGRhdGEudGltZUxpbWl0cykpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhkYXRhLnRpbWVMaW1pdHMpKSB7XG4gICAgICBwYXJzZWRUaW1lTGltaXRzID0gSlNPTi5wYXJzZShkYXRhLnRpbWVMaW1pdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRUaW1lTGltaXRzID0gZGF0YS50aW1lTGltaXRzO1xuICAgIH1cblxuICAgIGRhdGEudGltZUxpbWl0cyA9IHtcbiAgICAgIHF1ZXN0aW9uU2V0OiB7XG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBwYXJzZWRUaW1lTGltaXRzPy5tYXhUaW1lID8gXy50b0ludGVnZXIocGFyc2VkVGltZUxpbWl0cy5tYXhUaW1lKSA6IDBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbiAgdHJhbnNmb3JtQ2hpbGRyZW4oY2hpbGRyZW46IGFueSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghXy5pc0VtcHR5KGNoaWxkcmVuKSkge1xuICAgICAgXy5mb3JFYWNoKGNoaWxkcmVuLCAoY2gpID0+IHtcbiAgICAgICAgaWYgKF8uaGFzKGNoLCAndmVyc2lvbicpKSB7XG4gICAgICAgICAgXy51bnNldChjaCwgJ3ZlcnNpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBjaCA9IHRoaXMucHJvY2Vzc0Jsb29tc0xldmVsKGNoKTtcbiAgICAgICAgY2ggPSB0aGlzLnByb2Nlc3NCb29sZWFuUHJvcHMoY2gpO1xuICAgICAgICBpZiAoXy5nZXQoY2gsICdtaW1lVHlwZScpLnRvTG93ZXJDYXNlKCkgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcpIHtcbiAgICAgICAgICBjaCA9IHRoaXMucHJvY2Vzc1RpbWVMaW1pdHMoY2gpO1xuICAgICAgICAgIGNoID0gdGhpcy5wcm9jZXNzSW5zdHJ1Y3Rpb25zKGNoKTtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRDaGlsZHJlbiA9IF8uZ2V0KGNoLCAnY2hpbGRyZW4nLCBbXSk7XG4gICAgICAgICAgc2VsZi50cmFuc2Zvcm1DaGlsZHJlbihuZXN0ZWRDaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBnZXRUcmFuc2Zvcm1lZFF1ZXN0aW9uTWV0YWRhdGEoZGF0YSkge1xuICAgIGlmIChfLmhhcyhkYXRhLCAncXVlc3Rpb25zJykpIHtcbiAgICAgIF8uZm9yRWFjaChkYXRhLnF1ZXN0aW9ucywgKHF1ZXN0aW9uKSA9PiB7XG4gICAgICAgIGlmICghXy5oYXMocXVlc3Rpb24sICdxdW1sVmVyc2lvbicpIHx8IHF1ZXN0aW9uLnF1bWxWZXJzaW9uICE9IDEuMSkge1xuICAgICAgICAgIHF1ZXN0aW9uID0gdGhpcy5wcm9jZXNzUmVzcG9uc2VEZWNsYXJhdGlvbihxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NJbnRlcmFjdGlvbnMocXVlc3Rpb24pO1xuICAgICAgICAgIHF1ZXN0aW9uID0gdGhpcy5wcm9jZXNzU29sdXRpb25zKHF1ZXN0aW9uKTtcbiAgICAgICAgICBxdWVzdGlvbiA9IHRoaXMucHJvY2Vzc0luc3RydWN0aW9ucyhxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NIaW50cyhxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NCbG9vbXNMZXZlbChxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NCb29sZWFuUHJvcHMocXVlc3Rpb24pO1xuICAgICAgICAgIGNvbnN0IGFucyA9IHRoaXMuZ2V0QW5zd2VyKHF1ZXN0aW9uKVxuICAgICAgICAgIGlmICghXy5pc0VtcHR5KGFucykpIHtcbiAgICAgICAgICAgIF8uc2V0KHF1ZXN0aW9uLCAnYW5zd2VyJywgYW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1Jlc3BvbnNlRGVjbGFyYXRpb24oZGF0YSkge1xuICAgIGxldCBvdXRjb21lRGVjbGFyYXRpb24gPSB7fTtcbiAgICBpZiAoXy5pc0VxdWFsKF8udG9Mb3dlcihkYXRhLnByaW1hcnlDYXRlZ29yeSksICdzdWJqZWN0aXZlIHF1ZXN0aW9uJykpIHtcbiAgICAgIGRhdGEgPSB0aGlzLnByb2Nlc3NTdWJqZWN0aXZlUmVzcG9uc2VEZWNsYXJhdGlvbihkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3BvbnNlRGVjbGFyYXRpb24gPSBkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZXNwb25zZURlY2xhcmF0aW9uKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXNwb25zZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldO1xuICAgICAgICAgIGNvbnN0IG1heFNjb3JlID0ge1xuICAgICAgICAgICAgY2FyZGluYWxpdHk6IF8uZ2V0KHJlc3BvbnNlRGF0YSwgJ2NhcmRpbmFsaXR5JywgJycpLFxuICAgICAgICAgICAgdHlwZTogXy5nZXQocmVzcG9uc2VEYXRhLCAndHlwZScsICcnKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXy5nZXQocmVzcG9uc2VEYXRhLCAnbWF4U2NvcmUnKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZURhdGEubWF4U2NvcmU7XG4gICAgICAgICAgb3V0Y29tZURlY2xhcmF0aW9uWydtYXhTY29yZSddID0gbWF4U2NvcmU7XG4gICAgICAgICAgY29uc3QgY29ycmVjdFJlc3AgPSByZXNwb25zZURhdGEuY29ycmVjdFJlc3BvbnNlIHx8IHt9O1xuICAgICAgICAgIGRlbGV0ZSBjb3JyZWN0UmVzcC5vdXRjb21lcztcbiAgICAgICAgICBpZiAoXy50b0xvd2VyKF8uZ2V0KHJlc3BvbnNlRGF0YSwgJ3R5cGUnKSkgPT09ICdpbnRlZ2VyJyAmJiBfLnRvTG93ZXIoXy5nZXQocmVzcG9uc2VEYXRhLCAnY2FyZGluYWxpdHknKSkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0S2V5ID0gY29ycmVjdFJlc3AudmFsdWU7XG4gICAgICAgICAgICBjb3JyZWN0UmVzcC52YWx1ZSA9IHBhcnNlSW50KGNvcnJlY3RLZXksIDEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzcG9uc2VEYXRhLm1hcHBpbmcgPSB0aGlzLmdldFVwZGF0ZWRNYXBwaW5nKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldID0gcmVzcG9uc2VEYXRhO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucmVzcG9uc2VEZWNsYXJhdGlvbiA9IHJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgIGRhdGFbJ291dGNvbWVEZWNsYXJhdGlvbiddID0gb3V0Y29tZURlY2xhcmF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NTdWJqZWN0aXZlUmVzcG9uc2VEZWNsYXJhdGlvbihzdWJqZWN0aXZlTWV0YWRhdGEpIHtcbiAgICBsZXQgb3V0Y29tZURlY2xhcmF0aW9uID0ge307XG4gICAgZGVsZXRlIHN1YmplY3RpdmVNZXRhZGF0YS5yZXNwb25zZURlY2xhcmF0aW9uO1xuICAgIGRlbGV0ZSBzdWJqZWN0aXZlTWV0YWRhdGEuaW50ZXJhY3Rpb25zO1xuICAgIGlmIChfLmhhcyhzdWJqZWN0aXZlTWV0YWRhdGEsICdtYXhTY29yZScpICYmICFfLmlzTnVsbChzdWJqZWN0aXZlTWV0YWRhdGEubWF4U2NvcmUpKSB7XG4gICAgICBvdXRjb21lRGVjbGFyYXRpb24gPSB7XG4gICAgICAgIG1heFNjb3JlOiB7XG4gICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IHN1YmplY3RpdmVNZXRhZGF0YS5tYXhTY29yZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc3ViamVjdGl2ZU1ldGFkYXRhLm91dGNvbWVEZWNsYXJhdGlvbiA9IG91dGNvbWVEZWNsYXJhdGlvbjtcbiAgICAgIHJldHVybiBzdWJqZWN0aXZlTWV0YWRhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdWJqZWN0aXZlTWV0YWRhdGE7XG4gIH1cblxuICBnZXRVcGRhdGVkTWFwcGluZyhyZXNwb25zZURhdGEpIHtcbiAgICBjb25zdCBtYXBwaW5nRGF0YSA9IHJlc3BvbnNlRGF0YS5tYXBwaW5nIHx8IFtdO1xuICAgIGlmICghXy5pc0VtcHR5KG1hcHBpbmdEYXRhKSkge1xuICAgICAgY29uc3QgdXBkYXRlZE1hcHBpbmcgPSBtYXBwaW5nRGF0YS5tYXAobWFwRGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogbWFwRGF0YS5yZXNwb25zZSxcbiAgICAgICAgc2NvcmU6IF8uZ2V0KG1hcERhdGEsICdvdXRjb21lcy5zY29yZScsIDApLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRNYXBwaW5nO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZ0RhdGE7XG4gIH1cblxuICBwcm9jZXNzSW50ZXJhY3Rpb25zKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGludGVyYWN0aW9uczogYW55ID0gXy5nZXQoZGF0YSwgJ2ludGVyYWN0aW9ucycsIHt9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShpbnRlcmFjdGlvbnMpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uOiBhbnkgPSBfLmdldChpbnRlcmFjdGlvbnMsICd2YWxpZGF0aW9uJywge30pO1xuICAgICAgY29uc3QgcmVzcDE6IGFueSA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMScsIHt9KTtcbiAgICAgIGNvbnN0IHJlc1ZhbERhdGE6IGFueSA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMS52YWxpZGF0aW9uJywge30pO1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVzVmFsRGF0YSkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc1ZhbERhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgXy5zZXQodmFsaWRhdGlvbiwga2V5LCB2YWx1ZSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfLnNldChyZXNwMSwgJ3ZhbGlkYXRpb24nLCB2YWxpZGF0aW9uKTtcbiAgICAgIH1cbiAgICAgIF8udW5zZXQoaW50ZXJhY3Rpb25zLCAndmFsaWRhdGlvbicpO1xuICAgICAgXy5zZXQoaW50ZXJhY3Rpb25zLCAncmVzcG9uc2UxJywgcmVzcDEpO1xuICAgICAgXy5zZXQoZGF0YSwgJ2ludGVyYWN0aW9ucycsIGludGVyYWN0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvY2Vzc1NvbHV0aW9ucyhkYXRhKSB7XG4gICAgY29uc3Qgc29sdXRpb25zID0gXy5nZXQoZGF0YSwgJ3NvbHV0aW9ucycsIFtdKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHNvbHV0aW9ucykgJiYgXy5pc0FycmF5KHNvbHV0aW9ucykpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRTb2x1dGlvbnMgPSBfLnJlZHVjZShzb2x1dGlvbnMsIChyZXN1bHQsIHNvbHV0aW9uKSA9PiB7XG4gICAgICAgIHJlc3VsdFtfLmdldChzb2x1dGlvbiwgJ2lkJyldID0gdGhpcy5nZXRTb2x1dGlvblN0cmluZyhzb2x1dGlvbiwgXy5nZXQoZGF0YSwgJ21lZGlhJywgW10pKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgXy5zZXQoZGF0YSwgJ3NvbHV0aW9ucycsIHVwZGF0ZWRTb2x1dGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldFNvbHV0aW9uU3RyaW5nKGRhdGEsIG1lZGlhKSB7XG4gICAgaWYgKCFfLmlzRW1wdHkoZGF0YSkpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBfLmdldChkYXRhLCAndHlwZScsICcnKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2h0bWwnOiB7XG4gICAgICAgICAgcmV0dXJuIF8uZ2V0KGRhdGEsICd2YWx1ZScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3ZpZGVvJzoge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gXy5nZXQoZGF0YSwgJ3ZhbHVlJywgJycpO1xuICAgICAgICAgIGNvbnN0IG1lZGlhRGF0YSA9IF8uZmluZChtZWRpYSwgKGl0ZW0pID0+IF8uaXNFcXVhbCh2YWx1ZSwgXy5nZXQoaXRlbSwgJ2lkJywgJycpKSk7XG5cbiAgICAgICAgICBpZiAobWVkaWFEYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBfLmdldChtZWRpYURhdGEsICdzcmMnLCAnJyk7XG4gICAgICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBfLmdldChtZWRpYURhdGEsICd0aHVtYm5haWwnLCAnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvbHV0aW9uU3RyID0gYDx2aWRlbyBkYXRhLWFzc2V0LXZhcmlhYmxlPVwibWVkaWFfaWRlbnRpZmllclwiIHdpZHRoPVwiNDAwXCIgY29udHJvbHMgcG9zdGVyPVwidGh1bWJuYWlsX3VybFwiPlxuICAgICAgICAgICAgICA8c291cmNlIHR5cGU9XCJ2aWRlby9tcDRcIiBzcmM9XCJtZWRpYV9zb3VyY2VfdXJsXCI+XG4gICAgICAgICAgICAgIDxzb3VyY2UgdHlwZT1cInZpZGVvL3dlYm1cIiBzcmM9XCJtZWRpYV9zb3VyY2VfdXJsXCI+XG4gICAgICAgICAgICA8L3ZpZGVvPmAucmVwbGFjZSgnbWVkaWFfaWRlbnRpZmllcicsIHZhbHVlKS5yZXBsYWNlKCd0aHVtYm5haWxfdXJsJywgdGh1bWJuYWlsKS5yZXBsYWNlKC9tZWRpYV9zb3VyY2VfdXJsL2csIHNyYyk7XG5cbiAgICAgICAgICAgIHJldHVybiBzb2x1dGlvblN0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByb2Nlc3NIaW50cyhkYXRhKSB7XG4gICAgY29uc3QgaGludHMgPSBfLmdldChkYXRhLCAnaGludHMnLCBbXSk7XG4gICAgbGV0IHVwZGF0ZWRIaW50cyA9IHt9O1xuICAgIGlmICghXy5pc0VtcHR5KGhpbnRzKSkge1xuICAgICAgXy5mb3JFYWNoKGhpbnRzLCAoaGludCkgPT4ge1xuICAgICAgICBfLm1lcmdlKHVwZGF0ZWRIaW50cywge1t1dWlkdjQoKV06IGhpbnR9KTtcbiAgICAgIH0pXG5cbiAgICAgIF8uc2V0KGRhdGEsICdoaW50cycsIHVwZGF0ZWRIaW50cyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0QW5zd2VyKGRhdGEpIHtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBfLmdldChkYXRhLCAnaW50ZXJhY3Rpb25zJywge30pO1xuXG4gICAgaWYgKCFfLmlzRXF1YWwoXy5nZXQoZGF0YSwgJ3ByaW1hcnlDYXRlZ29yeScpLCAnU3ViamVjdGl2ZSBRdWVzdGlvbicpICYmICFfLmlzRW1wdHkoaW50ZXJhY3Rpb25zKSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxJywge30pO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMS5vcHRpb25zJywge30pO1xuICAgICAgbGV0IGZvcm1hdGVkQW5zd2VyID0gJyc7XG5cbiAgICAgIGxldCBhbnN3ZXJEYXRhID0gXy5nZXQocmVzcG9uc2VEYXRhLCAnY2FyZGluYWxpdHknKTtcblxuICAgICAgaWYgKGFuc3dlckRhdGEgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnN0IGNvcnJlY3RSZXNwID0gXy5nZXQoXy5nZXQocmVzcG9uc2VEYXRhLCAnY29ycmVjdFJlc3BvbnNlJywge30pLCAndmFsdWUnLCAwKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBvcHRpb25zW2NvcnJlY3RSZXNwXTtcblxuICAgICAgICBmb3JtYXRlZEFuc3dlciA9IGA8ZGl2IGNsYXNzPVwiYW5zd2VyLWNvbnRhaW5lclwiPjxkaXYgY2xhc3M9XCJhbnN3ZXItYm9keVwiPiR7bGFiZWwubGFiZWx9PC9kaXY+PC9kaXY+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvcnJlY3RSZXNwID0gXy5nZXQocmVzcG9uc2VEYXRhLCAnY29ycmVjdFJlc3BvbnNlLnZhbHVlJyk7XG4gICAgICAgIGxldCBzaW5nbGVBbnMgPSAnPGRpdiBjbGFzcz1cImFuc3dlci1ib2R5XCI+YW5zd2VyX2h0bWw8L2Rpdj4nO1xuICAgICAgICBjb25zdCBhbnN3ZXJMaXN0ID0gW107XG4gICAgICAgIF8uZm9yRWFjaChvcHRpb25zLCAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29ycmVjdFJlc3AsIG9wdGlvbi52YWx1ZSwpKSB7XG4gICAgICAgICAgICBjb25zdCByZXBsQW5zID0gXy5yZXBsYWNlKHNpbmdsZUFucywgJ2Fuc3dlcl9odG1sJywgXy5nZXQob3B0aW9uLCAnbGFiZWwnKSlcbiAgICAgICAgICAgIGFuc3dlckxpc3QucHVzaChyZXBsQW5zKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgZm9ybWF0ZWRBbnN3ZXIgPSBgPGRpdiBjbGFzcz1cImFuc3dlci1jb250YWluZXJcIj4ke2Fuc3dlckxpc3Quam9pbignJyl9PC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXRlZEFuc3dlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gXy5nZXQoZGF0YSwgJ2Fuc3dlcicsICcnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==