ng-devui
Version:
DevUI components based on Angular
223 lines • 30 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { DOCUMENT } from '@angular/common';
import { ChangeDetectorRef, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, HostBinding, Inject, Input, Optional, Output, QueryList, SkipSelf, } from '@angular/core';
import { addClassToOrigin, DevConfigService, formWithDropDown, removeClassFromOrigin, WithConfig } from 'ng-devui/utils';
import { fromEvent, merge, ReplaySubject } from 'rxjs';
import { debounceTime, delay, filter, mapTo, tap } from 'rxjs/operators';
import { DropDownService } from './dropdown.service';
import * as i0 from "@angular/core";
import * as i1 from "./dropdown.service";
import * as i2 from "ng-devui/utils";
export class DropDownDirective {
/**
* 控制是否打开dropdown,绑定一个devui-dropdown-open class
*/
set isOpen(value) {
this._isOpen = !!value;
if (this.disabled) {
return;
}
if (this.isOpen) {
this.visibleSubject.next(true);
this.focusToggleElement();
this.dropdownService.open(this);
addClassToOrigin(this.toggleEl);
setTimeout(() => {
this.startAnimation = true;
this.cdr.detectChanges();
});
}
else {
this.startAnimation = false;
this.visibleSubject.next(false);
this.dropdownService.close(this);
removeClassFromOrigin(this.toggleEl);
}
this.toggleEvent.emit(this.isOpen);
}
get isOpen() {
return this._isOpen;
}
set appendToBody(bool) {
this._appendToBody = bool === true;
this.updateCdkConnectedOverlayOrigin();
}
get appendToBody() {
return this._appendToBody;
}
set dropDownMenu(dropdownMenu) {
// init drop down menu
this.menuEl = dropdownMenu.el;
}
set dropDownToggle(dropdownToggle) {
// init toggle element
this.toggleEl = dropdownToggle.el;
this.updateCdkConnectedOverlayOrigin();
}
constructor(dropdownService, cdr, el, devConfigService, parentDropdown, doc) {
this.dropdownService = dropdownService;
this.cdr = cdr;
this.el = el;
this.devConfigService = devConfigService;
this.parentDropdown = parentDropdown;
this.doc = doc;
this.mouseenterFlag = false;
this.startAnimation = false;
this.addClass = true;
this.disabled = false;
this.showAnimation = true;
/**
* dropdown触发方式
*/
this.trigger = 'click';
/**
* 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭
*/
this.closeScope = 'all';
this.closeOnMouseLeaveMenu = false;
this.autofocusToggleElement = true;
this.toggleEvent = new EventEmitter();
this.visibleSubject = new ReplaySubject(1);
this._isOpen = false;
this.document = this.doc;
}
ngOnChanges(changes) {
if (Object.prototype.hasOwnProperty.call(changes, 'trigger')) {
this.handleHoverSubscriptionIfTriggerIsHover();
}
}
ngOnDestroy() {
this.dropdownService.close(this);
this.unsubscribeHoverAction();
}
ngAfterContentInit() {
this.handleHoverSubscriptionIfTriggerIsHover();
}
toggle() {
this.isOpen = !this.isOpen;
return this.isOpen;
}
focusToggleElement() {
if (this.toggleEl && this.autofocusToggleElement) {
this.toggleEl.nativeElement.focus();
}
}
updateCdkConnectedOverlayOrigin() {
if (this.toggleEl && this.appendToBody === true) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(formWithDropDown(this.toggleEl) || this.toggleEl.nativeElement);
}
else {
this.cdkConnectedOverlayOrigin = undefined;
}
}
subscribeHoverAction(observable) {
if (!this.hoverSubscription) {
this.hoverSubscription = observable.pipe(debounceTime(50)).subscribe((isOpen) => {
if (this.mouseenterFlag) {
this.mouseenterFlag = false;
return;
}
if (!this.disabled && this.isOpen !== isOpen) {
this.isOpen = isOpen;
}
});
}
}
unsubscribeHoverAction() {
if (this.hoverSubscription) {
this.hoverSubscription.unsubscribe();
this.hoverSubscription = null;
}
}
handleHoverSubscriptionIfTriggerIsHover() {
if (this.trigger === 'hover') {
const states = merge(fromEvent(this.el.nativeElement, 'mouseenter').pipe(mapTo(true)), fromEvent(this.el.nativeElement, 'mouseleave').pipe(delay(200), filter((event) => {
if (this.isOpen && this.appendToBody === true) {
// 冒泡模拟的relatedTarget, 和作用于dropdown本身event.relatedTarget
// menu(子) -> toggle(父) 冒泡模拟的用于离开菜单的时候判断不判断overlay的div层,即只判断menuEl.nativeElement
// toggle(父) -> menu(子) 离开元素本身的需要判断是否落入了overlay的div层,即只判断menuEl.nativeElement.parentElement
const relatedTarget = event.relatedTarget || (event.originEvent && event.originEvent.relatedTarget);
return !(this.menuEl?.nativeElement && relatedTarget &&
(this.menuEl?.nativeElement.parentElement?.contains(event.relatedTarget)
|| this.menuEl?.nativeElement.parentElement?.parentElement?.contains(event.relatedTarget) // 套了两层div增加判断
|| this.menuEl?.nativeElement.contains(relatedTarget)
|| this.dropdownChildren.some(children => children !== this
// appendToBody的时候可能会没有实例化不在document上需要做判断有没有parentElement
&& (children.menuEl?.nativeElement.parentElement?.contains(event.relatedTarget)
|| children.menuEl?.nativeElement.contains(relatedTarget)))));
}
else {
return true;
}
}), tap((event) => {
if (this.parentDropdown) {
this.simulateEventDispatch(event, this.parentDropdown.el.nativeElement);
}
}), mapTo(false)));
this.subscribeHoverAction(states);
}
else {
this.unsubscribeHoverAction();
}
}
simulateEventDispatch($event, target) {
const event = this.document.createEvent('MouseEvents');
event.initEvent($event.type, true, true);
event.originEvent = $event.originEvent || $event;
if (!target) {
target = this.el.nativeElement;
}
target.dispatchEvent(event);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownDirective, deps: [{ token: i1.DropDownService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i2.DevConfigService }, { token: DropDownDirective, optional: true, skipSelf: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DropDownDirective, selector: "[dDropDown]", inputs: { isOpen: "isOpen", disabled: "disabled", showAnimation: "showAnimation", trigger: "trigger", closeScope: "closeScope", closeOnMouseLeaveMenu: "closeOnMouseLeaveMenu", autofocusToggleElement: "autofocusToggleElement" }, outputs: { toggleEvent: "toggleEvent" }, host: { properties: { "class.devui-dropdown-open": "this.isOpen", "class.devui-dropdown": "this.addClass", "class.devui-dropdown-animation": "this.showAnimation" } }, providers: [DropDownService], queries: [{ propertyName: "dropdownChildren", predicate: i0.forwardRef(() => DropDownDirective), descendants: true }], exportAs: ["d-dropdown"], usesOnChanges: true, ngImport: i0 }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], DropDownDirective.prototype, "showAnimation", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownDirective, decorators: [{
type: Directive,
args: [{
selector: '[dDropDown]',
exportAs: 'd-dropdown',
providers: [DropDownService],
}]
}], ctorParameters: () => [{ type: i1.DropDownService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i2.DevConfigService }, { type: DropDownDirective, decorators: [{
type: Optional
}, {
type: SkipSelf
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { dropdownChildren: [{
type: ContentChildren,
args: [forwardRef(() => DropDownDirective), { descendants: true }]
}], isOpen: [{
type: HostBinding,
args: ['class.devui-dropdown-open']
}, {
type: Input
}], addClass: [{
type: HostBinding,
args: ['class.devui-dropdown']
}], disabled: [{
type: Input
}], showAnimation: [{
type: HostBinding,
args: ['class.devui-dropdown-animation']
}, {
type: Input
}], trigger: [{
type: Input
}], closeScope: [{
type: Input
}], closeOnMouseLeaveMenu: [{
type: Input
}], autofocusToggleElement: [{
type: Input
}], toggleEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZHJvcGRvd24vZHJvcGRvd24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekgsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWMsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU9yRCxNQUFNLE9BQU8saUJBQWlCO0lBRzVCOztPQUVHO0lBQ0gsSUFDYSxNQUFNLENBQUMsS0FBSztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsY0FBYyxDQUFD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MUIsUUFBUTtzQkFBaEIsS0FBSztnQkFFaUIsYUFBYTtzQkFEbkMsV0FBVzt1QkFBQyxnQ0FBZ0M7O3NCQUM1QyxLQUFLO2dCQUlHLE9BQU87c0JBQWYsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka092ZXJsYXlPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgU2tpcFNlbGYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGFkZENsYXNzVG9PcmlnaW4sIERldkNvbmZpZ1NlcnZpY2UsIGZvcm1XaXRoRHJvcERvd24sIHJlbW92ZUNsYXNzRnJvbU9yaWdpbiwgV2l0aENvbmZpZyB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgbWFwVG8sIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRHJvcERvd25TZXJ2aWNlIH0gZnJvbSAnLi9kcm9wZG93bi5zZXJ2aWNlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2REcm9wRG93bl0nLFxyXG4gIGV4cG9ydEFzOiAnZC1kcm9wZG93bicsXHJcbiAgcHJvdmlkZXJzOiBbRHJvcERvd25TZXJ2aWNlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3BEb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBEcm9wRG93bkRpcmVjdGl2ZSksIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgZHJvcGRvd25DaGlsZHJlbjogUXVlcnlMaXN0PERyb3BEb3duRGlyZWN0aXZlPjtcclxuICBwcml2YXRlIGhvdmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgLyoqXHJcbiAgICog5o6n5Yi25piv5ZCm5omT5byAZHJvcGRvd27vvIznu5HlrprkuIDkuKpkZXZ1aS1kcm9wZG93bi1vcGVuIGNsYXNzXHJcbiAgICovXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXZ1aS1kcm9wZG93bi1vcGVuJylcclxuICBASW5wdXQoKSBzZXQgaXNPcGVuKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9pc09wZW4gPSAhIXZhbHVlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMudmlzaWJsZVN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5mb2N1c1RvZ2dsZUVsZW1lbnQoKTtcclxuICAgICAgdGhpcy5kcm9wZG93blNlcnZpY2Uub3Blbih0aGlzKTtcclxuICAgICAgYWRkQ2xhc3NUb09yaWdpbih0aGlzLnRvZ2dsZUVsKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy52aXNpYmxlU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5kcm9wZG93blNlcnZpY2UuY2xvc2UodGhpcyk7XHJcbiAgICAgIHJlbW92ZUNsYXNzRnJvbU9yaWdpbih0aGlzLnRvZ2dsZUVsKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlRXZlbnQuZW1pdCh0aGlzLmlzT3Blbik7XHJcbiAgfVxyXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xyXG4gIH1cclxuICBtb3VzZWVudGVyRmxhZyA9IGZhbHNlO1xyXG4gIHN0YXJ0QW5pbWF0aW9uID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZHJvcGRvd24nKSBhZGRDbGFzcyA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWRyb3Bkb3duLWFuaW1hdGlvbicpXHJcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBzaG93QW5pbWF0aW9uID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBkcm9wZG93buinpuWPkeaWueW8j1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRyaWdnZXI6ICdjbGljaycgfCAnaG92ZXInIHwgJ21hbnVhbGx5JyA9ICdjbGljayc7XHJcbiAgLyoqXHJcbiAgICog5YWz6Zet5Yy65Z+f77yM6buY6K6k54K55Ye76I+c5Y2V6ZO+5o6l5Lmf5Lya5YWz6Zet77yMYmxhbmvngrnlh7vlhbbku5bnqbrnmb3ljLrln5/miY3lhbPpl61cclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVNjb3BlOiAnYWxsJyB8ICdibGFuaycgfCAnbm9uZScgPSAnYWxsJztcclxuICBASW5wdXQoKSBjbG9zZU9uTW91c2VMZWF2ZU1lbnUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhdXRvZm9jdXNUb2dnbGVFbGVtZW50ID0gdHJ1ZTtcclxuICBAT3V0cHV0KCkgdG9nZ2xlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgdmlzaWJsZVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8vIGRyb3AgbWVudSBodG1sXHJcbiAgcHVibGljIG1lbnVFbDogRWxlbWVudFJlZjtcclxuICAvLyBkcm9wIGRvd24gdG9nZ2xlIGVsZW1lbnRcclxuICBwdWJsaWMgdG9nZ2xlRWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBDZGtPdmVybGF5T3JpZ2luO1xyXG5cclxuICBwcml2YXRlIF9hcHBlbmRUb0JvZHk6IGJvb2xlYW47XHJcbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xyXG5cclxuICBwdWJsaWMgc2V0IGFwcGVuZFRvQm9keShib29sOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9hcHBlbmRUb0JvZHkgPSBib29sID09PSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgYXBwZW5kVG9Cb2R5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FwcGVuZFRvQm9keTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZHJvcERvd25NZW51KGRyb3Bkb3duTWVudSkge1xyXG4gICAgLy8gaW5pdCBkcm9wIGRvd24gbWVudVxyXG4gICAgdGhpcy5tZW51RWwgPSBkcm9wZG93bk1lbnUuZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRyb3BEb3duVG9nZ2xlKGRyb3Bkb3duVG9nZ2xlKSB7XHJcbiAgICAvLyBpbml0IHRvZ2dsZSBlbGVtZW50XHJcbiAgICB0aGlzLnRvZ2dsZUVsID0gZHJvcGRvd25Ub2dnbGUuZWw7XHJcbiAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkcm9wZG93blNlcnZpY2U6IERyb3BEb3duU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgZGV2Q29uZmlnU2VydmljZTogRGV2Q29uZmlnU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBwYXJlbnREcm9wZG93bjogRHJvcERvd25EaXJlY3RpdmUsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55XHJcbiAgKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoYW5nZXMsICd0cmlnZ2VyJykpIHtcclxuICAgICAgdGhpcy5oYW5kbGVIb3ZlclN1YnNjcmlwdGlvbklmVHJpZ2dlcklzSG92ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kcm9wZG93blNlcnZpY2UuY2xvc2UodGhpcyk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlSG92ZXJBY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIHRoaXMuaGFuZGxlSG92ZXJTdWJzY3JpcHRpb25JZlRyaWdnZXJJc0hvdmVyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlKCk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgICByZXR1cm4gdGhpcy5pc09wZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNUb2dnbGVFbGVtZW50KCkge1xyXG4gICAgaWYgKHRoaXMudG9nZ2xlRWwgJiYgdGhpcy5hdXRvZm9jdXNUb2dnbGVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRWwubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpIHtcclxuICAgIGlmICh0aGlzLnRvZ2dsZUVsICYmIHRoaXMuYXBwZW5kVG9Cb2R5ID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IG5ldyBDZGtPdmVybGF5T3JpZ2luKGZvcm1XaXRoRHJvcERvd24odGhpcy50b2dnbGVFbCkgfHwgdGhpcy50b2dnbGVFbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUhvdmVyQWN0aW9uKG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ob3ZlclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmhvdmVyU3Vic2NyaXB0aW9uID0gb2JzZXJ2YWJsZS5waXBlKGRlYm91bmNlVGltZSg1MCkpLnN1YnNjcmliZSgoaXNPcGVuKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VlbnRlckZsYWcpIHtcclxuICAgICAgICAgIHRoaXMubW91c2VlbnRlckZsYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMuaXNPcGVuICE9PSBpc09wZW4pIHtcclxuICAgICAgICAgIHRoaXMuaXNPcGVuID0gaXNPcGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuc3Vic2NyaWJlSG92ZXJBY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ob3ZlclN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmhvdmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlSG92ZXJTdWJzY3JpcHRpb25JZlRyaWdnZXJJc0hvdmVyKCkge1xyXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICBjb25zdCBzdGF0ZXM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBtZXJnZShcclxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpLnBpcGUobWFwVG8odHJ1ZSkpLFxyXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykucGlwZShcclxuICAgICAgICAgIGRlbGF5KDIwMCksXHJcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuYXBwZW5kVG9Cb2R5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgLy8g5YaS5rOh5qih5ouf55qEcmVsYXRlZFRhcmdldO+8jCDlkozkvZznlKjkuo5kcm9wZG93buacrOi6q2V2ZW50LnJlbGF0ZWRUYXJnZXRcclxuICAgICAgICAgICAgICAvLyBtZW5177yI5a2Q77yJIC0+IHRvZ2dsZe+8iOeItu+8iSDlhpLms6HmqKHmi5/nmoTnlKjkuo7nprvlvIDoj5zljZXnmoTml7blgJnliKTmlq3kuI3liKTmlq1vdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgICAvLyB0b2dnbGXvvIjniLbvvIkgLT4gbWVude+8iOWtkO+8iSDnprvlvIDlhYPntKDmnKzouqvnmoTpnIDopoHliKTmlq3mmK/lkKbokL3lhaXkuoZvdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5vcmlnaW5FdmVudCAmJiBldmVudC5vcmlnaW5FdmVudC5yZWxhdGVkVGFyZ2V0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gICEodGhpcy5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQgJiYgcmVsYXRlZFRhcmdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAodGhpcy5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudD8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgfHwgdGhpcy5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudD8ucGFyZW50RWxlbWVudD8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkgLy8g5aWX5LqG5Lik5bGCZGl25aKe5Yqg5Yik5patXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMubWVudUVsPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMuZHJvcGRvd25DaGlsZHJlbi5zb21lKFxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiAhPT0gdGhpc1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kVG9Cb2R555qE5pe25YCZ5Y+v6IO95Lya5rKh5pyJ5a6e5L6L5YyW5LiN5ZyoZG9jdW1lbnTkuIrpnIDopoHlgZrliKTmlq3mnInmsqHmnIlwYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAmJiAoY2hpbGRyZW4ubWVudUVsPy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ/LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXHJcbiAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZHJlbi5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpXHJcbiAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudERyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaW11bGF0ZUV2ZW50RGlzcGF0Y2goZXZlbnQsIHRoaXMucGFyZW50RHJvcGRvd24uZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbWFwVG8oZmFsc2UpKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZUhvdmVyQWN0aW9uKHN0YXRlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlSG92ZXJBY3Rpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNpbXVsYXRlRXZlbnREaXNwYXRjaCgkZXZlbnQsIHRhcmdldD8pIHtcclxuICAgIGNvbnN0IGV2ZW50OiBhbnkgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xyXG4gICAgZXZlbnQuaW5pdEV2ZW50KCRldmVudC50eXBlLCB0cnVlLCB0cnVlKTtcclxuICAgIGV2ZW50Lm9yaWdpbkV2ZW50ID0gJGV2ZW50Lm9yaWdpbkV2ZW50IHx8ICRldmVudDtcclxuXHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICB0YXJnZXQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxufVxyXG4iXX0=