UNPKG

@asadi/angular-date-components

Version:

`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S

200 lines 36.2 kB
import { Component } from '@angular/core'; import { ADCCommonService, ADCStaticValues, FlatEventBuilder, TableSelection } from '@asadi/angular-date-components/core'; import { AdcSchedulerBase } from '../adc-scheduler-base/adc-scheduler-base'; import * as i0 from "@angular/core"; import * as i1 from "@asadi/angular-date-components/core"; export class ADCWeekViewComponent extends AdcSchedulerBase { constructor() { super(); this.week = 0; this.year = 0; this.daysOfWeek = ADCStaticValues.getDaysOfWeek(); this.title = ''; this.dateSplitter = this.dateFormatter.DateSplitter; this.events = []; this.rows = []; this.startOfWeek = ''; this.endOfWeek = ''; this.weekends = []; this.holidays = []; this.today = this.dateAdapter.today(); this.commonService = new ADCCommonService(this.dateAdapter, this.labels); this.selectionManager = new TableSelection(this.dateFilter); this.eventBuilder = new FlatEventBuilder(); } ngOnInit() { super.init(); this.selectionManager.cellSelectionStream.subscribe(event => this.onDateRangeSelect(event.start, event.end)); this.eventBuilder.eventSelectionStream.subscribe(e => { this.onEventClick(e.event, e.dom, e.jsEvent); }); } dateFilter(cell1, cell2) { return cell2.rowValue > cell1.rowValue || (cell2.rowValue == cell1.rowValue && cell2.columnIndex >= cell1.columnIndex); } initViewHanlder() { if (this.startOf == null) { this.todayButtonHandler(); } else { this.week = this.dateAdapter.getWeekOf(this.startOf); this.year = this.dateAdapter.getYearOf(this.startOf); this.calculateCurrentDate(); } } todayButtonHandler() { this.week = this.dateAdapter.getCurrentWeek(); this.year = this.dateAdapter.getCurrentYear(); this.calculateCurrentDate(); } previousButtonHandler() { this.week--; if (this.week < 1) { this.year--; this.week = this.dateAdapter.getWeeksOfYear(this.year) - 1; } this.calculateCurrentDate(); } nextButtonHandler() { this.week++; const weeksOfYear = this.dateAdapter.getWeeksOfYear(this.year); if (this.week >= weeksOfYear) { this.year++; this.week = 1; } this.calculateCurrentDate(); } calculateCurrentDate() { const start = this.dateAdapter.getDateOfDay(this.year, this.week, 0); const end = this.dateAdapter.getDateOfDay(this.year, this.week, 6); this.startOfWeek = this.dateAdapter.transformDate(+start.split(this.dateSplitter)[0], +start.split(this.dateSplitter)[1], +start.split(this.dateSplitter)[2]); this.endOfWeek = this.dateAdapter.transformDate(+end.split(this.dateSplitter)[0], +end.split(this.dateSplitter)[1], +end.split(this.dateSplitter)[2]); this.title = `${this.labels?.week || "Week"} ${this.week} ${this.labels?.year || "Year"} ${this.year}`; this.dateChangesHandler(); super.dateRangeChange({ startDate: this.startOfWeek, endDate: this.endOfWeek }); } eventChangesHandler(schedulerEvents) { const tableEvents = []; this.events = schedulerEvents; const viewEvents = this.tools.scheduler.getEventsBetweenDateRange(this.startOfWeek, this.endOfWeek, this.events); viewEvents.forEach((e) => { const startRowIndex = this.rows.findIndex((r, i) => { if (i == 0) return; return this.tools.dateTime.dateOnly(r.value) == this.tools.dateTime.dateOnly(e.startDate); }); const startColumnIndex = startRowIndex == -1 ? 0 : this.rows[startRowIndex].columns.findIndex(c => this.tools.dateTime.hour(c.value) === this.tools.dateTime.hourOrDefault(e.startTime, '00')); const endRowIndex = this.rows.findIndex((r, i) => { if (i == 0) return; return this.tools.dateTime.dateOnly(r.value) == this.tools.dateTime.dateOnly(e.endDate); }); const endColumnIndex = endRowIndex == -1 ? this.rows[this.rows.length - 1].columns.length - 1 : this.rows[endRowIndex].columns.findIndex(c => this.tools.dateTime.hour(c.value) === this.tools.dateTime.hourOrDefault(e.endTime, '23')); const startTime = +this.tools.dateTime.minutesOrDefault(e.startTime, '00'); const endTime = +this.tools.dateTime.minutesOrDefault(e.endTime, '60'); const cellEvent = { columnStart: startRowIndex != -1 ? startColumnIndex : null, columnEnd: endRowIndex != -1 ? endColumnIndex : null, data: e, rowStart: startRowIndex != -1 ? startRowIndex : 0, rowEnd: endRowIndex != -1 ? endRowIndex : this.rows.length - 1, offsetX: startTime / 60, fractionX: endTime / 60, overlapTolerance: this.options.eventOverlapTolerance / 60 }; if (e.allDay == true) { const eventHourEnd = +this.tools.dateTime.hourOrDefault(e.endTime, '23'); cellEvent.fractionX = 24 - eventHourEnd; } tableEvents.push(cellEvent); }); this.eventBuilder.data = tableEvents; } dateChangesHandler() { this.rows = this.getInitialRowValue(); this.daysOfWeek.forEach((day, index) => { const dayIndex = this.commonService.getDayIndex(index); const date = this.dateAdapter.getDateOfDay(this.year, +this.week, index); const splittedDate = date.split(this.dateSplitter); const transformedDate = this.dateAdapter.transformDate(+splittedDate[0], +splittedDate[1], +splittedDate[2]); const row = { label: this.labels?.daysOfWeek[dayIndex] || day, prefix: '', suffix: splittedDate[1] + this.dateSplitter + splittedDate[2], verticalAlign: 'center', horizontalAlign: 'center', classList: ''.concat(transformedDate.split('T')[0] == this.today ? ' today ' : ' ', this.weekends.includes(index) || this.holidays.includes(transformedDate.split('T')[0]) ? ' holiday ' : ' '), value: transformedDate.split('T')[0], columns: [] }; ADCStaticValues.getHoursOfDay().forEach((hour, hourIndex) => { const column = { label: '', prefix: '', suffix: '', verticalAlign: 'center', horizontalAlign: 'center', classList: '', value: `${hour}`, selectable: true }; row.columns.push(column); }); this.rows.push(row); }); } weekendsChangesHandler(weekends) { this.weekends = weekends; this.dateChangesHandler(); } holidaysChangesHandler(holidays) { this.holidays = holidays; this.dateChangesHandler(); } onDateRangeSelect(start, end) { const e = { endDate: end.rowValue, endTime: end.columnValue, startDate: start.rowValue, startTime: start.columnValue, }; super.dateRangeSelect(e); } onEventClick(event, dom, jsEvent) { const schedulerEvent = this.events.filter(item => item.id == event.data.id)[0]; super.eventClick({ dom: dom, event: schedulerEvent, jsEvent: jsEvent }); } ngOnDestroy() { super.destroy(); } getInitialRowValue() { return [{ verticalAlign: 'center', horizontalAlign: 'center', classList: '', label: '', prefix: '', suffix: '', value: '', columns: ADCStaticValues.getHoursOfDay().map((hour, hourIndex) => { return { verticalAlign: 'center', horizontalAlign: 'center', classList: '', selectable: false, label: hour, prefix: '', suffix: '', value: hour, }; }) }]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCWeekViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ADCWeekViewComponent, selector: "adc-week-view", usesInheritance: true, ngImport: i0, template: "\r\n\r\n \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n<!-- \r\n[eventBuilder]=\"builder\"\r\n<div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"], dependencies: [{ kind: "component", type: i1.ADCTableComponent, selector: "adc-table", inputs: ["rows", "showRowDetails", "title", "titleClass", "eventBuilder", "selectionManager"], outputs: ["viewReady"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ADCWeekViewComponent, decorators: [{ type: Component, args: [{ selector: 'adc-week-view', template: "\r\n\r\n \r\n<adc-table\r\n[rows]=\"rows\"\r\n[title]=\"title\"\r\n[selectionManager]=\"selectionManager\"\r\n[eventBuilder]=\"eventBuilder\"\r\n(viewReady)=\"markViewAsReady()\"\r\n></adc-table>\r\n<!-- \r\n[eventBuilder]=\"builder\"\r\n<div flatEventBuilder [columns]=\"columns.length\" [rows]=\"rows.length\" #builder=\"eventBuilder\"></div> -->\r\n\r\n\r\n\r\n", styles: [".w-full{width:100%}.table-layout-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.h-12{height:3rem}.text-center{text-align:center}.events{height:100%;width:100%;overflow:visible;padding:0;margin:0}.h-1152{height:1152px}.over-flow-hidden{overflow:hidden}table{border-spacing:0}\n"] }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRjd2Vlay12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL3NjaGVkdWxlci9zcmMvY29tcG9uZW50cy9hZGN3ZWVrLXZpZXcvYWRjd2Vlay12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL3NjaGVkdWxlci9zcmMvY29tcG9uZW50cy9hZGN3ZWVrLXZpZXcvYWRjd2Vlay12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUYsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRXhNLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7QUFPNUUsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUFnQjtJQXdCeEQ7UUFFRSxLQUFLLEVBQUUsQ0FBQztRQXhCVixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBVyxDQUFDLENBQUM7UUFFVCxlQUFVLEdBQWEsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRS9ELFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsaUJBQVksR0FBb0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDaEUsV0FBTSxHQUF5QixFQUFFLENBQUM7UUFDbEMsU0FBSSxHQUFtQixFQUFFLENBQUM7UUFFbEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUUvQixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLGFBQVEsR0FB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LENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTlGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUUvQyxJQUFHLENBQUMsSUFBSSxDQUFDO29CQUFFLE9BQU87Z0JBRWxCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxjQUFjLEdBQUcsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0ksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTVGLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRSxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENB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QVE7d0JBQ3pCLFNBQVMsRUFBRSxFQUFFO3dCQUNiLFVBQVUsRUFBRSxLQUFLO3dCQUNqQixLQUFLLEVBQUUsSUFBSTt3QkFDWCxNQUFNLEVBQUUsRUFBRTt3QkFDVixNQUFNLEVBQUUsRUFBRTt3QkFDVixLQUFLLEVBQUUsSUFBSTtxQkFDWixDQUFBO2dCQUNILENBQUMsQ0FBQzthQUNILENBQUMsQ0FBQTtJQUNKLENBQUM7OEdBbFJVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDRFQ1ZqQyw4V0FnQkE7OzJGRE5hLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBRENDb21tb25TZXJ2aWNlLCBBRENEYXRlU3BsaXR0ZXIsIEFEQ0lUYWJsZUNlbGwsIEFEQ0lUYWJsZUNvbHVtbiwgQURDSVRhYmxlRXZlbnQsIEFEQ0lUYWJsZVJvdywgQURDU3RhdGljVmFsdWVzLCBGbGF0RXZlbnRCdWlsZGVyLCBUYWJsZVNlbGVjdGlvbn0gZnJvbSAnQGFzYWRpL2FuZ3VsYXItZGF0ZS1jb21wb25lbnRzL2NvcmUnO1xyXG5pbXBvcnQgeyBBRENJU2NoZWR1bGVyRGF0ZVJhbmdlU2VsZWN0RXZlbnQsIEFEQ0lTY2hlZHVsZXJFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS5nbG9iYWwnO1xyXG5pbXBvcnQgeyBBZGNTY2hlZHVsZXJCYXNlIH0gZnJvbSAnLi4vYWRjLXNjaGVkdWxlci1iYXNlL2FkYy1zY2hlZHVsZXItYmFzZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FkYy13ZWVrLXZpZXcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGN3ZWVrLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FkY3dlZWstdmlldy5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFEQ1dlZWtWaWV3Q29tcG9uZW50IGV4dGVuZHMgQWRjU2NoZWR1bGVyQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgd2VlazogbnVtYmVyID0gMDtcclxuICB5ZWFyOiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIGRheXNPZldlZWs6IHN0cmluZ1tdID0gQURDU3RhdGljVmFsdWVzLmdldERheXNPZldlZWsoKTtcclxuXHJcbiAgdGl0bGU6IHN0cmluZyA9ICcnO1xyXG4gIFxyXG4gIGRhdGVTcGxpdHRlcjogQURDRGF0ZVNwbGl0dGVyID0gdGhpcy5kYXRlRm9ybWF0dGVyLkRhdGVTcGxpdHRlcjtcclxuICBldmVudHM6IEFEQ0lTY2hlZHVsZXJFdmVudFtdID0gW107XHJcbiAgcm93czogQURDSVRhYmxlUm93W10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBzdGFydE9mV2Vlazogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBlbmRPZldlZWs6IHN0cmluZyA9ICcnO1xyXG5cclxuICB3ZWVrZW5kczogbnVtYmVyW10gPSBbXTtcclxuICBob2xpZGF5czogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcmVhZG9ubHkgdG9kYXk6IHN0cmluZyA9IHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKTtcclxuICByZWFkb25seSBjb21tb25TZXJ2aWNlID0gbmV3IEFEQ0NvbW1vblNlcnZpY2UodGhpcy5kYXRlQWRhcHRlciwgdGhpcy5sYWJlbHMpO1xyXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1hbmFnZXIgPSBuZXcgVGFibGVTZWxlY3Rpb24odGhpcy5kYXRlRmlsdGVyKTtcclxuICByZWFkb25seSBldmVudEJ1aWxkZXIgPSBuZXcgRmxhdEV2ZW50QnVpbGRlcigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpXHJcbiAge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgXHJcbiAge1xyXG4gICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uTWFuYWdlci5jZWxsU2VsZWN0aW9uU3RyZWFtLnN1YnNjcmliZShldmVudCA9PiB0aGlzLm9uRGF0ZVJhbmdlU2VsZWN0KGV2ZW50LnN0YXJ0LCBldmVudC5lbmQpKTtcclxuXHJcbiAgICB0aGlzLmV2ZW50QnVpbGRlci5ldmVudFNlbGVjdGlvblN0cmVhbS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgIHRoaXMub25FdmVudENsaWNrKGUuZXZlbnQsIGUuZG9tLCBlLmpzRXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyKGNlbGwxOiBBRENJVGFibGVDZWxsLCBjZWxsMjogQURDSVRhYmxlQ2VsbCk6IGJvb2xlYW5cclxuICB7XHJcbiAgICByZXR1cm4gY2VsbDIucm93VmFsdWUgPiBjZWxsMS5yb3dWYWx1ZSB8fCAoY2VsbDIucm93VmFsdWUgPT0gY2VsbDEucm93VmFsdWUgJiYgY2VsbDIuY29sdW1uSW5kZXggPj0gY2VsbDEuY29sdW1uSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaW5pdFZpZXdIYW5sZGVyKCk6IHZvaWQgXHJcbiAge1xyXG4gICAgaWYodGhpcy5zdGFydE9mID09IG51bGwpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMudG9kYXlCdXR0b25IYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHRoaXMud2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0V2Vla09mKHRoaXMuc3RhcnRPZik7XHJcbiAgICAgIHRoaXMueWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhck9mKHRoaXMuc3RhcnRPZik7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudERhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvZGF5QnV0dG9uSGFuZGxlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy53ZWVrID0gdGhpcy5kYXRlQWRhcHRlci5nZXRDdXJyZW50V2VlaygpO1xyXG4gICAgdGhpcy55ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRDdXJyZW50WWVhcigpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudERhdGUoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHByZXZpb3VzQnV0dG9uSGFuZGxlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy53ZWVrLS07XHJcblxyXG4gICAgaWYodGhpcy53ZWVrIDwgMSlcclxuICAgIHtcclxuICAgICAgdGhpcy55ZWFyLS07XHJcbiAgICAgIHRoaXMud2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0V2Vla3NPZlllYXIodGhpcy55ZWFyKSAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYWxjdWxhdGVDdXJyZW50RGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmV4dEJ1dHRvbkhhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMud2VlaysrO1xyXG4gICAgY29uc3Qgd2Vla3NPZlllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFdlZWtzT2ZZZWFyKHRoaXMueWVhcik7XHJcblxyXG4gICAgaWYodGhpcy53ZWVrID49IHdlZWtzT2ZZZWFyKVxyXG4gICAge1xyXG4gICAgICB0aGlzLnllYXIrKztcclxuICAgICAgdGhpcy53ZWVrID0gMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVDdXJyZW50RGF0ZSgpOiB2b2lkXHJcbiAge1xyXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsIHRoaXMud2VlaywgMCk7XHJcbiAgICBjb25zdCBlbmQgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsIHRoaXMud2VlaywgNik7XHJcblxyXG4gICAgdGhpcy5zdGFydE9mV2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSgrc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzBdLCArc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzFdLCArc3RhcnQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzJdKTtcclxuICAgIHRoaXMuZW5kT2ZXZWVrID0gdGhpcy5kYXRlQWRhcHRlci50cmFuc2Zvcm1EYXRlKCtlbmQuc3BsaXQodGhpcy5kYXRlU3BsaXR0ZXIpWzBdLCArZW5kLnNwbGl0KHRoaXMuZGF0ZVNwbGl0dGVyKVsxXSwgK2VuZC5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcilbMl0pO1xyXG5cclxuICAgIHRoaXMudGl0bGUgPSBgJHt0aGlzLmxhYmVscz8ud2VlayB8fCBcIldlZWtcIn0gJHt0aGlzLndlZWt9ICR7dGhpcy5sYWJlbHM/LnllYXIgfHwgXCJZZWFyXCJ9ICR7dGhpcy55ZWFyfWA7XHJcblxyXG4gICAgdGhpcy5kYXRlQ2hhbmdlc0hhbmRsZXIoKTtcclxuICAgIHN1cGVyLmRhdGVSYW5nZUNoYW5nZSh7c3RhcnREYXRlOiB0aGlzLnN0YXJ0T2ZXZWVrLCBlbmREYXRlOiB0aGlzLmVuZE9mV2Vla30pO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgZXZlbnRDaGFuZ2VzSGFuZGxlcihzY2hlZHVsZXJFdmVudHM6IEFEQ0lTY2hlZHVsZXJFdmVudFtdKTogdm9pZFxyXG4gIHtcclxuICAgIGNvbnN0IHRhYmxlRXZlbnRzOiBBRENJVGFibGVFdmVudFtdID0gW107XHJcblxyXG4gICAgdGhpcy5ldmVudHMgPSBzY2hlZHVsZXJFdmVudHM7XHJcblxyXG4gICAgY29uc3Qgdmlld0V2ZW50cyA9IHRoaXMudG9vbHMuc2NoZWR1bGVyLmdldEV2ZW50c0JldHdlZW5EYXRlUmFuZ2UodGhpcy5zdGFydE9mV2VlaywgdGhpcy5lbmRPZldlZWssIHRoaXMuZXZlbnRzKTtcclxuICAgIFxyXG4gICAgdmlld0V2ZW50cy5mb3JFYWNoKChlOiBBRENJU2NoZWR1bGVyRXZlbnQpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSB0aGlzLnJvd3MuZmluZEluZGV4KChyLCBpKSA9PiB7XHJcblxyXG4gICAgICAgIGlmKGkgPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShyLnZhbHVlKSA9PSB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGUuc3RhcnREYXRlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGFydENvbHVtbkluZGV4ID0gc3RhcnRSb3dJbmRleCA9PSAtMSA/IDAgOiB0aGlzLnJvd3Nbc3RhcnRSb3dJbmRleF0uY29sdW1ucy5maW5kSW5kZXgoYyA9PiBcclxuICAgICAgICB0aGlzLnRvb2xzLmRhdGVUaW1lLmhvdXIoYy52YWx1ZSkgPT09IHRoaXMudG9vbHMuZGF0ZVRpbWUuaG91ck9yRGVmYXVsdChlLnN0YXJ0VGltZSwgJzAwJykpO1xyXG5cclxuICAgICAgY29uc3QgZW5kUm93SW5kZXggPSB0aGlzLnJvd3MuZmluZEluZGV4KChyLCBpKSA9PiB7XHJcblxyXG4gICAgICAgIGlmKGkgPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy50b29scy5kYXRlVGltZS5kYXRlT25seShyLnZhbHVlKSA9PSB0aGlzLnRvb2xzLmRhdGVUaW1lLmRhdGVPbmx5KGUuZW5kRGF0ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgZW5kQ29sdW1uSW5kZXggPSBlbmRSb3dJbmRleCA9PSAtMSA/IHRoaXMucm93c1t0aGlzLnJvd3MubGVuZ3RoIC0gMV0uY29sdW1ucy5sZW5ndGggLSAxIDogdGhpcy5yb3dzW2VuZFJvd0luZGV4XS5jb2x1bW5zLmZpbmRJbmRleChjID0+IFxyXG4gICAgICAgIHRoaXMudG9vbHMuZGF0ZVRpbWUuaG91cihjLnZhbHVlKSA9PT0gdGhpcy50b29scy5kYXRlVGltZS5ob3VyT3JEZWZhdWx0KGUuZW5kVGltZSwgJzIzJykpO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gK3RoaXMudG9vbHMuZGF0ZVRpbWUubWludXRlc09yRGVmYXVsdChlLnN0YXJ0VGltZSwgJzAwJyk7XHJcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSArdGhpcy50b29scy5kYXRlVGltZS5taW51dGVzT3JEZWZhdWx0KGUuZW5kVGltZSwgJzYwJyk7XHJcblxyXG5cclxuICAgICAgY29uc3QgY2VsbEV2ZW50OiBBRENJVGFibGVFdmVudCA9IHtcclxuICAgICAgICBjb2x1bW5TdGFydDogc3RhcnRSb3dJbmRleCAhPSAtMSA/IHN0YXJ0Q29sdW1uSW5kZXggOiBudWxsLFxyXG4gICAgICAgIGNvbHVtbkVuZDogZW5kUm93SW5kZXggIT0gLTEgPyBlbmRDb2x1bW5JbmRleCA6IG51bGwsXHJcbiAgICAgICAgZGF0YTogZSxcclxuICAgICAgICByb3dTdGFydDogc3RhcnRSb3dJbmRleCAhPSAtMSA/IHN0YXJ0Um93SW5kZXggOiAwLFxyXG4gICAgICAgIHJvd0VuZDogZW5kUm93SW5kZXggIT0gLTEgPyBlbmRSb3dJbmRleCA6IHRoaXMucm93cy5sZW5ndGggLSAxLFxyXG4gICAgICAgIG9mZnNldFg6IHN0YXJ0VGltZSAvIDYwLFxyXG4gICAgICAgIGZyYWN0aW9uWDogZW5kVGltZSAvIDYwLFxyXG4gICAgICAgIG92ZXJsYXBUb2xlcmFuY2U6IHRoaXMub3B0aW9ucy5ldmVudE92ZXJsYXBUb2xlcmFuY2UgLyA2MFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYoZS5hbGxEYXkgPT0gdHJ1ZSlcclxuICAgICAge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50SG91ckVuZCA9ICt0aGlzLnRvb2xzLmRhdGVUaW1lLmhvdXJPckRlZmF1bHQoZS5lbmRUaW1lLCAnMjMnKTtcclxuXHJcbiAgICAgICAgY2VsbEV2ZW50LmZyYWN0aW9uWCA9IDI0IC0gZXZlbnRIb3VyRW5kO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YWJsZUV2ZW50cy5wdXNoKGNlbGxFdmVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmV2ZW50QnVpbGRlci5kYXRhID0gdGFibGVFdmVudHM7XHJcbiAgfVxyXG5cclxuICBkYXRlQ2hhbmdlc0hhbmRsZXIoKTogdm9pZFxyXG4gIHtcclxuICAgIHRoaXMucm93cyA9IHRoaXMuZ2V0SW5pdGlhbFJvd1ZhbHVlKCk7ICBcclxuXHJcbiAgICB0aGlzLmRheXNPZldlZWsuZm9yRWFjaCgoZGF5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGRheUluZGV4ID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldERheUluZGV4KGluZGV4KTtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGVPZkRheSh0aGlzLnllYXIsICt0aGlzLndlZWssIGluZGV4KTtcclxuICAgICAgY29uc3Qgc3BsaXR0ZWREYXRlID0gZGF0ZS5zcGxpdCh0aGlzLmRhdGVTcGxpdHRlcik7XHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIudHJhbnNmb3JtRGF0ZSgrc3BsaXR0ZWREYXRlWzBdLCArc3BsaXR0ZWREYXRlWzFdLCArc3BsaXR0ZWREYXRlWzJdKTtcclxuXHJcbiAgICAgIGNvbnN0IHJvdzogQURDSVRhYmxlUm93ID0ge1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLmxhYmVscz8uZGF5c09mV2Vla1tkYXlJbmRleF0gfHwgZGF5LFxyXG4gICAgICAgIHByZWZpeDogJycsXHJcbiAgICAgICAgc3VmZml4OiBzcGxpdHRlZERhdGVbMV0gKyB0aGlzLmRhdGVTcGxpdHRlciArIHNwbGl0dGVkRGF0ZVsyXSxcclxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgIGNsYXNzTGlzdDogJycuY29uY2F0KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0gPT0gdGhpcy50b2RheSA/ICcgdG9kYXkgJyA6ICcgJyxcclxuICAgICAgICAgIHRoaXMud2Vla2VuZHMuaW5jbHVkZXMoaW5kZXgpIHx8IHRoaXMuaG9saWRheXMuaW5jbHVkZXModHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0pID8gJyBob2xpZGF5ICcgOiAnICcsXHJcbiAgICAgICAgKSxcclxuICAgICAgICB2YWx1ZTogdHJhbnNmb3JtZWREYXRlLnNwbGl0KCdUJylbMF0sXHJcbiAgICAgICAgY29sdW1uczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICAgIEFEQ1N0YXRpY1ZhbHVlcy5nZXRIb3Vyc09mRGF5KCkuZm9yRWFjaCgoaG91cjogc3RyaW5nLCBob3VySW5kZXg6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCBjb2x1bW46IEFEQ0lUYWJsZUNvbHVtbiA9IHtcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIHByZWZpeDogJycsXHJcbiAgICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgY2xhc3NMaXN0OiAnJyxcclxuICAgICAgICAgIHZhbHVlOiBgJHtob3VyfWAsXHJcbiAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByb3cuY29sdW1ucy5wdXNoKGNvbHVtbik7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnJvd3MucHVzaChyb3cpO1xyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSB3ZWVrZW5kc0NoYW5nZXNIYW5kbGVyKHdlZWtlbmRzOiBudW1iZXJbXSk6IHZvaWQgXHJcbiAge1xyXG4gICAgdGhpcy53ZWVrZW5kcyA9IHdlZWtlbmRzO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlc0hhbmRsZXIoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGhvbGlkYXlzQ2hhbmdlc0hhbmRsZXIoaG9saWRheXM6IHN0cmluZ1tdKTogdm9pZCBcclxuICB7XHJcbiAgICB0aGlzLmhvbGlkYXlzID0gaG9saWRheXM7XHJcbiAgICB0aGlzLmRhdGVDaGFuZ2VzSGFuZGxlcigpO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlUmFuZ2VTZWxlY3Qoc3RhcnQ6IEFEQ0lUYWJsZUNlbGwsIGVuZDogQURDSVRhYmxlQ2VsbCk6IHZvaWRcclxuICB7XHJcbiAgICBjb25zdCBlOiBBRENJU2NoZWR1bGVyRGF0ZVJhbmdlU2VsZWN0RXZlbnQgPSBcclxuICAgIHtcclxuICAgICAgZW5kRGF0ZTogZW5kLnJvd1ZhbHVlLFxyXG4gICAgICBlbmRUaW1lOiBlbmQuY29sdW1uVmFsdWUsXHJcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnQucm93VmFsdWUsXHJcbiAgICAgIHN0YXJ0VGltZTogc3RhcnQuY29sdW1uVmFsdWUsXHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN1cGVyLmRhdGVSYW5nZVNlbGVjdChlKTtcclxuICB9XHJcblxyXG5cclxuICBvdmVycmlkZSBvbkV2ZW50Q2xpY2soZXZlbnQ6IEFEQ0lUYWJsZUV2ZW50LCBkb206IEhUTUxFbGVtZW50LCBqc0V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCBcclxuICB7XHJcbiAgICBjb25zdCBzY2hlZHVsZXJFdmVudDogQURDSVNjaGVkdWxlckV2ZW50ID0gdGhpcy5ldmVudHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCA9PSBldmVudC5kYXRhLmlkKVswXTtcclxuXHJcbiAgICBzdXBlci5ldmVudENsaWNrKHtkb206IGRvbSwgZXZlbnQ6IHNjaGVkdWxlckV2ZW50LCBqc0V2ZW50OiBqc0V2ZW50fSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIFxyXG4gIHtcclxuICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFJvd1ZhbHVlKCk6IEFEQ0lUYWJsZVJvd1tdXHJcbiAge1xyXG4gICAgcmV0dXJuIFt7XHJcbiAgICAgIHZlcnRpY2FsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLFxyXG4gICAgICBjbGFzc0xpc3Q6ICcnLFxyXG4gICAgICBsYWJlbDogJycsXHJcbiAgICAgIHByZWZpeDogJycsXHJcbiAgICAgIHN1ZmZpeDogJycsXHJcbiAgICAgIHZhbHVlOiAnJyxcclxuICAgICAgY29sdW1uczogQURDU3RhdGljVmFsdWVzLmdldEhvdXJzT2ZEYXkoKS5tYXAoKGhvdXIsIGhvdXJJbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgIGhvcml6b250YWxBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICBjbGFzc0xpc3Q6ICcnLFxyXG4gICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICBsYWJlbDogaG91cixcclxuICAgICAgICAgIHByZWZpeDogJycsXHJcbiAgICAgICAgICBzdWZmaXg6ICcnLFxyXG4gICAgICAgICAgdmFsdWU6IGhvdXIsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfV1cclxuICB9XHJcbn1cclxuIiwiXHJcblxyXG4gXHJcbjxhZGMtdGFibGVcclxuW3Jvd3NdPVwicm93c1wiXHJcblt0aXRsZV09XCJ0aXRsZVwiXHJcbltzZWxlY3Rpb25NYW5hZ2VyXT1cInNlbGVjdGlvbk1hbmFnZXJcIlxyXG5bZXZlbnRCdWlsZGVyXT1cImV2ZW50QnVpbGRlclwiXHJcbih2aWV3UmVhZHkpPVwibWFya1ZpZXdBc1JlYWR5KClcIlxyXG4+PC9hZGMtdGFibGU+XHJcbjwhLS0gXHJcbltldmVudEJ1aWxkZXJdPVwiYnVpbGRlclwiXHJcbjxkaXYgZmxhdEV2ZW50QnVpbGRlciBbY29sdW1uc109XCJjb2x1bW5zLmxlbmd0aFwiIFtyb3dzXT1cInJvd3MubGVuZ3RoXCIgI2J1aWxkZXI9XCJldmVudEJ1aWxkZXJcIj48L2Rpdj4gLS0+XHJcblxyXG5cclxuXHJcbiJdfQ==