UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

290 lines 23.2 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 { takeWhile } from 'rxjs/operators'; import { NbAdjustment, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, createContainer, } from '../cdk'; import { NB_DOCUMENT } from '../../theme.options'; import { NbPopoverComponent } from './popover.component'; /* * Powerful popover directive, which provides the best UX for your users. * * @stacked-example(Showcase, popover/popover-showcase.component) * * Popover can accept different content such as: * TemplateRef * * ```html * <button [nbPopover]="templateRef"></button> * <ng-template #templateRef> * <span>Hello, Popover!</span> * </ng-template> * ``` * ### Installation * * Import `NbPopoverModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbPopoverModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * Custom components * * ```html * <button [nbPopover]="MyPopoverComponent"></button> * ``` * * Both custom components and templateRef popovers can receive *contentContext* property * that will be passed to the content props. * * Primitive types * * ```html * <button nbPopover="Hello, Popover!"></button> * ``` * * Popover has different placements, such as: top, bottom, left, right, start and end * which can be used as following: * * @stacked-example(Placements, popover/popover-placements.component) * * By default popover will try to adjust itself to maximally fit viewport * and provide the best user experience. It will try to change position of the popover container. * If you wanna disable this behaviour just set it falsy value. * * ```html * <button nbPopover="Hello, Popover!" [nbPopoverAdjust]="false"></button> * ``` * * Also popover has some different modes which provides capability show$ and hide$ popover in different ways: * * - Click mode popover shows when a user clicking on the host element and hides when the user clicks * somewhere on the document except popover. * - Hint mode provides capability show$ popover when the user hovers on the host element * and hide$ popover when user hovers out of the host. * - Hover mode works like hint mode with one exception - when the user moves mouse from host element to * the container element popover will not be hidden. * * @stacked-example(Available Modes, popover/popover-modes.component.html) * * @additional-example(Template Ref, popover/popover-template-ref.component) * @additional-example(Custom Component, popover/popover-custom-component.component) * */ export class NbPopoverDirective { /** * @param {?} document * @param {?} hostRef * @param {?} positionBuilder * @param {?} overlay * @param {?} componentFactoryResolver */ constructor(document, hostRef, positionBuilder, overlay, componentFactoryResolver) { this.document = document; this.hostRef = hostRef; this.positionBuilder = positionBuilder; this.overlay = overlay; this.componentFactoryResolver = componentFactoryResolver; /* * Container content context. Will be applied to the rendered component. * */ this.context = {}; /* * Position will be calculated relatively host element based on the position. * Can be top, right, bottom, left, start or end. * */ this.position = NbPosition.TOP; /* * 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; /* * Describes when the container will be shown. * Available options: click, hover and hint * */ this.mode = NbTrigger.CLICK; this.alive = true; } /** * @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(); } /** * @return {?} */ ngOnDestroy() { this.alive = false; this.hide(); } /** * @return {?} */ show() { this.container = createContainer(this.ref, NbPopoverComponent, { position: this.position, content: this.content, context: this.context, cfr: this.componentFactoryResolver, }, 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(this.mode) .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()); } } NbPopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[nbPopover]' },] } ]; /** @nocollapse */ NbPopoverDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: ElementRef }, { type: NbPositionBuilderService }, { type: NbOverlayService }, { type: ComponentFactoryResolver } ]; NbPopoverDirective.propDecorators = { content: [{ type: Input, args: ['nbPopover',] }], context: [{ type: Input, args: ['nbPopoverContext',] }], position: [{ type: Input, args: ['nbPopoverPlacement',] }], adjustment: [{ type: Input, args: ['nbPopoverAdjustment',] }], mode: [{ type: Input, args: ['nbPopoverMode',] }] }; if (false) { /** @type {?} */ NbPopoverDirective.prototype.content; /** @type {?} */ NbPopoverDirective.prototype.context; /** @type {?} */ NbPopoverDirective.prototype.position; /** @type {?} */ NbPopoverDirective.prototype.adjustment; /** @type {?} */ NbPopoverDirective.prototype.mode; /** * @type {?} * @protected */ NbPopoverDirective.prototype.ref; /** * @type {?} * @protected */ NbPopoverDirective.prototype.container; /** * @type {?} * @protected */ NbPopoverDirective.prototype.positionStrategy; /** * @type {?} * @protected */ NbPopoverDirective.prototype.triggerStrategy; /** * @type {?} * @protected */ NbPopoverDirective.prototype.alive; /** * @type {?} * @protected */ NbPopoverDirective.prototype.document; /** * @type {?} * @private */ NbPopoverDirective.prototype.hostRef; /** * @type {?} * @private */ NbPopoverDirective.prototype.positionBuilder; /** * @type {?} * @private */ NbPopoverDirective.prototype.overlay; /** * @type {?} * @private */ NbPopoverDirective.prototype.componentFactoryResolver; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBRUwsWUFBWSxFQUdaLGdCQUFnQixFQUNoQixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFNBQVMsRUFFVCx3QkFBd0IsRUFDeEIsS0FBSyxFQUNMLGVBQWUsR0FDaEIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBFekQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7Ozs7SUEyQzdCLFlBQTJDLFFBQVEsRUFDL0IsT0FBbUIsRUFDbkIsZUFBeUMsRUFDekMsT0FBeUIsRUFDekIsd0JBQWtEO1FBSjNCLGFBQVEsR0FBUixRQUFRLENBQUE7UUFDL0IsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDekIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjs7OztRQWxDdEUsWUFBTyxHQUFXLEVBQUUsQ0FBQzs7Ozs7UUFPckIsYUFBUSxHQUFlLFVBQVUsQ0FBQyxHQUFHLENBQUM7Ozs7OztRQVF0QyxlQUFVLEdBQWlCLFlBQVksQ0FBQyxTQUFTLENBQUM7Ozs7O1FBT2xELFNBQUksR0FBYyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBTXhCLFVBQUssR0FBWSxJQUFJLENBQUM7SUFPaEMsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM3QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3ZDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRTtTQUMzRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFO1lBQzdELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEdBQUcsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1NBQ25DLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQzs7Ozs7SUFFUyxzQkFBc0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsZUFBZTthQUN4QixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Ozs7O0lBRVMscUJBQXFCO1FBQzdCLE9BQU8sSUFBSSx3QkFBd0IsRUFBRTthQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDaEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDL0IsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDOzs7OztJQUVTLHlCQUF5QjtRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYzthQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxRQUFvQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDOzs7OztJQUVTLG1CQUFtQjtRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDOzs7WUFuSEYsU0FBUyxTQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTs7Ozs0Q0E0Q3ZCLE1BQU0sU0FBQyxXQUFXO1lBM0kvQixVQUFVO1lBY1Ysd0JBQXdCO1lBRnhCLGdCQUFnQjtZQWZoQix3QkFBd0I7OztzQkF5R3ZCLEtBQUssU0FBQyxXQUFXO3NCQU1qQixLQUFLLFNBQUMsa0JBQWtCO3VCQU94QixLQUFLLFNBQUMsb0JBQW9CO3lCQVExQixLQUFLLFNBQUMscUJBQXFCO21CQU8zQixLQUFLLFNBQUMsZUFBZTs7OztJQTVCdEIscUNBQzBCOztJQUsxQixxQ0FDcUI7O0lBTXJCLHNDQUNzQzs7SUFPdEMsd0NBQ2tEOztJQU1sRCxrQ0FDa0M7Ozs7O0lBRWxDLGlDQUE0Qjs7Ozs7SUFDNUIsdUNBQXVDOzs7OztJQUN2Qyw4Q0FBa0U7Ozs7O0lBQ2xFLDZDQUE2Qzs7Ozs7SUFDN0MsbUNBQWdDOzs7OztJQUVwQixzQ0FBdUM7Ozs7O0lBQ3ZDLHFDQUEyQjs7Ozs7SUFDM0IsNkNBQWlEOzs7OztJQUNqRCxxQ0FBaUM7Ozs7O0lBQ2pDLHNEQUEwRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgTmJBZGp1c3RtZW50LFxyXG4gIE5iT3ZlcmxheUNvbnRlbnQsXHJcbiAgTmJPdmVybGF5UmVmLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbixcclxuICBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgTmJUcmlnZ2VyLFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcixcclxuICBwYXRjaCxcclxuICBjcmVhdGVDb250YWluZXIsXHJcbn0gZnJvbSAnLi4vY2RrJztcclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgTmJQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi9wb3BvdmVyLmNvbXBvbmVudCc7XHJcblxyXG5cclxuLypcclxuICogUG93ZXJmdWwgcG9wb3ZlciBkaXJlY3RpdmUsIHdoaWNoIHByb3ZpZGVzIHRoZSBiZXN0IFVYIGZvciB5b3VyIHVzZXJzLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCBwb3BvdmVyL3BvcG92ZXItc2hvd2Nhc2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBQb3BvdmVyIGNhbiBhY2NlcHQgZGlmZmVyZW50IGNvbnRlbnQgc3VjaCBhczpcclxuICogVGVtcGxhdGVSZWZcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIFtuYlBvcG92ZXJdPVwidGVtcGxhdGVSZWZcIj48L2J1dHRvbj5cclxuICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj5cclxuICogICA8c3Bhbj5IZWxsbywgUG9wb3ZlciE8L3NwYW4+XHJcbiAqIDwvbmctdGVtcGxhdGU+XHJcbiAqIGBgYFxyXG4gKiAjIyMgSW5zdGFsbGF0aW9uXHJcbiAqXHJcbiAqIEltcG9ydCBgTmJQb3BvdmVyTW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJQb3BvdmVyTW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIEN1c3RvbSBjb21wb25lbnRzXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJQb3BvdmVyXT1cIk15UG9wb3ZlckNvbXBvbmVudFwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogQm90aCBjdXN0b20gY29tcG9uZW50cyBhbmQgdGVtcGxhdGVSZWYgcG9wb3ZlcnMgY2FuIHJlY2VpdmUgKmNvbnRlbnRDb250ZXh0KiBwcm9wZXJ0eVxyXG4gKiB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb250ZW50IHByb3BzLlxyXG4gKlxyXG4gKiBQcmltaXRpdmUgdHlwZXNcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8YnV0dG9uIG5iUG9wb3Zlcj1cIkhlbGxvLCBQb3BvdmVyIVwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogUG9wb3ZlciBoYXMgZGlmZmVyZW50IHBsYWNlbWVudHMsIHN1Y2ggYXM6IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgc3RhcnQgYW5kIGVuZFxyXG4gKiB3aGljaCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dpbmc6XHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoUGxhY2VtZW50cywgcG9wb3Zlci9wb3BvdmVyLXBsYWNlbWVudHMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IHBvcG92ZXIgd2lsbCB0cnkgdG8gYWRqdXN0IGl0c2VsZiB0byBtYXhpbWFsbHkgZml0IHZpZXdwb3J0XHJcbiAqIGFuZCBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZS4gSXQgd2lsbCB0cnkgdG8gY2hhbmdlIHBvc2l0aW9uIG9mIHRoZSBwb3BvdmVyIGNvbnRhaW5lci5cclxuICogSWYgeW91IHdhbm5hIGRpc2FibGUgdGhpcyBiZWhhdmlvdXIganVzdCBzZXQgaXQgZmFsc3kgdmFsdWUuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBuYlBvcG92ZXI9XCJIZWxsbywgUG9wb3ZlciFcIiBbbmJQb3BvdmVyQWRqdXN0XT1cImZhbHNlXCI+PC9idXR0b24+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBBbHNvIHBvcG92ZXIgaGFzIHNvbWUgZGlmZmVyZW50IG1vZGVzIHdoaWNoIHByb3ZpZGVzIGNhcGFiaWxpdHkgc2hvdyQgYW5kIGhpZGUkIHBvcG92ZXIgaW4gZGlmZmVyZW50IHdheXM6XHJcbiAqXHJcbiAqIC0gQ2xpY2sgbW9kZSBwb3BvdmVyIHNob3dzIHdoZW4gYSB1c2VyIGNsaWNraW5nIG9uIHRoZSBob3N0IGVsZW1lbnQgYW5kIGhpZGVzIHdoZW4gdGhlIHVzZXIgY2xpY2tzXHJcbiAqIHNvbWV3aGVyZSBvbiB0aGUgZG9jdW1lbnQgZXhjZXB0IHBvcG92ZXIuXHJcbiAqIC0gSGludCBtb2RlIHByb3ZpZGVzIGNhcGFiaWxpdHkgc2hvdyQgcG9wb3ZlciB3aGVuIHRoZSB1c2VyIGhvdmVycyBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAqIGFuZCBoaWRlJCBwb3BvdmVyIHdoZW4gdXNlciBob3ZlcnMgb3V0IG9mIHRoZSBob3N0LlxyXG4gKiAtIEhvdmVyIG1vZGUgd29ya3MgbGlrZSBoaW50IG1vZGUgd2l0aCBvbmUgZXhjZXB0aW9uIC0gd2hlbiB0aGUgdXNlciBtb3ZlcyBtb3VzZSBmcm9tIGhvc3QgZWxlbWVudCB0b1xyXG4gKiB0aGUgY29udGFpbmVyIGVsZW1lbnQgcG9wb3ZlciB3aWxsIG5vdCBiZSBoaWRkZW4uXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoQXZhaWxhYmxlIE1vZGVzLCBwb3BvdmVyL3BvcG92ZXItbW9kZXMuY29tcG9uZW50Lmh0bWwpXHJcbiAqXHJcbiAqIEBhZGRpdGlvbmFsLWV4YW1wbGUoVGVtcGxhdGUgUmVmLCBwb3BvdmVyL3BvcG92ZXItdGVtcGxhdGUtcmVmLmNvbXBvbmVudClcclxuICogQGFkZGl0aW9uYWwtZXhhbXBsZShDdXN0b20gQ29tcG9uZW50LCBwb3BvdmVyL3BvcG92ZXItY3VzdG9tLWNvbXBvbmVudC5jb21wb25lbnQpXHJcbiAqICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcG92ZXJdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgLypcclxuICAgKiBQb3BvdmVyIGNvbnRlbnQgd2hpY2ggd2lsbCBiZSByZW5kZXJlZCBpbiBOYkFycm93ZWRPdmVybGF5Q29udGFpbmVyQ29tcG9uZW50LlxyXG4gICAqIEF2YWlsYWJsZSBjb250ZW50OiB0ZW1wbGF0ZSByZWYsIGNvbXBvbmVudCBhbmQgYW55IHByaW1pdGl2ZS5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyJylcclxuICBjb250ZW50OiBOYk92ZXJsYXlDb250ZW50O1xyXG5cclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBjb250ZW50IGNvbnRleHQuIFdpbGwgYmUgYXBwbGllZCB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50LlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYlBvcG92ZXJDb250ZXh0JylcclxuICBjb250ZXh0OiBPYmplY3QgPSB7fTtcclxuXHJcbiAgLypcclxuICAgKiBQb3NpdGlvbiB3aWxsIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmVseSBob3N0IGVsZW1lbnQgYmFzZWQgb24gdGhlIHBvc2l0aW9uLlxyXG4gICAqIENhbiBiZSB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0IG9yIGVuZC5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyUGxhY2VtZW50JylcclxuICBwb3NpdGlvbjogTmJQb3NpdGlvbiA9IE5iUG9zaXRpb24uVE9QO1xyXG5cclxuICAvKlxyXG4gICAqIENvbnRhaW5lciBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZXMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGlzIHN0cmF0ZWd5IGlmIGNvbnRhaW5lciBjYW4ndCBmaXQgdmlldyBwb3J0LlxyXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGFueSBmYWxzeSB2YWx1ZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGF1dG9tYXRpY2FsbHkgYWRqdXN0bWVudC5cclxuICAgKiBBdmFpbGFibGUgdmFsdWVzOiBjbG9ja3dpc2UsIGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAgICogKi9cclxuICBASW5wdXQoJ25iUG9wb3ZlckFkanVzdG1lbnQnKVxyXG4gIGFkanVzdG1lbnQ6IE5iQWRqdXN0bWVudCA9IE5iQWRqdXN0bWVudC5DTE9DS1dJU0U7XHJcblxyXG4gIC8qXHJcbiAgICogRGVzY3JpYmVzIHdoZW4gdGhlIGNvbnRhaW5lciB3aWxsIGJlIHNob3duLlxyXG4gICAqIEF2YWlsYWJsZSBvcHRpb25zOiBjbGljaywgaG92ZXIgYW5kIGhpbnRcclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJQb3BvdmVyTW9kZScpXHJcbiAgbW9kZTogTmJUcmlnZ2VyID0gTmJUcmlnZ2VyLkNMSUNLO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVmOiBOYk92ZXJsYXlSZWY7XHJcbiAgcHJvdGVjdGVkIGNvbnRhaW5lcjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHJvdGVjdGVkIHBvc2l0aW9uU3RyYXRlZ3k6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIHRyaWdnZXJTdHJhdGVneTogTmJUcmlnZ2VyU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChOQl9ET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaG9zdFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHBvc2l0aW9uQnVpbGRlcjogTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgb3ZlcmxheTogTmJPdmVybGF5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTtcclxuICAgIHRoaXMucmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlT25UcmlnZ2VycygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY3JlYXRlQ29udGFpbmVyKHRoaXMucmVmLCBOYlBvcG92ZXJDb21wb25lbnQsIHtcclxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXHJcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCxcclxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxyXG4gICAgICBjZnI6IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgfSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMucmVmICYmIHRoaXMucmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5jb25uZWN0ZWRUbyh0aGlzLmhvc3RSZWYpXHJcbiAgICAgIC5wb3NpdGlvbih0aGlzLnBvc2l0aW9uKVxyXG4gICAgICAuYWRqdXN0bWVudCh0aGlzLmFkanVzdG1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcigpXHJcbiAgICAgIC5kb2N1bWVudCh0aGlzLmRvY3VtZW50KVxyXG4gICAgICAudHJpZ2dlcih0aGlzLm1vZGUpXHJcbiAgICAgIC5ob3N0KHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KVxyXG4gICAgICAuY29udGFpbmVyKCgpID0+IHRoaXMuY29udGFpbmVyKVxyXG4gICAgICAuYnVpbGQoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlXHJcbiAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSlcclxuICAgICAgLnN1YnNjcmliZSgocG9zaXRpb246IE5iUG9zaXRpb24pID0+IHBhdGNoKHRoaXMuY29udGFpbmVyLCB7IHBvc2l0aW9uIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblRyaWdnZXJzKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kuc2hvdyQucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneS5oaWRlJC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcbn1cclxuIl19