@ngx-formly/core
Version:
Formly is a dynamic (JSON powered) form library for Angular that bring unmatched maintainability to your application's forms.
249 lines • 38.6 kB
JavaScript
import { isObject, isNil, isUndefined, isFunction, defineHiddenProp, observe, getFieldValue, assignFieldValue, hasKey, } from '../../utils';
import { evalExpression, evalStringExpressionLegacy } from './utils';
import { isObservable, Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { unregisterControl, registerControl, updateValidity } from '../field-form/utils';
import { UntypedFormArray } from '@angular/forms';
export class FieldExpressionExtension {
onPopulate(field) {
if (field._expressions) {
return;
}
// cache built expression
defineHiddenProp(field, '_expressions', {});
observe(field, ['hide'], ({ currentValue, firstChange }) => {
defineHiddenProp(field, '_hide', !!currentValue);
if (!firstChange || (firstChange && currentValue === true)) {
field.props.hidden = currentValue;
field.options._hiddenFieldsForCheck.push({ field });
}
});
if (field.hideExpression) {
observe(field, ['hideExpression'], ({ currentValue: expr }) => {
field._expressions.hide = this.parseExpressions(field, 'hide', typeof expr === 'boolean' ? () => expr : expr);
});
}
const evalExpr = (key, expr) => {
if (typeof expr === 'string' || isFunction(expr)) {
field._expressions[key] = this.parseExpressions(field, key, expr);
}
else if (expr instanceof Observable) {
field._expressions[key] = {
value$: expr.pipe(tap((v) => {
this.evalExpr(field, key, v);
field.options._detectChanges(field);
})),
};
}
};
field.expressions = field.expressions || {};
for (const key of Object.keys(field.expressions)) {
observe(field, ['expressions', key], ({ currentValue: expr }) => {
evalExpr(key, isFunction(expr) ? (...args) => expr(field, args[3]) : expr);
});
}
field.expressionProperties = field.expressionProperties || {};
for (const key of Object.keys(field.expressionProperties)) {
observe(field, ['expressionProperties', key], ({ currentValue }) => evalExpr(key, currentValue));
}
}
postPopulate(field) {
if (field.parent) {
return;
}
if (!field.options.checkExpressions) {
let checkLocked = false;
field.options.checkExpressions = (f, ignoreCache) => {
if (checkLocked) {
return;
}
checkLocked = true;
const fieldChanged = this.checkExpressions(f, ignoreCache);
const options = field.options;
options._hiddenFieldsForCheck
.sort((f) => (f.field.hide ? -1 : 1))
.forEach((f) => this.changeHideState(f.field, f.field.hide ?? f.default, !ignoreCache));
options._hiddenFieldsForCheck = [];
if (fieldChanged) {
this.checkExpressions(field);
}
checkLocked = false;
};
}
}
parseExpressions(field, path, expr) {
let parentExpression;
if (field.parent && ['hide', 'props.disabled'].includes(path)) {
const rootValue = (f) => {
return path === 'hide' ? f.hide : f.props.disabled;
};
parentExpression = () => {
let root = field.parent;
while (root.parent && !rootValue(root)) {
root = root.parent;
}
return rootValue(root);
};
}
expr = expr || (() => false);
if (typeof expr === 'string') {
expr = this._evalStringExpression(expr, ['model', 'formState', 'field']);
}
let currentValue;
return {
callback: (ignoreCache) => {
try {
const exprValue = evalExpression(parentExpression ? (...args) => parentExpression(field) || expr(...args) : expr, { field }, [field.model, field.options.formState, field, ignoreCache]);
if (ignoreCache ||
(currentValue !== exprValue &&
(!isObject(exprValue) ||
isObservable(exprValue) ||
JSON.stringify(exprValue) !== JSON.stringify(currentValue)))) {
currentValue = exprValue;
this.evalExpr(field, path, exprValue);
return true;
}
return false;
}
catch (error) {
error.message = `[Formly Error] [Expression "${path}"] ${error.message}`;
throw error;
}
},
};
}
_evalStringExpression(expression, argNames) {
return evalStringExpressionLegacy(expression, argNames);
}
checkExpressions(field, ignoreCache = false) {
if (!field) {
return false;
}
let fieldChanged = false;
if (field._expressions) {
for (const key of Object.keys(field._expressions)) {
field._expressions[key].callback?.(ignoreCache) && (fieldChanged = true);
}
}
field.fieldGroup?.forEach((f) => this.checkExpressions(f, ignoreCache) && (fieldChanged = true));
return fieldChanged;
}
changeDisabledState(field, value) {
if (field.fieldGroup) {
field.fieldGroup
.filter((f) => !f._expressions.hasOwnProperty('props.disabled'))
.forEach((f) => this.changeDisabledState(f, value));
}
if (hasKey(field) && field.props.disabled !== value) {
field.props.disabled = value;
}
}
changeHideState(field, hide, resetOnHide) {
if (field.fieldGroup) {
field.fieldGroup
.filter((f) => f && !f._expressions.hide)
.forEach((f) => this.changeHideState(f, hide, resetOnHide));
}
if (field.formControl && hasKey(field)) {
defineHiddenProp(field, '_hide', !!(hide || field.hide));
const c = field.formControl;
if (c._fields?.length > 1) {
updateValidity(c);
}
if (hide === true && (!c._fields || c._fields.every((f) => !!f._hide))) {
unregisterControl(field, true);
if (resetOnHide && field.resetOnHide) {
assignFieldValue(field, undefined);
field.formControl.reset({ value: undefined, disabled: field.formControl.disabled });
field.options.fieldChanges.next({ value: undefined, field, type: 'valueChanges' });
if (field.fieldGroup && field.formControl instanceof UntypedFormArray) {
field.fieldGroup.length = 0;
}
}
}
else if (hide === false) {
if (field.resetOnHide && !isUndefined(field.defaultValue) && isUndefined(getFieldValue(field))) {
assignFieldValue(field, field.defaultValue);
}
registerControl(field, undefined, true);
if (field.resetOnHide && field.fieldArray && field.fieldGroup?.length !== field.model?.length) {
field.options.build(field);
}
}
}
if (field.options.fieldChanges) {
field.options.fieldChanges.next({ field, type: 'hidden', value: hide });
}
}
evalExpr(field, prop, value) {
if (prop.indexOf('model.') === 0) {
const key = prop.replace(/^model\./, ''), parent = field.fieldGroup ? field : field.parent;
let control = field?.key === key ? field.formControl : field.form.get(key);
if (!control && field.get(key)) {
control = field.get(key).formControl;
}
assignFieldValue({ key, parent, model: field.model }, value);
if (control && !(isNil(control.value) && isNil(value)) && control.value !== value) {
control.patchValue(value);
}
}
else {
try {
let target = field;
const paths = this._evalExpressionPath(field, prop);
const lastIndex = paths.length - 1;
for (let i = 0; i < lastIndex; i++) {
target = target[paths[i]];
}
target[paths[lastIndex]] = value;
}
catch (error) {
error.message = `[Formly Error] [Expression "${prop}"] ${error.message}`;
throw error;
}
if (['templateOptions.disabled', 'props.disabled'].includes(prop) && hasKey(field)) {
this.changeDisabledState(field, value);
}
}
this.emitExpressionChanges(field, prop, value);
}
emitExpressionChanges(field, property, value) {
if (!field.options.fieldChanges) {
return;
}
field.options.fieldChanges.next({
field,
type: 'expressionChanges',
property,
value,
});
}
_evalExpressionPath(field, prop) {
if (field._expressions[prop] && field._expressions[prop].paths) {
return field._expressions[prop].paths;
}
let paths = [];
if (prop.indexOf('[') === -1) {
paths = prop.split('.');
}
else {
prop
.split(/[[\]]{1,2}/) // https://stackoverflow.com/a/20198206
.filter((p) => p)
.forEach((path) => {
const arrayPath = path.match(/['|"](.*?)['|"]/);
if (arrayPath) {
paths.push(arrayPath[1]);
}
else {
paths.push(...path.split('.').filter((p) => p));
}
});
}
if (field._expressions[prop]) {
field._expressions[prop].paths = paths;
}
return paths;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZXhwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb3JlL3NyYy9saWIvZXh0ZW5zaW9ucy9maWVsZC1leHByZXNzaW9uLWxlZ2FjeS9maWVsZC1leHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsRUFDWCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLE1BQU0sR0FDUCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsVUFBVSxDQUFDLEtBQTZCO1FBQ3RDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFNUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtZQUN6RCxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxJQUFJLENB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LENBQUMsQ0FBQztnQkFDbEQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtbHlWYWx1ZUNoYW5nZUV2ZW50LCBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc05pbCxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRnVuY3Rpb24sXG4gIGRlZmluZUhpZGRlblByb3AsXG4gIG9ic2VydmUsXG4gIGdldEZpZWxkVmFsdWUsXG4gIGFzc2lnbkZpZWxkVmFsdWUsXG4gIGhhc0tleSxcbn0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgZXZhbEV4cHJlc3Npb24sIGV2YWxTdHJpbmdFeHByZXNzaW9uTGVnYWN5IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZvcm1seUV4dGVuc2lvbiB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyB1bnJlZ2lzdGVyQ29udHJvbCwgcmVnaXN0ZXJDb250cm9sLCB1cGRhdGVWYWxpZGl0eSB9IGZyb20gJy4uL2ZpZWxkLWZvcm0vdXRpbHMnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkRXhwcmVzc2lvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIEZvcm1seUV4dGVuc2lvbiB7XG4gIG9uUG9wdWxhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUpIHtcbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2FjaGUgYnVpbHQgZXhwcmVzc2lvblxuICAgIGRlZmluZUhpZGRlblByb3AoZmllbGQsICdfZXhwcmVzc2lvbnMnLCB7fSk7XG5cbiAgICBvYnNlcnZlKGZpZWxkLCBbJ2hpZGUnXSwgKHsgY3VycmVudFZhbHVlLCBmaXJzdENoYW5nZSB9KSA9PiB7XG4gICAgICBkZWZpbmVIaWRkZW5Qcm9wKGZpZWxkLCAnX2hpZGUnLCAhIWN1cnJlbnRWYWx1ZSk7XG4gICAgICBpZiAoIWZpcnN0Q2hhbmdlIHx8IChmaXJzdENoYW5nZSAmJiBjdXJyZW50VmFsdWUgPT09IHRydWUpKSB7XG4gICAgICAgIGZpZWxkLnByb3BzLmhpZGRlbiA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgZmllbGQub3B0aW9ucy5faGlkZGVuRmllbGRzRm9yQ2hlY2sucHVzaCh7IGZpZWxkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLmhpZGVFeHByZXNzaW9uKSB7XG4gICAgICBvYnNlcnZlKGZpZWxkLCBbJ2hpZGVFeHByZXNzaW9uJ10sICh7IGN1cnJlbnRWYWx1ZTogZXhwciB9KSA9PiB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9ucy5oaWRlID0gdGhpcy5wYXJzZUV4cHJlc3Npb25zKGZpZWxkLCAnaGlkZScsIHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgPyAoKSA9PiBleHByIDogZXhwcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBldmFsRXhwciA9IChrZXk6IHN0cmluZywgZXhwcjogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IGlzRnVuY3Rpb24oZXhwcikpIHtcbiAgICAgICAgZmllbGQuX2V4cHJlc3Npb25zW2tleV0gPSB0aGlzLnBhcnNlRXhwcmVzc2lvbnMoZmllbGQsIGtleSwgZXhwcik7XG4gICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9uc1trZXldID0ge1xuICAgICAgICAgIHZhbHVlJDogKGV4cHIgYXMgT2JzZXJ2YWJsZTxhbnk+KS5waXBlKFxuICAgICAgICAgICAgdGFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZXZhbEV4cHIoZmllbGQsIGtleSwgdik7XG4gICAgICAgICAgICAgIGZpZWxkLm9wdGlvbnMuX2RldGVjdENoYW5nZXMoZmllbGQpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZmllbGQuZXhwcmVzc2lvbnMgPSBmaWVsZC5leHByZXNzaW9ucyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5leHByZXNzaW9ucykpIHtcbiAgICAgIG9ic2VydmUoZmllbGQsIFsnZXhwcmVzc2lvbnMnLCBrZXldLCAoeyBjdXJyZW50VmFsdWU6IGV4cHIgfSkgPT4ge1xuICAgICAgICBldmFsRXhwcihrZXksIGlzRnVuY3Rpb24oZXhwcikgPyAoLi4uYXJnczogYW55KSA9PiBleHByKGZpZWxkLCBhcmdzWzNdKSA6IGV4cHIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmllbGQuZXhwcmVzc2lvblByb3BlcnRpZXMgPSBmaWVsZC5leHByZXNzaW9uUHJvcGVydGllcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5leHByZXNzaW9uUHJvcGVydGllcykpIHtcbiAgICAgIG9ic2VydmUoZmllbGQsIFsnZXhwcmVzc2lvblByb3BlcnRpZXMnLCBrZXldLCAoeyBjdXJyZW50VmFsdWUgfSkgPT4gZXZhbEV4cHIoa2V5LCBjdXJyZW50VmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBwb3N0UG9wdWxhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUpIHtcbiAgICBpZiAoZmllbGQucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFmaWVsZC5vcHRpb25zLmNoZWNrRXhwcmVzc2lvbnMpIHtcbiAgICAgIGxldCBjaGVja0xvY2tlZCA9IGZhbHNlO1xuICAgICAgZmllbGQub3B0aW9ucy5jaGVja0V4cHJlc3Npb25zID0gKGYsIGlnbm9yZUNhY2hlKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xvY2tlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZmllbGRDaGFuZ2VkID0gdGhpcy5jaGVja0V4cHJlc3Npb25zKGYsIGlnbm9yZUNhY2hlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMuX2hpZGRlbkZpZWxkc0ZvckNoZWNrXG4gICAgICAgICAgLnNvcnQoKGYpID0+IChmLmZpZWxkLmhpZGUgPyAtMSA6IDEpKVxuICAgICAgICAgIC5mb3JFYWNoKChmKSA9PiB0aGlzLmNoYW5nZUhpZGVTdGF0ZShmLmZpZWxkLCBmLmZpZWxkLmhpZGUgPz8gZi5kZWZhdWx0LCAhaWdub3JlQ2FjaGUpKTtcbiAgICAgICAgb3B0aW9ucy5faGlkZGVuRmllbGRzRm9yQ2hlY2sgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tFeHByZXNzaW9ucyhmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tMb2NrZWQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRXhwcmVzc2lvbnMoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsIHBhdGg6IHN0cmluZywgZXhwcjogYW55KSB7XG4gICAgbGV0IHBhcmVudEV4cHJlc3Npb246IGFueTtcbiAgICBpZiAoZmllbGQucGFyZW50ICYmIFsnaGlkZScsICdwcm9wcy5kaXNhYmxlZCddLmluY2x1ZGVzKHBhdGgpKSB7XG4gICAgICBjb25zdCByb290VmFsdWUgPSAoZjogRm9ybWx5RmllbGRDb25maWdDYWNoZSkgPT4ge1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gJ2hpZGUnID8gZi5oaWRlIDogZi5wcm9wcy5kaXNhYmxlZDtcbiAgICAgIH07XG5cbiAgICAgIHBhcmVudEV4cHJlc3Npb24gPSAoKSA9PiB7XG4gICAgICAgIGxldCByb290ID0gZmllbGQucGFyZW50O1xuICAgICAgICB3aGlsZSAocm9vdC5wYXJlbnQgJiYgIXJvb3RWYWx1ZShyb290KSkge1xuICAgICAgICAgIHJvb3QgPSByb290LnBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb290VmFsdWUocm9vdCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGV4cHIgPSBleHByIHx8ICgoKSA9PiBmYWxzZSk7XG4gICAgaWYgKHR5cGVvZiBleHByID09PSAnc3RyaW5nJykge1xuICAgICAgZXhwciA9IHRoaXMuX2V2YWxTdHJpbmdFeHByZXNzaW9uKGV4cHIsIFsnbW9kZWwnLCAnZm9ybVN0YXRlJywgJ2ZpZWxkJ10pO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50VmFsdWU6IGFueTtcblxuICAgIHJldHVybiB7XG4gICAgICBjYWxsYmFjazogKGlnbm9yZUNhY2hlPzogYm9vbGVhbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV4cHJWYWx1ZSA9IGV2YWxFeHByZXNzaW9uKFxuICAgICAgICAgICAgcGFyZW50RXhwcmVzc2lvbiA/ICguLi5hcmdzOiBhbnkpID0+IHBhcmVudEV4cHJlc3Npb24oZmllbGQpIHx8IGV4cHIoLi4uYXJncykgOiBleHByLFxuICAgICAgICAgICAgeyBmaWVsZCB9LFxuICAgICAgICAgICAgW2ZpZWxkLm1vZGVsLCBmaWVsZC5vcHRpb25zLmZvcm1TdGF0ZSwgZmllbGQsIGlnbm9yZUNhY2hlXSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaWdub3JlQ2FjaGUgfHxcbiAgICAgICAgICAgIChjdXJyZW50VmFsdWUgIT09IGV4cHJWYWx1ZSAmJlxuICAgICAgICAgICAgICAoIWlzT2JqZWN0KGV4cHJWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICBpc09ic2VydmFibGUoZXhwclZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV4cHJWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSkpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVudFZhbHVlID0gZXhwclZhbHVlO1xuICAgICAgICAgICAgdGhpcy5ldmFsRXhwcihmaWVsZCwgcGF0aCwgZXhwclZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbRm9ybWx5IEVycm9yXSBbRXhwcmVzc2lvbiBcIiR7cGF0aH1cIl0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZXZhbFN0cmluZ0V4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBhcmdOYW1lczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gZXZhbFN0cmluZ0V4cHJlc3Npb25MZWdhY3koZXhwcmVzc2lvbiwgYXJnTmFtZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V4cHJlc3Npb25zKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCBpZ25vcmVDYWNoZSA9IGZhbHNlKSB7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBmaWVsZENoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZC5fZXhwcmVzc2lvbnMpKSB7XG4gICAgICAgIGZpZWxkLl9leHByZXNzaW9uc1trZXldLmNhbGxiYWNrPy4oaWdub3JlQ2FjaGUpICYmIChmaWVsZENoYW5nZWQgPSB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmllbGQuZmllbGRHcm91cD8uZm9yRWFjaCgoZikgPT4gdGhpcy5jaGVja0V4cHJlc3Npb25zKGYsIGlnbm9yZUNhY2hlKSAmJiAoZmllbGRDaGFuZ2VkID0gdHJ1ZSkpO1xuXG4gICAgcmV0dXJuIGZpZWxkQ2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlRGlzYWJsZWRTdGF0ZShmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAoZmllbGQuZmllbGRHcm91cCkge1xuICAgICAgZmllbGQuZmllbGRHcm91cFxuICAgICAgICAuZmlsdGVyKChmOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlKSA9PiAhZi5fZXhwcmVzc2lvbnMuaGFzT3duUHJvcGVydHkoJ3Byb3BzLmRpc2FibGVkJykpXG4gICAgICAgIC5mb3JFYWNoKChmKSA9PiB0aGlzLmNoYW5nZURpc2FibGVkU3RhdGUoZiwgdmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzS2V5KGZpZWxkKSAmJiBmaWVsZC5wcm9wcy5kaXNhYmxlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGZpZWxkLnByb3BzLmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VIaWRlU3RhdGUoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnQ2FjaGUsIGhpZGU6IGJvb2xlYW4sIHJlc2V0T25IaWRlOiBib29sZWFuKSB7XG4gICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgIGZpZWxkLmZpZWxkR3JvdXBcbiAgICAgICAgLmZpbHRlcigoZjogRm9ybWx5RmllbGRDb25maWdDYWNoZSkgPT4gZiAmJiAhZi5fZXhwcmVzc2lvbnMuaGlkZSlcbiAgICAgICAgLmZvckVhY2goKGYpID0+IHRoaXMuY2hhbmdlSGlkZVN0YXRlKGYsIGhpZGUsIHJlc2V0T25IaWRlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLmZvcm1Db250cm9sICYmIGhhc0tleShmaWVsZCkpIHtcbiAgICAgIGRlZmluZUhpZGRlblByb3AoZmllbGQsICdfaGlkZScsICEhKGhpZGUgfHwgZmllbGQuaGlkZSkpO1xuICAgICAgY29uc3QgYyA9IGZpZWxkLmZvcm1Db250cm9sO1xuICAgICAgaWYgKGMuX2ZpZWxkcz8ubGVuZ3RoID4gMSkge1xuICAgICAgICB1cGRhdGVWYWxpZGl0eShjKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZGUgPT09IHRydWUgJiYgKCFjLl9maWVsZHMgfHwgYy5fZmllbGRzLmV2ZXJ5KChmKSA9PiAhIWYuX2hpZGUpKSkge1xuICAgICAgICB1bnJlZ2lzdGVyQ29udHJvbChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZXNldE9uSGlkZSAmJiBmaWVsZC5yZXNldE9uSGlkZSkge1xuICAgICAgICAgIGFzc2lnbkZpZWxkVmFsdWUoZmllbGQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wucmVzZXQoeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmllbGQuZm9ybUNvbnRyb2wuZGlzYWJsZWQgfSk7XG4gICAgICAgICAgZmllbGQub3B0aW9ucy5maWVsZENoYW5nZXMubmV4dCh7IHZhbHVlOiB1bmRlZmluZWQsIGZpZWxkLCB0eXBlOiAndmFsdWVDaGFuZ2VzJyB9KTtcbiAgICAgICAgICBpZiAoZmllbGQuZmllbGRHcm91cCAmJiBmaWVsZC5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZpZWxkR3JvdXAubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGlkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpZWxkLnJlc2V0T25IaWRlICYmICFpc1VuZGVmaW5lZChmaWVsZC5kZWZhdWx0VmFsdWUpICYmIGlzVW5kZWZpbmVkKGdldEZpZWxkVmFsdWUoZmllbGQpKSkge1xuICAgICAgICAgIGFzc2lnbkZpZWxkVmFsdWUoZmllbGQsIGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJDb250cm9sKGZpZWxkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICBpZiAoZmllbGQucmVzZXRPbkhpZGUgJiYgZmllbGQuZmllbGRBcnJheSAmJiBmaWVsZC5maWVsZEdyb3VwPy5sZW5ndGggIT09IGZpZWxkLm1vZGVsPy5sZW5ndGgpIHtcbiAgICAgICAgICBmaWVsZC5vcHRpb25zLmJ1aWxkKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaWVsZC5vcHRpb25zLmZpZWxkQ2hhbmdlcykge1xuICAgICAgZmllbGQub3B0aW9ucy5maWVsZENoYW5nZXMubmV4dCg8Rm9ybWx5VmFsdWVDaGFuZ2VFdmVudD57IGZpZWxkLCB0eXBlOiAnaGlkZGVuJywgdmFsdWU6IGhpZGUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsRXhwcihmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHByb3AuaW5kZXhPZignbW9kZWwuJykgPT09IDApIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3AucmVwbGFjZSgvXm1vZGVsXFwuLywgJycpLFxuICAgICAgICBwYXJlbnQgPSBmaWVsZC5maWVsZEdyb3VwID8gZmllbGQgOiBmaWVsZC5wYXJlbnQ7XG5cbiAgICAgIGxldCBjb250cm9sID0gZmllbGQ/LmtleSA9PT0ga2V5ID8gZmllbGQuZm9ybUNvbnRyb2wgOiBmaWVsZC5mb3JtLmdldChrZXkpO1xuICAgICAgaWYgKCFjb250cm9sICYmIGZpZWxkLmdldChrZXkpKSB7XG4gICAgICAgIGNvbnRyb2wgPSBmaWVsZC5nZXQoa2V5KS5mb3JtQ29udHJvbDtcbiAgICAgIH1cbiAgICAgIGFzc2lnbkZpZWxkVmFsdWUoeyBrZXksIHBhcmVudCwgbW9kZWw6IGZpZWxkLm1vZGVsIH0sIHZhbHVlKTtcbiAgICAgIGlmIChjb250cm9sICYmICEoaXNOaWwoY29udHJvbC52YWx1ZSkgJiYgaXNOaWwodmFsdWUpKSAmJiBjb250cm9sLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgdGFyZ2V0OiBhbnkgPSBmaWVsZDtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLl9ldmFsRXhwcmVzc2lvblBhdGgoZmllbGQsIHByb3ApO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBwYXRocy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W3BhdGhzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldFtwYXRoc1tsYXN0SW5kZXhdXSA9IHZhbHVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gYFtGb3JtbHkgRXJyb3JdIFtFeHByZXNzaW9uIFwiJHtwcm9wfVwiXSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChbJ3RlbXBsYXRlT3B0aW9ucy5kaXNhYmxlZCcsICdwcm9wcy5kaXNhYmxlZCddLmluY2x1ZGVzKHByb3ApICYmIGhhc0tleShmaWVsZCkpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEaXNhYmxlZFN0YXRlKGZpZWxkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0RXhwcmVzc2lvbkNoYW5nZXMoZmllbGQsIHByb3AsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEV4cHJlc3Npb25DaGFuZ2VzKGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZ0NhY2hlLCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFmaWVsZC5vcHRpb25zLmZpZWxkQ2hhbmdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpZWxkLm9wdGlvbnMuZmllbGRDaGFuZ2VzLm5leHQoe1xuICAgICAgZmllbGQsXG4gICAgICB0eXBlOiAnZXhwcmVzc2lvbkNoYW5nZXMnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2V2YWxFeHByZXNzaW9uUGF0aChmaWVsZDogRm9ybWx5RmllbGRDb25maWdDYWNoZSwgcHJvcDogc3RyaW5nKSB7XG4gICAgaWYgKGZpZWxkLl9leHByZXNzaW9uc1twcm9wXSAmJiBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHMpIHtcbiAgICAgIHJldHVybiBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHM7XG4gICAgfVxuXG4gICAgbGV0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChwcm9wLmluZGV4T2YoJ1snKSA9PT0gLTEpIHtcbiAgICAgIHBhdGhzID0gcHJvcC5zcGxpdCgnLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wXG4gICAgICAgIC5zcGxpdCgvW1tcXF1dezEsMn0vKSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjAxOTgyMDZcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcClcbiAgICAgICAgLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheVBhdGggPSBwYXRoLm1hdGNoKC9bJ3xcIl0oLio/KVsnfFwiXS8pO1xuICAgICAgICAgIGlmIChhcnJheVBhdGgpIHtcbiAgICAgICAgICAgIHBhdGhzLnB1c2goYXJyYXlQYXRoWzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aHMucHVzaCguLi5wYXRoLnNwbGl0KCcuJykuZmlsdGVyKChwKSA9PiBwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQuX2V4cHJlc3Npb25zW3Byb3BdKSB7XG4gICAgICBmaWVsZC5fZXhwcmVzc2lvbnNbcHJvcF0ucGF0aHMgPSBwYXRocztcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbn1cbiJdfQ==