@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
279 lines • 27.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: dropdown-menu.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Host, HostBinding, HostListener, Renderer2 } from '@angular/core';
import { fromEvent } from 'rxjs';
import { filter } from 'rxjs/operators';
import { animate, AnimationBuilder, style } from '@angular/animations';
import { WindowRef } from '@duoduo-oba/ng-devui/window-ref';
import { DropDownDirective } from './dropdown.directive';
export class DropDownMenuDirective {
/**
* @param {?} dropdown
* @param {?} el
* @param {?} render
* @param {?} windowRef
* @param {?} builder
*/
constructor(dropdown, el, render, windowRef, builder) {
this.dropdown = dropdown;
this.el = el;
this.render = render;
this.windowRef = windowRef;
this.builder = builder;
this.diplay = 'none';
this.tabIndex = -1;
this.addClass = true;
this.keydownEscapeEvent$ = fromEvent(document.body, 'keydown').pipe(
// tslint:disable-next-line: deprecation // ie11不支持code
filter((/**
* @param {?} event
* @return {?}
*/
event => ((/** @type {?} */ (event))).keyCode === 27)));
this.hide = (/**
* @param {?} event
* @return {?}
*/
(event) => {
this.dropdown.toggle();
});
this.dropdown.visibleSubject.subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
if (value !== this.currentValue) {
this.currentValue = value;
if (this.keydownEscapeSub) {
this.keydownEscapeSub.unsubscribe();
}
if (value) {
this.keydownEscapeSub = this.keydownEscapeEvent$.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.hide(event);
}));
}
if (this.dropdown.appendToBody) {
this.render.setStyle(this.el.nativeElement, 'display', 'block');
return;
}
if (this.player) { // 此处保留一个防止点击过快
this.player.destroy();
this.player = undefined;
}
if (value) {
this.render.setStyle(this.el.nativeElement, 'display', 'block');
}
/** @type {?} */
const direction = this.calcPopDirection(value);
/** @type {?} */
const metadata = value ? this.fadeIn(direction) : this.fadeOut(direction);
/** @type {?} */
const factory = this.builder.build(metadata);
this.player = factory.create(this.el.nativeElement);
this.player.play();
this.player.onDone((/**
* @return {?}
*/
() => {
if (!value) {
this.render.setStyle(this.el.nativeElement, 'display', 'none');
}
this.player.destroy();
this.player = undefined;
}));
}
}));
}
/**
* @return {?}
*/
ngOnInit() {
this.dropdown.dropDownMenu = this;
}
/**
* @param {?} value
* @return {?}
*/
calcPopDirection(value) {
/** @type {?} */
const dropdownMenuElement = this.el.nativeElement;
/** @type {?} */
const elementHeight = dropdownMenuElement.offsetHeight;
/** @type {?} */
const bottomDistance = this.windowRef.innerHeight - this.dropdown.el.nativeElement.getBoundingClientRect().bottom;
/** @type {?} */
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';
}
}
}
/**
* @param {?} event
* @return {?}
*/
mouseLeave(event) {
event.stopPropagation();
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((/**
* @param {?} children
* @return {?}
*/
children => children.menuEl !== this.el
&& children.menuEl.nativeElement.parentElement
&& children.menuEl.nativeElement.parentElement.contains(event.relatedTarget)))) {
return;
}
else {
if (this.dropdown.trigger === 'hover') {
this.dropdown.simulateEventDispatch(event);
}
else {
/** @type {?} */
const relatedTarget = event['originEvent'] && event['originEvent'].relatedTarget;
if (relatedTarget && (this.dropdown.toggleEl.nativeElement.contains(relatedTarget)
|| this.dropdown.dropdownChildren.some((/**
* @param {?} children
* @return {?}
*/
children => children.menuEl.nativeElement.contains(relatedTarget))))) {
return;
}
this.dropdown.isOpen = false;
}
}
}
return false;
}
/**
* @private
* @param {?} direction
* @return {?}
*/
fadeIn(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'translateZ(0) scaleY(0)', opacity: 0, transformOrigin: '0% 100%' }),
animate('200ms cubic-bezier(0.23, 1, 0.32, 1)', style({ transform: 'translateZ(0) scaleY(1)', opacity: 1, transformOrigin: '0% 100%' })),
];
case 'bottom':
default:
return [
style({ transform: 'translateZ(0) scaleY(0)', opacity: 0, transformOrigin: '0% 0%' }),
animate('200ms cubic-bezier(0.23, 1, 0.32, 1)', style({ transform: 'translateZ(0) scaleY(1)', opacity: 1, transformOrigin: '0% 0%' })),
];
}
}
/**
* @private
* @param {?} direction
* @return {?}
*/
fadeOut(direction) {
switch (direction) {
case 'top':
return [
style({ transform: 'translateZ(0) scaleY(1)', opacity: 1, transformOrigin: '0% 100%' }),
animate('200ms cubic-bezier(0.755, 0.05, 0.855, 0.06)', style({ transform: 'translateZ(0) scaleY(0)', opacity: 0, transformOrigin: '0% 100%' }))
];
case 'bottom':
default:
return [
style({ transform: 'translateZ(0) scaleY(1)', opacity: 1, transformOrigin: '0% 0%' }),
animate('200ms cubic-bezier(0.755, 0.05, 0.855, 0.06)', style({ transform: 'translateZ(0) scaleY(0)', opacity: 0, transformOrigin: '0% 0%' }))
];
}
}
}
DropDownMenuDirective.decorators = [
{ type: Directive, args: [{
selector: '[dDropDownMenu]',
exportAs: 'd-dropdown-menu',
},] }
];
/** @nocollapse */
DropDownMenuDirective.ctorParameters = () => [
{ type: DropDownDirective, decorators: [{ type: Host }] },
{ type: ElementRef },
{ type: Renderer2 },
{ type: WindowRef },
{ type: AnimationBuilder }
];
DropDownMenuDirective.propDecorators = {
diplay: [{ type: HostBinding, args: ['style.display',] }],
tabIndex: [{ type: HostBinding, args: ['attr.tabIndex',] }],
addClass: [{ type: HostBinding, args: ['class.devui-dropdown-menu',] }],
mouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }]
};
if (false) {
/** @type {?} */
DropDownMenuDirective.prototype.player;
/** @type {?} */
DropDownMenuDirective.prototype.diplay;
/** @type {?} */
DropDownMenuDirective.prototype.tabIndex;
/** @type {?} */
DropDownMenuDirective.prototype.addClass;
/** @type {?} */
DropDownMenuDirective.prototype.keydownEscapeEvent$;
/** @type {?} */
DropDownMenuDirective.prototype.keydownEscapeSub;
/** @type {?} */
DropDownMenuDirective.prototype.popDirectionCache;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.currentValue;
/** @type {?} */
DropDownMenuDirective.prototype.hide;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.dropdown;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.el;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.render;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.windowRef;
/**
* @type {?}
* @private
*/
DropDownMenuDirective.prototype.builder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kcm9wZG93bi8iLCJzb3VyY2VzIjpbImRyb3Bkb3duLW1lbnUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQVUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBQyxTQUFTLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXNDLEtBQUssRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQU12RCxNQUFNLE9BQU8scUJBQXFCOzs7Ozs7OztJQVloQyxZQUE0QixRQUEyQixFQUFVLEVBQWMsRUFBVSxNQUFpQixFQUNsRyxTQUFvQixFQUFVLE9BQXlCO1FBRG5DLGFBQVEsR0FBUixRQUFRLENBQW1CO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDbEcsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBWGpDLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFDaEIsYUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ0YsYUFBUSxHQUFHLElBQUksQ0FBQztRQUMxRCx3QkFBbUIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJO1FBQzVELHVEQUF1RDtRQUN2RCxNQUFNOzs7O1FBQUMsS0FBSyxDQUFDLEVB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LEVBQUUsT0FBTyxFQUFDLENBQUM7b0JBQ25GLE9BQU8sQ0FBQyw4Q0FBOEMsRUFDcEQsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQ3BGO2lCQUNGLENBQUM7U0FDTDtJQUNILENBQUM7OztZQTFKRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0IsUUFBUSxFQUFFLGlCQUFpQjthQUM1Qjs7OztZQUxPLGlCQUFpQix1QkFrQlYsSUFBSTtZQXZCQSxVQUFVO1lBQTJDLFNBQVM7WUFJekUsU0FBUztZQURBLGdCQUFnQjs7O3FCQVU5QixXQUFXLFNBQUMsZUFBZTt1QkFDM0IsV0FBVyxTQUFDLGVBQWU7dUJBQzNCLFdBQVcsU0FBQywyQkFBMkI7eUJBMEV2QyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBN0V0Qyx1Q0FBd0I7O0lBQ3hCLHVDQUE4Qzs7SUFDOUMseUNBQTRDOztJQUM1Qyx5Q0FBMEQ7O0lBQzFELG9EQUdFOztJQUNGLGlEQUErQjs7SUFDL0Isa0RBQW9DOzs7OztJQUNwQyw2Q0FBMEI7O0lBcUgxQixxQ0FFQzs7Ozs7SUF0SFcseUNBQTJDOzs7OztJQUFFLG1DQUFzQjs7Ozs7SUFBRSx1Q0FBeUI7Ozs7O0lBQzFHLDBDQUE0Qjs7Ozs7SUFBRSx3Q0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge2Zyb21FdmVudCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHthbmltYXRlLCBBbmltYXRpb25CdWlsZGVyLCBBbmltYXRpb25NZXRhZGF0YSwgQW5pbWF0aW9uUGxheWVyLCBzdHlsZX0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7V2luZG93UmVmfSBmcm9tICduZy1kZXZ1aS93aW5kb3ctcmVmJztcclxuaW1wb3J0IHtEcm9wRG93bkRpcmVjdGl2ZX0gZnJvbSAnLi9kcm9wZG93bi5kaXJlY3RpdmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZERyb3BEb3duTWVudV0nLFxyXG4gIGV4cG9ydEFzOiAnZC1kcm9wZG93bi1tZW51JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3BEb3duTWVudURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcGxheWVyOiBBbmltYXRpb25QbGF5ZXI7XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5kaXNwbGF5JykgZGlwbGF5ID0gJ25vbmUnO1xyXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJJbmRleCcpIHRhYkluZGV4ID0gLTE7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXZ1aS1kcm9wZG93bi1tZW51JykgYWRkQ2xhc3MgPSB0cnVlO1xyXG4gIGtleWRvd25Fc2NhcGVFdmVudCQgPSBmcm9tRXZlbnQoZG9jdW1lbnQuYm9keSwgJ2tleWRvd24nKS5waXBlKFxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvbiAvLyBpZTEx5LiN5pSv5oyBY29kZVxyXG4gICAgZmlsdGVyKGV2ZW50ID0+ICg8S2V5Ym9hcmRFdmVudD5ldmVudCkua2V5Q29kZSA9PT0gMjcpXHJcbiAgKTtcclxuICBrZXlkb3duRXNjYXBlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcG9wRGlyZWN0aW9uQ2FjaGU6ICd0b3AnIHwgJ2JvdHRvbSc7XHJcbiAgcHJpdmF0ZSBjdXJyZW50VmFsdWU6IGFueTtcclxuICBjb25zdHJ1Y3RvcihASG9zdCgpIHByaXZhdGUgZHJvcGRvd246IERyb3BEb3duRGlyZWN0aXZlLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyLFxyXG4gIHByaXZhdGUgd2luZG93UmVmOiBXaW5kb3dSZWYsIHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcikge1xyXG4gICAgdGhpcy5kcm9wZG93bi52aXNpYmxlU3ViamVjdC5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5rZXlkb3duRXNjYXBlU3ViKSB7XHJcbiAgICAgICAgICB0aGlzLmtleWRvd25Fc2NhcGVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLmtleWRvd25Fc2NhcGVTdWIgPSB0aGlzLmtleWRvd25Fc2NhcGVFdmVudCQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5hcHBlbmRUb0JvZHkpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGxheWVyKSB7IC8vIOatpOWkhOS/neeVmeS4gOS4qumYsuatoueCueWHu+i/h+W/q1xyXG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgdGhpcy5wbGF5ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbGNQb3BEaXJlY3Rpb24odmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdmFsdWUgPyB0aGlzLmZhZGVJbihkaXJlY3Rpb24pIDogdGhpcy5mYWRlT3V0KGRpcmVjdGlvbik7XHJcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuYnVpbGRlci5idWlsZChtZXRhZGF0YSk7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcclxuICAgICAgICB0aGlzLnBsYXllci5vbkRvbmUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGxheWVyLmRlc3Ryb3koKTtcclxuICAgICAgICAgIHRoaXMucGxheWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5kcm9wZG93bi5kcm9wRG93bk1lbnUgPSB0aGlzO1xyXG4gIH1cclxuXHJcbiAgY2FsY1BvcERpcmVjdGlvbih2YWx1ZSkge1xyXG4gICAgY29uc3QgZHJvcGRvd25NZW51RWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBkcm9wZG93bk1lbnVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIGNvbnN0IGJvdHRvbURpc3RhbmNlID0gdGhpcy53aW5kb3dSZWYuaW5uZXJIZWlnaHQgLSB0aGlzLmRyb3Bkb3duLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO1xyXG4gICAgY29uc3QgaXNCb3R0b21Fbm91Z2ggPSBib3R0b21EaXN0YW5jZSA+PSBlbGVtZW50SGVpZ2h0O1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3BEaXJlY3Rpb25DYWNoZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghaXNCb3R0b21Fbm91Z2gpIHtcclxuICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShkcm9wZG93bk1lbnVFbGVtZW50LCAnYm90dG9tJywgJzEwMCUnKTtcclxuICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShkcm9wZG93bk1lbnVFbGVtZW50LCAndG9wJywgJ2F1dG8nKTtcclxuICAgICAgICB0aGlzLnBvcERpcmVjdGlvbkNhY2hlID0gJ3RvcCc7XHJcbiAgICAgICAgcmV0dXJuICd0b3AnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyLnJlbW92ZVN0eWxlKGRyb3Bkb3duTWVudUVsZW1lbnQsICdib3R0b20nKTtcclxuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShkcm9wZG93bk1lbnVFbGVtZW50LCAndG9wJyk7XHJcbiAgICAgICAgdGhpcy5wb3BEaXJlY3Rpb25DYWNoZSA9ICdib3R0b20nO1xyXG4gICAgICAgIHJldHVybiAnYm90dG9tJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIG1vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCh0aGlzLmRyb3Bkb3duLmFwcGVuZFRvQm9keSAmJiB0aGlzLmRyb3Bkb3duLnRyaWdnZXIgPT09ICdob3ZlcicpXHJcbiAgICB8fCAodGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnY2xpY2snICYmIHRoaXMuZHJvcGRvd24uY2xvc2VPbk1vdXNlTGVhdmVNZW51KSkge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd24udG9nZ2xlRWwubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxyXG4gICAgICB8fCB0aGlzLmRyb3Bkb3duLmRyb3Bkb3duQ2hpbGRyZW4uc29tZShcclxuICAgICAgICBjaGlsZHJlbiA9PlxyXG4gICAgICAgICAgY2hpbGRyZW4ubWVudUVsICE9PSB0aGlzLmVsXHJcbiAgICAgICAgICAmJiBjaGlsZHJlbi5tZW51RWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAmJiBjaGlsZHJlbi5tZW51RWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bi50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bi5zaW11bGF0ZUV2ZW50RGlzcGF0Y2goZXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudFsnb3JpZ2luRXZlbnQnXSAmJuOAgGV2ZW50WydvcmlnaW5FdmVudCddLnJlbGF0ZWRUYXJnZXQ7XHJcbiAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXQgJiYgKFxyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLnRvZ2dsZUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgfHwgdGhpcy5kcm9wZG93bi5kcm9wZG93bkNoaWxkcmVuLnNvbWUoY2hpbGRyZW4gPT4gY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpXHJcbiAgICAgICAgICApKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHJvcGRvd24uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZhZGVJbihkaXJlY3Rpb24pOiBBbmltYXRpb25NZXRhZGF0YVtdIHtcclxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVaKDApIHNjYWxlWSgwKScsIG9wYWNpdHk6IDAsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDEwMCUnfSksXHJcbiAgICAgICAgICBhbmltYXRlKCcyMDBtcyBjdWJpYy1iZXppZXIoMC4yMywgMSwgMC4zMiwgMSknLFxyXG4gICAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWigwKSBzY2FsZVkoMSknLCBvcGFjaXR5OiAxLCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJ30pXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgIF07XHJcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVaKDApIHNjYWxlWSgwKScsIG9wYWNpdHk6IDAsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJ30pLFxyXG4gICAgICAgICAgYW5pbWF0ZSgnMjAwbXMgY3ViaWMtYmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpJyxcclxuICAgICAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVooMCkgc2NhbGVZKDEpJywgb3BhY2l0eTogMSwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnfSlcclxuICAgICAgICAgICksXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlID0gKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5kcm9wZG93bi50b2dnbGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmFkZU91dChkaXJlY3Rpb24pOiBBbmltYXRpb25NZXRhZGF0YVtdIHtcclxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVaKDApIHNjYWxlWSgxKScsIG9wYWNpdHk6IDEsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDEwMCUnfSksXHJcbiAgICAgICAgICBhbmltYXRlKCcyMDBtcyBjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KScsXHJcbiAgICAgICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVaKDApIHNjYWxlWSgwKScsIG9wYWNpdHk6IDAsIHRyYW5zZm9ybU9yaWdpbjogJzAlIDEwMCUnfSlcclxuICAgICAgICAgIClcclxuICAgICAgICBdO1xyXG4gICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWigwKSBzY2FsZVkoMSknLCBvcGFjaXR5OiAxLCB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJSd9KSxcclxuICAgICAgICAgIGFuaW1hdGUoJzIwMG1zIGN1YmljLWJlemllcigwLjc1NSwgMC4wNSwgMC44NTUsIDAuMDYpJyxcclxuICAgICAgICAgICAgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVooMCkgc2NhbGVZKDApJywgb3BhY2l0eTogMCwgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnfSlcclxuICAgICAgICAgIClcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=