@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
188 lines • 23.2 kB
JavaScript
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==