UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

307 lines 32 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild } from '@angular/core'; import { PopupComponent } from './popup.component'; import { Keys, Utils } from '@true-directive/base'; /** * Dropdown base component. */ var DropdownBaseComponent = /** @class */ (function () { function DropdownBaseComponent(_elementRef, _renderer) { this._elementRef = _elementRef; this._renderer = _renderer; this.usePopup = true; this.currentPopupVisible = false; this.disableTextEditor = false; this.disabled = null; this.maxDropDownHeight = '300px'; this.blur = new EventEmitter(); this.keydown = new EventEmitter(); this.onChange = function (_) { }; this.onTouched = function () { }; this._validBlur = false; this._useAltDown = true; this.shownByKey = false; this._touched = false; this._skipFocusOnPopupClose = false; } Object.defineProperty(DropdownBaseComponent.prototype, "popupPosition", { get: function () { return this.popup.position; }, set: function (pos) { this.currentPopupPosition = pos; if (this.popup) { this.popup.position = pos; } }, enumerable: true, configurable: true }); DropdownBaseComponent.prototype.registerOnChange = function (fn) { this.onChange = fn; }; DropdownBaseComponent.prototype.registerOnTouched = function (fn) { this.onTouched = fn; }; Object.defineProperty(DropdownBaseComponent.prototype, "useAltDown", { get: function () { return this._useAltDown; }, set: function (v) { this._useAltDown = v; }, enumerable: true, configurable: true }); DropdownBaseComponent.prototype.fetchData = function (dataQuery, data) { // }; DropdownBaseComponent.prototype.inputBlur = function (e) { // This touch was accepted this.onTouched(); // We shouldn't close window if the focus is moved to a popup window var l = e.relatedTarget; if (l === null || Utils.isAncestor(this.popup.popup.nativeElement, l)) { // l = null if the focus is moved to a grid because tabIndex = -1 // If the focus is moved to another element, then l != null // If the focus is moved by mouse click, then documentclick event occurs // and popup will be closed. return; } if (l === null || Utils.isAncestor(this._elementRef.nativeElement, l)) { // Window isn't closed if the focus moved to one of child elements return; } // Close the popup window if (this.popup.visible && !this._validBlur) { this._skipFocusOnPopupClose = true; this.popup.closePopup(); } // Reset the flag this._validBlur = false; this.blur.emit(e); }; DropdownBaseComponent.prototype.inputClick = function (e) { // Prevent popup from disabled input if (this.disabled) { return; } if (this.disableTextEditor) { if (this.popupVisible) { this.closePopup(); } else { this.showByTarget(); } e.stopPropagation(); e.preventDefault(); } }; DropdownBaseComponent.prototype.inputTouchStart = function (e) { this._touched = true; if (this.disableTextEditor) { e.stopPropagation(); e.preventDefault(); } }; DropdownBaseComponent.prototype.inputTouchMove = function (e) { this._touched = false; }; DropdownBaseComponent.prototype.inputTouchEnd = function (e) { if (!this.disabled && this.disableTextEditor) { if (!this.popupVisible && this._touched) { // Show the popup window by touchend event this.showByTarget(); if (e.cancelable) { e.preventDefault(); } } e.stopPropagation(); } }; Object.defineProperty(DropdownBaseComponent.prototype, "value", { get: function () { return this._value; }, set: function (v) { if (v !== this._value) { this._value = v; this.onChange(v); } }, enumerable: true, configurable: true }); ; // Send the value to input. Formatter: Ctrl --> View DropdownBaseComponent.prototype.writeValue = function (value) { if (this.value !== value) { this.value = value; } }; Object.defineProperty(DropdownBaseComponent.prototype, "popupVisible", { get: function () { if (this.popup) { return this.popup.visible; } return false; }, enumerable: true, configurable: true }); DropdownBaseComponent.prototype.focusPopup = function () { // }; DropdownBaseComponent.prototype.processKey = function (e) { return false; }; DropdownBaseComponent.prototype.showByTarget = function () { if (!this.usePopup) { return; } this.popup.showByTarget(this.input.nativeElement); }; DropdownBaseComponent.prototype.closePopup = function () { this.popup.closePopup(); }; /** * User's input * @param e Input event */ DropdownBaseComponent.prototype.inputInput = function (e) { if (e === void 0) { e = null; } // }; DropdownBaseComponent.prototype.inputKeyDown = function (e) { var _this = this; if (e.keyCode === Keys.ESCAPE && this.popup.visible) { this.closePopup(); e.stopPropagation(); e.preventDefault(); return; } if (e.keyCode === Keys.DOWN && (e.altKey || !this.useAltDown) && !this.popup.visible) { this.shownByKey = true; this.showByTarget(); setTimeout(function () { return _this.focusPopup(); }); e.preventDefault(); e.stopPropagation(); return; } if (!this.processKey(e)) { this.keydown.emit(e); } }; DropdownBaseComponent.prototype.focus = function () { this.input.nativeElement.focus(); }; DropdownBaseComponent.prototype.popupClose = function (e) { var _this = this; // Можем пропустить это мероприятие, если мы закрываем выпадающую панель, // находясь в контроле // Skip setting the focus if dropdown is closed. if (this._skipFocusOnPopupClose) { this._skipFocusOnPopupClose = false; return; } if (!Utils.detectMobile()) { // We allow the user to set the focus on input. this.input.nativeElement.focus(); setTimeout(function () { var txt = _this.input.nativeElement.value; if (txt !== undefined && !_this.disableTextEditor && _this._renderer) { _this._renderer.setProperty(_this.input.nativeElement, 'selectionStart', 0); _this._renderer.setProperty(_this.input.nativeElement, 'selectionEnd', txt.length); } }); } }; DropdownBaseComponent.prototype.inputFocus = function (e) { if (this.disableTextEditor) { this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0); this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', 0); } else { var txt = this.input.nativeElement.value; this._renderer.setProperty(this.input.nativeElement, 'selectionStart', 0); this._renderer.setProperty(this.input.nativeElement, 'selectionEnd', txt.length); } }; DropdownBaseComponent.prototype.togglePopup = function () { var _this = this; if (this.disabled) { return; } this.popup.toggle(this.input.nativeElement, ''); setTimeout(function () { if (_this.popupVisible) { _this.focusPopup(); } }); }; DropdownBaseComponent.prototype.btnClick = function (e) { this.togglePopup(); }; DropdownBaseComponent.prototype.setValueFromDisplayed = function () { // }; DropdownBaseComponent.prototype.ngAfterViewInit = function () { this.popup.position = this.currentPopupPosition; }; DropdownBaseComponent.prototype.ngOnDestroy = function () { if (this.popupVisible) { this.popup.closePopup(); } }; tslib_1.__decorate([ ViewChild('popup', { static: false }), tslib_1.__metadata("design:type", PopupComponent) ], DropdownBaseComponent.prototype, "popup", void 0); tslib_1.__decorate([ ViewChild('input', { static: true }), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "input", void 0); tslib_1.__decorate([ Input('disableTextEditor'), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "disableTextEditor", void 0); tslib_1.__decorate([ Input('disabled'), tslib_1.__metadata("design:type", Boolean) ], DropdownBaseComponent.prototype, "disabled", void 0); tslib_1.__decorate([ Input('maxDropDownHeight'), tslib_1.__metadata("design:type", Object) ], DropdownBaseComponent.prototype, "maxDropDownHeight", void 0); tslib_1.__decorate([ Input('popupPosition'), tslib_1.__metadata("design:type", String), tslib_1.__metadata("design:paramtypes", [String]) ], DropdownBaseComponent.prototype, "popupPosition", null); tslib_1.__decorate([ Output('blur'), tslib_1.__metadata("design:type", EventEmitter) ], DropdownBaseComponent.prototype, "blur", void 0); tslib_1.__decorate([ Output('keydown'), tslib_1.__metadata("design:type", EventEmitter) ], DropdownBaseComponent.prototype, "keydown", void 0); tslib_1.__decorate([ Input('useAltDown'), tslib_1.__metadata("design:type", Boolean), tslib_1.__metadata("design:paramtypes", [Boolean]) ], DropdownBaseComponent.prototype, "useAltDown", null); DropdownBaseComponent = tslib_1.__decorate([ Component({ selector: 'true-drop-down-base', template: "", styles: [""] }), tslib_1.__metadata("design:paramtypes", [ElementRef, Renderer2]) ], DropdownBaseComponent); return DropdownBaseComponent; }()); export { DropdownBaseComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdHJ1ZS1kaXJlY3RpdmUvZ3JpZC8iLCJzb3VyY2VzIjpbInNyYy9jb250cm9scy9kcm9wZG93bi1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDN0QsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUduRDs7R0FFRztBQU1IO0lBbVNFLCtCQUNZLFdBQXVCLEVBQ3ZCLFNBQW9CO1FBRHBCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFuU2hDLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBUzVCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUcxQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBR3pCLHNCQUFpQixHQUFHLE9BQU8sQ0FBQztRQWU1QixTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbEQsWUFBTyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLGFBQVEsR0FBRyxVQUFDLENBQU0sSUFBTSxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLGNBQU8sQ0FBQyxDQUFDO1FBS3JCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFhbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQXlEckIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQTRHekIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lB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QUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbEQsQ0FBQztJQUVELDJDQUFXLEdBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUExUkQ7UUFEQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDOzBDQUM3QixjQUFjO3dEQUFDO0lBR3RCO1FBREMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQzs7d0RBQ3hCO0lBR1g7UUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O29FQUNEO0lBRzFCO1FBREMsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7MkRBQ087SUFHekI7UUFEQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7O29FQUNDO0lBRzVCO1FBREMsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7OzhEQUd0QjtJQVVEO1FBREMsTUFBTSxDQUFDLE1BQU0sQ0FBQzswQ0FDVCxZQUFZO3VEQUFnQztJQUdsRDtRQURDLE1BQU0sQ0FBQyxTQUFTLENBQUM7MENBQ1QsWUFBWTswREFBZ0M7SUFjckQ7UUFEQyxLQUFLLENBQUMsWUFBWSxDQUFDOzs7MkRBR25CO0lBckRVLHFCQUFxQjtRQUxqQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFFBQVEsRUFBQyxFQUFFO3FCQUNGLEVBQUU7U0FDWixDQUFDO2lEQXFTeUIsVUFBVTtZQUNaLFNBQVM7T0FyU3JCLHFCQUFxQixDQXNTakM7SUFBRCw0QkFBQztDQUFBLEFBdFNELElBc1NDO1NBdFNZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBBbGVrc2V5IE1lbG5pa292LCBUcnVlIERpcmVjdGl2ZSBDb21wYW55LlxyXG4gKiBAbGluayBodHRwczovL3RydWVkaXJlY3RpdmUuY29tL1xyXG4gKiBAbGljZW5zZSBNSVRcclxuKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9wb3B1cC5jb21wb25lbnQnO1xyXG5cclxuaW1wb3J0IHsgS2V5cywgVXRpbHMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IERhdGFRdWVyeSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbi8qKlxyXG4gKiBEcm9wZG93biBiYXNlIGNvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1kcm9wLWRvd24tYmFzZScsXHJcbiAgdGVtcGxhdGU6YGAsXHJcbiAgc3R5bGVzOiBbYGBdIFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25CYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XHJcblxyXG4gIHVzZVBvcHVwOiBib29sZWFuID0gdHJ1ZTtcclxuICBjdXJyZW50UG9wdXBQb3NpdGlvbjogJ1JFTEFUSVZFJyB8ICdBQlNPTFVURScgfCAnTU9EQUwnIHwgJ1NOQUNLJztcclxuICBjdXJyZW50UG9wdXBWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3BvcHVwJywge3N0YXRpYzogZmFsc2V9KVxyXG4gIHBvcHVwOiBQb3B1cENvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dDogYW55O1xyXG5cclxuICBASW5wdXQoJ2Rpc2FibGVUZXh0RWRpdG9yJylcclxuICBkaXNhYmxlVGV4dEVkaXRvciA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoJ2Rpc2FibGVkJylcclxuICBkaXNhYmxlZDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgnbWF4RHJvcERvd25IZWlnaHQnKVxyXG4gIG1heERyb3BEb3duSGVpZ2h0ID0gJzMwMHB4JztcclxuXHJcbiAgQElucHV0KCdwb3B1cFBvc2l0aW9uJylcclxuICBwdWJsaWMgZ2V0IHBvcHVwUG9zaXRpb24oKTogJ1JFTEFUSVZFJyB8ICdBQlNPTFVURScgfCAnTU9EQUwnIHwgJ1NOQUNLJyB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3B1cC5wb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcG9wdXBQb3NpdGlvbihwb3M6ICdSRUxBVElWRScgfCAnQUJTT0xVVEUnIHwgJ01PREFMJyB8ICdTTkFDSycpIHtcclxuICAgIHRoaXMuY3VycmVudFBvcHVwUG9zaXRpb24gPSBwb3M7XHJcbiAgICBpZiAodGhpcy5wb3B1cCkge1xyXG4gICAgICB0aGlzLnBvcHVwLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgnYmx1cicpXHJcbiAgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgna2V5ZG93bicpXHJcbiAga2V5ZG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XHJcbiAgcHJvdGVjdGVkIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB2b2lkKTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cclxuXHJcbiAgcHJvdGVjdGVkIF92YWxpZEJsdXIgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX3VzZUFsdERvd24gPSB0cnVlO1xyXG5cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgndXNlQWx0RG93bicpXHJcbiAgcHVibGljIHNldCB1c2VBbHREb3duKHY6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3VzZUFsdERvd24gPSB2O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB1c2VBbHREb3duKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZUFsdERvd247XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2hvd25CeUtleSA9IGZhbHNlO1xyXG5cclxuICBmZXRjaERhdGEoZGF0YVF1ZXJ5OiBEYXRhUXVlcnksIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBpbnB1dEJsdXIoZTogRm9jdXNFdmVudCkge1xyXG5cclxuICAgIC8vIFRoaXMgdG91Y2ggd2FzIGFjY2VwdGVkXHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG5cclxuICAgIC8vIFdlIHNob3VsZG4ndCBjbG9zZSB3aW5kb3cgaWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGEgcG9wdXAgd2luZG93XHJcbiAgICBsZXQgbCA9IGUucmVsYXRlZFRhcmdldDtcclxuICAgIGlmIChsID09PSBudWxsIHx8IFV0aWxzLmlzQW5jZXN0b3IodGhpcy5wb3B1cC5wb3B1cC5uYXRpdmVFbGVtZW50LCBsKSkge1xyXG5cclxuICAgICAgLy8gbCA9IG51bGwgaWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGEgZ3JpZCBiZWNhdXNlIHRhYkluZGV4ID0gLTFcclxuICAgICAgLy8gSWYgdGhlIGZvY3VzIGlzIG1vdmVkIHRvIGFub3RoZXIgZWxlbWVudCwgdGhlbiBsICE9IG51bGxcclxuICAgICAgLy8gSWYgdGhlIGZvY3VzIGlzIG1vdmVkIGJ5IG1vdXNlIGNsaWNrLCB0aGVuIGRvY3VtZW50Y2xpY2sgZXZlbnQgb2NjdXJzXHJcbiAgICAgIC8vIGFuZCBwb3B1cCB3aWxsIGJlIGNsb3NlZC5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsID09PSBudWxsIHx8IFV0aWxzLmlzQW5jZXN0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBsKSkge1xyXG4gICAgICAvLyBXaW5kb3cgaXNuJ3QgY2xvc2VkIGlmIHRoZSBmb2N1cyBtb3ZlZCB0byBvbmUgb2YgY2hpbGQgZWxlbWVudHNcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsb3NlIHRoZSBwb3B1cCB3aW5kb3dcclxuICAgIGlmICh0aGlzLnBvcHVwLnZpc2libGUgJiYgIXRoaXMuX3ZhbGlkQmx1cikge1xyXG4gICAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXNldCB0aGUgZmxhZ1xyXG4gICAgdGhpcy5fdmFsaWRCbHVyID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5ibHVyLmVtaXQoZSk7XHJcbiAgfVxyXG5cclxuICBpbnB1dENsaWNrKGU6IGFueSkge1xyXG5cclxuICAgIC8vIFByZXZlbnQgcG9wdXAgZnJvbSBkaXNhYmxlZCBpbnB1dFxyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0J5VGFyZ2V0KCk7XHJcbiAgICAgIH1cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG91Y2hlZCA9IGZhbHNlO1xyXG4gIGlucHV0VG91Y2hTdGFydChlOiBhbnkpIHtcclxuICAgIHRoaXMuX3RvdWNoZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLmRpc2FibGVUZXh0RWRpdG9yKSB7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0VG91Y2hNb3ZlKGU6IGFueSkge1xyXG4gICAgdGhpcy5fdG91Y2hlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRUb3VjaEVuZChlOiBhbnkpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICBpZiAoIXRoaXMucG9wdXBWaXNpYmxlICYmIHRoaXMuX3RvdWNoZWQpIHtcclxuICAgICAgICAvLyBTaG93IHRoZSBwb3B1cCB3aW5kb3cgYnkgdG91Y2hlbmQgZXZlbnRcclxuICAgICAgICB0aGlzLnNob3dCeVRhcmdldCgpO1xyXG4gICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfdmFsdWU6IGFueTtcclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU2VuZCB0aGUgdmFsdWUgdG8gaW5wdXQuIEZvcm1hdHRlcjogQ3RybCAtLT4gVmlld1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBwb3B1cFZpc2libGUoKTogYm9vbGVhbiB7ICAgIFxyXG4gICAgaWYgKHRoaXMucG9wdXApIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9wdXAudmlzaWJsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c1BvcHVwKCkge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwcm9jZXNzS2V5KGU6IGFueSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dCeVRhcmdldCgpIHtcclxuICAgIGlmICghdGhpcy51c2VQb3B1cCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHVwLnNob3dCeVRhcmdldCh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlUG9wdXAoKSB7XHJcbiAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZXIncyBpbnB1dFxyXG4gICAqIEBwYXJhbSAgZSBJbnB1dCBldmVudFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbnB1dElucHV0KGU6IGFueSA9IG51bGwpIHtcclxuICAgIC8vXHJcbiAgfVxyXG5cclxuICBpbnB1dEtleURvd24oZTogYW55KSB7XHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVTQ0FQRSAmJiB0aGlzLnBvcHVwLnZpc2libGUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlLmtleUNvZGUgPT09IEtleXMuRE9XTiAmJiAoZS5hbHRLZXkgfHwgIXRoaXMudXNlQWx0RG93bikgJiYgIXRoaXMucG9wdXAudmlzaWJsZSkge1xyXG4gICAgICB0aGlzLnNob3duQnlLZXkgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dCeVRhcmdldCgpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNQb3B1cCgpKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnByb2Nlc3NLZXkoZSkpIHtcclxuICAgICAgdGhpcy5rZXlkb3duLmVtaXQoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb2N1cygpIHtcclxuICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgX3NraXBGb2N1c09uUG9wdXBDbG9zZSA9IGZhbHNlO1xyXG4gIHBvcHVwQ2xvc2UoZTogYW55KSB7XHJcblxyXG4gICAgLy8g0JzQvtC20LXQvCDQv9GA0L7Qv9GD0YHRgtC40YLRjCDRjdGC0L4g0LzQtdGA0L7Qv9GA0LjRj9GC0LjQtSwg0LXRgdC70Lgg0LzRiyDQt9Cw0LrRgNGL0LLQsNC10Lwg0LLRi9C/0LDQtNCw0Y7RidGD0Y4g0L/QsNC90LXQu9GMLFxyXG4gICAgLy8g0L3QsNGF0L7QtNGP0YHRjCDQsiDQutC+0L3RgtGA0L7Qu9C1XHJcbiAgICAvLyBTa2lwIHNldHRpbmcgdGhlIGZvY3VzIGlmIGRyb3Bkb3duIGlzIGNsb3NlZC5cclxuICAgIGlmICh0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UpIHtcclxuICAgICAgdGhpcy5fc2tpcEZvY3VzT25Qb3B1cENsb3NlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIVV0aWxzLmRldGVjdE1vYmlsZSgpKSB7XHJcbiAgICAgIC8vIFdlIGFsbG93IHRoZSB1c2VyIHRvIHNldCB0aGUgZm9jdXMgb24gaW5wdXQuXHJcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCB0eHQgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgaWYgKHR4dCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmRpc2FibGVUZXh0RWRpdG9yICYmIHRoaXMuX3JlbmRlcmVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIDApO1xyXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdHh0Lmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0Rm9jdXMoZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlVGV4dEVkaXRvcikge1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25TdGFydCcsIDApO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3Rpb25FbmQnLCAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHR4dCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uU3RhcnQnLCAwKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0aW9uRW5kJywgdHh0Lmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBvcHVwLnRvZ2dsZSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICcnKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucG9wdXBWaXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c1BvcHVwKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYnRuQ2xpY2soZTogYW55KSB7XHJcbiAgICB0aGlzLnRvZ2dsZVBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmFsdWVGcm9tRGlzcGxheWVkKCkge1xyXG4gICAgLy9cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucG9wdXAucG9zaXRpb24gPSB0aGlzLmN1cnJlbnRQb3B1cFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMikgeyB9XHJcbn1cclxuIl19