UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

183 lines 24.1 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The added/edited code adds logic for handling range / non range mode. Additionaly, in range mode it will apply logic to mark the dates within the active month that are within the range. There are 3 range states for a month view, set by the combination of "_rangable" and "_allInRange": - Not rangable (single value datepicker OR active month not in range) - _rangable = False - Rangable but not all (active month is partially in range) - _rangable = True - All In Range (active month is in range, start/end dates before/after this month) - _rangable = True & _allInRange = True */ import { __awaiter, __decorate, __extends, __generator } from "tslib"; import { Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core'; import { MatMonthView } from '@angular/material/datepicker'; var MatDaterangeMonthView = /** @class */ (function (_super) { __extends(MatDaterangeMonthView, _super); function MatDaterangeMonthView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.selectedRangeEndChange = new EventEmitter(); _this._createDate = function (date) { var selectedYear = _this._dateAdapter.getYear(_this.activeDate); var selectedMonth = _this._dateAdapter.getMonth(_this.activeDate); return new Date(selectedYear, selectedMonth, date); }; return _this; } Object.defineProperty(MatDaterangeMonthView.prototype, "selectedRangeEnd", { get: function () { return this._selectedRangeEnd; }, set: function (value) { this._selectedRangeEnd = this._getValidDateOrNull(this._dateAdapter.deserialize(value)); this._selectedRangeEndDate = this._getDateInCurrentMonth(this._selectedRangeEnd); }, enumerable: true, configurable: true }); Object.defineProperty(MatDaterangeMonthView.prototype, "_allInRange", { get: function () { if (!this.range || !this.activeDate || !this.selectedRangeEnd || !this.selected) { return false; } else { var daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate); var startDate = this.createDate(1); var endDate = this.createDate(daysInMonth); return this._dateAdapter.compareDate(this.selected, startDate) < 0 && this._dateAdapter.compareDate(this.selectedRangeEnd, endDate) > 0; } }, enumerable: true, configurable: true }); Object.defineProperty(MatDaterangeMonthView.prototype, "_rangable", { get: function () { if (!this.range || !this._weeks) { return false; } else { var daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate); var startDate = this.createDate(1); var endDate = this.createDate(daysInMonth); if (this.selectedRangeEnd < startDate) { return false; } if (this.selected > endDate) { return false; } return true; } }, enumerable: true, configurable: true }); MatDaterangeMonthView.prototype._init = function () { this._selectedRangeEndDate = this._getDateInCurrentMonth(this.selectedRangeEnd); _super.prototype._init.call(this); }; MatDaterangeMonthView.prototype._dateSelected = function (date) { return __awaiter(this, void 0, void 0, function () { var selectedDate, year, month, swap; return __generator(this, function (_a) { if (!this.range) { _super.prototype._dateSelected.call(this, date); } else { if (!this.selected || this.selectedRangeEnd) { if (this._selectedRangeEnd) { this._dateSelectedRangeEnd(null); } _super.prototype._dateSelected.call(this, date); } else { if (date === null) { this._dateSelectedRangeEnd(null); } else { selectedDate = this.createDate(date); if (selectedDate < this.selected) { year = this._dateAdapter.getYear(this.selected); month = this._dateAdapter.getMonth(this.selected); swap = this._dateAdapter.getDate(this.selected); _super.prototype._dateSelected.call(this, date); this._dateSelectedRangeEnd(swap, year, month); } else { this._dateSelectedRangeEnd(date); } } } } return [2 /*return*/]; }); }); }; MatDaterangeMonthView.prototype._dateSelectedRangeEnd = function (date, year, month) { if (date === null) { this.selectedRangeEndChange.emit(null); } else if (this._selectedRangeEndDate != date) { var selectedDate = void 0; if (year && month) { selectedDate = this._dateAdapter.createDate(year, month, date); } else { selectedDate = this.createDate(date); } this.selectedRangeEndChange.emit(selectedDate); this._userSelection.emit(); } }; MatDaterangeMonthView.prototype.createDate = function (date) { var selectedYear = this._dateAdapter.getYear(this.activeDate); var selectedMonth = this._dateAdapter.getMonth(this.activeDate); return this._dateAdapter.createDate(selectedYear, selectedMonth, date); }; MatDaterangeMonthView.prototype.getSelectedDate = function () { if (!this.selected) return null; var selectedYear = this._dateAdapter.getYear(this.selected); var selectedMonth = this._dateAdapter.getMonth(this.selected); var selectedDate = this._dateAdapter.getDate(this.selected); return new Date(selectedYear, selectedMonth, selectedDate); }; MatDaterangeMonthView.prototype.getSelectedRangeEndDate = function () { if (!this.selectedRangeEnd) return null; var selectedYear = this._dateAdapter.getYear(this.selectedRangeEnd); var selectedMonth = this._dateAdapter.getMonth(this.selectedRangeEnd); var selectedDate = this._dateAdapter.getDate(this.selectedRangeEnd); return new Date(selectedYear, selectedMonth, selectedDate); }; __decorate([ Input() ], MatDaterangeMonthView.prototype, "range", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "view", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "setHoverCells", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "clearBody", void 0); __decorate([ Input() ], MatDaterangeMonthView.prototype, "selectedRangeEnd", null); __decorate([ Output() ], MatDaterangeMonthView.prototype, "selectedRangeEndChange", void 0); MatDaterangeMonthView = __decorate([ Component({ selector: 'mat-daterange-month-view', template: "<!-- \n RANGE: Most of the code is redundant and hera as inheritance boilerplate.\n \n The 3 attributes in the middle are the additional bindings to the template.\n They notify the body:\n - Are we in range mode ([range])\n - Are all the dates in range ([allInRange])\n this happens when the start date is before the current month and the end is after it.\n - The value marking the end of the range ([selectedRangeEndValue])\n\n ADDED LOC ~3\n -->\n\n<table class=\"mat-calendar-table\">\n <thead class=\"mat-calendar-table-header\">\n <tr><th *ngFor=\"let day of _weekdays\" [attr.aria-label]=\"day.long\">{{day.narrow}}</th></tr>\n <tr><th class=\"mat-calendar-table-header-divider\" colspan=\"7\" aria-hidden=\"true\"></th></tr>\n </thead>\n <tbody mat-daterange-calendar-body\n [view]=\"view\"\n [label]=\"_monthLabel\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate\"\n [selectedValue]=\"_selectedDate\"\n\n [selectedRangeEndValue]=\"_selectedRangeEndDate\"\n [allInRange]=\"_allInRange\"\n [range]=\"_rangable\"\n [createDate]=\"_createDate\"\n [dateAdapter]=\"_dateAdapter\"\n [selected]=\"getSelectedDate()\"\n [selectedRangeEnd]=\"getSelectedRangeEndDate()\"\n [setHoverCells]=\"setHoverCells\"\n [clearBody]=\"clearBody\"\n [labelMinRequiredCells]=\"3\"\n [activeCell]=\"_dateAdapter.getDate(activeDate) - 1\"\n (selectedValueChange)=\"_dateSelected($event)\" \n (keydown)=\"_handleCalendarBodyKeydown($event)\">\n </tbody>\n</table>\n", exportAs: 'matMonthView', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush }) ], MatDaterangeMonthView); return MatDaterangeMonthView; }(MatMonthView)); export { MatDaterangeMonthView }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL21vbnRoLXZpZXcvbW9udGgtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztFQVNFOztBQUdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBVzVEO0lBQThDLHlDQUFlO0lBQTdEO1FBQUEscUVBbUlDO1FBL0VtQiw0QkFBc0IsR0FBb0IsSUFBSSxZQUFZLEVBQUssQ0FBQztRQTBEbkYsaUJBQVcsR0FBRyxVQUFDLElBQVk7WUFDMUIsSUFBTSxZQUFZLEdBQUcsS0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLElBQU0sYUFBYSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFBOztJQWlCRixDQUFDO0lBMUhTLHNCQUFJLG1EQUFnQjthQUFwQjtZQUNSLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQy9CLENBQUM7YUFDRCxVQUFxQixLQUFlO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBVSxJQUFLLENBQUMsbUJBQW1CLENBQVEsSUFBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4RyxJQUFJLENBQUMscUJBQXFCLEdBQVUsSUFBSyxDQUFDLHNCQUFzQixDQUFRLElB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QUMsQ0FBQztJQUM1RCxDQUFDO0lBOUhRO1FBQVIsS0FBSyxFQUFFO3dEQUFnQjtJQUNmO1FBQVIsS0FBSyxFQUFFO3VEQUFhO0lBQ1o7UUFBUixLQUFLLEVBQUU7Z0VBQW9DO0lBQ25DO1FBQVIsS0FBSyxFQUFFOzREQUFnQztJQUUvQjtRQUFSLEtBQUssRUFBRTtpRUFFUDtJQXlDUztRQUFULE1BQU0sRUFBRTt5RUFBMEU7SUFwRHZFLHFCQUFxQjtRQVJqQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLG9uREFBMEM7WUFDMUMsUUFBUSxFQUFFLGNBQWM7WUFDeEIsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7WUFDckMsbUJBQW1CLEVBQUUsS0FBSztZQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtTQUNoRCxDQUFDO09BQ1cscUJBQXFCLENBbUlqQztJQUFELDRCQUFDO0NBQUEsQUFuSUQsQ0FBOEMsWUFBWSxHQW1JekQ7U0FuSVkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBSQU5HRTogTW9zdCBvZiB0aGUgY29kZSBpcyByZWR1bmRhbnQgYW5kIGhlcmEgYXMgaW5oZXJpdGFuY2UgYm9pbGVycGxhdGUuXG4gICAgVGhlIGFkZGVkL2VkaXRlZCBjb2RlIGFkZHMgbG9naWMgZm9yIGhhbmRsaW5nIHJhbmdlIC8gbm9uIHJhbmdlIG1vZGUuXG4gICAgQWRkaXRpb25hbHksIGluIHJhbmdlIG1vZGUgaXQgd2lsbCBhcHBseSBsb2dpYyB0byBtYXJrIHRoZSBkYXRlcyB3aXRoaW4gdGhlIGFjdGl2ZSBtb250aFxuICAgIHRoYXQgYXJlIHdpdGhpbiB0aGUgcmFuZ2UuXG4gICAgVGhlcmUgYXJlIDMgcmFuZ2Ugc3RhdGVzIGZvciBhIG1vbnRoIHZpZXcsIHNldCBieSB0aGUgY29tYmluYXRpb24gb2YgXCJfcmFuZ2FibGVcIiBhbmQgXCJfYWxsSW5SYW5nZVwiOlxuICAgICAgLSBOb3QgcmFuZ2FibGUgKHNpbmdsZSB2YWx1ZSBkYXRlcGlja2VyIE9SIGFjdGl2ZSBtb250aCBub3QgaW4gcmFuZ2UpIC0gX3JhbmdhYmxlID0gRmFsc2VcbiAgICAgIC0gUmFuZ2FibGUgYnV0IG5vdCBhbGwgKGFjdGl2ZSBtb250aCBpcyBwYXJ0aWFsbHkgaW4gcmFuZ2UpIC0gX3JhbmdhYmxlID0gVHJ1ZVxuICAgICAgLSBBbGwgSW4gUmFuZ2UgKGFjdGl2ZSBtb250aCBpcyBpbiByYW5nZSwgc3RhcnQvZW5kIGRhdGVzIGJlZm9yZS9hZnRlciB0aGlzIG1vbnRoKSAtIF9yYW5nYWJsZSA9IFRydWUgJiBfYWxsSW5SYW5nZSA9IFRydWVcbiovXG5cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBNYXRNb250aFZpZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZGF0ZXJhbmdlLW1vbnRoLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9udGgtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIGV4cG9ydEFzOiAnbWF0TW9udGhWaWV3JyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlcmFuZ2VNb250aFZpZXc8RD4gZXh0ZW5kcyBNYXRNb250aFZpZXc8RD4ge1xuXG5cdF9zZWxlY3RlZFJhbmdlRW5kRGF0ZTogbnVtYmVyIHwgbnVsbDtcblxuXHRASW5wdXQoKSByYW5nZTogYm9vbGVhbjtcblx0QElucHV0KCkgdmlldzogbnVtYmVyXG5cdEBJbnB1dCgpIHNldEhvdmVyQ2VsbHM6IEJlaGF2aW9yU3ViamVjdDxhbnk+XG5cdEBJbnB1dCgpIGNsZWFyQm9keTogQmVoYXZpb3JTdWJqZWN0PGFueT5cblxuXHRASW5wdXQoKSBnZXQgc2VsZWN0ZWRSYW5nZUVuZCgpOiBEIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQ7XG5cdH1cblx0c2V0IHNlbGVjdGVkUmFuZ2VFbmQodmFsdWU6IEQgfCBudWxsKSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZUVuZCA9ICg8YW55PiB0aGlzKS5fZ2V0VmFsaWREYXRlT3JOdWxsKCg8YW55PiB0aGlzKS5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kRGF0ZSA9ICg8YW55PiB0aGlzKS5fZ2V0RGF0ZUluQ3VycmVudE1vbnRoKCg8YW55PiB0aGlzKS5fc2VsZWN0ZWRSYW5nZUVuZCk7XG5cdH1cblxuXHRnZXQgX2FsbEluUmFuZ2UoKTogYm9vbGVhbiB7XG5cdFx0aWYgKCF0aGlzLnJhbmdlIHx8ICF0aGlzLmFjdGl2ZURhdGUgfHwgIXRoaXMuc2VsZWN0ZWRSYW5nZUVuZCB8fCAhdGhpcy5zZWxlY3RlZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0XHRjb25zdCBzdGFydERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoMSk7XG5cdFx0XHRjb25zdCBlbmREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRheXNJbk1vbnRoKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuc2VsZWN0ZWQsIHN0YXJ0RGF0ZSkgPCAwICYmXG5cdFx0XHRcdHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCwgZW5kRGF0ZSkgPiAwO1xuXHRcdH1cblx0fVxuXG5cdGdldCBfcmFuZ2FibGUoKTogYm9vbGVhbiB7XG5cdFx0aWYgKCF0aGlzLnJhbmdlIHx8ICF0aGlzLl93ZWVrcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMuYWN0aXZlRGF0ZSk7XG5cdFx0XHRjb25zdCBzdGFydERhdGUgPSB0aGlzLmNyZWF0ZURhdGUoMSk7XG5cdFx0XHRjb25zdCBlbmREYXRlID0gdGhpcy5jcmVhdGVEYXRlKGRheXNJbk1vbnRoKTtcblxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCA8IHN0YXJ0RGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkID4gZW5kRGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX3NlbGVjdGVkUmFuZ2VFbmQ6IEQgfCBudWxsO1xuXG5cdEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZFJhbmdlRW5kQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RD4gPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cblx0X2luaXQoKSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRSYW5nZUVuZERhdGUgPSAoPGFueT4gdGhpcykuX2dldERhdGVJbkN1cnJlbnRNb250aCh0aGlzLnNlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdHN1cGVyLl9pbml0KCk7XG5cdH1cblxuXHRhc3luYyBfZGF0ZVNlbGVjdGVkKGRhdGU6IG51bWJlcikge1xuXHRcdGlmICggIXRoaXMucmFuZ2UgKSB7XG5cdFx0XHRzdXBlci5fZGF0ZVNlbGVjdGVkKGRhdGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoICF0aGlzLnNlbGVjdGVkIHx8IHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCApIHtcblx0XHRcdFx0aWYgKCB0aGlzLl9zZWxlY3RlZFJhbmdlRW5kICkge1xuXHRcdFx0XHRcdHRoaXMuX2RhdGVTZWxlY3RlZFJhbmdlRW5kKG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN1cGVyLl9kYXRlU2VsZWN0ZWQoZGF0ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoZGF0ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHRoaXMuX2RhdGVTZWxlY3RlZFJhbmdlRW5kKG51bGwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZShkYXRlKTtcblx0XHRcdFx0XHRpZiAoc2VsZWN0ZWREYXRlIDwgdGhpcy5zZWxlY3RlZCkge1xuXHRcdFx0XHRcdFx0Ly8gY29uc3Qgc3dhcCA9IHRoaXMuX3NlbGVjdGVkRGF0ZTtcblx0XHRcdFx0XHRcdGNvbnN0IHllYXIgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkKTtcblx0XHRcdFx0XHRcdGNvbnN0IHN3YXAgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuc2VsZWN0ZWQpO1xuXHRcdFx0XHRcdFx0c3VwZXIuX2RhdGVTZWxlY3RlZChkYXRlKTtcblx0XHRcdFx0XHRcdHRoaXMuX2RhdGVTZWxlY3RlZFJhbmdlRW5kKHN3YXAsIHllYXIsIG1vbnRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5fZGF0ZVNlbGVjdGVkUmFuZ2VFbmQoZGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfZGF0ZVNlbGVjdGVkUmFuZ2VFbmQoZGF0ZTogbnVtYmVyIHwgbnVsbCwgeWVhcj8sIG1vbnRoPykge1xuXHRcdGlmIChkYXRlID09PSBudWxsKSB7XG5cdFx0XHR0aGlzLnNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2UuZW1pdChudWxsKTtcblx0XHR9IGVsc2UgaWYgKCB0aGlzLl9zZWxlY3RlZFJhbmdlRW5kRGF0ZSAhPSBkYXRlICkge1xuXHRcdFx0bGV0IHNlbGVjdGVkRGF0ZVxuXHRcdFx0aWYoeWVhciAmJiBtb250aCl7XG5cdFx0XHRcdHNlbGVjdGVkRGF0ZSA9IHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRhdGUpO1xuXHRcdFx0fWVsc2V7XG5cdFx0XHRcdHNlbGVjdGVkRGF0ZSA9IHRoaXMuY3JlYXRlRGF0ZShkYXRlKVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHR0aGlzLnNlbGVjdGVkUmFuZ2VFbmRDaGFuZ2UuZW1pdChzZWxlY3RlZERhdGUpO1xuXHRcdFx0dGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVEYXRlKGRhdGU6IG51bWJlcik6IEQge1xuXHRcdGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKTtcblx0XHRyZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShzZWxlY3RlZFllYXIsIHNlbGVjdGVkTW9udGgsIGRhdGUpO1xuXHR9XG5cblx0X2NyZWF0ZURhdGUgPSAoZGF0ZTogbnVtYmVyKTogRGF0ZSA9PiB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdGNvbnN0IHNlbGVjdGVkTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpO1xuXHRcdHJldHVybiBuZXcgRGF0ZShzZWxlY3RlZFllYXIsIHNlbGVjdGVkTW9udGgsIGRhdGUpO1xuXHR9XG5cblx0Z2V0U2VsZWN0ZWREYXRlKCl7XG5cdFx0aWYoIXRoaXMuc2VsZWN0ZWQpIHJldHVybiBudWxsXG5cdFx0Y29uc3Qgc2VsZWN0ZWRZZWFyID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLnNlbGVjdGVkKTtcblx0XHRjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5zZWxlY3RlZCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnNlbGVjdGVkKTtcblx0XHRyZXR1cm4gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCBzZWxlY3RlZE1vbnRoLCBzZWxlY3RlZERhdGUpO1xuXHR9XG5cblx0Z2V0U2VsZWN0ZWRSYW5nZUVuZERhdGUoKXtcblx0XHRpZighdGhpcy5zZWxlY3RlZFJhbmdlRW5kKSByZXR1cm4gbnVsbFxuXHRcdGNvbnN0IHNlbGVjdGVkWWVhciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZFJhbmdlRW5kKTtcblx0XHRjb25zdCBzZWxlY3RlZE1vbnRoID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5zZWxlY3RlZFJhbmdlRW5kKTtcblx0XHRjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuc2VsZWN0ZWRSYW5nZUVuZCk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHNlbGVjdGVkWWVhciwgc2VsZWN0ZWRNb250aCwgc2VsZWN0ZWREYXRlKTtcblx0fVxufVxuXG4iXX0=