UNPKG

@shikshalokam/sl-questionnaire

Version:
235 lines 34.6 kB
import { Injectable } from '@angular/core'; import { ResponseType, } from '../interfaces/questionnaire.type'; import * as _ from 'lodash-es'; import * as i0 from "@angular/core"; export class SlQuestionnaireService { constructor() { this.validate = (data) => { return (control) => { if (typeof data.validation == 'string') { return null; } if (!data.validation.required) { return null; } if (data.validation.regex) { const forbidden = this.testRegex(data.validation.regex, control.value); return forbidden ? null : { err: 'Invalid character found' }; } if (data.validation.IsNumber) { if (!control.value) { return { err: 'Number not entered' }; } const forbidden = !isNaN(control.value); return forbidden ? null : { err: 'Only numbers allowed' }; } if (data.validation.required) { if (!control.value) { return { err: 'Required field' }; } if (data.responseType == ResponseType.MULTISELECT) { return control.value.some((v) => v != '') ? null : { err: 'Select at least one option' }; } if (data.responseType == ResponseType.SLIDER) { let min = data.validation.min; let max = data.validation.max; return min <= control.value && control.value <= max ? null : { err: 'Selected value not within range' }; } } }; }; } testRegex(regexExpression, value) { const regex = new RegExp(regexExpression); return regex.test(value); } setSubmissionId(submissionId) { this._submissionId = submissionId; } getSubmissionId() { return this._submissionId; } mapSubmissionToAssessment(data) { const assessment = data.assessment; for (const evidence of assessment.evidences) { const validSubmission = assessment.submissions[evidence.externalId]; if (validSubmission) { evidence.notApplicable = validSubmission.notApplicable; if (evidence.notApplicable) { continue; } for (const section of evidence.sections) { for (const question of section.questions) { if (question.responseType === 'pageQuestions') { for (const questions of question.pageQuestions) { questions.value = questions.responseType !== 'matrix' ? validSubmission.answers[questions._id].value : this.constructMatrixValue(validSubmission, questions, evidence.externalId); questions.remarks = validSubmission.answers[questions._id] ? validSubmission.answers[questions._id].remarks : ''; questions.fileName = validSubmission.answers[questions._id] ? validSubmission.answers[questions._id].fileName : []; questions.endTime = validSubmission.answers[questions._id] ? validSubmission.answers[questions._id].endTime : ''; } } else if (validSubmission.answers && validSubmission.answers[question._id]) { question.value = question.responseType !== 'matrix' ? validSubmission.answers[question._id].value : this.constructMatrixValue(validSubmission, question, evidence.externalId); question.remarks = validSubmission.answers[question._id] ? validSubmission.answers[question._id].remarks : ''; question.fileName = validSubmission.answers[question._id] ? validSubmission.answers[question._id].fileName : []; question.endTime = validSubmission.answers[question._id] ? validSubmission.answers[question._id].endTime : ''; } } } } } this.setSubmissionId(assessment.submissionId); return data; } constructMatrixValue(validSubmission, matrixQuestion, ecmId) { matrixQuestion.value = []; if (validSubmission.answers && validSubmission.answers[matrixQuestion._id] && validSubmission.answers[matrixQuestion._id].value) { for (const answer of validSubmission.answers[matrixQuestion._id].value) { matrixQuestion.value.push(JSON.parse(JSON.stringify(matrixQuestion.instanceQuestions))); } matrixQuestion.value.forEach((instance, index) => { instance.forEach((question, instanceIndex) => { if (validSubmission.answers[matrixQuestion._id] && validSubmission.answers[matrixQuestion._id].value[index][question._id]) { question.value = validSubmission.answers[matrixQuestion._id].value[index][question._id].value; question.remarks = validSubmission.answers[matrixQuestion._id].value[index][question._id].remarks; question.fileName = validSubmission.answers[matrixQuestion._id].value[index][question._id].fileName; question.endTime = validSubmission.answers[matrixQuestion._id].value[index][question._id].endTime; } }); }); return matrixQuestion.value; } else { return []; } } getEvidenceData(evidence, formValues) { let sections = evidence.sections; let answers = this.getSectionData(sections, formValues); let payloadData = { externalId: evidence.externalId, answers: answers, startTime: evidence.startTime, endTime: Date.now(), }; return payloadData; } getSectionData(sections, formValues) { let answers = {}; for (let index = 0; index < sections.length; index++) { answers = { ...answers, ...this.createpayload(sections[index].questions, formValues), }; } return answers; } createpayload(questions, formValues) { let answers = {}; for (let index = 0; index < questions.length; index++) { let currentQuestion = questions[index]; if (currentQuestion.responseType == 'pageQuestions') { answers = { ...answers, ...this.createpayload(currentQuestion.pageQuestions, formValues), }; continue; } if (currentQuestion.responseType == 'matrix') { for (let index = 0; index < currentQuestion.value.length; index++) { formValues[currentQuestion._id][index] = this.createpayload(currentQuestion.value[index], formValues[currentQuestion._id][index]); } } let perQuestionData = this.formatToPayload(currentQuestion, formValues); answers[currentQuestion._id] = perQuestionData; } return answers; } formatToPayload(currentQuestion, formValues) { let value, labels; if (currentQuestion.responseType == 'matrix') { value = formValues[currentQuestion._id]; labels = currentQuestion.value; } else { value = currentQuestion.value; labels = formValues[currentQuestion._id]; if (currentQuestion.responseType == 'radio' && currentQuestion.value) { labels = currentQuestion.options.find(_ => _.value == currentQuestion.value).label; } if (currentQuestion.responseType == 'multiselect' && currentQuestion.value) { labels = currentQuestion.options.filter(_ => currentQuestion.value.includes(_.value)).map(_ => _.label); } } return { qid: currentQuestion._id, value: value, remarks: currentQuestion.remarks, fileName: currentQuestion.fileName, gpsLocation: '', payload: { question: currentQuestion.question, labels: this.convertToArray(labels), responseType: currentQuestion.responseType, filesNotUploaded: [], //todo }, startTime: currentQuestion.startTime, endTime: currentQuestion.endTime, criteriaId: currentQuestion.payload.criteriaId, responseType: currentQuestion.responseType, evidenceMethod: currentQuestion.evidenceMethod, rubricLevel: '', }; } convertToArray(arr) { if (!arr) { return arr; } let clonedArr = _.cloneDeep(arr); if (Array.isArray(clonedArr)) { return arr; } else { return [clonedArr]; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlQuestionnaireService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2wtcXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2wtcXVlc3Rpb25uYWlyZS9zcmMvbGliL3NlcnZpY2VzL3NsLXF1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFHTCxZQUFZLEdBQ2IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQzs7QUFNL0IsTUFBTSxPQUFPLHNCQUFzQjtJQUVqQztRQUNBLGFBQVEsR0FBRyxDQUFDLElBQWMsRUFBZSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxPQUF3QixFQUFpQyxFQUFFO2dCQUNqRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUU7b0JBQ3RDLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDN0IsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtvQkFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3ZFLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLHlCQUF5QixFQUFFLENBQUM7aUJBQzlEO2dCQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO3dCQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUM7cUJBQ3RDO29CQUNELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztpQkFDM0Q7Z0JBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7d0JBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztxQkFDbEM7b0JBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUU7d0JBQ2pELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3ZDLENBQUMsQ0FBQyxJQUFJOzRCQUNOLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSw0QkFBNEIsRUFBRSxDQUFDO3FCQUMzQztvQkFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDNUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7d0JBQzlCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3dCQUM5QixPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksR0FBRzs0QkFDakQsQ0FBQyxDQUFDLElBQUk7NEJBQ04sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGtDQUFrQyxFQUFFLENBQUM7cUJBQ2pEO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBMUNhLENBQUM7SUE0Q1QsU0FBUyxDQUFDLGVBQXVCLEVBQUUsS0FBYTtRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxZQUFpQjtRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBQ0QsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQseUJBQXlCLENBQUMsSUFBSTtRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRW5DLEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUMzQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRSxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsUUFBUSxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDO2dCQUN2RCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUU7b0JBQzFCLFNBQVM7aUJBQ1Y7Z0JBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO29CQUN2QyxLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7d0JBQ3hDLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLEVBQUU7NEJBQzdDLEtBQUssTUFBTSxTQUFTLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRTtnQ0FDOUMsU0FBUyxDQUFDLEtBQUs7b0NBQ2IsU0FBUyxDQUFDLFlBQVksS0FBSyxRQUFRO3dDQUNqQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSzt3Q0FDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsZUFBZSxFQUNmLFNBQVMsRUFDVCxRQUFRLENBQUMsVUFBVSxDQUNwQixDQUFDO2dDQUNSLFNBQVMsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO29DQUN4RCxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTztvQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDUCxTQUFTLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztvQ0FDekQsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVE7b0NBQ2pELENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ1AsU0FBUyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7b0NBQ3hELENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPO29DQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDOzZCQUNSO3lCQUNGOzZCQUFNLElBQ0wsZUFBZSxDQUFDLE9BQU87NEJBQ3ZCLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUNyQzs0QkFDQSxRQUFRLENBQUMsS0FBSztnQ0FDWixRQUFRLENBQUMsWUFBWSxLQUFLLFFBQVE7b0NBQ2hDLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLO29DQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixlQUFlLEVBQ2YsUUFBUSxFQUNSLFFBQVEsQ0FBQyxVQUFVLENBQ3BCLENBQUM7NEJBQ1IsUUFBUSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0NBQ3RELENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPO2dDQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDOzRCQUNQLFFBQVEsQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dDQUN2RCxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUTtnQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDUCxRQUFRLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQ0FDdEQsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU87Z0NBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUE7eUJBQ1A7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxLQUFLO1FBQ3pELGNBQWMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQ0UsZUFBZSxDQUFDLE9BQU87WUFDdkIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO1lBQzNDLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFDakQ7WUFDQSxLQUFLLE1BQU0sTUFBTSxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDdEUsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUM3RCxDQUFDO2FBQ0g7WUFDRCxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRTtvQkFDM0MsSUFDRSxlQUFlLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7d0JBQzNDLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdEQsUUFBUSxDQUFDLEdBQUcsQ0FDYixFQUNEO3dCQUNBLFFBQVEsQ0FBQyxLQUFLOzRCQUNaLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdEQsUUFBUSxDQUFDLEdBQUcsQ0FDYixDQUFDLEtBQUssQ0FBQzt3QkFDVixRQUFRLENBQUMsT0FBTzs0QkFDZCxlQUFlLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ3RELFFBQVEsQ0FBQyxHQUFHLENBQ2IsQ0FBQyxPQUFPLENBQUM7d0JBQ1osUUFBUSxDQUFDLFFBQVE7NEJBQ2YsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUN0RCxRQUFRLENBQUMsR0FBRyxDQUNiLENBQUMsUUFBUSxDQUFDO3dCQUNiLFFBQVEsQ0FBQyxPQUFPOzRCQUNkLGVBQWUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdEQsUUFBUSxDQUFDLEdBQUcsQ0FDYixDQUFDLE9BQU8sQ0FBQztxQkFDYjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDO1NBQzdCO2FBQU07WUFDTCxPQUFPLEVBQUUsQ0FBQztTQUNYO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxRQUFrQixFQUFFLFVBQWtCO1FBQ3BELElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEQsSUFBSSxXQUFXLEdBQUc7WUFDaEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUNwQixDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVTtRQUNqQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEQsT0FBTyxHQUFHO2dCQUNSLEdBQUcsT0FBTztnQkFDVixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7YUFDN0QsQ0FBQztTQUNIO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVTtRQUNqQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDckQsSUFBSSxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxlQUFlLEVBQUU7Z0JBQ25ELE9BQU8sR0FBRztvQkFDUixHQUFHLE9BQU87b0JBQ1YsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDO2lCQUNqRSxDQUFDO2dCQUNGLFNBQVM7YUFDVjtZQUNELElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxRQUFRLEVBQUU7Z0JBQzVDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDakUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUN6RCxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUM1QixVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUN2QyxDQUFDO2lCQUNIO2FBQ0Y7WUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RSxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQztTQUNoRDtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxlQUFlLENBQUMsZUFBZSxFQUFFLFVBQVU7UUFDekMsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ2xCLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxRQUFRLEVBQUU7WUFDNUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7U0FDaEM7YUFBTTtZQUNMLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzlCLE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxPQUFPLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRTtnQkFDcEUsTUFBTSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFBO2FBQ25GO1lBQ0QsSUFBSSxlQUFlLENBQUMsWUFBWSxJQUFJLGFBQWEsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFO2dCQUMxRSxNQUFNLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLEVBQUUsQ0FBQSxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLEVBQUUsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7YUFDcEc7U0FDRjtRQUVELE9BQU87WUFDTCxHQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUc7WUFDeEIsS0FBSyxFQUFFLEtBQUs7WUFDWixPQUFPLEVBQUUsZUFBZSxDQUFDLE9BQU87WUFDaEMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO1lBQ2xDLFdBQVcsRUFBRSxFQUFFO1lBQ2YsT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxlQUFlLENBQUMsUUFBUTtnQkFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxZQUFZLEVBQUUsZUFBZSxDQUFDLFlBQVk7Z0JBQzFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxNQUFNO2FBQzdCO1lBQ0QsU0FBUyxFQUFFLGVBQWUsQ0FBQyxTQUFTO1lBQ3BDLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTztZQUNoQyxVQUFVLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFVO1lBQzlDLFlBQVksRUFBRSxlQUFlLENBQUMsWUFBWTtZQUMxQyxjQUFjLEVBQUUsZUFBZSxDQUFDLGNBQWM7WUFDOUMsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBRztRQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxDQUFDO1NBQ1o7YUFBTTtZQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7K0dBeFFVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgRXZpZGVuY2UsXG4gIFF1ZXN0aW9uLFxuICBSZXNwb25zZVR5cGUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZS50eXBlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2xRdWVzdGlvbm5haXJlU2VydmljZSB7XG4gIHByaXZhdGUgX3N1Ym1pc3Npb25JZDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHZhbGlkYXRlID0gKGRhdGE6IFF1ZXN0aW9uKTogVmFsaWRhdG9yRm4gPT4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhLnZhbGlkYXRpb24gPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoIWRhdGEudmFsaWRhdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnZhbGlkYXRpb24ucmVnZXgpIHtcbiAgICAgICAgY29uc3QgZm9yYmlkZGVuID0gdGhpcy50ZXN0UmVnZXgoZGF0YS52YWxpZGF0aW9uLnJlZ2V4LCBjb250cm9sLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZvcmJpZGRlbiA/IG51bGwgOiB7IGVycjogJ0ludmFsaWQgY2hhcmFjdGVyIGZvdW5kJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS52YWxpZGF0aW9uLklzTnVtYmVyKSB7XG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IGVycjogJ051bWJlciBub3QgZW50ZXJlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSAhaXNOYU4oY29udHJvbC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBmb3JiaWRkZW4gPyBudWxsIDogeyBlcnI6ICdPbmx5IG51bWJlcnMgYWxsb3dlZCcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEudmFsaWRhdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyBlcnI6ICdSZXF1aXJlZCBmaWVsZCcgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLnJlc3BvbnNlVHlwZSA9PSBSZXNwb25zZVR5cGUuTVVMVElTRUxFQ1QpIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC52YWx1ZS5zb21lKCh2KSA9PiB2ICE9ICcnKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgZXJyOiAnU2VsZWN0IGF0IGxlYXN0IG9uZSBvcHRpb24nIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5yZXNwb25zZVR5cGUgPT0gUmVzcG9uc2VUeXBlLlNMSURFUikge1xuICAgICAgICAgIGxldCBtaW4gPSBkYXRhLnZhbGlkYXRpb24ubWluO1xuICAgICAgICAgIGxldCBtYXggPSBkYXRhLnZhbGlkYXRpb24ubWF4O1xuICAgICAgICAgIHJldHVybiBtaW4gPD0gY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlIDw9IG1heFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgZXJyOiAnU2VsZWN0ZWQgdmFsdWUgIG5vdCB3aXRoaW4gcmFuZ2UnIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHB1YmxpYyB0ZXN0UmVnZXgocmVnZXhFeHByZXNzaW9uOiBSZWdFeHAsIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhFeHByZXNzaW9uKTtcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICBzZXRTdWJtaXNzaW9uSWQoc3VibWlzc2lvbklkOiBhbnkpIHtcbiAgICB0aGlzLl9zdWJtaXNzaW9uSWQgPSBzdWJtaXNzaW9uSWQ7XG4gIH1cbiAgZ2V0U3VibWlzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdWJtaXNzaW9uSWQ7XG4gIH1cblxuICBtYXBTdWJtaXNzaW9uVG9Bc3Nlc3NtZW50KGRhdGEpIHtcbiAgICBjb25zdCBhc3Nlc3NtZW50ID0gZGF0YS5hc3Nlc3NtZW50O1xuXG4gICAgZm9yIChjb25zdCBldmlkZW5jZSBvZiBhc3Nlc3NtZW50LmV2aWRlbmNlcykge1xuICAgICAgY29uc3QgdmFsaWRTdWJtaXNzaW9uID0gYXNzZXNzbWVudC5zdWJtaXNzaW9uc1tldmlkZW5jZS5leHRlcm5hbElkXTtcbiAgICAgIGlmICh2YWxpZFN1Ym1pc3Npb24pIHtcbiAgICAgICAgZXZpZGVuY2Uubm90QXBwbGljYWJsZSA9IHZhbGlkU3VibWlzc2lvbi5ub3RBcHBsaWNhYmxlO1xuICAgICAgICBpZiAoZXZpZGVuY2Uubm90QXBwbGljYWJsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGV2aWRlbmNlLnNlY3Rpb25zKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PT0gJ3BhZ2VRdWVzdGlvbnMnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb25zIG9mIHF1ZXN0aW9uLnBhZ2VRdWVzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMudmFsdWUgPVxuICAgICAgICAgICAgICAgICAgcXVlc3Rpb25zLnJlc3BvbnNlVHlwZSAhPT0gJ21hdHJpeCdcbiAgICAgICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY29uc3RydWN0TWF0cml4VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmlkZW5jZS5leHRlcm5hbElkXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbnMucmVtYXJrcyA9IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9ucy5faWRdXG4gICAgICAgICAgICAgICAgICA/IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9ucy5faWRdLnJlbWFya3NcbiAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zLmZpbGVOYW1lID0gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb25zLl9pZF1cbiAgICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb25zLl9pZF0uZmlsZU5hbWVcbiAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zLmVuZFRpbWUgPSB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXVxuICAgICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbnMuX2lkXS5lbmRUaW1lXG4gICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2VycyAmJlxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPVxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSAhPT0gJ21hdHJpeCdcbiAgICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbnN0cnVjdE1hdHJpeFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkU3VibWlzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBldmlkZW5jZS5leHRlcm5hbElkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXN0aW9uLnJlbWFya3MgPSB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdXG4gICAgICAgICAgICAgICAgPyB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1txdWVzdGlvbi5faWRdLnJlbWFya3NcbiAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICBxdWVzdGlvbi5maWxlTmFtZSA9IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9uLl9pZF1cbiAgICAgICAgICAgICAgICA/IHZhbGlkU3VibWlzc2lvbi5hbnN3ZXJzW3F1ZXN0aW9uLl9pZF0uZmlsZU5hbWVcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgICBxdWVzdGlvbi5lbmRUaW1lID0gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXVxuICAgICAgICAgICAgICAgID8gdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbcXVlc3Rpb24uX2lkXS5lbmRUaW1lXG4gICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3VibWlzc2lvbklkKGFzc2Vzc21lbnQuc3VibWlzc2lvbklkKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdE1hdHJpeFZhbHVlKHZhbGlkU3VibWlzc2lvbiwgbWF0cml4UXVlc3Rpb24sIGVjbUlkKSB7XG4gICAgbWF0cml4UXVlc3Rpb24udmFsdWUgPSBbXTtcbiAgICBpZiAoXG4gICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2VycyAmJlxuICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXSAmJlxuICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZVxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBhbnN3ZXIgb2YgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZSkge1xuICAgICAgICBtYXRyaXhRdWVzdGlvbi52YWx1ZS5wdXNoKFxuICAgICAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWF0cml4UXVlc3Rpb24uaW5zdGFuY2VRdWVzdGlvbnMpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbWF0cml4UXVlc3Rpb24udmFsdWUuZm9yRWFjaCgoaW5zdGFuY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGluc3RhbmNlLmZvckVhY2goKHF1ZXN0aW9uLCBpbnN0YW5jZUluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXSAmJlxuICAgICAgICAgICAgdmFsaWRTdWJtaXNzaW9uLmFuc3dlcnNbbWF0cml4UXVlc3Rpb24uX2lkXS52YWx1ZVtpbmRleF1bXG4gICAgICAgICAgICAgIHF1ZXN0aW9uLl9pZFxuICAgICAgICAgICAgXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS52YWx1ZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uLnJlbWFya3MgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5yZW1hcmtzO1xuICAgICAgICAgICAgcXVlc3Rpb24uZmlsZU5hbWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5maWxlTmFtZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uLmVuZFRpbWUgPVxuICAgICAgICAgICAgICB2YWxpZFN1Ym1pc3Npb24uYW5zd2Vyc1ttYXRyaXhRdWVzdGlvbi5faWRdLnZhbHVlW2luZGV4XVtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5faWRcbiAgICAgICAgICAgICAgXS5lbmRUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtYXRyaXhRdWVzdGlvbi52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldEV2aWRlbmNlRGF0YShldmlkZW5jZTogRXZpZGVuY2UsIGZvcm1WYWx1ZXM6IG9iamVjdCkge1xuICAgIGxldCBzZWN0aW9ucyA9IGV2aWRlbmNlLnNlY3Rpb25zO1xuICAgIGxldCBhbnN3ZXJzID0gdGhpcy5nZXRTZWN0aW9uRGF0YShzZWN0aW9ucywgZm9ybVZhbHVlcyk7XG4gICAgbGV0IHBheWxvYWREYXRhID0ge1xuICAgICAgZXh0ZXJuYWxJZDogZXZpZGVuY2UuZXh0ZXJuYWxJZCxcbiAgICAgIGFuc3dlcnM6IGFuc3dlcnMsXG4gICAgICBzdGFydFRpbWU6IGV2aWRlbmNlLnN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6IERhdGUubm93KCksXG4gICAgfTtcbiAgICByZXR1cm4gcGF5bG9hZERhdGE7XG4gIH1cblxuICBnZXRTZWN0aW9uRGF0YShzZWN0aW9ucywgZm9ybVZhbHVlcykge1xuICAgIGxldCBhbnN3ZXJzID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNlY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgYW5zd2VycyA9IHtcbiAgICAgICAgLi4uYW5zd2VycyxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVwYXlsb2FkKHNlY3Rpb25zW2luZGV4XS5xdWVzdGlvbnMsIGZvcm1WYWx1ZXMpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcnM7XG4gIH1cblxuICBjcmVhdGVwYXlsb2FkKHF1ZXN0aW9ucywgZm9ybVZhbHVlcykge1xuICAgIGxldCBhbnN3ZXJzID0ge307XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHF1ZXN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBjdXJyZW50UXVlc3Rpb24gPSBxdWVzdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gJ3BhZ2VRdWVzdGlvbnMnKSB7XG4gICAgICAgIGFuc3dlcnMgPSB7XG4gICAgICAgICAgLi4uYW5zd2VycyxcbiAgICAgICAgICAuLi50aGlzLmNyZWF0ZXBheWxvYWQoY3VycmVudFF1ZXN0aW9uLnBhZ2VRdWVzdGlvbnMsIGZvcm1WYWx1ZXMpLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50UXVlc3Rpb24ucmVzcG9uc2VUeXBlID09ICdtYXRyaXgnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50UXVlc3Rpb24udmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgZm9ybVZhbHVlc1tjdXJyZW50UXVlc3Rpb24uX2lkXVtpbmRleF0gPSB0aGlzLmNyZWF0ZXBheWxvYWQoXG4gICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24udmFsdWVbaW5kZXhdLFxuICAgICAgICAgICAgZm9ybVZhbHVlc1tjdXJyZW50UXVlc3Rpb24uX2lkXVtpbmRleF1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBwZXJRdWVzdGlvbkRhdGEgPSB0aGlzLmZvcm1hdFRvUGF5bG9hZChjdXJyZW50UXVlc3Rpb24sIGZvcm1WYWx1ZXMpO1xuICAgICAgYW5zd2Vyc1tjdXJyZW50UXVlc3Rpb24uX2lkXSA9IHBlclF1ZXN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5zd2VycztcbiAgfVxuXG4gIGZvcm1hdFRvUGF5bG9hZChjdXJyZW50UXVlc3Rpb24sIGZvcm1WYWx1ZXMpIHtcbiAgICBsZXQgdmFsdWUsIGxhYmVscztcbiAgICBpZiAoY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSAnbWF0cml4Jykge1xuICAgICAgdmFsdWUgPSBmb3JtVmFsdWVzW2N1cnJlbnRRdWVzdGlvbi5faWRdO1xuICAgICAgbGFiZWxzID0gY3VycmVudFF1ZXN0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGN1cnJlbnRRdWVzdGlvbi52YWx1ZTtcbiAgICAgIGxhYmVscyA9IGZvcm1WYWx1ZXNbY3VycmVudFF1ZXN0aW9uLl9pZF07XG4gICAgICBpZiAoY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSAncmFkaW8nICYmIGN1cnJlbnRRdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICBsYWJlbHMgPSBjdXJyZW50UXVlc3Rpb24ub3B0aW9ucy5maW5kKF8gPT4gXy52YWx1ZSA9PSBjdXJyZW50UXVlc3Rpb24udmFsdWUpLmxhYmVsXG4gICAgICB9IFxuICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gJ211bHRpc2VsZWN0JyAmJiBjdXJyZW50UXVlc3Rpb24udmFsdWUpIHtcbiAgICAgICAgbGFiZWxzID0gY3VycmVudFF1ZXN0aW9uLm9wdGlvbnMuZmlsdGVyKF89PmN1cnJlbnRRdWVzdGlvbi52YWx1ZS5pbmNsdWRlcyhfLnZhbHVlKSkubWFwKF89Pl8ubGFiZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFpZDogY3VycmVudFF1ZXN0aW9uLl9pZCxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlbWFya3M6IGN1cnJlbnRRdWVzdGlvbi5yZW1hcmtzLFxuICAgICAgZmlsZU5hbWU6IGN1cnJlbnRRdWVzdGlvbi5maWxlTmFtZSxcbiAgICAgIGdwc0xvY2F0aW9uOiAnJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcXVlc3Rpb246IGN1cnJlbnRRdWVzdGlvbi5xdWVzdGlvbixcbiAgICAgICAgbGFiZWxzOiB0aGlzLmNvbnZlcnRUb0FycmF5KGxhYmVscyksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgZmlsZXNOb3RVcGxvYWRlZDogW10sIC8vdG9kb1xuICAgICAgfSxcbiAgICAgIHN0YXJ0VGltZTogY3VycmVudFF1ZXN0aW9uLnN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6IGN1cnJlbnRRdWVzdGlvbi5lbmRUaW1lLFxuICAgICAgY3JpdGVyaWFJZDogY3VycmVudFF1ZXN0aW9uLnBheWxvYWQuY3JpdGVyaWFJZCxcbiAgICAgIHJlc3BvbnNlVHlwZTogY3VycmVudFF1ZXN0aW9uLnJlc3BvbnNlVHlwZSxcbiAgICAgIGV2aWRlbmNlTWV0aG9kOiBjdXJyZW50UXVlc3Rpb24uZXZpZGVuY2VNZXRob2QsXG4gICAgICBydWJyaWNMZXZlbDogJycsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnZlcnRUb0FycmF5KGFycikge1xuICAgIGlmICghYXJyKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICBsZXQgY2xvbmVkQXJyID0gXy5jbG9uZURlZXAoYXJyKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjbG9uZWRBcnIpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2Nsb25lZEFycl07XG4gICAgfVxuICB9XG59XG4iXX0=