UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

180 lines 24.4 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The relevant code is marked with a comment. */ import { __awaiter, __decorate, __extends, __generator } from "tslib"; import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, ViewChildren } from '@angular/core'; import { MatCalendarBody } from '@angular/material/datepicker'; import { Subscription } from 'rxjs'; var MatDaterangeCalendarBody = /** @class */ (function (_super) { __extends(MatDaterangeCalendarBody, _super); function MatDaterangeCalendarBody() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.hoverSubscription = Subscription.EMPTY; _this.clearBodySubscription = Subscription.EMPTY; return _this; } MatDaterangeCalendarBody.prototype.ngOnInit = function () { var _this = this; this.hoverSubscription = this.setHoverCells.subscribe(function (tmpDate) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { if (!tmpDate || !this.selected || this.selectedRangeEnd || (this.selected && this.selectedRangeEnd)) return [2 /*return*/]; this._doHoverCells(tmpDate); return [2 /*return*/]; }); }); }); this.clearBodySubscription = this.clearBody.subscribe(function (clear) { if (clear) { _this._doHoverCells(null, clear); } }); }; MatDaterangeCalendarBody.prototype._cellClass = function (date) { if (!this.selected || !this.selectedRangeEnd) return; var startDate = this.selected.getTime(); var endDate = this.selectedRangeEnd.getTime(); var cellDate = this.createDate(date).getTime(); return { 'mat-daterange-calendar-body-in-range': cellDate >= startDate && cellDate <= endDate && startDate !== endDate, 'mat-daterange-calendar-body-range-start': cellDate === startDate && startDate !== endDate, 'mat-daterange-calendar-body-range-end': cellDate === endDate && startDate !== endDate }; }; MatDaterangeCalendarBody.prototype._inRange = function (date) { // if (this.range) { // if (this.allInRange) { // return true; // } // if (this.selectedValue && !this.selectedRangeEndValue) { // return date >= this.selectedValue; // } // if (this.selectedRangeEndValue && !this.selectedValue) { // return date <= this.selectedRangeEndValue; // } // return date >= this.selectedValue && date <= this.selectedRangeEndValue; // } }; MatDaterangeCalendarBody.prototype._onHoverCell = function (tmpDate) { if (this.selectedRangeEndValue) return; this.setHoverCells.next(this.createDate(tmpDate)); }; MatDaterangeCalendarBody.prototype._doHoverCells = function (tmpDate, clear) { var _this = this; var _a; var startDate = (_a = this.selected) === null || _a === void 0 ? void 0 : _a.getTime(); var endTempDate = tmpDate === null || tmpDate === void 0 ? void 0 : tmpDate.getTime(); this.rows.map(function (row, r) { var rowElm = _this.rowsElms.toArray()[r]; var hasLabel = false; row.map(function (cell, c) { var cellElm = rowElm.nativeElement.cells[hasLabel ? c + 1 : c]; if (cellElm.classList.contains('mat-calendar-body-label')) { hasLabel = true; cellElm = rowElm.nativeElement.cells[c + 1]; } cellElm.classList.remove('mat-daterange-calendar-body-in-range'); cellElm.classList.remove('mat-daterange-calendar-body-range-end'); cellElm.classList.remove('mat-daterange-calendar-body-range-start'); if (clear) return; var inRange = _this._inRangeTemp(cell.value, startDate, endTempDate, cellElm); }); }); }; MatDaterangeCalendarBody.prototype._inRangeTemp = function (date, startDate, endTempDate, cellElm) { var cellDate = this.createDate(date).getTime(); if (endTempDate >= startDate) { if (endTempDate !== startDate) { if (cellDate === startDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); cellElm.classList.add('mat-daterange-calendar-body-range-start'); } if (cellDate === endTempDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); cellElm.classList.add('mat-daterange-calendar-body-range-end'); } } if (cellDate > startDate && cellDate < endTempDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); return true; } return false; } else { if (endTempDate !== startDate) { if (cellDate === startDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); cellElm.classList.add('mat-daterange-calendar-body-range-end'); } if (cellDate === endTempDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); cellElm.classList.add('mat-daterange-calendar-body-range-start'); } } if (cellDate < startDate && cellDate > endTempDate) { cellElm.classList.add('mat-daterange-calendar-body-in-range'); return true; } return false; } }; MatDaterangeCalendarBody.prototype.ngOnDestroy = function () { this.hoverSubscription.unsubscribe(); this.clearBodySubscription.unsubscribe(); }; __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "range", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "allInRange", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "selectedRangeEndValue", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "view", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "createDate", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "selected", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "selectedRangeEnd", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "setHoverCells", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "clearBody", void 0); __decorate([ Input() ], MatDaterangeCalendarBody.prototype, "dateAdapter", void 0); __decorate([ ViewChildren('Row') ], MatDaterangeCalendarBody.prototype, "rowsElms", void 0); MatDaterangeCalendarBody = __decorate([ Component({ selector: '[mat-daterange-calendar-body]', template: "<!-- \n RANGE: Most of the code is redundant and hera as inheritance boilerplate.\n The relevant code is all element attribute bindings with the word \"range\"\n and an editing to the binding of [class.mat-calendar-body-selected]\n\n ADDED LOC ~3\n -->\n\n<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\n\t<td class=\"mat-calendar-body-label\"\n\t\t[attr.colspan]=\"numCols\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t{{label}}\n\t</td>\n</tr>\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\" #Row role=\"row\">\n\t<!--\n\t\tWe mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n\t\tThe aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n\t\tpercentage of the width (a variant of the trick described here:\n\t\thttps://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n\t-->\n\t<td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\n\t\taria-hidden=\"true\"\n\t\tclass=\"mat-calendar-body-label\"\n\t\t[attr.colspan]=\"_firstRowOffset\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t{{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\n\t</td>\n\t<td *ngFor=\"let item of row; let colIndex = index\"\n\t\t#Cell\n\t\trole=\"gridcell\"\n\t\tclass=\"mat-calendar-body-cell\"\n\t\t[tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n\t\t[class.mat-calendar-body-disabled]=\"!item.enabled\"\n\t\t[class.mat-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n\n\t\t[ngClass]=\"_cellClass(item.value)\"\n\n\t\t[attr.aria-label]=\"item.ariaLabel\"\n\t\t[attr.aria-disabled]=\"!item.enabled || null\"\n\t\t(click)=\"_cellClicked(item)\"\n\t\t(mouseover)=\"_onHoverCell(item.value)\"\n\t\t[style.width.%]=\"100 / numCols\"\n\t\t[style.paddingTop.%]=\"50 * cellAspectRatio / numCols\"\n\t\t[style.paddingBottom.%]=\"50 * cellAspectRatio / numCols\">\n\t\t<div class=\"mat-calendar-body-cell-content\"\n\t\t\t[class.mat-calendar-body-selected]=\"selectedValue === item.value || selectedRangeEndValue === item.value\"\n\t\t\t[class.mat-calendar-body-today]=\"todayValue === item.value\">\n\t\t{{item.displayValue}}\n\t\t</div>\n\t</td>\n</tr>\n", host: { 'class': 'mat-calendar-body', '[class.mat-daterange-calendar-body-range]': 'range', 'role': 'grid', 'attr.aria-readonly': 'true' }, exportAs: 'matCalendarBody', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush }) ], MatDaterangeCalendarBody); return MatDaterangeCalendarBody; }(MatCalendarBody)); export { MatDaterangeCalendarBody }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFOztBQUVGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBNEMsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBbUIsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUJyRDtJQUFpRCw0Q0FBZTtJQUFoRTtRQUFBLHFFQW9JQztRQXJIQSx1QkFBaUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFBO1FBQ3RDLDJCQUFxQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUE7O0lBb0gzQyxDQUFDO0lBbEhBLDJDQUFRLEdBQVI7UUFBQSxpQkFXQztRQVZBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxVQUFPLE9BQW1COztnQkFDL0UsSUFBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7b0JBQUUsc0JBQU87Z0JBQzNHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7OzthQUMzQixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBQSxLQUFLO1lBQzFELElBQUcsS0FBSyxFQUFDO2dCQUNSLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUss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QU07YUFDN0I7WUFDRCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3JDLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07U0FDaEQsQ0FBQztPQUNXLHdCQUF3QixDQW9JcEM7SUFBRCwrQkFBQztDQUFBLEFBcElELENBQWlELGVBQWUsR0FvSS9EO1NBcElZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgUkFOR0U6IE1vc3Qgb2YgdGhlIGNvZGUgaXMgcmVkdW5kYW50IGFuZCBoZXJhIGFzIGluaGVyaXRhbmNlIGJvaWxlcnBsYXRlLlxuICAgIFRoZSByZWxldmFudCBjb2RlIGlzIG1hcmtlZCB3aXRoIGEgY29tbWVudC5cbiovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDYWxlbmRhckJvZHkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5XScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtY2FsZW5kYXItYm9keScsXG4gICAgJ1tjbGFzcy5tYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktcmFuZ2VdJzogJ3JhbmdlJywgLy8gUkVMRVZBTlQgQ09ERSBGT1IgTkFUSVZFIElNUExFTUVOVEFUSU9OXG4gICAgJ3JvbGUnOiAnZ3JpZCcsXG4gICAgJ2F0dHIuYXJpYS1yZWFkb25seSc6ICd0cnVlJ1xuICB9LFxuICBleHBvcnRBczogJ21hdENhbGVuZGFyQm9keScsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0RGF0ZXJhbmdlQ2FsZW5kYXJCb2R5PEQ+IGV4dGVuZHMgTWF0Q2FsZW5kYXJCb2R5IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG5cdC8qIFJFTEVWQU5UIENPREUgRk9SIE5BVElWRSBJTVBMRU1FTlRBVElPTiAtIH4gMTMgTE9DICovXG5cdEBJbnB1dCgpIHJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSBhbGxJblJhbmdlOiBib29sZWFuO1xuXHRASW5wdXQoKSBzZWxlY3RlZFJhbmdlRW5kVmFsdWU6IG51bWJlcjtcblx0QElucHV0KCkgdmlldzogbnVtYmVyXG5cdEBJbnB1dCgpIGNyZWF0ZURhdGU6IGFueVxuXHRASW5wdXQoKSBzZWxlY3RlZDogRGF0ZSB8IG51bGxcblx0QElucHV0KCkgc2VsZWN0ZWRSYW5nZUVuZDogRGF0ZSB8IG51bGxcblx0QElucHV0KCkgc2V0SG92ZXJDZWxsczogQmVoYXZpb3JTdWJqZWN0PGFueT5cblx0QElucHV0KCkgY2xlYXJCb2R5OiBCZWhhdmlvclN1YmplY3Q8YW55PlxuXHRASW5wdXQoKSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD5cblx0QFZpZXdDaGlsZHJlbignUm93Jykgcm93c0VsbXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPlxuXG5cdGhvdmVyU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZXG5cdGNsZWFyQm9keVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSB0aGlzLnNldEhvdmVyQ2VsbHMuc3Vic2NyaWJlKGFzeW5jICh0bXBEYXRlOiBhbnkgfCBudWxsKSA9PiB7XG5cdFx0XHRpZighdG1wRGF0ZSB8fCAhdGhpcy5zZWxlY3RlZCB8fCB0aGlzLnNlbGVjdGVkUmFuZ2VFbmQgfHwgKHRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZFJhbmdlRW5kKSkgcmV0dXJuO1xuXHRcdFx0dGhpcy5fZG9Ib3ZlckNlbGxzKHRtcERhdGUpXG5cdFx0fSlcblxuXHRcdHRoaXMuY2xlYXJCb2R5U3Vic2NyaXB0aW9uID0gdGhpcy5jbGVhckJvZHkuc3Vic2NyaWJlKGNsZWFyID0+IHtcblx0XHRcdGlmKGNsZWFyKXtcblx0XHRcdFx0dGhpcy5fZG9Ib3ZlckNlbGxzKG51bGwsIGNsZWFyKVxuXHRcdFx0fVxuXHRcdH0pXG5cdH1cblxuXHRfY2VsbENsYXNzKGRhdGU6IG51bWJlcil7XG5cdFx0aWYoIXRoaXMuc2VsZWN0ZWQgfHwgIXRoaXMuc2VsZWN0ZWRSYW5nZUVuZCkgcmV0dXJuO1xuXG5cdFx0Y29uc3Qgc3RhcnREYXRlID0gdGhpcy5zZWxlY3RlZC5nZXRUaW1lKClcblx0XHRjb25zdCBlbmREYXRlID0gdGhpcy5zZWxlY3RlZFJhbmdlRW5kLmdldFRpbWUoKVxuXHRcdGNvbnN0IGNlbGxEYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRhdGUpLmdldFRpbWUoKVxuXHRcdFxuXHRcdHJldHVybiB7XG5cdFx0XHQnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJzogY2VsbERhdGUgPj0gc3RhcnREYXRlICYmIGNlbGxEYXRlIDw9IGVuZERhdGUgJiYgc3RhcnREYXRlICE9PSBlbmREYXRlLFxuXHRcdFx0J21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydCc6IGNlbGxEYXRlID09PSBzdGFydERhdGUgJiYgc3RhcnREYXRlICE9PSBlbmREYXRlLFxuXHRcdFx0J21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQnOiBjZWxsRGF0ZSA9PT0gZW5kRGF0ZSAmJiBzdGFydERhdGUgIT09IGVuZERhdGVcblx0XHR9XG5cdH1cblxuXHRfaW5SYW5nZShkYXRlOiBudW1iZXIpIHtcblx0XHQvLyBpZiAodGhpcy5yYW5nZSkge1xuXHRcdC8vIFx0aWYgKHRoaXMuYWxsSW5SYW5nZSkge1xuXHRcdC8vIFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvLyBcdH1cblxuXHRcdC8vIFx0aWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSAmJiAhdGhpcy5zZWxlY3RlZFJhbmdlRW5kVmFsdWUpIHtcblx0XHQvLyBcdFx0cmV0dXJuIGRhdGUgPj0gdGhpcy5zZWxlY3RlZFZhbHVlO1xuXHRcdC8vIFx0fVxuXHRcdC8vIFx0aWYgKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZFZhbHVlICYmICF0aGlzLnNlbGVjdGVkVmFsdWUpIHtcblx0XHQvLyBcdFx0cmV0dXJuIGRhdGUgPD0gdGhpcy5zZWxlY3RlZFJhbmdlRW5kVmFsdWU7XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gXHRyZXR1cm4gZGF0ZSA+PSB0aGlzLnNlbGVjdGVkVmFsdWUgJiYgZGF0ZSA8PSB0aGlzLnNlbGVjdGVkUmFuZ2VFbmRWYWx1ZTtcblx0XHQvLyB9XG5cdH1cblxuXHRfb25Ib3ZlckNlbGwodG1wRGF0ZTogbnVtYmVyKXtcblx0XHRpZih0aGlzLnNlbGVjdGVkUmFuZ2VFbmRWYWx1ZSkgcmV0dXJuO1xuXG5cdFx0dGhpcy5zZXRIb3ZlckNlbGxzLm5leHQodGhpcy5jcmVhdGVEYXRlKHRtcERhdGUpKVxuXHR9XG5cblx0X2RvSG92ZXJDZWxscyh0bXBEYXRlPzogYW55LCBjbGVhcj86IGJvb2xlYW4pe1xuXHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc2VsZWN0ZWQ/LmdldFRpbWUoKVxuXHRcdGNvbnN0IGVuZFRlbXBEYXRlID0gdG1wRGF0ZT8uZ2V0VGltZSgpXG5cdFx0dGhpcy5yb3dzLm1hcCgocm93LCByKSA9PiB7XG5cdFx0XHRjb25zdCByb3dFbG0gPSB0aGlzLnJvd3NFbG1zLnRvQXJyYXkoKVtyXVxuXHRcdFx0bGV0IGhhc0xhYmVsID0gZmFsc2Vcblx0XHRcdHJvdy5tYXAoKGNlbGwsIGMpID0+IHtcblx0XHRcdFx0bGV0IGNlbGxFbG0gPSByb3dFbG0ubmF0aXZlRWxlbWVudC5jZWxsc1toYXNMYWJlbCA/IGMgKyAxIDogY11cblx0XHRcdFx0aWYoY2VsbEVsbS5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1jYWxlbmRhci1ib2R5LWxhYmVsJykpe1xuXHRcdFx0XHRcdGhhc0xhYmVsID0gdHJ1ZVxuXHRcdFx0XHRcdGNlbGxFbG0gPSByb3dFbG0ubmF0aXZlRWxlbWVudC5jZWxsc1tjICsgMV1cblx0XHRcdFx0fVxuXHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5yZW1vdmUoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1pbi1yYW5nZScpXG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLWVuZCcpXG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0Jylcblx0XHRcdFx0aWYoY2xlYXIpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgaW5SYW5nZSA9IHRoaXMuX2luUmFuZ2VUZW1wKGNlbGwudmFsdWUsIHN0YXJ0RGF0ZSwgZW5kVGVtcERhdGUsIGNlbGxFbG0pXG5cdFx0XHR9KVxuXHRcdH0pXG5cdH1cblxuXHRfaW5SYW5nZVRlbXAoZGF0ZTogbnVtYmVyLCBzdGFydERhdGUsIGVuZFRlbXBEYXRlLCBjZWxsRWxtKSB7XG5cdFx0XG5cdFx0Y29uc3QgY2VsbERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoZGF0ZSkuZ2V0VGltZSgpXG5cblx0XHRpZihlbmRUZW1wRGF0ZSA+PSBzdGFydERhdGUpe1xuXHRcdFx0aWYoZW5kVGVtcERhdGUgIT09IHN0YXJ0RGF0ZSl7XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBzdGFydERhdGUpe1xuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydCcpXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoY2VsbERhdGUgPT09IGVuZFRlbXBEYXRlKXtcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1pbi1yYW5nZScpXG5cdFx0XHRcdFx0Y2VsbEVsbS5jbGFzc0xpc3QuYWRkKCdtYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktcmFuZ2UtZW5kJylcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoY2VsbERhdGUgPiBzdGFydERhdGUgJiYgY2VsbERhdGUgPCBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1lbHNle1xuXHRcdFx0aWYoZW5kVGVtcERhdGUgIT09IHN0YXJ0RGF0ZSl7XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBzdGFydERhdGUpe1xuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0XHRjZWxsRWxtLmNsYXNzTGlzdC5hZGQoJ21hdC1kYXRlcmFuZ2UtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQnKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGNlbGxEYXRlID09PSBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdFx0Y2VsbEVsbS5jbGFzc0xpc3QuYWRkKCdtYXQtZGF0ZXJhbmdlLWNhbGVuZGFyLWJvZHktaW4tcmFuZ2UnKVxuXHRcdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0Jylcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYoY2VsbERhdGUgPCBzdGFydERhdGUgJiYgY2VsbERhdGUgPiBlbmRUZW1wRGF0ZSl7XG5cdFx0XHRcdGNlbGxFbG0uY2xhc3NMaXN0LmFkZCgnbWF0LWRhdGVyYW5nZS1jYWxlbmRhci1ib2R5LWluLXJhbmdlJylcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblx0fVxuXG5cdG5nT25EZXN0cm95KCl7XG5cdFx0dGhpcy5ob3ZlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG5cdFx0dGhpcy5jbGVhckJvZHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuXHR9XG4gIFxufVxuIl19