{"version":3,"file":"yoolabs-ngx-dynamic-form-builder.mjs","sources":["../esm2020/lib/constants/constants.mjs","../esm2020/lib/utils/get-global.util.mjs","../esm2020/lib/utils/global-dynamic-form-builder-options.mjs","../esm2020/lib/utils/utils.mjs","../esm2020/lib/lib.mjs","../esm2020/lib/types/types.mjs","../esm2020/lib/form-builder.mjs","../esm2020/lib/decorators/decorators.mjs","../esm2020/lib/decorators/expose-nested.decorator.mjs","../esm2020/yoolabs-ngx-dynamic-form-builder.mjs"],"sourcesContent":["export const DEFAULT_CLASS_TRANSFORM_OPTIONS = {\r\n    strategy: 'excludeAll',\r\n};\r\nexport const __dynamicControlOptions__ = '__dynamicControlOptions__';\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb25zdGFudHMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFpQztJQUMzRSxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbWljQ2xhc3NUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xBU1NfVFJBTlNGT1JNX09QVElPTlM6IER5bmFtaWNDbGFzc1RyYW5zZm9ybU9wdGlvbnMgPSB7XHJcbiAgc3RyYXRlZ3k6ICdleGNsdWRlQWxsJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBfX2R5bmFtaWNDb250cm9sT3B0aW9uc19fID0gJ19fZHluYW1pY0NvbnRyb2xPcHRpb25zX18nO1xyXG4iXX0=","/**\r\n * This function returns the global object across Node and browsers.\r\n *\r\n * Note: `globalThis` is the standardized approach however it has been added to\r\n * Node.js in version 12. We need to include this snippet until Node 12 EOL.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function getGlobal() {\r\n    if (typeof globalThis !== 'undefined') {\r\n        return globalThis;\r\n    }\r\n    if (typeof global !== 'undefined') {\r\n        return global;\r\n    }\r\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n    // @ts-ignore: Cannot find name 'window'.\r\n    if (typeof window !== 'undefined') {\r\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n        // @ts-ignore: Cannot find name 'window'.\r\n        return window;\r\n    }\r\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n    // @ts-ignore: Cannot find name 'self'.\r\n    if (typeof self !== 'undefined') {\r\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n        // @ts-ignore: Cannot find name 'self'.\r\n        return self;\r\n    }\r\n    throw Error('Can not work with the global object');\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWdsb2JhbC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIvc3JjL2xpYi91dGlscy9nZXQtZ2xvYmFsLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFNBQVM7SUFDdkIsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUU7UUFDckMsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNqQyxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBRUQsNkRBQTZEO0lBQzdELHlDQUF5QztJQUN6QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtRQUNqQyw2REFBNkQ7UUFDN0QseUNBQXlDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCw2REFBNkQ7SUFDN0QsdUNBQXVDO0lBQ3ZDLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFO1FBQy9CLDZEQUE2RDtRQUM3RCx1Q0FBdUM7UUFDdkMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdsb2JhbCBvYmplY3QgYWNyb3NzIE5vZGUgYW5kIGJyb3dzZXJzLlxyXG4gKlxyXG4gKiBOb3RlOiBgZ2xvYmFsVGhpc2AgaXMgdGhlIHN0YW5kYXJkaXplZCBhcHByb2FjaCBob3dldmVyIGl0IGhhcyBiZWVuIGFkZGVkIHRvXHJcbiAqIE5vZGUuanMgaW4gdmVyc2lvbiAxMi4gV2UgbmVlZCB0byBpbmNsdWRlIHRoaXMgc25pcHBldCB1bnRpbCBOb2RlIDEyIEVPTC5cclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWwoKTogYW55IHtcclxuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcclxuICB9XHJcblxyXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgcmV0dXJuIGdsb2JhbDtcclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcclxuICAvLyBAdHMtaWdub3JlOiBDYW5ub3QgZmluZCBuYW1lICd3aW5kb3cnLlxyXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxyXG4gICAgLy8gQHRzLWlnbm9yZTogQ2Fubm90IGZpbmQgbmFtZSAnd2luZG93Jy5cclxuICAgIHJldHVybiB3aW5kb3c7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XHJcbiAgLy8gQHRzLWlnbm9yZTogQ2Fubm90IGZpbmQgbmFtZSAnc2VsZicuXHJcbiAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxyXG4gICAgLy8gQHRzLWlnbm9yZTogQ2Fubm90IGZpbmQgbmFtZSAnc2VsZicuXHJcbiAgICByZXR1cm4gc2VsZjtcclxuICB9XHJcbiAgdGhyb3cgRXJyb3IoJ0NhbiBub3Qgd29yayB3aXRoIHRoZSBnbG9iYWwgb2JqZWN0Jyk7XHJcbn1cclxuIl19","import { BehaviorSubject } from 'rxjs';\r\nimport { getGlobal } from '../utils/get-global.util';\r\nconst globalDynamicFormBuilderOptions = 'globalDynamicFormBuilderOptions';\r\nexport function getGlobalDynamicFormBuilderOptionsSubject() {\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const global = getGlobal();\r\n    if (!global[globalDynamicFormBuilderOptions]) {\r\n        global[globalDynamicFormBuilderOptions] = new BehaviorSubject({});\r\n    }\r\n    return global[globalDynamicFormBuilderOptions];\r\n}\r\nexport function getGlobalDynamicFormBuilderOptions() {\r\n    return (getGlobalDynamicFormBuilderOptionsSubject().value ||\r\n        {});\r\n}\r\nexport function setGlobalDynamicFormBuilderOptions(dynamicFormBuilderOptions) {\r\n    getGlobalDynamicFormBuilderOptionsSubject().next(dynamicFormBuilderOptions);\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWR5bmFtaWMtZm9ybS1idWlsZGVyLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1keW5hbWljLWZvcm0tYnVpbGRlci9zcmMvbGliL3V0aWxzL2dsb2JhbC1keW5hbWljLWZvcm0tYnVpbGRlci1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE1BQU0sK0JBQStCLEdBQUcsaUNBQWlDLENBQUM7QUFFMUUsTUFBTSxVQUFVLHlDQUF5QztJQUd2RCw4REFBOEQ7SUFDOUQsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFTLENBQUM7SUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxFQUFFO1FBQzVDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsT0FBTyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQztJQUdoRCxPQUFPLENBQUMseUNBQXlDLEVBQUUsQ0FBQyxLQUFLO1FBQ3ZELEVBQUUsQ0FBaUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQyxDQUNoRCx5QkFBdUQ7SUFFdkQseUNBQXlDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7IGdldEdsb2JhbCB9IGZyb20gJy4uL3V0aWxzL2dldC1nbG9iYWwudXRpbCc7XHJcblxyXG5jb25zdCBnbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zID0gJ2dsb2JhbER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNTdWJqZWN0PFQ+KCk6IEJlaGF2aW9yU3ViamVjdDxcclxuICBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+XHJcbj4ge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsKCkgYXMgYW55O1xyXG4gIGlmICghZ2xvYmFsW2dsb2JhbER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNdKSB7XHJcbiAgICBnbG9iYWxbZ2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc10gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcclxuICB9XHJcbiAgcmV0dXJuIGdsb2JhbFtnbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8XHJcbiAgVFxyXG4+KCk6IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD4ge1xyXG4gIHJldHVybiAoZ2V0R2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc1N1YmplY3QoKS52YWx1ZSB8fFxyXG4gICAge30pIGFzIER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRHbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+KFxyXG4gIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM6IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD5cclxuKSB7XHJcbiAgZ2V0R2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc1N1YmplY3QoKS5uZXh0KGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMpO1xyXG59XHJcbiJdfQ==","import cloneDeep from 'lodash.clonedeep';\r\nimport mergeWith from 'lodash.mergewith';\r\nimport lodashSet from 'lodash.set';\r\nimport { __dynamicControlOptions__ } from '../constants/constants';\r\nexport function setDynamicControlOptions(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nobject, options) {\r\n    object[__dynamicControlOptions__] = options;\r\n}\r\nexport function removeDynamicControlOptions(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nobject) {\r\n    delete object[__dynamicControlOptions__];\r\n}\r\nexport function getDynamicControlOptions(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nobject) {\r\n    return object[__dynamicControlOptions__];\r\n}\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function recursiveRemoveDynamicControlOptions(object) {\r\n    if (!object || isPrimitiveClass(object) || isPrimitiveType(object)) {\r\n        return object;\r\n    }\r\n    else {\r\n        if (Array.isArray(object)) {\r\n            return object.map((item) => recursiveRemoveDynamicControlOptions(item));\r\n        }\r\n        if (Object.getOwnPropertyDescriptor(object || {}, __dynamicControlOptions__)) {\r\n            delete object[__dynamicControlOptions__];\r\n        }\r\n        Object.keys(object).forEach((key) => {\r\n            if (Object.getOwnPropertyDescriptor(object[key] || {}, __dynamicControlOptions__)) {\r\n                delete object[key][__dynamicControlOptions__];\r\n            }\r\n        });\r\n        return object;\r\n    }\r\n}\r\nexport function replaceLastPropertyToDynamicControlOptionsByDotPath(controlPath, \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nobject, \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nrootValue, control, metadata) {\r\n    const newControlPath = [\r\n        ...controlPath\r\n            .split('.')\r\n            .filter((v, i) => i < controlPath.split('.').length - 1),\r\n        __dynamicControlOptions__,\r\n    ].join('.');\r\n    lodashSet(\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    object, newControlPath, {\r\n        rootValue,\r\n        controlPath,\r\n        control,\r\n        metadata,\r\n    });\r\n}\r\nexport function setCustomDataToRootFormGroup(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ncontrol, key, value) {\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    control.root[key] = value;\r\n}\r\nexport function getCustomDataToRootFormGroup(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ncontrol, key, defaultValue) {\r\n    if (Object.getOwnPropertyDescriptor(control?.root || {}, key)) {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        return (control?.root)[key];\r\n    }\r\n    return defaultValue;\r\n}\r\nexport function transformValidationErrorsToClassValidatorErrors(errors) {\r\n    const customErrors = {};\r\n    errors.forEach((error) => {\r\n        if (error && error.constraints !== undefined) {\r\n            Object.keys(error.constraints).forEach((key) => {\r\n                if (!customErrors[error.property]) {\r\n                    customErrors[error.property] = {};\r\n                }\r\n                if (!customErrors[error.property].messages) {\r\n                    customErrors[error.property].messages = [];\r\n                }\r\n                if (error.constraints &&\r\n                    customErrors[error.property].messages?.indexOf(error.constraints[key]) === -1) {\r\n                    customErrors[error.property].messages?.push(error.constraints[key]);\r\n                }\r\n            });\r\n        }\r\n        if (error.children !== undefined && error.children.length) {\r\n            if (!customErrors[error.property]) {\r\n                customErrors[error.property] = {};\r\n            }\r\n            if (!customErrors[error.property].children) {\r\n                customErrors[error.property].children = {};\r\n            }\r\n            customErrors[error.property].children =\r\n                transformValidationErrorsToClassValidatorErrors(error.children);\r\n        }\r\n    });\r\n    return customErrors;\r\n}\r\nexport function transformClassValidatorErrorsToShortValidationErrors(errors) {\r\n    const customErrors = {};\r\n    Object.keys(errors).forEach((key) => {\r\n        if (errors[key]?.messages?.length) {\r\n            if (!customErrors[key]) {\r\n                customErrors[key] = {};\r\n            }\r\n            customErrors[key] = errors[key].messages;\r\n        }\r\n        if (Object.keys(errors[key]?.children || {}).length) {\r\n            if (!customErrors[key]) {\r\n                customErrors[key] = {};\r\n            }\r\n            customErrors[key] = {\r\n                ...transformClassValidatorErrorsToShortValidationErrors(errors[key].children || {}),\r\n            };\r\n        }\r\n    });\r\n    return customErrors;\r\n}\r\nexport function mergeErrors(externalErrors, validationErrors) {\r\n    const clonedExternalErrors = cloneDeep(externalErrors);\r\n    const clonedValidationErrors = cloneDeep(validationErrors);\r\n    return mergeWith(clonedExternalErrors, clonedValidationErrors, (objValue, srcValue) => {\r\n        if (Array.isArray(objValue) && !Array.isArray(srcValue)) {\r\n            return [...objValue, ...Object.keys(srcValue || {})].filter(Boolean);\r\n        }\r\n        if (Array.isArray(srcValue) && !Array.isArray(objValue)) {\r\n            return [...Object.keys(objValue || {}), ...srcValue].filter(Boolean);\r\n        }\r\n        if (canMerge()) {\r\n            return objValue.concat(srcValue);\r\n        }\r\n        return undefined;\r\n        function canMerge() {\r\n            return (Array.isArray(objValue) &&\r\n                Array.isArray(srcValue) &&\r\n                !objValue.find((objItem) => srcValue.includes(objItem)));\r\n        }\r\n    });\r\n}\r\nexport function collectDynamicFormGroupErrors(control) {\r\n    if (control.controls) {\r\n        return {\r\n            ...Object.keys(control.controls).reduce((all, key) => {\r\n                const childErrors = collectDynamicFormGroupErrors(control.controls[key]);\r\n                if (childErrors && Object.keys(childErrors).length > 0) {\r\n                    all = {\r\n                        ...all,\r\n                        [key]: {\r\n                            ...childErrors,\r\n                        },\r\n                    };\r\n                }\r\n                return all;\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            }, {}),\r\n        };\r\n    }\r\n    else {\r\n        // todo: need check\r\n        const key = control?.classTransformMetadata?.propertyName;\r\n        const childErrors = control.errors;\r\n        if (key &&\r\n            childErrors?.[key]?.messages &&\r\n            Array.isArray(childErrors[key]?.messages)) {\r\n            delete childErrors[key];\r\n        }\r\n        return childErrors;\r\n    }\r\n}\r\nexport function isPrimitiveClass(classType) {\r\n    return (classType &&\r\n        (classType === Number ||\r\n            classType === String ||\r\n            classType === Boolean ||\r\n            classType === Date));\r\n}\r\nexport function isPrimitiveType(object) {\r\n    return (object &&\r\n        (typeof object === 'number' ||\r\n            typeof object === 'string' ||\r\n            typeof object === 'boolean'));\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1keW5hbWljLWZvcm0tYnVpbGRlci9zcmMvbGliL3V0aWxzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVVuRSxNQUFNLFVBQVUsd0JBQXdCO0FBQ3RDLDhEQUE4RDtBQUM5RCxNQUFXLEVBQ1gsT0FBOEI7SUFFOUIsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCO0FBQ3pDLDhEQUE4RDtBQUM5RCxNQUFXO0lBRVgsT0FBTyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QjtBQUN0Qyw4REFBOEQ7QUFDOUQsTUFBVztJQUVYLE9BQU8sTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsTUFBVztJQUM5RCxJQUFJLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNsRSxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFDRSxN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QUNIO2dCQUNELE9BQU8sR0FBRyxDQUFDO2dCQUNYLDhEQUE4RDtZQUNoRSxDQUFDLEVBQUUsRUFBUyxDQUFDO1NBQ2QsQ0FBQztLQUNIO1NBQU07UUFDTCxtQkFBbUI7UUFDbkIsTUFBTSxHQUFHLEdBQUcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFlBQVksQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ25DLElBQ0UsR0FBRztZQUNILFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVE7WUFDNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQ3pDO1lBQ0EsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLFdBQVcsQ0FBQztLQUNwQjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFNBQStDO0lBRS9DLE9BQU8sQ0FDTCxTQUFTO1FBQ1QsQ0FBQyxTQUFTLEtBQUssTUFBTTtZQUNuQixTQUFTLEtBQUssTUFBTTtZQUNwQixTQUFTLEtBQUssT0FBTztZQUNyQixTQUFTLEtBQUssSUFBSSxDQUFDLENBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFlO0lBQzdDLE9BQU8sQ0FDTCxNQUFNO1FBQ04sQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRO1lBQ3pCLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFDMUIsT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQy9CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdjbGFzcy12YWxpZGF0b3ItbXVsdGktbGFuZyc7XHJcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XHJcbmltcG9ydCBtZXJnZVdpdGggZnJvbSAnbG9kYXNoLm1lcmdld2l0aCc7XHJcbmltcG9ydCBsb2Rhc2hTZXQgZnJvbSAnbG9kYXNoLnNldCc7XHJcbmltcG9ydCB7IF9fZHluYW1pY0NvbnRyb2xPcHRpb25zX18gfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICBDbGFzc1ZhbGlkYXRvckVycm9ycyxcclxuICBEeW5hbWljQ29udHJvbE9wdGlvbnMsXHJcbiAgRHluYW1pY0Zvcm1Hcm91cCxcclxuICBEeW5hbWljRm9ybVByb3BlcnRpZXMsXHJcbiAgSUR5bmFtaWNDb250cm9sTWV0YWRhdGEsXHJcbiAgU2hvcnRWYWxpZGF0aW9uRXJyb3JzLFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREeW5hbWljQ29udHJvbE9wdGlvbnMoXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBvYmplY3Q6IGFueSxcclxuICBvcHRpb25zOiBEeW5hbWljQ29udHJvbE9wdGlvbnNcclxuKSB7XHJcbiAgb2JqZWN0W19fZHluYW1pY0NvbnRyb2xPcHRpb25zX19dID0gb3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUR5bmFtaWNDb250cm9sT3B0aW9ucyhcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIG9iamVjdDogYW55XHJcbikge1xyXG4gIGRlbGV0ZSBvYmplY3RbX19keW5hbWljQ29udHJvbE9wdGlvbnNfX107XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREeW5hbWljQ29udHJvbE9wdGlvbnMoXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBvYmplY3Q6IGFueVxyXG4pIHtcclxuICByZXR1cm4gb2JqZWN0W19fZHluYW1pY0NvbnRyb2xPcHRpb25zX19dO1xyXG59XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5leHBvcnQgZnVuY3Rpb24gcmVjdXJzaXZlUmVtb3ZlRHluYW1pY0NvbnRyb2xPcHRpb25zKG9iamVjdDogYW55KTogYW55IHtcclxuICBpZiAoIW9iamVjdCB8fCBpc1ByaW1pdGl2ZUNsYXNzKG9iamVjdCkgfHwgaXNQcmltaXRpdmVUeXBlKG9iamVjdCkpIHtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5tYXAoKGl0ZW0pID0+IHJlY3Vyc2l2ZVJlbW92ZUR5bmFtaWNDb250cm9sT3B0aW9ucyhpdGVtKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0IHx8IHt9LCBfX2R5bmFtaWNDb250cm9sT3B0aW9uc19fKVxyXG4gICAgKSB7XHJcbiAgICAgIGRlbGV0ZSBvYmplY3RbX19keW5hbWljQ29udHJvbE9wdGlvbnNfX107XHJcbiAgICB9XHJcbiAgICBPYmplY3Qua2V5cyhvYmplY3QpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcclxuICAgICAgICAgIG9iamVjdFtrZXldIHx8IHt9LFxyXG4gICAgICAgICAgX19keW5hbWljQ29udHJvbE9wdGlvbnNfX1xyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGVsZXRlIG9iamVjdFtrZXldW19fZHluYW1pY0NvbnRyb2xPcHRpb25zX19dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUxhc3RQcm9wZXJ0eVRvRHluYW1pY0NvbnRyb2xPcHRpb25zQnlEb3RQYXRoKFxyXG4gIGNvbnRyb2xQYXRoOiBzdHJpbmcsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBvYmplY3Q6IGFueSxcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHJvb3RWYWx1ZTogYW55LFxyXG4gIGNvbnRyb2w6IER5bmFtaWNGb3JtUHJvcGVydGllcyB8IEFic3RyYWN0Q29udHJvbCxcclxuICBtZXRhZGF0YTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGFcclxuKSB7XHJcbiAgY29uc3QgbmV3Q29udHJvbFBhdGggPSBbXHJcbiAgICAuLi5jb250cm9sUGF0aFxyXG4gICAgICAuc3BsaXQoJy4nKVxyXG4gICAgICAuZmlsdGVyKCh2LCBpKSA9PiBpIDwgY29udHJvbFBhdGguc3BsaXQoJy4nKS5sZW5ndGggLSAxKSxcclxuICAgIF9fZHluYW1pY0NvbnRyb2xPcHRpb25zX18sXHJcbiAgXS5qb2luKCcuJyk7XHJcblxyXG4gIGxvZGFzaFNldChcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBvYmplY3QgYXMgYW55LFxyXG4gICAgbmV3Q29udHJvbFBhdGgsXHJcbiAgICB7XHJcbiAgICAgIHJvb3RWYWx1ZSxcclxuICAgICAgY29udHJvbFBhdGgsXHJcbiAgICAgIGNvbnRyb2wsXHJcbiAgICAgIG1ldGFkYXRhLFxyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXN0b21EYXRhVG9Sb290Rm9ybUdyb3VwPFQgPSB1bmtub3duPihcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnRyb2w6IGFueSxcclxuICBrZXk6IHN0cmluZyxcclxuICB2YWx1ZTogVFxyXG4pIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIChjb250cm9sLnJvb3QgYXMgYW55KVtrZXldID0gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21EYXRhVG9Sb290Rm9ybUdyb3VwPFQ+KFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29udHJvbDogYW55LFxyXG4gIGtleTogc3RyaW5nLFxyXG4gIGRlZmF1bHRWYWx1ZTogVFxyXG4pIHtcclxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb250cm9sPy5yb290IHx8IHt9LCBrZXkpKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgcmV0dXJuIChjb250cm9sPy5yb290IGFzIGFueSlba2V5XSBhcyBUO1xyXG4gIH1cclxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtVmFsaWRhdGlvbkVycm9yc1RvQ2xhc3NWYWxpZGF0b3JFcnJvcnMoXHJcbiAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXVxyXG4pOiBDbGFzc1ZhbGlkYXRvckVycm9ycyB7XHJcbiAgY29uc3QgY3VzdG9tRXJyb3JzOiBDbGFzc1ZhbGlkYXRvckVycm9ycyA9IHt9O1xyXG5cclxuICBlcnJvcnMuZm9yRWFjaCgoZXJyb3I6IFZhbGlkYXRpb25FcnJvcikgPT4ge1xyXG4gICAgaWYgKGVycm9yICYmIGVycm9yLmNvbnN0cmFpbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgT2JqZWN0LmtleXMoZXJyb3IuY29uc3RyYWludHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCFjdXN0b21FcnJvcnNbZXJyb3IucHJvcGVydHldKSB7XHJcbiAgICAgICAgICBjdXN0b21FcnJvcnNbZXJyb3IucHJvcGVydHldID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VzdG9tRXJyb3JzW2Vycm9yLnByb3BlcnR5XS5tZXNzYWdlcykge1xyXG4gICAgICAgICAgY3VzdG9tRXJyb3JzW2Vycm9yLnByb3BlcnR5XS5tZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBlcnJvci5jb25zdHJhaW50cyAmJlxyXG4gICAgICAgICAgY3VzdG9tRXJyb3JzW2Vycm9yLnByb3BlcnR5XS5tZXNzYWdlcz8uaW5kZXhPZihcclxuICAgICAgICAgICAgZXJyb3IuY29uc3RyYWludHNba2V5XVxyXG4gICAgICAgICAgKSA9PT0gLTFcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGN1c3RvbUVycm9yc1tlcnJvci5wcm9wZXJ0eV0ubWVzc2FnZXM/LnB1c2goZXJyb3IuY29uc3RyYWludHNba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXJyb3IuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBlcnJvci5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgaWYgKCFjdXN0b21FcnJvcnNbZXJyb3IucHJvcGVydHldKSB7XHJcbiAgICAgICAgY3VzdG9tRXJyb3JzW2Vycm9yLnByb3BlcnR5XSA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghY3VzdG9tRXJyb3JzW2Vycm9yLnByb3BlcnR5XS5jaGlsZHJlbikge1xyXG4gICAgICAgIGN1c3RvbUVycm9yc1tlcnJvci5wcm9wZXJ0eV0uY2hpbGRyZW4gPSB7fTtcclxuICAgICAgfVxyXG4gICAgICBjdXN0b21FcnJvcnNbZXJyb3IucHJvcGVydHldLmNoaWxkcmVuID1cclxuICAgICAgICB0cmFuc2Zvcm1WYWxpZGF0aW9uRXJyb3JzVG9DbGFzc1ZhbGlkYXRvckVycm9ycyhlcnJvci5jaGlsZHJlbik7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBjdXN0b21FcnJvcnM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1DbGFzc1ZhbGlkYXRvckVycm9yc1RvU2hvcnRWYWxpZGF0aW9uRXJyb3JzKFxyXG4gIGVycm9yczogQ2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuKTogU2hvcnRWYWxpZGF0aW9uRXJyb3JzIHtcclxuICBjb25zdCBjdXN0b21FcnJvcnM6IFNob3J0VmFsaWRhdGlvbkVycm9ycyA9IHt9O1xyXG4gIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICBpZiAoZXJyb3JzW2tleV0/Lm1lc3NhZ2VzPy5sZW5ndGgpIHtcclxuICAgICAgaWYgKCFjdXN0b21FcnJvcnNba2V5XSkge1xyXG4gICAgICAgIGN1c3RvbUVycm9yc1trZXldID0ge307XHJcbiAgICAgIH1cclxuICAgICAgY3VzdG9tRXJyb3JzW2tleV0gPSBlcnJvcnNba2V5XS5tZXNzYWdlcztcclxuICAgIH1cclxuICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnNba2V5XT8uY2hpbGRyZW4gfHwge30pLmxlbmd0aCkge1xyXG4gICAgICBpZiAoIWN1c3RvbUVycm9yc1trZXldKSB7XHJcbiAgICAgICAgY3VzdG9tRXJyb3JzW2tleV0gPSB7fTtcclxuICAgICAgfVxyXG4gICAgICBjdXN0b21FcnJvcnNba2V5XSA9IHtcclxuICAgICAgICAuLi50cmFuc2Zvcm1DbGFzc1ZhbGlkYXRvckVycm9yc1RvU2hvcnRWYWxpZGF0aW9uRXJyb3JzKFxyXG4gICAgICAgICAgZXJyb3JzW2tleV0uY2hpbGRyZW4gfHwge31cclxuICAgICAgICApLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gY3VzdG9tRXJyb3JzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFcnJvcnM8VD4oZXh0ZXJuYWxFcnJvcnM/OiBULCB2YWxpZGF0aW9uRXJyb3JzPzogVCkge1xyXG4gIGNvbnN0IGNsb25lZEV4dGVybmFsRXJyb3JzID0gY2xvbmVEZWVwKGV4dGVybmFsRXJyb3JzKTtcclxuICBjb25zdCBjbG9uZWRWYWxpZGF0aW9uRXJyb3JzID0gY2xvbmVEZWVwKHZhbGlkYXRpb25FcnJvcnMpO1xyXG4gIHJldHVybiBtZXJnZVdpdGgoXHJcbiAgICBjbG9uZWRFeHRlcm5hbEVycm9ycyxcclxuICAgIGNsb25lZFZhbGlkYXRpb25FcnJvcnMsXHJcbiAgICAob2JqVmFsdWUsIHNyY1ZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ialZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheShzcmNWYWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gWy4uLm9ialZhbHVlLCAuLi5PYmplY3Qua2V5cyhzcmNWYWx1ZSB8fCB7fSldLmZpbHRlcihCb29sZWFuKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzcmNWYWx1ZSkgJiYgIUFycmF5LmlzQXJyYXkob2JqVmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi5PYmplY3Qua2V5cyhvYmpWYWx1ZSB8fCB7fSksIC4uLnNyY1ZhbHVlXS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjYW5NZXJnZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBmdW5jdGlvbiBjYW5NZXJnZSgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShvYmpWYWx1ZSkgJiZcclxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3JjVmFsdWUpICYmXHJcbiAgICAgICAgICAhb2JqVmFsdWUuZmluZCgob2JqSXRlbSkgPT4gc3JjVmFsdWUuaW5jbHVkZXMob2JqSXRlbSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RHluYW1pY0Zvcm1Hcm91cEVycm9yczxUPihcclxuICBjb250cm9sOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+XHJcbikge1xyXG4gIGlmIChjb250cm9sLmNvbnRyb2xzKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb250cm9sLmNvbnRyb2xzKS5yZWR1Y2UoKGFsbCwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRFcnJvcnMgPSBjb2xsZWN0RHluYW1pY0Zvcm1Hcm91cEVycm9ycyhcclxuICAgICAgICAgIGNvbnRyb2wuY29udHJvbHNba2V5XSBhcyBEeW5hbWljRm9ybUdyb3VwXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY2hpbGRFcnJvcnMgJiYgT2JqZWN0LmtleXMoY2hpbGRFcnJvcnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGFsbCA9IHtcclxuICAgICAgICAgICAgLi4uYWxsLFxyXG4gICAgICAgICAgICBba2V5XToge1xyXG4gICAgICAgICAgICAgIC4uLmNoaWxkRXJyb3JzLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFsbDtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICB9LCB7fSBhcyBhbnkpLFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gdG9kbzogbmVlZCBjaGVja1xyXG4gICAgY29uc3Qga2V5ID0gY29udHJvbD8uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YT8ucHJvcGVydHlOYW1lO1xyXG4gICAgY29uc3QgY2hpbGRFcnJvcnMgPSBjb250cm9sLmVycm9ycztcclxuICAgIGlmIChcclxuICAgICAga2V5ICYmXHJcbiAgICAgIGNoaWxkRXJyb3JzPy5ba2V5XT8ubWVzc2FnZXMgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheShjaGlsZEVycm9yc1trZXldPy5tZXNzYWdlcylcclxuICAgICkge1xyXG4gICAgICBkZWxldGUgY2hpbGRFcnJvcnNba2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZEVycm9ycztcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZUNsYXNzKFxyXG4gIGNsYXNzVHlwZTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGFbJ2NsYXNzVHlwZSddXHJcbikge1xyXG4gIHJldHVybiAoXHJcbiAgICBjbGFzc1R5cGUgJiZcclxuICAgIChjbGFzc1R5cGUgPT09IE51bWJlciB8fFxyXG4gICAgICBjbGFzc1R5cGUgPT09IFN0cmluZyB8fFxyXG4gICAgICBjbGFzc1R5cGUgPT09IEJvb2xlYW4gfHxcclxuICAgICAgY2xhc3NUeXBlID09PSBEYXRlKVxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZVR5cGUob2JqZWN0OiB1bmtub3duKSB7XHJcbiAgcmV0dXJuIChcclxuICAgIG9iamVjdCAmJlxyXG4gICAgKHR5cGVvZiBvYmplY3QgPT09ICdudW1iZXInIHx8XHJcbiAgICAgIHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnIHx8XHJcbiAgICAgIHR5cGVvZiBvYmplY3QgPT09ICdib29sZWFuJylcclxuICApO1xyXG59XHJcbiJdfQ==","import { UntypedFormArray, UntypedFormControl, UntypedFormGroup, } from '@angular/forms';\r\nimport { instanceToPlain, plainToInstance, } from 'class-transformer-global-storage';\r\nimport { validate, validateSync, } from 'class-validator-multi-lang';\r\nimport cloneDeep from 'lodash.clonedeep';\r\nimport lodashGet from 'lodash.get';\r\nimport mergeWith from 'lodash.mergewith';\r\nimport lodashSet from 'lodash.set';\r\nimport { BehaviorSubject, from, of, ReplaySubject } from 'rxjs';\r\nimport { catchError, debounceTime, delay, map, tap } from 'rxjs/operators';\r\nimport { DEFAULT_CLASS_TRANSFORM_OPTIONS } from './constants/constants';\r\nimport { getGlobal } from './utils/get-global.util';\r\nimport { getGlobalDynamicFormBuilderOptions, getGlobalDynamicFormBuilderOptionsSubject, } from './utils/global-dynamic-form-builder-options';\r\nimport { collectDynamicFormGroupErrors, isPrimitiveClass, isPrimitiveType, mergeErrors, recursiveRemoveDynamicControlOptions, replaceLastPropertyToDynamicControlOptionsByDotPath, setDynamicControlOptions, transformClassValidatorErrorsToShortValidationErrors, transformValidationErrorsToClassValidatorErrors, } from './utils/utils';\r\nexport function createFormControls({ classType, formBuilder, form, rootFormGroup, metadata, defaultValue, dynamicFormBuilderOptions, }) {\r\n    const isRoot = !rootFormGroup;\r\n    let dynamicForm = form;\r\n    if (!dynamicForm) {\r\n        dynamicForm = formBuilder.group({});\r\n    }\r\n    if (isRoot) {\r\n        rootFormGroup = dynamicForm;\r\n        setupDynamicFormBuilderOptions({\r\n            dynamicForm,\r\n            dynamicFormBuilderOptions,\r\n        });\r\n    }\r\n    if (dynamicFormBuilderOptions || rootFormGroup?.dynamicFormBuilderOptions) {\r\n        setupClassTransformMetadata({\r\n            classType,\r\n            dynamicForm,\r\n            defaultMetadata: metadata,\r\n            dynamicFormBuilderOptions: \r\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n            dynamicFormBuilderOptions || rootFormGroup.dynamicFormBuilderOptions,\r\n        });\r\n    }\r\n    createAllFormGroupChildrenControls({\r\n        dynamicForm,\r\n        defaultValue,\r\n        formBuilder,\r\n        rootFormGroup,\r\n        dynamicFormBuilderOptions,\r\n    });\r\n    addDynamicMethodsToFormGroup(dynamicForm);\r\n    if (isRoot) {\r\n        subscribeToRootFormGroupValueChanges(dynamicForm);\r\n        subscribeToGlobalDynamicFormBuilderOptionsChange(formBuilder, dynamicForm);\r\n        return addDynamicMethodsToRootFormGroup({\r\n            dynamicForm,\r\n            rootFormGroup,\r\n            formBuilder,\r\n        });\r\n    }\r\n    else {\r\n        return dynamicForm;\r\n    }\r\n}\r\nexport function setValuesForControls(formBuilder, form, value) {\r\n    const metadata = form.classTransformMetadata;\r\n    if (!metadata) {\r\n        throw new Error(`classTransformMetadata not found in form group`);\r\n    }\r\n    if (metadata.classType &&\r\n        !isPrimitiveClass(metadata.classType) &&\r\n        !(value instanceof metadata.classType)) {\r\n        // need for multi types\r\n        if (metadata.withAncestors &&\r\n            metadata.parent?.classType &&\r\n            metadata.propertyName) {\r\n            const isArray = metadata.parent.properties.find((prop) => prop.propertyName === metadata.propertyName)?.isArray || false;\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const parentClassType = metadata.parent.classType;\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const parentObject = {\r\n                [metadata.propertyName]: isArray ? [value] : value,\r\n            };\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            const parentJson = plainToInstance(parentClassType, parentObject, \r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            form.root.dynamicFormBuilderOptions\r\n                .classTransformOptions);\r\n            value = isArray\r\n                ? parentJson[metadata.propertyName][0]\r\n                : parentJson[metadata.propertyName];\r\n        }\r\n        else {\r\n            value = plainToInstance(metadata.classType, value, \r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            form.root.dynamicFormBuilderOptions\r\n                .classTransformOptions);\r\n        }\r\n    }\r\n    metadata.properties.forEach((metadataItem) => {\r\n        if (!metadataItem.ignore) {\r\n            if (metadataItem.propertyName) {\r\n                if (!metadataItem.ignore) {\r\n                    if (!metadataItem.isArray) {\r\n                        const control = form.controls[metadataItem.propertyName];\r\n                        if (!metadataItem.classType ||\r\n                            isPrimitiveClass(metadataItem.classType)) {\r\n                            try {\r\n                                control.patchValue(value !== undefined &&\r\n                                    Object.getOwnPropertyDescriptor(value || {}, metadataItem.propertyName)\r\n                                    ? value[metadataItem.propertyName]\r\n                                    : null, { emitEvent: false });\r\n                            }\r\n                            catch (err) {\r\n                                console.log({ err, metadataItem, form });\r\n                            }\r\n                        }\r\n                        else {\r\n                            try {\r\n                                setValuesForControls(formBuilder, \r\n                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                form.controls[metadataItem.propertyName], value !== undefined\r\n                                    ? value[metadataItem.propertyName]\r\n                                    : {});\r\n                            }\r\n                            catch (err) {\r\n                                console.log({ err, metadataItem, form });\r\n                                throw err;\r\n                            }\r\n                        }\r\n                    }\r\n                    else {\r\n                        const arrayControl = form.controls[metadataItem.propertyName];\r\n                        if (arrayControl?.classTransformMetadata?.isArray &&\r\n                            arrayControl?.controls.length > 0) {\r\n                            let formArrayLength = arrayControl.controls.length;\r\n                            while (formArrayLength !== 0) {\r\n                                arrayControl.removeAt(0);\r\n                                formArrayLength--;\r\n                            }\r\n                        }\r\n                        if (!metadataItem.classType ||\r\n                            isPrimitiveClass(metadataItem.classType)) {\r\n                            try {\r\n                                ((Object.getOwnPropertyDescriptor(value || {}, metadataItem.propertyName)\r\n                                    ? value[metadataItem.propertyName]\r\n                                    : null) || []).forEach((item) => {\r\n                                    if (metadataItem.propertyName) {\r\n                                        arrayControl.push(formBuilder.control(item));\r\n                                    }\r\n                                });\r\n                            }\r\n                            catch (err) {\r\n                                console.log({ err, metadataItem, form });\r\n                            }\r\n                        }\r\n                        else {\r\n                            try {\r\n                                ((Object.getOwnPropertyDescriptor(value || {}, metadataItem.propertyName)\r\n                                    ? value[metadataItem.propertyName]\r\n                                    : null) || [])\r\n                                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                    .forEach((item) => {\r\n                                    // need for multi types\r\n                                    const itemKeys = Object.keys(item);\r\n                                    if (metadataItem.withAncestors) {\r\n                                        metadataItem.properties.forEach((prop) => {\r\n                                            if (prop.propertyName &&\r\n                                                !itemKeys.includes(prop.propertyName)) {\r\n                                                item[prop.propertyName] = null;\r\n                                            }\r\n                                        });\r\n                                    }\r\n                                    if (metadataItem.propertyName) {\r\n                                        const control = createFormControls({\r\n                                            classType: metadataItem.classType,\r\n                                            formBuilder,\r\n                                            metadata: metadataItem,\r\n                                            defaultValue: item,\r\n                                            rootFormGroup: form.root,\r\n                                            dynamicFormBuilderOptions: form.root.dynamicFormBuilderOptions,\r\n                                        });\r\n                                        arrayControl.push(control);\r\n                                    }\r\n                                });\r\n                            }\r\n                            catch (err) {\r\n                                console.log({ err, metadataItem, form });\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    });\r\n}\r\nexport function setValidatorsToControls(formBuilder, form, rootFormGroup) {\r\n    if (!rootFormGroup) {\r\n        rootFormGroup = form.root;\r\n    }\r\n    addCommonAsyncValidatorToRootForm(rootFormGroup);\r\n    const metadata = form.classTransformMetadata;\r\n    if (!metadata) {\r\n        throw new Error('classTransformMetadata not found in form group');\r\n    }\r\n    metadata.properties.forEach((metadataItem) => {\r\n        if (!metadataItem.ignore && metadataItem.propertyName) {\r\n            if (!metadataItem.isArray) {\r\n                if (!metadataItem.classType ||\r\n                    isPrimitiveClass(metadataItem.classType)) {\r\n                    if (!rootFormGroup?.commonAsyncValidator) {\r\n                        throw new Error('commonAsyncValidator not set');\r\n                    }\r\n                    try {\r\n                        if (form.controls[metadataItem.propertyName]) {\r\n                            form.controls[metadataItem.propertyName].classTransformMetadata = metadataItem;\r\n                            if (!form.controls[metadataItem.propertyName].hasAsyncValidator(rootFormGroup.commonAsyncValidator)) {\r\n                                form.controls[metadataItem.propertyName].setAsyncValidators(rootFormGroup.commonAsyncValidator); /*\r\n                                form.controls[\r\n                                  metadataItem.propertyName\r\n                                ].updateValueAndValidity();*/\r\n                            }\r\n                            if (rootFormGroup.dynamicFormBuilderOptions.angularValidators) {\r\n                                const { angularFormValidatorPath } = findControlPaths(form.controls[metadataItem.propertyName]);\r\n                                const angularValidators = lodashGet(rootFormGroup.dynamicFormBuilderOptions.angularValidators, angularFormValidatorPath\r\n                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                );\r\n                                if (angularValidators) {\r\n                                    let asyncValidators = [];\r\n                                    if (angularValidators.asyncValidators) {\r\n                                        asyncValidators = angularValidators.asyncValidators;\r\n                                        if (typeof asyncValidators === 'function') {\r\n                                            asyncValidators = [asyncValidators];\r\n                                        }\r\n                                    }\r\n                                    let validators = angularValidators?.validators || angularValidators;\r\n                                    if (typeof validators === 'function') {\r\n                                        validators = [validators];\r\n                                    }\r\n                                    form.controls[metadataItem.propertyName].setAsyncValidators([\r\n                                        ...asyncValidators,\r\n                                        ...validators\r\n                                            .filter(Boolean)\r\n                                            .map((validator) => (control) => Promise.resolve(validator(control))),\r\n                                        rootFormGroup.commonAsyncValidator,\r\n                                    ]); /*\r\n                                    form.controls[\r\n                                      metadataItem.propertyName\r\n                                    ].updateValueAndValidity();*/\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (err) {\r\n                        console.log({ err, metadataItem, form });\r\n                    }\r\n                }\r\n                else {\r\n                    try {\r\n                        setValidatorsToControls(formBuilder, form.controls[metadataItem.propertyName], rootFormGroup);\r\n                    }\r\n                    catch (err) {\r\n                        console.log({ err, metadataItem, form });\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                if (!metadataItem.classType ||\r\n                    isPrimitiveClass(metadataItem.classType)) {\r\n                    if (!rootFormGroup?.commonAsyncValidator) {\r\n                        throw new Error('commonAsyncValidator not set');\r\n                    }\r\n                    try {\r\n                        const controls = form.controls[metadataItem.propertyName].controls;\r\n                        (!Array.isArray(controls) && metadataItem.isArray\r\n                            ? []\r\n                            : controls).forEach((control, propertyIndex) => {\r\n                            control.classTransformMetadata = {\r\n                                ...metadataItem,\r\n                                propertyIndex,\r\n                                isArray: false,\r\n                            };\r\n                            if (!rootFormGroup) {\r\n                                throw Error('rootFormGroup not set');\r\n                            }\r\n                            if (!control.hasAsyncValidator(rootFormGroup.commonAsyncValidator)) {\r\n                                control.setAsyncValidators(rootFormGroup.commonAsyncValidator);\r\n                                /* control.updateValueAndValidity(); */\r\n                            }\r\n                        });\r\n                        if (!rootFormGroup) {\r\n                            throw Error('rootFormGroup not set');\r\n                        }\r\n                        if (!form.controls[metadataItem.propertyName].hasAsyncValidator(rootFormGroup.commonAsyncValidator)) {\r\n                            form.controls[metadataItem.propertyName].setAsyncValidators(rootFormGroup.commonAsyncValidator);\r\n                            /* (\r\n                              form.controls[metadataItem.propertyName] as DynamicFormArray\r\n                            ).updateValueAndValidity(); */\r\n                        }\r\n                    }\r\n                    catch (err) {\r\n                        console.log({ err, metadataItem, form });\r\n                    }\r\n                }\r\n                else {\r\n                    try {\r\n                        const controls = form.controls[metadataItem.propertyName].controls;\r\n                        (!Array.isArray(controls) && metadataItem.isArray\r\n                            ? []\r\n                            : controls).forEach((control, propertyIndex) => {\r\n                            control.classTransformMetadata = {\r\n                                ...metadataItem,\r\n                                propertyIndex,\r\n                                isArray: false,\r\n                            };\r\n                            const controlValue = control.value || {};\r\n                            // needed for extend controls if it does not exists, but the value has property with that name\r\n                            if (metadataItem.classType &&\r\n                                !isPrimitiveType(metadataItem.classType) &&\r\n                                metadataItem.properties.length >\r\n                                    Object.keys(controlValue).length) {\r\n                                metadataItem.properties.forEach((prop) => {\r\n                                    if (prop.propertyName &&\r\n                                        !Object.getOwnPropertyDescriptor(controlValue, prop.propertyName)) {\r\n                                        if (prop.classType && !isPrimitiveType(prop.classType)) {\r\n                                            controlValue[prop.propertyName] = {};\r\n                                            if (\r\n                                            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                            !control.controls[prop.propertyName]) {\r\n                                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                                control.addControl(prop.propertyName, formBuilder.group(controlValue[prop.propertyName]));\r\n                                            }\r\n                                        }\r\n                                        else {\r\n                                            if (prop.isArray) {\r\n                                                controlValue[prop.propertyName] = [];\r\n                                                if (\r\n                                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                                !control.controls[prop.propertyName]) {\r\n                                                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                                    control.addControl(prop.propertyName, formBuilder.array(controlValue[prop.propertyName]));\r\n                                                }\r\n                                            }\r\n                                            else {\r\n                                                controlValue[prop.propertyName] = null;\r\n                                                if (\r\n                                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                                !control.controls[prop.propertyName]) {\r\n                                                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                                    control.addControl(prop.propertyName, formBuilder.control(controlValue[prop.propertyName]));\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                });\r\n                                setValuesForControls(formBuilder, \r\n                                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                                control, controlValue);\r\n                            }\r\n                            setValidatorsToControls(formBuilder, control, rootFormGroup);\r\n                            if (!rootFormGroup) {\r\n                                throw Error('rootFormGroup not set');\r\n                            }\r\n                            if (!control.hasAsyncValidator(rootFormGroup.commonAsyncValidator)) {\r\n                                control.setAsyncValidators(rootFormGroup.commonAsyncValidator);\r\n                                /* control.updateValueAndValidity(); */\r\n                            }\r\n                        });\r\n                        if (!rootFormGroup) {\r\n                            throw Error('rootFormGroup not set');\r\n                        }\r\n                        if (!form.controls[metadataItem.propertyName].hasAsyncValidator(rootFormGroup.commonAsyncValidator)) {\r\n                            form.controls[metadataItem.propertyName].setAsyncValidators(rootFormGroup.commonAsyncValidator);\r\n                            /* (\r\n                              form.controls[metadataItem.propertyName] as DynamicFormArray\r\n                            ).updateValueAndValidity(); */\r\n                        }\r\n                    }\r\n                    catch (err) {\r\n                        console.log({ err, metadataItem, form });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    });\r\n}\r\nexport function validateAllFormFields(form) {\r\n    let control;\r\n    let formArrayControlsLength;\r\n    Object.keys(form.controls).forEach((field) => {\r\n        control = form.get(field);\r\n        // Control\r\n        if (control instanceof UntypedFormControl) {\r\n            control.markAsTouched({ onlySelf: true });\r\n        }\r\n        // Group: recursive\r\n        else if (control instanceof UntypedFormGroup) {\r\n            validateAllFormFields(control);\r\n        }\r\n        // Array\r\n        else if (control instanceof UntypedFormArray) {\r\n            formArrayControlsLength = control.controls.length;\r\n            for (let i = 0; i < formArrayControlsLength; i++) {\r\n                // Control in Array\r\n                if (control.controls[i] instanceof UntypedFormControl) {\r\n                    control.controls[i].markAsTouched({\r\n                        onlySelf: true,\r\n                    });\r\n                }\r\n                // Group in Array: recursive\r\n                if (control.controls[i] instanceof UntypedFormGroup) {\r\n                    validateAllFormFields(control.controls[i]);\r\n                }\r\n            }\r\n        }\r\n    });\r\n}\r\n// custom: getMetadata args have been changed. Before optional parameters, these were added:\r\n// dynamicFormBuilderOptions\r\n// currentDepth\r\n// propertyPath\r\nfunction getMetadata(classType, dynamicFormBuilderOptions, currentDepth, currentPath, classTransformOptions, isRoot) {\r\n    const classTransformerMetadataStorage = \r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    getGlobal()['classTransformerMetadataStorage'] || undefined;\r\n    if (!classTransformerMetadataStorage) {\r\n        throw new Error('classTransformerMetadataStorage not set in windows, please use the \"class-transformer-global-storage\" instead of \"class-transformer\"');\r\n    }\r\n    const classValidatorMetadataStorage = \r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    getGlobal()['classValidatorMetadataStorage'] || undefined;\r\n    // (window as any)['classValidatorMetadataStorage'] || undefined;\r\n    if (!classValidatorMetadataStorage) {\r\n        throw new Error('classValidatorMetadataStorage not set in windows');\r\n    }\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    let exposeProperties = [];\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    let excludeProperties = [];\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    let prevMultiTypes = [];\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    let multiTypes = null;\r\n    // need for create all link for multi types\r\n    if (isRoot) {\r\n        while (!prevMultiTypes ||\r\n            !multiTypes ||\r\n            prevMultiTypes.length !== multiTypes.length) {\r\n            prevMultiTypes = multiTypes;\r\n            plainToInstance(classType, {}, classTransformOptions);\r\n            multiTypes = Array.from(classTransformerMetadataStorage._typeMetadatas)\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map((meta) => Array.from(meta[1])\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .filter((sub) => {\r\n                return sub[1].options.discriminator;\r\n            })\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map((sub) => {\r\n                return { ...sub[1], ...sub[1].options.discriminator };\r\n            }))\r\n                .filter((arr) => arr.length > 0)\r\n                .map((arr) => arr.map((item) => ({\r\n                classType: item.target,\r\n                propertyName: item.propertyName,\r\n                types: item.subTypes,\r\n                property: item.property,\r\n            })))\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .reduce((all, cur) => [...all, ...cur], []);\r\n            (multiTypes || []).forEach((multiType) => multiType.types.forEach((type) => plainToInstance(multiType.classType, { [multiType.propertyName]: { [multiType.property]: type.name } }, classTransformOptions)));\r\n            exposeProperties =\r\n                classTransformerMetadataStorage.getExposedMetadatas(classType);\r\n        }\r\n        prevMultiTypes = [];\r\n        multiTypes = null;\r\n        // need for create all link for multi types\r\n        while (!prevMultiTypes ||\r\n            !multiTypes ||\r\n            prevMultiTypes.length !== multiTypes.length) {\r\n            prevMultiTypes = multiTypes;\r\n            plainToInstance(classType, {}, classTransformOptions);\r\n            multiTypes = Array.from(classTransformerMetadataStorage._excludeMetadatas)\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map((meta) => Array.from(meta[1])\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .filter((sub) => {\r\n                return sub[1].options.discriminator;\r\n            })\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .map((sub) => ({ ...sub[1], ...sub[1].options.discriminator })))\r\n                .filter((arr) => arr.length > 0)\r\n                .map((arr) => arr.map((item) => ({\r\n                classType: item.target,\r\n                propertyName: item.propertyName,\r\n                types: item.subTypes,\r\n                property: item.property,\r\n            })))\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                .reduce((all, cur) => [...all, ...cur], []);\r\n            (multiTypes || []).forEach((multiType) => multiType.types.forEach((type) => plainToInstance(multiType.classType, { [multiType.propertyName]: { [multiType.property]: type.name } }, classTransformOptions)));\r\n            excludeProperties =\r\n                classTransformerMetadataStorage.getExcludedMetadatas(classType);\r\n        }\r\n    }\r\n    else {\r\n        exposeProperties =\r\n            classTransformerMetadataStorage.getExposedMetadatas(classType);\r\n        excludeProperties =\r\n            classTransformerMetadataStorage.getExcludedMetadatas(classType);\r\n    }\r\n    // need for support ancestors multiple types of form group\r\n    const ancestorsProperties = [\r\n        Array.from(classTransformerMetadataStorage._ancestorsMap)\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            .filter((item) => item[1][0] === classType)\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            .map((item) => classTransformerMetadataStorage.getExposedMetadatas(item[0]))\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            .reduce((all, cur) => [...all, ...cur], []),\r\n    ];\r\n    const properties = [\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        ...exposeProperties,\r\n        ...excludeProperties,\r\n        ...(ancestorsProperties.length > 0 ? ancestorsProperties[0] : []),\r\n    ].filter(\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    (existsLimit, existsIndex, items) => {\r\n        return ((classTransformOptions?.excludeGroups\r\n            ? !classTransformOptions?.excludeGroups.find((excludeGroup) => existsLimit?.options?.groups?.includes(excludeGroup))\r\n            : true) &&\r\n            existsIndex ===\r\n                items.findIndex(\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                (it) => it.propertyName === existsLimit.propertyName));\r\n    });\r\n    const depthLimitExceeded = currentDepth >= dynamicFormBuilderOptions.maxNestedModelDepth;\r\n    properties.forEach((exposeMetadataItem, index) => {\r\n        const propertyMetadata = classTransformerMetadataStorage.findTypeMetadata(exposeMetadataItem.target, exposeMetadataItem.propertyName);\r\n        // custom: getMetadata args have been changed. Before optional parameters, these were added:\r\n        // dynamicFormBuilderOptions\r\n        // currentDepth\r\n        // propertyPath\r\n        // old implementation:\r\n        /*\r\n        if (propertyMetadata) {\r\n          properties[index] = {\r\n            ...getMetadata(\r\n              propertyMetadata.typeFunction(),\r\n              classTransformOptions,\r\n              false\r\n            ),\r\n            isArray: Array === propertyMetadata.reflectedType,\r\n            propertyName: exposeMetadataItem.propertyName,\r\n          }\r\n        };\r\n        */\r\n        if (propertyMetadata) {\r\n            // custom: skip if depthLimitExceeded\r\n            if (depthLimitExceeded) {\r\n                console.warn('ngx-dynamic-form-builder has hit depth limit!', propertyMetadata);\r\n                delete properties[index];\r\n            }\r\n            else {\r\n                const propertyPath = [...currentPath, exposeMetadataItem.propertyName];\r\n                const assignProperty = () => {\r\n                    properties[index] = {\r\n                        ...getMetadata(propertyMetadata.typeFunction(), dynamicFormBuilderOptions, currentDepth + 1, propertyPath, undefined, currentDepth === 0),\r\n                        isArray: Array === propertyMetadata.reflectedType,\r\n                        propertyName: exposeMetadataItem.propertyName,\r\n                    };\r\n                };\r\n                // custom: this is new logic. Instead of assigning all, \r\n                // metadata will be filtered out if allowedNestedModels are defined and do not include this prop.\r\n                if (!Array.isArray(dynamicFormBuilderOptions.allowedNestedModels)) {\r\n                    assignProperty();\r\n                }\r\n                else {\r\n                    if (dynamicFormBuilderOptions.allowedNestedModels.includes(propertyPath.join('.'))) {\r\n                        assignProperty();\r\n                    }\r\n                    else {\r\n                        delete properties[index];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            properties[index] = {\r\n                classType: null,\r\n                properties: [],\r\n                isArray: false,\r\n                propertyName: exposeMetadataItem.propertyName,\r\n            };\r\n        }\r\n    });\r\n    const metadata = {\r\n        classType,\r\n        properties: properties.filter(prop => typeof prop !== 'undefined'),\r\n        withAncestors: (ancestorsProperties?.length > 0 ? ancestorsProperties[0] : []).length >\r\n            0,\r\n        isArray: false,\r\n        propertyName: null,\r\n    };\r\n    return metadata;\r\n}\r\nfunction setupClassTransformMetadata({ defaultMetadata, classType, dynamicForm, dynamicFormBuilderOptions, }) {\r\n    if (!defaultMetadata && classType) {\r\n        dynamicForm.classTransformMetadata = getMetadata(classType, dynamicForm.dynamicFormBuilderOptions, 0, [], dynamicFormBuilderOptions.classTransformOptions, true);\r\n    }\r\n    else {\r\n        dynamicForm.classTransformMetadata =\r\n            defaultMetadata;\r\n    }\r\n    if (!dynamicForm.classTransformMetadata) {\r\n        throw new Error('metadata not set');\r\n    }\r\n}\r\nfunction setupDynamicFormBuilderOptions({ dynamicForm, dynamicFormBuilderOptions, }) {\r\n    if (!dynamicForm) {\r\n        throw new Error('dynamicForm not set');\r\n    }\r\n    if (!dynamicForm.dynamicFormBuilderOptions) {\r\n        dynamicForm.dynamicFormBuilderOptions = dynamicFormBuilderOptions || {};\r\n    }\r\n    dynamicForm.dynamicFormBuilderOptions.classValidatorOptions = {\r\n        ...(dynamicForm.dynamicFormBuilderOptions.classValidatorOptions || {}),\r\n    };\r\n    dynamicForm.dynamicFormBuilderOptions.classTransformOptions = {\r\n        ...DEFAULT_CLASS_TRANSFORM_OPTIONS,\r\n        ...(dynamicForm.dynamicFormBuilderOptions.classTransformOptions || {}),\r\n    };\r\n    dynamicForm.dynamicFormBuilderOptions.classTransformToPlainOptions = {\r\n        ...(dynamicForm.dynamicFormBuilderOptions.classTransformToPlainOptions ||\r\n            {}),\r\n    };\r\n    dynamicForm.dynamicFormBuilderOptions.maxNestedModelDepth =\r\n        (typeof dynamicForm.dynamicFormBuilderOptions.maxNestedModelDepth === 'number' ?\r\n            dynamicForm.dynamicFormBuilderOptions.maxNestedModelDepth : 5);\r\n    // dynamicFormBuilderOptions.allowedNestedModels defaults to undefined\r\n}\r\nfunction createAllFormGroupChildrenControls({ dynamicForm, defaultValue, formBuilder, rootFormGroup, dynamicFormBuilderOptions, }) {\r\n    dynamicForm.classTransformMetadata.properties.forEach((metadataItem, index) => {\r\n        dynamicForm.classTransformMetadata.properties[index].ignore = true;\r\n        if (metadataItem.propertyName) {\r\n            if (Object.keys(defaultValue || {}).length === 0 ||\r\n                Object.getOwnPropertyDescriptor(defaultValue || {}, metadataItem.propertyName) ||\r\n                metadataItem.isArray) {\r\n                if (!metadataItem.isArray) {\r\n                    if (!metadataItem.classType ||\r\n                        isPrimitiveClass(metadataItem.classType)) {\r\n                        addDynamicPrimitiveObjectAsFormGroup({\r\n                            defaultValue,\r\n                            metadataItem,\r\n                            formBuilder,\r\n                            dynamicForm,\r\n                            index,\r\n                        });\r\n                    }\r\n                    else {\r\n                        addDynamicTypedObjectAsFormGroup({\r\n                            defaultValue,\r\n                            metadataItem,\r\n                            formBuilder,\r\n                            rootFormGroup,\r\n                            dynamicFormBuilderOptions,\r\n                            dynamicForm,\r\n                            index,\r\n                        });\r\n                    }\r\n                }\r\n                else {\r\n                    if (!metadataItem.classType ||\r\n                        isPrimitiveClass(metadataItem.classType)) {\r\n                        addDynamicPrimitiveObjectAsFormArray({\r\n                            defaultValue,\r\n                            metadataItem,\r\n                            formBuilder,\r\n                            dynamicForm,\r\n                            index,\r\n                        });\r\n                    }\r\n                    else {\r\n                        addDynamicTypedObjectAsFormArray({\r\n                            defaultValue,\r\n                            metadataItem,\r\n                            formBuilder,\r\n                            rootFormGroup,\r\n                            dynamicFormBuilderOptions,\r\n                            dynamicForm,\r\n                            index,\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    });\r\n}\r\nfunction addDynamicTypedObjectAsFormArray({ defaultValue, metadataItem, formBuilder, rootFormGroup, dynamicFormBuilderOptions, dynamicForm, index, }) {\r\n    if (!metadataItem.propertyName) {\r\n        throw new Error('propertyName not set');\r\n    }\r\n    const defaultArray = defaultValue[metadataItem.propertyName];\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const value = defaultArray && defaultArray.length > 0 ? defaultArray : [];\r\n    const control = formBuilder.array([]);\r\n    value.forEach((item) => {\r\n        const form = formBuilder.group(item);\r\n        form.setParent(control);\r\n        control.push(createFormControls({\r\n            classType: metadataItem.classType,\r\n            formBuilder,\r\n            form,\r\n            rootFormGroup,\r\n            metadata: metadataItem,\r\n            defaultValue: item,\r\n            dynamicFormBuilderOptions,\r\n        }));\r\n    });\r\n    dynamicForm.addControl(metadataItem.propertyName, control);\r\n    control.classTransformMetadata = metadataItem;\r\n    control.classTransformMetadata.parent = dynamicForm.classTransformMetadata;\r\n    dynamicForm.classTransformMetadata.properties[index].ignore = false;\r\n}\r\nfunction addDynamicPrimitiveObjectAsFormArray({ defaultValue, metadataItem, formBuilder, dynamicForm, index, }) {\r\n    if (!metadataItem.propertyName) {\r\n        throw new Error('propertyName not set');\r\n    }\r\n    const defaultArray = defaultValue[metadataItem.propertyName];\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const value = defaultArray && defaultArray.length > 0 ? defaultArray : [];\r\n    const control = formBuilder.array(value);\r\n    // todo: incorrect work with addControl\r\n    dynamicForm.setControl(metadataItem.propertyName, control);\r\n    control.classTransformMetadata = metadataItem;\r\n    control.classTransformMetadata.parent = dynamicForm.classTransformMetadata;\r\n    dynamicForm.classTransformMetadata.properties[index].ignore = false;\r\n}\r\nfunction addDynamicTypedObjectAsFormGroup({ defaultValue, metadataItem, formBuilder, rootFormGroup, dynamicFormBuilderOptions, dynamicForm, index, }) {\r\n    if (!metadataItem.propertyName) {\r\n        throw new Error('propertyName not set');\r\n    }\r\n    const value = defaultValue[metadataItem.propertyName] ||\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        metadataItem.properties.reduce((all, cur) => {\r\n            if (cur.propertyName) {\r\n                if (cur.isArray) {\r\n                    all[cur.propertyName] = [];\r\n                }\r\n                else {\r\n                    if (!cur.classType || isPrimitiveClass(cur.classType)) {\r\n                        all[cur.propertyName] = null;\r\n                    }\r\n                    else {\r\n                        all[cur.propertyName] = {};\r\n                    }\r\n                }\r\n            }\r\n            return all;\r\n        }, {});\r\n    const form = formBuilder.group({});\r\n    form.setParent(rootFormGroup);\r\n    const control = createFormControls({\r\n        classType: metadataItem.classType,\r\n        formBuilder,\r\n        form,\r\n        rootFormGroup,\r\n        metadata: metadataItem,\r\n        defaultValue: value,\r\n        dynamicFormBuilderOptions,\r\n    });\r\n    dynamicForm.addControl(metadataItem.propertyName, control);\r\n    control.classTransformMetadata = metadataItem;\r\n    control.classTransformMetadata.parent = dynamicForm.classTransformMetadata;\r\n    dynamicForm.classTransformMetadata.properties[index].ignore = false;\r\n}\r\nfunction addDynamicPrimitiveObjectAsFormGroup({ defaultValue, metadataItem, formBuilder, dynamicForm, index, }) {\r\n    if (!metadataItem.propertyName) {\r\n        throw new Error('propertyName not set');\r\n    }\r\n    const value = Object.getOwnPropertyDescriptor(defaultValue, metadataItem.propertyName)\r\n        ? defaultValue[metadataItem.propertyName]\r\n        : undefined;\r\n    const control = formBuilder.control(value);\r\n    dynamicForm.addControl(metadataItem.propertyName, control);\r\n    control.classTransformMetadata = metadataItem;\r\n    control.classTransformMetadata.parent = dynamicForm.classTransformMetadata;\r\n    dynamicForm.classTransformMetadata.properties[index].ignore = false;\r\n}\r\nfunction addDynamicMethodsToRootFormGroup({ dynamicForm, rootFormGroup, formBuilder, }) {\r\n    dynamicForm.externalErrorsSubject = new BehaviorSubject({});\r\n    dynamicForm.patchDynamicFormBuilderOptions = (dynamicFormBuilderOptions) => {\r\n        if (!dynamicForm) {\r\n            throw new Error('rootFormGroup not set');\r\n        }\r\n        dynamicForm.dynamicFormBuilderOptions = {\r\n            ...dynamicForm.dynamicFormBuilderOptions,\r\n            ...dynamicFormBuilderOptions,\r\n        };\r\n        setValidatorsToControls(formBuilder, dynamicForm);\r\n        dynamicForm.patchValue(dynamicForm.value, { emitEvent: false });\r\n    };\r\n    dynamicForm.getObject = () => {\r\n        if (!dynamicForm.classTransformMetadata.classType) {\r\n            throw new Error('classType not set');\r\n        }\r\n        return plainToInstance(dynamicForm.classTransformMetadata.classType, {\r\n            ...dynamicForm.value,\r\n        }, dynamicForm.dynamicFormBuilderOptions.classTransformOptions);\r\n    };\r\n    dynamicForm.setObject = (object) => {\r\n        setValuesForControls(formBuilder, \r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        dynamicForm, instanceToPlain(object, dynamicForm.dynamicFormBuilderOptions.classTransformToPlainOptions));\r\n        setValidatorsToControls(formBuilder, dynamicForm, rootFormGroup);\r\n    };\r\n    dynamicForm.refresh = () => {\r\n        setValidatorsToControls(formBuilder, dynamicForm, rootFormGroup);\r\n        dynamicForm.patchValue(dynamicForm.value);\r\n    };\r\n    dynamicForm.getJSON = () => {\r\n        return recursiveRemoveDynamicControlOptions(cloneDeep(dynamicForm.value));\r\n    };\r\n    dynamicForm.setJSON = (value, options) => {\r\n        setValuesForControls(formBuilder, dynamicForm, value);\r\n        setValidatorsToControls(formBuilder, dynamicForm, rootFormGroup);\r\n        dynamicForm.patchValue(dynamicForm.value, options);\r\n    };\r\n    dynamicForm.setExternalErrors = (externalErrors) => {\r\n        dynamicForm.externalErrorsSubject.next(recursiveRemoveDynamicControlOptions(cloneDeep(externalErrors)));\r\n        dynamicForm.patchValue(dynamicForm.value, { emitEvent: false });\r\n    };\r\n    dynamicForm.getExternalErrors = () => {\r\n        return recursiveRemoveDynamicControlOptions(cloneDeep(dynamicForm.externalErrorsSubject.value));\r\n    };\r\n    const dynamicFormProxy = new Proxy(dynamicForm, {\r\n        get(target, prop) {\r\n            if (prop === 'object') {\r\n                return target.getObject();\r\n            }\r\n            if (prop === 'json') {\r\n                return target.getJSON();\r\n            }\r\n            if (prop === 'externalErrors') {\r\n                return target.getExternalErrors();\r\n            }\r\n            return target[prop];\r\n        },\r\n        set(target, prop, \r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        value) {\r\n            if (prop === 'object') {\r\n                target.setObject(value);\r\n                return true;\r\n            }\r\n            if (prop === 'json') {\r\n                target.setJSON(value);\r\n                return true;\r\n            }\r\n            if (prop === 'externalErrors') {\r\n                target.setExternalErrors(value);\r\n                return true;\r\n            }\r\n            Object.defineProperty(target, prop, {\r\n                value,\r\n                configurable: true,\r\n            });\r\n            return true;\r\n        },\r\n    });\r\n    dynamicFormProxy.patchValue(dynamicFormProxy.value, { emitEvent: false });\r\n    setValidatorsToControls(formBuilder, dynamicFormProxy, rootFormGroup);\r\n    return dynamicFormProxy;\r\n}\r\nfunction addDynamicMethodsToFormGroup(dynamicForm) {\r\n    dynamicForm.getClassValidatorErrors = (control, nullIfEmpty) => {\r\n        const dynamicControl = control;\r\n        if (!dynamicControl?.classValidatorErrorsSubject) {\r\n            return of(null);\r\n        }\r\n        return dynamicControl.classValidatorErrorsSubject.pipe(map((errors) => {\r\n            if (dynamicControl?.classTransformMetadata?.propertyName &&\r\n                Object.getOwnPropertyDescriptor(errors, dynamicControl?.classTransformMetadata?.propertyName)) {\r\n                return errors[dynamicControl?.classTransformMetadata?.propertyName]\r\n                    ?.messages?.length === 0 && nullIfEmpty\r\n                    ? null\r\n                    : errors[dynamicControl?.classTransformMetadata?.propertyName];\r\n            }\r\n            return null;\r\n        }));\r\n    };\r\n}\r\nfunction addCommonAsyncValidatorToRootForm(rootFormGroup) {\r\n    if (!rootFormGroup.commonAsyncValidator) {\r\n        rootFormGroup.commonAsyncValidatorSubject = new ReplaySubject();\r\n        rootFormGroup.commonAsyncValidator = (control) => {\r\n            const metadata = control\r\n                ?.classTransformMetadata;\r\n            if (!metadata) {\r\n                throw new Error('classTransformMetadata not found in form group');\r\n            }\r\n            const rootValue = rootFormGroup ? rootFormGroup.value : null;\r\n            const { inputPath, errorsPath, controlPath } = findControlPaths(control);\r\n            const object = setDynamicControlValue(rootFormGroup, rootValue, controlPath, control, metadata);\r\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n            setDynamicControlOptions(object, {\r\n                rootValue,\r\n                controlPath,\r\n                control,\r\n                metadata,\r\n            });\r\n            const localClassValidatorOptions = cloneDeep(rootFormGroup.dynamicFormBuilderOptions.classValidatorOptions);\r\n            const globalClassValidatorOptions = cloneDeep(getGlobalDynamicFormBuilderOptions().classValidatorOptions);\r\n            const classValidatorOptions = mergeWith(globalClassValidatorOptions, localClassValidatorOptions);\r\n            return (rootFormGroup.commonAsyncValidatorFirstChanged\r\n                ? from(validate(object, classValidatorOptions))\r\n                : of(validateSync(object, classValidatorOptions))).pipe(debounceTime(700), map((rootClassValidatorErrors) => {\r\n                setRootFormGroupClassValidatorErrors(rootFormGroup, rootClassValidatorErrors);\r\n                const dynamicFormControl = setFormControlClassValidatorErrors(control, rootFormGroup, errorsPath, inputPath);\r\n                return Object.keys(dynamicFormControl.classValidatorErrors || {})\r\n                    .length > 0\r\n                    ? dynamicFormControl.classValidatorErrors\r\n                    : null;\r\n            }));\r\n        };\r\n    }\r\n}\r\nfunction setDynamicControlValue(rootFormGroup, \r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nrootValue, controlPath, control, metadata) {\r\n    if (!rootFormGroup) {\r\n        throw Error('rootFormGroup not set');\r\n    }\r\n    if (!rootFormGroup.classTransformMetadata.classType) {\r\n        throw Error('classType not set');\r\n    }\r\n    // need for resize arrays\r\n    lodashSet(rootValue, controlPath, control.value);\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    const object = plainToInstance(rootFormGroup.classTransformMetadata.classType, rootValue, rootFormGroup.dynamicFormBuilderOptions.classTransformOptions);\r\n    // set original values of inputs\r\n    if (metadata.isArray &&\r\n        (!metadata.classType || isPrimitiveClass(metadata.classType))) {\r\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n        control.value.forEach((item, index) => {\r\n            lodashSet(object, `${controlPath}.${index}`, control.value[index]);\r\n        });\r\n    }\r\n    // need for correct work ValidateIfUpdater\r\n    if (metadata.parent?.classType && metadata.propertyIndex === undefined) {\r\n        replaceLastPropertyToDynamicControlOptionsByDotPath(controlPath, object, rootValue, control, metadata);\r\n    }\r\n    return object;\r\n}\r\nfunction findControlPaths(control) {\r\n    const angularFormValidatorPath = [];\r\n    const inputPath = [];\r\n    const errorsPath = [];\r\n    let ctrl = control;\r\n    while (ctrl) {\r\n        const key = ctrl.classTransformMetadata?.propertyIndex?.toString() ||\r\n            ctrl.classTransformMetadata?.propertyName ||\r\n            null;\r\n        const parent = ctrl.parent;\r\n        if (key !== null) {\r\n            inputPath.push(key);\r\n            errorsPath.push(key);\r\n            if (parent?.parent) {\r\n                errorsPath.push('children');\r\n            }\r\n            if (!parent?.classTransformMetadata?.isArray) {\r\n                angularFormValidatorPath.push(key);\r\n            }\r\n        }\r\n        ctrl = parent;\r\n    }\r\n    const controlPath = inputPath.reverse().join('.');\r\n    return {\r\n        inputPath,\r\n        errorsPath,\r\n        controlPath,\r\n        angularFormValidatorPath: angularFormValidatorPath.reverse().join('.'),\r\n    };\r\n}\r\nfunction setFormControlClassValidatorErrors(control, rootFormGroup, errorsPath, inputPath) {\r\n    const dynamicFormControl = control;\r\n    const propErrors = lodashGet(rootFormGroup.classValidatorErrors, errorsPath.reverse());\r\n    dynamicFormControl.classValidatorErrors =\r\n        Object.keys(propErrors || {}).length > 0\r\n            ? {\r\n                [inputPath.reverse()[0]]: propErrors || {},\r\n            }\r\n            : {};\r\n    if (!dynamicFormControl.classValidatorErrorsSubject) {\r\n        dynamicFormControl.classValidatorErrors = {};\r\n        dynamicFormControl.classValidatorErrorsSubject =\r\n            new BehaviorSubject({});\r\n    }\r\n    dynamicFormControl.classValidatorErrorsSubject.next(dynamicFormControl.classValidatorErrors);\r\n    if (!dynamicFormControl.customValidateErrors) {\r\n        dynamicFormControl.customValidateErrors =\r\n            new BehaviorSubject({});\r\n    }\r\n    dynamicFormControl.customValidateErrors.next(transformClassValidatorErrorsToShortValidationErrors(dynamicFormControl.classValidatorErrors));\r\n    return dynamicFormControl;\r\n}\r\nfunction setRootFormGroupClassValidatorErrors(rootFormGroup, rootClassValidatorErrors) {\r\n    if (!rootFormGroup) {\r\n        throw new Error('rootFormGroup not set');\r\n    }\r\n    rootFormGroup.classValidatorErrors =\r\n        mergeErrors(rootFormGroup.externalErrorsSubject?.value || {}, transformValidationErrorsToClassValidatorErrors(rootClassValidatorErrors) || {}) || {};\r\n    if (!rootFormGroup.classValidatorErrorsSubject) {\r\n        rootFormGroup.classValidatorErrors = {};\r\n        rootFormGroup.classValidatorErrorsSubject =\r\n            new BehaviorSubject({});\r\n    }\r\n    rootFormGroup.classValidatorErrorsSubject.next(rootFormGroup.classValidatorErrors);\r\n    if (!rootFormGroup.customValidateErrors) {\r\n        rootFormGroup.customValidateErrors =\r\n            new BehaviorSubject({});\r\n    }\r\n    rootFormGroup.customValidateErrors.next(mergeErrors(collectDynamicFormGroupErrors(rootFormGroup), transformClassValidatorErrorsToShortValidationErrors(rootFormGroup.classValidatorErrors)));\r\n}\r\nfunction subscribeToRootFormGroupValueChanges(rootFormGroup) {\r\n    if (!rootFormGroup.commonAsyncValidatorFirstChangedSubscription) {\r\n        rootFormGroup.commonAsyncValidatorFirstChangedSubscription =\r\n            rootFormGroup?.valueChanges\r\n                .pipe(tap(() => {\r\n                if (!rootFormGroup) {\r\n                    throw Error('rootFormGroup not set');\r\n                }\r\n                rootFormGroup.commonAsyncValidatorFirstChanged = true;\r\n            }), delay(100), tap(() => {\r\n                if (!rootFormGroup) {\r\n                    throw Error('rootFormGroup not set');\r\n                }\r\n                rootFormGroup.customValidateErrors.next(mergeErrors(collectDynamicFormGroupErrors(rootFormGroup), transformClassValidatorErrorsToShortValidationErrors(rootFormGroup.classValidatorErrors)));\r\n            }), catchError((err) => {\r\n                console.log({ err, rootFormGroup });\r\n                return of(null);\r\n            }))\r\n                .subscribe();\r\n    }\r\n}\r\nfunction subscribeToGlobalDynamicFormBuilderOptionsChange(formBuilder, rootFormGroup) {\r\n    if (!rootFormGroup.globalDynamicFormBuilderOptionsChangedSubscription) {\r\n        rootFormGroup.globalDynamicFormBuilderOptionsChangedSubscription =\r\n            getGlobalDynamicFormBuilderOptionsSubject()\r\n                .pipe(tap(() => {\r\n                setValidatorsToControls(formBuilder, rootFormGroup);\r\n                rootFormGroup.patchValue(rootFormGroup.value, { emitEvent: false });\r\n            }), catchError((err) => {\r\n                console.log({ err, rootFormGroup });\r\n                return of(null);\r\n            }))\r\n                .subscribe();\r\n    }\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9saWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUVoQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBR2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUVMLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLFFBQVEsRUFDUixZQUFZLEdBRWIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxTQUFTLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWF4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGtDQUFrQyxFQUNsQyx5Q0FBeUMsR0FDMUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLG9DQUFvQyxFQUNwQyxtREFBbUQsRUFDbkQsd0JBQXdCLEVBQ3hCLG9EQUFvRCxFQUNwRCwrQ0FBK0MsR0FDaEQsTUFBTSxlQUFlLENBQUM7QUFFdkIsTUFBTSxVQUFVLGtCQUFrQixDQUE4QixFQUM5RCxTQUFTLEVBQ1QsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBQ2IsUUFBUSxFQUNSLFlBQVksRUFDWix5QkFBeUIsR0FVMUI7SUFDQyxNQUFNLE1BQU0sR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUU5QixJQUFJLFdBQVcsR0FBRyxJQUEyQixDQUFDO0lBRTlDLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDaEIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUF3QixDQUFDO0tBQzVEO0lBRUQsSUFBSSxNQUFNLEVBQUU7UUFDVixhQUFhLEdBQUcsV0FBVyxDQUFDO1FBQzVCLDhCQUE4QixDQUFJO1lBQ2hDLFdBQVc7WUFDWCx5QkFBeUI7U0FDMUIsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLHlCQUF5QixJQUFJLGFBQWEsRUFBRSx5QkFBeUIsRUFBRTtRQUN6RSwyQkFBMkIsQ0FBSTtZQUM3QixTQUFTO1lBQ1QsV0FBVztZQUNYLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLHlCQUF5QjtZQUN2QixvRUFBb0U7WUFDcEUseUJBQXlCLElBQUksYUFBYyxDQUFDLHlCQUF5QjtTQUN4RSxDQUFDLENBQUM7S0FDSjtJQUVELGtDQUFrQyxDQUFJO1FBQ3BDLFdBQVc7UUFDWCxZQUFZO1FBQ1osV0FBVztRQUNYLGFBQWE7UUFDYix5QkFBeUI7S0FDMUIsQ0FBQyxDQUFDO0lBRUgsNEJBQTRCLENBQUksV0FBVyxDQUFDLENBQUM7SUFFN0MsSUFBSSxNQUFNLEVBQUU7UUFDVixvQ0FBb0MsQ0FBSSxXQUFXLENBQUMsQ0FBQztRQUNyRCxnREFBZ0QsQ0FDOUMsV0FBVyxFQUNYLFdBQVcsQ0FDWixDQUFDO1FBRUYsT0FBTyxnQ0FBZ0MsQ0FBSTtZQUN6QyxXQUFXO1lBQ1gsYUFBYTtZQUNiLFdBQVc7U0FDWixDQUFDLENBQUM7S0FDSjtTQUFNO1FBQ0wsT0FBTyxXQUFXLENBQUM7S0FDcEI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxXQUErQixFQUMvQixJQUF5QixFQUN6QixLQUFRO0lBRVIsTUFBTSxRQUFRLEdBQTRCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUN0RSxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsSUFDRSxRQUFRLENBQUMsU0FBUztRQUNsQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDckMsQ0FBQyxDQUFDLEtBQUssWUFBWSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ3RDO1FBQ0EsdUJBQXVCO1FBQ3ZCLElBQ0UsUUFBUSxDQUFDLGFBQWE7WUFDdEIsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTO1lBQzFCLFFBQVEsQ0FBQyxZQUFZLEVBQ3JCO1lBQ0EsTUFBTSxPQUFPLEdBQ1gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUM3QixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsWUFBWSxDQUN0RCxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7WUFDdEIsOERBQThEO1lBQzlELE1BQU0sZUFBZSxHQUFRLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ3ZELDhEQUE4RDtZQUM5RCxNQUFNLFlBQVksR0FBUTtnQkFDeEIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO2FBQ25ELENBQUM7WUFDRiw4REFBOEQ7WUFDOUQsTUFBTSxVQUFVLEdBQVEsZUFBZSxDQUNyQyxlQUFlLEVBQ2YsWUFBWTtZQUNaLDhEQUE4RDtZQUM3RCxJQUFJLENBQUMsSUFBOEIsQ0FBQyx5QkFBeUI7aUJBQzNELHFCQUFxQixDQUN6QixDQUFDO1lBQ0YsS0FBSyxHQUFHLE9BQU87Z0JBQ2IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0wsS0FBSyxHQUFHLGVBQWUsQ0FDckIsUUFBUSxDQUFDLFNBQVMsRUFDbEIsS0FBSztZQUNMLDhEQUE4RDtZQUM3RCxJQUFJLENBQUMsSUFBOEIsQ0FBQyx5QkFBeUI7aUJBQzNELHFCQUFxQixDQUNwQixDQUFDO1NBQ1I7S0FDRjtJQUNELFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxZQUFZLENBQUMsWUFBWSxFQUFFO2dCQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtvQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7d0JBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQzNCLFlBQVksQ0FBQyxZQUFZLENBQ0osQ0FBQzt3QkFDeEIsSUFDRSxDQUFDLFlBQVksQ0FBQyxTQUFTOzRCQUN2QixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQ3hDOzRCQUNBLElBQUk7Z0NBQ0YsT0FBTyxDQUFDLFVBQVUsQ0FDaEIsS0FBSyxLQUFLLFNBQVM7b0NBQ2pCLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDN0IsS0FBSyxJQUFJLEVBQUUsRUFDWCxZQUFZLENBQUMsWUFBWSxDQUMxQjtvQ0FDRCxDQUFDLENBQUUsS0FBZSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7b0NBQzdDLENBQUMsQ0FBQyxJQUFJLEVBQ1IsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBQUM7NkJBQ0g7NEJBQUMsT0FBTyxHQUFHLEVBQUU7Z0NBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs2QkFDMUM7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSTtnQ0FDRixvQkFBb0IsQ0FDbEIsV0FBVztnQ0FDWCw4REFBOEQ7Z0NBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBUSxFQUMvQyxLQUFLLEtBQUssU0FBUztvQ0FDakIsQ0FBQyxDQUFFLEtBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO29DQUM3QyxDQUFDLENBQUMsRUFBRSxDQUNQLENBQUM7NkJBQ0g7NEJBQUMsT0FBTyxHQUFHLEVBQUU7Z0NBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQ0FDekMsTUFBTSxHQUFHLENBQUM7NkJBQ1g7eUJBQ0Y7cUJBQ0Y7eUJBQU07d0JBQ0wsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FDaEMsWUFBWSxDQUFDLFlBQVksQ0FDTixDQUFDO3dCQUV0QixJQUNFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxPQUFPOzRCQUM3QyxZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2pDOzRCQUNBLElBQUksZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDOzRCQUNuRCxPQUFPLGVBQWUsS0FBSyxDQUFDLEVBQUU7Z0NBQzVCLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3pCLGVBQWUsRUFBRSxDQUFDOzZCQUNuQjt5QkFDRjt3QkFFRCxJQUNFLENBQUMsWUFBWSxDQUFDLFNBQVM7NEJBQ3ZCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFDeEM7NEJBQ0EsSUFBSTtnQ0FDRixDQUNFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUM5QixLQUFLLElBQUksRUFBRSxFQUNYLFlBQVksQ0FBQyxZQUFZLENBQzFCO29DQUNDLENBQUMsQ0FBRSxLQUFlLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQ0FDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FDaEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFXLEVBQUUsRUFBRTtvQ0FDeEIsSUFBSSxZQUFZLENBQUMsWUFBWSxFQUFFO3dDQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztxQ0FDOUM7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7NEJBQUMsT0FBTyxHQUFHLEVBQUU7Z0NBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs2QkFDMUM7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSTtnQ0FDRixDQUNFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUM5QixLQUFLLElBQUksRUFBRSxFQUNYLFlBQVksQ0FBQyxZQUFZLENBQzFCO29DQUNDLENBQUMsQ0FBRSxLQUFlLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQ0FDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FDaEI7b0NBQ0MsOERBQThEO3FDQUM3RCxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtvQ0FDckIsdUJBQXVCO29DQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29DQUNuQyxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7d0NBQzlCLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7NENBQ3ZDLElBQ0UsSUFBSSxDQUFDLFlBQVk7Z0RBQ2pCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ3JDO2dEQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDOzZDQUNoQzt3Q0FDSCxDQUFDLENBQUMsQ0FBQztxQ0FDSjtvQ0FDRCxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUU7d0NBQzdCLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDOzRDQUNqQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7NENBQ2pDLFdBQVc7NENBQ1gsUUFBUSxFQUFFLFlBQVk7NENBQ3RCLFlBQVksRUFBRSxJQUFJOzRDQUNsQixhQUFhLEVBQUUsSUFBSSxDQUFDLElBR25COzRDQUNELHlCQUF5QixFQUN2QixJQUFJLENBQUMsSUFDTixDQUFDLHlCQUF5Qjt5Q0FDNUIsQ0FBQyxDQUFDO3dDQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUNBQzVCO2dDQUNILENBQUMsQ0FBQyxDQUFDOzZCQUNOOzRCQUFDLE9BQU8sR0FBRyxFQUFFO2dDQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NkJBQzFDO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsV0FBK0IsRUFDL0IsSUFBeUIsRUFDekIsYUFBbUM7SUFFbkMsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUNsQixhQUFhLEdBQUcsSUFBSSxDQUFDLElBQTJCLENBQUM7S0FDbEQ7SUFFRCxpQ0FBaUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVqRCxNQUFNLFFBQVEsR0FBNEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3RFLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7S0FDbkU7SUFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1FBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUU7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pCLElBQ0UsQ0FBQyxZQUFZLENBQUMsU0FBUztvQkFDdkIsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUN4QztvQkFDQSxJQUFJLENBQUMsYUFBYSxFQUFFLG9CQUFvQixFQUFFO3dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7cUJBQ2pEO29CQUNELElBQUk7d0JBQ0YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTs0QkFFMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUN4QyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQzs0QkFDeEMsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLGlCQUFpQixDQUN6RCxhQUFhLENBQUMsb0JBQW9CLENBQ25DLEVBQ0Q7Z0NBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsa0JBQWtCLENBQ3pELGFBQWEsQ0FBQyxvQkFBb0IsQ0FDbkMsQ0FBQyxDQUFDOzs7NkRBRzBCOzZCQUM5Qjs0QkFFRCxJQUFJLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRTtnQ0FDN0QsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsZ0JBQWdCLENBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUN6QyxDQUFDO2dDQUNGLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUNqQyxhQUFhLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLEVBQ3pELHdCQUF3QjtnQ0FDeEIsOERBQThEO2lDQUMvRCxDQUFDO2dDQUNGLElBQUksaUJBQWlCLEVBQUU7b0NBQ3JCLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztvQ0FDekIsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLEVBQUU7d0NBQ3JDLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7d0NBQ3BELElBQUksT0FBTyxlQUFlLEtBQUssVUFBVSxFQUFFOzRDQUN6QyxlQUFlLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQzt5Q0FDckM7cUNBQ0Y7b0NBQ0QsSUFBSSxVQUFVLEdBQ1osaUJBQWlCLEVBQUUsVUFBVSxJQUFJLGlCQUFpQixDQUFDO29DQUNyRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsRUFBRTt3Q0FDcEMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7cUNBQzNCO29DQUNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLGtCQUFrQixDQUFDO3dDQUMxRCxHQUFHLGVBQWU7d0NBQ2xCLEdBQUcsVUFBVTs2Q0FDVixNQUFNLENBQUMsT0FBTyxDQUFDOzZDQUNmLEdBQUcsQ0FDRixDQUFDLFNBQXNCLEVBQUUsRUFBRSxDQUN6QixDQUFDLE9BQXdCLEVBQUUsRUFBRSxDQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUN4Qzt3Q0FDSCxhQUFhLENBQUMsb0JBQW9CO3FDQUNuQyxDQUFDLENBQUMsQ0FBQzs7O2lFQUd5QjtpQ0FDOUI7NkJBQ0Y7eUJBQ0Y7cUJBQ0Y7b0JBQUMsT0FBTyxHQUFHLEVBQUU7d0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDMUM7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSTt3QkFDRix1QkFBdUIsQ0FDckIsV0FBVyxFQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBd0IsRUFDL0QsYUFBYSxDQUNkLENBQUM7cUJBQ0g7b0JBQUMsT0FBTyxHQUFHLEVBQUU7d0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDMUM7aUJBQ0Y7YUFDRjtpQkFBTTtnQkFDTCxJQUNFLENBQUMsWUFBWSxDQUFDLFNBQVM7b0JBQ3ZCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFDeEM7b0JBQ0EsSUFBSSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRTt3QkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO3FCQUNqRDtvQkFDRCxJQUFJO3dCQUNGLE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDeEMsQ0FBQyxRQUFRLENBQUM7d0JBQ1gsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU87NEJBQy9DLENBQUMsQ0FBQyxFQUFFOzRCQUNKLENBQUMsQ0FBQyxRQUFRLENBQ1gsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUU7NEJBQ2xDLE9BQTRCLENBQUMsc0JBQXNCLEdBQUc7Z0NBQ3JELEdBQUcsWUFBWTtnQ0FDZixhQUFhO2dDQUNiLE9BQU8sRUFBRSxLQUFLOzZCQUNmLENBQUM7NEJBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQ0FDbEIsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQzs2QkFDdEM7NEJBQ0QsSUFDRSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFDOUQ7Z0NBQ0EsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dDQUMvRCx1Q0FBdUM7NkJBQ3hDO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILElBQUksQ0FBQyxhQUFhLEVBQUU7NEJBQ2xCLE1BQU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7eUJBQ3RDO3dCQUNELElBQ0UsQ0FDRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ3hDLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEVBQ3ZEOzRCQUVFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDeEMsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQzs0QkFDekQ7OzBEQUU4Qjt5QkFDL0I7cUJBQ0Y7b0JBQUMsT0FBTyxHQUFHLEVBQUU7d0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDMUM7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSTt3QkFDRixNQUFNLFFBQVEsR0FDWixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ3hDLENBQUMsUUFBUSxDQUFDO3dCQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPOzRCQUMvQyxDQUFDLENBQUMsRUFBRTs0QkFDSixDQUFDLENBQUMsUUFBUSxDQUNYLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFOzRCQUNsQyxPQUE0QixDQUFDLHNCQUFzQixHQUFHO2dDQUNyRCxHQUFHLFlBQVk7Z0NBQ2YsYUFBYTtnQ0FDYixPQUFPLEVBQUUsS0FBSzs2QkFDZixDQUFDOzRCQUNGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDOzRCQUN6Qyw4RkFBOEY7NEJBQzlGLElBQ0UsWUFBWSxDQUFDLFNBQVM7Z0NBQ3RCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0NBQ3hDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTTtvQ0FDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQ2xDO2dDQUNBLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0NBQ3ZDLElBQ0UsSUFBSSxDQUFDLFlBQVk7d0NBQ2pCLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUM5QixZQUFZLEVBQ1osSUFBSSxDQUFDLFlBQVksQ0FDbEIsRUFDRDt3Q0FDQSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFOzRDQUN0RCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0Q0FDckM7NENBQ0UsOERBQThEOzRDQUM5RCxDQUFFLE9BQXNDLENBQUMsUUFBUSxDQUMvQyxJQUFJLENBQUMsWUFBWSxDQUNsQixFQUNEO2dEQUNBLDhEQUE4RDtnREFDN0QsT0FBc0MsQ0FBQyxVQUFVLENBQ2hELElBQUksQ0FBQyxZQUFZLEVBQ2pCLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUNuRCxDQUFDOzZDQUNIO3lDQUNGOzZDQUFNOzRDQUNMLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnREFDaEIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7Z0RBQ3JDO2dEQUNFLDhEQUE4RDtnREFDOUQsQ0FBRSxPQUFzQyxDQUFDLFFBQVEsQ0FDL0MsSUFBSSxDQUFDLFlBQVksQ0FDbEIsRUFDRDtvREFDQSw4REFBOEQ7b0RBQzdELE9BQXNDLENBQUMsVUFBVSxDQUNoRCxJQUFJLENBQUMsWUFBWSxFQUNqQixXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FDbkQsQ0FBQztpREFDSDs2Q0FDRjtpREFBTTtnREFDTCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztnREFDdkM7Z0RBQ0UsOERBQThEO2dEQUM5RCxDQUFFLE9BQXNDLENBQUMsUUFBUSxDQUMvQyxJQUFJLENBQUMsWUFBWSxDQUNsQixFQUNEO29EQUNBLDhEQUE4RDtvREFDN0QsT0FBc0MsQ0FBQyxVQUFVLENBQ2hELElBQUksQ0FBQyxZQUFZLEVBQ2pCLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUNyRCxDQUFDO2lEQUNIOzZDQUNGO3lDQUNGO3FDQUNGO2dDQUNILENBQUMsQ0FBQyxDQUFDO2dDQUNILG9CQUFvQixDQUNsQixXQUFXO2dDQUNYLDhEQUE4RDtnQ0FDOUQsT0FBcUMsRUFDckMsWUFBWSxDQUNiLENBQUM7NkJBQ0g7NEJBQ0QsdUJBQXVCLENBQ3JCLFdBQVcsRUFDWCxPQUE4QixFQUM5QixhQUFhLENBQ2QsQ0FBQzs0QkFDRixJQUFJLENBQUMsYUFBYSxFQUFFO2dDQUNsQixNQUFNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOzZCQUN0Qzs0QkFDRCxJQUNFLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUM5RDtnQ0FDQSxPQUFPLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0NBQy9ELHVDQUF1Qzs2QkFDeEM7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRTs0QkFDbEIsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQzt5QkFDdEM7d0JBQ0QsSUFDRSxDQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDeEMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFDdkQ7NEJBRUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUN4QyxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzRCQUN6RDs7MERBRThCO3lCQUMvQjtxQkFDRjtvQkFBQyxPQUFPLEdBQUcsRUFBRTt3QkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUMxQztpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBc0I7SUFDMUQsSUFBSSxPQUErQixDQUFDO0lBQ3BDLElBQUksdUJBQStCLENBQUM7SUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDM0MsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsVUFBVTtRQUNWLElBQUksT0FBTyxZQUFZLGtCQUFrQixFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMzQztRQUNELG1CQUFtQjthQUNkLElBQUksT0FBTyxZQUFZLGdCQUFnQixFQUFFO1lBQzVDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsUUFBUTthQUNILElBQUksT0FBTyxZQUFZLGdCQUFnQixFQUFFO1lBQzVDLHVCQUF1QixHQUFJLE9BQTRCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hELG1CQUFtQjtnQkFDbkIsSUFBSyxPQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxrQkFBa0IsRUFBRTtvQkFDekUsT0FBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUF3QixDQUFDLGFBQWEsQ0FBQzt3QkFDOUUsUUFBUSxFQUFFLElBQUk7cUJBQ2YsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELDRCQUE0QjtnQkFDNUIsSUFBSyxPQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxnQkFBZ0IsRUFBRTtvQkFDekUscUJBQXFCLENBQ2xCLE9BQTRCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBcUIsQ0FDOUQsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsNEJBQTRCO0FBQzVCLGVBQWU7QUFDZixlQUFlO0FBQ2YsU0FBUyxXQUFXLENBQ2xCLFNBQW9DLEVBQ3BDLHlCQUF5RCxFQUN6RCxZQUFtQixFQUNuQixXQUFvQixFQUNwQixxQkFBb0QsRUFDcEQsTUFBZTtJQUVoQixNQUFNLCtCQUErQjtJQUNuQyw4REFBOEQ7SUFDL0QsU0FBUyxFQUFFLENBQUMsaUNBQWlDLENBQUMsSUFBSSxTQUFTLENBQUM7SUFDN0QsSUFBSSxDQUFDLCtCQUErQixFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0lBQXNJLENBQ3ZJLENBQUM7S0FDSDtJQUNELE1BQU0sNkJBQTZCO0lBQ2pDLDhEQUE4RDtJQUM5RCxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUMxRCxpRUFBaUU7SUFDbkUsSUFBSSxDQUFDLDZCQUE2QixFQUFFO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztLQUNyRTtJQUVELDhEQUE4RDtJQUM5RCxJQUFJLGdCQUFnQixHQUFVLEVBQUUsQ0FBQztJQUNqQyw4REFBOEQ7SUFDOUQsSUFBSSxpQkFBaUIsR0FBVSxFQUFFLENBQUM7SUFDbEMsOERBQThEO0lBQzlELElBQUksY0FBYyxHQUFpQixFQUFFLENBQUM7SUFDdEMsOERBQThEO0lBQzlELElBQUksVUFBVSxHQUFpQixJQUFJLENBQUM7SUFHcEMsMkNBQTJDO0lBQzNDLElBQUksTUFBTSxFQUFFO1FBQ1YsT0FDRSxDQUFDLGNBQWM7WUFDZixDQUFDLFVBQVU7WUFDWCxjQUFjLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQzNDO1lBQ0EsY0FBYyxHQUFHLFVBQVUsQ0FBQztZQUM1QixlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RELFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLGNBQWMsQ0FBQztnQkFDckUsOERBQThEO2lCQUM3RCxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsOERBQThEO2lCQUM3RCxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN0QyxDQUFDLENBQUM7Z0JBQ0YsOERBQThEO2lCQUM3RCxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxDQUFDLENBQUMsQ0FDTDtpQkFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNYLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDdEIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUN4QixDQUFDLENBQUMsQ0FDSjtnQkFDRCw4REFBOEQ7aUJBQzdELE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RCxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUN2QyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQXNCLEVBQUUsRUFBRSxDQUNqRCxlQUFlLENBQ2IsU0FBUyxDQUFDLFNBQVMsRUFDbkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUNqRSxxQkFBcUIsQ0FDdEIsQ0FDRixDQUNGLENBQUM7WUFDRixnQkFBZ0I7Z0JBQ2QsK0JBQStCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEU7UUFFRCxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsMkNBQTJDO1FBQzNDLE9BQ0UsQ0FBQyxjQUFjO1lBQ2YsQ0FBQyxVQUFVO1lBQ1gsY0FBYyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxFQUMzQztZQUNBLGNBQWMsR0FBRyxVQUFVLENBQUM7WUFDNUIsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUN0RCxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDeEUsOERBQThEO2lCQUM3RCxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakIsOERBQThEO2lCQUM3RCxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN0QyxDQUFDLENBQUM7Z0JBQ0YsOERBQThEO2lCQUM3RCxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUN2RTtpQkFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNYLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDdEIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUN4QixDQUFDLENBQUMsQ0FDSjtnQkFDRCw4REFBOEQ7aUJBQzdELE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RCxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUN2QyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQXNCLEVBQUUsRUFBRSxDQUNqRCxlQUFlLENBQ2IsU0FBUyxDQUFDLFNBQVMsRUFDbkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUNqRSxxQkFBcUIsQ0FDdEIsQ0FDRixDQUNGLENBQUM7WUFDRixpQkFBaUI7Z0JBQ2YsK0JBQStCLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkU7S0FDRjtTQUFNO1FBQ0wsZ0JBQWdCO1lBQ2QsK0JBQStCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsaUJBQWlCO1lBQ2YsK0JBQStCLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbkU7SUFFRCwwREFBMEQ7SUFDMUQsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsQ0FBQztZQUN2RCw4REFBOEQ7YUFDN0QsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO1lBQ2hELDhEQUE4RDthQUM3RCxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUNqQiwrQkFBK0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0Q7WUFDRCw4REFBOEQ7YUFDN0QsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUN4RCxDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUc7UUFDakIsOERBQThEO1FBQzlELEdBQUcsZ0JBQWdCO1FBQ25CLEdBQUcsaUJBQWlCO1FBQ3BCLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2xFLENBQUMsTUFBTTtJQUNOLDhEQUE4RDtJQUM5RCxDQUFDLFdBQWdCLEVBQUUsV0FBZ0IsRUFBRSxLQUFVLEVBQUUsRUFBRTtRQUNqRCxPQUFPLENBQ0wsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhO1lBQ25DLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUMxRCxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQ3JEO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNULFdBQVc7Z0JBQ1QsS0FBSyxDQUFDLFNBQVM7Z0JBQ2IsOERBQThEO2dCQUM5RCxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUMsWUFBWSxDQUMxRCxDQUNKLENBQUM7SUFDSixDQUFDLENBQ0YsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxJQUFLLHlCQUF5QixDQUFDLG1CQUE4QixDQUFDO0lBRXJHLFVBQVUsQ0FBQyxPQUFPLENBQ2hCLENBQ0Usa0JBR0MsRUFDRCxLQUFhLEVBQ2IsRUFBRTtRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsK0JBQStCLENBQUMsZ0JBQWdCLENBQ3ZFLGtCQUFrQixDQUFDLE1BQU0sRUFDekIsa0JBQWtCLENBQUMsWUFBWSxDQUNoQyxDQUFDO1FBR0wsNEZBQTRGO1FBQzVGLDRCQUE0QjtRQUM1QixlQUFlO1FBQ2YsZUFBZTtRQUVmLHNCQUFzQjtRQUN0Qjs7Ozs7Ozs7Ozs7O1VBWUU7UUFDQyxJQUFJLGdCQUFnQixFQUFFO1lBQ3ZCLHFDQUFxQztZQUN4QyxJQUFHLGtCQUFrQixFQUFFO2dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQzlFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFCO2lCQUFNO2dCQUNMLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRXRFLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtvQkFDN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUNuQixHQUFHLFdBQVcsQ0FDYixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsRUFDL0IseUJBQXlCLEVBQ3pCLFlBQVksR0FBQyxDQUFDLEVBQ2QsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEtBQUcsQ0FBQyxDQUNoQjt3QkFDRCxPQUFPLEVBQUUsS0FBSyxLQUFLLGdCQUFnQixDQUFDLGFBQWE7d0JBQ2pELFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO3FCQUMzQyxDQUFBO2dCQUNGLENBQUMsQ0FBQTtnQkFDRCx3REFBd0Q7Z0JBQ3hELGlHQUFpRztnQkFDakcsSUFBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLENBQUMsRUFBRTtvQkFDbkUsY0FBYyxFQUFFLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0wsSUFBRyx5QkFBeUIsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO3dCQUNyRixjQUFjLEVBQUUsQ0FBQztxQkFDZDt5QkFBTTt3QkFDTCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDMUI7aUJBQ0Y7YUFDRjtTQUNJO2FBQU07WUFDTCxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQ2xCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO2FBQzlDLENBQUM7U0FDSDtJQUVILENBQUMsQ0FDRixDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZixTQUFTO1FBQ1QsVUFBVSxFQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBLEVBQUUsQ0FBQSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUM7UUFDL0QsYUFBYSxFQUNYLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDdEUsQ0FBQztRQUNILE9BQU8sRUFBRSxLQUFLO1FBQ2QsWUFBWSxFQUFFLElBQUk7S0FDbkIsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUE4QixFQUNoRSxlQUFlLEVBQ2YsU0FBUyxFQUNULFdBQVcsRUFDWCx5QkFBeUIsR0FNMUI7SUFDQyxJQUFJLENBQUMsZUFBZSxJQUFJLFNBQVMsRUFBRTtRQUNqQyxXQUFXLENBQUMsc0JBQXNCLEdBQUcsV0FBVyxDQUM5QyxTQUFTLEVBQ1QsV0FBVyxDQUFDLHlCQUF5QixFQUN4QyxDQUFDLEVBQ0QsRUFBRSxFQUNDLHlCQUF5QixDQUFDLHFCQUFxQixFQUMvQyxJQUFJLENBQ0wsQ0FBQztLQUNIO1NBQU07UUFDTCxXQUFXLENBQUMsc0JBQXNCO1lBQ2hDLGVBQTBDLENBQUM7S0FDOUM7SUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNyQztBQUNILENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUE4QixFQUNuRSxXQUFXLEVBQ1gseUJBQXlCLEdBSTFCO0lBQ0MsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDeEM7SUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixFQUFFO1FBQzFDLFdBQVcsQ0FBQyx5QkFBeUIsR0FBRyx5QkFBeUIsSUFBSSxFQUFFLENBQUM7S0FDekU7SUFDRCxXQUFXLENBQUMseUJBQXlCLENBQUMscUJBQXFCLEdBQUc7UUFDNUQsR0FBRyxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7S0FDdkUsQ0FBQztJQUNGLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsR0FBRztRQUM1RCxHQUFHLCtCQUErQjtRQUNsQyxHQUFHLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztLQUN2RSxDQUFDO0lBQ0YsV0FBVyxDQUFDLHlCQUF5QixDQUFDLDRCQUE0QixHQUFHO1FBQ25FLEdBQUcsQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsNEJBQTRCO1lBQ3BFLEVBQUUsQ0FBQztLQUNOLENBQUM7SUFDRixXQUFXLENBQUMseUJBQXlCLENBQUMsbUJBQW1CO1FBQ3ZELENBQUMsT0FBTyxXQUFXLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLEtBQUcsUUFBUSxDQUFDLENBQUM7WUFDL0UsV0FBVyxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRSxzRUFBc0U7QUFDdkUsQ0FBQztBQUVELFNBQVMsa0NBQWtDLENBQThCLEVBQ3ZFLFdBQVcsRUFDWCxZQUFZLEVBQ1osV0FBVyxFQUNYLGFBQWEsRUFDYix5QkFBeUIsR0FRMUI7SUFDQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FDbkQsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdEIsV0FBVyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25FLElBQUksWUFBWSxDQUFDLFlBQVksRUFBRTtZQUM3QixJQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsd0JBQXdCLENBQzdCLFlBQVksSUFBSSxFQUFFLEVBQ2xCLFlBQVksQ0FBQyxZQUFZLENBQzFCO2dCQUNELFlBQVksQ0FBQyxPQUFPLEVBQ3BCO2dCQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO29CQUN6QixJQUNFLENBQUMsWUFBWSxDQUFDLFNBQVM7d0JBQ3ZCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFDeEM7d0JBQ0Esb0NBQW9DLENBQUk7NEJBQ3RDLFlBQVk7NEJBQ1osWUFBWTs0QkFDWixXQUFXOzRCQUNYLFdBQVc7NEJBQ1gsS0FBSzt5QkFDTixDQUFDLENBQUM7cUJBQ0o7eUJBQU07d0JBQ0wsZ0NBQWdDLENBQUk7NEJBQ2xDLFlBQVk7NEJBQ1osWUFBWTs0QkFDWixXQUFXOzRCQUNYLGFBQWE7NEJBQ2IseUJBQXlCOzRCQUN6QixXQUFXOzRCQUNYLEtBQUs7eUJBQ04sQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO3FCQUFNO29CQUNMLElBQ0UsQ0FBQyxZQUFZLENBQUMsU0FBUzt3QkFDdkIsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUN4Qzt3QkFDQSxvQ0FBb0MsQ0FBSTs0QkFDdEMsWUFBWTs0QkFDWixZQUFZOzRCQUNaLFdBQVc7NEJBQ1gsV0FBVzs0QkFDWCxLQUFLO3lCQUNOLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxnQ0FBZ0MsQ0FBSTs0QkFDbEMsWUFBWTs0QkFDWixZQUFZOzRCQUNaLFdBQVc7NEJBQ1gsYUFBYTs0QkFDYix5QkFBeUI7NEJBQ3pCLFdBQVc7NEJBQ1gsS0FBSzt5QkFDTixDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBOEIsRUFDckUsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixXQUFXLEVBQ1gsS0FBSyxHQVVOO0lBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsTUFBTSxZQUFZLEdBQWEsWUFBc0IsQ0FDbkQsWUFBWSxDQUFDLFlBQVksQ0FDMUIsQ0FBQztJQUNGLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FDVCxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRTlELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFxQixDQUFDO0lBRTFELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNyQixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FDVixrQkFBa0IsQ0FBQztZQUNqQixTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVM7WUFDakMsV0FBVztZQUNYLElBQUk7WUFDSixhQUFhO1lBQ2IsUUFBUSxFQUFFLFlBQVk7WUFDdEIsWUFBWSxFQUFFLElBQUk7WUFDbEIseUJBQXlCO1NBQzFCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0QsT0FBTyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztJQUM5QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztJQUMzRSxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsb0NBQW9DLENBQThCLEVBQ3pFLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxLQUFLLEdBT047SUFDQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLFlBQVksR0FBYSxZQUFzQixDQUNuRCxZQUFZLENBQUMsWUFBWSxDQUMxQixDQUFDO0lBQ0YsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUNULFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQXFCLENBQUM7SUFDN0QsdUNBQXVDO0lBQ3ZDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0lBQzlDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDO0lBQzNFLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBOEIsRUFDckUsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixXQUFXLEVBQ1gsS0FBSyxHQVVOO0lBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsTUFBTSxLQUFLLEdBQ1IsWUFBc0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBQ2xELDhEQUE4RDtRQUM5RCxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3BCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDZixHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUNyRCxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0wsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7cUJBQzVCO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFpQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFDakMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTO1FBQ2pDLFdBQVc7UUFDWCxJQUFJO1FBQ0osYUFBYTtRQUNiLFFBQVEsRUFBRSxZQUFZO1FBQ3RCLFlBQVksRUFBRSxLQUFLO1FBQ25CLHlCQUF5QjtLQUMxQixDQUFDLENBQUM7SUFDSCxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0QsT0FBTyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztJQUM5QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztJQUMzRSxXQUFXLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsb0NBQW9DLENBQThCLEVBQ3pFLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsRUFDWCxLQUFLLEdBT047SUFDQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQzNDLFlBQVksRUFDWixZQUFZLENBQUMsWUFBWSxDQUMxQjtRQUNDLENBQUMsQ0FBRSxZQUFzQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFDcEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUF1QixDQUFDO0lBQ2pFLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0lBQzlDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDO0lBQzNFLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBOEIsRUFDckUsV0FBVyxFQUNYLGFBQWEsRUFDYixXQUFXLEdBTVo7SUFDQyxXQUFXLENBQUMscUJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQ3JELEVBQUUsQ0FDSCxDQUFDO0lBRUYsV0FBVyxDQUFDLDhCQUE4QixHQUFHLENBQzNDLHlCQUF1RCxFQUN2RCxFQUFFO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDMUM7UUFDRCxXQUFXLENBQUMseUJBQXlCLEdBQUc7WUFDdEMsR0FBRyxXQUFXLENBQUMseUJBQXlCO1lBQ3hDLEdBQUcseUJBQXlCO1NBQzdCLENBQUM7UUFDRix1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDO0lBRUYsV0FBVyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxlQUFlLENBQ3BCLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQzVDO1lBQ0UsR0FBRyxXQUFXLENBQUMsS0FBSztTQUNyQixFQUNELFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FDdkQsQ0FBQztJQUNULENBQUMsQ0FBQztJQUVGLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFTLEVBQUUsRUFBRTtRQUNwQyxvQkFBb0IsQ0FDbEIsV0FBVztRQUNYLDhEQUE4RDtRQUM5RCxXQUFrQixFQUNsQixlQUFlLENBQ2IsTUFBTSxFQUNOLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyw0QkFBNEIsQ0FDbkUsQ0FDRixDQUFDO1FBQ0YsdUJBQXVCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUM7SUFFRixXQUFXLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtRQUN6Qix1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztJQUVGLFdBQVcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ3pCLE9BQU8sb0NBQW9DLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQztJQUVGLFdBQVcsQ0FBQyxPQUFPLEdBQUcsQ0FDcEIsS0FBUSxFQUNSLE9BR0MsRUFDRCxFQUFFO1FBQ0Ysb0JBQW9CLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7SUFFRixXQUFXLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxjQUFvQyxFQUFFLEVBQUU7UUFDdkUsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FDcEMsb0NBQW9DLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQ2hFLENBQUM7UUFDRixXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7SUFFRixXQUFXLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxFQUFFO1FBQ25DLE9BQU8sb0NBQW9DLENBQ3pDLFNBQVMsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUM5QyxHQUFHLENBQUMsTUFBMEIsRUFBRSxJQUE4QjtZQUM1RCxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3JCLE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQzNCO1lBQ0QsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNuQixPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN6QjtZQUNELElBQUksSUFBSSxLQUFLLGdCQUFnQixFQUFFO2dCQUM3QixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELEdBQUcsQ0FDRCxNQUEwQixFQUMxQixJQUE4QjtRQUM5Qiw4REFBOEQ7UUFDOUQsS0FBVTtZQUVWLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDckIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELElBQUksSUFBSSxLQUFLLGdCQUFnQixFQUFFO2dCQUM3QixNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2xDLEtBQUs7Z0JBQ0wsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RSxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUNuQyxXQUFtQztJQUVuQyxXQUFXLENBQUMsdUJBQXVCLEdBQUcsQ0FDcEMsT0FBK0IsRUFDL0IsV0FBb0IsRUFDcEIsRUFBRTtRQUNGLE1BQU0sY0FBYyxHQUFHLE9BQTJDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsRUFBRTtZQUNoRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtRQUNELE9BQU8sY0FBYyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDcEQsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDYixJQUNFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxZQUFZO2dCQUNwRCxNQUFNLENBQUMsd0JBQXdCLENBQzdCLE1BQU0sRUFDTixjQUFjLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxDQUNyRCxFQUNEO2dCQUNBLE9BQU8sTUFBTSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxZQUFZLENBQUM7b0JBQ2pFLEVBQUUsUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVztvQkFDdkMsQ0FBQyxDQUFDLElBQUk7b0JBQ04sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDbEU7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQ0FBaUMsQ0FDeEMsYUFBa0M7SUFFbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtRQUN2QyxhQUFhLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxhQUFhLEVBRTFELENBQUM7UUFDSixhQUFhLENBQUMsb0JBQW9CLEdBQUcsQ0FDbkMsT0FBZ0QsRUFDWCxFQUFFO1lBQ3ZDLE1BQU0sUUFBUSxHQUFJLE9BQWlDO2dCQUNqRCxFQUFFLHNCQUFzQixDQUFDO1lBRTNCLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBRUQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekUsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQ25DLGFBQWEsRUFDYixTQUFTLEVBQ1QsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLENBQ1QsQ0FBQztZQUVGLDhEQUE4RDtZQUM5RCx3QkFBd0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9CLFNBQVM7Z0JBQ1QsV0FBVztnQkFDWCxPQUFPO2dCQUNQLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFFSCxNQUFNLDBCQUEwQixHQUFHLFNBQVMsQ0FDMUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLHFCQUFxQixDQUM5RCxDQUFDO1lBQ0YsTUFBTSwyQkFBMkIsR0FBRyxTQUFTLENBQzNDLGtDQUFrQyxFQUFFLENBQUMscUJBQXFCLENBQzNELENBQUM7WUFDRixNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FDckMsMkJBQTJCLEVBQzNCLDBCQUEwQixDQUMzQixDQUFDO1lBQ0YsT0FBTyxDQUNMLGFBQWEsQ0FBQyxnQ0FBZ0M7Z0JBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN4RCxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUM3RCxDQUFDLElBQUksQ0FDSixZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLEdBQUcsQ0FBQyxDQUFDLHdCQUEyQyxFQUFFLEVBQUU7Z0JBQ2xELG9DQUFvQyxDQUNsQyxhQUFhLEVBQ2Isd0JBQXdCLENBQ3pCLENBQUM7Z0JBRUYsTUFBTSxrQkFBa0IsR0FBRyxrQ0FBa0MsQ0FDM0QsT0FBTyxFQUNQLGFBQWEsRUFDYixVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7Z0JBRUYsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztxQkFDOUQsTUFBTSxHQUFHLENBQUM7b0JBQ1gsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQjtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUM7S0FDSDtBQUNILENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixhQUFxQztBQUNyQyw4REFBOEQ7QUFDOUQsU0FBYyxFQUNkLFdBQW1CLEVBQ25CLE9BQXlELEVBQ3pELFFBQWlDO0lBRWpDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDbEIsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQUN0QztJQUNELElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFO1FBQ25ELE1BQU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDbEM7SUFFRCx5QkFBeUI7SUFDekIsU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpELDhEQUE4RDtJQUM5RCxNQUFNLE1BQU0sR0FBUSxlQUFlLENBQ2pDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQzlDLFNBQVMsRUFDVCxhQUFhLENBQUMseUJBQXlCLENBQUMscUJBQXFCLENBQzlELENBQUM7SUFFRixnQ0FBZ0M7SUFDaEMsSUFDRSxRQUFRLENBQUMsT0FBTztRQUNoQixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDN0Q7UUFDQSw4REFBOEQ7UUFDOUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDakQsU0FBUyxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsSUFBSSxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELDBDQUEwQztJQUMxQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQ3RFLG1EQUFtRCxDQUNqRCxXQUFXLEVBQ1gsTUFBTSxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxDQUNULENBQUM7S0FDSDtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUN2QixPQUF5RDtJQUV6RCxNQUFNLHdCQUF3QixHQUFhLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDL0IsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLElBQUksSUFBSSxHQUFHLE9BQWdDLENBQUM7SUFDNUMsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRTtZQUN0RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsWUFBWTtZQUN6QyxJQUFJLENBQUM7UUFDUCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBK0IsQ0FBQztRQUNwRCxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7WUFDaEIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRTtnQkFDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM3QjtZQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFO2dCQUM1Qyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEM7U0FDRjtRQUNELElBQUksR0FBRyxNQUFNLENBQUM7S0FDZjtJQUNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsT0FBTztRQUNMLFNBQVM7UUFDVCxVQUFVO1FBQ1YsV0FBVztRQUNYLHdCQUF3QixFQUFFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtDQUFrQyxDQUN6QyxPQUF5RCxFQUN6RCxhQUFxQyxFQUNyQyxVQUFvQixFQUNwQixTQUFtQjtJQUVuQixNQUFNLGtCQUFrQixHQUFHLE9BQTZCLENBQUM7SUFFekQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUMxQixhQUFhLENBQUMsb0JBQW9CLEVBQ2xDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FDckIsQ0FBQztJQUNGLGtCQUFrQixDQUFDLG9CQUFvQjtRQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN0QyxDQUFDLENBQUM7Z0JBQ0UsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLElBQUksRUFBRTthQUMzQztZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFVCxJQUFJLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCLEVBQUU7UUFDbkQsa0JBQWtCLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzdDLGtCQUFrQixDQUFDLDJCQUEyQjtZQUM1QyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7S0FDakQ7SUFDRCxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQ2pELGtCQUFrQixDQUFDLG9CQUFvQixDQUN4QyxDQUFDO0lBRUYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFO1FBQzVDLGtCQUFrQixDQUFDLG9CQUFvQjtZQUNyQyxJQUFJLGVBQWUsQ0FBd0IsRUFBRSxDQUFDLENBQUM7S0FDbEQ7SUFDRCxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQzFDLG9EQUFvRCxDQUNsRCxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FDeEMsQ0FDRixDQUFDO0lBQ0YsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyxvQ0FBb0MsQ0FDM0MsYUFBcUMsRUFDckMsd0JBQTJDO0lBRTNDLElBQUksQ0FBQyxhQUFhLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsYUFBYSxDQUFDLG9CQUFvQjtRQUNoQyxXQUFXLENBQ1QsYUFBYSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFLEVBQ2hELCtDQUErQyxDQUM3Qyx3QkFBd0IsQ0FDekIsSUFBSSxFQUFFLENBQ1IsSUFBSSxFQUFFLENBQUM7SUFFVixJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFO1FBQzlDLGFBQWEsQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDeEMsYUFBYSxDQUFDLDJCQUEyQjtZQUN2QyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7S0FDakQ7SUFDRCxhQUFhLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUM1QyxhQUFhLENBQUMsb0JBQW9CLENBQ25DLENBQUM7SUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1FBQ3ZDLGFBQWEsQ0FBQyxvQkFBb0I7WUFDaEMsSUFBSSxlQUFlLENBQXdCLEVBQUUsQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDckMsV0FBVyxDQUNULDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxFQUM1QyxvREFBb0QsQ0FDbEQsYUFBYSxDQUFDLG9CQUFvQixDQUNuQyxDQUNGLENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG9DQUFvQyxDQUMzQyxhQUFxQztJQUVyQyxJQUFJLENBQUMsYUFBYSxDQUFDLDRDQUE0QyxFQUFFO1FBQy9ELGFBQWEsQ0FBQyw0Q0FBNEM7WUFDeEQsYUFBYSxFQUFFLFlBQVk7aUJBQ3hCLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ2xCLE1BQU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7aUJBQ3RDO2dCQUNELGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLENBQUM7WUFDeEQsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUNWLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDbEIsTUFBTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztpQkFDdEM7Z0JBRUQsYUFBYSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FDckMsV0FBVyxDQUNULDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxFQUM1QyxvREFBb0QsQ0FDbEQsYUFBYSxDQUFDLG9CQUFvQixDQUNuQyxDQUNGLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUNIO2lCQUNBLFNBQVMsRUFBRSxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0RBQWdELENBQ3ZELFdBQStCLEVBQy9CLGFBQXFDO0lBRXJDLElBQUksQ0FBQyxhQUFhLENBQUMsa0RBQWtELEVBQUU7UUFDckUsYUFBYSxDQUFDLGtEQUFrRDtZQUM5RCx5Q0FBeUMsRUFBRTtpQkFDeEMsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsdUJBQXVCLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUNwRCxhQUFhLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RSxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FDSDtpQkFDQSxTQUFTLEVBQUUsQ0FBQztLQUNsQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBVbnR5cGVkRm9ybUFycmF5LFxyXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBDbGFzc0NvbnN0cnVjdG9yLFxyXG4gIGluc3RhbmNlVG9QbGFpbixcclxuICBwbGFpblRvSW5zdGFuY2UsXHJcbn0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXItZ2xvYmFsLXN0b3JhZ2UnO1xyXG5pbXBvcnQge1xyXG4gIHZhbGlkYXRlLFxyXG4gIHZhbGlkYXRlU3luYyxcclxuICBWYWxpZGF0aW9uRXJyb3IsXHJcbn0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yLW11bHRpLWxhbmcnO1xyXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xyXG5pbXBvcnQgbG9kYXNoR2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xyXG5pbXBvcnQgbWVyZ2VXaXRoIGZyb20gJ2xvZGFzaC5tZXJnZXdpdGgnO1xyXG5pbXBvcnQgbG9kYXNoU2V0IGZyb20gJ2xvZGFzaC5zZXQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZGVsYXksIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0NMQVNTX1RSQU5TRk9STV9PUFRJT05TIH0gZnJvbSAnLi9jb25zdGFudHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHtcclxuICBDbGFzc1ZhbGlkYXRvckVycm9ycyxcclxuICBEZWVwUGFydGlhbCxcclxuICBEeW5hbWljQ2xhc3NUcmFuc2Zvcm1PcHRpb25zLFxyXG4gIER5bmFtaWNGb3JtQXJyYXksXHJcbiAgRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuICBEeW5hbWljRm9ybUNvbnRyb2wsXHJcbiAgRHluYW1pY0Zvcm1Hcm91cCxcclxuICBEeW5hbWljRm9ybVByb3BlcnRpZXMsXHJcbiAgSUR5bmFtaWNDb250cm9sTWV0YWRhdGEsXHJcbiAgU2hvcnRWYWxpZGF0aW9uRXJyb3JzLFxyXG59IGZyb20gJy4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL3V0aWxzL2dldC1nbG9iYWwudXRpbCc7XHJcbmltcG9ydCB7XHJcbiAgZ2V0R2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuICBnZXRHbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zU3ViamVjdCxcclxufSBmcm9tICcuL3V0aWxzL2dsb2JhbC1keW5hbWljLWZvcm0tYnVpbGRlci1vcHRpb25zJztcclxuaW1wb3J0IHtcclxuICBjb2xsZWN0RHluYW1pY0Zvcm1Hcm91cEVycm9ycyxcclxuICBpc1ByaW1pdGl2ZUNsYXNzLFxyXG4gIGlzUHJpbWl0aXZlVHlwZSxcclxuICBtZXJnZUVycm9ycyxcclxuICByZWN1cnNpdmVSZW1vdmVEeW5hbWljQ29udHJvbE9wdGlvbnMsXHJcbiAgcmVwbGFjZUxhc3RQcm9wZXJ0eVRvRHluYW1pY0NvbnRyb2xPcHRpb25zQnlEb3RQYXRoLFxyXG4gIHNldER5bmFtaWNDb250cm9sT3B0aW9ucyxcclxuICB0cmFuc2Zvcm1DbGFzc1ZhbGlkYXRvckVycm9yc1RvU2hvcnRWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIHRyYW5zZm9ybVZhbGlkYXRpb25FcnJvcnNUb0NsYXNzVmFsaWRhdG9yRXJyb3JzLFxyXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm1Db250cm9sczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHtcclxuICBjbGFzc1R5cGUsXHJcbiAgZm9ybUJ1aWxkZXIsXHJcbiAgZm9ybSxcclxuICByb290Rm9ybUdyb3VwLFxyXG4gIG1ldGFkYXRhLFxyXG4gIGRlZmF1bHRWYWx1ZSxcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG59OiB7XHJcbiAgY2xhc3NUeXBlOiBDbGFzc0NvbnN0cnVjdG9yPFQ+IHwgbnVsbDtcclxuICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyO1xyXG4gIGZvcm0/OiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcm9vdEZvcm1Hcm91cD86IER5bmFtaWNGb3JtR3JvdXA8YW55PjtcclxuICBtZXRhZGF0YT86IElEeW5hbWljQ29udHJvbE1ldGFkYXRhO1xyXG4gIGRlZmF1bHRWYWx1ZTogRGVlcFBhcnRpYWw8VD47XHJcbiAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucz86IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD47XHJcbn0pOiBEeW5hbWljRm9ybUdyb3VwPFQ+IHtcclxuICBjb25zdCBpc1Jvb3QgPSAhcm9vdEZvcm1Hcm91cDtcclxuXHJcbiAgbGV0IGR5bmFtaWNGb3JtID0gZm9ybSBhcyBEeW5hbWljRm9ybUdyb3VwPFQ+O1xyXG5cclxuICBpZiAoIWR5bmFtaWNGb3JtKSB7XHJcbiAgICBkeW5hbWljRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHt9KSBhcyBEeW5hbWljRm9ybUdyb3VwPFQ+O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzUm9vdCkge1xyXG4gICAgcm9vdEZvcm1Hcm91cCA9IGR5bmFtaWNGb3JtO1xyXG4gICAgc2V0dXBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+KHtcclxuICAgICAgZHluYW1pY0Zvcm0sXHJcbiAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zIHx8IHJvb3RGb3JtR3JvdXA/LmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMpIHtcclxuICAgIHNldHVwQ2xhc3NUcmFuc2Zvcm1NZXRhZGF0YTxUPih7XHJcbiAgICAgIGNsYXNzVHlwZSxcclxuICAgICAgZHluYW1pY0Zvcm0sXHJcbiAgICAgIGRlZmF1bHRNZXRhZGF0YTogbWV0YWRhdGEsXHJcbiAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM6XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zIHx8IHJvb3RGb3JtR3JvdXAhLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUFsbEZvcm1Hcm91cENoaWxkcmVuQ29udHJvbHM8VD4oe1xyXG4gICAgZHluYW1pY0Zvcm0sXHJcbiAgICBkZWZhdWx0VmFsdWUsXHJcbiAgICBmb3JtQnVpbGRlcixcclxuICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gIH0pO1xyXG5cclxuICBhZGREeW5hbWljTWV0aG9kc1RvRm9ybUdyb3VwPFQ+KGR5bmFtaWNGb3JtKTtcclxuXHJcbiAgaWYgKGlzUm9vdCkge1xyXG4gICAgc3Vic2NyaWJlVG9Sb290Rm9ybUdyb3VwVmFsdWVDaGFuZ2VzPFQ+KGR5bmFtaWNGb3JtKTtcclxuICAgIHN1YnNjcmliZVRvR2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0NoYW5nZTxUPihcclxuICAgICAgZm9ybUJ1aWxkZXIsXHJcbiAgICAgIGR5bmFtaWNGb3JtXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBhZGREeW5hbWljTWV0aG9kc1RvUm9vdEZvcm1Hcm91cDxUPih7XHJcbiAgICAgIGR5bmFtaWNGb3JtLFxyXG4gICAgICByb290Rm9ybUdyb3VwLFxyXG4gICAgICBmb3JtQnVpbGRlcixcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZHluYW1pY0Zvcm07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVzRm9yQ29udHJvbHM8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gIGZvcm06IER5bmFtaWNGb3JtR3JvdXA8VD4sXHJcbiAgdmFsdWU6IFRcclxuKSB7XHJcbiAgY29uc3QgbWV0YWRhdGE6IElEeW5hbWljQ29udHJvbE1ldGFkYXRhID0gZm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhO1xyXG4gIGlmICghbWV0YWRhdGEpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihgY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YSBub3QgZm91bmQgaW4gZm9ybSBncm91cGApO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICBtZXRhZGF0YS5jbGFzc1R5cGUgJiZcclxuICAgICFpc1ByaW1pdGl2ZUNsYXNzKG1ldGFkYXRhLmNsYXNzVHlwZSkgJiZcclxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBtZXRhZGF0YS5jbGFzc1R5cGUpXHJcbiAgKSB7XHJcbiAgICAvLyBuZWVkIGZvciBtdWx0aSB0eXBlc1xyXG4gICAgaWYgKFxyXG4gICAgICBtZXRhZGF0YS53aXRoQW5jZXN0b3JzICYmXHJcbiAgICAgIG1ldGFkYXRhLnBhcmVudD8uY2xhc3NUeXBlICYmXHJcbiAgICAgIG1ldGFkYXRhLnByb3BlcnR5TmFtZVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGlzQXJyYXkgPVxyXG4gICAgICAgIG1ldGFkYXRhLnBhcmVudC5wcm9wZXJ0aWVzLmZpbmQoXHJcbiAgICAgICAgICAocHJvcCkgPT4gcHJvcC5wcm9wZXJ0eU5hbWUgPT09IG1ldGFkYXRhLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICk/LmlzQXJyYXkgfHwgZmFsc2U7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIGNvbnN0IHBhcmVudENsYXNzVHlwZTogYW55ID0gbWV0YWRhdGEucGFyZW50LmNsYXNzVHlwZTtcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgY29uc3QgcGFyZW50T2JqZWN0OiBhbnkgPSB7XHJcbiAgICAgICAgW21ldGFkYXRhLnByb3BlcnR5TmFtZV06IGlzQXJyYXkgPyBbdmFsdWVdIDogdmFsdWUsXHJcbiAgICAgIH07XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIGNvbnN0IHBhcmVudEpzb246IGFueSA9IHBsYWluVG9JbnN0YW5jZShcclxuICAgICAgICBwYXJlbnRDbGFzc1R5cGUsXHJcbiAgICAgICAgcGFyZW50T2JqZWN0LFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgKGZvcm0ucm9vdCBhcyBEeW5hbWljRm9ybUdyb3VwPGFueT4pLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNcclxuICAgICAgICAgIC5jbGFzc1RyYW5zZm9ybU9wdGlvbnNcclxuICAgICAgKTtcclxuICAgICAgdmFsdWUgPSBpc0FycmF5XHJcbiAgICAgICAgPyBwYXJlbnRKc29uW21ldGFkYXRhLnByb3BlcnR5TmFtZV1bMF1cclxuICAgICAgICA6IHBhcmVudEpzb25bbWV0YWRhdGEucHJvcGVydHlOYW1lXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhbHVlID0gcGxhaW5Ub0luc3RhbmNlKFxyXG4gICAgICAgIG1ldGFkYXRhLmNsYXNzVHlwZSxcclxuICAgICAgICB2YWx1ZSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIChmb3JtLnJvb3QgYXMgRHluYW1pY0Zvcm1Hcm91cDxhbnk+KS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zXHJcbiAgICAgICAgICAuY2xhc3NUcmFuc2Zvcm1PcHRpb25zXHJcbiAgICAgICkgYXMgVDtcclxuICAgIH1cclxuICB9XHJcbiAgbWV0YWRhdGEucHJvcGVydGllcy5mb3JFYWNoKChtZXRhZGF0YUl0ZW0pID0+IHtcclxuICAgIGlmICghbWV0YWRhdGFJdGVtLmlnbm9yZSkge1xyXG4gICAgICBpZiAobWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgIGlmICghbWV0YWRhdGFJdGVtLmlnbm9yZSkge1xyXG4gICAgICAgICAgaWYgKCFtZXRhZGF0YUl0ZW0uaXNBcnJheSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgIF0gYXMgVW50eXBlZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgIW1ldGFkYXRhSXRlbS5jbGFzc1R5cGUgfHxcclxuICAgICAgICAgICAgICBpc1ByaW1pdGl2ZUNsYXNzKG1ldGFkYXRhSXRlbS5jbGFzc1R5cGUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfHwge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgID8gKHZhbHVlIGFzIG5ldmVyKVttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXVxyXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgbWV0YWRhdGFJdGVtLCBmb3JtIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc2V0VmFsdWVzRm9yQ29udHJvbHMoXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLFxyXG4gICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdIGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgID8gKHZhbHVlIGFzIG5ldmVyKVttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXVxyXG4gICAgICAgICAgICAgICAgICAgIDoge31cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgbWV0YWRhdGFJdGVtLCBmb3JtIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlDb250cm9sID0gZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgIF0gYXMgRHluYW1pY0Zvcm1BcnJheTtcclxuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBhcnJheUNvbnRyb2w/LmNsYXNzVHJhbnNmb3JtTWV0YWRhdGE/LmlzQXJyYXkgJiZcclxuICAgICAgICAgICAgICBhcnJheUNvbnRyb2w/LmNvbnRyb2xzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGZvcm1BcnJheUxlbmd0aCA9IGFycmF5Q29udHJvbC5jb250cm9scy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgd2hpbGUgKGZvcm1BcnJheUxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlDb250cm9sLnJlbW92ZUF0KDApO1xyXG4gICAgICAgICAgICAgICAgZm9ybUFycmF5TGVuZ3RoLS07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgIW1ldGFkYXRhSXRlbS5jbGFzc1R5cGUgfHxcclxuICAgICAgICAgICAgICBpc1ByaW1pdGl2ZUNsYXNzKG1ldGFkYXRhSXRlbS5jbGFzc1R5cGUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICAgIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgID8gKHZhbHVlIGFzIG5ldmVyKVttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXVxyXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCkgfHwgW11cclxuICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoaXRlbTogbmV2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheUNvbnRyb2wucHVzaChmb3JtQnVpbGRlci5jb250cm9sKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgbWV0YWRhdGFJdGVtLCBmb3JtIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgICAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8fCB7fSxcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICA/ICh2YWx1ZSBhcyBuZXZlcilbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV1cclxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpIHx8IFtdXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGZvciBtdWx0aSB0eXBlc1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1LZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhSXRlbS53aXRoQW5jZXN0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydGllcy5mb3JFYWNoKChwcm9wKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLnByb3BlcnR5TmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtS2V5cy5pbmNsdWRlcyhwcm9wLnByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVtwcm9wLnByb3BlcnR5TmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbHMoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1R5cGU6IG1ldGFkYXRhSXRlbS5jbGFzc1R5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXA6IGZvcm0ucm9vdCBhcyBEeW5hbWljRm9ybUdyb3VwPFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yb290IGFzIER5bmFtaWNGb3JtR3JvdXA8dW5rbm93biwgdW5rbm93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcnJheUNvbnRyb2wucHVzaChjb250cm9sKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeyBlcnIsIG1ldGFkYXRhSXRlbSwgZm9ybSB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbGlkYXRvcnNUb0NvbnRyb2xzPFQ+KFxyXG4gIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cDxUPixcclxuICByb290Rm9ybUdyb3VwPzogRHluYW1pY0Zvcm1Hcm91cDxUPlxyXG4pIHtcclxuICBpZiAoIXJvb3RGb3JtR3JvdXApIHtcclxuICAgIHJvb3RGb3JtR3JvdXAgPSBmb3JtLnJvb3QgYXMgRHluYW1pY0Zvcm1Hcm91cDxUPjtcclxuICB9XHJcblxyXG4gIGFkZENvbW1vbkFzeW5jVmFsaWRhdG9yVG9Sb290Rm9ybShyb290Rm9ybUdyb3VwKTtcclxuXHJcbiAgY29uc3QgbWV0YWRhdGE6IElEeW5hbWljQ29udHJvbE1ldGFkYXRhID0gZm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhO1xyXG4gIGlmICghbWV0YWRhdGEpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YSBub3QgZm91bmQgaW4gZm9ybSBncm91cCcpO1xyXG4gIH1cclxuXHJcbiAgbWV0YWRhdGEucHJvcGVydGllcy5mb3JFYWNoKChtZXRhZGF0YUl0ZW0pID0+IHtcclxuICAgIGlmICghbWV0YWRhdGFJdGVtLmlnbm9yZSAmJiBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lKSB7XHJcbiAgICAgIGlmICghbWV0YWRhdGFJdGVtLmlzQXJyYXkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhbWV0YWRhdGFJdGVtLmNsYXNzVHlwZSB8fFxyXG4gICAgICAgICAgaXNQcmltaXRpdmVDbGFzcyhtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKCFyb290Rm9ybUdyb3VwPy5jb21tb25Bc3luY1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbW1vbkFzeW5jVmFsaWRhdG9yIG5vdCBzZXQnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgKFxyXG4gICAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1ttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXSBhcyBEeW5hbWljRm9ybUNvbnRyb2xcclxuICAgICAgICAgICAgICApLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEgPSBtZXRhZGF0YUl0ZW07XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgIWZvcm0uY29udHJvbHNbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0uaGFzQXN5bmNWYWxpZGF0b3IoXHJcbiAgICAgICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAuY29tbW9uQXN5bmNWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0uc2V0QXN5bmNWYWxpZGF0b3JzKFxyXG4gICAgICAgICAgICAgICAgICByb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICApOyAvKlxyXG4gICAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgICAgICAgbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICAgICAgXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7Ki9cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChyb290Rm9ybUdyb3VwLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuYW5ndWxhclZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgYW5ndWxhckZvcm1WYWxpZGF0b3JQYXRoIH0gPSBmaW5kQ29udHJvbFBhdGhzKFxyXG4gICAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5ndWxhclZhbGlkYXRvcnMgPSBsb2Rhc2hHZXQoXHJcbiAgICAgICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAuZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucy5hbmd1bGFyVmFsaWRhdG9ycyxcclxuICAgICAgICAgICAgICAgICAgYW5ndWxhckZvcm1WYWxpZGF0b3JQYXRoXHJcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXJWYWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXJWYWxpZGF0b3JzLmFzeW5jVmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycyA9IGFuZ3VsYXJWYWxpZGF0b3JzLmFzeW5jVmFsaWRhdG9ycztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFzeW5jVmFsaWRhdG9ycyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzID0gW2FzeW5jVmFsaWRhdG9yc107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID1cclxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyVmFsaWRhdG9ycz8udmFsaWRhdG9ycyB8fCBhbmd1bGFyVmFsaWRhdG9ycztcclxuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3JzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycyA9IFt2YWxpZGF0b3JzXTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdLnNldEFzeW5jVmFsaWRhdG9ycyhbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uYXN5bmNWYWxpZGF0b3JzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRvcnNcclxuICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcclxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0b3I6IFZhbGlkYXRvckZuKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsaWRhdG9yKGNvbnRyb2wpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICByb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yLFxyXG4gICAgICAgICAgICAgICAgICBdKTsgLypcclxuICAgICAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1tcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICAgICAgICAgIF0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOyovXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeyBlcnIsIG1ldGFkYXRhSXRlbSwgZm9ybSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc2V0VmFsaWRhdG9yc1RvQ29udHJvbHMoXHJcbiAgICAgICAgICAgICAgZm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1ttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXSBhcyBEeW5hbWljRm9ybUdyb3VwPFQ+LFxyXG4gICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgbWV0YWRhdGFJdGVtLCBmb3JtIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhbWV0YWRhdGFJdGVtLmNsYXNzVHlwZSB8fFxyXG4gICAgICAgICAgaXNQcmltaXRpdmVDbGFzcyhtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKCFyb290Rm9ybUdyb3VwPy5jb21tb25Bc3luY1ZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbW1vbkFzeW5jVmFsaWRhdG9yIG5vdCBzZXQnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gKFxyXG4gICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0gYXMgRHluYW1pY0Zvcm1BcnJheVxyXG4gICAgICAgICAgICApLmNvbnRyb2xzO1xyXG4gICAgICAgICAgICAoIUFycmF5LmlzQXJyYXkoY29udHJvbHMpICYmIG1ldGFkYXRhSXRlbS5pc0FycmF5XHJcbiAgICAgICAgICAgICAgPyBbXVxyXG4gICAgICAgICAgICAgIDogY29udHJvbHNcclxuICAgICAgICAgICAgKS5mb3JFYWNoKChjb250cm9sLCBwcm9wZXJ0eUluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Hcm91cCkuY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhSXRlbSxcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5SW5kZXgsXHJcbiAgICAgICAgICAgICAgICBpc0FycmF5OiBmYWxzZSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIGlmICghcm9vdEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhY29udHJvbC5oYXNBc3luY1ZhbGlkYXRvcihyb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMocm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICAvKiBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsgKi9cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXJvb3RGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcigncm9vdEZvcm1Hcm91cCBub3Qgc2V0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICEoXHJcbiAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdIGFzIER5bmFtaWNGb3JtQXJyYXlcclxuICAgICAgICAgICAgICApLmhhc0FzeW5jVmFsaWRhdG9yKHJvb3RGb3JtR3JvdXAuY29tbW9uQXN5bmNWYWxpZGF0b3IpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIChcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0gYXMgRHluYW1pY0Zvcm1BcnJheVxyXG4gICAgICAgICAgICAgICkuc2V0QXN5bmNWYWxpZGF0b3JzKHJvb3RGb3JtR3JvdXAuY29tbW9uQXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgIC8qIChcclxuICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHNbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0gYXMgRHluYW1pY0Zvcm1BcnJheVxyXG4gICAgICAgICAgICAgICkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOyAqL1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeyBlcnIsIG1ldGFkYXRhSXRlbSwgZm9ybSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSAoXHJcbiAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1ttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXSBhcyBEeW5hbWljRm9ybUFycmF5XHJcbiAgICAgICAgICAgICkuY29udHJvbHM7XHJcbiAgICAgICAgICAgICghQXJyYXkuaXNBcnJheShjb250cm9scykgJiYgbWV0YWRhdGFJdGVtLmlzQXJyYXlcclxuICAgICAgICAgICAgICA/IFtdXHJcbiAgICAgICAgICAgICAgOiBjb250cm9sc1xyXG4gICAgICAgICAgICApLmZvckVhY2goKGNvbnRyb2wsIHByb3BlcnR5SW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAoY29udHJvbCBhcyBEeW5hbWljRm9ybUdyb3VwKS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgLi4ubWV0YWRhdGFJdGVtLFxyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlJbmRleCxcclxuICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZSB8fCB7fTtcclxuICAgICAgICAgICAgICAvLyBuZWVkZWQgZm9yIGV4dGVuZCBjb250cm9scyBpZiBpdCBkb2VzIG5vdCBleGlzdHMsIGJ1dCB0aGUgdmFsdWUgaGFzIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lXHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFJdGVtLmNsYXNzVHlwZSAmJlxyXG4gICAgICAgICAgICAgICAgIWlzUHJpbWl0aXZlVHlwZShtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlKSAmJlxyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFJdGVtLnByb3BlcnRpZXMubGVuZ3RoID5cclxuICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29udHJvbFZhbHVlKS5sZW5ndGhcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhSXRlbS5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3AucHJvcGVydHlOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AuY2xhc3NUeXBlICYmICFpc1ByaW1pdGl2ZVR5cGUocHJvcC5jbGFzc1R5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWVbcHJvcC5wcm9wZXJ0eU5hbWVdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICEoY29udHJvbCBhcyBEeW5hbWljRm9ybUdyb3VwPGFueSwgYW55PikuY29udHJvbHNbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXA8YW55LCBhbnk+KS5hZGRDb250cm9sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLmdyb3VwKGNvbnRyb2xWYWx1ZVtwcm9wLnByb3BlcnR5TmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmlzQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlW3Byb3AucHJvcGVydHlOYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Hcm91cDxhbnksIGFueT4pLmNvbnRyb2xzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Hcm91cDxhbnksIGFueT4pLmFkZENvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLmFycmF5KGNvbnRyb2xWYWx1ZVtwcm9wLnByb3BlcnR5TmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlW3Byb3AucHJvcGVydHlOYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoY29udHJvbCBhcyBEeW5hbWljRm9ybUdyb3VwPGFueSwgYW55PikuY29udHJvbHNbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbCBhcyBEeW5hbWljRm9ybUdyb3VwPGFueSwgYW55PikuYWRkQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUJ1aWxkZXIuY29udHJvbChjb250cm9sVmFsdWVbcHJvcC5wcm9wZXJ0eU5hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgc2V0VmFsdWVzRm9yQ29udHJvbHMoXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLFxyXG4gICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgICAgICAgICAgICBjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXA8YW55LCBhbnk+LFxyXG4gICAgICAgICAgICAgICAgICBjb250cm9sVmFsdWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHNldFZhbGlkYXRvcnNUb0NvbnRyb2xzKFxyXG4gICAgICAgICAgICAgICAgZm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXA8VD4sXHJcbiAgICAgICAgICAgICAgICByb290Rm9ybUdyb3VwXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBpZiAoIXJvb3RGb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdyb290Rm9ybUdyb3VwIG5vdCBzZXQnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgIWNvbnRyb2wuaGFzQXN5bmNWYWxpZGF0b3Iocm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvcilcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHJvb3RGb3JtR3JvdXAuY29tbW9uQXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgLyogY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7ICovXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAhKFxyXG4gICAgICAgICAgICAgICAgZm9ybS5jb250cm9sc1ttZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXSBhcyBEeW5hbWljRm9ybUFycmF5XHJcbiAgICAgICAgICAgICAgKS5oYXNBc3luY1ZhbGlkYXRvcihyb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAoXHJcbiAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdIGFzIER5bmFtaWNGb3JtQXJyYXlcclxuICAgICAgICAgICAgICApLnNldEFzeW5jVmFsaWRhdG9ycyhyb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAvKiAoXHJcbiAgICAgICAgICAgICAgICBmb3JtLmNvbnRyb2xzW21ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVdIGFzIER5bmFtaWNGb3JtQXJyYXlcclxuICAgICAgICAgICAgICApLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsgKi9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgZXJyLCBtZXRhZGF0YUl0ZW0sIGZvcm0gfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFsbEZvcm1GaWVsZHMoZm9ybTogVW50eXBlZEZvcm1Hcm91cCkge1xyXG4gIGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsO1xyXG4gIGxldCBmb3JtQXJyYXlDb250cm9sc0xlbmd0aDogbnVtYmVyO1xyXG4gIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICBjb250cm9sID0gZm9ybS5nZXQoZmllbGQpO1xyXG5cclxuICAgIC8vIENvbnRyb2xcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Db250cm9sKSB7XHJcbiAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gR3JvdXA6IHJlY3Vyc2l2ZVxyXG4gICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcclxuICAgICAgdmFsaWRhdGVBbGxGb3JtRmllbGRzKGNvbnRyb2wpO1xyXG4gICAgfVxyXG4gICAgLy8gQXJyYXlcclxuICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XHJcbiAgICAgIGZvcm1BcnJheUNvbnRyb2xzTGVuZ3RoID0gKGNvbnRyb2wgYXMgVW50eXBlZEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1BcnJheUNvbnRyb2xzTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBDb250cm9sIGluIEFycmF5XHJcbiAgICAgICAgaWYgKChjb250cm9sIGFzIFVudHlwZWRGb3JtQXJyYXkpLmNvbnRyb2xzW2ldIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgICAoKGNvbnRyb2wgYXMgVW50eXBlZEZvcm1BcnJheSkuY29udHJvbHNbaV0gYXMgVW50eXBlZEZvcm1Db250cm9sKS5tYXJrQXNUb3VjaGVkKHtcclxuICAgICAgICAgICAgb25seVNlbGY6IHRydWUsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR3JvdXAgaW4gQXJyYXk6IHJlY3Vyc2l2ZVxyXG4gICAgICAgIGlmICgoY29udHJvbCBhcyBVbnR5cGVkRm9ybUFycmF5KS5jb250cm9sc1tpXSBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcclxuICAgICAgICAgIHZhbGlkYXRlQWxsRm9ybUZpZWxkcyhcclxuICAgICAgICAgICAgKGNvbnRyb2wgYXMgVW50eXBlZEZvcm1BcnJheSkuY29udHJvbHNbaV0gYXMgVW50eXBlZEZvcm1Hcm91cFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuLy8gY3VzdG9tOiBnZXRNZXRhZGF0YSBhcmdzIGhhdmUgYmVlbiBjaGFuZ2VkLiBCZWZvcmUgb3B0aW9uYWwgcGFyYW1ldGVycywgdGhlc2Ugd2VyZSBhZGRlZDpcclxuLy8gZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc1xyXG4vLyBjdXJyZW50RGVwdGhcclxuLy8gcHJvcGVydHlQYXRoXHJcbmZ1bmN0aW9uIGdldE1ldGFkYXRhKFxyXG4gIGNsYXNzVHlwZTogQ2xhc3NDb25zdHJ1Y3Rvcjx1bmtub3duPixcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPGFueT4sXHJcbiAgY3VycmVudERlcHRoOm51bWJlcixcclxuICBjdXJyZW50UGF0aDpzdHJpbmdbXSxcclxuICBjbGFzc1RyYW5zZm9ybU9wdGlvbnM/OiBEeW5hbWljQ2xhc3NUcmFuc2Zvcm1PcHRpb25zLFxyXG4gIGlzUm9vdD86Ym9vbGVhbixcclxuKTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGEge1xyXG5cdGNvbnN0IGNsYXNzVHJhbnNmb3JtZXJNZXRhZGF0YVN0b3JhZ2UgPVxyXG5cdCAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuXHQgZ2V0R2xvYmFsKClbJ2NsYXNzVHJhbnNmb3JtZXJNZXRhZGF0YVN0b3JhZ2UnXSB8fCB1bmRlZmluZWQ7XHJcblx0aWYgKCFjbGFzc1RyYW5zZm9ybWVyTWV0YWRhdGFTdG9yYWdlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICdjbGFzc1RyYW5zZm9ybWVyTWV0YWRhdGFTdG9yYWdlIG5vdCBzZXQgaW4gd2luZG93cywgcGxlYXNlIHVzZSB0aGUgXCJjbGFzcy10cmFuc2Zvcm1lci1nbG9iYWwtc3RvcmFnZVwiIGluc3RlYWQgb2YgXCJjbGFzcy10cmFuc2Zvcm1lclwiJ1xyXG4gICAgKTtcclxuICB9XHJcbiAgY29uc3QgY2xhc3NWYWxpZGF0b3JNZXRhZGF0YVN0b3JhZ2UgPVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGdldEdsb2JhbCgpWydjbGFzc1ZhbGlkYXRvck1ldGFkYXRhU3RvcmFnZSddIHx8IHVuZGVmaW5lZDtcclxuICAgIC8vICh3aW5kb3cgYXMgYW55KVsnY2xhc3NWYWxpZGF0b3JNZXRhZGF0YVN0b3JhZ2UnXSB8fCB1bmRlZmluZWQ7XHJcbiAgaWYgKCFjbGFzc1ZhbGlkYXRvck1ldGFkYXRhU3RvcmFnZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzc1ZhbGlkYXRvck1ldGFkYXRhU3RvcmFnZSBub3Qgc2V0IGluIHdpbmRvd3MnKTtcclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgbGV0IGV4cG9zZVByb3BlcnRpZXM6IGFueVtdID0gW107XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBsZXQgZXhjbHVkZVByb3BlcnRpZXM6IGFueVtdID0gW107XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBsZXQgcHJldk11bHRpVHlwZXM6IGFueVtdIHwgbnVsbCA9IFtdO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgbGV0IG11bHRpVHlwZXM6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcblxyXG4gIC8vIG5lZWQgZm9yIGNyZWF0ZSBhbGwgbGluayBmb3IgbXVsdGkgdHlwZXNcclxuICBpZiAoaXNSb290KSB7XHJcbiAgICB3aGlsZSAoXHJcbiAgICAgICFwcmV2TXVsdGlUeXBlcyB8fFxyXG4gICAgICAhbXVsdGlUeXBlcyB8fFxyXG4gICAgICBwcmV2TXVsdGlUeXBlcy5sZW5ndGggIT09IG11bHRpVHlwZXMubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgcHJldk11bHRpVHlwZXMgPSBtdWx0aVR5cGVzO1xyXG4gICAgICBwbGFpblRvSW5zdGFuY2UoY2xhc3NUeXBlLCB7fSwgY2xhc3NUcmFuc2Zvcm1PcHRpb25zKTtcclxuICAgICAgbXVsdGlUeXBlcyA9IEFycmF5LmZyb20oY2xhc3NUcmFuc2Zvcm1lck1ldGFkYXRhU3RvcmFnZS5fdHlwZU1ldGFkYXRhcylcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIC5tYXAoKG1ldGE6IGFueSkgPT5cclxuICAgICAgICAgIEFycmF5LmZyb20obWV0YVsxXSlcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgLmZpbHRlcigoc3ViOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gc3ViWzFdLm9wdGlvbnMuZGlzY3JpbWluYXRvcjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgLm1hcCgoc3ViOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4geyAuLi5zdWJbMV0sIC4uLnN1YlsxXS5vcHRpb25zLmRpc2NyaW1pbmF0b3IgfTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLmZpbHRlcigoYXJyKSA9PiBhcnIubGVuZ3RoID4gMClcclxuICAgICAgICAubWFwKChhcnIpID0+XHJcbiAgICAgICAgICBhcnIubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgICBjbGFzc1R5cGU6IGl0ZW0udGFyZ2V0LFxyXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGl0ZW0ucHJvcGVydHlOYW1lLFxyXG4gICAgICAgICAgICB0eXBlczogaXRlbS5zdWJUeXBlcyxcclxuICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0ucHJvcGVydHksXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICApXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAucmVkdWNlKChhbGw6IGFueSwgY3VyOiBhbnkpID0+IFsuLi5hbGwsIC4uLmN1cl0sIFtdKTtcclxuICAgICAgKG11bHRpVHlwZXMgfHwgW10pLmZvckVhY2goKG11bHRpVHlwZSkgPT5cclxuICAgICAgICBtdWx0aVR5cGUudHlwZXMuZm9yRWFjaCgodHlwZTogeyBuYW1lOiBzdHJpbmcgfSkgPT5cclxuICAgICAgICAgIHBsYWluVG9JbnN0YW5jZShcclxuICAgICAgICAgICAgbXVsdGlUeXBlLmNsYXNzVHlwZSxcclxuICAgICAgICAgICAgeyBbbXVsdGlUeXBlLnByb3BlcnR5TmFtZV06IHsgW211bHRpVHlwZS5wcm9wZXJ0eV06IHR5cGUubmFtZSB9IH0sXHJcbiAgICAgICAgICAgIGNsYXNzVHJhbnNmb3JtT3B0aW9uc1xyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgZXhwb3NlUHJvcGVydGllcyA9XHJcbiAgICAgICAgY2xhc3NUcmFuc2Zvcm1lck1ldGFkYXRhU3RvcmFnZS5nZXRFeHBvc2VkTWV0YWRhdGFzKGNsYXNzVHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJldk11bHRpVHlwZXMgPSBbXTtcclxuICAgIG11bHRpVHlwZXMgPSBudWxsO1xyXG4gICAgLy8gbmVlZCBmb3IgY3JlYXRlIGFsbCBsaW5rIGZvciBtdWx0aSB0eXBlc1xyXG4gICAgd2hpbGUgKFxyXG4gICAgICAhcHJldk11bHRpVHlwZXMgfHxcclxuICAgICAgIW11bHRpVHlwZXMgfHxcclxuICAgICAgcHJldk11bHRpVHlwZXMubGVuZ3RoICE9PSBtdWx0aVR5cGVzLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIHByZXZNdWx0aVR5cGVzID0gbXVsdGlUeXBlcztcclxuICAgICAgcGxhaW5Ub0luc3RhbmNlKGNsYXNzVHlwZSwge30sIGNsYXNzVHJhbnNmb3JtT3B0aW9ucyk7XHJcbiAgICAgIG11bHRpVHlwZXMgPSBBcnJheS5mcm9tKGNsYXNzVHJhbnNmb3JtZXJNZXRhZGF0YVN0b3JhZ2UuX2V4Y2x1ZGVNZXRhZGF0YXMpXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAubWFwKChtZXRhOiBhbnkpID0+XHJcbiAgICAgICAgICBBcnJheS5mcm9tKG1ldGFbMV0pXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHN1YjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHN1YlsxXS5vcHRpb25zLmRpc2NyaW1pbmF0b3I7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgICAgIC5tYXAoKHN1YjogYW55KSA9PiAoeyAuLi5zdWJbMV0sIC4uLnN1YlsxXS5vcHRpb25zLmRpc2NyaW1pbmF0b3IgfSkpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5maWx0ZXIoKGFycikgPT4gYXJyLmxlbmd0aCA+IDApXHJcbiAgICAgICAgLm1hcCgoYXJyKSA9PlxyXG4gICAgICAgICAgYXJyLm1hcCgoaXRlbSkgPT4gKHtcclxuICAgICAgICAgICAgY2xhc3NUeXBlOiBpdGVtLnRhcmdldCxcclxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBpdGVtLnByb3BlcnR5TmFtZSxcclxuICAgICAgICAgICAgdHlwZXM6IGl0ZW0uc3ViVHlwZXMsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxyXG4gICAgICAgICAgfSkpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgLnJlZHVjZSgoYWxsOiBhbnksIGN1cjogYW55KSA9PiBbLi4uYWxsLCAuLi5jdXJdLCBbXSk7XHJcbiAgICAgIChtdWx0aVR5cGVzIHx8IFtdKS5mb3JFYWNoKChtdWx0aVR5cGUpID0+XHJcbiAgICAgICAgbXVsdGlUeXBlLnR5cGVzLmZvckVhY2goKHR5cGU6IHsgbmFtZTogc3RyaW5nIH0pID0+XHJcbiAgICAgICAgICBwbGFpblRvSW5zdGFuY2UoXHJcbiAgICAgICAgICAgIG11bHRpVHlwZS5jbGFzc1R5cGUsXHJcbiAgICAgICAgICAgIHsgW211bHRpVHlwZS5wcm9wZXJ0eU5hbWVdOiB7IFttdWx0aVR5cGUucHJvcGVydHldOiB0eXBlLm5hbWUgfSB9LFxyXG4gICAgICAgICAgICBjbGFzc1RyYW5zZm9ybU9wdGlvbnNcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICAgIGV4Y2x1ZGVQcm9wZXJ0aWVzID1cclxuICAgICAgICBjbGFzc1RyYW5zZm9ybWVyTWV0YWRhdGFTdG9yYWdlLmdldEV4Y2x1ZGVkTWV0YWRhdGFzKGNsYXNzVHlwZSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGV4cG9zZVByb3BlcnRpZXMgPVxyXG4gICAgICBjbGFzc1RyYW5zZm9ybWVyTWV0YWRhdGFTdG9yYWdlLmdldEV4cG9zZWRNZXRhZGF0YXMoY2xhc3NUeXBlKTtcclxuICAgIGV4Y2x1ZGVQcm9wZXJ0aWVzID1cclxuICAgICAgY2xhc3NUcmFuc2Zvcm1lck1ldGFkYXRhU3RvcmFnZS5nZXRFeGNsdWRlZE1ldGFkYXRhcyhjbGFzc1R5cGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gbmVlZCBmb3Igc3VwcG9ydCBhbmNlc3RvcnMgbXVsdGlwbGUgdHlwZXMgb2YgZm9ybSBncm91cFxyXG4gIGNvbnN0IGFuY2VzdG9yc1Byb3BlcnRpZXMgPSBbXHJcbiAgICBBcnJheS5mcm9tKGNsYXNzVHJhbnNmb3JtZXJNZXRhZGF0YVN0b3JhZ2UuX2FuY2VzdG9yc01hcClcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtWzFdWzBdID09PSBjbGFzc1R5cGUpXHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT5cclxuICAgICAgICBjbGFzc1RyYW5zZm9ybWVyTWV0YWRhdGFTdG9yYWdlLmdldEV4cG9zZWRNZXRhZGF0YXMoaXRlbVswXSlcclxuICAgICAgKVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAucmVkdWNlKChhbGw6IGFueSwgY3VyOiBhbnkpID0+IFsuLi5hbGwsIC4uLmN1cl0sIFtdKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBwcm9wZXJ0aWVzID0gW1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIC4uLmV4cG9zZVByb3BlcnRpZXMsXHJcbiAgICAuLi5leGNsdWRlUHJvcGVydGllcyxcclxuICAgIC4uLihhbmNlc3RvcnNQcm9wZXJ0aWVzLmxlbmd0aCA+IDAgPyBhbmNlc3RvcnNQcm9wZXJ0aWVzWzBdIDogW10pLFxyXG4gIF0uZmlsdGVyKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIChleGlzdHNMaW1pdDogYW55LCBleGlzdHNJbmRleDogYW55LCBpdGVtczogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgKGNsYXNzVHJhbnNmb3JtT3B0aW9ucz8uZXhjbHVkZUdyb3Vwc1xyXG4gICAgICAgICAgPyAhY2xhc3NUcmFuc2Zvcm1PcHRpb25zPy5leGNsdWRlR3JvdXBzLmZpbmQoKGV4Y2x1ZGVHcm91cCkgPT5cclxuICAgICAgICAgICAgICBleGlzdHNMaW1pdD8ub3B0aW9ucz8uZ3JvdXBzPy5pbmNsdWRlcyhleGNsdWRlR3JvdXApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIDogdHJ1ZSkgJiZcclxuICAgICAgICBleGlzdHNJbmRleCA9PT1cclxuICAgICAgICAgIGl0ZW1zLmZpbmRJbmRleChcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICAgICAgKGl0OiBhbnkpID0+IGl0LnByb3BlcnR5TmFtZSA9PT0gZXhpc3RzTGltaXQucHJvcGVydHlOYW1lXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgKTtcclxuXHJcbiAgY29uc3QgZGVwdGhMaW1pdEV4Y2VlZGVkID0gY3VycmVudERlcHRoID49IChkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLm1heE5lc3RlZE1vZGVsRGVwdGggYXMgbnVtYmVyKTtcclxuXHJcbiAgcHJvcGVydGllcy5mb3JFYWNoKFxyXG4gICAgKFxyXG4gICAgICBleHBvc2VNZXRhZGF0YUl0ZW06IHtcclxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICAgICAgICB0YXJnZXQ6IENsYXNzQ29uc3RydWN0b3I8dW5rbm93bj47XHJcbiAgICAgIH0sXHJcbiAgICAgIGluZGV4OiBudW1iZXJcclxuICAgICkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9wZXJ0eU1ldGFkYXRhID0gY2xhc3NUcmFuc2Zvcm1lck1ldGFkYXRhU3RvcmFnZS5maW5kVHlwZU1ldGFkYXRhKFxyXG4gICAgICAgIGV4cG9zZU1ldGFkYXRhSXRlbS50YXJnZXQsXHJcbiAgICAgICAgZXhwb3NlTWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZVxyXG4gICAgICApO1xyXG5cclxuXHQgIFxyXG5cdCAgLy8gY3VzdG9tOiBnZXRNZXRhZGF0YSBhcmdzIGhhdmUgYmVlbiBjaGFuZ2VkLiBCZWZvcmUgb3B0aW9uYWwgcGFyYW1ldGVycywgdGhlc2Ugd2VyZSBhZGRlZDpcclxuXHQgIC8vIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNcclxuXHQgIC8vIGN1cnJlbnREZXB0aFxyXG5cdCAgLy8gcHJvcGVydHlQYXRoXHJcblxyXG5cdCAgLy8gb2xkIGltcGxlbWVudGF0aW9uOlxyXG5cdCAgLypcclxuXHQgIGlmIChwcm9wZXJ0eU1ldGFkYXRhKSB7XHJcblx0ICAgIHByb3BlcnRpZXNbaW5kZXhdID0ge1xyXG5cdCAgICAgIC4uLmdldE1ldGFkYXRhKFxyXG5cdCAgICAgICAgcHJvcGVydHlNZXRhZGF0YS50eXBlRnVuY3Rpb24oKSxcclxuXHQgICAgICAgIGNsYXNzVHJhbnNmb3JtT3B0aW9ucyxcclxuXHQgICAgICAgIGZhbHNlXHJcblx0ICAgICAgKSxcclxuXHQgICAgICBpc0FycmF5OiBBcnJheSA9PT0gcHJvcGVydHlNZXRhZGF0YS5yZWZsZWN0ZWRUeXBlLFxyXG5cdCAgICAgIHByb3BlcnR5TmFtZTogZXhwb3NlTWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSxcclxuXHRcdH1cclxuXHQgIH07XHJcblx0ICAqL1xyXG4gICAgICBpZiAocHJvcGVydHlNZXRhZGF0YSkge1xyXG5cdCAgICAvLyBjdXN0b206IHNraXAgaWYgZGVwdGhMaW1pdEV4Y2VlZGVkXHJcblx0XHRpZihkZXB0aExpbWl0RXhjZWVkZWQpIHtcclxuXHRcdCAgY29uc29sZS53YXJuKCduZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIgaGFzIGhpdCBkZXB0aCBsaW1pdCEnLHByb3BlcnR5TWV0YWRhdGEpXHJcblx0XHQgIGRlbGV0ZSBwcm9wZXJ0aWVzW2luZGV4XTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHQgIGNvbnN0IHByb3BlcnR5UGF0aCA9IFsuLi5jdXJyZW50UGF0aCxleHBvc2VNZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lXTtcclxuXHJcblx0XHQgIGNvbnN0IGFzc2lnblByb3BlcnR5ID0gKCkgPT4ge1xyXG5cdFx0XHRwcm9wZXJ0aWVzW2luZGV4XSA9IHtcclxuXHRcdFx0XHQuLi5nZXRNZXRhZGF0YShcclxuXHRcdFx0XHRcdHByb3BlcnR5TWV0YWRhdGEudHlwZUZ1bmN0aW9uKCksXHJcblx0XHRcdFx0XHRkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoKzEsXHJcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXHJcblx0XHRcdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRjdXJyZW50RGVwdGg9PT0wXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRpc0FycmF5OiBBcnJheSA9PT0gcHJvcGVydHlNZXRhZGF0YS5yZWZsZWN0ZWRUeXBlLFxyXG5cdFx0XHRcdHByb3BlcnR5TmFtZTogZXhwb3NlTWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSxcclxuXHRcdFx0ICB9XHJcblx0XHQgIH1cclxuXHRcdCAgLy8gY3VzdG9tOiB0aGlzIGlzIG5ldyBsb2dpYy4gSW5zdGVhZCBvZiBhc3NpZ25pbmcgYWxsLCBcclxuXHRcdCAgLy8gbWV0YWRhdGEgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgaWYgYWxsb3dlZE5lc3RlZE1vZGVscyBhcmUgZGVmaW5lZCBhbmQgZG8gbm90IGluY2x1ZGUgdGhpcyBwcm9wLlxyXG5cdFx0ICBpZighQXJyYXkuaXNBcnJheShkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLmFsbG93ZWROZXN0ZWRNb2RlbHMpKSB7XHJcblx0XHRcdGFzc2lnblByb3BlcnR5KCk7XHJcblx0XHQgIH0gZWxzZSB7XHJcblx0XHQgICAgaWYoZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucy5hbGxvd2VkTmVzdGVkTW9kZWxzLmluY2x1ZGVzKHByb3BlcnR5UGF0aC5qb2luKCcuJykpKSB7XHJcblx0XHRcdFx0YXNzaWduUHJvcGVydHkoKTtcclxuXHRcdCAgICB9IGVsc2Uge1xyXG5cdFx0ICAgICAgZGVsZXRlIHByb3BlcnRpZXNbaW5kZXhdO1xyXG5cdFx0ICAgIH1cclxuXHRcdCAgfVxyXG5cdFx0fVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb3BlcnRpZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgY2xhc3NUeXBlOiBudWxsLFxyXG4gICAgICAgICAgcHJvcGVydGllczogW10sXHJcbiAgICAgICAgICBpc0FycmF5OiBmYWxzZSxcclxuICAgICAgICAgIHByb3BlcnR5TmFtZTogZXhwb3NlTWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IG1ldGFkYXRhID0ge1xyXG4gICAgY2xhc3NUeXBlLFxyXG4gICAgcHJvcGVydGllczpwcm9wZXJ0aWVzLmZpbHRlcihwcm9wPT50eXBlb2YgcHJvcCAhPT0gJ3VuZGVmaW5lZCcpLCAvLyBhcyBlbnRyaWVzIG1heSBoYXZlIGJlZW4gZGVsZXRlZCwgd2UgbmVlZCB0byBmaWx0ZXIgdGhvc2Ugb3V0IHRvIG5vdCBicmVhayBvdGhlciBjb2RlXHJcbiAgICB3aXRoQW5jZXN0b3JzOlxyXG4gICAgICAoYW5jZXN0b3JzUHJvcGVydGllcz8ubGVuZ3RoID4gMCA/IGFuY2VzdG9yc1Byb3BlcnRpZXNbMF0gOiBbXSkubGVuZ3RoID5cclxuICAgICAgMCxcclxuICAgIGlzQXJyYXk6IGZhbHNlLFxyXG4gICAgcHJvcGVydHlOYW1lOiBudWxsLFxyXG4gIH07XHJcblxyXG4gIHJldHVybiBtZXRhZGF0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0dXBDbGFzc1RyYW5zZm9ybU1ldGFkYXRhPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xyXG4gIGRlZmF1bHRNZXRhZGF0YSxcclxuICBjbGFzc1R5cGUsXHJcbiAgZHluYW1pY0Zvcm0sXHJcbiAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxufToge1xyXG4gIGRlZmF1bHRNZXRhZGF0YTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGEgfCB1bmRlZmluZWQ7XHJcbiAgY2xhc3NUeXBlOiBDbGFzc0NvbnN0cnVjdG9yPFQ+IHwgbnVsbDtcclxuICBkeW5hbWljRm9ybTogRHluYW1pY0Zvcm1Hcm91cDxULCBUPjtcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+O1xyXG59KSB7XHJcbiAgaWYgKCFkZWZhdWx0TWV0YWRhdGEgJiYgY2xhc3NUeXBlKSB7XHJcbiAgICBkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhID0gZ2V0TWV0YWRhdGEoXHJcbiAgICAgIGNsYXNzVHlwZSxcclxuICAgICAgZHluYW1pY0Zvcm0uZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuXHQgIDAsXHJcblx0ICBbXSxcclxuICAgICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucy5jbGFzc1RyYW5zZm9ybU9wdGlvbnMsXHJcbiAgICAgIHRydWUsXHJcbiAgICApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhID1cclxuICAgICAgZGVmYXVsdE1ldGFkYXRhIGFzIElEeW5hbWljQ29udHJvbE1ldGFkYXRhO1xyXG4gIH1cclxuICBpZiAoIWR5bmFtaWNGb3JtLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignbWV0YWRhdGEgbm90IHNldCcpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0dXBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xyXG4gIGR5bmFtaWNGb3JtLFxyXG4gIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMsXHJcbn06IHtcclxuICBkeW5hbWljRm9ybTogRHluYW1pY0Zvcm1Hcm91cDxULCBUPjtcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+IHwgdW5kZWZpbmVkO1xyXG59KSB7XHJcbiAgaWYgKCFkeW5hbWljRm9ybSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdkeW5hbWljRm9ybSBub3Qgc2V0Jyk7XHJcbiAgfVxyXG4gIGlmICghZHluYW1pY0Zvcm0uZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucykge1xyXG4gICAgZHluYW1pY0Zvcm0uZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyA9IGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMgfHwge307XHJcbiAgfVxyXG4gIGR5bmFtaWNGb3JtLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NWYWxpZGF0b3JPcHRpb25zID0ge1xyXG4gICAgLi4uKGR5bmFtaWNGb3JtLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NWYWxpZGF0b3JPcHRpb25zIHx8IHt9KSxcclxuICB9O1xyXG4gIGR5bmFtaWNGb3JtLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NUcmFuc2Zvcm1PcHRpb25zID0ge1xyXG4gICAgLi4uREVGQVVMVF9DTEFTU19UUkFOU0ZPUk1fT1BUSU9OUyxcclxuICAgIC4uLihkeW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLmNsYXNzVHJhbnNmb3JtT3B0aW9ucyB8fCB7fSksXHJcbiAgfTtcclxuICBkeW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLmNsYXNzVHJhbnNmb3JtVG9QbGFpbk9wdGlvbnMgPSB7XHJcbiAgICAuLi4oZHluYW1pY0Zvcm0uZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucy5jbGFzc1RyYW5zZm9ybVRvUGxhaW5PcHRpb25zIHx8XHJcbiAgICAgIHt9KSxcclxuICB9O1xyXG4gIGR5bmFtaWNGb3JtLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMubWF4TmVzdGVkTW9kZWxEZXB0aCA9IFxyXG4gICAgKHR5cGVvZiBkeW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLm1heE5lc3RlZE1vZGVsRGVwdGg9PT0nbnVtYmVyJyA/IFxyXG5cdCAgZHluYW1pY0Zvcm0uZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucy5tYXhOZXN0ZWRNb2RlbERlcHRoIDogNSk7XHJcblxyXG5cdC8vIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuYWxsb3dlZE5lc3RlZE1vZGVscyBkZWZhdWx0cyB0byB1bmRlZmluZWRcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQWxsRm9ybUdyb3VwQ2hpbGRyZW5Db250cm9sczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHtcclxuICBkeW5hbWljRm9ybSxcclxuICBkZWZhdWx0VmFsdWUsXHJcbiAgZm9ybUJ1aWxkZXIsXHJcbiAgcm9vdEZvcm1Hcm91cCxcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG59OiB7XHJcbiAgZHluYW1pY0Zvcm06IER5bmFtaWNGb3JtR3JvdXA8VCwgVD47XHJcbiAgZGVmYXVsdFZhbHVlOiBEZWVwUGFydGlhbDxUPjtcclxuICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcm9vdEZvcm1Hcm91cDogRHluYW1pY0Zvcm1Hcm91cDxhbnksIGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uczogRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uczxUPiB8IHVuZGVmaW5lZDtcclxufSkge1xyXG4gIGR5bmFtaWNGb3JtLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEucHJvcGVydGllcy5mb3JFYWNoKFxyXG4gICAgKG1ldGFkYXRhSXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgZHluYW1pY0Zvcm0uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5wcm9wZXJ0aWVzW2luZGV4XS5pZ25vcmUgPSB0cnVlO1xyXG4gICAgICBpZiAobWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRWYWx1ZSB8fCB7fSkubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgfHwge30sXHJcbiAgICAgICAgICAgIG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICkgfHxcclxuICAgICAgICAgIG1ldGFkYXRhSXRlbS5pc0FycmF5XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhSXRlbS5pc0FycmF5KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAhbWV0YWRhdGFJdGVtLmNsYXNzVHlwZSB8fFxyXG4gICAgICAgICAgICAgIGlzUHJpbWl0aXZlQ2xhc3MobWV0YWRhdGFJdGVtLmNsYXNzVHlwZSlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgYWRkRHluYW1pY1ByaW1pdGl2ZU9iamVjdEFzRm9ybUdyb3VwPFQ+KHtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhSXRlbSxcclxuICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLFxyXG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0sXHJcbiAgICAgICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBhZGREeW5hbWljVHlwZWRPYmplY3RBc0Zvcm1Hcm91cDxUPih7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YUl0ZW0sXHJcbiAgICAgICAgICAgICAgICBmb3JtQnVpbGRlcixcclxuICAgICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0sXHJcbiAgICAgICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICFtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlIHx8XHJcbiAgICAgICAgICAgICAgaXNQcmltaXRpdmVDbGFzcyhtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBhZGREeW5hbWljUHJpbWl0aXZlT2JqZWN0QXNGb3JtQXJyYXk8VD4oe1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFJdGVtLFxyXG4gICAgICAgICAgICAgICAgZm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybSxcclxuICAgICAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFkZER5bmFtaWNUeXBlZE9iamVjdEFzRm9ybUFycmF5PFQ+KHtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhSXRlbSxcclxuICAgICAgICAgICAgICAgIGZvcm1CdWlsZGVyLFxyXG4gICAgICAgICAgICAgICAgcm9vdEZvcm1Hcm91cCxcclxuICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybSxcclxuICAgICAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkRHluYW1pY1R5cGVkT2JqZWN0QXNGb3JtQXJyYXk8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XHJcbiAgZGVmYXVsdFZhbHVlLFxyXG4gIG1ldGFkYXRhSXRlbSxcclxuICBmb3JtQnVpbGRlcixcclxuICByb290Rm9ybUdyb3VwLFxyXG4gIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMsXHJcbiAgZHluYW1pY0Zvcm0sXHJcbiAgaW5kZXgsXHJcbn06IHtcclxuICBkZWZhdWx0VmFsdWU6IERlZXBQYXJ0aWFsPFQ+O1xyXG4gIG1ldGFkYXRhSXRlbTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGE7XHJcbiAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcjtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHJvb3RGb3JtR3JvdXA6IER5bmFtaWNGb3JtR3JvdXA8YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM6IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD4gfCB1bmRlZmluZWQ7XHJcbiAgZHluYW1pY0Zvcm06IER5bmFtaWNGb3JtR3JvdXA8VCwgVD47XHJcbiAgaW5kZXg6IG51bWJlcjtcclxufSkge1xyXG4gIGlmICghbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eU5hbWUgbm90IHNldCcpO1xyXG4gIH1cclxuICBjb25zdCBkZWZhdWx0QXJyYXk6IG5ldmVyW10gPSAoZGVmYXVsdFZhbHVlIGFzIG5ldmVyKVtcclxuICAgIG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWVcclxuICBdO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgY29uc3QgdmFsdWU6IGFueVtdID1cclxuICAgIGRlZmF1bHRBcnJheSAmJiBkZWZhdWx0QXJyYXkubGVuZ3RoID4gMCA/IGRlZmF1bHRBcnJheSA6IFtdO1xyXG5cclxuICBjb25zdCBjb250cm9sID0gZm9ybUJ1aWxkZXIuYXJyYXkoW10pIGFzIER5bmFtaWNGb3JtQXJyYXk7XHJcblxyXG4gIHZhbHVlLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgIGNvbnN0IGZvcm0gPSBmb3JtQnVpbGRlci5ncm91cChpdGVtKTtcclxuICAgIGZvcm0uc2V0UGFyZW50KGNvbnRyb2wpO1xyXG4gICAgY29udHJvbC5wdXNoKFxyXG4gICAgICBjcmVhdGVGb3JtQ29udHJvbHMoe1xyXG4gICAgICAgIGNsYXNzVHlwZTogbWV0YWRhdGFJdGVtLmNsYXNzVHlwZSxcclxuICAgICAgICBmb3JtQnVpbGRlcixcclxuICAgICAgICBmb3JtLFxyXG4gICAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhSXRlbSxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGl0ZW0sXHJcbiAgICAgICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfSk7XHJcbiAgZHluYW1pY0Zvcm0uYWRkQ29udHJvbChtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lLCBjb250cm9sKTtcclxuICBjb250cm9sLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEgPSBtZXRhZGF0YUl0ZW07XHJcbiAgY29udHJvbC5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhLnBhcmVudCA9IGR5bmFtaWNGb3JtLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGE7XHJcbiAgZHluYW1pY0Zvcm0uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5wcm9wZXJ0aWVzW2luZGV4XS5pZ25vcmUgPSBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkRHluYW1pY1ByaW1pdGl2ZU9iamVjdEFzRm9ybUFycmF5PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xyXG4gIGRlZmF1bHRWYWx1ZSxcclxuICBtZXRhZGF0YUl0ZW0sXHJcbiAgZm9ybUJ1aWxkZXIsXHJcbiAgZHluYW1pY0Zvcm0sXHJcbiAgaW5kZXgsXHJcbn06IHtcclxuICBkZWZhdWx0VmFsdWU6IERlZXBQYXJ0aWFsPFQ+O1xyXG4gIG1ldGFkYXRhSXRlbTogSUR5bmFtaWNDb250cm9sTWV0YWRhdGE7XHJcbiAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcjtcclxuICBkeW5hbWljRm9ybTogRHluYW1pY0Zvcm1Hcm91cDxULCBUPjtcclxuICBpbmRleDogbnVtYmVyO1xyXG59KSB7XHJcbiAgaWYgKCFtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5TmFtZSBub3Qgc2V0Jyk7XHJcbiAgfVxyXG4gIGNvbnN0IGRlZmF1bHRBcnJheTogbmV2ZXJbXSA9IChkZWZhdWx0VmFsdWUgYXMgbmV2ZXIpW1xyXG4gICAgbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZVxyXG4gIF07XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdCB2YWx1ZTogYW55W10gPVxyXG4gICAgZGVmYXVsdEFycmF5ICYmIGRlZmF1bHRBcnJheS5sZW5ndGggPiAwID8gZGVmYXVsdEFycmF5IDogW107XHJcbiAgY29uc3QgY29udHJvbCA9IGZvcm1CdWlsZGVyLmFycmF5KHZhbHVlKSBhcyBEeW5hbWljRm9ybUFycmF5O1xyXG4gIC8vIHRvZG86IGluY29ycmVjdCB3b3JrIHdpdGggYWRkQ29udHJvbFxyXG4gIGR5bmFtaWNGb3JtLnNldENvbnRyb2wobWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZSwgY29udHJvbCk7XHJcbiAgY29udHJvbC5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhID0gbWV0YWRhdGFJdGVtO1xyXG4gIGNvbnRyb2wuY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5wYXJlbnQgPSBkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhO1xyXG4gIGR5bmFtaWNGb3JtLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEucHJvcGVydGllc1tpbmRleF0uaWdub3JlID0gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZER5bmFtaWNUeXBlZE9iamVjdEFzRm9ybUdyb3VwPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xyXG4gIGRlZmF1bHRWYWx1ZSxcclxuICBtZXRhZGF0YUl0ZW0sXHJcbiAgZm9ybUJ1aWxkZXIsXHJcbiAgcm9vdEZvcm1Hcm91cCxcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gIGR5bmFtaWNGb3JtLFxyXG4gIGluZGV4LFxyXG59OiB7XHJcbiAgZGVmYXVsdFZhbHVlOiBEZWVwUGFydGlhbDxUPjtcclxuICBtZXRhZGF0YUl0ZW06IElEeW5hbWljQ29udHJvbE1ldGFkYXRhO1xyXG4gIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXI7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICByb290Rm9ybUdyb3VwOiBEeW5hbWljRm9ybUdyb3VwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcclxuICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+IHwgdW5kZWZpbmVkO1xyXG4gIGR5bmFtaWNGb3JtOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+O1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbn0pIHtcclxuICBpZiAoIW1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcigncHJvcGVydHlOYW1lIG5vdCBzZXQnKTtcclxuICB9XHJcbiAgY29uc3QgdmFsdWUgPVxyXG4gICAgKGRlZmF1bHRWYWx1ZSBhcyBuZXZlcilbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV0gfHxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBtZXRhZGF0YUl0ZW0ucHJvcGVydGllcy5yZWR1Y2UoKGFsbDogYW55LCBjdXIpID0+IHtcclxuICAgICAgaWYgKGN1ci5wcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICBpZiAoY3VyLmlzQXJyYXkpIHtcclxuICAgICAgICAgIGFsbFtjdXIucHJvcGVydHlOYW1lXSA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIWN1ci5jbGFzc1R5cGUgfHwgaXNQcmltaXRpdmVDbGFzcyhjdXIuY2xhc3NUeXBlKSkge1xyXG4gICAgICAgICAgICBhbGxbY3VyLnByb3BlcnR5TmFtZV0gPSBudWxsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWxsW2N1ci5wcm9wZXJ0eU5hbWVdID0ge307XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhbGw7XHJcbiAgICB9LCB7fSk7XHJcbiAgY29uc3QgZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHt9KTtcclxuICBmb3JtLnNldFBhcmVudChyb290Rm9ybUdyb3VwIGFzIFVudHlwZWRGb3JtR3JvdXApO1xyXG4gIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbHMoe1xyXG4gICAgY2xhc3NUeXBlOiBtZXRhZGF0YUl0ZW0uY2xhc3NUeXBlLFxyXG4gICAgZm9ybUJ1aWxkZXIsXHJcbiAgICBmb3JtLFxyXG4gICAgcm9vdEZvcm1Hcm91cCxcclxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YUl0ZW0sXHJcbiAgICBkZWZhdWx0VmFsdWU6IHZhbHVlLFxyXG4gICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuICB9KTtcclxuICBkeW5hbWljRm9ybS5hZGRDb250cm9sKG1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWUsIGNvbnRyb2wpO1xyXG4gIGNvbnRyb2wuY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YSA9IG1ldGFkYXRhSXRlbTtcclxuICBjb250cm9sLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEucGFyZW50ID0gZHluYW1pY0Zvcm0uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YTtcclxuICBkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhLnByb3BlcnRpZXNbaW5kZXhdLmlnbm9yZSA9IGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGREeW5hbWljUHJpbWl0aXZlT2JqZWN0QXNGb3JtR3JvdXA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XHJcbiAgZGVmYXVsdFZhbHVlLFxyXG4gIG1ldGFkYXRhSXRlbSxcclxuICBmb3JtQnVpbGRlcixcclxuICBkeW5hbWljRm9ybSxcclxuICBpbmRleCxcclxufToge1xyXG4gIGRlZmF1bHRWYWx1ZTogRGVlcFBhcnRpYWw8VD47XHJcbiAgbWV0YWRhdGFJdGVtOiBJRHluYW1pY0NvbnRyb2xNZXRhZGF0YTtcclxuICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyO1xyXG4gIGR5bmFtaWNGb3JtOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+O1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbn0pIHtcclxuICBpZiAoIW1ldGFkYXRhSXRlbS5wcm9wZXJ0eU5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcigncHJvcGVydHlOYW1lIG5vdCBzZXQnKTtcclxuICB9XHJcbiAgY29uc3QgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxyXG4gICAgZGVmYXVsdFZhbHVlLFxyXG4gICAgbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZVxyXG4gIClcclxuICAgID8gKGRlZmF1bHRWYWx1ZSBhcyBuZXZlcilbbWV0YWRhdGFJdGVtLnByb3BlcnR5TmFtZV1cclxuICAgIDogdW5kZWZpbmVkO1xyXG4gIGNvbnN0IGNvbnRyb2wgPSBmb3JtQnVpbGRlci5jb250cm9sKHZhbHVlKSBhcyBEeW5hbWljRm9ybUNvbnRyb2w7XHJcbiAgZHluYW1pY0Zvcm0uYWRkQ29udHJvbChtZXRhZGF0YUl0ZW0ucHJvcGVydHlOYW1lLCBjb250cm9sKTtcclxuICBjb250cm9sLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGEgPSBtZXRhZGF0YUl0ZW07XHJcbiAgY29udHJvbC5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhLnBhcmVudCA9IGR5bmFtaWNGb3JtLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGE7XHJcbiAgZHluYW1pY0Zvcm0uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5wcm9wZXJ0aWVzW2luZGV4XS5pZ25vcmUgPSBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkRHluYW1pY01ldGhvZHNUb1Jvb3RGb3JtR3JvdXA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XHJcbiAgZHluYW1pY0Zvcm0sXHJcbiAgcm9vdEZvcm1Hcm91cCxcclxuICBmb3JtQnVpbGRlcixcclxufToge1xyXG4gIGR5bmFtaWNGb3JtOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+O1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcm9vdEZvcm1Hcm91cDogRHluYW1pY0Zvcm1Hcm91cDxhbnksIGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcjtcclxufSkge1xyXG4gIGR5bmFtaWNGb3JtLmV4dGVybmFsRXJyb3JzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2xhc3NWYWxpZGF0b3JFcnJvcnM+KFxyXG4gICAge31cclxuICApO1xyXG5cclxuICBkeW5hbWljRm9ybS5wYXRjaER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMgPSAoXHJcbiAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+XHJcbiAgKSA9PiB7XHJcbiAgICBpZiAoIWR5bmFtaWNGb3JtKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcigncm9vdEZvcm1Hcm91cCBub3Qgc2V0Jyk7XHJcbiAgICB9XHJcbiAgICBkeW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zID0ge1xyXG4gICAgICAuLi5keW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gICAgICAuLi5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gICAgfTtcclxuICAgIHNldFZhbGlkYXRvcnNUb0NvbnRyb2xzKGZvcm1CdWlsZGVyLCBkeW5hbWljRm9ybSk7XHJcbiAgICBkeW5hbWljRm9ybS5wYXRjaFZhbHVlKGR5bmFtaWNGb3JtLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgfTtcclxuXHJcbiAgZHluYW1pY0Zvcm0uZ2V0T2JqZWN0ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhLmNsYXNzVHlwZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzVHlwZSBub3Qgc2V0Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGxhaW5Ub0luc3RhbmNlKFxyXG4gICAgICBkeW5hbWljRm9ybS5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhLmNsYXNzVHlwZSxcclxuICAgICAge1xyXG4gICAgICAgIC4uLmR5bmFtaWNGb3JtLnZhbHVlLFxyXG4gICAgICB9LFxyXG4gICAgICBkeW5hbWljRm9ybS5keW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLmNsYXNzVHJhbnNmb3JtT3B0aW9uc1xyXG4gICAgKSBhcyBUO1xyXG4gIH07XHJcblxyXG4gIGR5bmFtaWNGb3JtLnNldE9iamVjdCA9IChvYmplY3Q6IFQpID0+IHtcclxuICAgIHNldFZhbHVlc0ZvckNvbnRyb2xzKFxyXG4gICAgICBmb3JtQnVpbGRlcixcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgZHluYW1pY0Zvcm0gYXMgYW55LFxyXG4gICAgICBpbnN0YW5jZVRvUGxhaW4oXHJcbiAgICAgICAgb2JqZWN0LFxyXG4gICAgICAgIGR5bmFtaWNGb3JtLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NUcmFuc2Zvcm1Ub1BsYWluT3B0aW9uc1xyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgc2V0VmFsaWRhdG9yc1RvQ29udHJvbHMoZm9ybUJ1aWxkZXIsIGR5bmFtaWNGb3JtLCByb290Rm9ybUdyb3VwKTtcclxuICB9O1xyXG5cclxuICBkeW5hbWljRm9ybS5yZWZyZXNoID0gKCkgPT4ge1xyXG4gICAgc2V0VmFsaWRhdG9yc1RvQ29udHJvbHMoZm9ybUJ1aWxkZXIsIGR5bmFtaWNGb3JtLCByb290Rm9ybUdyb3VwKTtcclxuICAgIGR5bmFtaWNGb3JtLnBhdGNoVmFsdWUoZHluYW1pY0Zvcm0udmFsdWUpO1xyXG4gIH07XHJcblxyXG4gIGR5bmFtaWNGb3JtLmdldEpTT04gPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gcmVjdXJzaXZlUmVtb3ZlRHluYW1pY0NvbnRyb2xPcHRpb25zKGNsb25lRGVlcChkeW5hbWljRm9ybS52YWx1ZSkpO1xyXG4gIH07XHJcblxyXG4gIGR5bmFtaWNGb3JtLnNldEpTT04gPSAoXHJcbiAgICB2YWx1ZTogVCxcclxuICAgIG9wdGlvbnM/OiB7XHJcbiAgICAgIG9ubHlTZWxmPzogYm9vbGVhbjtcclxuICAgICAgZW1pdEV2ZW50PzogYm9vbGVhbjtcclxuICAgIH1cclxuICApID0+IHtcclxuICAgIHNldFZhbHVlc0ZvckNvbnRyb2xzKGZvcm1CdWlsZGVyLCBkeW5hbWljRm9ybSwgdmFsdWUpO1xyXG4gICAgc2V0VmFsaWRhdG9yc1RvQ29udHJvbHMoZm9ybUJ1aWxkZXIsIGR5bmFtaWNGb3JtLCByb290Rm9ybUdyb3VwKTtcclxuICAgIGR5bmFtaWNGb3JtLnBhdGNoVmFsdWUoZHluYW1pY0Zvcm0udmFsdWUsIG9wdGlvbnMpO1xyXG4gIH07XHJcblxyXG4gIGR5bmFtaWNGb3JtLnNldEV4dGVybmFsRXJyb3JzID0gKGV4dGVybmFsRXJyb3JzOiBDbGFzc1ZhbGlkYXRvckVycm9ycykgPT4ge1xyXG4gICAgZHluYW1pY0Zvcm0uZXh0ZXJuYWxFcnJvcnNTdWJqZWN0Lm5leHQoXHJcbiAgICAgIHJlY3Vyc2l2ZVJlbW92ZUR5bmFtaWNDb250cm9sT3B0aW9ucyhjbG9uZURlZXAoZXh0ZXJuYWxFcnJvcnMpKVxyXG4gICAgKTtcclxuICAgIGR5bmFtaWNGb3JtLnBhdGNoVmFsdWUoZHluYW1pY0Zvcm0udmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9O1xyXG5cclxuICBkeW5hbWljRm9ybS5nZXRFeHRlcm5hbEVycm9ycyA9ICgpID0+IHtcclxuICAgIHJldHVybiByZWN1cnNpdmVSZW1vdmVEeW5hbWljQ29udHJvbE9wdGlvbnMoXHJcbiAgICAgIGNsb25lRGVlcChkeW5hbWljRm9ybS5leHRlcm5hbEVycm9yc1N1YmplY3QudmFsdWUpXHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGR5bmFtaWNGb3JtUHJveHkgPSBuZXcgUHJveHkoZHluYW1pY0Zvcm0sIHtcclxuICAgIGdldCh0YXJnZXQ6IHR5cGVvZiBkeW5hbWljRm9ybSwgcHJvcDoga2V5b2YgdHlwZW9mIGR5bmFtaWNGb3JtKSB7XHJcbiAgICAgIGlmIChwcm9wID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB0YXJnZXQuZ2V0T2JqZWN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3AgPT09ICdqc29uJykge1xyXG4gICAgICAgIHJldHVybiB0YXJnZXQuZ2V0SlNPTigpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wID09PSAnZXh0ZXJuYWxFcnJvcnMnKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldC5nZXRFeHRlcm5hbEVycm9ycygpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XHJcbiAgICB9LFxyXG4gICAgc2V0KFxyXG4gICAgICB0YXJnZXQ6IHR5cGVvZiBkeW5hbWljRm9ybSxcclxuICAgICAgcHJvcDoga2V5b2YgdHlwZW9mIGR5bmFtaWNGb3JtLFxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICB2YWx1ZTogYW55XHJcbiAgICApIHtcclxuICAgICAgaWYgKHByb3AgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgdGFyZ2V0LnNldE9iamVjdCh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3AgPT09ICdqc29uJykge1xyXG4gICAgICAgIHRhcmdldC5zZXRKU09OKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvcCA9PT0gJ2V4dGVybmFsRXJyb3JzJykge1xyXG4gICAgICAgIHRhcmdldC5zZXRFeHRlcm5hbEVycm9ycyh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwge1xyXG4gICAgICAgIHZhbHVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgZHluYW1pY0Zvcm1Qcm94eS5wYXRjaFZhbHVlKGR5bmFtaWNGb3JtUHJveHkudmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICBzZXRWYWxpZGF0b3JzVG9Db250cm9scyhmb3JtQnVpbGRlciwgZHluYW1pY0Zvcm1Qcm94eSwgcm9vdEZvcm1Hcm91cCk7XHJcbiAgcmV0dXJuIGR5bmFtaWNGb3JtUHJveHk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZER5bmFtaWNNZXRob2RzVG9Gb3JtR3JvdXA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICBkeW5hbWljRm9ybTogRHluYW1pY0Zvcm1Hcm91cDxULCBUPlxyXG4pIHtcclxuICBkeW5hbWljRm9ybS5nZXRDbGFzc1ZhbGlkYXRvckVycm9ycyA9IChcclxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwsXHJcbiAgICBudWxsSWZFbXB0eTogYm9vbGVhblxyXG4gICkgPT4ge1xyXG4gICAgY29uc3QgZHluYW1pY0NvbnRyb2wgPSBjb250cm9sIGFzIHVua25vd24gYXMgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzO1xyXG4gICAgaWYgKCFkeW5hbWljQ29udHJvbD8uY2xhc3NWYWxpZGF0b3JFcnJvcnNTdWJqZWN0KSB7XHJcbiAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkeW5hbWljQ29udHJvbC5jbGFzc1ZhbGlkYXRvckVycm9yc1N1YmplY3QucGlwZShcclxuICAgICAgbWFwKChlcnJvcnMpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBkeW5hbWljQ29udHJvbD8uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YT8ucHJvcGVydHlOYW1lICYmXHJcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxyXG4gICAgICAgICAgICBlcnJvcnMsXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250cm9sPy5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhPy5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBlcnJvcnNbZHluYW1pY0NvbnRyb2w/LmNsYXNzVHJhbnNmb3JtTWV0YWRhdGE/LnByb3BlcnR5TmFtZV1cclxuICAgICAgICAgICAgPy5tZXNzYWdlcz8ubGVuZ3RoID09PSAwICYmIG51bGxJZkVtcHR5XHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IGVycm9yc1tkeW5hbWljQ29udHJvbD8uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YT8ucHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZENvbW1vbkFzeW5jVmFsaWRhdG9yVG9Sb290Rm9ybTxUPihcclxuICByb290Rm9ybUdyb3VwOiBEeW5hbWljRm9ybUdyb3VwPFQ+XHJcbikge1xyXG4gIGlmICghcm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvcikge1xyXG4gICAgcm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvclN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxcclxuICAgICAgbnVsbCB8IHN0cmluZ1xyXG4gICAgPigpO1xyXG4gICAgcm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvciA9IChcclxuICAgICAgY29udHJvbDogRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzIHwgQWJzdHJhY3RDb250cm9sXHJcbiAgICApOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XHJcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzKVxyXG4gICAgICAgID8uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YTtcclxuXHJcbiAgICAgIGlmICghbWV0YWRhdGEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzVHJhbnNmb3JtTWV0YWRhdGEgbm90IGZvdW5kIGluIGZvcm0gZ3JvdXAnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgcm9vdFZhbHVlID0gcm9vdEZvcm1Hcm91cCA/IHJvb3RGb3JtR3JvdXAudmFsdWUgOiBudWxsO1xyXG4gICAgICBjb25zdCB7IGlucHV0UGF0aCwgZXJyb3JzUGF0aCwgY29udHJvbFBhdGggfSA9IGZpbmRDb250cm9sUGF0aHMoY29udHJvbCk7XHJcblxyXG4gICAgICBjb25zdCBvYmplY3QgPSBzZXREeW5hbWljQ29udHJvbFZhbHVlPFQ+KFxyXG4gICAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICAgICAgcm9vdFZhbHVlLFxyXG4gICAgICAgIGNvbnRyb2xQYXRoLFxyXG4gICAgICAgIGNvbnRyb2wsXHJcbiAgICAgICAgbWV0YWRhdGFcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgIHNldER5bmFtaWNDb250cm9sT3B0aW9ucyhvYmplY3QsIHtcclxuICAgICAgICByb290VmFsdWUsXHJcbiAgICAgICAgY29udHJvbFBhdGgsXHJcbiAgICAgICAgY29udHJvbCxcclxuICAgICAgICBtZXRhZGF0YSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBsb2NhbENsYXNzVmFsaWRhdG9yT3B0aW9ucyA9IGNsb25lRGVlcChcclxuICAgICAgICByb290Rm9ybUdyb3VwLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NWYWxpZGF0b3JPcHRpb25zXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGdsb2JhbENsYXNzVmFsaWRhdG9yT3B0aW9ucyA9IGNsb25lRGVlcChcclxuICAgICAgICBnZXRHbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zKCkuY2xhc3NWYWxpZGF0b3JPcHRpb25zXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGNsYXNzVmFsaWRhdG9yT3B0aW9ucyA9IG1lcmdlV2l0aChcclxuICAgICAgICBnbG9iYWxDbGFzc1ZhbGlkYXRvck9wdGlvbnMsXHJcbiAgICAgICAgbG9jYWxDbGFzc1ZhbGlkYXRvck9wdGlvbnNcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICByb290Rm9ybUdyb3VwLmNvbW1vbkFzeW5jVmFsaWRhdG9yRmlyc3RDaGFuZ2VkXHJcbiAgICAgICAgICA/IGZyb20odmFsaWRhdGUob2JqZWN0IGFzIG5ldmVyLCBjbGFzc1ZhbGlkYXRvck9wdGlvbnMpKVxyXG4gICAgICAgICAgOiBvZih2YWxpZGF0ZVN5bmMob2JqZWN0IGFzIG5ldmVyLCBjbGFzc1ZhbGlkYXRvck9wdGlvbnMpKVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDcwMCksXHJcbiAgICAgICAgbWFwKChyb290Q2xhc3NWYWxpZGF0b3JFcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdKSA9PiB7XHJcbiAgICAgICAgICBzZXRSb290Rm9ybUdyb3VwQ2xhc3NWYWxpZGF0b3JFcnJvcnM8VD4oXHJcbiAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICAgICAgICAgIHJvb3RDbGFzc1ZhbGlkYXRvckVycm9yc1xyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkeW5hbWljRm9ybUNvbnRyb2wgPSBzZXRGb3JtQ29udHJvbENsYXNzVmFsaWRhdG9yRXJyb3JzPFQ+KFxyXG4gICAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgICByb290Rm9ybUdyb3VwLFxyXG4gICAgICAgICAgICBlcnJvcnNQYXRoLFxyXG4gICAgICAgICAgICBpbnB1dFBhdGhcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGR5bmFtaWNGb3JtQ29udHJvbC5jbGFzc1ZhbGlkYXRvckVycm9ycyB8fCB7fSlcclxuICAgICAgICAgICAgLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0RHluYW1pY0NvbnRyb2xWYWx1ZTxUPihcclxuICByb290Rm9ybUdyb3VwOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+LFxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcm9vdFZhbHVlOiBhbnksXHJcbiAgY29udHJvbFBhdGg6IHN0cmluZyxcclxuICBjb250cm9sOiBEeW5hbWljRm9ybVByb3BlcnRpZXM8dW5rbm93bj4gfCBBYnN0cmFjdENvbnRyb2wsXHJcbiAgbWV0YWRhdGE6IElEeW5hbWljQ29udHJvbE1ldGFkYXRhXHJcbikge1xyXG4gIGlmICghcm9vdEZvcm1Hcm91cCkge1xyXG4gICAgdGhyb3cgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gIH1cclxuICBpZiAoIXJvb3RGb3JtR3JvdXAuY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5jbGFzc1R5cGUpIHtcclxuICAgIHRocm93IEVycm9yKCdjbGFzc1R5cGUgbm90IHNldCcpO1xyXG4gIH1cclxuXHJcbiAgLy8gbmVlZCBmb3IgcmVzaXplIGFycmF5c1xyXG4gIGxvZGFzaFNldChyb290VmFsdWUsIGNvbnRyb2xQYXRoLCBjb250cm9sLnZhbHVlKTtcclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdCBvYmplY3Q6IGFueSA9IHBsYWluVG9JbnN0YW5jZShcclxuICAgIHJvb3RGb3JtR3JvdXAuY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YS5jbGFzc1R5cGUsXHJcbiAgICByb290VmFsdWUsXHJcbiAgICByb290Rm9ybUdyb3VwLmR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMuY2xhc3NUcmFuc2Zvcm1PcHRpb25zXHJcbiAgKTtcclxuXHJcbiAgLy8gc2V0IG9yaWdpbmFsIHZhbHVlcyBvZiBpbnB1dHNcclxuICBpZiAoXHJcbiAgICBtZXRhZGF0YS5pc0FycmF5ICYmXHJcbiAgICAoIW1ldGFkYXRhLmNsYXNzVHlwZSB8fCBpc1ByaW1pdGl2ZUNsYXNzKG1ldGFkYXRhLmNsYXNzVHlwZSkpXHJcbiAgKSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgY29udHJvbC52YWx1ZS5mb3JFYWNoKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgbG9kYXNoU2V0KG9iamVjdCwgYCR7Y29udHJvbFBhdGh9LiR7aW5kZXh9YCwgY29udHJvbC52YWx1ZVtpbmRleF0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBuZWVkIGZvciBjb3JyZWN0IHdvcmsgVmFsaWRhdGVJZlVwZGF0ZXJcclxuICBpZiAobWV0YWRhdGEucGFyZW50Py5jbGFzc1R5cGUgJiYgbWV0YWRhdGEucHJvcGVydHlJbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXBsYWNlTGFzdFByb3BlcnR5VG9EeW5hbWljQ29udHJvbE9wdGlvbnNCeURvdFBhdGgoXHJcbiAgICAgIGNvbnRyb2xQYXRoLFxyXG4gICAgICBvYmplY3QsXHJcbiAgICAgIHJvb3RWYWx1ZSxcclxuICAgICAgY29udHJvbCxcclxuICAgICAgbWV0YWRhdGFcclxuICAgICk7XHJcbiAgfVxyXG4gIHJldHVybiBvYmplY3Q7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZpbmRDb250cm9sUGF0aHMoXHJcbiAgY29udHJvbDogRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzPHVua25vd24+IHwgQWJzdHJhY3RDb250cm9sXHJcbikge1xyXG4gIGNvbnN0IGFuZ3VsYXJGb3JtVmFsaWRhdG9yUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBjb25zdCBpbnB1dFBhdGg6IHN0cmluZ1tdID0gW107XHJcbiAgY29uc3QgZXJyb3JzUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBsZXQgY3RybCA9IGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzO1xyXG4gIHdoaWxlIChjdHJsKSB7XHJcbiAgICBjb25zdCBrZXkgPVxyXG4gICAgICBjdHJsLmNsYXNzVHJhbnNmb3JtTWV0YWRhdGE/LnByb3BlcnR5SW5kZXg/LnRvU3RyaW5nKCkgfHxcclxuICAgICAgY3RybC5jbGFzc1RyYW5zZm9ybU1ldGFkYXRhPy5wcm9wZXJ0eU5hbWUgfHxcclxuICAgICAgbnVsbDtcclxuICAgIGNvbnN0IHBhcmVudCA9IGN0cmwucGFyZW50IGFzIER5bmFtaWNGb3JtUHJvcGVydGllcztcclxuICAgIGlmIChrZXkgIT09IG51bGwpIHtcclxuICAgICAgaW5wdXRQYXRoLnB1c2goa2V5KTtcclxuICAgICAgZXJyb3JzUGF0aC5wdXNoKGtleSk7XHJcbiAgICAgIGlmIChwYXJlbnQ/LnBhcmVudCkge1xyXG4gICAgICAgIGVycm9yc1BhdGgucHVzaCgnY2hpbGRyZW4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXBhcmVudD8uY2xhc3NUcmFuc2Zvcm1NZXRhZGF0YT8uaXNBcnJheSkge1xyXG4gICAgICAgIGFuZ3VsYXJGb3JtVmFsaWRhdG9yUGF0aC5wdXNoKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGN0cmwgPSBwYXJlbnQ7XHJcbiAgfVxyXG4gIGNvbnN0IGNvbnRyb2xQYXRoID0gaW5wdXRQYXRoLnJldmVyc2UoKS5qb2luKCcuJyk7XHJcbiAgcmV0dXJuIHtcclxuICAgIGlucHV0UGF0aCxcclxuICAgIGVycm9yc1BhdGgsXHJcbiAgICBjb250cm9sUGF0aCxcclxuICAgIGFuZ3VsYXJGb3JtVmFsaWRhdG9yUGF0aDogYW5ndWxhckZvcm1WYWxpZGF0b3JQYXRoLnJldmVyc2UoKS5qb2luKCcuJyksXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0Rm9ybUNvbnRyb2xDbGFzc1ZhbGlkYXRvckVycm9yczxUPihcclxuICBjb250cm9sOiBEeW5hbWljRm9ybVByb3BlcnRpZXM8dW5rbm93bj4gfCBBYnN0cmFjdENvbnRyb2wsXHJcbiAgcm9vdEZvcm1Hcm91cDogRHluYW1pY0Zvcm1Hcm91cDxULCBUPixcclxuICBlcnJvcnNQYXRoOiBzdHJpbmdbXSxcclxuICBpbnB1dFBhdGg6IHN0cmluZ1tdXHJcbikge1xyXG4gIGNvbnN0IGR5bmFtaWNGb3JtQ29udHJvbCA9IGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Db250cm9sO1xyXG5cclxuICBjb25zdCBwcm9wRXJyb3JzID0gbG9kYXNoR2V0KFxyXG4gICAgcm9vdEZvcm1Hcm91cC5jbGFzc1ZhbGlkYXRvckVycm9ycyxcclxuICAgIGVycm9yc1BhdGgucmV2ZXJzZSgpXHJcbiAgKTtcclxuICBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnMgPVxyXG4gICAgT2JqZWN0LmtleXMocHJvcEVycm9ycyB8fCB7fSkubGVuZ3RoID4gMFxyXG4gICAgICA/IHtcclxuICAgICAgICAgIFtpbnB1dFBhdGgucmV2ZXJzZSgpWzBdXTogcHJvcEVycm9ycyB8fCB7fSxcclxuICAgICAgICB9XHJcbiAgICAgIDoge307XHJcblxyXG4gIGlmICghZHluYW1pY0Zvcm1Db250cm9sLmNsYXNzVmFsaWRhdG9yRXJyb3JzU3ViamVjdCkge1xyXG4gICAgZHluYW1pY0Zvcm1Db250cm9sLmNsYXNzVmFsaWRhdG9yRXJyb3JzID0ge307XHJcbiAgICBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnNTdWJqZWN0ID1cclxuICAgICAgbmV3IEJlaGF2aW9yU3ViamVjdDxDbGFzc1ZhbGlkYXRvckVycm9ycz4oe30pO1xyXG4gIH1cclxuICBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnNTdWJqZWN0Lm5leHQoXHJcbiAgICBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICApO1xyXG5cclxuICBpZiAoIWR5bmFtaWNGb3JtQ29udHJvbC5jdXN0b21WYWxpZGF0ZUVycm9ycykge1xyXG4gICAgZHluYW1pY0Zvcm1Db250cm9sLmN1c3RvbVZhbGlkYXRlRXJyb3JzID1cclxuICAgICAgbmV3IEJlaGF2aW9yU3ViamVjdDxTaG9ydFZhbGlkYXRpb25FcnJvcnM+KHt9KTtcclxuICB9XHJcbiAgZHluYW1pY0Zvcm1Db250cm9sLmN1c3RvbVZhbGlkYXRlRXJyb3JzLm5leHQoXHJcbiAgICB0cmFuc2Zvcm1DbGFzc1ZhbGlkYXRvckVycm9yc1RvU2hvcnRWYWxpZGF0aW9uRXJyb3JzKFxyXG4gICAgICBkeW5hbWljRm9ybUNvbnRyb2wuY2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICAgIClcclxuICApO1xyXG4gIHJldHVybiBkeW5hbWljRm9ybUNvbnRyb2w7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFJvb3RGb3JtR3JvdXBDbGFzc1ZhbGlkYXRvckVycm9yczxUPihcclxuICByb290Rm9ybUdyb3VwOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+LFxyXG4gIHJvb3RDbGFzc1ZhbGlkYXRvckVycm9yczogVmFsaWRhdGlvbkVycm9yW11cclxuKSB7XHJcbiAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gIH1cclxuXHJcbiAgcm9vdEZvcm1Hcm91cC5jbGFzc1ZhbGlkYXRvckVycm9ycyA9XHJcbiAgICBtZXJnZUVycm9ycyhcclxuICAgICAgcm9vdEZvcm1Hcm91cC5leHRlcm5hbEVycm9yc1N1YmplY3Q/LnZhbHVlIHx8IHt9LFxyXG4gICAgICB0cmFuc2Zvcm1WYWxpZGF0aW9uRXJyb3JzVG9DbGFzc1ZhbGlkYXRvckVycm9ycyhcclxuICAgICAgICByb290Q2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICAgICAgKSB8fCB7fVxyXG4gICAgKSB8fCB7fTtcclxuXHJcbiAgaWYgKCFyb290Rm9ybUdyb3VwLmNsYXNzVmFsaWRhdG9yRXJyb3JzU3ViamVjdCkge1xyXG4gICAgcm9vdEZvcm1Hcm91cC5jbGFzc1ZhbGlkYXRvckVycm9ycyA9IHt9O1xyXG4gICAgcm9vdEZvcm1Hcm91cC5jbGFzc1ZhbGlkYXRvckVycm9yc1N1YmplY3QgPVxyXG4gICAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PENsYXNzVmFsaWRhdG9yRXJyb3JzPih7fSk7XHJcbiAgfVxyXG4gIHJvb3RGb3JtR3JvdXAuY2xhc3NWYWxpZGF0b3JFcnJvcnNTdWJqZWN0Lm5leHQoXHJcbiAgICByb290Rm9ybUdyb3VwLmNsYXNzVmFsaWRhdG9yRXJyb3JzXHJcbiAgKTtcclxuXHJcbiAgaWYgKCFyb290Rm9ybUdyb3VwLmN1c3RvbVZhbGlkYXRlRXJyb3JzKSB7XHJcbiAgICByb290Rm9ybUdyb3VwLmN1c3RvbVZhbGlkYXRlRXJyb3JzID1cclxuICAgICAgbmV3IEJlaGF2aW9yU3ViamVjdDxTaG9ydFZhbGlkYXRpb25FcnJvcnM+KHt9KTtcclxuICB9XHJcbiAgcm9vdEZvcm1Hcm91cC5jdXN0b21WYWxpZGF0ZUVycm9ycy5uZXh0KFxyXG4gICAgbWVyZ2VFcnJvcnMoXHJcbiAgICAgIGNvbGxlY3REeW5hbWljRm9ybUdyb3VwRXJyb3JzKHJvb3RGb3JtR3JvdXApLFxyXG4gICAgICB0cmFuc2Zvcm1DbGFzc1ZhbGlkYXRvckVycm9yc1RvU2hvcnRWYWxpZGF0aW9uRXJyb3JzKFxyXG4gICAgICAgIHJvb3RGb3JtR3JvdXAuY2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN1YnNjcmliZVRvUm9vdEZvcm1Hcm91cFZhbHVlQ2hhbmdlczxUPihcclxuICByb290Rm9ybUdyb3VwOiBEeW5hbWljRm9ybUdyb3VwPFQsIFQ+XHJcbikge1xyXG4gIGlmICghcm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvckZpcnN0Q2hhbmdlZFN1YnNjcmlwdGlvbikge1xyXG4gICAgcm9vdEZvcm1Hcm91cC5jb21tb25Bc3luY1ZhbGlkYXRvckZpcnN0Q2hhbmdlZFN1YnNjcmlwdGlvbiA9XHJcbiAgICAgIHJvb3RGb3JtR3JvdXA/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAuY29tbW9uQXN5bmNWYWxpZGF0b3JGaXJzdENoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBkZWxheSgxMDApLFxyXG4gICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ3Jvb3RGb3JtR3JvdXAgbm90IHNldCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByb290Rm9ybUdyb3VwLmN1c3RvbVZhbGlkYXRlRXJyb3JzLm5leHQoXHJcbiAgICAgICAgICAgICAgbWVyZ2VFcnJvcnMoXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0RHluYW1pY0Zvcm1Hcm91cEVycm9ycyhyb290Rm9ybUdyb3VwKSxcclxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybUNsYXNzVmFsaWRhdG9yRXJyb3JzVG9TaG9ydFZhbGlkYXRpb25FcnJvcnMoXHJcbiAgICAgICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAuY2xhc3NWYWxpZGF0b3JFcnJvcnNcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgcm9vdEZvcm1Hcm91cCB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc3Vic2NyaWJlVG9HbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zQ2hhbmdlPFQ+KFxyXG4gIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgcm9vdEZvcm1Hcm91cDogRHluYW1pY0Zvcm1Hcm91cDxULCBUPlxyXG4pIHtcclxuICBpZiAoIXJvb3RGb3JtR3JvdXAuZ2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0NoYW5nZWRTdWJzY3JpcHRpb24pIHtcclxuICAgIHJvb3RGb3JtR3JvdXAuZ2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0NoYW5nZWRTdWJzY3JpcHRpb24gPVxyXG4gICAgICBnZXRHbG9iYWxEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zU3ViamVjdCgpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRWYWxpZGF0b3JzVG9Db250cm9scyhmb3JtQnVpbGRlciwgcm9vdEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAucGF0Y2hWYWx1ZShyb290Rm9ybUdyb3VwLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7IGVyciwgcm9vdEZvcm1Hcm91cCB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=","export var DynamicFormBuilderOptionsKeys;\r\n(function (DynamicFormBuilderOptionsKeys) {\r\n    DynamicFormBuilderOptionsKeys[\"classValidatorOptions\"] = \"classValidatorOptions\";\r\n    DynamicFormBuilderOptionsKeys[\"classTransformOptions\"] = \"classTransformOptions\";\r\n    DynamicFormBuilderOptionsKeys[\"classTransformToPlainOptions\"] = \"classTransformToPlainOptions\";\r\n    DynamicFormBuilderOptionsKeys[\"angularValidators\"] = \"angularValidators\";\r\n    DynamicFormBuilderOptionsKeys[\"maxNestedModelDepth\"] = \"maxNestedModelDepth\";\r\n    DynamicFormBuilderOptionsKeys[\"allowedNestedModels\"] = \"allowedNestedModels\";\r\n})(DynamicFormBuilderOptionsKeys || (DynamicFormBuilderOptionsKeys = {}));\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1keW5hbWljLWZvcm0tYnVpbGRlci9zcmMvbGliL3R5cGVzL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1FQSxNQUFNLENBQU4sSUFBWSw2QkFPWDtBQVBELFdBQVksNkJBQTZCO0lBQ3ZDLGdGQUErQyxDQUFBO0lBQy9DLGdGQUErQyxDQUFBO0lBQy9DLDhGQUE2RCxDQUFBO0lBQzdELHdFQUF1QyxDQUFBO0lBQ3ZDLDRFQUEyQyxDQUFBO0lBQzNDLDRFQUEyQyxDQUFBO0FBQzdDLENBQUMsRUFQVyw2QkFBNkIsS0FBN0IsNkJBQTZCLFFBT3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQWJzdHJhY3RDb250cm9sT3B0aW9ucyxcclxuICBVbnR5cGVkRm9ybUFycmF5LFxyXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcclxuICBVbnR5cGVkRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRpb25FcnJvcnMsXHJcbiAgVmFsaWRhdG9yRm4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIENsYXNzQ29uc3RydWN0b3IsXHJcbiAgQ2xhc3NUcmFuc2Zvcm1PcHRpb25zLFxyXG59IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyLWdsb2JhbC1zdG9yYWdlJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvci1tdWx0aS1sYW5nJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCB0eXBlIERlZXBQYXJ0aWFsPFQ+ID0ge1xyXG4gIFtQIGluIGtleW9mIFRdPzogRGVlcFBhcnRpYWw8VFtQXT47XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljQ29udHJvbE1ldGFkYXRhIHtcclxuICBjbGFzc1R5cGU6IENsYXNzQ29uc3RydWN0b3I8dW5rbm93bj4gfCBudWxsO1xyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nIHwgbnVsbDtcclxuICBwcm9wZXJ0eUluZGV4PzogbnVtYmVyO1xyXG4gIGlzQXJyYXk6IGJvb2xlYW47XHJcbiAgcHJvcGVydGllczogSUR5bmFtaWNDb250cm9sTWV0YWRhdGFbXTtcclxuICB3aXRoQW5jZXN0b3JzPzogYm9vbGVhbjtcclxuICBpZ25vcmU/OiBib29sZWFuO1xyXG4gIHBhcmVudD86IElEeW5hbWljQ29udHJvbE1ldGFkYXRhO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBbmd1bGFyQ29udHJvbFZhbGlkYXRvcnM8VD4gPVxyXG4gIHwge1xyXG4gICAgICBbUCBpbiBrZXlvZiBUXTogQW5ndWxhckNvbnRyb2xWYWxpZGF0b3JzPFRbUF0+O1xyXG4gICAgfVxyXG4gIHwgVmFsaWRhdG9yRm5cclxuICB8IFZhbGlkYXRvckZuW11cclxuICB8IEFic3RyYWN0Q29udHJvbE9wdGlvbnNcclxuICB8IHVuZGVmaW5lZFxyXG4gIHwgbnVsbDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0NvbnRyb2xPcHRpb25zIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHJvb3RWYWx1ZTogYW55O1xyXG4gIGNvbnRyb2xQYXRoOiBzdHJpbmc7XHJcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzO1xyXG4gIG1ldGFkYXRhOiBJRHluYW1pY0NvbnRyb2xNZXRhZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzPFQgPSB1bmtub3duPiA9IHtcclxuICBjbGFzc1RyYW5zZm9ybU1ldGFkYXRhOiBJRHluYW1pY0NvbnRyb2xNZXRhZGF0YTtcclxuXHJcbiAgZXh0ZXJuYWxFcnJvcnM6IENsYXNzVmFsaWRhdG9yRXJyb3JzO1xyXG4gIGNsYXNzVmFsaWRhdG9yRXJyb3JzOiBDbGFzc1ZhbGlkYXRvckVycm9ycztcclxuXHJcbiAgZXh0ZXJuYWxFcnJvcnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2xhc3NWYWxpZGF0b3JFcnJvcnM+O1xyXG4gIGNsYXNzVmFsaWRhdG9yRXJyb3JzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PENsYXNzVmFsaWRhdG9yRXJyb3JzPjtcclxuICBjdXN0b21WYWxpZGF0ZUVycm9yczogQmVoYXZpb3JTdWJqZWN0PFNob3J0VmFsaWRhdGlvbkVycm9ycz47XHJcblxyXG4gIHBhcmVudDogQWJzdHJhY3RDb250cm9sWydwYXJlbnQnXSB8IER5bmFtaWNGb3JtUHJvcGVydGllczxUPjtcclxuICB2YWx1ZTogQWJzdHJhY3RDb250cm9sWyd2YWx1ZSddO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRHluYW1pY0Zvcm1BcnJheSA9IFVudHlwZWRGb3JtQXJyYXkgJiBEeW5hbWljRm9ybVByb3BlcnRpZXM7XHJcblxyXG5leHBvcnQgdHlwZSBEeW5hbWljRm9ybUNvbnRyb2wgPSBVbnR5cGVkRm9ybUNvbnRyb2wgJiBEeW5hbWljRm9ybVByb3BlcnRpZXM7XHJcblxyXG5leHBvcnQgZW51bSBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zS2V5cyB7XHJcbiAgY2xhc3NWYWxpZGF0b3JPcHRpb25zID0gJ2NsYXNzVmFsaWRhdG9yT3B0aW9ucycsXHJcbiAgY2xhc3NUcmFuc2Zvcm1PcHRpb25zID0gJ2NsYXNzVHJhbnNmb3JtT3B0aW9ucycsXHJcbiAgY2xhc3NUcmFuc2Zvcm1Ub1BsYWluT3B0aW9ucyA9ICdjbGFzc1RyYW5zZm9ybVRvUGxhaW5PcHRpb25zJyxcclxuICBhbmd1bGFyVmFsaWRhdG9ycyA9ICdhbmd1bGFyVmFsaWRhdG9ycycsXHJcbiAgbWF4TmVzdGVkTW9kZWxEZXB0aCA9ICdtYXhOZXN0ZWRNb2RlbERlcHRoJyxcclxuICBhbGxvd2VkTmVzdGVkTW9kZWxzID0gJ2FsbG93ZWROZXN0ZWRNb2RlbHMnLFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBEeW5hbWljQ2xhc3NUcmFuc2Zvcm1PcHRpb25zID0gQ2xhc3NUcmFuc2Zvcm1PcHRpb25zICYge1xyXG4gIGV4Y2x1ZGVHcm91cHM/OiBzdHJpbmdbXTtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uczxUPiB7XHJcbiAgW0R5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNLZXlzLmNsYXNzVmFsaWRhdG9yT3B0aW9uc10/OiBWYWxpZGF0b3JPcHRpb25zO1xyXG4gIFtEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zS2V5cy5jbGFzc1RyYW5zZm9ybU9wdGlvbnNdPzogRHluYW1pY0NsYXNzVHJhbnNmb3JtT3B0aW9ucztcclxuICBbRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0tleXMuY2xhc3NUcmFuc2Zvcm1Ub1BsYWluT3B0aW9uc10/OiBDbGFzc1RyYW5zZm9ybU9wdGlvbnM7XHJcbiAgW0R5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNLZXlzLmFuZ3VsYXJWYWxpZGF0b3JzXT86IEFuZ3VsYXJDb250cm9sVmFsaWRhdG9yczxUPjtcclxuICBbRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0tleXMubWF4TmVzdGVkTW9kZWxEZXB0aF0/OiBudW1iZXI7XHJcbiAgW0R5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNLZXlzLmFsbG93ZWROZXN0ZWRNb2RlbHNdPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NWYWxpZGF0b3JFcnJvcnMge1xyXG4gIFtrZXk6IHN0cmluZ106IHtcclxuICAgIG1lc3NhZ2VzPzogc3RyaW5nW107XHJcbiAgICBjaGlsZHJlbj86IENsYXNzVmFsaWRhdG9yRXJyb3JzO1xyXG4gIH07XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBTaG9ydFZhbGlkYXRpb25FcnJvcnMge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfCBTaG9ydFZhbGlkYXRpb25FcnJvcnMgfCBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIER5bmFtaWNGb3JtR3JvdXA8VCA9IG5ldmVyLCBUSlNPTiA9IFQ+ID0gVW50eXBlZEZvcm1Hcm91cCAmXHJcbiAgRHluYW1pY0Zvcm1Qcm9wZXJ0aWVzPFQ+ICYge1xyXG4gICAgZ2xvYmFsRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0NoYW5nZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zOiBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPFQ+O1xyXG5cclxuICAgIGNvbW1vbkFzeW5jVmFsaWRhdG9yU3ViamVjdDogUmVwbGF5U3ViamVjdDxudWxsIHwgc3RyaW5nPjtcclxuICAgIGNvbW1vbkFzeW5jVmFsaWRhdG9yRmlyc3RDaGFuZ2VkOiBib29sZWFuO1xyXG4gICAgY29tbW9uQXN5bmNWYWxpZGF0b3JGaXJzdENoYW5nZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIGNvbW1vbkFzeW5jVmFsaWRhdG9yOiAoXHJcbiAgICAgIGNvbnRyb2w6IER5bmFtaWNGb3JtUHJvcGVydGllcyB8IEFic3RyYWN0Q29udHJvbFxyXG4gICAgKSA9PiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcclxuXHJcbiAgICBzZXRFeHRlcm5hbEVycm9ycyhleHRlcm5hbEVycm9yczogQ2xhc3NWYWxpZGF0b3JFcnJvcnMpOiB2b2lkO1xyXG4gICAgZ2V0RXh0ZXJuYWxFcnJvcnMoKTogQ2xhc3NWYWxpZGF0b3JFcnJvcnM7XHJcblxyXG4gICAgZ2V0Q2xhc3NWYWxpZGF0b3JFcnJvcnM6IChcclxuICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCxcclxuICAgICAgbnVsbElmRW1wdHk6IGJvb2xlYW5cclxuICAgICkgPT4gT2JzZXJ2YWJsZTxDbGFzc1ZhbGlkYXRvckVycm9yc1snJ10gfCBudWxsPjtcclxuXHJcbiAgICBzZXREeW5hbWljVmFsdWUoXHJcbiAgICAgIHZhbHVlOiBEZWVwUGFydGlhbDxUPixcclxuICAgICAgb3B0aW9ucz86IHtcclxuICAgICAgICBvbmx5U2VsZj86IGJvb2xlYW47XHJcbiAgICAgICAgZW1pdEV2ZW50PzogYm9vbGVhbjtcclxuICAgICAgfVxyXG4gICAgKTogdm9pZDtcclxuXHJcbiAgICBwYXRjaER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMoXHJcbiAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM6IER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM8VD5cclxuICAgICk6IHZvaWQ7XHJcblxyXG4gICAgcmVmcmVzaDogKCkgPT4gdm9pZDtcclxuXHJcbiAgICBvYmplY3Q6IFQ7XHJcbiAgICBqc29uOiBUSlNPTjtcclxuXHJcbiAgICBnZXRPYmplY3Q6ICgpID0+IFQ7XHJcbiAgICBzZXRPYmplY3Q6IChvYmplY3Q6IFQpID0+IHZvaWQ7XHJcblxyXG4gICAgZ2V0SlNPTjogKCkgPT4gVEpTT047XHJcbiAgICBzZXRKU09OOiAob2JqZWN0OiBUSlNPTikgPT4gdm9pZDtcclxuICB9O1xyXG4iXX0=","import { UntypedFormBuilder } from '@angular/forms';\r\nimport { createFormControls } from './lib';\r\nimport { DynamicFormBuilderOptionsKeys, } from './types/types';\r\nexport class DynamicFormBuilder extends UntypedFormBuilder {\r\n    rootFormGroup(classType, \r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    controlsConfig, \r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    options) {\r\n        let defaultValue = controlsConfig || {};\r\n        let dynamicFormBuilderOptions = options;\r\n        if (!options &&\r\n            Object.keys(controlsConfig || {}).find((controlName) => Object.keys(DynamicFormBuilderOptionsKeys).find((optionsKey) => optionsKey === controlName))) {\r\n            dynamicFormBuilderOptions = controlsConfig;\r\n            defaultValue = {};\r\n        }\r\n        const form = createFormControls({\r\n            classType,\r\n            form: super.group({}, dynamicFormBuilderOptions?.angularValidators ||\r\n                dynamicFormBuilderOptions),\r\n            formBuilder: this,\r\n            defaultValue,\r\n            dynamicFormBuilderOptions,\r\n        });\r\n        return form;\r\n    }\r\n    childFormGroup(\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    rootFormGroup, classType, \r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    controlsConfig) {\r\n        const defaultValue = controlsConfig || {};\r\n        const form = createFormControls({\r\n            classType,\r\n            form: super.group({}),\r\n            formBuilder: this,\r\n            defaultValue,\r\n            rootFormGroup,\r\n        });\r\n        return form;\r\n    }\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9mb3JtLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMzQyxPQUFPLEVBRUwsNkJBQTZCLEdBRTlCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxrQkFBa0I7SUFjeEQsYUFBYSxDQUNYLFNBQXFDO0lBQ3JDLDhEQUE4RDtJQUM5RCxjQUFvQjtJQUNwQiw4REFBOEQ7SUFDOUQsT0FBYTtRQUViLElBQUksWUFBWSxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDeEMsSUFBSSx5QkFBeUIsR0FBRyxPQUFPLENBQUM7UUFDeEMsSUFDRSxDQUFDLE9BQU87WUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsSUFBSSxDQUM3QyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FDM0MsQ0FDRixFQUNEO1lBQ0EseUJBQXlCLEdBQUcsY0FBYyxDQUFDO1lBQzNDLFlBQVksR0FBRyxFQUFFLENBQUM7U0FDbkI7UUFDRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBSTtZQUNqQyxTQUFTO1lBQ1QsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQ2YsRUFBRSxFQUNGLHlCQUF5QixFQUFFLGlCQUFpQjtnQkFDMUMseUJBQXlCLENBQzVCO1lBQ0QsV0FBVyxFQUFFLElBQUk7WUFDakIsWUFBWTtZQUNaLHlCQUF5QjtTQUMxQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFnQkQsY0FBYztJQUNaLDhEQUE4RDtJQUM5RCxhQUF5QyxFQUN6QyxTQUFxQztJQUNyQyw4REFBOEQ7SUFDOUQsY0FBb0I7UUFFcEIsTUFBTSxZQUFZLEdBQUcsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBSTtZQUNqQyxTQUFTO1lBQ1QsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFlBQVk7WUFDWixhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2xPcHRpb25zLCBVbnR5cGVkRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENsYXNzQ29uc3RydWN0b3IgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lci1nbG9iYWwtc3RvcmFnZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUZvcm1Db250cm9scyB9IGZyb20gJy4vbGliJztcclxuaW1wb3J0IHtcclxuICBEeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zLFxyXG4gIER5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNLZXlzLFxyXG4gIER5bmFtaWNGb3JtR3JvdXAsXHJcbn0gZnJvbSAnLi90eXBlcy90eXBlcyc7XHJcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUJ1aWxkZXIgZXh0ZW5kcyBVbnR5cGVkRm9ybUJ1aWxkZXIge1xyXG4gIHJvb3RGb3JtR3JvdXA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICAgIGNsYXNzVHlwZTogQ2xhc3NDb25zdHJ1Y3RvcjxUPiB8IG51bGwsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgY29udHJvbHNDb25maWc/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxyXG4gICAgb3B0aW9ucz86IChBYnN0cmFjdENvbnRyb2xPcHRpb25zICYgRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uczxUPikgfCBudWxsXHJcbiAgKTogRHluYW1pY0Zvcm1Hcm91cDxUPjtcclxuICByb290Rm9ybUdyb3VwPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXHJcbiAgICBjbGFzc1R5cGU6IENsYXNzQ29uc3RydWN0b3I8VD4gfCBudWxsLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGNvbnRyb2xzQ29uZmlnOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH1cclxuICApOiBEeW5hbWljRm9ybUdyb3VwPFQ+O1xyXG4gIHJvb3RGb3JtR3JvdXA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICAgIGNsYXNzVHlwZTogQ2xhc3NDb25zdHJ1Y3RvcjxUPiB8IG51bGwsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgY29udHJvbHNDb25maWc/OiBhbnksXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgb3B0aW9ucz86IGFueVxyXG4gICk6IER5bmFtaWNGb3JtR3JvdXA8VD4ge1xyXG4gICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGNvbnRyb2xzQ29uZmlnIHx8IHt9O1xyXG4gICAgbGV0IGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgaWYgKFxyXG4gICAgICAhb3B0aW9ucyAmJlxyXG4gICAgICBPYmplY3Qua2V5cyhjb250cm9sc0NvbmZpZyB8fCB7fSkuZmluZCgoY29udHJvbE5hbWUpID0+XHJcbiAgICAgICAgT2JqZWN0LmtleXMoRHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc0tleXMpLmZpbmQoXHJcbiAgICAgICAgICAob3B0aW9uc0tleSkgPT4gb3B0aW9uc0tleSA9PT0gY29udHJvbE5hbWVcclxuICAgICAgICApXHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICBkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zID0gY29udHJvbHNDb25maWc7XHJcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHt9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1Db250cm9sczxUPih7XHJcbiAgICAgIGNsYXNzVHlwZSxcclxuICAgICAgZm9ybTogc3VwZXIuZ3JvdXAoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucz8uYW5ndWxhclZhbGlkYXRvcnMgfHxcclxuICAgICAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnNcclxuICAgICAgKSxcclxuICAgICAgZm9ybUJ1aWxkZXI6IHRoaXMsXHJcbiAgICAgIGRlZmF1bHRWYWx1ZSxcclxuICAgICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICBjaGlsZEZvcm1Hcm91cDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIHJvb3RGb3JtR3JvdXA6IER5bmFtaWNGb3JtR3JvdXA8YW55LCBhbnk+LFxyXG4gICAgY2xhc3NUeXBlOiBDbGFzc0NvbnN0cnVjdG9yPFQ+IHwgbnVsbCxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBjb250cm9sc0NvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH1cclxuICApOiBEeW5hbWljRm9ybUdyb3VwPFQ+O1xyXG4gIGNoaWxkRm9ybUdyb3VwPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgcm9vdEZvcm1Hcm91cDogRHluYW1pY0Zvcm1Hcm91cDxhbnksIGFueT4sXHJcbiAgICBjbGFzc1R5cGU6IENsYXNzQ29uc3RydWN0b3I8VD4gfCBudWxsLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGNvbnRyb2xzQ29uZmlnOiB7IFtrZXk6IHN0cmluZ106IGFueSB9XHJcbiAgKTogRHluYW1pY0Zvcm1Hcm91cDxUPjtcclxuICBjaGlsZEZvcm1Hcm91cDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIHJvb3RGb3JtR3JvdXA6IER5bmFtaWNGb3JtR3JvdXA8YW55LCBhbnk+LFxyXG4gICAgY2xhc3NUeXBlOiBDbGFzc0NvbnN0cnVjdG9yPFQ+IHwgbnVsbCxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBjb250cm9sc0NvbmZpZz86IGFueVxyXG4gICk6IER5bmFtaWNGb3JtR3JvdXA8VD4ge1xyXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gY29udHJvbHNDb25maWcgfHwge307XHJcbiAgICBjb25zdCBmb3JtID0gY3JlYXRlRm9ybUNvbnRyb2xzPFQ+KHtcclxuICAgICAgY2xhc3NUeXBlLFxyXG4gICAgICBmb3JtOiBzdXBlci5ncm91cCh7fSksXHJcbiAgICAgIGZvcm1CdWlsZGVyOiB0aGlzLFxyXG4gICAgICBkZWZhdWx0VmFsdWUsXHJcbiAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtO1xyXG4gIH1cclxufVxyXG4iXX0=","import { __decorate } from \"tslib\";\r\nimport { Validate, ValidatorConstraint, } from 'class-validator-multi-lang';\r\nimport { getCustomDataToRootFormGroup, getDynamicControlOptions, setCustomDataToRootFormGroup, } from '../utils/utils';\r\nexport function ValidateIfUpdater(updaterFn) {\r\n    return Validate(dynamicValidateIfUpdater(updaterFn));\r\n}\r\nexport function dynamicValidateIfUpdater(updaterFn) {\r\n    let ValidateIfUpdaterConstraint = class ValidateIfUpdaterConstraint {\r\n        validate(value, validationArguments) {\r\n            const dynamicFormBuilderOptions = getDynamicControlOptions(validationArguments?.object);\r\n            const rootFormGroup = dynamicFormBuilderOptions?.control\r\n                .root;\r\n            if (rootFormGroup) {\r\n                const key = `${ValidateIfUpdater.name}_${dynamicFormBuilderOptions?.controlPath}`;\r\n                const prevValue = getCustomDataToRootFormGroup(rootFormGroup, key, null);\r\n                if (value !== prevValue) {\r\n                    setTimeout(() => {\r\n                        const appiled = updaterFn(dynamicFormBuilderOptions?.controlPath, value, rootFormGroup, dynamicFormBuilderOptions);\r\n                        if (appiled) {\r\n                            setCustomDataToRootFormGroup(rootFormGroup, key, value);\r\n                        }\r\n                    }, 100);\r\n                }\r\n            }\r\n            return true;\r\n        }\r\n    };\r\n    ValidateIfUpdaterConstraint = __decorate([\r\n        ValidatorConstraint()\r\n    ], ValidateIfUpdaterConstraint);\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    return ValidateIfUpdaterConstraint;\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWR5bmFtaWMtZm9ybS1idWlsZGVyL3NyYy9saWIvZGVjb3JhdG9ycy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ0wsUUFBUSxFQUVSLG1CQUFtQixHQUVwQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsd0JBQXdCLEVBQ3hCLDRCQUE0QixHQUM3QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsU0FLWTtJQUVaLE9BQU8sUUFBUSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FLWTtJQUdaLElBQU0sMkJBQTJCLEdBQWpDLE1BQU0sMkJBQTJCO1FBQy9CLFFBQVEsQ0FBQyxLQUFhLEVBQUUsbUJBQXlDO1lBQy9ELE1BQU0seUJBQXlCLEdBQUcsd0JBQXdCLENBQ3hELG1CQUFtQixFQUFFLE1BQU0sQ0FDNUIsQ0FBQztZQUNGLE1BQU0sYUFBYSxHQUFHLHlCQUF5QixFQUFFLE9BQU87aUJBQ3JELElBQXVCLENBQUM7WUFDM0IsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLE1BQU0sR0FBRyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxJQUFJLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUNsRixNQUFNLFNBQVMsR0FBRyw0QkFBNEIsQ0FDNUMsYUFBYSxFQUNiLEdBQUcsRUFDSCxJQUFJLENBQ0wsQ0FBQztnQkFDRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUN2Qix5QkFBeUIsRUFBRSxXQUFXLEVBQ3RDLEtBQUssRUFDTCxhQUFhLEVBQ2IseUJBQXlCLENBQzFCLENBQUM7d0JBQ0YsSUFBSSxPQUFPLEVBQUU7NEJBQ1gsNEJBQTRCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDekQ7b0JBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUNUO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFBO0lBOUJLLDJCQUEyQjtRQURoQyxtQkFBbUIsRUFBRTtPQUNoQiwyQkFBMkIsQ0E4QmhDO0lBQ0QsOERBQThEO0lBQzlELE9BQU8sMkJBQWtDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICBWYWxpZGF0ZSxcclxuICBWYWxpZGF0aW9uQXJndW1lbnRzLFxyXG4gIFZhbGlkYXRvckNvbnN0cmFpbnQsXHJcbiAgVmFsaWRhdG9yQ29uc3RyYWludEludGVyZmFjZSxcclxufSBmcm9tICdjbGFzcy12YWxpZGF0b3ItbXVsdGktbGFuZyc7XHJcbmltcG9ydCB7IER5bmFtaWNDb250cm9sT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBnZXRDdXN0b21EYXRhVG9Sb290Rm9ybUdyb3VwLFxyXG4gIGdldER5bmFtaWNDb250cm9sT3B0aW9ucyxcclxuICBzZXRDdXN0b21EYXRhVG9Sb290Rm9ybUdyb3VwLFxyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBWYWxpZGF0ZUlmVXBkYXRlcihcclxuICB1cGRhdGVyRm46IChcclxuICAgIGNvbnRyb2xQYXRoOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nLFxyXG4gICAgcm9vdEZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sLFxyXG4gICAgZHluYW1pY0NvbnRyb2xPcHRpb25zOiBEeW5hbWljQ29udHJvbE9wdGlvbnNcclxuICApID0+IGJvb2xlYW5cclxuKSB7XHJcbiAgcmV0dXJuIFZhbGlkYXRlKGR5bmFtaWNWYWxpZGF0ZUlmVXBkYXRlcih1cGRhdGVyRm4pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNWYWxpZGF0ZUlmVXBkYXRlcihcclxuICB1cGRhdGVyRm46IChcclxuICAgIGNvbnRyb2xQYXRoOiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nLFxyXG4gICAgcm9vdEZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sLFxyXG4gICAgZHluYW1pY0NvbnRyb2xPcHRpb25zOiBEeW5hbWljQ29udHJvbE9wdGlvbnNcclxuICApID0+IGJvb2xlYW5cclxuKSB7XHJcbiAgQFZhbGlkYXRvckNvbnN0cmFpbnQoKVxyXG4gIGNsYXNzIFZhbGlkYXRlSWZVcGRhdGVyQ29uc3RyYWludCBpbXBsZW1lbnRzIFZhbGlkYXRvckNvbnN0cmFpbnRJbnRlcmZhY2Uge1xyXG4gICAgdmFsaWRhdGUodmFsdWU6IHN0cmluZywgdmFsaWRhdGlvbkFyZ3VtZW50cz86IFZhbGlkYXRpb25Bcmd1bWVudHMpIHtcclxuICAgICAgY29uc3QgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9ucyA9IGdldER5bmFtaWNDb250cm9sT3B0aW9ucyhcclxuICAgICAgICB2YWxpZGF0aW9uQXJndW1lbnRzPy5vYmplY3RcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM/LmNvbnRyb2xcclxuICAgICAgICAucm9vdCBhcyBBYnN0cmFjdENvbnRyb2w7XHJcbiAgICAgIGlmIChyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7VmFsaWRhdGVJZlVwZGF0ZXIubmFtZX1fJHtkeW5hbWljRm9ybUJ1aWxkZXJPcHRpb25zPy5jb250cm9sUGF0aH1gO1xyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGdldEN1c3RvbURhdGFUb1Jvb3RGb3JtR3JvdXAoXHJcbiAgICAgICAgICByb290Rm9ybUdyb3VwLFxyXG4gICAgICAgICAga2V5LFxyXG4gICAgICAgICAgbnVsbFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSBwcmV2VmFsdWUpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcHBpbGVkID0gdXBkYXRlckZuKFxyXG4gICAgICAgICAgICAgIGR5bmFtaWNGb3JtQnVpbGRlck9wdGlvbnM/LmNvbnRyb2xQYXRoLFxyXG4gICAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICAgIHJvb3RGb3JtR3JvdXAsXHJcbiAgICAgICAgICAgICAgZHluYW1pY0Zvcm1CdWlsZGVyT3B0aW9uc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoYXBwaWxlZCkge1xyXG4gICAgICAgICAgICAgIHNldEN1c3RvbURhdGFUb1Jvb3RGb3JtR3JvdXAocm9vdEZvcm1Hcm91cCwga2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHJldHVybiBWYWxpZGF0ZUlmVXBkYXRlckNvbnN0cmFpbnQgYXMgYW55O1xyXG59XHJcbiJdfQ==","import { Expose, Transform, } from 'class-transformer-global-storage';\r\n// for correct work expose with js object\r\n// https://github.com/typestack/class-transformer/issues/365\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function ExposeNested(options) {\r\n    const exposeFn = Expose(options);\r\n    const transformFn = (propertyKey) => Transform((params) => {\r\n        return ((params.obj && Object.getOwnPropertyDescriptor(params.obj, propertyKey)\r\n            ? params.obj[propertyKey]\r\n            : options?.default) || params.value);\r\n    });\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    return (target, propertyKey) => {\r\n        transformFn(propertyKey)(target, propertyKey);\r\n        exposeFn(target, propertyKey);\r\n    };\r\n}\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3NlLW5lc3RlZC5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1keW5hbWljLWZvcm0tYnVpbGRlci9zcmMvbGliL2RlY29yYXRvcnMvZXhwb3NlLW5lc3RlZC5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBRVYsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyx5Q0FBeUM7QUFDekMsNERBQTREO0FBQzVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQTBDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRSxDQUMxQyxTQUFTLENBQUMsQ0FBQyxNQUF5QixFQUFFLEVBQUU7UUFDdEMsT0FBTyxDQUNMLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUM7WUFDckUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FDdEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsOERBQThEO0lBQzlELE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1FBQzFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFeHBvc2UsXHJcbiAgRXhwb3NlT3B0aW9ucyxcclxuICBUcmFuc2Zvcm0sXHJcbiAgVHJhbnNmb3JtRm5QYXJhbXMsXHJcbn0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXItZ2xvYmFsLXN0b3JhZ2UnO1xyXG5cclxuLy8gZm9yIGNvcnJlY3Qgd29yayBleHBvc2Ugd2l0aCBqcyBvYmplY3RcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R5cGVzdGFjay9jbGFzcy10cmFuc2Zvcm1lci9pc3N1ZXMvMzY1XHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmV4cG9ydCBmdW5jdGlvbiBFeHBvc2VOZXN0ZWQob3B0aW9ucz86IEV4cG9zZU9wdGlvbnMgJiB7IGRlZmF1bHQ6IGFueSB9KSB7XHJcbiAgY29uc3QgZXhwb3NlRm4gPSBFeHBvc2Uob3B0aW9ucyk7XHJcbiAgY29uc3QgdHJhbnNmb3JtRm4gPSAocHJvcGVydHlLZXk6IHN0cmluZykgPT5cclxuICAgIFRyYW5zZm9ybSgocGFyYW1zOiBUcmFuc2Zvcm1GblBhcmFtcykgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIChwYXJhbXMub2JqICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocGFyYW1zLm9iaiwgcHJvcGVydHlLZXkpXHJcbiAgICAgICAgICA/IHBhcmFtcy5vYmpbcHJvcGVydHlLZXldXHJcbiAgICAgICAgICA6IG9wdGlvbnM/LmRlZmF1bHQpIHx8IHBhcmFtcy52YWx1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICB0cmFuc2Zvcm1Gbihwcm9wZXJ0eUtleSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XHJcbiAgICBleHBvc2VGbih0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxuICB9O1xyXG59XHJcbiJdfQ==","/**\r\n * Generated bundle index. Do not edit.\r\n */\r\nexport * from './index';\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieW9vbGFicy1uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL25neC1keW5hbWljLWZvcm0tYnVpbGRlci9zcmMveW9vbGFicy1uZ3gtZHluYW1pYy1mb3JtLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}