UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

136 lines 20.8 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The relevant code is marked with a comment. */ import { __decorate, __extends } from "tslib"; import { ChangeDetectionStrategy, Component, ViewEncapsulation, ViewChild, EventEmitter, ViewChildren } from '@angular/core'; import { MatDatepickerContent, matDatepickerAnimations } from '@angular/material/datepicker'; import { MatDaterangeCalendar } from '../calendar/calendar.component'; import { BehaviorSubject } from 'rxjs'; var MatDaterangepickerContent = /** @class */ (function (_super) { __extends(MatDaterangepickerContent, _super); function MatDaterangepickerContent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this._onApplyRange = new EventEmitter(); _this.setHoverCells = new BehaviorSubject(null); _this.clearBody = new BehaviorSubject(null); return _this; } Object.defineProperty(MatDaterangepickerContent.prototype, "drDatepicker", { get: function () { return this.datepicker; }, enumerable: true, configurable: true }); MatDaterangepickerContent.prototype.ngOnInit = function () { }; MatDaterangepickerContent.prototype.ngAfterViewInit = function () { }; // THIS IS THE ONLY ADDITION MatDaterangepickerContent.prototype.onUserSelection = function (view) { this.drDatepicker._userSelection(); }; MatDaterangepickerContent.prototype.applyRange = function () { if (this.drDatepicker.applyButton) { this.drDatepicker.applyRange(); } }; MatDaterangepickerContent.prototype.clearRange = function () { this.drDatepicker.clearRange(); this.clearBody.next(true); this.datepicker._selected = null; this.drDatepicker._selectedRangeEnd = null; }; MatDaterangepickerContent.prototype.setCustomRange = function (range) { if (!range.startDate || !range.endDate) return; this.datepicker._selected = range.startDate; this.drDatepicker._selectedRangeEnd = range.endDate; this.datepicker._selectedChanged.next(range.startDate); this.drDatepicker._selectedChangedRangeEnd.next(range.endDate); this.setActiveDate(range.startDate, range.endDate); }; MatDaterangepickerContent.prototype.isSameRange = function (range) { if (!this.datepicker._selected || !this.drDatepicker._selectedRangeEnd || !range.startDate || !range.endDate) return; return this.drDatepicker._drDateAdapter.compareDate(range.startDate, this.datepicker._selected) == 0 && this.drDatepicker._drDateAdapter.compareDate(range.endDate, this.drDatepicker._selectedRangeEnd) == 0; }; MatDaterangepickerContent.prototype.isSomeRange = function () { var _this = this; if (!this.datepicker._selected || !this.drDatepicker._selectedRangeEnd) return false; return this.drDatepicker.customRanges.some(function (range) { return _this.isSameRange(range); }); }; MatDaterangepickerContent.prototype.getWidthDateRangePicker = function () { if (this.drDatepicker.dualView) { if (this.drDatepicker.showCustomRanges && this.drDatepicker.customRanges.length) { return '655px'; } return '600px'; } if (this.drDatepicker.showCustomRanges && this.drDatepicker.customRanges.length) { return '450px'; } }; MatDaterangepickerContent.prototype.setActiveDate = function (from, to) { var fromMonth = this.drDatepicker._drDateAdapter.getMonth(from); var toMonth = this.drDatepicker._drDateAdapter.getMonth(to); var toYear = this.drDatepicker._drDateAdapter.getYear(to); var toDate = this.drDatepicker._drDateAdapter.getDate(to); var y, m; if (toMonth === 11) { m = 0; y = toYear + 1; } else { m = toMonth + 1, y = toYear; } var endDate = this.drDatepicker._drDateAdapter.createDate(y, m, 1); this.calendars.forEach(function (calendar, i) { if (i === 0) { calendar.activeDate = from; } else { if (fromMonth !== toMonth) { // if start month & end month are differents calendar.activeDate = to; } else { calendar.activeDate = endDate; } } }); }; __decorate([ ViewChild(MatDaterangeCalendar, { static: true }) ], MatDaterangepickerContent.prototype, "_calendar", void 0); __decorate([ ViewChildren(MatDaterangeCalendar) ], MatDaterangepickerContent.prototype, "calendars", void 0); MatDaterangepickerContent = __decorate([ Component({ selector: 'mat-daterangepicker-content', template: "<div>\n\t<!-- \n\t\tRANGE: Most of the code is redundant and hera as inheritance boilerplate.\n\t\tThe relevant code is marked with a comment.\n\t\tADDED LOC ~3\n\t-->\n\t<div class=\"mat-daterange-calendars\" [ngStyle]=\"{'width': getWidthDateRangePicker()}\">\n\t\t<div *ngIf=\"drDatepicker.showCustomRanges && drDatepicker.customRanges.length\" class=\"mat-daterange-custom-ranges\">\n\t\t\t<button *ngFor=\"let range of drDatepicker.customRanges\" mat-flat-button [color]=\"isSameRange(range) ? 'primary' : ''\" (click)=\"setCustomRange(range)\" class=\"mat-daterange-calendar-button-action\">{{range.name}}</button>\n\t\t\t<button mat-flat-button [color]=\"!isSomeRange() ? 'primary' : ''\" class=\"mat-daterange-custom-range mat-daterange-calendar-button-action\">Custom Range</button>\n\t\t</div>\n\t\t<mat-daterange-calendar *ngFor=\"let view of drDatepicker._getViews()\" #Calendar cdkTrapFocus\n\t\t\t\t\t[id]=\"datepicker.id\"\n\t\t\t\t\t[ngClass]=\"datepicker.panelClass\"\n\t\t\t\t\tclass=\"mat-daterange-calendar\"\n\t\t\t\t\t[view]=\"view\"\n\t\t\t\t\t[setHoverCells]=\"setHoverCells\"\n\t\t\t\t\t[clearBody]=\"clearBody\"\n\t\t\t\t\t\n\t\t\t\t\t[startAt]=\"datepicker.startAt\"\n\t\t\t\t\t[startView]=\"datepicker.startView\"\n\t\t\t\t\t[minDate]=\"datepicker._minDate\"\n\t\t\t\t\t[maxDate]=\"datepicker._maxDate\"\n\t\t\t\t\t[dateFilter]=\"datepicker._dateFilter\"\n\t\t\t\t\t[headerComponent]=\"datepicker.calendarHeaderComponent\"\n\t\t\t\t\t[selected]=\"datepicker._selected\"\n\t\t\t\t\t[@fadeInCalendar]=\"'enter'\"\n\t\t\t\t\t(selectedChange)=\"datepicker.select($event)\"\n\t\t\t\t\t(yearSelected)=\"datepicker._selectYear($event)\"\n\t\t\t\t\t(monthSelected)=\"datepicker._selectMonth($event)\"\n\n\t\t\t\t\t[range]=\"!!drDatepicker._datepickerInputRangeEnd\"\n\t\t\t\t\t[selectedRangeEnd]=\"drDatepicker._selectedRangeEnd\"\n\t\t\t\t\t(selectedRangeEndChange)=\"drDatepicker.selectRangeEnd($event)\"\n\t\t\t\t\t(_userSelection)=\"onUserSelection(view)\">\n\t\t\t\t\t<!-- \n\t\t\t\t\t\t\tTHE 3 LINES ABOVE ARE THE ONLY ADDITION\n\t\t\t\t\t\t\tThe _userSelection will pass logic handling to the datepicker component\n\t\t\t\t\t\t\tinstead of closing the dialog/popup, this is because range logic is handled there.\n\n\t\t\t\t\t\t\tThe other attributes are passing on the additional date (Range end) bindings\n\t\t\t\t\t\t\tand a flag that sets range on/off based on the input range.\n\t\t\t\t\t\t\tThis means that an *ngIf on that input by the user can toggle range on/off without\n\t\t\t\t\t\t\ta special flag.\n\t\t\t\t\t-->\n\n\t\t</mat-daterange-calendar>\n\t</div>\n\n\t<div *ngIf=\"drDatepicker.applyButton\" class=\"mat-daterange-calendar-actions\">\n\t\t<button mat-button color=\"primary\" (click)=\"clearRange()\">Clear</button>&nbsp;&nbsp;\n\t\t<button mat-flat-button color=\"primary\" (click)=\"applyRange()\">Apply</button>\n\t</div>\n</div>", host: { 'class': 'mat-datepicker-content', '[@transformPanel]': '"enter"', '[class.mat-datepicker-content-touch]': 'datepicker.touchUi', '[class.mat-datepicker-content-above]': '_isAbove', }, animations: [ matDatepickerAnimations.transformPanel, matDatepickerAnimations.fadeInCalendar, ], exportAs: 'matDaterangepickerContent', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['color'], styles: [".mat-daterange-calendar-body-in-range{background-color:rgba(63,81,181,.15)}.mat-daterange-calendar-body-in-range.mat-daterange-calendar-body-range-start{border-radius:100% 0 0 100%}.mat-daterange-calendar-body-in-range.mat-daterange-calendar-body-range-end{border-radius:0 100% 100% 0}.mat-daterange-calendars{display:flex}.mat-daterange-calendar{flex-grow:1}.mat-daterange-calendar-actions{padding:15px;text-align:right}.mat-daterange-custom-ranges{display:flex;flex-flow:column;width:130px;padding:8px}.mat-daterange-custom-ranges button{text-align:left;font-size:12px;line-height:32px;font-weight:400!important}.mat-daterange-calendar-button-action{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}"] }) ], MatDaterangepickerContent); return MatDaterangepickerContent; }(MatDatepickerContent)); export { MatDaterangepickerContent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdC1kYXRlcmFuZ2VwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvZGF0ZXBpY2tlci1jb250ZW50L2RhdGVwaWNrZXItY29udGVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFOztBQUVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxZQUFZLEVBQWdELE1BQU0sZUFBZSxDQUFDO0FBQ25MLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFzQnZDO0lBQWtELDZDQUF1QjtJQUF6RTtRQUFBLHFFQWlHQztRQS9GQSxtQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7UUFLbEMsbUJBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQTtRQUM5QyxlQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUE7O0lBeUYvQyxDQUFDO0lBOUZBLHNCQUFJLG1EQUFZO2FBQWhCO1lBQ0MsT0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBT0QsNENBQVEsR0FBUjtJQUNBLENBQUM7SUFFRCxtREFBZSxHQUFmO0lBQ0EsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixtREFBZSxHQUFmLFVBQWdCLElBQUk7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsOENBQVUsR0FBVjtRQUNDLElBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUM7WUFDaEMsSUFB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QztnRUFBOEM7SUFWckUseUJBQXlCO1FBcEJyQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsNkJBQTZCO1lBQ3ZDLDQwRkFBa0Q7WUFFbEQsSUFBSSxFQUFFO2dCQUNKLE9BQU8sRUFBRSx3QkFBd0I7Z0JBQ2pDLG1CQUFtQixFQUFFLFNBQVM7Z0JBQzlCLHNDQUFzQyxFQUFFLG9CQUFvQjtnQkFDNUQsc0NBQXNDLEVBQUUsVUFBVTthQUVuRDtZQUNELFVBQVUsRUFBRTtnQkFDVix1QkFBdUIsQ0FBQyxjQUFjO2dCQUN0Qyx1QkFBdUIsQ0FBQyxjQUFjO2FBQ3ZDO1lBQ0QsUUFBUSxFQUFFLDJCQUEyQjtZQUNyQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtZQUNyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7O1NBQ2xCLENBQUM7T0FDVyx5QkFBeUIsQ0FpR3JDO0lBQUQsZ0NBQUM7Q0FBQSxBQWpHRCxDQUFrRCxvQkFBb0IsR0FpR3JFO1NBakdZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgUkFOR0U6IE1vc3Qgb2YgdGhlIGNvZGUgaXMgcmVkdW5kYW50IGFuZCBoZXJhIGFzIGluaGVyaXRhbmNlIGJvaWxlcnBsYXRlLlxuICAgIFRoZSByZWxldmFudCBjb2RlIGlzIG1hcmtlZCB3aXRoIGEgY29tbWVudC5cbiovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBWaWV3Q2hpbGQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyQ29udGVudCwgTWF0Q2FsZW5kYXIsIG1hdERhdGVwaWNrZXJBbmltYXRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5cbmltcG9ydCB7IE1hdERhdGVyYW5nZXBpY2tlciB9IGZyb20gJy4uL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGF0ZXJhbmdlQ2FsZW5kYXIgfSBmcm9tICcuLi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlcmFuZ2VwaWNrZXItY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRlcGlja2VyLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdtYXQtZGF0ZXBpY2tlci1jb250ZW50JyxcbiAgICAnW0B0cmFuc2Zvcm1QYW5lbF0nOiAnXCJlbnRlclwiJyxcbiAgICAnW2NsYXNzLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hdJzogJ2RhdGVwaWNrZXIudG91Y2hVaScsXG4gICAgJ1tjbGFzcy5tYXQtZGF0ZXBpY2tlci1jb250ZW50LWFib3ZlXSc6ICdfaXNBYm92ZScsXG4gICAgLy8gJ1tjbGFzcy5tYXQtZGF0ZXBpY2tlci1yYW5nZV0nOiAnZGF0ZXBpY2tlci5fcmFuZ2UnXG4gIH0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBtYXREYXRlcGlja2VyQW5pbWF0aW9ucy50cmFuc2Zvcm1QYW5lbCxcbiAgICBtYXREYXRlcGlja2VyQW5pbWF0aW9ucy5mYWRlSW5DYWxlbmRhcixcbiAgXSxcbiAgZXhwb3J0QXM6ICdtYXREYXRlcmFuZ2VwaWNrZXJDb250ZW50JyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGlucHV0czogWydjb2xvciddXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVyYW5nZXBpY2tlckNvbnRlbnQ8RD4gZXh0ZW5kcyBNYXREYXRlcGlja2VyQ29udGVudDxEPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBWaWV3Q2hpbGQoTWF0RGF0ZXJhbmdlQ2FsZW5kYXIsIHsgc3RhdGljOiB0cnVlIH0pIF9jYWxlbmRhcjogTWF0Q2FsZW5kYXI8RD47XG5cdF9vbkFwcGx5UmFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKClcblx0Z2V0IGRyRGF0ZXBpY2tlcigpIDogTWF0RGF0ZXJhbmdlcGlja2VyPEQ+IHtcblx0XHRyZXR1cm4gPGFueT4gdGhpcy5kYXRlcGlja2VyO1xuXHR9XG5cblx0c2V0SG92ZXJDZWxscyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKVxuXHRjbGVhckJvZHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KG51bGwpXG5cdFxuXHRAVmlld0NoaWxkcmVuKE1hdERhdGVyYW5nZUNhbGVuZGFyKSBjYWxlbmRhcnM6IFF1ZXJ5TGlzdDxNYXREYXRlcmFuZ2VDYWxlbmRhcjxEPj5cblxuXHRuZ09uSW5pdCgpe1xuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCl7XG5cdH1cblxuXHQvLyBUSElTIElTIFRIRSBPTkxZIEFERElUSU9OXG5cdG9uVXNlclNlbGVjdGlvbih2aWV3KTogdm9pZCB7XG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuX3VzZXJTZWxlY3Rpb24oKTtcblx0fVxuXG5cdGFwcGx5UmFuZ2UoKTogdm9pZCB7XG5cdFx0aWYodGhpcy5kckRhdGVwaWNrZXIuYXBwbHlCdXR0b24pe1xuXHRcdFx0dGhpcy5kckRhdGVwaWNrZXIuYXBwbHlSYW5nZSgpO1xuXHRcdH1cblx0fVxuXG5cdGNsZWFyUmFuZ2UoKXtcblx0XHR0aGlzLmRyRGF0ZXBpY2tlci5jbGVhclJhbmdlKCk7XG5cdFx0dGhpcy5jbGVhckJvZHkubmV4dCh0cnVlKVxuXHRcdHRoaXMuZGF0ZXBpY2tlci5fc2VsZWN0ZWQgPSBudWxsXG5cdFx0dGhpcy5kckRhdGVwaWNrZXIuX3NlbGVjdGVkUmFuZ2VFbmQgPSBudWxsXG5cdH1cblxuXHRzZXRDdXN0b21SYW5nZShyYW5nZSl7XG5cdFx0aWYoIXJhbmdlLnN0YXJ0RGF0ZSB8fCAhcmFuZ2UuZW5kRGF0ZSkgcmV0dXJuO1xuXHRcdHRoaXMuZGF0ZXBpY2tlci5fc2VsZWN0ZWQgPSByYW5nZS5zdGFydERhdGVcblx0XHR0aGlzLmRyRGF0ZXBpY2tlci5fc2VsZWN0ZWRSYW5nZUVuZCA9IHJhbmdlLmVuZERhdGVcblx0XHR0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkQ2hhbmdlZC5uZXh0KHJhbmdlLnN0YXJ0RGF0ZSlcblx0XHR0aGlzLmRyRGF0ZXBpY2tlci5fc2VsZWN0ZWRDaGFuZ2VkUmFuZ2VFbmQubmV4dChyYW5nZS5lbmREYXRlKVxuXHRcdHRoaXMuc2V0QWN0aXZlRGF0ZShyYW5nZS5zdGFydERhdGUsIHJhbmdlLmVuZERhdGUpXG5cdH1cblxuXHRpc1NhbWVSYW5nZShyYW5nZSl7XG5cdFx0aWYoIXRoaXMuZGF0ZXBpY2tlci5fc2VsZWN0ZWQgfHwgIXRoaXMuZHJEYXRlcGlja2VyLl9zZWxlY3RlZFJhbmdlRW5kIHx8ICFyYW5nZS5zdGFydERhdGUgfHwgIXJhbmdlLmVuZERhdGUpIHJldHVybjtcblx0XHRyZXR1cm4gdGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUocmFuZ2Uuc3RhcnREYXRlLCB0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkKSA9PSAwICAmJiBcblx0XHR0aGlzLmRyRGF0ZXBpY2tlci5fZHJEYXRlQWRhcHRlci5jb21wYXJlRGF0ZShyYW5nZS5lbmREYXRlLCB0aGlzLmRyRGF0ZXBpY2tlci5fc2VsZWN0ZWRSYW5nZUVuZCkgPT0gMFxuXHR9XG5cblx0aXNTb21lUmFuZ2UoKXtcblx0XHRpZighdGhpcy5kYXRlcGlja2VyLl9zZWxlY3RlZCB8fCAhdGhpcy5kckRhdGVwaWNrZXIuX3NlbGVjdGVkUmFuZ2VFbmQpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gdGhpcy5kckRhdGVwaWNrZXIuY3VzdG9tUmFuZ2VzLnNvbWUocmFuZ2UgPT4gdGhpcy5pc1NhbWVSYW5nZShyYW5nZSkpXG5cdH1cblxuXHRnZXRXaWR0aERhdGVSYW5nZVBpY2tlcigpe1xuXHRcdGlmKHRoaXMuZHJEYXRlcGlja2VyLmR1YWxWaWV3KXtcblx0XHRcdGlmKHRoaXMuZHJEYXRlcGlja2VyLnNob3dDdXN0b21SYW5nZXMgJiYgdGhpcy5kckRhdGVwaWNrZXIuY3VzdG9tUmFuZ2VzLmxlbmd0aCl7XG5cdFx0XHRcdHJldHVybiAnNjU1cHgnXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJzYwMHB4J1xuXHRcdH1cblx0XHRpZih0aGlzLmRyRGF0ZXBpY2tlci5zaG93Q3VzdG9tUmFuZ2VzICYmIHRoaXMuZHJEYXRlcGlja2VyLmN1c3RvbVJhbmdlcy5sZW5ndGgpe1xuXHRcdFx0cmV0dXJuICc0NTBweCdcblx0XHR9XG5cdH1cblxuXHRzZXRBY3RpdmVEYXRlKGZyb206IEQsIHRvOiBEKXtcblx0XHRjb25zdCBmcm9tTW9udGggPSB0aGlzLmRyRGF0ZXBpY2tlci5fZHJEYXRlQWRhcHRlci5nZXRNb250aChmcm9tKVxuXHRcdGNvbnN0IHRvTW9udGggPSB0aGlzLmRyRGF0ZXBpY2tlci5fZHJEYXRlQWRhcHRlci5nZXRNb250aCh0bylcblxuXHRcdGNvbnN0IHRvWWVhciA9IHRoaXMuZHJEYXRlcGlja2VyLl9kckRhdGVBZGFwdGVyLmdldFllYXIodG8pXG5cdFx0Y29uc3QgdG9EYXRlID0gdGhpcy5kckRhdGVwaWNrZXIuX2RyRGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh0bylcblxuXHRcdGxldCB5LCBtXG5cdFx0aWYodG9Nb250aCA9PT0gMTEpe1xuXHRcdFx0bSA9IDBcblx0XHRcdHkgPSB0b1llYXIgKyAxXG5cdFx0fWVsc2V7XG5cdFx0XHRtID0gdG9Nb250aCArIDEsXG5cdFx0XHR5ID0gdG9ZZWFyXG5cdFx0fVxuXHRcdGNvbnN0IGVuZERhdGUgPSB0aGlzLmRyRGF0ZXBpY2tlci5fZHJEYXRlQWRhcHRlci5jcmVhdGVEYXRlKHksIG0sIDEpXG5cblx0XHR0aGlzLmNhbGVuZGFycy5mb3JFYWNoKChjYWxlbmRhciwgaSkgPT4ge1xuXHRcdFx0aWYoaSA9PT0gMCl7XG5cdFx0XHRcdGNhbGVuZGFyLmFjdGl2ZURhdGUgPSBmcm9tXG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0aWYoZnJvbU1vbnRoICE9PSB0b01vbnRoKXsgLy8gaWYgc3RhcnQgbW9udGggJiBlbmQgbW9udGggYXJlIGRpZmZlcmVudHNcblx0XHRcdFx0XHRjYWxlbmRhci5hY3RpdmVEYXRlID0gdG9cblx0XHRcdFx0fWVsc2V7XG5cdFx0XHRcdFx0Y2FsZW5kYXIuYWN0aXZlRGF0ZSA9IGVuZERhdGVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pXG5cdH1cbn1cbiJdfQ==