UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

275 lines 37.8 kB
import { Injectable } from '@angular/core'; import { Base } from './export-schedules.interface'; import { TranslateService } from '@ngx-translate/core'; import { formatDate } from '@angular/common'; import { gettext } from '@c8y/ngx-components'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; export class CronService { constructor(translateService) { this.translateService = translateService; this.daysOfWeekPosix = []; this.daysOfMonth = [ { value: '1', label: '1.' }, { value: '2', label: '2.' }, { value: '3', label: '3.' }, { value: '4', label: '4.' }, { value: '5', label: '5.' }, { value: '6', label: '6.' }, { value: '7', label: '7.' }, { value: '8', label: '8.' }, { value: '9', label: '9.' }, { value: '10', label: '10.' }, { value: '11', label: '11.' }, { value: '12', label: '12.' }, { value: '13', label: '13.' }, { value: '14', label: '14.' }, { value: '15', label: '15.' }, { value: '16', label: '16.' }, { value: '17', label: '17.' }, { value: '18', label: '18.' }, { value: '19', label: '19.' }, { value: '20', label: '20.' }, { value: '21', label: '21.' }, { value: '22', label: '22.' }, { value: '23', label: '23.' }, { value: '24', label: '24.' }, { value: '25', label: '25.' }, { value: '26', label: '26.' }, { value: '27', label: '27.' }, { value: '28', label: '28.' }, { value: '29', label: '29.' }, { value: '30', label: '30.' }, { value: '31', label: '31.' } ]; this.months = []; this.hours = []; this.minutes = []; this.intervals = [ { value: 2, label: gettext('Hour') }, { value: 3, label: gettext('Day') }, { value: 4, label: gettext('Week') }, { value: 5, label: gettext('Month') }, { value: 6, label: gettext('Year') } ]; for (let x = 0; x < 24; x++) { this.hours.push({ value: x.toString(), label: `${x}` }); } for (let x = 0; x < 60; x = x + 5) { this.minutes.push({ value: x.toString(), label: `${x}` }); } for (let x = 0; x < 7; x++) { this.daysOfWeekPosix.push({ value: x.toString(), label: this.getWeekDayName({ weekday: x }) }); } for (let x = 1; x < 13; x++) { this.months.push({ value: x.toString(), label: this.getMonthName({ month: x }) }); } } generateCron(cronConfig) { let cron = ''; cron = cronConfig.minute ? `${cronConfig.minute}` : '*'; cron += cronConfig.hour ? ` ${cronConfig.hour}` : ' *'; cron += cronConfig.day ? ` ${cronConfig.day}` : ' *'; cron += cronConfig.month ? ` ${cronConfig.month}` : ' *'; cron += cronConfig.weekday ? ` ${cronConfig.weekday}` : ' *'; return cron; } generateCronConfig(cron) { const parts = cron.split(/\s+/); const cronConfig = { minute: parts[0], hour: parts[1], day: parts[2], month: parts[3], weekday: parts[4] }; return cronConfig; } getBase(cronConfig) { let base = Base.Initial; if (cronConfig.minute !== '*' && cronConfig.hour === '*' && cronConfig.day === '*' && cronConfig.month === '*' && cronConfig.weekday === '*') { base = Base.Hour; } else if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day === '*' && cronConfig.month === '*' && cronConfig.weekday === '*') { base = Base.Day; } else if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day === '*' && cronConfig.month === '*' && cronConfig.weekday !== '*') { base = Base.Week; } else if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day !== '*' && cronConfig.month === '*' && cronConfig.weekday === '*') { base = Base.Month; } else if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day !== '*' && cronConfig.month !== '*' && cronConfig.weekday === '*') { base = Base.Year; } else { // cronConfig invalid } return base; } validateModels(base, cronConfig) { let valid; switch (base) { case Base.Initial: // Please select valid = false; break; case Base.Hour: if (cronConfig.minute !== '*') { valid = true; } else { valid = false; } break; case Base.Day: if (cronConfig.minute !== '*' && cronConfig.hour !== '*') { valid = true; } else { valid = false; } break; case Base.Week: if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.weekday !== '*') { valid = true; } else { valid = false; } break; case Base.Month: if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day !== '*') { valid = true; } else { valid = false; } break; case Base.Year: if (cronConfig.minute !== '*' && cronConfig.hour !== '*' && cronConfig.day !== '*' && cronConfig.month !== '*') { valid = true; } else { valid = false; } break; default: valid = false; } return valid; } clearNextModels(base, cronConfig) { if (base === Base.Initial) { // please select, delete all // cron expression: every minute at second 0 cronConfig.minute = '*'; cronConfig.hour = '*'; cronConfig.day = '*'; cronConfig.month = '*'; cronConfig.weekday = '*'; } else if (base === Base.Hour) { // hour, don't delete minutes // cron expression: every hour, at whatever minute, at second 0 cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute; cronConfig.hour = '*'; cronConfig.day = '*'; cronConfig.month = '*'; cronConfig.weekday = '*'; } else if (base === Base.Day) { // day, don't delete minutes and hours // cron expression: every day of every month, at whatever hour and minute, at second 0 cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute; cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour; cronConfig.day = '*'; cronConfig.month = '*'; cronConfig.weekday = '*'; } else if (base === Base.Week) { // week, delete month and day // cron expression: every month, at whatever weekday, hour and minute, at second 0 cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute; cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour; cronConfig.day = '*'; cronConfig.month = '*'; cronConfig.weekday = cronConfig.weekday === '*' || cronConfig.weekday === '?' ? this.daysOfWeekPosix[0].value : cronConfig.weekday; } else if (base === Base.Month) { // month, delete month and weekday // cron expression: every month, at whatever day of month, hour and minute, at second 0 cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute; cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour; cronConfig.day = cronConfig.day === '*' ? this.daysOfMonth[0].value : cronConfig.day; cronConfig.month = '*'; cronConfig.weekday = '*'; } else if (base === Base.Year) { // year, delete weekday // cron expression: every year, at whatever month, day of month, hour and minute, at second 0 cronConfig.minute = cronConfig.minute === '*' ? this.minutes[0].value : cronConfig.minute; cronConfig.hour = cronConfig.hour === '*' ? this.hours[0].value : cronConfig.hour; cronConfig.day = cronConfig.day === '*' ? this.daysOfMonth[0].value : cronConfig.day; cronConfig.month = cronConfig.month === '*' ? this.months[0].value : cronConfig.month; cronConfig.weekday = '*'; } } getWeekDayName(cronConfig) { const date = new Date(0); const firstSundayDate = date.getDate() + 3; // because we know date 0 was on Thursday... date.setDate(firstSundayDate + parseInt(cronConfig.weekday, 10)); return formatDate(date, 'EEEE', this.translateService.currentLang); } getMonthDayName(cronConfig) { let name = ''; this.daysOfMonth.forEach(item => { if (item.value === cronConfig.day) { name = item.label; } }); return name; } getMonthName(cronConfig) { const date = new Date(0); date.setMonth(parseInt(cronConfig.month, 10) - 1); return formatDate(date, 'LLLL', this.translateService.currentLang); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CronService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.TranslateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcmVwb3J0cy9jcm9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBRzlDLE1BQU0sT0FBTyxXQUFXO0lBNkN0QixZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQTVDdEQsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsZ0JBQVcsR0FBRztZQUNaLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzNCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQzdCLEVBQUUsS0FBSyxF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QixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzthQUFNLElBQ0wsVUFBVSxDQUFDLE1BQU0sS0FBSyxHQUFHO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEtBQUssR0FBRztZQUN2QixVQUFVLENBQUMsR0FBRyxLQUFLLEdBQUc7WUFDdEIsVUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUMxQixDQUFDO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJ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QUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7UUFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsZUFBZSxDQUFDLFVBQXNCO1FBQ3BDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxVQUFzQjtRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7K0dBaFJVLFdBQVc7bUhBQVgsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb25Db25maWcsIEJhc2UgfSBmcm9tICcuL2V4cG9ydC1zY2hlZHVsZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ3JvblNlcnZpY2Uge1xuICBkYXlzT2ZXZWVrUG9zaXg6IGFueVtdID0gW107XG4gIGRheXNPZk1vbnRoID0gW1xuICAgIHsgdmFsdWU6ICcxJywgbGFiZWw6ICcxLicgfSxcbiAgICB7IHZhbHVlOiAnMicsIGxhYmVsOiAnMi4nIH0sXG4gICAgeyB2YWx1ZTogJzMnLCBsYWJlbDogJzMuJyB9LFxuICAgIHsgdmFsdWU6ICc0JywgbGFiZWw6ICc0LicgfSxcbiAgICB7IHZhbHVlOiAnNScsIGxhYmVsOiAnNS4nIH0sXG4gICAgeyB2YWx1ZTogJzYnLCBsYWJlbDogJzYuJyB9LFxuICAgIHsgdmFsdWU6ICc3JywgbGFiZWw6ICc3LicgfSxcbiAgICB7IHZhbHVlOiAnOCcsIGxhYmVsOiAnOC4nIH0sXG4gICAgeyB2YWx1ZTogJzknLCBsYWJlbDogJzkuJyB9LFxuICAgIHsgdmFsdWU6ICcxMCcsIGxhYmVsOiAnMTAuJyB9LFxuICAgIHsgdmFsdWU6ICcxMScsIGxhYmVsOiAnMTEuJyB9LFxuICAgIHsgdmFsdWU6ICcxMicsIGxhYmVsOiAnMTIuJyB9LFxuICAgIHsgdmFsdWU6ICcxMycsIGxhYmVsOiAnMTMuJyB9LFxuICAgIHsgdmFsdWU6ICcxNCcsIGxhYmVsOiAnMTQuJyB9LFxuICAgIHsgdmFsdWU6ICcxNScsIGxhYmVsOiAnMTUuJyB9LFxuICAgIHsgdmFsdWU6ICcxNicsIGxhYmVsOiAnMTYuJyB9LFxuICAgIHsgdmFsdWU6ICcxNycsIGxhYmVsOiAnMTcuJyB9LFxuICAgIHsgdmFsdWU6ICcxOCcsIGxhYmVsOiAnMTguJyB9LFxuICAgIHsgdmFsdWU6ICcxOScsIGxhYmVsOiAnMTkuJyB9LFxuICAgIHsgdmFsdWU6ICcyMCcsIGxhYmVsOiAnMjAuJyB9LFxuICAgIHsgdmFsdWU6ICcyMScsIGxhYmVsOiAnMjEuJyB9LFxuICAgIHsgdmFsdWU6ICcyMicsIGxhYmVsOiAnMjIuJyB9LFxuICAgIHsgdmFsdWU6ICcyMycsIGxhYmVsOiAnMjMuJyB9LFxuICAgIHsgdmFsdWU6ICcyNCcsIGxhYmVsOiAnMjQuJyB9LFxuICAgIHsgdmFsdWU6ICcyNScsIGxhYmVsOiAnMjUuJyB9LFxuICAgIHsgdmFsdWU6ICcyNicsIGxhYmVsOiAnMjYuJyB9LFxuICAgIHsgdmFsdWU6ICcyNycsIGxhYmVsOiAnMjcuJyB9LFxuICAgIHsgdmFsdWU6ICcyOCcsIGxhYmVsOiAnMjguJyB9LFxuICAgIHsgdmFsdWU6ICcyOScsIGxhYmVsOiAnMjkuJyB9LFxuICAgIHsgdmFsdWU6ICczMCcsIGxhYmVsOiAnMzAuJyB9LFxuICAgIHsgdmFsdWU6ICczMScsIGxhYmVsOiAnMzEuJyB9XG4gIF07XG4gIG1vbnRoczogYW55W10gPSBbXTtcbiAgaG91cnM6IGFueVtdID0gW107XG4gIG1pbnV0ZXM6IGFueVtdID0gW107XG4gIGludGVydmFscyA9IFtcbiAgICB7IHZhbHVlOiAyLCBsYWJlbDogZ2V0dGV4dCgnSG91cicpIH0sXG4gICAgeyB2YWx1ZTogMywgbGFiZWw6IGdldHRleHQoJ0RheScpIH0sXG4gICAgeyB2YWx1ZTogNCwgbGFiZWw6IGdldHRleHQoJ1dlZWsnKSB9LFxuICAgIHsgdmFsdWU6IDUsIGxhYmVsOiBnZXR0ZXh0KCdNb250aCcpIH0sXG4gICAgeyB2YWx1ZTogNiwgbGFiZWw6IGdldHRleHQoJ1llYXInKSB9XG4gIF07XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgMjQ7IHgrKykge1xuICAgICAgdGhpcy5ob3Vycy5wdXNoKHsgdmFsdWU6IHgudG9TdHJpbmcoKSwgbGFiZWw6IGAke3h9YCB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCA2MDsgeCA9IHggKyA1KSB7XG4gICAgICB0aGlzLm1pbnV0ZXMucHVzaCh7IHZhbHVlOiB4LnRvU3RyaW5nKCksIGxhYmVsOiBgJHt4fWAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCA3OyB4KyspIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vla1Bvc2l4LnB1c2goe1xuICAgICAgICB2YWx1ZTogeC50b1N0cmluZygpLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRXZWVrRGF5TmFtZSh7IHdlZWtkYXk6IHggfSBhcyB1bmtub3duIGFzIENyb25Db25maWcpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB4ID0gMTsgeCA8IDEzOyB4KyspIHtcbiAgICAgIHRoaXMubW9udGhzLnB1c2goe1xuICAgICAgICB2YWx1ZTogeC50b1N0cmluZygpLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRNb250aE5hbWUoeyBtb250aDogeCB9IGFzIHVua25vd24gYXMgQ3JvbkNvbmZpZylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQ3Jvbihjcm9uQ29uZmlnOiBDcm9uQ29uZmlnKSB7XG4gICAgbGV0IGNyb24gPSAnJztcbiAgICBjcm9uID0gY3JvbkNvbmZpZy5taW51dGUgPyBgJHtjcm9uQ29uZmlnLm1pbnV0ZX1gIDogJyonO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy5ob3VyID8gYCAke2Nyb25Db25maWcuaG91cn1gIDogJyAqJztcbiAgICBjcm9uICs9IGNyb25Db25maWcuZGF5ID8gYCAke2Nyb25Db25maWcuZGF5fWAgOiAnIConO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy5tb250aCA/IGAgJHtjcm9uQ29uZmlnLm1vbnRofWAgOiAnIConO1xuICAgIGNyb24gKz0gY3JvbkNvbmZpZy53ZWVrZGF5ID8gYCAke2Nyb25Db25maWcud2Vla2RheX1gIDogJyAqJztcblxuICAgIHJldHVybiBjcm9uO1xuICB9XG5cbiAgZ2VuZXJhdGVDcm9uQ29uZmlnKGNyb246IHN0cmluZykge1xuICAgIGNvbnN0IHBhcnRzID0gY3Jvbi5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IGNyb25Db25maWc6IENyb25Db25maWcgPSB7XG4gICAgICBtaW51dGU6IHBhcnRzWzBdLFxuICAgICAgaG91cjogcGFydHNbMV0sXG4gICAgICBkYXk6IHBhcnRzWzJdLFxuICAgICAgbW9udGg6IHBhcnRzWzNdLFxuICAgICAgd2Vla2RheTogcGFydHNbNF1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyb25Db25maWc7XG4gIH1cblxuICBnZXRCYXNlKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBsZXQgYmFzZTogQmFzZSA9IEJhc2UuSW5pdGlhbDtcblxuICAgIGlmIChcbiAgICAgIGNyb25Db25maWcubWludXRlICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcuaG91ciA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmRheSA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID09PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9PT0gJyonXG4gICAgKSB7XG4gICAgICBiYXNlID0gQmFzZS5Ib3VyO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuRGF5O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCA9PT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgIT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuV2VlaztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcuZGF5ICE9PSAnKicgJiZcbiAgICAgIGNyb25Db25maWcubW9udGggPT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnKidcbiAgICApIHtcbiAgICAgIGJhc2UgPSBCYXNlLk1vbnRoO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLmhvdXIgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5kYXkgIT09ICcqJyAmJlxuICAgICAgY3JvbkNvbmZpZy5tb250aCAhPT0gJyonICYmXG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPT09ICcqJ1xuICAgICkge1xuICAgICAgYmFzZSA9IEJhc2UuWWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY3JvbkNvbmZpZyBpbnZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICB2YWxpZGF0ZU1vZGVscyhiYXNlOiBCYXNlLCBjcm9uQ29uZmlnOiBDcm9uQ29uZmlnKSB7XG4gICAgbGV0IHZhbGlkOiBib29sZWFuO1xuICAgIHN3aXRjaCAoYmFzZSkge1xuICAgICAgY2FzZSBCYXNlLkluaXRpYWw6IC8vIFBsZWFzZSBzZWxlY3RcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEJhc2UuSG91cjpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicpIHtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQmFzZS5EYXk6XG4gICAgICAgIGlmIChjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmIGNyb25Db25maWcuaG91ciAhPT0gJyonKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEJhc2UuV2VlazpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicgJiYgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiYgY3JvbkNvbmZpZy53ZWVrZGF5ICE9PSAnKicpIHtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQmFzZS5Nb250aDpcbiAgICAgICAgaWYgKGNyb25Db25maWcubWludXRlICE9PSAnKicgJiYgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiYgY3JvbkNvbmZpZy5kYXkgIT09ICcqJykge1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCYXNlLlllYXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjcm9uQ29uZmlnLm1pbnV0ZSAhPT0gJyonICYmXG4gICAgICAgICAgY3JvbkNvbmZpZy5ob3VyICE9PSAnKicgJiZcbiAgICAgICAgICBjcm9uQ29uZmlnLmRheSAhPT0gJyonICYmXG4gICAgICAgICAgY3JvbkNvbmZpZy5tb250aCAhPT0gJyonXG4gICAgICAgICkge1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBjbGVhck5leHRNb2RlbHMoYmFzZTogQmFzZSwgY3JvbkNvbmZpZzogQ3JvbkNvbmZpZykge1xuICAgIGlmIChiYXNlID09PSBCYXNlLkluaXRpYWwpIHtcbiAgICAgIC8vIHBsZWFzZSBzZWxlY3QsIGRlbGV0ZSBhbGxcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgbWludXRlIGF0IHNlY29uZCAwXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSA9ICcqJztcbiAgICAgIGNyb25Db25maWcuaG91ciA9ICcqJztcbiAgICAgIGNyb25Db25maWcuZGF5ID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuSG91cikge1xuICAgICAgLy8gaG91ciwgZG9uJ3QgZGVsZXRlIG1pbnV0ZXNcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgaG91ciwgYXQgd2hhdGV2ZXIgbWludXRlLCBhdCBzZWNvbmQgMFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgPSBjcm9uQ29uZmlnLm1pbnV0ZSA9PT0gJyonID8gdGhpcy5taW51dGVzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5taW51dGU7XG4gICAgICBjcm9uQ29uZmlnLmhvdXIgPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLmRheSA9ICcqJztcbiAgICAgIGNyb25Db25maWcubW9udGggPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLndlZWtkYXkgPSAnKic7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSBCYXNlLkRheSkge1xuICAgICAgLy8gZGF5LCBkb24ndCBkZWxldGUgbWludXRlcyBhbmQgaG91cnNcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgZGF5IG9mIGV2ZXJ5IG1vbnRoLCBhdCB3aGF0ZXZlciBob3VyIGFuZCBtaW51dGUsIGF0IHNlY29uZCAwXG4gICAgICBjcm9uQ29uZmlnLm1pbnV0ZSA9IGNyb25Db25maWcubWludXRlID09PSAnKicgPyB0aGlzLm1pbnV0ZXNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLm1pbnV0ZTtcbiAgICAgIGNyb25Db25maWcuaG91ciA9IGNyb25Db25maWcuaG91ciA9PT0gJyonID8gdGhpcy5ob3Vyc1swXS52YWx1ZSA6IGNyb25Db25maWcuaG91cjtcbiAgICAgIGNyb25Db25maWcuZGF5ID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuV2Vlaykge1xuICAgICAgLy8gd2VlaywgZGVsZXRlIG1vbnRoIGFuZCBkYXlcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgbW9udGgsIGF0IHdoYXRldmVyIHdlZWtkYXksIGhvdXIgYW5kIG1pbnV0ZSwgYXQgc2Vjb25kIDBcbiAgICAgIGNyb25Db25maWcubWludXRlID0gY3JvbkNvbmZpZy5taW51dGUgPT09ICcqJyA/IHRoaXMubWludXRlc1swXS52YWx1ZSA6IGNyb25Db25maWcubWludXRlO1xuICAgICAgY3JvbkNvbmZpZy5ob3VyID0gY3JvbkNvbmZpZy5ob3VyID09PSAnKicgPyB0aGlzLmhvdXJzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5ob3VyO1xuICAgICAgY3JvbkNvbmZpZy5kYXkgPSAnKic7XG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID0gJyonO1xuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID1cbiAgICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnKicgfHwgY3JvbkNvbmZpZy53ZWVrZGF5ID09PSAnPydcbiAgICAgICAgICA/IHRoaXMuZGF5c09mV2Vla1Bvc2l4WzBdLnZhbHVlXG4gICAgICAgICAgOiBjcm9uQ29uZmlnLndlZWtkYXk7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSBCYXNlLk1vbnRoKSB7XG4gICAgICAvLyBtb250aCwgZGVsZXRlIG1vbnRoIGFuZCB3ZWVrZGF5XG4gICAgICAvLyBjcm9uIGV4cHJlc3Npb246IGV2ZXJ5IG1vbnRoLCBhdCB3aGF0ZXZlciBkYXkgb2YgbW9udGgsIGhvdXIgYW5kIG1pbnV0ZSwgYXQgc2Vjb25kIDBcbiAgICAgIGNyb25Db25maWcubWludXRlID0gY3JvbkNvbmZpZy5taW51dGUgPT09ICcqJyA/IHRoaXMubWludXRlc1swXS52YWx1ZSA6IGNyb25Db25maWcubWludXRlO1xuICAgICAgY3JvbkNvbmZpZy5ob3VyID0gY3JvbkNvbmZpZy5ob3VyID09PSAnKicgPyB0aGlzLmhvdXJzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5ob3VyO1xuICAgICAgY3JvbkNvbmZpZy5kYXkgPSBjcm9uQ29uZmlnLmRheSA9PT0gJyonID8gdGhpcy5kYXlzT2ZNb250aFswXS52YWx1ZSA6IGNyb25Db25maWcuZGF5O1xuICAgICAgY3JvbkNvbmZpZy5tb250aCA9ICcqJztcbiAgICAgIGNyb25Db25maWcud2Vla2RheSA9ICcqJztcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IEJhc2UuWWVhcikge1xuICAgICAgLy8geWVhciwgZGVsZXRlIHdlZWtkYXlcbiAgICAgIC8vIGNyb24gZXhwcmVzc2lvbjogZXZlcnkgeWVhciwgYXQgd2hhdGV2ZXIgbW9udGgsIGRheSBvZiBtb250aCwgaG91ciBhbmQgbWludXRlLCBhdCBzZWNvbmQgMFxuICAgICAgY3JvbkNvbmZpZy5taW51dGUgPSBjcm9uQ29uZmlnLm1pbnV0ZSA9PT0gJyonID8gdGhpcy5taW51dGVzWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5taW51dGU7XG4gICAgICBjcm9uQ29uZmlnLmhvdXIgPSBjcm9uQ29uZmlnLmhvdXIgPT09ICcqJyA/IHRoaXMuaG91cnNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLmhvdXI7XG4gICAgICBjcm9uQ29uZmlnLmRheSA9IGNyb25Db25maWcuZGF5ID09PSAnKicgPyB0aGlzLmRheXNPZk1vbnRoWzBdLnZhbHVlIDogY3JvbkNvbmZpZy5kYXk7XG4gICAgICBjcm9uQ29uZmlnLm1vbnRoID0gY3JvbkNvbmZpZy5tb250aCA9PT0gJyonID8gdGhpcy5tb250aHNbMF0udmFsdWUgOiBjcm9uQ29uZmlnLm1vbnRoO1xuICAgICAgY3JvbkNvbmZpZy53ZWVrZGF5ID0gJyonO1xuICAgIH1cbiAgfVxuXG4gIGdldFdlZWtEYXlOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgY29uc3QgZmlyc3RTdW5kYXlEYXRlID0gZGF0ZS5nZXREYXRlKCkgKyAzOyAvLyBiZWNhdXNlIHdlIGtub3cgZGF0ZSAwIHdhcyBvbiBUaHVyc2RheS4uLlxuICAgIGRhdGUuc2V0RGF0ZShmaXJzdFN1bmRheURhdGUgKyBwYXJzZUludChjcm9uQ29uZmlnLndlZWtkYXksIDEwKSk7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUoZGF0ZSwgJ0VFRUUnLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcpO1xuICB9XG5cbiAgZ2V0TW9udGhEYXlOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBsZXQgbmFtZSA9ICcnO1xuICAgIHRoaXMuZGF5c09mTW9udGguZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlID09PSBjcm9uQ29uZmlnLmRheSkge1xuICAgICAgICBuYW1lID0gaXRlbS5sYWJlbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgZ2V0TW9udGhOYW1lKGNyb25Db25maWc6IENyb25Db25maWcpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgZGF0ZS5zZXRNb250aChwYXJzZUludChjcm9uQ29uZmlnLm1vbnRoLCAxMCkgLSAxKTtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCAnTExMTCcsIHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG4gIH1cbn1cbiJdfQ==