UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

188 lines 23.2 kB
import { Injectable } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { C8yValidators, gettext } from '@c8y/ngx-components'; import { AXIS_TYPES, CHART_LINE_TYPES, CHART_RENDER_TYPES } from './datapoint-attributes.model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; export class DatapointAttributesFormValidationService { constructor(formBuilder) { this.formBuilder = formBuilder; } getDefaultFormGroup(fieldsToRemove = []) { const formFields = { __active: [true, []], __target: this.getTargetFormGroup(), __template: [undefined, []], color: ['', this.getColorValidators()], label: ['', this.getLabelValidators()], description: ['', this.getDescriptionValidators()], fragment: ['', this.getFragmentValidators()], series: ['', this.getSeriesValidators()], range: this.getMinMaxFormGroup(), unit: [undefined, this.getUnitValidators()], target: [undefined, this.getTargetValidators()], redRange: this.getMinMaxFormGroup(), yellowRange: this.getMinMaxFormGroup(), chart: this.getChartFormGroup(), display: this.getDisplayFormGroup() }; if (fieldsToRemove.length) { for (const field of fieldsToRemove) { delete formFields[field]; } } return this.formBuilder.group(formFields, { validators: this.getOverallValidators() }); } convertToBackendFormat(formDataStructure, showChart) { if (!formDataStructure) { return {}; } const { __active, __target, __template, color, label, description, fragment, series, range, unit, target, redRange, yellowRange, chart, display } = formDataStructure; const obj = { __active, __target, __template, color, label, description, fragment, series, min: range?.min, max: range?.max, unit, target, redRangeMin: redRange?.min, redRangeMax: redRange?.max, yellowRangeMin: yellowRange?.min, yellowRangeMax: yellowRange?.max, renderType: showChart ? chart?.renderType : display?.renderType, lineType: chart?.lineType, yAxisType: chart?.yAxisType }; return obj; } convertToFormGroupFormat(backendDataStructure) { if (!backendDataStructure) { return {}; } const { __active, __target, __template, color, label, description, fragment, series, min, max, unit, target, redRangeMin, redRangeMax, yellowRangeMin, yellowRangeMax, renderType, lineType, yAxisType } = backendDataStructure; const obj = { __active, __target, __template, color, label, description, fragment, series, range: { min: this.convertStringToNumber(min), max: this.convertStringToNumber(max) }, unit, target: this.convertStringToNumber(target), redRange: { min: this.convertStringToNumber(redRangeMin), max: this.convertStringToNumber(redRangeMax) }, yellowRange: { min: this.convertStringToNumber(yellowRangeMin), max: this.convertStringToNumber(yellowRangeMax) }, chart: renderType || lineType || yAxisType ? { renderType, lineType, yAxisType } : undefined, display: renderType ? { renderType } : undefined }; return obj; } getColorValidators() { return [Validators.required, Validators.minLength(4)]; } getLabelValidators() { return [Validators.required, Validators.minLength(1), Validators.maxLength(120)]; } getDescriptionValidators() { return []; } getFragmentValidators() { return [ Validators.required, Validators.minLength(1), Validators.maxLength(120), Validators.pattern(/^[^.]*$/) ]; } getSeriesValidators() { return [ Validators.required, Validators.minLength(1), Validators.maxLength(120), (control) => { const forbidden = control.value?.includes('.') || ''; return forbidden ? { noPeriods: { message: gettext('Series cannot contain periods.') } } : null; } ]; } getMinMaxValidators() { return [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()]; } getUnitValidators() { return []; } getTargetValidators() { return []; } getOverallValidators() { return [ C8yValidators.withinScale('redRange.min'), C8yValidators.withinScale('redRange.max'), C8yValidators.withinScale('yellowRange.min'), C8yValidators.withinScale('yellowRange.max'), C8yValidators.withinScale('target') ]; } getMinMaxFormGroup() { return this.formBuilder.group({ min: [undefined, []], max: [undefined, []] }, { validators: this.getMinMaxValidators() }); } getChartFormGroup() { return this.formBuilder.group({ renderType: [CHART_RENDER_TYPES[0].val, []], lineType: [CHART_LINE_TYPES[0].val, []], yAxisType: [AXIS_TYPES[0].val, []] }); } getDisplayFormGroup() { return this.formBuilder.group({ renderType: [CHART_RENDER_TYPES[0].val, []] }); } getTargetFormGroup() { return this.formBuilder.group({ id: [undefined, []], name: [undefined, []] }); } convertStringToNumber(possibleString) { if (typeof possibleString === 'string') { try { return Number.parseFloat(possibleString); } catch { return undefined; } } else { return possibleString; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointAttributesFormValidationService, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointAttributesFormValidationService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointAttributesFormValidationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.FormBuilder }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50LWF0dHJpYnV0ZXMtZm9ybS12YWxpZGF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9kYXRhcG9pbnQtc2VsZWN0b3IvZGF0YXBvaW50LWF0dHJpYnV0ZXMtZm9ybS9kYXRhcG9pbnQtYXR0cmlidXRlcy1mb3JtLXZhbGlkYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFFTCxXQUFXLEVBSVgsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQUdoRyxNQUFNLE9BQU8sd0NBQXdDO0lBQ25ELFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUVoRCxtQkFBbUIsQ0FBQyxpQkFBMkIsRUFBRTtRQUMvQyxNQUFNLFVBQVUsR0FBRztZQUNqQixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUMzQixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFB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QyxjQUErQjtRQUMzRCxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQzsrR0FwT1Usd0NBQXdDO21IQUF4Qyx3Q0FBd0MsY0FEM0IsTUFBTTs7NEZBQ25CLHdDQUF3QztrQkFEcEQsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEM4eVZhbGlkYXRvcnMsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFYSVNfVFlQRVMsIENIQVJUX0xJTkVfVFlQRVMsIENIQVJUX1JFTkRFUl9UWVBFUyB9IGZyb20gJy4vZGF0YXBvaW50LWF0dHJpYnV0ZXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtVmFsaWRhdGlvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge31cblxuICBnZXREZWZhdWx0Rm9ybUdyb3VwKGZpZWxkc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtRmllbGRzID0ge1xuICAgICAgX19hY3RpdmU6IFt0cnVlLCBbXV0sXG4gICAgICBfX3RhcmdldDogdGhpcy5nZXRUYXJnZXRGb3JtR3JvdXAoKSxcbiAgICAgIF9fdGVtcGxhdGU6IFt1bmRlZmluZWQsIFtdXSxcbiAgICAgIGNvbG9yOiBbJycsIHRoaXMuZ2V0Q29sb3JWYWxpZGF0b3JzKCldLFxuICAgICAgbGFiZWw6IFsnJywgdGhpcy5nZXRMYWJlbFZhbGlkYXRvcnMoKV0sXG4gICAgICBkZXNjcmlwdGlvbjogWycnLCB0aGlzLmdldERlc2NyaXB0aW9uVmFsaWRhdG9ycygpXSxcbiAgICAgIGZyYWdtZW50OiBbJycsIHRoaXMuZ2V0RnJhZ21lbnRWYWxpZGF0b3JzKCldLFxuICAgICAgc2VyaWVzOiBbJycsIHRoaXMuZ2V0U2VyaWVzVmFsaWRhdG9ycygpXSxcbiAgICAgIHJhbmdlOiB0aGlzLmdldE1pbk1heEZvcm1Hcm91cCgpLFxuICAgICAgdW5pdDogW3VuZGVmaW5lZCwgdGhpcy5nZXRVbml0VmFsaWRhdG9ycygpXSxcbiAgICAgIHRhcmdldDogW3VuZGVmaW5lZCwgdGhpcy5nZXRUYXJnZXRWYWxpZGF0b3JzKCldLFxuICAgICAgcmVkUmFuZ2U6IHRoaXMuZ2V0TWluTWF4Rm9ybUdyb3VwKCksXG4gICAgICB5ZWxsb3dSYW5nZTogdGhpcy5nZXRNaW5NYXhGb3JtR3JvdXAoKSxcbiAgICAgIGNoYXJ0OiB0aGlzLmdldENoYXJ0Rm9ybUdyb3VwKCksXG4gICAgICBkaXNwbGF5OiB0aGlzLmdldERpc3BsYXlGb3JtR3JvdXAoKVxuICAgIH07XG4gICAgaWYgKGZpZWxkc1RvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb1JlbW92ZSkge1xuICAgICAgICBkZWxldGUgZm9ybUZpZWxkc1tmaWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGZvcm1GaWVsZHMsIHtcbiAgICAgIHZhbGlkYXRvcnM6IHRoaXMuZ2V0T3ZlcmFsbFZhbGlkYXRvcnMoKVxuICAgIH0pO1xuICB9XG5cbiAgY29udmVydFRvQmFja2VuZEZvcm1hdChmb3JtRGF0YVN0cnVjdHVyZTogYW55LCBzaG93Q2hhcnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWZvcm1EYXRhU3RydWN0dXJlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgX19hY3RpdmUsXG4gICAgICBfX3RhcmdldCxcbiAgICAgIF9fdGVtcGxhdGUsXG4gICAgICBjb2xvcixcbiAgICAgIGxhYmVsLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBmcmFnbWVudCxcbiAgICAgIHNlcmllcyxcbiAgICAgIHJhbmdlLFxuICAgICAgdW5pdCxcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlZFJhbmdlLFxuICAgICAgeWVsbG93UmFuZ2UsXG4gICAgICBjaGFydCxcbiAgICAgIGRpc3BsYXlcbiAgICB9ID0gZm9ybURhdGFTdHJ1Y3R1cmU7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgX19hY3RpdmUsXG4gICAgICBfX3RhcmdldCxcbiAgICAgIF9fdGVtcGxhdGUsXG4gICAgICBjb2xvcixcbiAgICAgIGxhYmVsLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBmcmFnbWVudCxcbiAgICAgIHNlcmllcyxcbiAgICAgIG1pbjogcmFuZ2U/Lm1pbixcbiAgICAgIG1heDogcmFuZ2U/Lm1heCxcbiAgICAgIHVuaXQsXG4gICAgICB0YXJnZXQsXG4gICAgICByZWRSYW5nZU1pbjogcmVkUmFuZ2U/Lm1pbixcbiAgICAgIHJlZFJhbmdlTWF4OiByZWRSYW5nZT8ubWF4LFxuICAgICAgeWVsbG93UmFuZ2VNaW46IHllbGxvd1JhbmdlPy5taW4sXG4gICAgICB5ZWxsb3dSYW5nZU1heDogeWVsbG93UmFuZ2U/Lm1heCxcbiAgICAgIHJlbmRlclR5cGU6IHNob3dDaGFydCA/IGNoYXJ0Py5yZW5kZXJUeXBlIDogZGlzcGxheT8ucmVuZGVyVHlwZSxcbiAgICAgIGxpbmVUeXBlOiBjaGFydD8ubGluZVR5cGUsXG4gICAgICB5QXhpc1R5cGU6IGNoYXJ0Py55QXhpc1R5cGVcbiAgICB9O1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBjb252ZXJ0VG9Gb3JtR3JvdXBGb3JtYXQoYmFja2VuZERhdGFTdHJ1Y3R1cmU6IGFueSkge1xuICAgIGlmICghYmFja2VuZERhdGFTdHJ1Y3R1cmUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBfX2FjdGl2ZSxcbiAgICAgIF9fdGFyZ2V0LFxuICAgICAgX190ZW1wbGF0ZSxcbiAgICAgIGNvbG9yLFxuICAgICAgbGFiZWwsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGZyYWdtZW50LFxuICAgICAgc2VyaWVzLFxuICAgICAgbWluLFxuICAgICAgbWF4LFxuICAgICAgdW5pdCxcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlZFJhbmdlTWluLFxuICAgICAgcmVkUmFuZ2VNYXgsXG4gICAgICB5ZWxsb3dSYW5nZU1pbixcbiAgICAgIHllbGxvd1JhbmdlTWF4LFxuICAgICAgcmVuZGVyVHlwZSxcbiAgICAgIGxpbmVUeXBlLFxuICAgICAgeUF4aXNUeXBlXG4gICAgfSA9IGJhY2tlbmREYXRhU3RydWN0dXJlO1xuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgX19hY3RpdmUsXG4gICAgICBfX3RhcmdldCxcbiAgICAgIF9fdGVtcGxhdGUsXG4gICAgICBjb2xvcixcbiAgICAgIGxhYmVsLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBmcmFnbWVudCxcbiAgICAgIHNlcmllcyxcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIG1pbjogdGhpcy5jb252ZXJ0U3RyaW5nVG9OdW1iZXIobWluKSxcbiAgICAgICAgbWF4OiB0aGlzLmNvbnZlcnRTdHJpbmdUb051bWJlcihtYXgpXG4gICAgICB9LFxuICAgICAgdW5pdCxcbiAgICAgIHRhcmdldDogdGhpcy5jb252ZXJ0U3RyaW5nVG9OdW1iZXIodGFyZ2V0KSxcbiAgICAgIHJlZFJhbmdlOiB7XG4gICAgICAgIG1pbjogdGhpcy5jb252ZXJ0U3RyaW5nVG9OdW1iZXIocmVkUmFuZ2VNaW4pLFxuICAgICAgICBtYXg6IHRoaXMuY29udmVydFN0cmluZ1RvTnVtYmVyKHJlZFJhbmdlTWF4KVxuICAgICAgfSxcbiAgICAgIHllbGxvd1JhbmdlOiB7XG4gICAgICAgIG1pbjogdGhpcy5jb252ZXJ0U3RyaW5nVG9OdW1iZXIoeWVsbG93UmFuZ2VNaW4pLFxuICAgICAgICBtYXg6IHRoaXMuY29udmVydFN0cmluZ1RvTnVtYmVyKHllbGxvd1JhbmdlTWF4KVxuICAgICAgfSxcbiAgICAgIGNoYXJ0OiByZW5kZXJUeXBlIHx8IGxpbmVUeXBlIHx8IHlBeGlzVHlwZSA/IHsgcmVuZGVyVHlwZSwgbGluZVR5cGUsIHlBeGlzVHlwZSB9IDogdW5kZWZpbmVkLFxuICAgICAgZGlzcGxheTogcmVuZGVyVHlwZSA/IHsgcmVuZGVyVHlwZSB9IDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgZ2V0Q29sb3JWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xuICAgIHJldHVybiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNCldO1xuICB9XG5cbiAgZ2V0TGFiZWxWYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xuICAgIHJldHVybiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEyMCldO1xuICB9XG5cbiAgZ2V0RGVzY3JpcHRpb25WYWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldEZyYWdtZW50VmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEpLFxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTIwKSxcbiAgICAgIFZhbGlkYXRvcnMucGF0dGVybigvXlteLl0qJC8pXG4gICAgXTtcbiAgfVxuXG4gIGdldFNlcmllc1ZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKSxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEyMCksXG4gICAgICAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBmb3JiaWRkZW4gPSBjb250cm9sLnZhbHVlPy5pbmNsdWRlcygnLicpIHx8ICcnO1xuICAgICAgICByZXR1cm4gZm9yYmlkZGVuXG4gICAgICAgICAgPyB7IG5vUGVyaW9kczogeyBtZXNzYWdlOiBnZXR0ZXh0KCdTZXJpZXMgY2Fubm90IGNvbnRhaW4gcGVyaW9kcy4nKSB9IH1cbiAgICAgICAgICA6IG51bGw7XG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIGdldE1pbk1heFZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIFtDOHlWYWxpZGF0b3JzLm1pbk1heFZhbGlkYXRvcigpLCBDOHlWYWxpZGF0b3JzLnJlcXVpcmVCb3RoTWluQW5kTWF4KCldO1xuICB9XG5cbiAgZ2V0VW5pdFZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0VGFyZ2V0VmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRPdmVyYWxsVmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgQzh5VmFsaWRhdG9ycy53aXRoaW5TY2FsZSgncmVkUmFuZ2UubWluJyksXG4gICAgICBDOHlWYWxpZGF0b3JzLndpdGhpblNjYWxlKCdyZWRSYW5nZS5tYXgnKSxcbiAgICAgIEM4eVZhbGlkYXRvcnMud2l0aGluU2NhbGUoJ3llbGxvd1JhbmdlLm1pbicpLFxuICAgICAgQzh5VmFsaWRhdG9ycy53aXRoaW5TY2FsZSgneWVsbG93UmFuZ2UubWF4JyksXG4gICAgICBDOHlWYWxpZGF0b3JzLndpdGhpblNjYWxlKCd0YXJnZXQnKVxuICAgIF07XG4gIH1cblxuICBnZXRNaW5NYXhGb3JtR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHsgbWluOiBbdW5kZWZpbmVkLCBbXV0sIG1heDogW3VuZGVmaW5lZCwgW11dIH0sXG4gICAgICB7IHZhbGlkYXRvcnM6IHRoaXMuZ2V0TWluTWF4VmFsaWRhdG9ycygpIH1cbiAgICApO1xuICB9XG5cbiAgZ2V0Q2hhcnRGb3JtR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICByZW5kZXJUeXBlOiBbQ0hBUlRfUkVOREVSX1RZUEVTWzBdLnZhbCwgW11dLFxuICAgICAgbGluZVR5cGU6IFtDSEFSVF9MSU5FX1RZUEVTWzBdLnZhbCwgW11dLFxuICAgICAgeUF4aXNUeXBlOiBbQVhJU19UWVBFU1swXS52YWwsIFtdXVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGlzcGxheUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHJlbmRlclR5cGU6IFtDSEFSVF9SRU5ERVJfVFlQRVNbMF0udmFsLCBbXV1cbiAgICB9KTtcbiAgfVxuXG4gIGdldFRhcmdldEZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGlkOiBbdW5kZWZpbmVkLCBbXV0sXG4gICAgICBuYW1lOiBbdW5kZWZpbmVkLCBbXV1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1RvTnVtYmVyKHBvc3NpYmxlU3RyaW5nOiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgcG9zc2libGVTdHJpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTnVtYmVyLnBhcnNlRmxvYXQocG9zc2libGVTdHJpbmcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwb3NzaWJsZVN0cmluZztcbiAgICB9XG4gIH1cbn1cbiJdfQ==