UNPKG

@ng-flexy/form

Version:

Flexy components and tools to build Angular 8+ applications

413 lines 42.6 kB
import { uniq } from 'lodash'; export var FlexyFormsValidators; (function (FlexyFormsValidators) { function notEmptyValidator(control) { if (!control) { return null; } if (FlexyFormsValidators.isEmpty(control)) { return { 'not-empty': true }; } return null; } FlexyFormsValidators.notEmptyValidator = notEmptyValidator; function noWhitespaceValidator(control) { if (!control) { return null; } if ((control.value || '').trim().length === 0) { return { whitespace: true }; } return null; } FlexyFormsValidators.noWhitespaceValidator = noWhitespaceValidator; function emailValidator(control) { if (!control) { return null; } const re = new RegExp([ '^(([^<>()\\[\\]\\\\.,;:!#\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:!#\\s@"]+)*)|(".+"))@', '((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)', '+[a-zA-Z]{2,})|([a-zA-Z\\-0-9]+))$' ].join('')); if (!FlexyFormsValidators.isEmpty(control) && !re.test(control.value)) { return { 'invalid-email': { currentValue: control.value } }; } return null; } FlexyFormsValidators.emailValidator = emailValidator; function booleanValidator(control) { if (!control) { return null; } if (!FlexyFormsValidators.isEmpty(control) && typeof control.value !== 'boolean') { return { 'invalid-boolean': { currentValue: control.value } }; } return null; } FlexyFormsValidators.booleanValidator = booleanValidator; function integerValidator(control) { if (!control) { return null; } const re = /^-?\d+$/; if (!FlexyFormsValidators.isEmpty(control) && !re.test(control.value)) { return { 'invalid-integer': { currentValue: control.value } }; } return null; } FlexyFormsValidators.integerValidator = integerValidator; function minValidator(min) { return (control) => { if (!control) { return null; } if (!(min || min === 0)) { return { 'invalid-min': { wrongConfiguration: true } }; } const notNumber = FlexyFormsValidators.numberValidator(control); if (notNumber) { return notNumber; } if ((!FlexyFormsValidators.isEmpty(control) || control.value === 0) && control.value < min) { return { 'invalid-min': { minimumValue: min, currentValue: control.value } }; } return null; }; } FlexyFormsValidators.minValidator = minValidator; function maxValidator(max) { return (control) => { if (!control) { return null; } if (!(max || max === 0)) { return { 'invalid-max': { wrongConfiguration: true } }; } const notNumber = FlexyFormsValidators.numberValidator(control); if (notNumber) { return notNumber; } if ((!FlexyFormsValidators.isEmpty(control) || control.value === 0) && control.value > max) { return { 'invalid-max': { maximumValue: max, currentValue: control.value } }; } return null; }; } FlexyFormsValidators.maxValidator = maxValidator; function numberValidator(control) { if (!control) { return null; } const re = /^-?(\d+\.?\d*)$|^(\d*\.?\d+)$/; if (!FlexyFormsValidators.isEmpty(control) && !re.test(control.value)) { return { 'invalid-number': { currentValue: control.value } }; } return null; } FlexyFormsValidators.numberValidator = numberValidator; function minLengthArray(min) { return (control) => { if (!control) { return null; } if (!(min || min === 0)) { return { 'min-length-array': { wrongConfiguration: true } }; } if (control.value && Array.isArray(control.value) && control.value.length >= min) { return null; } return { 'min-length-array': { minimumLength: min, currentLength: control.value } }; }; } FlexyFormsValidators.minLengthArray = minLengthArray; function maxLengthArray(max) { return (control) => { if (!control) { return null; } if (!(max || max === 0)) { return { 'max-length-array': { wrongConfiguration: true } }; } if (control.value && control.value.length <= max) { return null; } return { 'max-length-array': { maximumLength: max, currentLength: control.value } }; }; } FlexyFormsValidators.maxLengthArray = maxLengthArray; function isEmpty(control) { if (!control) { return null; } if (!control.value || (Array.isArray(control.value) && control.value.length === 0)) { return true; } else { return false; } } FlexyFormsValidators.isEmpty = isEmpty; function urlValidator(control) { if (!control) { return null; } const re = new RegExp([ '((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]', '+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%\\/\\.\\w\\-_]*)?\\??', '(?:[\\-\\+=&;%@\\.\\w_]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)' ].join('')); if (!FlexyFormsValidators.isEmpty(control) && !re.test(control.value)) { return { 'invalid-url': { currentValue: control.value } }; } return null; } FlexyFormsValidators.urlValidator = urlValidator; function crossFieldValidator(fields) { return (control) => { if (!control) { return null; } if (!(fields && fields.lower && fields.greater)) { return { 'cross-field-invalid': { wrongConfiguration: true } }; } const lower = getControl(fields.lower.path, control); const greater = getControl(fields.greater.path, control); if (!(greater && greater.valid && lower && lower.valid && greater.value < lower.value)) { return null; } return { 'cross-field-invalid': { greater: fields.greater.name, greaterPath: fields.greater.path, greaterValue: greater && greater.value, lower: fields.lower.name, lowerPath: fields.lower.path, lowerValue: lower && lower.value } }; }; } FlexyFormsValidators.crossFieldValidator = crossFieldValidator; function crossFieldMinValidator(minPath) { return (control) => { if (!control) { return null; } if (!minPath) { return { 'invalid-min': { wrongConfiguration: true } }; } const min = getControl(minPath, control); if (!(min && control.valid && control.value < min.value)) { return null; } return { 'invalid-min': { minimumValue: min.value, currentValue: control.value } }; }; } FlexyFormsValidators.crossFieldMinValidator = crossFieldMinValidator; function crossFieldMaxValidator(maxPath) { return (control) => { if (!control) { return null; } if (!maxPath) { return { 'invalid-max': { wrongConfiguration: true } }; } const max = getControl(maxPath, control); if (!(max && control.valid && control.value > max.value)) { return null; } return { 'invalid-max': { maximumValue: max.value, currentValue: control.value } }; }; } FlexyFormsValidators.crossFieldMaxValidator = crossFieldMaxValidator; function crossFieldAbsoluteMinValidator(minPath) { return (control) => { if (!control) { return null; } if (!minPath) { return { 'absolute-min-invalid': { wrongConfiguration: true } }; } const min = getControl(minPath, control); if (min && control.valid && min.valid && Math.abs(control.value) >= min.value) { return null; } return { 'absolute-min-invalid': { min: min.value, currentValue: control.value } }; }; } FlexyFormsValidators.crossFieldAbsoluteMinValidator = crossFieldAbsoluteMinValidator; function forbiddenValuesValidator(forbiddenValues) { return (control) => { if (!control) { return null; } if (!forbiddenValues) { return { 'forbidden-value': { wrongConfiguration: true } }; } if (!forbiddenValues.includes(control.value)) { return null; } return { 'forbidden-value': { value: control.value } }; }; } FlexyFormsValidators.forbiddenValuesValidator = forbiddenValuesValidator; function arrayUniqueFieldsValidator(data) { return (control) => { if (!control || !control.controls) { return null; } if (!(data && data.path)) { return { 'value-duplicate': { wrongConfiguration: true } }; } const comparedValues = []; control.controls.forEach(item => { const compared = getControl(data.path, item); if (compared) { comparedValues.push(compared.value); } }); if (uniq(comparedValues).length === comparedValues.length) { return null; } return { 'value-duplicate': { field: data.fieldName } }; }; } FlexyFormsValidators.arrayUniqueFieldsValidator = arrayUniqueFieldsValidator; function getControl(path, control) { let arrayPath = []; if (Array.isArray(path)) { arrayPath = path; } else if (path) { const parents = ('' + path).indexOf('../') !== -1 ? path.split('../') : [path]; const sPath = '' + parents.pop(); const stringPath = sPath.split('.').map(i => { if (i.match(/^[0-9]+$/)) { return parseInt(i, 10); } else { return i; } }); parents.fill('../'); parents.push(...stringPath); arrayPath = parents; } arrayPath.forEach(i => { if (control && control.parent && i === '../') { control = control.parent; } else if (control && control.controls) { control = Number.isInteger(i) ? control.get(Object.keys(control.controls)[i]) : control.controls[i]; } }); return control; } })(FlexyFormsValidators || (FlexyFormsValidators = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi92YWxpZGF0b3JzL3ZhbGlkYXRvcnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFhLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWlCekMsTUFBTSxLQUFXLG9CQUFvQixDQTZacEM7QUE3WkQsV0FBaUIsb0JBQW9CO0lBQ25DLFNBQWdCLGlCQUFpQixDQUFDLE9BQW9CO1FBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekMsT0FBTztnQkFDTCxXQUFXLEVBQUUsSUFBSTthQUNsQixDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFWZSxzQ0FBaUIsb0JBVWhDLENBQUE7SUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFvQjtRQUN4RCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVJlLDBDQUFxQix3QkFRcEMsQ0FBQTtJQUVELFNBQWdCLGNBQWMsQ0FBQyxPQUFvQjtRQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUNuQjtZQUNFLCtFQUErRTtZQUMvRSxnRkFBZ0Y7WUFDaEYsb0NBQW9D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QUFFO2dCQUN0QyxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JHO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQyxFQTdaZ0Isb0JBQW9CLEtBQXBCLG9CQUFvQixRQTZacEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9yRm4sIEZvcm1BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNsb25lRGVlcCwgdW5pcSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBzaGlmdCB9IGZyb20gJ25neC1ib290c3RyYXAvcG9zaXRpb25pbmcvbW9kaWZpZXJzJztcbmltcG9ydCB7IHRpbWVwaWNrZXJSZWR1Y2VyIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90aW1lcGlja2VyL3JlZHVjZXIvdGltZXBpY2tlci5yZWR1Y2VyJztcblxudHlwZSBDb250cm9sUGF0aCA9IChzdHJpbmcgfCBudW1iZXIpW10gfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NGaWVsZHNPcHRpb25zIHtcbiAgbG93ZXI6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGF0aDogQ29udHJvbFBhdGg7XG4gIH07XG4gIGdyZWF0ZXI6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcGF0aDogQ29udHJvbFBhdGg7XG4gIH07XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmxleHlGb3Jtc1ZhbGlkYXRvcnMge1xuICBleHBvcnQgZnVuY3Rpb24gbm90RW1wdHlWYWxpZGF0b3IoY29udHJvbDogRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoRmxleHlGb3Jtc1ZhbGlkYXRvcnMuaXNFbXB0eShjb250cm9sKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ25vdC1lbXB0eSc6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG5vV2hpdGVzcGFjZVZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICgoY29udHJvbC52YWx1ZSB8fCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgd2hpdGVzcGFjZTogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBlbWFpbFZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChcbiAgICAgIFtcbiAgICAgICAgJ14oKFtePD4oKVxcXFxbXFxcXF1cXFxcXFxcXC4sOzohI1xcXFxzQFwiXSsoXFxcXC5bXjw+KClcXFxcW1xcXFxdXFxcXFxcXFwuLDs6ISNcXFxcc0BcIl0rKSopfChcIi4rXCIpKUAnLFxuICAgICAgICAnKChcXFxcW1swLTldezEsM31cXFxcLlswLTldezEsM31cXFxcLlswLTldezEsM31cXFxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXFxcLTAtOV0rXFxcXC4pJyxcbiAgICAgICAgJytbYS16QS1aXXsyLH0pfChbYS16QS1aXFxcXC0wLTldKykpJCdcbiAgICAgIF0uam9pbignJylcbiAgICApO1xuICAgIGlmICghRmxleHlGb3Jtc1ZhbGlkYXRvcnMuaXNFbXB0eShjb250cm9sKSAmJiAhcmUudGVzdChjb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2ludmFsaWQtZW1haWwnOiB7XG4gICAgICAgICAgY3VycmVudFZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJvb2xlYW5WYWxpZGF0b3IoY29udHJvbDogRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIUZsZXh5Rm9ybXNWYWxpZGF0b3JzLmlzRW1wdHkoY29udHJvbCkgJiYgdHlwZW9mIGNvbnRyb2wudmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2ludmFsaWQtYm9vbGVhbic6IHtcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnRlZ2VyVmFsaWRhdG9yKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmUgPSAvXi0/XFxkKyQvO1xuICAgIGlmICghRmxleHlGb3Jtc1ZhbGlkYXRvcnMuaXNFbXB0eShjb250cm9sKSAmJiAhcmUudGVzdChjb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2ludmFsaWQtaW50ZWdlcic6IHtcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtaW5WYWxpZGF0b3IobWluOiBudW1iZXIpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCkgPT4ge1xuICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCEobWluIHx8IG1pbiA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnaW52YWxpZC1taW4nOiB7XG4gICAgICAgICAgICB3cm9uZ0NvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBub3ROdW1iZXIgPSBGbGV4eUZvcm1zVmFsaWRhdG9ycy5udW1iZXJWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICBpZiAobm90TnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBub3ROdW1iZXI7XG4gICAgICB9XG4gICAgICBpZiAoKCFGbGV4eUZvcm1zVmFsaWRhdG9ycy5pc0VtcHR5KGNvbnRyb2wpIHx8IGNvbnRyb2wudmFsdWUgPT09IDApICYmIGNvbnRyb2wudmFsdWUgPCBtaW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnaW52YWxpZC1taW4nOiB7XG4gICAgICAgICAgICBtaW5pbXVtVmFsdWU6IG1pbixcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY29udHJvbC52YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbWF4VmFsaWRhdG9yKG1heDogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+IHtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghKG1heCB8fCBtYXggPT09IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ2ludmFsaWQtbWF4Jzoge1xuICAgICAgICAgICAgd3JvbmdDb25maWd1cmF0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3Qgbm90TnVtYmVyID0gRmxleHlGb3Jtc1ZhbGlkYXRvcnMubnVtYmVyVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgaWYgKG5vdE51bWJlcikge1xuICAgICAgICByZXR1cm4gbm90TnVtYmVyO1xuICAgICAgfVxuICAgICAgaWYgKCghRmxleHlGb3Jtc1ZhbGlkYXRvcnMuaXNFbXB0eShjb250cm9sKSB8fCBjb250cm9sLnZhbHVlID09PSAwKSAmJiBjb250cm9sLnZhbHVlID4gbWF4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ2ludmFsaWQtbWF4Jzoge1xuICAgICAgICAgICAgbWF4aW11bVZhbHVlOiBtYXgsXG4gICAgICAgICAgICBjdXJyZW50VmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG51bWJlclZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlID0gL14tPyhcXGQrXFwuP1xcZCopJHxeKFxcZCpcXC4/XFxkKykkLztcbiAgICBpZiAoIUZsZXh5Rm9ybXNWYWxpZGF0b3JzLmlzRW1wdHkoY29udHJvbCkgJiYgIXJlLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdpbnZhbGlkLW51bWJlcic6IHtcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtaW5MZW5ndGhBcnJheShtaW46IG51bWJlcikge1xuICAgIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghKG1pbiB8fCBtaW4gPT09IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ21pbi1sZW5ndGgtYXJyYXknOiB7XG4gICAgICAgICAgICB3cm9uZ0NvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KGNvbnRyb2wudmFsdWUpICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoID49IG1pbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgICdtaW4tbGVuZ3RoLWFycmF5Jzoge1xuICAgICAgICAgIG1pbmltdW1MZW5ndGg6IG1pbixcbiAgICAgICAgICBjdXJyZW50TGVuZ3RoOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGhBcnJheShtYXg6IG51bWJlcikge1xuICAgIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghKG1heCB8fCBtYXggPT09IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ21heC1sZW5ndGgtYXJyYXknOiB7XG4gICAgICAgICAgICB3cm9uZ0NvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA8PSBtYXgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnbWF4LWxlbmd0aC1hcnJheSc6IHtcbiAgICAgICAgICBtYXhpbXVtTGVuZ3RoOiBtYXgsXG4gICAgICAgICAgY3VycmVudExlbmd0aDogY29udHJvbC52YWx1ZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNFbXB0eShjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghY29udHJvbC52YWx1ZSB8fCAoQXJyYXkuaXNBcnJheShjb250cm9sLnZhbHVlKSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVybFZhbGlkYXRvcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChcbiAgICAgIFtcbiAgICAgICAgJygoKFtBLVphLXpdezMsOX06KD86XFxcXC9cXFxcLyk/KSg/OltcXFxcLTs6Jj1cXFxcK1xcXFwkLFxcXFx3XStAKT9bQS1aYS16MC05XFxcXC5cXFxcLV0nLFxuICAgICAgICAnK3woPzp3d3dcXFxcLnxbXFxcXC07OiY9XFxcXCtcXFxcJCxcXFxcd10rQClbQS1aYS16MC05XFxcXC5cXFxcLV0rKSgoPzpcXFxcL1tcXFxcK34lXFxcXC9cXFxcLlxcXFx3XFxcXC1fXSopP1xcXFw/PycsXG4gICAgICAgICcoPzpbXFxcXC1cXFxcKz0mOyVAXFxcXC5cXFxcd19dKikjPyg/OltcXFxcLlxcXFwhXFxcXC9cXFxcXFxcXFxcXFx3XSopKT8pJ1xuICAgICAgXS5qb2luKCcnKVxuICAgICk7XG4gICAgaWYgKCFGbGV4eUZvcm1zVmFsaWRhdG9ycy5pc0VtcHR5KGNvbnRyb2wpICYmICFyZS50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnaW52YWxpZC11cmwnOiB7XG4gICAgICAgICAgY3VycmVudFZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyb3NzRmllbGRWYWxpZGF0b3IoZmllbGRzOiBDcm9zc0ZpZWxkc09wdGlvbnMpIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEZvcm1Db250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9PiB7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoIShmaWVsZHMgJiYgZmllbGRzLmxvd2VyICYmIGZpZWxkcy5ncmVhdGVyKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICdjcm9zcy1maWVsZC1pbnZhbGlkJzoge1xuICAgICAgICAgICAgd3JvbmdDb25maWd1cmF0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgbG93ZXI6IEZvcm1Db250cm9sID0gZ2V0Q29udHJvbChmaWVsZHMubG93ZXIucGF0aCwgY29udHJvbCk7XG4gICAgICBjb25zdCBncmVhdGVyOiBGb3JtQ29udHJvbCA9IGdldENvbnRyb2woZmllbGRzLmdyZWF0ZXIucGF0aCwgY29udHJvbCk7XG5cbiAgICAgIGlmICghKGdyZWF0ZXIgJiYgZ3JlYXRlci52YWxpZCAmJiBsb3dlciAmJiBsb3dlci52YWxpZCAmJiBncmVhdGVyLnZhbHVlIDwgbG93ZXIudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2Nyb3NzLWZpZWxkLWludmFsaWQnOiB7XG4gICAgICAgICAgZ3JlYXRlcjogZmllbGRzLmdyZWF0ZXIubmFtZSxcbiAgICAgICAgICBncmVhdGVyUGF0aDogZmllbGRzLmdyZWF0ZXIucGF0aCxcbiAgICAgICAgICBncmVhdGVyVmFsdWU6IGdyZWF0ZXIgJiYgZ3JlYXRlci52YWx1ZSxcbiAgICAgICAgICBsb3dlcjogZmllbGRzLmxvd2VyLm5hbWUsXG4gICAgICAgICAgbG93ZXJQYXRoOiBmaWVsZHMubG93ZXIucGF0aCxcbiAgICAgICAgICBsb3dlclZhbHVlOiBsb3dlciAmJiBsb3dlci52YWx1ZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY3Jvc3NGaWVsZE1pblZhbGlkYXRvcihtaW5QYXRoOiBDb250cm9sUGF0aCkge1xuICAgIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghbWluUGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICdpbnZhbGlkLW1pbic6IHtcbiAgICAgICAgICAgIHdyb25nQ29uZmlndXJhdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1pbjogRm9ybUNvbnRyb2wgPSBnZXRDb250cm9sKG1pblBhdGgsIGNvbnRyb2wpO1xuICAgICAgaWYgKCEobWluICYmIGNvbnRyb2wudmFsaWQgJiYgY29udHJvbC52YWx1ZSA8IG1pbi52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnaW52YWxpZC1taW4nOiB7XG4gICAgICAgICAgbWluaW11bVZhbHVlOiBtaW4udmFsdWUsXG4gICAgICAgICAgY3VycmVudFZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcm9zc0ZpZWxkTWF4VmFsaWRhdG9yKG1heFBhdGg6IENvbnRyb2xQYXRoKSB7XG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPT4ge1xuICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXhQYXRoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJ2ludmFsaWQtbWF4Jzoge1xuICAgICAgICAgICAgd3JvbmdDb25maWd1cmF0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4OiBGb3JtQ29udHJvbCA9IGdldENvbnRyb2wobWF4UGF0aCwgY29udHJvbCk7XG4gICAgICBpZiAoIShtYXggJiYgY29udHJvbC52YWxpZCAmJiBjb250cm9sLnZhbHVlID4gbWF4LnZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgICdpbnZhbGlkLW1heCc6IHtcbiAgICAgICAgICBtYXhpbXVtVmFsdWU6IG1heC52YWx1ZSxcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGNvbnRyb2wudmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyb3NzRmllbGRBYnNvbHV0ZU1pblZhbGlkYXRvcihtaW5QYXRoOiBDb250cm9sUGF0aCkge1xuICAgIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghbWluUGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICdhYnNvbHV0ZS1taW4taW52YWxpZCc6IHtcbiAgICAgICAgICAgIHdyb25nQ29uZmlndXJhdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1pbjogRm9ybUNvbnRyb2wgPSBnZXRDb250cm9sKG1pblBhdGgsIGNvbnRyb2wpO1xuICAgICAgaWYgKG1pbiAmJiBjb250cm9sLnZhbGlkICYmIG1pbi52YWxpZCAmJiBNYXRoLmFicyhjb250cm9sLnZhbHVlKSA+PSBtaW4udmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnYWJzb2x1dGUtbWluLWludmFsaWQnOiB7XG4gICAgICAgICAgbWluOiBtaW4udmFsdWUsXG4gICAgICAgICAgY3VycmVudFZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBmb3JiaWRkZW5WYWx1ZXNWYWxpZGF0b3IoZm9yYmlkZGVuVmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPT4ge1xuICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCFmb3JiaWRkZW5WYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnZm9yYmlkZGVuLXZhbHVlJzoge1xuICAgICAgICAgICAgd3JvbmdDb25maWd1cmF0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFmb3JiaWRkZW5WYWx1ZXMuaW5jbHVkZXMoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZm9yYmlkZGVuLXZhbHVlJzoge1xuICAgICAgICAgIHZhbHVlOiBjb250cm9sLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBhcnJheVVuaXF1ZUZpZWxkc1ZhbGlkYXRvcihkYXRhOiB7IHBhdGg6IENvbnRyb2xQYXRoOyBmaWVsZE5hbWU6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIChjb250cm9sOiBGb3JtQXJyYXkpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0+IHtcbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC5jb250cm9scykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghKGRhdGEgJiYgZGF0YS5wYXRoKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICd2YWx1ZS1kdXBsaWNhdGUnOiB7XG4gICAgICAgICAgICB3cm9uZ0NvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBjb21wYXJlZFZhbHVlcyA9IFtdO1xuICAgICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBjb21wYXJlZCA9IGdldENvbnRyb2woZGF0YS5wYXRoLCBpdGVtKTtcbiAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgY29tcGFyZWRWYWx1ZXMucHVzaChjb21wYXJlZC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHVuaXEoY29tcGFyZWRWYWx1ZXMpLmxlbmd0aCA9PT0gY29tcGFyZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ3ZhbHVlLWR1cGxpY2F0ZSc6IHtcbiAgICAgICAgICBmaWVsZDogZGF0YS5maWVsZE5hbWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29udHJvbChwYXRoOiBDb250cm9sUGF0aCwgY29udHJvbCk6IEZvcm1Db250cm9sIHtcbiAgICBsZXQgYXJyYXlQYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGFycmF5UGF0aCA9IHBhdGg7XG4gICAgfSBlbHNlIGlmIChwYXRoKSB7XG4gICAgICBjb25zdCBwYXJlbnRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gKCcnICsgcGF0aCkuaW5kZXhPZignLi4vJykgIT09IC0xID8gcGF0aC5zcGxpdCgnLi4vJykgOiBbcGF0aF07XG4gICAgICBjb25zdCBzUGF0aCA9ICcnICsgcGFyZW50cy5wb3AoKTtcbiAgICAgIGNvbnN0IHN0cmluZ1BhdGggPSBzUGF0aC5zcGxpdCgnLicpLm1hcChpID0+IHtcbiAgICAgICAgaWYgKGkubWF0Y2goL15bMC05XSskLykpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBhcmVudHMuZmlsbCgnLi4vJyk7XG4gICAgICBwYXJlbnRzLnB1c2goLi4uc3RyaW5nUGF0aCk7XG4gICAgICBhcnJheVBhdGggPSBwYXJlbnRzO1xuICAgIH1cbiAgICBhcnJheVBhdGguZm9yRWFjaChpID0+IHtcbiAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wucGFyZW50ICYmIGkgPT09ICcuLi8nKSB7XG4gICAgICAgIGNvbnRyb2wgPSBjb250cm9sLnBhcmVudDtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgIGNvbnRyb2wgPSBOdW1iZXIuaXNJbnRlZ2VyKGkpID8gY29udHJvbC5nZXQoT2JqZWN0LmtleXMoY29udHJvbC5jb250cm9scylbaV0pIDogY29udHJvbC5jb250cm9sc1tpXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxufVxuIl19