theme-lib
Version:
This is a simple example Angular Library published to npm.
313 lines • 24 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ComponentFactoryResolver, Directive, ElementRef, Inject, Input, } from '@angular/core';
import { filter, takeWhile } from 'rxjs/operators';
import { createContainer, NbAdjustment, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, } from '../cdk';
import { NbContextMenuComponent } from './context-menu.component';
import { NbMenuService } from '../menu/menu.service';
import { NB_DOCUMENT } from '../../theme.options';
/*
* Full featured context menu directive.
*
* @stacked-example(Showcase, context-menu/context-menu-showcase.component)
*
* Just pass menu items array:
*
* ```html
* <button [nbContextMenu]="items"></button>
* ...
* items = [{ title: 'Profile' }, { title: 'Log out' }];
* ```
* ### Installation
*
* Import `NbContextMenuModule` to your feature module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbContextMenuModule,
* ],
* })
* export class PageModule { }
* ```
* ### Usage
*
* If you want to handle context menu clicks you have to pass `nbContextMenuTag`
* param and register to events using NbMenuService.
* `NbContextMenu` renders plain `NbMenu` inside, so
* you have to work with it just like with `NbMenu` component:
*
* @stacked-example(Menu item click, context-menu/context-menu-click.component)
*
* Context menu has different placements, such as: top, bottom, left and right
* which can be used as following:
*
* ```html
* <button [nbContextMenu]="items" nbContextMenuPlacement="right"></button>
* ```
*
* ```ts
* items = [{ title: 'Profile' }, { title: 'Log out' }];
* ```
*
* By default context menu will try to adjust itself to maximally fit viewport
* and provide the best user experience. It will try to change position of the context menu.
* If you wanna disable this behaviour just set it falsy value.
*
* ```html
* <button [nbContextMenu]="items" nbContextMenuAdjustment="counterclockwise"></button>
* ```
*
* ```ts
* items = [{ title: 'Profile' }, { title: 'Log out' }];
* ```
* */
export class NbContextMenuDirective {
/**
* @param {?} document
* @param {?} menuService
* @param {?} hostRef
* @param {?} positionBuilder
* @param {?} overlay
* @param {?} componentFactoryResolver
*/
constructor(document, menuService, hostRef, positionBuilder, overlay, componentFactoryResolver) {
this.document = document;
this.menuService = menuService;
this.hostRef = hostRef;
this.positionBuilder = positionBuilder;
this.overlay = overlay;
this.componentFactoryResolver = componentFactoryResolver;
/*
* Position will be calculated relatively host element based on the position.
* Can be top, right, bottom and left.
* */
this.position = NbPosition.BOTTOM;
/*
* Container position will be changes automatically based on this strategy if container can't fit view port.
* Set this property to any falsy value if you want to disable automatically adjustment.
* Available values: clockwise, counterclockwise.
* */
this.adjustment = NbAdjustment.CLOCKWISE;
this.alive = true;
this.items = [];
}
/*
* Basic menu items, will be passed to the internal NbMenuComponent.
* */
/**
* @param {?} items
* @return {?}
*/
set setItems(items) {
this.validateItems(items);
this.items = items;
}
;
/**
* @return {?}
*/
ngAfterViewInit() {
this.positionStrategy = this.createPositionStrategy();
this.ref = this.overlay.create({
positionStrategy: this.positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition(),
});
this.triggerStrategy = this.createTriggerStrategy();
this.subscribeOnTriggers();
this.subscribeOnPositionChange();
this.subscribeOnItemClick();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
this.hide();
}
/**
* @return {?}
*/
show() {
this.container = createContainer(this.ref, NbContextMenuComponent, {
position: this.position,
items: this.items,
tag: this.tag,
}, this.componentFactoryResolver);
}
/**
* @return {?}
*/
hide() {
this.ref.detach();
this.container = null;
}
/**
* @return {?}
*/
toggle() {
if (this.ref && this.ref.hasAttached()) {
this.hide();
}
else {
this.show();
}
}
/**
* @protected
* @return {?}
*/
createPositionStrategy() {
return this.positionBuilder
.connectedTo(this.hostRef)
.position(this.position)
.adjustment(this.adjustment);
}
/**
* @protected
* @return {?}
*/
createTriggerStrategy() {
return new NbTriggerStrategyBuilder()
.document(this.document)
.trigger(NbTrigger.CLICK)
.host(this.hostRef.nativeElement)
.container(() => this.container)
.build();
}
/**
* @protected
* @return {?}
*/
subscribeOnPositionChange() {
this.positionStrategy.positionChange
.pipe(takeWhile(() => this.alive))
.subscribe((position) => patch(this.container, { position }));
}
/**
* @protected
* @return {?}
*/
subscribeOnTriggers() {
this.triggerStrategy.show$.pipe(takeWhile(() => this.alive)).subscribe(() => this.show());
this.triggerStrategy.hide$.pipe(takeWhile(() => this.alive)).subscribe(() => this.hide());
}
/*
* NbMenuComponent will crash if don't pass menu items to it.
* So, we just validating them and throw custom obvious error.
* */
/**
* @private
* @param {?} items
* @return {?}
*/
validateItems(items) {
if (!items || !items.length) {
throw Error(`List of menu items expected, but given: ${items}`);
}
}
/**
* @private
* @return {?}
*/
subscribeOnItemClick() {
this.menuService.onItemClick()
.pipe(takeWhile(() => this.alive), filter(({ tag }) => tag === this.tag))
.subscribe(() => this.hide());
}
}
NbContextMenuDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbContextMenu]' },] }
];
/** @nocollapse */
NbContextMenuDirective.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: NbMenuService },
{ type: ElementRef },
{ type: NbPositionBuilderService },
{ type: NbOverlayService },
{ type: ComponentFactoryResolver }
];
NbContextMenuDirective.propDecorators = {
position: [{ type: Input, args: ['nbContextMenuPlacement',] }],
adjustment: [{ type: Input, args: ['nbContextMenuAdjustment',] }],
tag: [{ type: Input, args: ['nbContextMenuTag',] }],
setItems: [{ type: Input, args: ['nbContextMenu',] }]
};
if (false) {
/** @type {?} */
NbContextMenuDirective.prototype.position;
/** @type {?} */
NbContextMenuDirective.prototype.adjustment;
/** @type {?} */
NbContextMenuDirective.prototype.tag;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.ref;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.container;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.positionStrategy;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.triggerStrategy;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.alive;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.items;
/**
* @type {?}
* @protected
*/
NbContextMenuDirective.prototype.document;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.menuService;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.hostRef;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.positionBuilder;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NbContextMenuDirective.prototype.componentFactoryResolver;
/* Skipping unhandled member: ;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFFZixZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsU0FBUyxFQUVULHdCQUF3QixFQUN4QixLQUFLLEdBQ04sTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkRsRCxNQUFNLE9BQU8sc0JBQXNCOzs7Ozs7Ozs7SUF1Q2pDLFlBQTJDLFFBQVEsRUFDL0IsV0FBMEIsRUFDMUIsT0FBbUIsRUFDbkIsZUFBeUMsRUFDekMsT0FBeUIsRUFDekIsd0JBQWtEO1FBTDNCLGFBQVEsR0FBUixRQUFRLENBQUE7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDekIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjs7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TSxTQUFDLFdBQVc7WUFuR1osYUFBYTtZQXJCaEMsVUFBVTtZQWNWLHdCQUF3QjtZQUZ4QixnQkFBZ0I7WUFmaEIsd0JBQXdCOzs7dUJBMEZ2QixLQUFLLFNBQUMsd0JBQXdCO3lCQVE5QixLQUFLLFNBQUMseUJBQXlCO2tCQU0vQixLQUFLLFNBQUMsa0JBQWtCO3VCQU14QixLQUFLLFNBQUMsZUFBZTs7OztJQXBCdEIsMENBQ3lDOztJQU96Qyw0Q0FDa0Q7O0lBS2xELHFDQUNZOzs7OztJQVdaLHFDQUE0Qjs7Ozs7SUFDNUIsMkNBQXVDOzs7OztJQUN2QyxrREFBa0U7Ozs7O0lBQ2xFLGlEQUE2Qzs7Ozs7SUFDN0MsdUNBQWdDOzs7OztJQUNoQyx1Q0FBaUM7Ozs7O0lBRXJCLDBDQUF1Qzs7Ozs7SUFDdkMsNkNBQWtDOzs7OztJQUNsQyx5Q0FBMkI7Ozs7O0lBQzNCLGlEQUFpRDs7Ozs7SUFDakQseUNBQWlDOzs7OztJQUNqQywwREFBMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIGNyZWF0ZUNvbnRhaW5lcixcclxuICBOYkFkanVzdGFibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE5iQWRqdXN0bWVudCxcclxuICBOYk92ZXJsYXlSZWYsXHJcbiAgTmJPdmVybGF5U2VydmljZSxcclxuICBOYlBvc2l0aW9uLFxyXG4gIE5iUG9zaXRpb25CdWlsZGVyU2VydmljZSxcclxuICBOYlRyaWdnZXIsXHJcbiAgTmJUcmlnZ2VyU3RyYXRlZ3ksXHJcbiAgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyLFxyXG4gIHBhdGNoLFxyXG59IGZyb20gJy4uL2Nkayc7XHJcbmltcG9ydCB7IE5iQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYk1lbnVJdGVtLCBOYk1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vbWVudS9tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5cclxuLypcclxuICogRnVsbCBmZWF0dXJlZCBjb250ZXh0IG1lbnUgZGlyZWN0aXZlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCBjb250ZXh0LW1lbnUvY29udGV4dC1tZW51LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogSnVzdCBwYXNzIG1lbnUgaXRlbXMgYXJyYXk6XHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJDb250ZXh0TWVudV09XCJpdGVtc1wiPjwvYnV0dG9uPlxyXG4gKiAuLi5cclxuICogaXRlbXMgPSBbeyB0aXRsZTogJ1Byb2ZpbGUnIH0sIHsgdGl0bGU6ICdMb2cgb3V0JyB9XTtcclxuICogYGBgXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkNvbnRleHRNZW51TW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJDb250ZXh0TWVudU1vZHVsZSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgUGFnZU1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBJZiB5b3Ugd2FudCB0byBoYW5kbGUgY29udGV4dCBtZW51IGNsaWNrcyB5b3UgaGF2ZSB0byBwYXNzIGBuYkNvbnRleHRNZW51VGFnYFxyXG4gKiBwYXJhbSBhbmQgcmVnaXN0ZXIgdG8gZXZlbnRzIHVzaW5nIE5iTWVudVNlcnZpY2UuXHJcbiAqIGBOYkNvbnRleHRNZW51YCByZW5kZXJzIHBsYWluIGBOYk1lbnVgIGluc2lkZSwgc29cclxuICogeW91IGhhdmUgdG8gd29yayB3aXRoIGl0IGp1c3QgbGlrZSB3aXRoIGBOYk1lbnVgIGNvbXBvbmVudDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShNZW51IGl0ZW0gY2xpY2ssIGNvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtY2xpY2suY29tcG9uZW50KVxyXG4gKlxyXG4gKiBDb250ZXh0IG1lbnUgaGFzIGRpZmZlcmVudCBwbGFjZW1lbnRzLCBzdWNoIGFzOiB0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHRcclxuICogd2hpY2ggY2FuIGJlIHVzZWQgYXMgZm9sbG93aW5nOlxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqIDxidXR0b24gW25iQ29udGV4dE1lbnVdPVwiaXRlbXNcIiBuYkNvbnRleHRNZW51UGxhY2VtZW50PVwicmlnaHRcIj48L2J1dHRvbj5cclxuICogYGBgXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIGl0ZW1zID0gW3sgdGl0bGU6ICdQcm9maWxlJyB9LCB7IHRpdGxlOiAnTG9nIG91dCcgfV07XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IGNvbnRleHQgbWVudSB3aWxsIHRyeSB0byBhZGp1c3QgaXRzZWxmIHRvIG1heGltYWxseSBmaXQgdmlld3BvcnRcclxuICogYW5kIHByb3ZpZGUgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlLiBJdCB3aWxsIHRyeSB0byBjaGFuZ2UgcG9zaXRpb24gb2YgdGhlIGNvbnRleHQgbWVudS5cclxuICogSWYgeW91IHdhbm5hIGRpc2FibGUgdGhpcyBiZWhhdmlvdXIganVzdCBzZXQgaXQgZmFsc3kgdmFsdWUuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJDb250ZXh0TWVudV09XCJpdGVtc1wiIG5iQ29udGV4dE1lbnVBZGp1c3RtZW50PVwiY291bnRlcmNsb2Nrd2lzZVwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogYGBgdHNcclxuICogaXRlbXMgPSBbeyB0aXRsZTogJ1Byb2ZpbGUnIH0sIHsgdGl0bGU6ICdMb2cgb3V0JyB9XTtcclxuICogYGBgXHJcbiAqICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYkNvbnRleHRNZW51XScgfSlcclxuZXhwb3J0IGNsYXNzIE5iQ29udGV4dE1lbnVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvKlxyXG4gICAqIFBvc2l0aW9uIHdpbGwgYmUgY2FsY3VsYXRlZCByZWxhdGl2ZWx5IGhvc3QgZWxlbWVudCBiYXNlZCBvbiB0aGUgcG9zaXRpb24uXHJcbiAgICogQ2FuIGJlIHRvcCwgcmlnaHQsIGJvdHRvbSBhbmQgbGVmdC5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJDb250ZXh0TWVudVBsYWNlbWVudCcpXHJcbiAgcG9zaXRpb246IE5iUG9zaXRpb24gPSBOYlBvc2l0aW9uLkJPVFRPTTtcclxuXHJcbiAgLypcclxuICAgKiBDb250YWluZXIgcG9zaXRpb24gd2lsbCBiZSBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhpcyBzdHJhdGVneSBpZiBjb250YWluZXIgY2FuJ3QgZml0IHZpZXcgcG9ydC5cclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhbnkgZmFsc3kgdmFsdWUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhdXRvbWF0aWNhbGx5IGFkanVzdG1lbnQuXHJcbiAgICogQXZhaWxhYmxlIHZhbHVlczogY2xvY2t3aXNlLCBjb3VudGVyY2xvY2t3aXNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51QWRqdXN0bWVudCcpXHJcbiAgYWRqdXN0bWVudDogTmJBZGp1c3RtZW50ID0gTmJBZGp1c3RtZW50LkNMT0NLV0lTRTtcclxuXHJcbiAgLypcclxuICAgKiBTZXQgTmJNZW51IHRhZywgd2hpY2ggaGVscHMgaWRlbnRpZnkgbWVudSB3aGVuIHdvcmtpbmcgd2l0aCBOYk1lbnVTZXJ2aWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51VGFnJylcclxuICB0YWc6IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBCYXNpYyBtZW51IGl0ZW1zLCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJuYWwgTmJNZW51Q29tcG9uZW50LlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51JylcclxuICBzZXQgc2V0SXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy52YWxpZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgcmVmOiBOYk92ZXJsYXlSZWY7XHJcbiAgcHJvdGVjdGVkIGNvbnRhaW5lcjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHJvdGVjdGVkIHBvc2l0aW9uU3RyYXRlZ3k6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIHRyaWdnZXJTdHJhdGVneTogTmJUcmlnZ2VyU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGl0ZW1zOiBOYk1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChOQl9ET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgbWVudVNlcnZpY2U6IE5iTWVudVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBob3N0UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcG9zaXRpb25CdWlsZGVyOiBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneSA9IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpO1xyXG4gICAgdGhpcy5yZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5wb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneSA9IHRoaXMuY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPblRyaWdnZXJzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZU9uUG9zaXRpb25DaGFuZ2UoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25JdGVtQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjcmVhdGVDb250YWluZXIodGhpcy5yZWYsIE5iQ29udGV4dE1lbnVDb21wb25lbnQsIHtcclxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXHJcbiAgICAgIGl0ZW1zOiB0aGlzLml0ZW1zLFxyXG4gICAgICB0YWc6IHRoaXMudGFnLFxyXG4gICAgfSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMucmVmICYmIHRoaXMucmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5jb25uZWN0ZWRUbyh0aGlzLmhvc3RSZWYpXHJcbiAgICAgIC5wb3NpdGlvbih0aGlzLnBvc2l0aW9uKVxyXG4gICAgICAuYWRqdXN0bWVudCh0aGlzLmFkanVzdG1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcigpXHJcbiAgICAgIC5kb2N1bWVudCh0aGlzLmRvY3VtZW50KVxyXG4gICAgICAudHJpZ2dlcihOYlRyaWdnZXIuQ0xJQ0spXHJcbiAgICAgIC5ob3N0KHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KVxyXG4gICAgICAuY29udGFpbmVyKCgpID0+IHRoaXMuY29udGFpbmVyKVxyXG4gICAgICAuYnVpbGQoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlXHJcbiAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSlcclxuICAgICAgLnN1YnNjcmliZSgocG9zaXRpb246IE5iUG9zaXRpb24pID0+IHBhdGNoKHRoaXMuY29udGFpbmVyLCB7IHBvc2l0aW9uIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblRyaWdnZXJzKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kuc2hvdyQucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneS5oaWRlJC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogTmJNZW51Q29tcG9uZW50IHdpbGwgY3Jhc2ggaWYgZG9uJ3QgcGFzcyBtZW51IGl0ZW1zIHRvIGl0LlxyXG4gICAqIFNvLCB3ZSBqdXN0IHZhbGlkYXRpbmcgdGhlbSBhbmQgdGhyb3cgY3VzdG9tIG9idmlvdXMgZXJyb3IuXHJcbiAgICogKi9cclxuICBwcml2YXRlIHZhbGlkYXRlSXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSkge1xyXG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IEVycm9yKGBMaXN0IG9mIG1lbnUgaXRlbXMgZXhwZWN0ZWQsIGJ1dCBnaXZlbjogJHtpdGVtc31gKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkl0ZW1DbGljaygpIHtcclxuICAgIHRoaXMubWVudVNlcnZpY2Uub25JdGVtQ2xpY2soKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgZmlsdGVyKCh7IHRhZyB9KSA9PiB0YWcgPT09IHRoaXMudGFnKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcbn1cclxuIl19