UNPKG

@taiga-ui/kit

Version:
235 lines • 36.6 kB
import { __decorate, __extends, __param } from "tslib"; import { DOCUMENT } from '@angular/common'; import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, forwardRef, Host, Inject, Injector, Input, NgZone, OnDestroy, Optional, Renderer2, ViewContainerRef, } from '@angular/core'; import { ALWAYS_TRUE_HANDLER, CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_SPACE, getNativeFocused, px, TuiActiveZoneDirective, TuiBooleanHandler, TuiDestroyService, TuiParentsScrollService, TuiPortalService, typedFromEvent, } from '@taiga-ui/cdk'; import { AbstractTuiDropdown, TUI_DOCUMENT_OR_SHADOW_ROOT, TUI_DROPDOWN_DIRECTIVE, TUI_ELEMENT_REF, } from '@taiga-ui/core'; import { getWordRange } from '@taiga-ui/kit/utils/dom'; import { merge } from 'rxjs'; import { map, switchMapTo, takeUntil } from 'rxjs/operators'; // @dynamic var TuiDropdownSelectionDirective = /** @class */ (function (_super) { __extends(TuiDropdownSelectionDirective, _super); function TuiDropdownSelectionDirective(documentRef, componentFactoryResolver, injector, portalService, elementRef, activeZone, shadowRootRef, customElementRef, destroy$, refresh$, changeDetectorRef, ngZone, renderer, viewContainerRef) { var _this = _super.call(this, componentFactoryResolver, injector, portalService, customElementRef || elementRef, activeZone) || this; _this.refresh$ = refresh$; _this.changeDetectorRef = changeDetectorRef; _this.ngZone = ngZone; _this.renderer = renderer; _this.viewContainerRef = viewContainerRef; _this.position = "selection" /* Selection */; _this.visibilityHandler = ALWAYS_TRUE_HANDLER; _this.documentRef = shadowRootRef || documentRef; _this.range = _this.documentRef.createRange(); var nativeElement = _this.elementRef.nativeElement; merge(typedFromEvent(_this.documentRef, 'mouseup'), typedFromEvent(nativeElement, 'mousedown').pipe(switchMapTo(typedFromEvent(nativeElement, 'mousemove').pipe(takeUntil(typedFromEvent(_this.documentRef, 'mouseup'))))), typedFromEvent(nativeElement, 'keyup')) .pipe(map(function () { var active = getNativeFocused(_this.documentRef); var selection = _this.documentRef.getSelection(); if ((active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement) && nativeElement.contains(active)) { return _this.veryVerySadInputFix(active); } return selection && selection.rangeCount ? selection.getRangeAt(0) : _this.range; }), takeUntil(destroy$)) .subscribe(function (range) { var contained = nativeElement.contains(range.commonAncestorContainer); _this.range = contained ? range : _this.range; var valid = contained && (!_this.visibilityHandler || _this.visibilityHandler(_this.range)); _this.toggleDropdownBox(valid || _this.inDropdown(range)); }); return _this; } TuiDropdownSelectionDirective_1 = TuiDropdownSelectionDirective; Object.defineProperty(TuiDropdownSelectionDirective.prototype, "tuiDropdownSelection", { set: function (handler) { if (!handler) { return; } var inHostAndValid = this.elementRef.nativeElement.contains(this.range.commonAncestorContainer) && handler(this.range); this.visibilityHandler = handler; this.toggleDropdownBox(inHostAndValid); }, enumerable: true, configurable: true }); Object.defineProperty(TuiDropdownSelectionDirective.prototype, "clientRect", { get: function () { var defaultView = this.documentRef.defaultView; var rangeRect = this.rangeRect; var frameElement = defaultView ? defaultView.frameElement : null; if (!frameElement) { return rangeRect; } var documentRect = frameElement.getBoundingClientRect(); return { top: rangeRect.top + documentRect.top, left: rangeRect.left + documentRect.left, right: rangeRect.left + documentRect.left + rangeRect.width, bottom: rangeRect.top + documentRect.top + rangeRect.height, width: rangeRect.width, height: rangeRect.height, }; }, enumerable: true, configurable: true }); TuiDropdownSelectionDirective.prototype.ngOnDestroy = function () { this.closeDropdownBox(); if (this.ghost) { this.renderer.removeChild(this.viewContainerRef.element.nativeElement, this.ghost); } }; Object.defineProperty(TuiDropdownSelectionDirective.prototype, "rangeRect", { /** * get ClientRect of current Range according to provided position */ get: function () { switch (this.position) { case "tag" /* Tag */: var commonAncestorContainer = this.range.commonAncestorContainer; var element = commonAncestorContainer.nodeType === Node.ELEMENT_NODE ? commonAncestorContainer : commonAncestorContainer.parentNode; return element.getBoundingClientRect(); case "word" /* Word */: return getWordRange(this.range).getBoundingClientRect(); default: return this.range.getBoundingClientRect(); } }, enumerable: true, configurable: true }); /** * Toggle dropdown visibility (has to be in ngZone.run because it could be initiated inside iframe in Editor) */ TuiDropdownSelectionDirective.prototype.toggleDropdownBox = function (visible) { var _this = this; this.ngZone.run(function () { if (visible) { _this.openDropdownBox(); } else { _this.closeDropdownBox(); } _this.changeDetectorRef.markForCheck(); }); }; /** * Check if Node is inside dropdown */ TuiDropdownSelectionDirective.prototype.boxContains = function (node) { return (!!this.dropdownBoxRef && this.dropdownBoxRef.location.nativeElement.contains(node)); }; /** * Check if given range is at leaset partially inside dropdown */ TuiDropdownSelectionDirective.prototype.inDropdown = function (range) { var startContainer = range.startContainer, endContainer = range.endContainer; var inDropdown = this.boxContains(range.commonAncestorContainer); var hostToDropdown = this.boxContains(endContainer) && this.elementRef.nativeElement.contains(startContainer); var dropdownToHost = this.boxContains(startContainer) && this.elementRef.nativeElement.contains(endContainer); return inDropdown || hostToDropdown || dropdownToHost; }; /** * Position invisible DIV and create Range similar to selected range inside input/textarea */ TuiDropdownSelectionDirective.prototype.veryVerySadInputFix = function (element) { var _a = this.ghost, ghost = _a === void 0 ? this.initGhost(element) : _a; var _b = element.getBoundingClientRect(), top = _b.top, left = _b.left, width = _b.width, height = _b.height; var selectionStart = element.selectionStart, selectionEnd = element.selectionEnd; var range = this.documentRef.createRange(); var hostRect = this.elementRef.nativeElement.getBoundingClientRect(); ghost.style.top = px(top - hostRect.top); ghost.style.left = px(left - hostRect.left); ghost.style.width = px(width); ghost.style.height = px(height); ghost.textContent = CHAR_ZERO_WIDTH_SPACE + element.value + CHAR_NO_BREAK_SPACE; range.setStart(ghost.firstChild, selectionStart || 0); range.setEnd(ghost.firstChild, selectionEnd || 0); return range; }; /** * Create an invisible DIV styled exactly like input/textarea element inside directive */ TuiDropdownSelectionDirective.prototype.initGhost = function (element) { var ghost = this.renderer.createElement('div'); var nativeElement = this.viewContainerRef.element.nativeElement; var _a = getComputedStyle(element), font = _a.font, letterSpacing = _a.letterSpacing, textTransform = _a.textTransform, padding = _a.padding; ghost.style.position = 'absolute'; ghost.style.pointerEvents = 'none'; ghost.style.opacity = '0'; ghost.style.whiteSpace = 'pre-wrap'; ghost.style.font = font; ghost.style.letterSpacing = letterSpacing; ghost.style.textTransform = textTransform; ghost.style.padding = padding; this.renderer.appendChild(nativeElement, ghost); this.ghost = ghost; return ghost; }; var TuiDropdownSelectionDirective_1; TuiDropdownSelectionDirective.ctorParameters = function () { return [ { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: ComponentFactoryResolver, decorators: [{ type: Inject, args: [ComponentFactoryResolver,] }] }, { type: Injector, decorators: [{ type: Inject, args: [Injector,] }] }, { type: TuiPortalService, decorators: [{ type: Inject, args: [TuiPortalService,] }] }, { type: ElementRef, decorators: [{ type: Host }, { type: Inject, args: [ElementRef,] }] }, { type: TuiActiveZoneDirective, decorators: [{ type: Inject, args: [TuiActiveZoneDirective,] }, { type: Optional }] }, { type: Document, decorators: [{ type: Inject, args: [TUI_DOCUMENT_OR_SHADOW_ROOT,] }, { type: Optional }] }, { type: ElementRef, decorators: [{ type: Inject, args: [TUI_ELEMENT_REF,] }, { type: Optional }] }, { type: TuiDestroyService, decorators: [{ type: Inject, args: [TuiDestroyService,] }] }, { type: TuiParentsScrollService, decorators: [{ type: Inject, args: [TuiParentsScrollService,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }, { type: NgZone, decorators: [{ type: Inject, args: [NgZone,] }] }, { type: Renderer2, decorators: [{ type: Inject, args: [Renderer2,] }] }, { type: ViewContainerRef, decorators: [{ type: Inject, args: [ViewContainerRef,] }] } ]; }; __decorate([ Input() ], TuiDropdownSelectionDirective.prototype, "tuiDropdownSelection", null); __decorate([ Input('tuiDropdownSelectionPosition') ], TuiDropdownSelectionDirective.prototype, "position", void 0); TuiDropdownSelectionDirective = TuiDropdownSelectionDirective_1 = __decorate([ Directive({ selector: '[tuiDropdownSelection]:not(ng-container)', providers: [ { provide: TUI_DROPDOWN_DIRECTIVE, useExisting: forwardRef(function () { return TuiDropdownSelectionDirective_1; }), }, TuiParentsScrollService, TuiDestroyService, ], }), __param(0, Inject(DOCUMENT)), __param(1, Inject(ComponentFactoryResolver)), __param(2, Inject(Injector)), __param(3, Inject(TuiPortalService)), __param(4, Host()), __param(4, Inject(ElementRef)), __param(5, Inject(TuiActiveZoneDirective)), __param(5, Optional()), __param(6, Inject(TUI_DOCUMENT_OR_SHADOW_ROOT)), __param(6, Optional()), __param(7, Inject(TUI_ELEMENT_REF)), __param(7, Optional()), __param(8, Inject(TuiDestroyService)), __param(9, Inject(TuiParentsScrollService)), __param(10, Inject(ChangeDetectorRef)), __param(11, Inject(NgZone)), __param(12, Inject(Renderer2)), __param(13, Inject(ViewContainerRef)) ], TuiDropdownSelectionDirective); return TuiDropdownSelectionDirective; }(AbstractTuiDropdown)); export { TuiDropdownSelectionDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VsZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvZGlyZWN0aXZlcy9kcm9wZG93bi1zZWxlY3Rpb24vIiwic291cmNlcyI6WyJkcm9wZG93bi1zZWxlY3Rpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNILGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLFNBQVMsRUFDVCxnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixFQUFFLEVBQ0Ysc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixjQUFjLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixlQUFlLEdBRWxCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsV0FBVztBQVlYO0lBQ1ksaURBQW1CO0lBMkIzQix1Q0FDc0IsV0FBcUIsRUFFdkMsd0JBQWtELEVBQ2hDLFFBQWtCLEVBQ1YsYUFBK0IsRUFDN0Is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QUFDLGNBQU0sT0FBQSwrQkFBNkIsRUFBN0IsQ0FBNkIsQ0FBQztpQkFDL0Q7Z0JBQ0QsdUJBQXVCO2dCQUN2QixpQkFBaUI7YUFDcEI7U0FDSixDQUFDO1FBOEJPLFdBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2hCLFdBQUEsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFFaEMsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEIsV0FBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUN4QixXQUFBLElBQUksRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUIsV0FBQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUM5QixXQUFBLFFBQVEsRUFBRSxDQUFBO1FBRVYsV0FBQSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtRQUNuQyxXQUFBLFFBQVEsRUFBRSxDQUFBO1FBRVYsV0FBQSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDdkIsV0FBQSxRQUFRLEVBQUUsQ0FBQTtRQUVWLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFekIsV0FBQSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUMvQixZQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3pCLFlBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2QsWUFBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDakIsWUFBQSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtPQWxEcEIsNkJBQTZCLENBb1B6QztJQUFELG9DQUFDO0NBQUEsQUFwUEQsQ0FDWSxtQkFBbUIsR0FtUDlCO1NBcFBZLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBTFdBWVNfVFJVRV9IQU5ETEVSLFxuICAgIENIQVJfTk9fQlJFQUtfU1BBQ0UsXG4gICAgQ0hBUl9aRVJPX1dJRFRIX1NQQUNFLFxuICAgIGdldE5hdGl2ZUZvY3VzZWQsXG4gICAgcHgsXG4gICAgVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSxcbiAgICBUdWlCb29sZWFuSGFuZGxlcixcbiAgICBUdWlEZXN0cm95U2VydmljZSxcbiAgICBUdWlQYXJlbnRzU2Nyb2xsU2VydmljZSxcbiAgICBUdWlQb3J0YWxTZXJ2aWNlLFxuICAgIHR5cGVkRnJvbUV2ZW50LFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RUdWlEcm9wZG93bixcbiAgICBUVUlfRE9DVU1FTlRfT1JfU0hBRE9XX1JPT1QsXG4gICAgVFVJX0RST1BET1dOX0RJUkVDVElWRSxcbiAgICBUVUlfRUxFTUVOVF9SRUYsXG4gICAgVHVpRHJvcGRvd24sXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7VHVpRHJvcGRvd25Qb3NpdGlvbn0gZnJvbSAnQHRhaWdhLXVpL2tpdC9lbnVtcyc7XG5pbXBvcnQge2dldFdvcmRSYW5nZX0gZnJvbSAnQHRhaWdhLXVpL2tpdC91dGlscy9kb20nO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcCwgc3dpdGNoTWFwVG8sIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdHVpRHJvcGRvd25TZWxlY3Rpb25dOm5vdChuZy1jb250YWluZXIpJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX0RST1BET1dOX0RJUkVDVElWRSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFR1aURyb3Bkb3duU2VsZWN0aW9uRGlyZWN0aXZlKSxcbiAgICAgICAgfSxcbiAgICAgICAgVHVpUGFyZW50c1Njcm9sbFNlcnZpY2UsXG4gICAgICAgIFR1aURlc3Ryb3lTZXJ2aWNlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aURyb3Bkb3duU2VsZWN0aW9uRGlyZWN0aXZlXG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aURyb3Bkb3duXG4gICAgaW1wbGVtZW50cyBUdWlEcm9wZG93biwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKVxuICAgIHNldCB0dWlEcm9wZG93blNlbGVjdGlvbihoYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxSYW5nZT4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbkhvc3RBbmRWYWxpZCA9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSAmJlxuICAgICAgICAgICAgaGFuZGxlcih0aGlzLnJhbmdlKTtcblxuICAgICAgICB0aGlzLnZpc2liaWxpdHlIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bkJveChpbkhvc3RBbmRWYWxpZCk7XG4gICAgfVxuXG4gICAgQElucHV0KCd0dWlEcm9wZG93blNlbGVjdGlvblBvc2l0aW9uJylcbiAgICBwb3NpdGlvbiA9IFR1aURyb3Bkb3duUG9zaXRpb24uU2VsZWN0aW9uO1xuXG4gICAgcHJpdmF0ZSByYW5nZTogUmFuZ2U7XG5cbiAgICBwcml2YXRlIHZpc2liaWxpdHlIYW5kbGVyOiBUdWlCb29sZWFuSGFuZGxlcjxSYW5nZT4gPSBBTFdBWVNfVFJVRV9IQU5ETEVSO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFJlZjogRG9jdW1lbnQ7XG5cbiAgICBwcml2YXRlIGdob3N0PzogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnRSZWY6IERvY3VtZW50LFxuICAgICAgICBASW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcilcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIEBJbmplY3QoSW5qZWN0b3IpIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgQEluamVjdChUdWlQb3J0YWxTZXJ2aWNlKSBwb3J0YWxTZXJ2aWNlOiBUdWlQb3J0YWxTZXJ2aWNlLFxuICAgICAgICBASG9zdCgpIEBJbmplY3QoRWxlbWVudFJlZikgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBJbmplY3QoVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSlcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgYWN0aXZlWm9uZTogVHVpQWN0aXZlWm9uZURpcmVjdGl2ZSB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVFVJX0RPQ1VNRU5UX09SX1NIQURPV19ST09UKVxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBzaGFkb3dSb290UmVmOiBEb2N1bWVudCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVFVJX0VMRU1FTlRfUkVGKVxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBjdXN0b21FbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoVHVpRGVzdHJveVNlcnZpY2UpXG4gICAgICAgIGRlc3Ryb3kkOiBUdWlEZXN0cm95U2VydmljZSxcbiAgICAgICAgQEluamVjdChUdWlQYXJlbnRzU2Nyb2xsU2VydmljZSkgcmVhZG9ubHkgcmVmcmVzaCQ6IFR1aVBhcmVudHNTY3JvbGxTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChOZ1pvbmUpIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoUmVuZGVyZXIyKSBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIEBJbmplY3QoVmlld0NvbnRhaW5lclJlZikgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgIGluamVjdG9yLFxuICAgICAgICAgICAgcG9ydGFsU2VydmljZSxcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRSZWYgfHwgZWxlbWVudFJlZixcbiAgICAgICAgICAgIGFjdGl2ZVpvbmUsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZWYgPSBzaGFkb3dSb290UmVmIHx8IGRvY3VtZW50UmVmO1xuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVSYW5nZSgpO1xuXG4gICAgICAgIGNvbnN0IHtuYXRpdmVFbGVtZW50fSA9IHRoaXMuZWxlbWVudFJlZjtcblxuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIHR5cGVkRnJvbUV2ZW50KHRoaXMuZG9jdW1lbnRSZWYsICdtb3VzZXVwJyksXG4gICAgICAgICAgICB0eXBlZEZyb21FdmVudChuYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJykucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXBUbyhcbiAgICAgICAgICAgICAgICAgICAgdHlwZWRGcm9tRXZlbnQobmF0aXZlRWxlbWVudCwgJ21vdXNlbW92ZScpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodHlwZWRGcm9tRXZlbnQodGhpcy5kb2N1bWVudFJlZiwgJ21vdXNldXAnKSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0eXBlZEZyb21FdmVudChuYXRpdmVFbGVtZW50LCAna2V5dXAnKSxcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gZ2V0TmF0aXZlRm9jdXNlZCh0aGlzLmRvY3VtZW50UmVmKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5kb2N1bWVudFJlZi5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbGVtZW50LmNvbnRhaW5zKGFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJ5VmVyeVNhZElucHV0Rml4KGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMucmFuZ2U7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKGRlc3Ryb3kkKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lZCA9IG5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IGNvbnRhaW5lZCA/IHJhbmdlIDogdGhpcy5yYW5nZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICghdGhpcy52aXNpYmlsaXR5SGFuZGxlciB8fCB0aGlzLnZpc2liaWxpdHlIYW5kbGVyKHRoaXMucmFuZ2UpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd25Cb3godmFsaWQgfHwgdGhpcy5pbkRyb3Bkb3duKHJhbmdlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgY2xpZW50UmVjdCgpOiBDbGllbnRSZWN0IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHRWaWV3fSA9IHRoaXMuZG9jdW1lbnRSZWY7XG4gICAgICAgIGNvbnN0IHtyYW5nZVJlY3R9ID0gdGhpcztcbiAgICAgICAgY29uc3QgZnJhbWVFbGVtZW50ID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQgOiBudWxsO1xuXG4gICAgICAgIGlmICghZnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VSZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSZWN0ID0gZnJhbWVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IHJhbmdlUmVjdC50b3AgKyBkb2N1bWVudFJlY3QudG9wLFxuICAgICAgICAgICAgbGVmdDogcmFuZ2VSZWN0LmxlZnQgKyBkb2N1bWVudFJlY3QubGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiByYW5nZVJlY3QubGVmdCArIGRvY3VtZW50UmVjdC5sZWZ0ICsgcmFuZ2VSZWN0LndpZHRoLFxuICAgICAgICAgICAgYm90dG9tOiByYW5nZVJlY3QudG9wICsgZG9jdW1lbnRSZWN0LnRvcCArIHJhbmdlUmVjdC5oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogcmFuZ2VSZWN0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiByYW5nZVJlY3QuaGVpZ2h0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd25Cb3goKTtcblxuICAgICAgICBpZiAodGhpcy5naG9zdCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIHRoaXMuZ2hvc3QsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IENsaWVudFJlY3Qgb2YgY3VycmVudCBSYW5nZSBhY2NvcmRpbmcgdG8gcHJvdmlkZWQgcG9zaXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCByYW5nZVJlY3QoKTogQ2xpZW50UmVjdCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgY2FzZSBUdWlEcm9wZG93blBvc2l0aW9uLlRhZzpcbiAgICAgICAgICAgICAgICBjb25zdCB7Y29tbW9uQW5jZXN0b3JDb250YWluZXJ9ID0gdGhpcy5yYW5nZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3JDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjYXNlIFR1aURyb3Bkb3duUG9zaXRpb24uV29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V29yZFJhbmdlKHRoaXMucmFuZ2UpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBkcm9wZG93biB2aXNpYmlsaXR5IChoYXMgdG8gYmUgaW4gbmdab25lLnJ1biBiZWNhdXNlIGl0IGNvdWxkIGJlIGluaXRpYXRlZCBpbnNpZGUgaWZyYW1lIGluIEVkaXRvcilcbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZURyb3Bkb3duQm94KHZpc2libGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd25Cb3goKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duQm94KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIE5vZGUgaXMgaW5zaWRlIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHJpdmF0ZSBib3hDb250YWlucyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMuZHJvcGRvd25Cb3hSZWYgJiZcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Cb3hSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhub2RlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGdpdmVuIHJhbmdlIGlzIGF0IGxlYXNldCBwYXJ0aWFsbHkgaW5zaWRlIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbkRyb3Bkb3duKHJhbmdlOiBSYW5nZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7c3RhcnRDb250YWluZXIsIGVuZENvbnRhaW5lcn0gPSByYW5nZTtcbiAgICAgICAgY29uc3QgaW5Ecm9wZG93biA9IHRoaXMuYm94Q29udGFpbnMocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpO1xuICAgICAgICBjb25zdCBob3N0VG9Ecm9wZG93biA9XG4gICAgICAgICAgICB0aGlzLmJveENvbnRhaW5zKGVuZENvbnRhaW5lcikgJiZcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHN0YXJ0Q29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25Ub0hvc3QgPVxuICAgICAgICAgICAgdGhpcy5ib3hDb250YWlucyhzdGFydENvbnRhaW5lcikgJiZcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGVuZENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuIGluRHJvcGRvd24gfHwgaG9zdFRvRHJvcGRvd24gfHwgZHJvcGRvd25Ub0hvc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gaW52aXNpYmxlIERJViBhbmQgY3JlYXRlIFJhbmdlIHNpbWlsYXIgdG8gc2VsZWN0ZWQgcmFuZ2UgaW5zaWRlIGlucHV0L3RleHRhcmVhXG4gICAgICovXG4gICAgcHJpdmF0ZSB2ZXJ5VmVyeVNhZElucHV0Rml4KGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogUmFuZ2Uge1xuICAgICAgICBjb25zdCB7Z2hvc3QgPSB0aGlzLmluaXRHaG9zdChlbGVtZW50KX0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7dG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0fSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kb2N1bWVudFJlZi5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBob3N0UmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGdob3N0LnN0eWxlLnRvcCA9IHB4KHRvcCAtIGhvc3RSZWN0LnRvcCk7XG4gICAgICAgIGdob3N0LnN0eWxlLmxlZnQgPSBweChsZWZ0IC0gaG9zdFJlY3QubGVmdCk7XG4gICAgICAgIGdob3N0LnN0eWxlLndpZHRoID0gcHgod2lkdGgpO1xuICAgICAgICBnaG9zdC5zdHlsZS5oZWlnaHQgPSBweChoZWlnaHQpO1xuICAgICAgICBnaG9zdC50ZXh0Q29udGVudCA9IENIQVJfWkVST19XSURUSF9TUEFDRSArIGVsZW1lbnQudmFsdWUgKyBDSEFSX05PX0JSRUFLX1NQQUNFO1xuXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGdob3N0LmZpcnN0Q2hpbGQhLCBzZWxlY3Rpb25TdGFydCB8fCAwKTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGdob3N0LmZpcnN0Q2hpbGQhLCBzZWxlY3Rpb25FbmQgfHwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnZpc2libGUgRElWIHN0eWxlZCBleGFjdGx5IGxpa2UgaW5wdXQvdGV4dGFyZWEgZWxlbWVudCBpbnNpZGUgZGlyZWN0aXZlXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0R2hvc3QoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGdob3N0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3Qge25hdGl2ZUVsZW1lbnR9ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHtmb250LCBsZXR0ZXJTcGFjaW5nLCB0ZXh0VHJhbnNmb3JtLCBwYWRkaW5nfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICAgICAgZ2hvc3Quc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBnaG9zdC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICBnaG9zdC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICBnaG9zdC5zdHlsZS53aGl0ZVNwYWNlID0gJ3ByZS13cmFwJztcbiAgICAgICAgZ2hvc3Quc3R5bGUuZm9udCA9IGZvbnQ7XG4gICAgICAgIGdob3N0LnN0eWxlLmxldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nO1xuICAgICAgICBnaG9zdC5zdHlsZS50ZXh0VHJhbnNmb3JtID0gdGV4dFRyYW5zZm9ybTtcbiAgICAgICAgZ2hvc3Quc3R5bGUucGFkZGluZyA9IHBhZGRpbmc7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChuYXRpdmVFbGVtZW50LCBnaG9zdCk7XG4gICAgICAgIHRoaXMuZ2hvc3QgPSBnaG9zdDtcblxuICAgICAgICByZXR1cm4gZ2hvc3Q7XG4gICAgfVxufVxuIl19