UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

369 lines 26.3 kB
/** * @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' }]; * ``` * */ var NbContextMenuDirective = /** @class */ (function () { function NbContextMenuDirective(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 = []; } Object.defineProperty(NbContextMenuDirective.prototype, "setItems", { /* * Basic menu items, will be passed to the internal NbMenuComponent. * */ set: /* * Basic menu items, will be passed to the internal NbMenuComponent. * */ /** * @param {?} items * @return {?} */ function (items) { this.validateItems(items); this.items = items; }, enumerable: true, configurable: true }); ; /** * @return {?} */ NbContextMenuDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { 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 {?} */ NbContextMenuDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.alive = false; this.hide(); }; /** * @return {?} */ NbContextMenuDirective.prototype.show = /** * @return {?} */ function () { this.container = createContainer(this.ref, NbContextMenuComponent, { position: this.position, items: this.items, tag: this.tag, }, this.componentFactoryResolver); }; /** * @return {?} */ NbContextMenuDirective.prototype.hide = /** * @return {?} */ function () { this.ref.detach(); this.container = null; }; /** * @return {?} */ NbContextMenuDirective.prototype.toggle = /** * @return {?} */ function () { if (this.ref && this.ref.hasAttached()) { this.hide(); } else { this.show(); } }; /** * @protected * @return {?} */ NbContextMenuDirective.prototype.createPositionStrategy = /** * @protected * @return {?} */ function () { return this.positionBuilder .connectedTo(this.hostRef) .position(this.position) .adjustment(this.adjustment); }; /** * @protected * @return {?} */ NbContextMenuDirective.prototype.createTriggerStrategy = /** * @protected * @return {?} */ function () { var _this = this; return new NbTriggerStrategyBuilder() .document(this.document) .trigger(NbTrigger.CLICK) .host(this.hostRef.nativeElement) .container(function () { return _this.container; }) .build(); }; /** * @protected * @return {?} */ NbContextMenuDirective.prototype.subscribeOnPositionChange = /** * @protected * @return {?} */ function () { var _this = this; this.positionStrategy.positionChange .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function (position) { return patch(_this.container, { position: position }); }); }; /** * @protected * @return {?} */ NbContextMenuDirective.prototype.subscribeOnTriggers = /** * @protected * @return {?} */ function () { var _this = this; this.triggerStrategy.show$.pipe(takeWhile(function () { return _this.alive; })).subscribe(function () { return _this.show(); }); this.triggerStrategy.hide$.pipe(takeWhile(function () { return _this.alive; })).subscribe(function () { return _this.hide(); }); }; /* * NbMenuComponent will crash if don't pass menu items to it. * So, we just validating them and throw custom obvious error. * */ /* * 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 {?} */ NbContextMenuDirective.prototype.validateItems = /* * 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 {?} */ function (items) { if (!items || !items.length) { throw Error("List of menu items expected, but given: " + items); } }; /** * @private * @return {?} */ NbContextMenuDirective.prototype.subscribeOnItemClick = /** * @private * @return {?} */ function () { var _this = this; this.menuService.onItemClick() .pipe(takeWhile(function () { return _this.alive; }), filter(function (_a) { var tag = _a.tag; return tag === _this.tag; })) .subscribe(function () { return _this.hide(); }); }; NbContextMenuDirective.decorators = [ { type: Directive, args: [{ selector: '[nbContextMenu]' },] } ]; /** @nocollapse */ NbContextMenuDirective.ctorParameters = function () { return [ { 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',] }] }; return NbContextMenuDirective; }()); export { NbContextMenuDirective }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFFZixZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsU0FBUyxFQUVULHdCQUF3QixFQUN4QixLQUFLLEdBQ04sTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMERsRDtJQXdDRSxnQ0FBMkMsUUFBUSxFQUMvQixXQUEwQixFQUMxQixPQUFtQixFQUNuQixlQUF5QyxFQUN6QyxPQUF5QixFQUN6Qix3QkFBa0Q7UUFMM0IsYUFBUSxHQUFSLFFBQVEsQ0FBQTtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUEwQjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCOzs7OztRQXJDdEUsYUFBUSxHQUFlLFVBQVUs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QU87Z0JBQUwsWUFBRztZQUFPLE9BQUEsR0FBRyxLQUFLLEtBQUksQ0FBQyxHQUFHO1FBQWhCLENBQWdCLENBQUMsQ0FDdEM7YUFDQSxTQUFTLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxJQUFJLEVBQUUsRUFBWCxDQUFXLENBQUMsQ0FBQztJQUNsQyxDQUFDOztnQkFuSUYsU0FBUyxTQUFDLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFOzs7O2dEQXdDM0IsTUFBTSxTQUFDLFdBQVc7Z0JBbkdaLGFBQWE7Z0JBckJoQyxVQUFVO2dCQWNWLHdCQUF3QjtnQkFGeEIsZ0JBQWdCO2dCQWZoQix3QkFBd0I7OzsyQkEwRnZCLEtBQUssU0FBQyx3QkFBd0I7NkJBUTlCLEtBQUssU0FBQyx5QkFBeUI7c0JBTS9CLEtBQUssU0FBQyxrQkFBa0I7MkJBTXhCLEtBQUssU0FBQyxlQUFlOztJQXlHeEIsNkJBQUM7Q0FBQSxBQXBJRCxJQW9JQztTQW5JWSxzQkFBc0I7OztJQU1qQywwQ0FDeUM7O0lBT3pDLDRDQUNrRDs7SUFLbEQscUNBQ1k7Ozs7O0lBV1oscUNBQTRCOzs7OztJQUM1QiwyQ0FBdUM7Ozs7O0lBQ3ZDLGtEQUFrRTs7Ozs7SUFDbEUsaURBQTZDOzs7OztJQUM3Qyx1Q0FBZ0M7Ozs7O0lBQ2hDLHVDQUFpQzs7Ozs7SUFFckIsMENBQXVDOzs7OztJQUN2Qyw2Q0FBa0M7Ozs7O0lBQ2xDLHlDQUEyQjs7Ozs7SUFDM0IsaURBQWlEOzs7OztJQUNqRCx5Q0FBaUM7Ozs7O0lBQ2pDLDBEQUEwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgY3JlYXRlQ29udGFpbmVyLFxyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheVJlZixcclxuICBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gIE5iUG9zaXRpb24sXHJcbiAgTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gIE5iVHJpZ2dlcixcclxuICBOYlRyaWdnZXJTdHJhdGVneSxcclxuICBOYlRyaWdnZXJTdHJhdGVneUJ1aWxkZXIsXHJcbiAgcGF0Y2gsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTmJDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29udGV4dC1tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5iTWVudUl0ZW0sIE5iTWVudVNlcnZpY2UgfSBmcm9tICcuLi9tZW51L21lbnUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5CX0RPQ1VNRU5UIH0gZnJvbSAnLi4vLi4vdGhlbWUub3B0aW9ucyc7XHJcblxyXG4vKlxyXG4gKiBGdWxsIGZlYXR1cmVkIGNvbnRleHQgbWVudSBkaXJlY3RpdmUuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2hvd2Nhc2UsIGNvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtc2hvd2Nhc2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBKdXN0IHBhc3MgbWVudSBpdGVtcyBhcnJheTpcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIFtuYkNvbnRleHRNZW51XT1cIml0ZW1zXCI+PC9idXR0b24+XHJcbiAqIC4uLlxyXG4gKiBpdGVtcyA9IFt7IHRpdGxlOiAnUHJvZmlsZScgfSwgeyB0aXRsZTogJ0xvZyBvdXQnIH1dO1xyXG4gKiBgYGBcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iQ29udGV4dE1lbnVNb2R1bGVgIHRvIHlvdXIgZmVhdHVyZSBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYkNvbnRleHRNZW51TW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIElmIHlvdSB3YW50IHRvIGhhbmRsZSBjb250ZXh0IG1lbnUgY2xpY2tzIHlvdSBoYXZlIHRvIHBhc3MgYG5iQ29udGV4dE1lbnVUYWdgXHJcbiAqIHBhcmFtIGFuZCByZWdpc3RlciB0byBldmVudHMgdXNpbmcgTmJNZW51U2VydmljZS5cclxuICogYE5iQ29udGV4dE1lbnVgIHJlbmRlcnMgcGxhaW4gYE5iTWVudWAgaW5zaWRlLCBzb1xyXG4gKiB5b3UgaGF2ZSB0byB3b3JrIHdpdGggaXQganVzdCBsaWtlIHdpdGggYE5iTWVudWAgY29tcG9uZW50OlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKE1lbnUgaXRlbSBjbGljaywgY29udGV4dC1tZW51L2NvbnRleHQtbWVudS1jbGljay5jb21wb25lbnQpXHJcbiAqXHJcbiAqIENvbnRleHQgbWVudSBoYXMgZGlmZmVyZW50IHBsYWNlbWVudHMsIHN1Y2ggYXM6IHRvcCwgYm90dG9tLCBsZWZ0IGFuZCByaWdodFxyXG4gKiB3aGljaCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dpbmc6XHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJDb250ZXh0TWVudV09XCJpdGVtc1wiIG5iQ29udGV4dE1lbnVQbGFjZW1lbnQ9XCJyaWdodFwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogYGBgdHNcclxuICogaXRlbXMgPSBbeyB0aXRsZTogJ1Byb2ZpbGUnIH0sIHsgdGl0bGU6ICdMb2cgb3V0JyB9XTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEJ5IGRlZmF1bHQgY29udGV4dCBtZW51IHdpbGwgdHJ5IHRvIGFkanVzdCBpdHNlbGYgdG8gbWF4aW1hbGx5IGZpdCB2aWV3cG9ydFxyXG4gKiBhbmQgcHJvdmlkZSB0aGUgYmVzdCB1c2VyIGV4cGVyaWVuY2UuIEl0IHdpbGwgdHJ5IHRvIGNoYW5nZSBwb3NpdGlvbiBvZiB0aGUgY29udGV4dCBtZW51LlxyXG4gKiBJZiB5b3Ugd2FubmEgZGlzYWJsZSB0aGlzIGJlaGF2aW91ciBqdXN0IHNldCBpdCBmYWxzeSB2YWx1ZS5cclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIFtuYkNvbnRleHRNZW51XT1cIml0ZW1zXCIgbmJDb250ZXh0TWVudUFkanVzdG1lbnQ9XCJjb3VudGVyY2xvY2t3aXNlXCI+PC9idXR0b24+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBgYGB0c1xyXG4gKiBpdGVtcyA9IFt7IHRpdGxlOiAnUHJvZmlsZScgfSwgeyB0aXRsZTogJ0xvZyBvdXQnIH1dO1xyXG4gKiBgYGBcclxuICogKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25iQ29udGV4dE1lbnVdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJDb250ZXh0TWVudURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qXHJcbiAgICogUG9zaXRpb24gd2lsbCBiZSBjYWxjdWxhdGVkIHJlbGF0aXZlbHkgaG9zdCBlbGVtZW50IGJhc2VkIG9uIHRoZSBwb3NpdGlvbi5cclxuICAgKiBDYW4gYmUgdG9wLCByaWdodCwgYm90dG9tIGFuZCBsZWZ0LlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51UGxhY2VtZW50JylcclxuICBwb3NpdGlvbjogTmJQb3NpdGlvbiA9IE5iUG9zaXRpb24uQk9UVE9NO1xyXG5cclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGlzIHN0cmF0ZWd5IGlmIGNvbnRhaW5lciBjYW4ndCBmaXQgdmlldyBwb3J0LlxyXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGFueSBmYWxzeSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGF1dG9tYXRpY2FsbHkgYWRqdXN0bWVudC5cclxuICAgKiBBdmFpbGFibGUgdmFsdWVzOiBjbG9ja3dpc2UsIGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ25iQ29udGV4dE1lbnVBZGp1c3RtZW50JylcclxuICBhZGp1c3RtZW50OiBOYkFkanVzdG1lbnQgPSBOYkFkanVzdG1lbnQuQ0xPQ0tXSVNFO1xyXG5cclxuICAvKlxyXG4gICAqIFNldCBOYk1lbnUgdGFnLCB3aGljaCBoZWxwcyBpZGVudGlmeSBtZW51IHdoZW4gd29ya2luZyB3aXRoIE5iTWVudVNlcnZpY2UuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ25iQ29udGV4dE1lbnVUYWcnKVxyXG4gIHRhZzogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIEJhc2ljIG1lbnUgaXRlbXMsIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnRlcm5hbCBOYk1lbnVDb21wb25lbnQuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ25iQ29udGV4dE1lbnUnKVxyXG4gIHNldCBzZXRJdGVtcyhpdGVtczogTmJNZW51SXRlbVtdKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRlSXRlbXMoaXRlbXMpO1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCByZWY6IE5iT3ZlcmxheVJlZjtcclxuICBwcm90ZWN0ZWQgY29udGFpbmVyOiBDb21wb25lbnRSZWY8YW55PjtcclxuICBwcm90ZWN0ZWQgcG9zaXRpb25TdHJhdGVneTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcclxuICBwcm90ZWN0ZWQgdHJpZ2dlclN0cmF0ZWd5OiBOYlRyaWdnZXJTdHJhdGVneTtcclxuICBwcm90ZWN0ZWQgYWxpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgaXRlbXM6IE5iTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBtZW51U2VydmljZTogTmJNZW51U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwb3NpdGlvbkJ1aWxkZXI6IE5iUG9zaXRpb25CdWlsZGVyU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIG92ZXJsYXk6IE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk7XHJcbiAgICB0aGlzLnJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLnBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHJpZ2dlclN0cmF0ZWd5ID0gdGhpcy5jcmVhdGVUcmlnZ2VyU3RyYXRlZ3koKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZU9uVHJpZ2dlcnMoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25Qb3NpdGlvbkNoYW5nZSgpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPbkl0ZW1DbGljaygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmFsaXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNyZWF0ZUNvbnRhaW5lcih0aGlzLnJlZiwgTmJDb250ZXh0TWVudUNvbXBvbmVudCwge1xyXG4gICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcclxuICAgICAgaXRlbXM6IHRoaXMuaXRlbXMsXHJcbiAgICAgIHRhZzogdGhpcy50YWcsXHJcbiAgICB9LCB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5yZWYuZGV0YWNoKCk7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICBpZiAodGhpcy5yZWYgJiYgdGhpcy5yZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbkJ1aWxkZXJcclxuICAgICAgLmNvbm5lY3RlZFRvKHRoaXMuaG9zdFJlZilcclxuICAgICAgLnBvc2l0aW9uKHRoaXMucG9zaXRpb24pXHJcbiAgICAgIC5hZGp1c3RtZW50KHRoaXMuYWRqdXN0bWVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk6IE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyKClcclxuICAgICAgLmRvY3VtZW50KHRoaXMuZG9jdW1lbnQpXHJcbiAgICAgIC50cmlnZ2VyKE5iVHJpZ2dlci5DTElDSylcclxuICAgICAgLmhvc3QodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcbiAgICAgIC5jb250YWluZXIoKCkgPT4gdGhpcy5jb250YWluZXIpXHJcbiAgICAgIC5idWlsZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uUG9zaXRpb25DaGFuZ2UoKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VcclxuICAgICAgLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKVxyXG4gICAgICAuc3Vic2NyaWJlKChwb3NpdGlvbjogTmJQb3NpdGlvbikgPT4gcGF0Y2godGhpcy5jb250YWluZXIsIHsgcG9zaXRpb24gfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uVHJpZ2dlcnMoKSB7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneS5zaG93JC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvdygpKTtcclxuICAgIHRoaXMudHJpZ2dlclN0cmF0ZWd5LmhpZGUkLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBOYk1lbnVDb21wb25lbnQgd2lsbCBjcmFzaCBpZiBkb24ndCBwYXNzIG1lbnUgaXRlbXMgdG8gaXQuXHJcbiAgICogU28sIHdlIGp1c3QgdmFsaWRhdGluZyB0aGVtIGFuZCB0aHJvdyBjdXN0b20gb2J2aW91cyBlcnJvci5cclxuICAgKiAqL1xyXG4gIHByaXZhdGUgdmFsaWRhdGVJdGVtcyhpdGVtczogTmJNZW51SXRlbVtdKSB7XHJcbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoYExpc3Qgb2YgbWVudSBpdGVtcyBleHBlY3RlZCwgYnV0IGdpdmVuOiAke2l0ZW1zfWApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU9uSXRlbUNsaWNrKCkge1xyXG4gICAgdGhpcy5tZW51U2VydmljZS5vbkl0ZW1DbGljaygpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKHsgdGFnIH0pID0+IHRhZyA9PT0gdGhpcy50YWcpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xyXG4gIH1cclxufVxyXG4iXX0=