UNPKG

ng-devui

Version:

DevUI components based on Angular

207 lines 30.3 kB
import { animate, AnimationBuilder, style } from '@angular/animations'; import { DOCUMENT } from '@angular/common'; import { Directive, ElementRef, Host, HostBinding, HostListener, Inject, Renderer2 } from '@angular/core'; import { AnimationCurves, AnimationDuration } from 'ng-devui/utils'; import { WindowRef } from 'ng-devui/window-ref'; import { fromEvent } from 'rxjs'; import { filter } from 'rxjs/operators'; import { DropDownDirective } from './dropdown.directive'; import * as i0 from "@angular/core"; import * as i1 from "./dropdown.directive"; import * as i2 from "ng-devui/window-ref"; import * as i3 from "@angular/animations"; export class DropDownMenuDirective { constructor(dropdown, el, render, windowRef, builder, doc) { this.dropdown = dropdown; this.el = el; this.render = render; this.windowRef = windowRef; this.builder = builder; this.doc = doc; this.display = 'none'; this.tabIndex = -1; this.addClass = true; this.currentValue = false; this.hide = (event) => { this.dropdown.toggle(); }; this.keydownEscapeEvent$ = fromEvent(this.doc.body, 'keydown').pipe( // chrome 为 Escape , ie 11为Esc filter(event => event.key === 'Escape' || event.key === 'Esc')); } ngOnInit() { this.dropdown.dropDownMenu = this; this.subscription = this.dropdown.visibleSubject.subscribe(value => { if (value !== this.currentValue) { this.currentValue = value; if (this.keydownEscapeSub) { this.keydownEscapeSub.unsubscribe(); } if (value) { this.keydownEscapeSub = this.keydownEscapeEvent$.subscribe(event => { if (event.defaultPrevented) { return; } this.hide(event); }); } if (this.dropdown.appendToBody) { this.render.setStyle(this.el.nativeElement, 'display', 'block'); // 立马生效不等host binding绑定 this.display = 'block'; return; } if (this.player) { // 此处保留一个防止点击过快 this.player.finish(); } if (this.dropdown.showAnimation) { const direction = this.calcPopDirection(value); const metadata = value ? this.fadeIn(direction) : this.fadeOut(direction); const factory = this.builder.build(metadata); this.player = factory.create(this.el.nativeElement); const player = this.player; this.player.onDone(() => { if (!value) { this.render.setStyle(this.el.nativeElement, 'display', 'none'); this.display = 'none'; } player.destroy(); if (this.player === player) { this.player = undefined; } }); this.player.onStart(() => { if (value) { this.render.setStyle(this.el.nativeElement, 'display', 'block'); this.display = 'block'; } }); this.player.play(); } else { this.render.setStyle(this.el.nativeElement, 'display', value ? 'block' : 'none'); this.display = value ? 'block' : 'none'; } } }); } ngOnDestroy() { if (this.keydownEscapeSub) { this.keydownEscapeSub.unsubscribe(); } if (this.subscription) { this.subscription.unsubscribe(); } } calcPopDirection(value) { const dropdownMenuElement = this.el.nativeElement; const elementHeight = dropdownMenuElement.offsetHeight; const bottomDistance = this.windowRef.innerHeight - this.dropdown.el.nativeElement.getBoundingClientRect().bottom; const isBottomEnough = bottomDistance >= elementHeight; if (!value) { return this.popDirectionCache; } else { if (!isBottomEnough) { this.render.setStyle(dropdownMenuElement, 'bottom', '100%'); this.render.setStyle(dropdownMenuElement, 'top', 'auto'); this.popDirectionCache = 'top'; return 'top'; } else { this.render.removeStyle(dropdownMenuElement, 'bottom'); this.render.removeStyle(dropdownMenuElement, 'top'); this.popDirectionCache = 'bottom'; return 'bottom'; } } } mouseEnter(event) { this.dropdown.mouseenterFlag = true; } mouseLeave(event) { event.stopPropagation(); this.dropdown.mouseenterFlag = false; if ((this.dropdown.appendToBody && this.dropdown.trigger === 'hover') || (this.dropdown.trigger === 'click' && this.dropdown.closeOnMouseLeaveMenu)) { if (this.dropdown.toggleEl?.nativeElement.contains(event.relatedTarget) || this.dropdown.dropdownChildren.some(children => children.menuEl !== this.el && children.menuEl?.nativeElement.parentElement?.contains(event.relatedTarget))) { return; } else { if (this.dropdown.trigger === 'hover') { this.dropdown.simulateEventDispatch(event); } else { const relatedTarget = event.originEvent?.relatedTarget; if (relatedTarget && (this.dropdown.toggleEl?.nativeElement.contains(relatedTarget) || this.dropdown.dropdownChildren.some(children => children.menuEl?.nativeElement.contains(relatedTarget)))) { return; } this.dropdown.isOpen = false; } } } return false; } fadeIn(direction) { switch (direction) { case 'top': return [ style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%' }), animate(`200ms ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%' })), ]; case 'bottom': default: return [ style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%' }), animate(`200ms ${AnimationCurves.EASE_OUT}`, style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%' })), ]; } } fadeOut(direction) { switch (direction) { case 'top': return [ style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 100%' }), animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(4px)', opacity: 0.8, transformOrigin: '0% 100%' })) ]; case 'bottom': default: return [ style({ transform: 'scaleY(0.9999) translateY(0)', opacity: 1, transformOrigin: '0% 0%' }), animate(`${AnimationDuration.BASE} ${AnimationCurves.EASE_IN}`, style({ transform: 'scaleY(0.8) translateY(-4px)', opacity: 0.8, transformOrigin: '0% 0%' })) ]; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownMenuDirective, deps: [{ token: i1.DropDownDirective, host: true }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.WindowRef }, { token: i3.AnimationBuilder }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DropDownMenuDirective, selector: "[dDropDownMenu]", host: { listeners: { "mouseenter": "mouseEnter($event)", "mouseleave": "mouseLeave($event)" }, properties: { "style.display": "this.display", "attr.tabIndex": "this.tabIndex", "class.devui-dropdown-menu": "this.addClass" } }, exportAs: ["d-dropdown-menu"], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DropDownMenuDirective, decorators: [{ type: Directive, args: [{ selector: '[dDropDownMenu]', exportAs: 'd-dropdown-menu', }] }], ctorParameters: () => [{ type: i1.DropDownDirective, decorators: [{ type: Host }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.WindowRef }, { type: i3.AnimationBuilder }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { display: [{ type: HostBinding, args: ['style.display'] }], tabIndex: [{ type: HostBinding, args: ['attr.tabIndex'] }], addClass: [{ type: HostBinding, args: ['class.devui-dropdown-menu'] }], mouseEnter: [{ type: HostListener, args: ['mouseenter', ['$event']] }], mouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9kcm9wZG93bi9kcm9wZG93bi1tZW51LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFzQyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBTXpELE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFBNEIsUUFBMkIsRUFBVSxFQUFjLEVBQVUsTUFBaUIsRUFDdEYsU0FBb0IsRUFBVSxPQUF5QixFQUE0QixHQUFRO1FBRG5GLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDdEYsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQTRCLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFUakYsWUFBTyxHQUFHLE1BQU0sQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDLENB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QUFRO3NCQUFqRCxXQUFXO3VCQUFDLDJCQUEyQjtnQkFtR2pDLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU0vQixVQUFVO3NCQURoQixZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIEFuaW1hdGlvbkJ1aWxkZXIsIEFuaW1hdGlvbk1ldGFkYXRhLCBBbmltYXRpb25QbGF5ZXIsIHN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0LCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIE9uRGVzdHJveSwgT25Jbml0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uQ3VydmVzLCBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnbmctZGV2dWkvd2luZG93LXJlZic7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRHJvcERvd25EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLmRpcmVjdGl2ZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJvcERvd25NZW51XScsXHJcbiAgZXhwb3J0QXM6ICdkLWRyb3Bkb3duLW1lbnUnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcERvd25NZW51RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHBsYXllcjogQW5pbWF0aW9uUGxheWVyO1xyXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYkluZGV4JykgdGFiSW5kZXggPSAtMTtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWRyb3Bkb3duLW1lbnUnKSBhZGRDbGFzcyA9IHRydWU7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAga2V5ZG93bkVzY2FwZUV2ZW50JDtcclxuICBrZXlkb3duRXNjYXBlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcG9wRGlyZWN0aW9uQ2FjaGU6ICd0b3AnIHwgJ2JvdHRvbSc7XHJcbiAgcHJpdmF0ZSBjdXJyZW50VmFsdWU6IGFueSA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKEBIb3N0KCkgcHJpdmF0ZSBkcm9wZG93bjogRHJvcERvd25EaXJlY3RpdmUsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFdpbmRvd1JlZiwgcHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyLCBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55KSB7XHJcbiAgICB0aGlzLmtleWRvd25Fc2NhcGVFdmVudCQgPSBmcm9tRXZlbnQodGhpcy5kb2MuYm9keSwgJ2tleWRvd24nKS5waXBlKFxyXG4gICAgICAvLyBjaHJvbWUg5Li6IEVzY2FwZSAsIGllIDEx5Li6RXNjXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiAoPEtleWJvYXJkRXZlbnQ+ZXZlbnQpLmtleSA9PT0gJ0VzY2FwZScgfHwgKDxLZXlib2FyZEV2ZW50PmV2ZW50KS5rZXkgPT09ICdFc2MnKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5kcm9wZG93bi5kcm9wRG93bk1lbnUgPSB0aGlzO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmRyb3Bkb3duLnZpc2libGVTdWJqZWN0LnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmtleWRvd25Fc2NhcGVTdWIpIHtcclxuICAgICAgICAgIHRoaXMua2V5ZG93bkVzY2FwZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMua2V5ZG93bkVzY2FwZVN1YiA9IHRoaXMua2V5ZG93bkVzY2FwZUV2ZW50JC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgdGhpcy5oaWRlKGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5hcHBlbmRUb0JvZHkpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTsgLy8g56uL6ams55Sf5pWI5LiN562JaG9zdCBiaW5kaW5n57uR5a6aXHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIpIHsgLy8g5q2k5aSE5L+d55WZ5LiA5Liq6Ziy5q2i54K55Ye76L+H5b+rXHJcbiAgICAgICAgICB0aGlzLnBsYXllci5maW5pc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24uc2hvd0FuaW1hdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5jYWxjUG9wRGlyZWN0aW9uKHZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdmFsdWUgPyB0aGlzLmZhZGVJbihkaXJlY3Rpb24pIDogdGhpcy5mYWRlT3V0KGRpcmVjdGlvbik7XHJcbiAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5idWlsZGVyLmJ1aWxkKG1ldGFkYXRhKTtcclxuICAgICAgICAgIHRoaXMucGxheWVyID0gZmFjdG9yeS5jcmVhdGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMucGxheWVyO1xyXG4gICAgICAgICAgdGhpcy5wbGF5ZXIub25Eb25lKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIgPT09IHBsYXllcikge1xyXG4gICAgICAgICAgICAgIHRoaXMucGxheWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMucGxheWVyLm9uU3RhcnQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnBsYXllci5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCB2YWx1ZSA/ICdibG9jaycgOiAnbm9uZScpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5ID0gdmFsdWUgPyAnYmxvY2snIDogJ25vbmUnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmtleWRvd25Fc2NhcGVTdWIpIHtcclxuICAgICAgdGhpcy5rZXlkb3duRXNjYXBlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNQb3BEaXJlY3Rpb24odmFsdWUpIHtcclxuICAgIGNvbnN0IGRyb3Bkb3duTWVudUVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZHJvcGRvd25NZW51RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBib3R0b21EaXN0YW5jZSA9IHRoaXMud2luZG93UmVmLmlubmVySGVpZ2h0IC0gdGhpcy5kcm9wZG93bi5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgIGNvbnN0IGlzQm90dG9tRW5vdWdoID0gYm90dG9tRGlzdGFuY2UgPj0gZWxlbWVudEhlaWdodDtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucG9wRGlyZWN0aW9uQ2FjaGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIWlzQm90dG9tRW5vdWdoKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ2JvdHRvbScsICcxMDAlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ3RvcCcsICdhdXRvJyk7XHJcbiAgICAgICAgdGhpcy5wb3BEaXJlY3Rpb25DYWNoZSA9ICd0b3AnO1xyXG4gICAgICAgIHJldHVybiAndG9wJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShkcm9wZG93bk1lbnVFbGVtZW50LCAnYm90dG9tJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlU3R5bGUoZHJvcGRvd25NZW51RWxlbWVudCwgJ3RvcCcpO1xyXG4gICAgICAgIHRoaXMucG9wRGlyZWN0aW9uQ2FjaGUgPSAnYm90dG9tJztcclxuICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBtb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duLm1vdXNlZW50ZXJGbGFnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBtb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZHJvcGRvd24ubW91c2VlbnRlckZsYWcgPSBmYWxzZTtcclxuICAgIGlmICgodGhpcy5kcm9wZG93bi5hcHBlbmRUb0JvZHkgJiYgdGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnaG92ZXInKVxyXG4gICAgICB8fCAodGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnY2xpY2snICYmIHRoaXMuZHJvcGRvd24uY2xvc2VPbk1vdXNlTGVhdmVNZW51KSkge1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bi50b2dnbGVFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxyXG4gICAgICAgIHx8IHRoaXMuZHJvcGRvd24uZHJvcGRvd25DaGlsZHJlbi5zb21lKFxyXG4gICAgICAgICAgY2hpbGRyZW4gPT5cclxuICAgICAgICAgICAgY2hpbGRyZW4ubWVudUVsICE9PSB0aGlzLmVsXHJcbiAgICAgICAgICAgICYmIGNoaWxkcmVuLm1lbnVFbD8ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Py5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24udHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICAgICAgdGhpcy5kcm9wZG93bi5zaW11bGF0ZUV2ZW50RGlzcGF0Y2goZXZlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gKGV2ZW50IGFzIGFueSkub3JpZ2luRXZlbnQ/LnJlbGF0ZWRUYXJnZXQ7XHJcbiAgICAgICAgICBpZiAocmVsYXRlZFRhcmdldCAmJiAoXHJcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlRWw/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgfHwgdGhpcy5kcm9wZG93bi5kcm9wZG93bkNoaWxkcmVuLnNvbWUoY2hpbGRyZW4gPT4gY2hpbGRyZW4ubWVudUVsPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKVxyXG4gICAgICAgICAgKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmYWRlSW4oZGlyZWN0aW9uKTogQW5pbWF0aW9uTWV0YWRhdGFbXSB7XHJcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xyXG4gICAgY2FzZSAndG9wJzpcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgdHJhbnNsYXRlWSg0cHgpJywgb3BhY2l0eTogMC44LCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoYDIwMG1zICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU59YCxcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICdzY2FsZVkoMC45OTk5KSB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSd9KSksXHJcbiAgICAgIF07XHJcbiAgICBjYXNlICdib3R0b20nOlxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgIHRyYW5zbGF0ZVkoLTRweCknLCBvcGFjaXR5OiAwLjgsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoYDIwMG1zICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfT1VUfWAsXHJcbiAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOTk5OSkgIHRyYW5zbGF0ZVkoMCknLCBvcGFjaXR5OiAxLCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSd9KSksXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZSA9IChldmVudDogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKCk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBmYWRlT3V0KGRpcmVjdGlvbik6IEFuaW1hdGlvbk1ldGFkYXRhW10ge1xyXG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlWSgwLjk5OTkpICB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJSd9KSxcclxuICAgICAgICBhbmltYXRlKGAke0FuaW1hdGlvbkR1cmF0aW9uLkJBU0V9ICR7QW5pbWF0aW9uQ3VydmVzLkVBU0VfSU59YCxcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICdzY2FsZVkoMC44KSAgdHJhbnNsYXRlWSg0cHgpJywgb3BhY2l0eTogMC44LCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ30pKVxyXG4gICAgICBdO1xyXG4gICAgY2FzZSAnYm90dG9tJzpcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3NjYWxlWSgwLjk5OTkpICB0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnfSksXHJcbiAgICAgICAgYW5pbWF0ZShgJHtBbmltYXRpb25EdXJhdGlvbi5CQVNFfSAke0FuaW1hdGlvbkN1cnZlcy5FQVNFX0lOfWAsXHJcbiAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAnc2NhbGVZKDAuOCkgIHRyYW5zbGF0ZVkoLTRweCknLCBvcGFjaXR5OiAwLjgsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ30pKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=