UNPKG

ngx-surveys

Version:
308 lines 46.5 kB
import { Injectable } from '@angular/core'; import * as _ from 'lodash'; import { ReplaySubject } from 'rxjs'; import * as i0 from "@angular/core"; export class NgxSurveyService { constructor() { this.onFilesSelected = new ReplaySubject(1); this.errorMessages = { require: "Field required", minLength: "Must be more than {value} characters", maxLength: "Must be less than {value} characters", setLength: "{value} Digit Number Required", numeric: "The entry can only contain numbers", email: "Not valid email" }; } initForm(form, formValues) { //console.log(form, formValues); form.forEach(section => { if (section.name) { const groupedItems = _.groupBy(_.filter(section.items, item => !item.name), item => item.type); _.each(groupedItems, (items, type) => { if (type) { section.items[_.indexOf(section.items, _.first(items))] = { type: type, items: items, name: section.name, isSectionValueItem: true, }; _.each(items, (item) => { section.items = _.without(section.items, item); }); } }); } }); const visibilityValuesInTableConvert = (item) => { if (item.visibilityValuesInTable) { const tableItem = _.first(_.map(form, (section) => { return _.find(section.items, (item) => { if (!item.items) { return item.actionUpdatesTableValue; } else { return _.find(item.items, item => item.actionUpdatesTableValue); } }); })); const newValues = []; if (tableItem) { _.each(item.visibilityValuesInTable, (val) => { let valItem = _.find(tableItem.items, item => item.title === val); newValues.push(valItem && valItem.optionValue ? valItem.optionValue : val); }); } item.visibilityValuesInTable = newValues; } }; _.each(form, (section) => { visibilityValuesInTableConvert(section); _.each(section.items, (item) => { visibilityValuesInTableConvert(item); if (item.type === 'radio' && section.allowsMultipleSelection) { item.multiple = true; } if (item.multiple && _.isString(item.value)) { if (_.isString(item.value)) { try { item.value = JSON.parse(item.value); } catch (err) { console.log(err); } } } if (formValues[item.name] !== undefined) { item.value = formValues[item.name]; if (item.type === 'date' && !_.isString(item.value)) { //item.value = this.getDateStr(formValues[item.name]); } //item.readOnly = item.readOnly || _.contains(this.readOnlyFields, item.name); if (item.multiple && _.isString(item.value)) { item.value = JSON.parse(item.value); } if (item.type === 'numericRating' && _.isString(item.value)) { item.value = parseInt(item.value); } } if (item.isSectionValueItem && section.sectionValidation && !item.fieldValidation) { item.fieldValidation = section.sectionValidation; } }); if (section.subtitle) { section.subtitle = section.subtitle.replace(new RegExp('\n', 'g'), '<br />'); } }); //console.log(form); return form; } isItemVisible(form, section, item) { let res = true; if (item.visibilityValuesInSection && item.visibilityValuesInSection.length) { let sectionItems = section.items?.filter(item => item.isSectionValueItem).length ? section.items?.filter(item => item.isSectionValueItem) : section.items?.filter(item => item.actionUpdatesSectionValue); res = sectionItems.filter((sItem) => { const valArr = _.isArray(sItem.value) ? sItem.value : [sItem.value]; return valArr.find(val => item.visibilityValuesInSection.find(arr => arr.indexOf(val) >= 0)); }).length === item.visibilityValuesInSection.length; } if (item.visibilityValuesInTable && item.visibilityValuesInTable.length) { let tableItem = _.first(_.map(form, (section) => { return _.find(section.items, (item) => { if (!item.items) { return item.actionUpdatesTableValue; } else { return _.find(item.items, item => item.actionUpdatesTableValue); } }); })); if (tableItem) { res = item.visibilityValuesInTable.indexOf(tableItem.value) >= 0; } } if (section.visibilityValuesInTable && section.visibilityValuesInTable.length) { let sectionTableItem = _.first(_.map(form, (section) => { return _.find(section.items, (item) => { if (!item.items) { return item.actionReloadsTable; } else { return _.find(item.items, item => item.actionReloadsTable); } }); })); if (sectionTableItem) { res = section.visibilityValuesInTable.indexOf(sectionTableItem.value) >= 0; } } return res; } ; isSectionVisible(form, section) { let res = false; _.each(section.items, (item) => { if (this.isItemVisible(form, section, item)) { res = true; } }); return !section.items ? this.isItemVisible(form, section, {}) : res; } ; getErrors(item) { if (item.fieldValidations) { let errors = []; _.each(item.fieldValidations.rules, (rule) => { const err = this.checkValidationRule(item, rule); if (err) { errors.push(err); } }); errors = _.flatten(errors); if (item.fieldValidations.type === 'OR') { return errors.length === item.fieldValidations.rules.length ? [errors[errors.length - 1]] : []; } return errors; } const err = this.checkValidationRule(item, item.fieldValidation); return err ? [err] : []; } ; checkValidationRule(item, rule) { let res; let errorMessages = _.clone(this.errorMessages); //console.log(item); if (rule && rule.minLength >= 0 && rule.minLength === rule.maxLength) { rule.setLength = rule.maxLength; delete rule.minLength; delete rule.maxLength; } let validationObj = rule || item.sectionValidation; let isNumericError = !/^\d+$/.test(item.value) && validationObj && validationObj.numeric; if (!validationObj) { //console.log('!validationObj', item); } if (item.type === 'label') { return res; } _.each(validationObj, (param, name) => { if (name === 'minCount') { name = 'minLength'; } let message = ''; let itemValue = '' + item.value; switch (name) { case "setLength": if (item.value === undefined || (item.value && itemValue.length !== param) || isNumericError) { message = errorMessages[name].replace('{value}', param); if (item.keyboardType && item.keyboardType === 'number-pad') { message = message.replace('characters', 'digits'); } res = { type: name, message: message }; } else if (item.value === null) { //console.log(item); res = { type: 'require', message: errorMessages.require }; } break; case "minLength": if (!_.isObject(item.value) && (item.value === null || item.value === undefined || !item.value || (item.value?.length || 0) < param || isNumericError)) { //console.log(isNumericError, param, item, rule, name); if (param > 1) { message = errorMessages[name].replace('{value}', param); if (item.keyboardType && item.keyboardType === 'number-pad') { message = message.replace('characters', 'digits'); } res = { type: name, message: message }; } else if (!item.value || !item?.value?.length) { //console.log(item); res = { type: 'require', message: errorMessages.require }; } else if (isNumericError) { res = { type: 'numeric', message: errorMessages.numeric }; } } if (item.name === 'email' && !res?.length) { let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; if (!re.test(item.value)) { res = { type: 'email', message: errorMessages.email }; } } break; case "optionKeyValues": if (!item.value || !item.value.length) { res = { type: 'require', message: errorMessages.require }; } else { if (item.value.find(op => !op.optionValue || !op.label)) { res = { type: 'require', message: 'All options should have Value and Labels defined' }; } } break; default: break; } }); return res; } ; getValue(form, validateAll = false) { let value = {}; let valid = true; let firstError; _.each(_.filter(form, (section) => this.isSectionVisible(form, section)), (section) => { _.each(_.filter(section.items, (item) => this.isItemVisible(form, section, item)), (item) => { //value[item.name] = _.isArray(item.value) ? JSON.stringify(item.value) : item.value; value[item.name] = item.value; if (validateAll) { item.errors = this.getErrors(item); if (item.errors && item.errors.length) { if (!firstError) { firstError = item; } valid = false; } } }); }); return { valid, value, firstError }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1cnZleS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1cnZleXMvc3JjL2xpYi9uZ3gtc3VydmV5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBRXpCO1FBSU8sb0JBQWUsR0FBZ0MsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEUsa0JBQWEsR0FBTztZQUN2QixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFNBQVMsRUFBRSxzQ0FBc0M7WUFDakQsU0FBUyxFQUFFLHNDQUFzQztZQUNqRCxTQUFTLEVBQUUsK0JBQStCO1lBQzFDLE9BQU8sRUFBRSxvQ0FBb0M7WUFDN0MsS0FBSyxFQUFFLGlCQUFpQjtTQUMzQixDQUFDO0lBWEYsQ0FBQztJQWFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVTtRQUM1QixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUEsRUFBRTtZQUNsQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUEsRUFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzRixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRTtvQkFDaEMs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QUFFLENBQUMsSUFBSSxFQUFDLEVBQUUsQ0FBQSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBQyxFQUFFO2dCQUNyRixxRkFBcUY7Z0JBRXJGLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxXQUFXLEVBQUMsQ0FBQztvQkFDYixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsQ0FBQzt3QkFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNsQixDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNILEtBQUs7WUFDTCxLQUFLO1lBQ0wsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDOytHQXRUUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZmLE1BQU07OzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUVycm9yLCBTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9mb3JtLWl0ZW0nO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hTdXJ2ZXlTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIG9uRmlsZXNTZWxlY3RlZDogUmVwbGF5U3ViamVjdDxTdXJ2ZXlGaWxlW10+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgICBwdWJsaWMgZXJyb3JNZXNzYWdlczogYW55PSB7XG4gICAgICAgIHJlcXVpcmU6IFwiRmllbGQgcmVxdWlyZWRcIixcbiAgICAgICAgbWluTGVuZ3RoOiBcIk11c3QgYmUgbW9yZSB0aGFuIHt2YWx1ZX0gY2hhcmFjdGVyc1wiLFxuICAgICAgICBtYXhMZW5ndGg6IFwiTXVzdCBiZSBsZXNzIHRoYW4ge3ZhbHVlfSBjaGFyYWN0ZXJzXCIsXG4gICAgICAgIHNldExlbmd0aDogXCJ7dmFsdWV9IERpZ2l0IE51bWJlciBSZXF1aXJlZFwiLFxuICAgICAgICBudW1lcmljOiBcIlRoZSBlbnRyeSBjYW4gb25seSBjb250YWluIG51bWJlcnNcIixcbiAgICAgICAgZW1haWw6IFwiTm90IHZhbGlkIGVtYWlsXCJcbiAgICB9O1xuXG4gICAgcHVibGljIGluaXRGb3JtKGZvcm0sIGZvcm1WYWx1ZXMpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmb3JtLCBmb3JtVmFsdWVzKTtcbiAgICAgICAgZm9ybS5mb3JFYWNoKHNlY3Rpb249PntcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkSXRlbXMgPSBfLmdyb3VwQnkoXy5maWx0ZXIoc2VjdGlvbi5pdGVtcywgaXRlbT0+IWl0ZW0ubmFtZSksIGl0ZW09Pml0ZW0udHlwZSk7XG5cbiAgICAgICAgICAgICAgICBfLmVhY2goZ3JvdXBlZEl0ZW1zLCAoaXRlbXMsIHR5cGUpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLml0ZW1zW18uaW5kZXhPZihzZWN0aW9uLml0ZW1zLCBfLmZpcnN0KGl0ZW1zKSldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25WYWx1ZUl0ZW06IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGl0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLml0ZW1zID0gXy53aXRob3V0KHNlY3Rpb24uaXRlbXMsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBjb25zdCB2aXNpYmlsaXR5VmFsdWVzSW5UYWJsZUNvbnZlcnQgPSAoaXRlbSk9PntcbiAgICAgICAgICAgIGlmIChpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVJdGVtID0gXy5maXJzdChfLm1hcChmb3JtLCAoc2VjdGlvbik9PntcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZmluZChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmFjdGlvblVwZGF0ZXNUYWJsZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKGl0ZW0uaXRlbXMsIGl0ZW09Pml0ZW0uYWN0aW9uVXBkYXRlc1RhYmxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gPGFueVtdPltdO1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luVGFibGUsICh2YWwpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsSXRlbSA9IF8uZmluZCh0YWJsZUl0ZW0uaXRlbXMsIGl0ZW09Pml0ZW0udGl0bGU9PT12YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVzLnB1c2godmFsSXRlbSAmJiB2YWxJdGVtLm9wdGlvblZhbHVlID8gdmFsSXRlbS5vcHRpb25WYWx1ZSA6IHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlID0gbmV3VmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIF8uZWFjaChmb3JtLCAoc2VjdGlvbik9PntcbiAgICAgICAgICAgIHZpc2liaWxpdHlWYWx1ZXNJblRhYmxlQ29udmVydChzZWN0aW9uKTtcbiAgICAgICAgICAgIF8uZWFjaChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5VmFsdWVzSW5UYWJsZUNvbnZlcnQoaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJyAmJiBzZWN0aW9uLmFsbG93c011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5tdWx0aXBsZSAmJiBfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlc1tpdGVtLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGZvcm1WYWx1ZXNbaXRlbS5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGUnICYmICFfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2l0ZW0udmFsdWUgPSB0aGlzLmdldERhdGVTdHIoZm9ybVZhbHVlc1tpdGVtLm5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2l0ZW0ucmVhZE9ubHkgPSBpdGVtLnJlYWRPbmx5IHx8IF8uY29udGFpbnModGhpcy5yZWFkT25seUZpZWxkcywgaXRlbS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubXVsdGlwbGUgJiYgXy5pc1N0cmluZyhpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtZXJpY1JhdGluZycgJiYgXy5pc1N0cmluZyhpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHBhcnNlSW50KGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzU2VjdGlvblZhbHVlSXRlbSAmJiBzZWN0aW9uLnNlY3Rpb25WYWxpZGF0aW9uICYmICFpdGVtLmZpZWxkVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmZpZWxkVmFsaWRhdGlvbiA9IHNlY3Rpb24uc2VjdGlvblZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uc3VidGl0bGUgPSBzZWN0aW9uLnN1YnRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxuJywgJ2cnKSwgJzxiciAvPicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmb3JtKTtcbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIGlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkge1xuICAgICAgICBsZXQgcmVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luU2VjdGlvbiAmJiBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgc2VjdGlvbkl0ZW1zID0gc2VjdGlvbi5pdGVtcz8uZmlsdGVyKGl0ZW09Pml0ZW0uaXNTZWN0aW9uVmFsdWVJdGVtKS5sZW5ndGggPyBzZWN0aW9uLml0ZW1zPy5maWx0ZXIoaXRlbT0+aXRlbS5pc1NlY3Rpb25WYWx1ZUl0ZW0pIDogc2VjdGlvbi5pdGVtcz8uZmlsdGVyKGl0ZW09Pml0ZW0uYWN0aW9uVXBkYXRlc1NlY3Rpb25WYWx1ZSk7XG5cbiAgICAgICAgICAgIHJlcyA9IHNlY3Rpb25JdGVtcy5maWx0ZXIoKHNJdGVtKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbEFycj1fLmlzQXJyYXkoc0l0ZW0udmFsdWUpID8gc0l0ZW0udmFsdWUgOiBbc0l0ZW0udmFsdWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxBcnIuZmluZCh2YWw9PlxuICAgICAgICAgICAgICAgICAgICBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24uZmluZChhcnI9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLmluZGV4T2YodmFsKT49MFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5sZW5ndGg9PT1pdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlICYmIGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgdGFibGVJdGVtID0gXy5maXJzdChfLm1hcChmb3JtLCAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoc2VjdGlvbi5pdGVtcywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5hY3Rpb25VcGRhdGVzVGFibGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoaXRlbS5pdGVtcywgaXRlbT0+aXRlbS5hY3Rpb25VcGRhdGVzVGFibGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmICh0YWJsZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXMgPSBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlLmluZGV4T2YodGFibGVJdGVtLnZhbHVlKT49MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWN0aW9uLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlICYmIHNlY3Rpb24udmlzaWJpbGl0eVZhbHVlc0luVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgc2VjdGlvblRhYmxlSXRlbSA9IF8uZmlyc3QoXy5tYXAoZm9ybSwgKHNlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKHNlY3Rpb24uaXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWN0aW9uUmVsb2Fkc1RhYmxlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZmluZChpdGVtLml0ZW1zLCBpdGVtPT5pdGVtLmFjdGlvblJlbG9hZHNUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uVGFibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gc2VjdGlvbi52aXNpYmlsaXR5VmFsdWVzSW5UYWJsZS5pbmRleE9mKHNlY3Rpb25UYWJsZUl0ZW0udmFsdWUpPj0wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgcHVibGljIGlzU2VjdGlvblZpc2libGUoZm9ybSwgc2VjdGlvbikge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIF8uZWFjaChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICFzZWN0aW9uLml0ZW1zID8gdGhpcy5pc0l0ZW1WaXNpYmxlKGZvcm0sIHNlY3Rpb24sIHt9KSA6IHJlcztcbiAgICB9O1xuXG4gICAgZ2V0RXJyb3JzKGl0ZW0pOiBGb3JtSXRlbUVycm9yW10ge1xuICAgICAgICBpZiAoaXRlbS5maWVsZFZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzID0gPEZvcm1JdGVtRXJyb3IgW10+IFtdO1xuICAgICAgICAgICAgXy5lYWNoKGl0ZW0uZmllbGRWYWxpZGF0aW9ucy5ydWxlcywgKHJ1bGUpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gIDxGb3JtSXRlbUVycm9yPiB0aGlzLmNoZWNrVmFsaWRhdGlvblJ1bGUoaXRlbSwgcnVsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXJyb3JzID0gXy5mbGF0dGVuKGVycm9ycyk7XG4gICAgICAgICAgICBpZiAoaXRlbS5maWVsZFZhbGlkYXRpb25zLnR5cGUgPT09ICdPUicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA9PT0gaXRlbS5maWVsZFZhbGlkYXRpb25zLnJ1bGVzLmxlbmd0aCA/IFtlcnJvcnNbZXJyb3JzLmxlbmd0aC0xXV0gOiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyPXRoaXMuY2hlY2tWYWxpZGF0aW9uUnVsZShpdGVtLCBpdGVtLmZpZWxkVmFsaWRhdGlvbik7XG4gICAgICAgIHJldHVybiBlcnIgPyBbZXJyXSA6IFtdO1xuICAgIH07XG5cbiAgICBjaGVja1ZhbGlkYXRpb25SdWxlKGl0ZW0sIHJ1bGUpIDogRm9ybUl0ZW1FcnJvciB7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2VzPV8uY2xvbmUodGhpcy5lcnJvck1lc3NhZ2VzKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5taW5MZW5ndGggPj0gMCAmJiBydWxlLm1pbkxlbmd0aCA9PT0gcnVsZS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJ1bGUuc2V0TGVuZ3RoID0gcnVsZS5tYXhMZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgcnVsZS5taW5MZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgcnVsZS5tYXhMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbGlkYXRpb25PYmogPSBydWxlIHx8IGl0ZW0uc2VjdGlvblZhbGlkYXRpb247XG4gICAgICAgIGxldCBpc051bWVyaWNFcnJvciA9ICEvXlxcZCskLy50ZXN0KGl0ZW0udmFsdWUpICYmIHZhbGlkYXRpb25PYmogJiYgdmFsaWRhdGlvbk9iai5udW1lcmljO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb25PYmopIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJyF2YWxpZGF0aW9uT2JqJywgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0udHlwZT09PSdsYWJlbCcpe1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIF8uZWFjaCh2YWxpZGF0aW9uT2JqLCAocGFyYW0sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnbWluQ291bnQnKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9ICdtaW5MZW5ndGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgIGxldCBpdGVtVmFsdWUgPSAnJyArIGl0ZW0udmFsdWU7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzZXRMZW5ndGhcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoaXRlbS52YWx1ZSAmJiBpdGVtVmFsdWUubGVuZ3RoICE9PSBwYXJhbSkgfHwgaXNOdW1lcmljRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VzW25hbWVdLnJlcGxhY2UoJ3t2YWx1ZX0nLCBwYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlib2FyZFR5cGUgJiYgaXRlbS5rZXlib2FyZFR5cGUgPT09ICdudW1iZXItcGFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ2NoYXJhY3RlcnMnLCAnZGlnaXRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVxdWlyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcy5yZXF1aXJlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtaW5MZW5ndGhcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzT2JqZWN0KGl0ZW0udmFsdWUpICYmIChpdGVtLnZhbHVlID09PSBudWxsIHx8IGl0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXRlbS52YWx1ZSB8fCAoaXRlbS52YWx1ZT8ubGVuZ3RoIHx8IDApIDwgcGFyYW0gfHwgaXNOdW1lcmljRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGlzTnVtZXJpY0Vycm9yLCBwYXJhbSwgaXRlbSwgcnVsZSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZXNbbmFtZV0ucmVwbGFjZSgne3ZhbHVlfScsIHBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlib2FyZFR5cGUgJiYgaXRlbS5rZXlib2FyZFR5cGUgPT09ICdudW1iZXItcGFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCdjaGFyYWN0ZXJzJywgJ2RpZ2l0cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWl0ZW0udmFsdWUgfHwgIWl0ZW0/LnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcy5yZXF1aXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTnVtZXJpY0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzLm51bWVyaWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdlbWFpbCcgJiYgIXJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmUgPSAvXigoW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXMuZW1haWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvcHRpb25LZXlWYWx1ZXNcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnZhbHVlIHx8ICFpdGVtLnZhbHVlLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzLnJlcXVpcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZS5maW5kKG9wPT4hb3Aub3B0aW9uVmFsdWUgfHwgIW9wLmxhYmVsKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWxsIG9wdGlvbnMgc2hvdWxkIGhhdmUgVmFsdWUgYW5kIExhYmVscyBkZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWUoZm9ybSwgdmFsaWRhdGVBbGw6Ym9vbGVhbj1mYWxzZSl7XG4gICAgICAgIGxldCB2YWx1ZSA9IHt9O1xuICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgICAgICBsZXQgZmlyc3RFcnJvcjtcbiAgICAgICAgXy5lYWNoKF8uZmlsdGVyKGZvcm0sIChzZWN0aW9uKT0+dGhpcy5pc1NlY3Rpb25WaXNpYmxlKGZvcm0sIHNlY3Rpb24pKSwgKHNlY3Rpb24pPT57XG4gICAgICAgICAgICBfLmVhY2goXy5maWx0ZXIoc2VjdGlvbi5pdGVtcywgKGl0ZW0pPT50aGlzLmlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkpLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAvL3ZhbHVlW2l0ZW0ubmFtZV0gPSBfLmlzQXJyYXkoaXRlbS52YWx1ZSkgPyBKU09OLnN0cmluZ2lmeShpdGVtLnZhbHVlKSA6IGl0ZW0udmFsdWU7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZVtpdGVtLm5hbWVdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVBbGwpe1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycyA9IHRoaXMuZ2V0RXJyb3JzKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5lcnJvcnMgJiYgaXRlbS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEVycm9yID0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZmlyc3RFcnJvclxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==