UNPKG

angular-reactive-validation

Version:

Reactive Forms validation shouldn't require the developer to write lots of HTML to show validation messages. This library makes it easy.

80 lines 13.9 kB
/** * @dynamic */ export class ValidatorDeclaration { /** * Wraps your own validator functions for use with the angular-reactive-validation library. * * @param validatorFn A function you want to wrap which can validate a control. * @param resultKey The error key used for indicating an error result as returned from the ValidatorFn. */ static wrapNoArgumentValidator(validatorFn, resultKey) { return (message) => (control) => ValidatorDeclaration.validateAndSetMessageIfInvalid(control, () => validatorFn, resultKey, message); } /** * Wraps your own validator functions for use with the angular-reactive-validation library. * * @param validatorFactoryFn A function which accepts a single argument and returns a ValidatorFn. * @param resultKey The error key used for indicating an error result as returned from the ValidatorFn. */ static wrapSingleArgumentValidator(validatorFactoryFn, resultKey) { return (arg1, message) => (control) => { const unwrappedArg1 = ValidatorDeclaration.unwrapArgument(arg1); return ValidatorDeclaration.validateAndSetMessageIfInvalid(control, validatorFactoryFn, resultKey, message, unwrappedArg1); }; } /** * Wraps your own validator functions for use with the angular-reactive-validation library. * * @param validatorFactoryFn A function which accepts two arguments and returns a ValidatorFn. * @param resultKey The error key used for indicating an error result as returned from the ValidatorFn. */ static wrapTwoArgumentValidator(validatorFactoryFn, resultKey) { return (arg1, arg2, message) => (control) => { const unwrappedArg1 = ValidatorDeclaration.unwrapArgument(arg1); const unwrappedArg2 = ValidatorDeclaration.unwrapArgument(arg2); return ValidatorDeclaration.validateAndSetMessageIfInvalid(control, validatorFactoryFn, resultKey, message, unwrappedArg1, unwrappedArg2); }; } static unwrapArgument(arg) { if (arg instanceof Function) { arg = arg(); } return arg; } static validateAndSetMessageIfInvalid(control, // eslint-disable-next-line @typescript-eslint/no-shadow validatorFactoryFn, resultKey, // eslint-disable-next-line @typescript-eslint/no-shadow message, ...args) { const validationResult = ValidatorDeclaration.validate(control, validatorFactoryFn, ...args); ValidatorDeclaration.setMessageIfInvalid(control, resultKey, validationResult, message, ...args); return validationResult; } // eslint-disable-next-line @typescript-eslint/no-shadow static validate(control, validatorFactoryFn, ...args) { const wrappedValidatorFn = validatorFactoryFn(...args); return wrappedValidatorFn(control); } static setMessageIfInvalid(control, resultKey, // eslint-disable-next-line @typescript-eslint/no-shadow validationResult, message, ...args) { if (message) { if (validationResult && validationResult[resultKey]) { if (typeof message === 'function') { message = message(...args); } // Not all validators set an object. Often they'll simply set a property to true. // Here, we replace any non-object (or array) to be an object on which we can set a message. if (!ValidatorDeclaration.isObject(validationResult[resultKey])) { validationResult[resultKey] = {}; } validationResult[resultKey]['message'] = message; } } } static isObject(arg) { return arg !== null && typeof arg === 'object' && !Array.isArray(arg); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLWRlY2xhcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1yZWFjdGl2ZS12YWxpZGF0aW9uL3NyYy9saWIvdmFsaWRhdG9yLWRlY2xhcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxXQUF3QixFQUFFLFNBQWlCO1FBRXRFLE9BQU8sQ0FBQyxPQUFpQyxFQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQXdCLEVBQTJCLEVBQUUsQ0FDakgsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLDJCQUEyQixDQUFTLGtCQUFtRCxFQUFFLFNBQWlCO1FBRzdHLE9BQU8sQ0FBQyxJQUE2QixFQUFFLE9BQTZDLEVBQWUsRUFBRSxDQUNyRyxDQUFDLE9BQXdCLEVBQTJCLEVBQUU7WUFDbEQsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhFLE9BQU8sb0JBQW9CLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDN0gsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLHdCQUF3QixDQUFtQixrQkFBbUUsRUFBRSxTQUFpQjtRQUlwSSxPQUFPLENBQUMsSUFBK0IsRUFBRSxJQUErQixFQUN0RSxPQUE2RCxFQUFlLEVBQUUsQ0FDOUUsQ0FBQyxPQUF3QixFQUEyQixFQUFFO1lBQ3BELE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRSxNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEUsT0FBTyxvQkFBb0IsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFDeEcsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFTyxNQUFNLENBQUMsY0FBYyxDQUFJLEdBQWtCO1FBQ2pELElBQUksR0FBRyxZQUFZLFFBQVEsRUFBRSxDQUFDO1lBQzVCLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxNQUFNLENBQUMsOEJBQThCLENBQUMsT0FBd0I7SUFDcEUsd0RBQXdEO0lBQ3hELGtCQUFtRCxFQUFFLFNBQWlCO0lBQ3RFLHdEQUF3RDtJQUN4RCxPQUErQyxFQUFFLEdBQUcsSUFBVztRQUU3RCxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3RixvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRWpHLE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVELHdEQUF3RDtJQUNoRCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQXdCLEVBQUUsa0JBQW1ELEVBQUUsR0FBRyxJQUFXO1FBR2pILE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2RCxPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBd0IsRUFBRSxTQUFpQjtJQUM1RSx3REFBd0Q7SUFDeEQsZ0JBQXlDLEVBQUUsT0FBK0MsRUFBRSxHQUFHLElBQVc7UUFDMUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELGlGQUFpRjtnQkFDakYsNEZBQTRGO2dCQUM1RixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNuQyxDQUFDO2dCQUVELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVE7UUFDOUIsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFsaWRhdG9yRm4sIFZhbGlkYXRpb25FcnJvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBAZHluYW1pY1xuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yRGVjbGFyYXRpb24ge1xuICAvKipcbiAgICogV3JhcHMgeW91ciBvd24gdmFsaWRhdG9yIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGggdGhlIGFuZ3VsYXItcmVhY3RpdmUtdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yRm4gQSBmdW5jdGlvbiB5b3Ugd2FudCB0byB3cmFwIHdoaWNoIGNhbiB2YWxpZGF0ZSBhIGNvbnRyb2wuXG4gICAqIEBwYXJhbSByZXN1bHRLZXkgVGhlIGVycm9yIGtleSB1c2VkIGZvciBpbmRpY2F0aW5nIGFuIGVycm9yIHJlc3VsdCBhcyByZXR1cm5lZCBmcm9tIHRoZSBWYWxpZGF0b3JGbi5cbiAgICovXG4gIHN0YXRpYyB3cmFwTm9Bcmd1bWVudFZhbGlkYXRvcih2YWxpZGF0b3JGbjogVmFsaWRhdG9yRm4sIHJlc3VsdEtleTogc3RyaW5nKTpcbiAgICAobWVzc2FnZT86IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKSA9PiBWYWxpZGF0b3JGbiB7XG4gICAgICByZXR1cm4gKG1lc3NhZ2U/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSk6IFZhbGlkYXRvckZuID0+IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PlxuICAgICAgVmFsaWRhdG9yRGVjbGFyYXRpb24udmFsaWRhdGVBbmRTZXRNZXNzYWdlSWZJbnZhbGlkKGNvbnRyb2wsICgpID0+IHZhbGlkYXRvckZuLCByZXN1bHRLZXksIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIHlvdXIgb3duIHZhbGlkYXRvciBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHRoZSBhbmd1bGFyLXJlYWN0aXZlLXZhbGlkYXRpb24gbGlicmFyeS5cbiAgICpcbiAgICogQHBhcmFtIHZhbGlkYXRvckZhY3RvcnlGbiBBIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIHJldHVybnMgYSBWYWxpZGF0b3JGbi5cbiAgICogQHBhcmFtIHJlc3VsdEtleSBUaGUgZXJyb3Iga2V5IHVzZWQgZm9yIGluZGljYXRpbmcgYW4gZXJyb3IgcmVzdWx0IGFzIHJldHVybmVkIGZyb20gdGhlIFZhbGlkYXRvckZuLlxuICAgKi9cbiAgc3RhdGljIHdyYXBTaW5nbGVBcmd1bWVudFZhbGlkYXRvcjxUSW5wdXQ+KHZhbGlkYXRvckZhY3RvcnlGbjogKChhcmcxOiBUSW5wdXQpID0+IFZhbGlkYXRvckZuKSwgcmVzdWx0S2V5OiBzdHJpbmcpOlxuICAgIChhcmcxOiBUSW5wdXQgfCAoKCkgPT4gVElucHV0KSwgbWVzc2FnZT86IHN0cmluZyB8ICgoYXJnMTogVElucHV0KSA9PiBzdHJpbmcpKSA9PiBWYWxpZGF0b3JGbiB7XG5cbiAgICAgIHJldHVybiAoYXJnMTogVElucHV0IHwgKCgpID0+IFRJbnB1dCksIG1lc3NhZ2U/OiBzdHJpbmcgfCAoKGFyZzE6IFRJbnB1dCkgPT4gc3RyaW5nKSk6IFZhbGlkYXRvckZuID0+XG4gICAgICAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICAgIGNvbnN0IHVud3JhcHBlZEFyZzEgPSBWYWxpZGF0b3JEZWNsYXJhdGlvbi51bndyYXBBcmd1bWVudChhcmcxKTtcblxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JEZWNsYXJhdGlvbi52YWxpZGF0ZUFuZFNldE1lc3NhZ2VJZkludmFsaWQoY29udHJvbCwgdmFsaWRhdG9yRmFjdG9yeUZuLCByZXN1bHRLZXksIG1lc3NhZ2UsIHVud3JhcHBlZEFyZzEpO1xuICAgICAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIHlvdXIgb3duIHZhbGlkYXRvciBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHRoZSBhbmd1bGFyLXJlYWN0aXZlLXZhbGlkYXRpb24gbGlicmFyeS5cbiAgICpcbiAgICogQHBhcmFtIHZhbGlkYXRvckZhY3RvcnlGbiBBIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIFZhbGlkYXRvckZuLlxuICAgKiBAcGFyYW0gcmVzdWx0S2V5IFRoZSBlcnJvciBrZXkgdXNlZCBmb3IgaW5kaWNhdGluZyBhbiBlcnJvciByZXN1bHQgYXMgcmV0dXJuZWQgZnJvbSB0aGUgVmFsaWRhdG9yRm4uXG4gICAqL1xuICBzdGF0aWMgd3JhcFR3b0FyZ3VtZW50VmFsaWRhdG9yPFRJbnB1dDEsIFRJbnB1dDI+KHZhbGlkYXRvckZhY3RvcnlGbjogKChhcmcxOiBUSW5wdXQxLCBhcmcyOiBUSW5wdXQyKSA9PiBWYWxpZGF0b3JGbiksIHJlc3VsdEtleTogc3RyaW5nKTpcbiAgICAoYXJnMTogVElucHV0MSB8ICgoKSA9PiBUSW5wdXQxKSwgYXJnMjogVElucHV0MiB8ICgoKSA9PiBUSW5wdXQyKSwgbWVzc2FnZT86IHN0cmluZyB8ICgoYXJnMTogVElucHV0MSwgYXJnMjogVElucHV0MikgPT4gc3RyaW5nKSkgPT5cbiAgICBWYWxpZGF0b3JGbiB7XG5cbiAgICAgIHJldHVybiAoYXJnMTogVElucHV0MSB8ICgoKSA9PiBUSW5wdXQxKSwgYXJnMjogVElucHV0MiB8ICgoKSA9PiBUSW5wdXQyKSxcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8ICgoYXJnMTogVElucHV0MSwgYXJnMjogVElucHV0MikgPT4gc3RyaW5nKSk6IFZhbGlkYXRvckZuID0+XG4gICAgICAgIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgICAgY29uc3QgdW53cmFwcGVkQXJnMSA9IFZhbGlkYXRvckRlY2xhcmF0aW9uLnVud3JhcEFyZ3VtZW50KGFyZzEpO1xuICAgICAgICAgIGNvbnN0IHVud3JhcHBlZEFyZzIgPSBWYWxpZGF0b3JEZWNsYXJhdGlvbi51bndyYXBBcmd1bWVudChhcmcyKTtcblxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JEZWNsYXJhdGlvbi52YWxpZGF0ZUFuZFNldE1lc3NhZ2VJZkludmFsaWQoY29udHJvbCwgdmFsaWRhdG9yRmFjdG9yeUZuLCByZXN1bHRLZXksIG1lc3NhZ2UsXG4gICAgICAgICAgICB1bndyYXBwZWRBcmcxLCB1bndyYXBwZWRBcmcyKTtcbiAgICAgICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVud3JhcEFyZ3VtZW50PFQ+KGFyZzogVCB8ICgoKSA9PiBUKSk6IFQge1xuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgYXJnID0gYXJnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlQW5kU2V0TWVzc2FnZUlmSW52YWxpZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgICB2YWxpZGF0b3JGYWN0b3J5Rm46ICguLi5hcmdzOiBhbnlbXSkgPT4gVmFsaWRhdG9yRm4sIHJlc3VsdEtleTogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93XG4gICAgbWVzc2FnZT86IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IHN0cmluZyksIC4uLmFyZ3M6IGFueVtdKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gVmFsaWRhdG9yRGVjbGFyYXRpb24udmFsaWRhdGUoY29udHJvbCwgdmFsaWRhdG9yRmFjdG9yeUZuLCAuLi5hcmdzKTtcbiAgICAgIFZhbGlkYXRvckRlY2xhcmF0aW9uLnNldE1lc3NhZ2VJZkludmFsaWQoY29udHJvbCwgcmVzdWx0S2V5LCB2YWxpZGF0aW9uUmVzdWx0LCBtZXNzYWdlLCAuLi5hcmdzKTtcblxuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHZhbGlkYXRvckZhY3RvcnlGbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBWYWxpZGF0b3JGbiwgLi4uYXJnczogYW55W10pOlxuICAgIFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcblxuICAgICAgY29uc3Qgd3JhcHBlZFZhbGlkYXRvckZuID0gdmFsaWRhdG9yRmFjdG9yeUZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIHdyYXBwZWRWYWxpZGF0b3JGbihjb250cm9sKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldE1lc3NhZ2VJZkludmFsaWQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCByZXN1bHRLZXk6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuICAgIHZhbGlkYXRpb25SZXN1bHQ6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsLCBtZXNzYWdlPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nKSwgLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQgJiYgdmFsaWRhdGlvblJlc3VsdFtyZXN1bHRLZXldKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlKC4uLmFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGFsbCB2YWxpZGF0b3JzIHNldCBhbiBvYmplY3QuIE9mdGVuIHRoZXknbGwgc2ltcGx5IHNldCBhIHByb3BlcnR5IHRvIHRydWUuXG4gICAgICAgIC8vIEhlcmUsIHdlIHJlcGxhY2UgYW55IG5vbi1vYmplY3QgKG9yIGFycmF5KSB0byBiZSBhbiBvYmplY3Qgb24gd2hpY2ggd2UgY2FuIHNldCBhIG1lc3NhZ2UuXG4gICAgICAgIGlmICghVmFsaWRhdG9yRGVjbGFyYXRpb24uaXNPYmplY3QodmFsaWRhdGlvblJlc3VsdFtyZXN1bHRLZXldKSkge1xuICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHRbcmVzdWx0S2V5XSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdFtyZXN1bHRLZXldWydtZXNzYWdlJ10gPSBtZXNzYWdlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzT2JqZWN0KGFyZzogYW55KSB7XG4gICAgcmV0dXJuIGFyZyAhPT0gbnVsbCAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG59XG4iXX0=