@ngx-formly/core
Version:
Formly is a dynamic (JSON powered) form library for Angular that bring unmatched maintainability to your application's forms.
135 lines • 23.5 kB
JavaScript
import { Validators } from '@angular/forms';
import { FORMLY_VALIDATORS, defineHiddenProp, isPromise, observe, clone, isObject, hasKey } from '../../utils';
import { updateValidity } from '../field-form/utils';
import { isObservable } from 'rxjs';
import { map } from 'rxjs/operators';
export class FieldValidationExtension {
constructor(config) {
this.config = config;
}
onPopulate(field) {
this.initFieldValidation(field, 'validators');
this.initFieldValidation(field, 'asyncValidators');
}
initFieldValidation(field, type) {
const validators = [];
if (type === 'validators' && !(field.hasOwnProperty('fieldGroup') && !hasKey(field))) {
validators.push(this.getPredefinedFieldValidation(field));
}
if (field[type]) {
for (const validatorName of Object.keys(field[type])) {
validatorName === 'validation'
? validators.push(...field[type].validation.map((v) => this.wrapNgValidatorFn(field, v)))
: validators.push(this.wrapNgValidatorFn(field, field[type][validatorName], validatorName));
}
}
defineHiddenProp(field, '_' + type, validators);
}
getPredefinedFieldValidation(field) {
let VALIDATORS = [];
FORMLY_VALIDATORS.forEach((opt) => observe(field, ['props', opt], ({ currentValue, firstChange }) => {
VALIDATORS = VALIDATORS.filter((o) => o !== opt);
if (opt === 'required' && currentValue != null && typeof currentValue !== 'boolean') {
console.warn(`Formly: Invalid prop 'required' of type '${typeof currentValue}', expected 'boolean' (Field:${field.key}).`);
}
if (currentValue != null && currentValue !== false) {
VALIDATORS.push(opt);
}
if (!firstChange && field.formControl) {
updateValidity(field.formControl);
}
}));
return (control) => {
if (VALIDATORS.length === 0) {
return null;
}
return Validators.compose(VALIDATORS.map((opt) => () => {
const value = field.props[opt];
switch (opt) {
case 'required':
return Validators.required(control);
case 'pattern':
return Validators.pattern(value)(control);
case 'minLength':
const minLengthResult = Validators.minLength(value)(control);
const minLengthKey = this.config.getValidatorMessage('minlength') || field.validation?.messages?.minlength
? 'minlength'
: 'minLength';
return minLengthResult ? { [minLengthKey]: minLengthResult.minlength } : null;
case 'maxLength':
const maxLengthResult = Validators.maxLength(value)(control);
const maxLengthKey = this.config.getValidatorMessage('maxlength') || field.validation?.messages?.maxlength
? 'maxlength'
: 'maxLength';
return maxLengthResult ? { [maxLengthKey]: maxLengthResult.maxlength } : null;
case 'min':
return Validators.min(value)(control);
case 'max':
return Validators.max(value)(control);
default:
return null;
}
}))(control);
};
}
wrapNgValidatorFn(field, validator, validatorName) {
let validatorOption;
if (typeof validator === 'string') {
validatorOption = clone(this.config.getValidator(validator));
}
if (typeof validator === 'object' && validator.name) {
validatorOption = clone(this.config.getValidator(validator.name));
if (validator.options) {
validatorOption.options = validator.options;
}
}
if (typeof validator === 'object' && validator.expression) {
const { expression, ...options } = validator;
validatorOption = {
name: validatorName,
validation: expression,
options: Object.keys(options).length > 0 ? options : null,
};
}
if (typeof validator === 'function') {
validatorOption = {
name: validatorName,
validation: validator,
};
}
return (control) => {
const errors = validatorOption.validation(control, field, validatorOption.options);
if (isPromise(errors)) {
return errors.then((v) => this.handleResult(field, validatorName ? !!v : v, validatorOption));
}
if (isObservable(errors)) {
return errors.pipe(map((v) => this.handleResult(field, validatorName ? !!v : v, validatorOption)));
}
return this.handleResult(field, validatorName ? !!errors : errors, validatorOption);
};
}
handleResult(field, errors, { name, options }) {
if (typeof errors === 'boolean') {
errors = errors ? null : { [name]: options ? options : true };
}
const ctrl = field.formControl;
ctrl?._childrenErrors?.[name]?.();
if (isObject(errors)) {
Object.keys(errors).forEach((name) => {
const errorPath = errors[name].errorPath ? errors[name].errorPath : options?.errorPath;
const childCtrl = errorPath ? field.formControl.get(errorPath) : null;
if (childCtrl) {
const { errorPath: _errorPath, ...opts } = errors[name];
childCtrl.setErrors({ ...(childCtrl.errors || {}), [name]: opts });
!ctrl._childrenErrors && defineHiddenProp(ctrl, '_childrenErrors', {});
ctrl._childrenErrors[name] = () => {
const { [name]: _toDelete, ...childErrors } = childCtrl.errors || {};
childCtrl.setErrors(Object.keys(childErrors).length === 0 ? null : childErrors);
};
}
});
}
return errors;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL3NyYy9saWIvZXh0ZW5zaW9ucy9maWVsZC12YWxpZGF0aW9uL2ZpZWxkLXZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFtQixVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUFvQixNQUFvQjtRQUFwQixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBQUcsQ0FBQztJQUU1QyxVQUFVLENBQUMsS0FBNkI7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQTZCLEVBQUUsSUFBc0M7UUFDL0YsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNwRixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxL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ZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1seUNvbmZpZyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zvcm1seS5jb25maWcnO1xuaW1wb3J0IHsgRm9ybWx5RXh0ZW5zaW9uLCBWYWxpZGF0b3JPcHRpb24sIEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZPUk1MWV9WQUxJREFUT1JTLCBkZWZpbmVIaWRkZW5Qcm9wLCBpc1Byb21pc2UsIG9ic2VydmUsIGNsb25lLCBpc09iamVjdCwgaGFzS2V5IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgdXBkYXRlVmFsaWRpdHkgfSBmcm9tICcuLi9maWVsZC1mb3JtL3V0aWxzJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgY2xhc3MgRmllbGRWYWxpZGF0aW9uRXh0ZW5zaW9uIGltcGxlbWVudHMgRm9ybWx5RXh0ZW5zaW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IEZvcm1seUNvbmZpZykge31cblxuICBvblBvcHVsYXRlKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSB7XG4gICAgdGhpcy5pbml0RmllbGRWYWxpZGF0aW9uKGZpZWxkLCAndmFsaWRhdG9ycycpO1xuICAgIHRoaXMuaW5pdEZpZWxkVmFsaWRhdGlvbihmaWVsZCwgJ2FzeW5jVmFsaWRhdG9ycycpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RmllbGRWYWxpZGF0aW9uKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCB0eXBlOiAndmFsaWRhdG9ycycgfCAnYXN5bmNWYWxpZGF0b3JzJykge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICBpZiAodHlwZSA9PT0gJ3ZhbGlkYXRvcnMnICYmICEoZmllbGQuaGFzT3duUHJvcGVydHkoJ2ZpZWxkR3JvdXAnKSAmJiAhaGFzS2V5KGZpZWxkKSkpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaCh0aGlzLmdldFByZWRlZmluZWRGaWVsZFZhbGlkYXRpb24oZmllbGQpKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRbdHlwZV0pIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yTmFtZSBvZiBPYmplY3Qua2V5cyhmaWVsZFt0eXBlXSkpIHtcbiAgICAgICAgdmFsaWRhdG9yTmFtZSA9PT0gJ3ZhbGlkYXRpb24nXG4gICAgICAgICAgPyB2YWxpZGF0b3JzLnB1c2goLi4uZmllbGRbdHlwZV0udmFsaWRhdGlvbi5tYXAoKHY6IGFueSkgPT4gdGhpcy53cmFwTmdWYWxpZGF0b3JGbihmaWVsZCwgdikpKVxuICAgICAgICAgIDogdmFsaWRhdG9ycy5wdXNoKHRoaXMud3JhcE5nVmFsaWRhdG9yRm4oZmllbGQsIGZpZWxkW3R5cGVdW3ZhbGlkYXRvck5hbWVdLCB2YWxpZGF0b3JOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVmaW5lSGlkZGVuUHJvcChmaWVsZCwgJ18nICsgdHlwZSwgdmFsaWRhdG9ycyk7XG4gIH1cblxuICBwcml2YXRlIGdldFByZWRlZmluZWRGaWVsZFZhbGlkYXRpb24oZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUpOiBWYWxpZGF0b3JGbiB7XG4gICAgbGV0IFZBTElEQVRPUlM6IHN0cmluZ1tdID0gW107XG4gICAgRk9STUxZX1ZBTElEQVRPUlMuZm9yRWFjaCgob3B0KSA9PlxuICAgICAgb2JzZXJ2ZShmaWVsZCwgWydwcm9wcycsIG9wdF0sICh7IGN1cnJlbnRWYWx1ZSwgZmlyc3RDaGFuZ2UgfSkgPT4ge1xuICAgICAgICBWQUxJREFUT1JTID0gVkFMSURBVE9SUy5maWx0ZXIoKG8pID0+IG8gIT09IG9wdCk7XG4gICAgICAgIGlmIChvcHQgPT09ICdyZXF1aXJlZCcgJiYgY3VycmVudFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIGN1cnJlbnRWYWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEZvcm1seTogSW52YWxpZCBwcm9wICdyZXF1aXJlZCcgb2YgdHlwZSAnJHt0eXBlb2YgY3VycmVudFZhbHVlfScsIGV4cGVjdGVkICdib29sZWFuJyAoRmllbGQ6JHtcbiAgICAgICAgICAgICAgZmllbGQua2V5XG4gICAgICAgICAgICB9KS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgICAgIFZBTElEQVRPUlMucHVzaChvcHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyc3RDaGFuZ2UgJiYgZmllbGQuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICB1cGRhdGVWYWxpZGl0eShmaWVsZC5mb3JtQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKFZBTElEQVRPUlMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmFsaWRhdG9ycy5jb21wb3NlKFxuICAgICAgICBWQUxJREFUT1JTLm1hcCgob3B0KSA9PiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5wcm9wc1tvcHRdO1xuICAgICAgICAgIHN3aXRjaCAob3B0KSB7XG4gICAgICAgICAgICBjYXNlICdyZXF1aXJlZCc6XG4gICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLnJlcXVpcmVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgY2FzZSAncGF0dGVybic6XG4gICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLnBhdHRlcm4odmFsdWUpKGNvbnRyb2wpO1xuICAgICAgICAgICAgY2FzZSAnbWluTGVuZ3RoJzpcbiAgICAgICAgICAgICAgY29uc3QgbWluTGVuZ3RoUmVzdWx0ID0gVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsdWUpKGNvbnRyb2wpO1xuICAgICAgICAgICAgICBjb25zdCBtaW5MZW5ndGhLZXkgPVxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmdldFZhbGlkYXRvck1lc3NhZ2UoJ21pbmxlbmd0aCcpIHx8IGZpZWxkLnZhbGlkYXRpb24/Lm1lc3NhZ2VzPy5taW5sZW5ndGhcbiAgICAgICAgICAgICAgICAgID8gJ21pbmxlbmd0aCdcbiAgICAgICAgICAgICAgICAgIDogJ21pbkxlbmd0aCc7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG1pbkxlbmd0aFJlc3VsdCA/IHsgW21pbkxlbmd0aEtleV06IG1pbkxlbmd0aFJlc3VsdC5taW5sZW5ndGggfSA6IG51bGw7XG4gICAgICAgICAgICBjYXNlICdtYXhMZW5ndGgnOlxuICAgICAgICAgICAgICBjb25zdCBtYXhMZW5ndGhSZXN1bHQgPSBWYWxpZGF0b3JzLm1heExlbmd0aCh2YWx1ZSkoY29udHJvbCk7XG4gICAgICAgICAgICAgIGNvbnN0IG1heExlbmd0aEtleSA9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZ2V0VmFsaWRhdG9yTWVzc2FnZSgnbWF4bGVuZ3RoJykgfHwgZmllbGQudmFsaWRhdGlvbj8ubWVzc2FnZXM/Lm1heGxlbmd0aFxuICAgICAgICAgICAgICAgICAgPyAnbWF4bGVuZ3RoJ1xuICAgICAgICAgICAgICAgICAgOiAnbWF4TGVuZ3RoJztcblxuICAgICAgICAgICAgICByZXR1cm4gbWF4TGVuZ3RoUmVzdWx0ID8geyBbbWF4TGVuZ3RoS2V5XTogbWF4TGVuZ3RoUmVzdWx0Lm1heGxlbmd0aCB9IDogbnVsbDtcbiAgICAgICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm1pbih2YWx1ZSkoY29udHJvbCk7XG4gICAgICAgICAgICBjYXNlICdtYXgnOlxuICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5tYXgodmFsdWUpKGNvbnRyb2wpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICkhKGNvbnRyb2wpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdyYXBOZ1ZhbGlkYXRvckZuKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCB2YWxpZGF0b3I6IGFueSwgdmFsaWRhdG9yTmFtZT86IHN0cmluZykge1xuICAgIGxldCB2YWxpZGF0b3JPcHRpb246IFZhbGlkYXRvck9wdGlvbjtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbGlkYXRvck9wdGlvbiA9IGNsb25lKHRoaXMuY29uZmlnLmdldFZhbGlkYXRvcih2YWxpZGF0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbGlkYXRvciA9PT0gJ29iamVjdCcgJiYgdmFsaWRhdG9yLm5hbWUpIHtcbiAgICAgIHZhbGlkYXRvck9wdGlvbiA9IGNsb25lKHRoaXMuY29uZmlnLmdldFZhbGlkYXRvcih2YWxpZGF0b3IubmFtZSkpO1xuICAgICAgaWYgKHZhbGlkYXRvci5vcHRpb25zKSB7XG4gICAgICAgIHZhbGlkYXRvck9wdGlvbi5vcHRpb25zID0gdmFsaWRhdG9yLm9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgPT09ICdvYmplY3QnICYmIHZhbGlkYXRvci5leHByZXNzaW9uKSB7XG4gICAgICBjb25zdCB7IGV4cHJlc3Npb24sIC4uLm9wdGlvbnMgfSA9IHZhbGlkYXRvcjtcbiAgICAgIHZhbGlkYXRvck9wdGlvbiA9IHtcbiAgICAgICAgbmFtZTogdmFsaWRhdG9yTmFtZSxcbiAgICAgICAgdmFsaWRhdGlvbjogZXhwcmVzc2lvbixcbiAgICAgICAgb3B0aW9uczogT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCA/IG9wdGlvbnMgOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsaWRhdG9yT3B0aW9uID0ge1xuICAgICAgICBuYW1lOiB2YWxpZGF0b3JOYW1lLFxuICAgICAgICB2YWxpZGF0aW9uOiB2YWxpZGF0b3IsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnM6IGFueSA9IHZhbGlkYXRvck9wdGlvbi52YWxpZGF0aW9uKGNvbnRyb2wsIGZpZWxkLCB2YWxpZGF0b3JPcHRpb24ub3B0aW9ucyk7XG4gICAgICBpZiAoaXNQcm9taXNlKGVycm9ycykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ycy50aGVuKCh2KSA9PiB0aGlzLmhhbmRsZVJlc3VsdChmaWVsZCwgdmFsaWRhdG9yTmFtZSA/ICEhdiA6IHYsIHZhbGlkYXRvck9wdGlvbikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKGVycm9ycykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5waXBlKG1hcCgodikgPT4gdGhpcy5oYW5kbGVSZXN1bHQoZmllbGQsIHZhbGlkYXRvck5hbWUgPyAhIXYgOiB2LCB2YWxpZGF0b3JPcHRpb24pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3VsdChmaWVsZCwgdmFsaWRhdG9yTmFtZSA/ICEhZXJyb3JzIDogZXJyb3JzLCB2YWxpZGF0b3JPcHRpb24pO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlc3VsdChmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgZXJyb3JzOiBhbnksIHsgbmFtZSwgb3B0aW9ucyB9OiBWYWxpZGF0b3JPcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVycm9ycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBlcnJvcnMgPSBlcnJvcnMgPyBudWxsIDogeyBbbmFtZV06IG9wdGlvbnMgPyBvcHRpb25zIDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGN0cmwgPSBmaWVsZC5mb3JtQ29udHJvbDtcbiAgICBjdHJsPy5fY2hpbGRyZW5FcnJvcnM/LltuYW1lXT8uKCk7XG5cbiAgICBpZiAoaXNPYmplY3QoZXJyb3JzKSkge1xuICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yUGF0aCA9IGVycm9yc1tuYW1lXS5lcnJvclBhdGggPyBlcnJvcnNbbmFtZV0uZXJyb3JQYXRoIDogb3B0aW9ucz8uZXJyb3JQYXRoO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkQ3RybCA9IGVycm9yUGF0aCA/IGZpZWxkLmZvcm1Db250cm9sLmdldChlcnJvclBhdGgpIDogbnVsbDtcbiAgICAgICAgaWYgKGNoaWxkQ3RybCkge1xuICAgICAgICAgIGNvbnN0IHsgZXJyb3JQYXRoOiBfZXJyb3JQYXRoLCAuLi5vcHRzIH0gPSBlcnJvcnNbbmFtZV07XG4gICAgICAgICAgY2hpbGRDdHJsLnNldEVycm9ycyh7IC4uLihjaGlsZEN0cmwuZXJyb3JzIHx8IHt9KSwgW25hbWVdOiBvcHRzIH0pO1xuXG4gICAgICAgICAgIWN0cmwuX2NoaWxkcmVuRXJyb3JzICYmIGRlZmluZUhpZGRlblByb3AoY3RybCwgJ19jaGlsZHJlbkVycm9ycycsIHt9KTtcbiAgICAgICAgICBjdHJsLl9jaGlsZHJlbkVycm9yc1tuYW1lXSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgW25hbWVdOiBfdG9EZWxldGUsIC4uLmNoaWxkRXJyb3JzIH0gPSBjaGlsZEN0cmwuZXJyb3JzIHx8IHt9O1xuICAgICAgICAgICAgY2hpbGRDdHJsLnNldEVycm9ycyhPYmplY3Qua2V5cyhjaGlsZEVycm9ycykubGVuZ3RoID09PSAwID8gbnVsbCA6IGNoaWxkRXJyb3JzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG59XG4iXX0=