UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

205 lines (204 loc) 21.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ElementRef, ViewChild, HostListener, Inject, Input, Renderer2 } from '@angular/core'; import { Subject } from 'rxjs'; import { DOCUMENT } from '@angular/platform-browser'; export class AsiDropdownContainer { /** * @param {?} document * @param {?} renderer * @param {?} elementRef */ constructor(document, renderer, elementRef) { this.document = document; this.renderer = renderer; this.elementRef = elementRef; this.calculWidth = true; this.subjectContainer = new Subject(); } /** * @param {?} event * @return {?} */ documentClick(event) { if (!this.drop.nativeElement.contains(event.target)) { this.asiDropDownService.canClose(this.index, this.canClose).subscribe(close => { if (close) { setTimeout(() => { this.close(); }); } }); } } /** * @return {?} */ close() { this.subjectContainer.next(this); this.subjectContainer.complete(); } /** * @return {?} */ onClose() { return this.subjectContainer.asObservable(); } /** * Move the container under htmlElement * @param {?} elementRef * @return {?} */ forElement(elementRef) { this.referenceElement = elementRef; /** @type {?} */ const rectPos = elementRef.getBoundingClientRect(); /** @type {?} */ const bodyComputedStyle = getComputedStyle(this.document.body); /** @type {?} */ const bodyMarginTop = parseInt(bodyComputedStyle.marginTop.slice(0, -2), 10); /** @type {?} */ const bodyMarginLeft = parseInt(bodyComputedStyle.marginLeft.slice(0, -2), 10); /** @type {?} */ const topVerticalPosition = rectPos.top + this.getScrollTopValue() - bodyMarginTop; if (topVerticalPosition > this.document.body.clientHeight / 2) { // show over the element this.drop.nativeElement.style.bottom = (this.document.body.clientHeight - topVerticalPosition) + 'px'; this.drop.nativeElement.style.marginBottom = '5px'; } else { // show under the element this.drop.nativeElement.style.top = (topVerticalPosition + elementRef.offsetHeight) + 'px'; this.drop.nativeElement.style.marginTop = '5px'; } /** @type {?} */ const screenVerticalPosition = rectPos.top - bodyMarginTop; /** @type {?} */ let bodyVerticalPosition; if (screenVerticalPosition > this.document.body.clientHeight / 2) { // show over the element bodyVerticalPosition = this.document.body.clientHeight - (this.getScrollTopValue() + screenVerticalPosition); this.drop.nativeElement.style.bottom = bodyVerticalPosition + 'px'; this.drop.nativeElement.style.marginBottom = '2px'; } else { // show under the element bodyVerticalPosition = this.getScrollTopValue() + screenVerticalPosition + elementRef.offsetHeight; this.drop.nativeElement.style.top = bodyVerticalPosition + 'px'; this.drop.nativeElement.style.marginTop = '2px'; } this.drop.nativeElement.style.left = rectPos.left + this.getScrollLeftValue() - bodyMarginLeft + 'px'; this.drop.nativeElement.style.width = elementRef.offsetWidth + 'px'; } /** * @return {?} */ getScrollTopValue() { return this.document.body.scrollTop + this.document.documentElement.scrollTop; } /** * @return {?} */ getScrollLeftValue() { return this.document.body.scrollLeft + this.document.documentElement.scrollLeft; } /** * @param {?} asiDrownDown * @return {?} */ show(asiDrownDown) { setTimeout(() => { this.template = asiDrownDown.contentTemplate; /** @type {?} */ let visibility = this.drop.nativeElement.style.visibility; this.drop.nativeElement.style.visibility = 'hidden'; if (asiDrownDown.dropDownClass) { this.renderer.addClass(this.elementRef.nativeElement, asiDrownDown.dropDownClass); } setTimeout(() => { /** @type {?} */ let dropRight = this.drop.nativeElement.offsetLeft + this.drop.nativeElement.offsetWidth; if (dropRight > this.document.documentElement.clientWidth) { this.drop.nativeElement.style.left = this.drop.nativeElement.offsetLeft + this.document.documentElement.scrollLeft - (dropRight - this.document.documentElement.clientWidth) + 'px'; } this.drop.nativeElement.style.visibility = visibility; }); }); } /** * @param {?} service * @return {?} */ injectService(service) { this.asiDropDownService = service; } /** * @param {?} index * @return {?} */ setIndex(index) { this.index = index; this.elementRef.nativeElement.style.zIndex = AsiDropdownContainer.BASE_INDEX + index; } /** * @param {?} calculWidth * @return {?} */ setCalculWidth(calculWidth) { if (calculWidth) { this.drop.nativeElement.style.width = this.referenceElement.offsetWidth + 'px'; } else { this.drop.nativeElement.style.width = ''; } } } AsiDropdownContainer.BASE_INDEX = 125; AsiDropdownContainer.decorators = [ { type: Component, args: [{ selector: 'asi-dropdown-container', host: { 'class': 'asi-component asi-dropdown-container' }, template: "<div #drop class=\"dropdown-container\">\r\n <ng-template [ngTemplateOutlet]=\"template\"></ng-template>\r\n</div>" }] } ]; /** @nocollapse */ AsiDropdownContainer.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: Renderer2 }, { type: ElementRef } ]; AsiDropdownContainer.propDecorators = { calculWidth: [{ type: Input }], drop: [{ type: ViewChild, args: ['drop', { read: ElementRef },] }], documentClick: [{ type: HostListener, args: ['document:mouseup', ['$event'],] }] }; if (false) { /** @type {?} */ AsiDropdownContainer.BASE_INDEX; /** @type {?} */ AsiDropdownContainer.prototype.index; /** @type {?} */ AsiDropdownContainer.prototype.canClose; /** @type {?} */ AsiDropdownContainer.prototype.calculWidth; /** @type {?} */ AsiDropdownContainer.prototype.drop; /** @type {?} */ AsiDropdownContainer.prototype.subjectContainer; /** @type {?} */ AsiDropdownContainer.prototype.asiDropDownService; /** @type {?} */ AsiDropdownContainer.prototype.template; /** @type {?} */ AsiDropdownContainer.prototype.referenceElement; /** @type {?} */ AsiDropdownContainer.prototype.document; /** @type {?} */ AsiDropdownContainer.prototype.renderer; /** @type {?} */ AsiDropdownContainer.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWRyb3Bkb3duLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWRyb3Bkb3duL2NvbnRhaW5lci9hc2ktZHJvcGRvd24tY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFlLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU9yRCxNQUFNOzs7Ozs7SUFrQkosWUFBc0MsUUFBYSxFQUFVLFFBQW1CLEVBQVUsVUFBc0I7UUFBMUUsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZOzJCQVh6RixJQUFJO2dDQUkrQixJQUFJLE9BQU8sRUFBRTtLQVF0RTs7Ozs7SUFHRCxhQUFhLENBQUMsS0FBaUI7UUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDVixVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztx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LElBQUksQ0FBQztTQUNoRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDMUM7OztrQ0F2SXlCLEdBQUc7O1lBUGhDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUU7Z0JBQ3pELGlJQUFvRDthQUNyRDs7Ozs0Q0FtQmMsTUFBTSxTQUFDLFFBQVE7WUE1QnVELFNBQVM7WUFBN0QsVUFBVTs7OzBCQWlCeEMsS0FBSzttQkFFTCxTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTs0QkFZdEMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9hc2ktZHJvcGRvd24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBc2lEcm9wRG93biB9IGZyb20gJy4vLi4vYXNpLWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS1kcm9wZG93bi1jb250YWluZXInLFxyXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLWRyb3Bkb3duLWNvbnRhaW5lcicgfSxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1kcm9wZG93bi1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lEcm9wZG93bkNvbnRhaW5lciB7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEJBU0VfSU5ERVggPSAxMjU7XHJcblxyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgY2FuQ2xvc2U6IEZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKSBjYWxjdWxXaWR0aCA9IHRydWU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3AnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBzdWJqZWN0Q29udGFpbmVyOiBTdWJqZWN0PEFzaURyb3Bkb3duQ29udGFpbmVyPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHByaXZhdGUgYXNpRHJvcERvd25TZXJ2aWNlOiBBc2lEcm9wZG93blNlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIHJlZmVyZW5jZUVsZW1lbnQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgZG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlLmNhbkNsb3NlKHRoaXMuaW5kZXgsIHRoaXMuY2FuQ2xvc2UpLnN1YnNjcmliZShjbG9zZSA9PiB7XHJcbiAgICAgICAgaWYgKGNsb3NlKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLnN1YmplY3RDb250YWluZXIubmV4dCh0aGlzKTtcclxuICAgIHRoaXMuc3ViamVjdENvbnRhaW5lci5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgZXZlbnQgd2hlbiBjbGljayBvdXRzaWRlXHJcbiAgb25DbG9zZSgpOiBPYnNlcnZhYmxlPEFzaURyb3Bkb3duQ29udGFpbmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0Q29udGFpbmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZSB0aGUgY29udGFpbmVyIHVuZGVyIGh0bWxFbGVtZW50XHJcbiAgICogQHBhcmFtIGh0bWxFbGVtZW50IFRoZSBwYXJlbnQgSFRNTEVsZW1lbnQgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgZm9yRWxlbWVudChlbGVtZW50UmVmOiBhbnkpIHtcclxuICAgIHRoaXMucmVmZXJlbmNlRWxlbWVudCA9IGVsZW1lbnRSZWY7XHJcblxyXG4gICAgY29uc3QgcmVjdFBvcyA9IGVsZW1lbnRSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBjb21wdXRlZCBjbGFzcyBtYXJnaW4gKGZyb20gYm90aCBzdHlsZSArIGNzcyBjbGFzcylcclxuICAgIGNvbnN0IGJvZHlDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHkpO1xyXG5cclxuICAgIGNvbnN0IGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUludChib2R5Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3Auc2xpY2UoMCwgLTIpLCAxMCk7XHJcbiAgICBjb25zdCBib2R5TWFyZ2luTGVmdCA9IHBhcnNlSW50KGJvZHlDb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQuc2xpY2UoMCwgLTIpLCAxMCk7XHJcblxyXG4gICAgY29uc3QgdG9wVmVydGljYWxQb3NpdGlvbiA9IHJlY3RQb3MudG9wICsgdGhpcy5nZXRTY3JvbGxUb3BWYWx1ZSgpIC0gYm9keU1hcmdpblRvcDtcclxuXHJcbiAgICBpZiAodG9wVmVydGljYWxQb3NpdGlvbiA+IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLyAyKSB7XHJcbiAgICAgIC8vIHNob3cgb3ZlciB0aGUgZWxlbWVudFxyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5ib3R0b20gPSAodGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtIHRvcFZlcnRpY2FsUG9zaXRpb24pICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tID0gJzVweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzaG93IHVuZGVyIHRoZSBlbGVtZW50XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICh0b3BWZXJ0aWNhbFBvc2l0aW9uICsgZWxlbWVudFJlZi5vZmZzZXRIZWlnaHQpICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzVweCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2NyZWVuVmVydGljYWxQb3NpdGlvbiA9IHJlY3RQb3MudG9wIC0gYm9keU1hcmdpblRvcDtcclxuICAgIGxldCBib2R5VmVydGljYWxQb3NpdGlvbjtcclxuICAgIGlmIChzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uID4gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAvIDIpIHtcclxuICAgICAgLy8gc2hvdyBvdmVyIHRoZSBlbGVtZW50XHJcbiAgICAgIGJvZHlWZXJ0aWNhbFBvc2l0aW9uID0gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCAtICh0aGlzLmdldFNjcm9sbFRvcFZhbHVlKCkgKyBzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uKTtcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm90dG9tID0gYm9keVZlcnRpY2FsUG9zaXRpb24gKyAncHgnO1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnMnB4JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHNob3cgdW5kZXIgdGhlIGVsZW1lbnRcclxuICAgICAgYm9keVZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFRvcFZhbHVlKCkgKyBzY3JlZW5WZXJ0aWNhbFBvc2l0aW9uICsgZWxlbWVudFJlZi5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IGJvZHlWZXJ0aWNhbFBvc2l0aW9uICsgJ3B4JztcclxuICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJzJweCc7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IHJlY3RQb3MubGVmdCArIHRoaXMuZ2V0U2Nyb2xsTGVmdFZhbHVlKCkgLSBib2R5TWFyZ2luTGVmdCArICdweCc7XHJcblxyXG4gICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSBlbGVtZW50UmVmLm9mZnNldFdpZHRoICsgJ3B4JztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Nyb2xsVG9wVmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2Nyb2xsTGVmdFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBjb250ZW50IHRvIGRpc3BsYXkgaW4gdGhlIGNvbnRhaW5lclxyXG4gICAqL1xyXG4gIHNob3coYXNpRHJvd25Eb3duOiBBc2lEcm9wRG93bikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudGVtcGxhdGUgPSBhc2lEcm93bkRvd24uY29udGVudFRlbXBsYXRlO1xyXG4gICAgICBsZXQgdmlzaWJpbGl0eSA9IHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk7XHJcbiAgICAgIHRoaXMuZHJvcC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgaWYgKGFzaURyb3duRG93bi5kcm9wRG93bkNsYXNzKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgYXNpRHJvd25Eb3duLmRyb3BEb3duQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxldCBkcm9wUmlnaHQgPSB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgaWYgKGRyb3BSaWdodCA+IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdFxyXG4gICAgICAgICAgICArIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgLSAoZHJvcFJpZ2h0IC0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kcm9wLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5qZWN0U2VydmljZShzZXJ2aWNlOiBBc2lEcm9wZG93blNlcnZpY2UpIHtcclxuICAgIHRoaXMuYXNpRHJvcERvd25TZXJ2aWNlID0gc2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS56SW5kZXggPSBBc2lEcm9wZG93bkNvbnRhaW5lci5CQVNFX0lOREVYICsgaW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2FsY3VsV2lkdGgoY2FsY3VsV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIGlmIChjYWxjdWxXaWR0aCkge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMucmVmZXJlbmNlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRyb3AubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=