UNPKG

mat-daterangepicker

Version:

Angular material date picker extension to support range selection.

252 lines (251 loc) 32.1 kB
/* RANGE: Most of the code is redundant and hera as inheritance boilerplate. The added/edited code adds logic for handling 1 or 2 inputs, i.e. range. When we have 2 inputs it's a range, otherwise its a single value date selection. The main logic is in `selectRangeEnd()` which handles range/non-range and inner range states. (this could probably be more orgenaized with proper states for clarity) Instead of "_userSelection" closing the popup/dialog from the calendar-content, the logic is moved here into _userSelection() which will close/keep based on range logic. */ import { __decorate, __extends, __param } from "tslib"; import { Subject, Subscription } from 'rxjs'; import { Component, ChangeDetectionStrategy, Inject, Input, ViewEncapsulation, ViewContainerRef, Optional, NgZone, OnDestroy, AfterViewInit, OnInit, InjectionToken, Injector, Output, EventEmitter } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Overlay } from '@angular/cdk/overlay'; import { Directionality } from '@angular/cdk/bidi'; import { DateAdapter } from '@angular/material/core'; import { MatDialog } from '@angular/material/dialog'; import { MatDatepicker, MAT_DATEPICKER_SCROLL_STRATEGY } from '@angular/material/datepicker'; import { MatDaterangepickerContent } from '../datepicker-content/datepicker-content.component'; import { ComponentPortal } from '@angular/cdk/portal'; import { take } from 'rxjs/operators'; import { DEFAULT_DATES_RANGES } from './default-ranges'; export var MAT_DEFAULT_DATES_RANGES = new InjectionToken('Custom Ranges'); var ɵ0 = []; var MatDaterangepicker = /** @class */ (function (_super) { __extends(MatDaterangepicker, _super); function MatDaterangepicker(_drDialog, _drOverlay, _drNgZone, _drViewContainerRef, _drScrollStrategy, _drDateAdapter, _drDir, _drDocument, _customRanges) { var _this = _super.call(this, _drDialog = Object.create(_drDialog), _drOverlay, _drNgZone, _drViewContainerRef, _drScrollStrategy, _drDateAdapter, _drDir, _drDocument) || this; _this._drOverlay = _drOverlay; _this._drNgZone = _drNgZone; _this._drViewContainerRef = _drViewContainerRef; _this._drScrollStrategy = _drScrollStrategy; _this._drDateAdapter = _drDateAdapter; _this._drDir = _drDir; _this._drDocument = _drDocument; _this._customRanges = _customRanges; _this.applyButton = true; _this.dualView = true; _this.showCustomRanges = false; _this.apply = new EventEmitter(); _this.customRanges = []; _this._validSelectedRangeEnd = null; /** Emits new selected date when selected date changes. */ _this._selectedChangedRangeEnd = new Subject(); _this._clearRangeEnd = new Subject(); _this._range = false; _this._inputRangeEndSubscription = Subscription.EMPTY; /* This is a monkey patch workaround to support a new component for dialog/popup. Because everything is freaking private in material, why would somone use protected anyway. */ _this._drDialog = _drDialog; _this._drDialog.open = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (typeof args[0].createEmbeddedView !== 'function') { args[0] = MatDaterangepickerContent; } return MatDialog.prototype.open.apply(_drDialog, args); }; // Object.defineProperty(this, '_calendarPortal', { // get: function () { return this.__calendarPortal; }, // set: function (value) { // this.__calendarPortal = value; // if (value) { // value.component = MatDaterangepickerContent; // } // } // }) _this['_openAsPopup'] = function () { var portal = new ComponentPortal(MatDaterangepickerContent, _this._drViewContainerRef); _this['_destroyPopup'](); _this['_createPopup'](); _this['_popupComponentRef'] = _this['_popupRef'].attach(portal); _this.forwardContentValues(_this['_popupComponentRef'].instance); // Update the position once the calendar has rendered. _this._drNgZone.onStable.asObservable().pipe(take(1)).subscribe(function () { _this['_popupRef'].updatePosition(); }); }; return _this; } Object.defineProperty(MatDaterangepicker.prototype, "_selectedRangeEnd", { /** The currently selected date. */ get: function () { return this._validSelectedRangeEnd; }, set: function (value) { this._validSelectedRangeEnd = value; }, enumerable: true, configurable: true }); MatDaterangepicker.prototype.ngOnInit = function () { if (this.customRanges) { this._setCustomRanges(); } }; MatDaterangepicker.prototype.ngAfterViewInit = function () { }; MatDaterangepicker.prototype.forwardContentValues = function (instance) { instance.datepicker = this; instance.color = this.color; }; MatDaterangepicker.prototype.ngOnDestroy = function () { _super.prototype.ngOnDestroy.call(this); this._inputRangeEndSubscription.unsubscribe(); }; MatDaterangepicker.prototype.selectRangeEnd = function (date) { if (!this._range) { _super.prototype.select.call(this, date); } else { if (!date) { if (this._selected && this._selectedRangeEnd) { _super.prototype.select.call(this, null); this._selectRangeEnd(null); } else if (this._selected) { _super.prototype.select.call(this, null); } else if (this._selectedRangeEnd) { this._selectRangeEnd(null); } } else if (!this._selected || this._selectedRangeEnd) { if (this._selectedRangeEnd) { this._selectRangeEnd(null); } _super.prototype.select.call(this, date); } else { if (date < this._selected) { var swap = this._selected; _super.prototype.select.call(this, date); this._selectRangeEnd(swap); } else if (date >= this._selected) { // notice date === this._selected is not skipped this._selectRangeEnd(date); } } } }; MatDaterangepicker.prototype._userSelection = function () { if (this.applyButton) return; if (!this._range || (this._selected && this._selectedRangeEnd)) { this.close(); } }; MatDaterangepicker.prototype.applyRange = function () { this.close(); this.apply.emit(); }; MatDaterangepicker.prototype.clearRange = function () { this._datepickerInput.value = null; this._clearRangeEnd.next(); }; MatDaterangepicker.prototype._getViews = function () { if (this.dualView) { return [0, 1]; } return [0]; }; MatDaterangepicker.prototype._registerInputRangeEnd = function (input) { var _this = this; if (this._datepickerInputRangeEnd) { throw Error('A MatDatepicker can only be associated with a single range end input.'); } this._datepickerInputRangeEnd = input; this._range = !!input; this._inputRangeEndSubscription.unsubscribe(); if (this._range) { this._inputRangeEndSubscription = this._datepickerInputRangeEnd._valueChange.subscribe(function (value) { return _this._selectedRangeEnd = value; }); } }; MatDaterangepicker.prototype._unregisterInputRangeEnd = function (input) { if (this._datepickerInputRangeEnd) { if (!input || input === this._datepickerInputRangeEnd) { this._datepickerInputRangeEnd = undefined; this._range = false; this._inputRangeEndSubscription.unsubscribe(); } } }; MatDaterangepicker.prototype._selectRangeEnd = function (date) { var oldValue = this._selectedRangeEnd; this._selectedRangeEnd = date; if (!this._drDateAdapter.sameDate(oldValue, this._selectedRangeEnd)) { this._selectedChangedRangeEnd.next(this._selectedRangeEnd); } }; MatDaterangepicker.prototype._setCustomRanges = function () { var _this = this; if (this._customRanges.length) { this.customRanges = this._customRanges; } else { this.customRanges = DEFAULT_DATES_RANGES.map(function (range) { return { name: range.name, startDate: range.startDate ? _this._drDateAdapter.createDate(range.startDate.getFullYear(), range.startDate.getMonth(), range.startDate.getDate()) : null, endDate: range.endDate ? _this._drDateAdapter.createDate(range.endDate.getFullYear(), range.endDate.getMonth(), range.endDate.getDate()) : null }; }); } }; MatDaterangepicker.ctorParameters = function () { return [ { type: MatDialog }, { type: Overlay }, { type: NgZone }, { type: ViewContainerRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DATEPICKER_SCROLL_STRATEGY,] }] }, { type: DateAdapter, decorators: [{ type: Optional }] }, { type: Directionality, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }, { type: Array, decorators: [{ type: Inject, args: [MAT_DEFAULT_DATES_RANGES,] }] } ]; }; __decorate([ Input() ], MatDaterangepicker.prototype, "applyButton", void 0); __decorate([ Input() ], MatDaterangepicker.prototype, "dualView", void 0); __decorate([ Input() ], MatDaterangepicker.prototype, "showCustomRanges", void 0); __decorate([ Output() ], MatDaterangepicker.prototype, "apply", void 0); MatDaterangepicker = __decorate([ Component({ selector: 'mat-daterangepicker', template: '', exportAs: 'matDaterangepicker', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [ { provide: MAT_DEFAULT_DATES_RANGES, useValue: ɵ0 }, ] }), __param(4, Inject(MAT_DATEPICKER_SCROLL_STRATEGY)), __param(5, Optional()), __param(6, Optional()), __param(7, Optional()), __param(7, Inject(DOCUMENT)), __param(8, Inject(MAT_DEFAULT_DATES_RANGES)) ], MatDaterangepicker); return MatDaterangepicker; }(MatDatepicker)); export { MatDaterangepicker }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtZGF0ZXJhbmdlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztFQVNFOztBQUVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFDTCxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUN4RyxTQUFTLEVBQ1QsYUFBYSxFQUNiLE1BQU0sRUFDTixjQUFjLEVBQ2QsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFzQiw4QkFBOEIsRUFBMkIsTUFBTSw4QkFBOEIsQ0FBQztBQUUxSSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUXhELE1BQU0sQ0FBQyxJQUFNLHdCQUF3QixHQUFH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dCBhbmQgaGVyYSBhcyBpbmhlcml0YW5jZSBib2lsZXJwbGF0ZS5cbiAgICBUaGUgYWRkZWQvZWRpdGVkIGNvZGUgYWRkcyBsb2dpYyBmb3IgaGFuZGxpbmcgMSBvciAyIGlucHV0cywgaS5lLiByYW5nZS5cbiAgICBXaGVuIHdlIGhhdmUgMiBpbnB1dHMgaXQncyBhIHJhbmdlLCBvdGhlcndpc2UgaXRzIGEgc2luZ2xlIHZhbHVlIGRhdGUgc2VsZWN0aW9uLlxuICAgIFRoZSBtYWluIGxvZ2ljIGlzIGluIGBzZWxlY3RSYW5nZUVuZCgpYCB3aGljaCBoYW5kbGVzIHJhbmdlL25vbi1yYW5nZSBhbmQgaW5uZXIgcmFuZ2Ugc3RhdGVzLiAodGhpcyBjb3VsZFxuICAgIHByb2JhYmx5IGJlIG1vcmUgb3JnZW5haXplZCB3aXRoIHByb3BlciBzdGF0ZXMgZm9yIGNsYXJpdHkpXG5cbiAgICBJbnN0ZWFkIG9mIFwiX3VzZXJTZWxlY3Rpb25cIiBjbG9zaW5nIHRoZSBwb3B1cC9kaWFsb2cgZnJvbSB0aGUgY2FsZW5kYXItY29udGVudCwgdGhlIGxvZ2ljXG4gICAgaXMgbW92ZWQgaGVyZSBpbnRvIF91c2VyU2VsZWN0aW9uKCkgd2hpY2ggd2lsbCBjbG9zZS9rZWVwIGJhc2VkIG9uIHJhbmdlIGxvZ2ljLlxuKi9cblxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbmplY3QsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NvbnRhaW5lclJlZiwgT3B0aW9uYWwsIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBPbkluaXQsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNQVRfREFURVBJQ0tFUl9TQ1JPTExfU1RSQVRFR1ksIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5cbmltcG9ydCB7IE1hdERhdGVyYW5nZXBpY2tlckNvbnRlbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLWNvbnRlbnQvZGF0ZXBpY2tlci1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX0RBVEVTX1JBTkdFUyB9IGZyb20gJy4vZGVmYXVsdC1yYW5nZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJhbmdlPEQ+IHtcblx0bmFtZTogc3RyaW5nXG5cdHN0YXJ0RGF0ZTogRCB8IERhdGVcblx0ZW5kRGF0ZTogRCB8IERhdGVcbn1cblxuZXhwb3J0IGNvbnN0IE1BVF9ERUZBVUxUX0RBVEVTX1JBTkdFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDdXN0b21SYW5nZTxhbnk+W10+KCdDdXN0b20gUmFuZ2VzJylcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWRhdGVyYW5nZXBpY2tlcicsXG4gIHRlbXBsYXRlOiAnJyxcbiAgZXhwb3J0QXM6ICdtYXREYXRlcmFuZ2VwaWNrZXInLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG5cdHtwcm92aWRlOiBNQVRfREVGQVVMVF9EQVRFU19SQU5HRVMsIHVzZVZhbHVlOiBbXX0sXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWF0RGF0ZXJhbmdlcGlja2VyPEQ+IGV4dGVuZHMgTWF0RGF0ZXBpY2tlcjxEPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuXHRASW5wdXQoKSBhcHBseUJ1dHRvbjogYm9vbGVhbiA9IHRydWVcblx0QElucHV0KCkgZHVhbFZpZXc6IGJvb2xlYW4gPSB0cnVlXG5cdEBJbnB1dCgpIHNob3dDdXN0b21SYW5nZXM6IGJvb2xlYW4gPSBmYWxzZVxuXG5cdEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG5cdGN1c3RvbVJhbmdlcyA9IFtdXG5cblx0LyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZS4gKi9cblx0Z2V0IF9zZWxlY3RlZFJhbmdlRW5kKCk6IEQgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3ZhbGlkU2VsZWN0ZWRSYW5nZUVuZDsgfVxuXHRzZXQgX3NlbGVjdGVkUmFuZ2VFbmQodmFsdWU6IEQgfCBudWxsKSB7IHRoaXMuX3ZhbGlkU2VsZWN0ZWRSYW5nZUVuZCA9IHZhbHVlOyB9XG5cdHByaXZhdGUgX3ZhbGlkU2VsZWN0ZWRSYW5nZUVuZDogRCB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBFbWl0cyBuZXcgc2VsZWN0ZWQgZGF0ZSB3aGVuIHNlbGVjdGVkIGRhdGUgY2hhbmdlcy4gKi9cblx0cmVhZG9ubHkgX3NlbGVjdGVkQ2hhbmdlZFJhbmdlRW5kID0gbmV3IFN1YmplY3Q8RD4oKTtcblx0cmVhZG9ubHkgX2NsZWFyUmFuZ2VFbmQgPSBuZXcgU3ViamVjdDxEPigpO1xuXHRfcmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRfZGF0ZXBpY2tlcklucHV0UmFuZ2VFbmQ6IE1hdERhdGVwaWNrZXJJbnB1dDxEPjtcblx0cHJpdmF0ZSBfaW5wdXRSYW5nZUVuZFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblx0cHJpdmF0ZSBfZHJEaWFsb2c6IE1hdERpYWxvZztcblxuXHRjb25zdHJ1Y3RvcihfZHJEaWFsb2c6IE1hdERpYWxvZyxcblx0XHRcdFx0cHJpdmF0ZSBfZHJPdmVybGF5OiBPdmVybGF5LFxuXHRcdFx0XHRwcml2YXRlIF9kck5nWm9uZTogTmdab25lLFxuXHRcdFx0XHRwcml2YXRlIF9kclZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG5cdFx0XHRcdEBJbmplY3QoTUFUX0RBVEVQSUNLRVJfU0NST0xMX1NUUkFURUdZKSBwcml2YXRlIF9kclNjcm9sbFN0cmF0ZWd5LFxuXHRcdFx0XHRAT3B0aW9uYWwoKSBwdWJsaWMgX2RyRGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPEQ+LFxuXHRcdFx0XHRAT3B0aW9uYWwoKSBwcml2YXRlIF9kckRpcjogRGlyZWN0aW9uYWxpdHksXG5cdFx0XHRcdEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RyRG9jdW1lbnQ6IGFueSxcblx0XHRcdFx0QEluamVjdChNQVRfREVGQVVMVF9EQVRFU19SQU5HRVMpIHB1YmxpYyBfY3VzdG9tUmFuZ2VzOiBDdXN0b21SYW5nZTxEPltdKSB7XG5cdFx0c3VwZXIoXG5cdFx0X2RyRGlhbG9nID0gT2JqZWN0LmNyZWF0ZShfZHJEaWFsb2cpLFxuXHRcdF9kck92ZXJsYXksXG5cdFx0X2RyTmdab25lLFxuXHRcdF9kclZpZXdDb250YWluZXJSZWYsXG5cdFx0X2RyU2Nyb2xsU3RyYXRlZ3ksXG5cdFx0X2RyRGF0ZUFkYXB0ZXIsXG5cdFx0X2RyRGlyLFxuXHRcdF9kckRvY3VtZW50XG5cdFx0KTtcblxuXHRcdC8qXG5cdFx0XHRUaGlzIGlzIGEgbW9ua2V5IHBhdGNoIHdvcmthcm91bmQgdG8gc3VwcG9ydCBhIG5ldyBjb21wb25lbnQgZm9yIGRpYWxvZy9wb3B1cC5cblx0XHRcdEJlY2F1c2UgZXZlcnl0aGluZyBpcyBmcmVha2luZyBwcml2YXRlIGluIG1hdGVyaWFsLCB3aHkgd291bGQgc29tb25lIHVzZSBwcm90ZWN0ZWQgYW55d2F5LlxuXHRcdCovXG5cdFx0dGhpcy5fZHJEaWFsb2cgPSBfZHJEaWFsb2c7XG5cdFx0dGhpcy5fZHJEaWFsb2cub3BlbiA9IDxhbnk+IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdLmNyZWF0ZUVtYmVkZGVkVmlldyAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRhcmdzWzBdID0gTWF0RGF0ZXJhbmdlcGlja2VyQ29udGVudDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBNYXREaWFsb2cucHJvdG90eXBlLm9wZW4uYXBwbHkoX2RyRGlhbG9nLCBhcmdzKTtcblx0XHR9O1xuXG5cdFx0Ly8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfY2FsZW5kYXJQb3J0YWwnLCB7XG5cdFx0Ly8gICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX19jYWxlbmRhclBvcnRhbDsgfSxcblx0XHQvLyAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0Ly8gICAgIHRoaXMuX19jYWxlbmRhclBvcnRhbCA9IHZhbHVlO1xuXHRcdC8vICAgICBpZiAodmFsdWUpIHtcblx0XHQvLyAgICAgICB2YWx1ZS5jb21wb25lbnQgPSBNYXREYXRlcmFuZ2VwaWNrZXJDb250ZW50O1xuXHRcdC8vICAgICB9XG5cdFx0Ly8gICB9XG5cdFx0Ly8gfSlcblxuXHRcdHRoaXNbJ19vcGVuQXNQb3B1cCddID0gKCkgPT4ge1xuXHRcdFx0Y29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbDxNYXREYXRlcmFuZ2VwaWNrZXJDb250ZW50PEQ+PihNYXREYXRlcmFuZ2VwaWNrZXJDb250ZW50LFxuXHRcdFx0dGhpcy5fZHJWaWV3Q29udGFpbmVyUmVmKTtcblxuXHRcdFx0dGhpc1snX2Rlc3Ryb3lQb3B1cCddKCk7XG5cdFx0XHR0aGlzWydfY3JlYXRlUG9wdXAnXSgpO1xuXHRcdFx0dGhpc1snX3BvcHVwQ29tcG9uZW50UmVmJ10gPSB0aGlzWydfcG9wdXBSZWYnXSEuYXR0YWNoKHBvcnRhbCk7XG5cdFx0XHR0aGlzLmZvcndhcmRDb250ZW50VmFsdWVzKHRoaXNbJ19wb3B1cENvbXBvbmVudFJlZiddLmluc3RhbmNlKTtcblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvbmNlIHRoZSBjYWxlbmRhciBoYXMgcmVuZGVyZWQuXG5cdFx0XHR0aGlzLl9kck5nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHRcdHRoaXNbJ19wb3B1cFJlZiddIS51cGRhdGVQb3NpdGlvbigpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0bmdPbkluaXQoKXtcblx0XHRpZih0aGlzLmN1c3RvbVJhbmdlcyl7XG5cdFx0XHR0aGlzLl9zZXRDdXN0b21SYW5nZXMoKVxuXHRcdH1cblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpe1xuXHR9XG5cblx0Zm9yd2FyZENvbnRlbnRWYWx1ZXMoaW5zdGFuY2U6IE1hdERhdGVyYW5nZXBpY2tlckNvbnRlbnQ8RD4pIHtcblx0XHRpbnN0YW5jZS5kYXRlcGlja2VyID0gdGhpcztcblx0XHRpbnN0YW5jZS5jb2xvciA9IHRoaXMuY29sb3I7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpIHtcblx0XHRzdXBlci5uZ09uRGVzdHJveSgpO1xuXHRcdHRoaXMuX2lucHV0UmFuZ2VFbmRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblx0fVxuXG5cdHNlbGVjdFJhbmdlRW5kKGRhdGU6IEQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuX3JhbmdlKSB7XG5cdFx0XHRzdXBlci5zZWxlY3QoZGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghZGF0ZSkge1xuXHRcdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWQgJiYgdGhpcy5fc2VsZWN0ZWRSYW5nZUVuZCkge1xuXHRcdFx0XHRcdHN1cGVyLnNlbGVjdChudWxsKTtcblx0XHRcdFx0XHR0aGlzLl9zZWxlY3RSYW5nZUVuZChudWxsKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9zZWxlY3RlZCkge1xuXHRcdFx0XHRcdHN1cGVyLnNlbGVjdChudWxsKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9zZWxlY3RlZFJhbmdlRW5kKSB7XG5cdFx0XHRcdFx0dGhpcy5fc2VsZWN0UmFuZ2VFbmQobnVsbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuX3NlbGVjdGVkIHx8IHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZWxlY3RSYW5nZUVuZChudWxsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdXBlci5zZWxlY3QoZGF0ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoZGF0ZSA8IHRoaXMuX3NlbGVjdGVkKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3dhcCA9IHRoaXMuX3NlbGVjdGVkO1xuXHRcdFx0XHRcdHN1cGVyLnNlbGVjdChkYXRlKTtcblx0XHRcdFx0XHR0aGlzLl9zZWxlY3RSYW5nZUVuZChzd2FwKTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRlID49IHRoaXMuX3NlbGVjdGVkKSB7IC8vIG5vdGljZSBkYXRlID09PSB0aGlzLl9zZWxlY3RlZCBpcyBub3Qgc2tpcHBlZFxuXHRcdFx0XHRcdHRoaXMuX3NlbGVjdFJhbmdlRW5kKGRhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3VzZXJTZWxlY3Rpb24oKTogdm9pZCB7XG5cdFx0aWYodGhpcy5hcHBseUJ1dHRvbikgcmV0dXJuO1xuXG5cdFx0aWYgKCAhdGhpcy5fcmFuZ2UgfHwgKHRoaXMuX3NlbGVjdGVkICYmIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQpICkge1xuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdGFwcGx5UmFuZ2UoKTogdm9pZCB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHRcdHRoaXMuYXBwbHkuZW1pdCgpXG5cdH1cblxuXHRjbGVhclJhbmdlKCk6IHZvaWQge1xuXHRcdHRoaXMuX2RhdGVwaWNrZXJJbnB1dC52YWx1ZSA9IG51bGxcblx0XHR0aGlzLl9jbGVhclJhbmdlRW5kLm5leHQoKVxuXHR9XG5cblx0X2dldFZpZXdzKCl7XG5cdFx0aWYodGhpcy5kdWFsVmlldyl7XG5cdFx0XHRyZXR1cm4gWzAsMV1cblx0XHR9XG5cdFx0cmV0dXJuICBbMF1cblx0fVxuXG5cdF9yZWdpc3RlcklucHV0UmFuZ2VFbmQoaW5wdXQ6IE1hdERhdGVwaWNrZXJJbnB1dDxEPik6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9kYXRlcGlja2VySW5wdXRSYW5nZUVuZCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoJ0EgTWF0RGF0ZXBpY2tlciBjYW4gb25seSBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgcmFuZ2UgZW5kIGlucHV0LicpO1xuXHRcdH1cblx0XHR0aGlzLl9kYXRlcGlja2VySW5wdXRSYW5nZUVuZCA9IGlucHV0O1xuXHRcdHRoaXMuX3JhbmdlID0gISFpbnB1dDtcblxuXHRcdHRoaXMuX2lucHV0UmFuZ2VFbmRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblx0XHRpZiAodGhpcy5fcmFuZ2UpIHtcblx0XHR0aGlzLl9pbnB1dFJhbmdlRW5kU3Vic2NyaXB0aW9uID1cblx0XHRcdHRoaXMuX2RhdGVwaWNrZXJJbnB1dFJhbmdlRW5kLl92YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBEIHwgbnVsbCkgPT4gdGhpcy5fc2VsZWN0ZWRSYW5nZUVuZCA9IHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHRfdW5yZWdpc3RlcklucHV0UmFuZ2VFbmQoaW5wdXQ/OiBNYXREYXRlcGlja2VySW5wdXQ8RD4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fZGF0ZXBpY2tlcklucHV0UmFuZ2VFbmQpIHtcblx0XHRcdGlmICghaW5wdXQgfHwgaW5wdXQgPT09IHRoaXMuX2RhdGVwaWNrZXJJbnB1dFJhbmdlRW5kKSB7XG5cdFx0XHRcdHRoaXMuX2RhdGVwaWNrZXJJbnB1dFJhbmdlRW5kID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR0aGlzLl9yYW5nZSA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLl9pbnB1dFJhbmdlRW5kU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfc2VsZWN0UmFuZ2VFbmQoZGF0ZTogRCk6IHZvaWQge1xuXHRcdGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2VsZWN0ZWRSYW5nZUVuZDtcblx0XHR0aGlzLl9zZWxlY3RlZFJhbmdlRW5kID0gZGF0ZTtcblx0XHRpZiAoIXRoaXMuX2RyRGF0ZUFkYXB0ZXIuc2FtZURhdGUob2xkVmFsdWUsIHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQpKSB7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZENoYW5nZWRSYW5nZUVuZC5uZXh0KHRoaXMuX3NlbGVjdGVkUmFuZ2VFbmQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgX3NldEN1c3RvbVJhbmdlcygpe1xuXHRcdGlmKHRoaXMuX2N1c3RvbVJhbmdlcy5sZW5ndGgpe1xuXHRcdFx0dGhpcy5jdXN0b21SYW5nZXMgPSB0aGlzLl9jdXN0b21SYW5nZXNcblx0XHR9ZWxzZXtcblx0XHRcdHRoaXMuY3VzdG9tUmFuZ2VzID0gREVGQVVMVF9EQVRFU19SQU5HRVMubWFwKHJhbmdlID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRuYW1lOiByYW5nZS5uYW1lLCBcblx0XHRcdFx0XHRzdGFydERhdGU6IHJhbmdlLnN0YXJ0RGF0ZSA/IHRoaXMuX2RyRGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShyYW5nZS5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgcmFuZ2Uuc3RhcnREYXRlLmdldE1vbnRoKCksIHJhbmdlLnN0YXJ0RGF0ZS5nZXREYXRlKCkpIDogbnVsbCxcblx0XHRcdFx0XHRlbmREYXRlOiByYW5nZS5lbmREYXRlID8gdGhpcy5fZHJEYXRlQWRhcHRlci5jcmVhdGVEYXRlKHJhbmdlLmVuZERhdGUuZ2V0RnVsbFllYXIoKSwgcmFuZ2UuZW5kRGF0ZS5nZXRNb250aCgpLCByYW5nZS5lbmREYXRlLmdldERhdGUoKSkgOiBudWxsXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0fVxuXHR9XG59XG5cbiJdfQ==