theme-lib
Version:
This is a simple example Angular Library published to npm.
354 lines • 31.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ApplicationRef, ComponentFactoryResolver, Directive, Inject, Injectable, Injector, NgModule, NgZone, } from '@angular/core';
import { CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortalOutlet, PortalInjector, PortalModule, TemplatePortal, } from '@angular/cdk/portal';
import { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayPositionBuilder, OverlayRef, ScrollStrategyOptions, } from '@angular/cdk/overlay';
import { Platform } from '@angular/cdk/platform';
import { Directionality } from '@angular/cdk/bidi';
import { NB_DOCUMENT } from '../../../theme.options';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NbPortalDirective extends CdkPortal {
}
NbPortalDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbPortal]' },] }
];
export class NbPortalOutletDirective extends CdkPortalOutlet {
}
NbPortalOutletDirective.decorators = [
{ type: Directive, args: [{ selector: '[nbPortalOutlet]' },] }
];
/**
* @template T
*/
export class NbComponentPortal extends ComponentPortal {
/**
* @param {?} component
* @param {?=} vcr
* @param {?=} injector
* @param {?=} cfr
*/
constructor(component, vcr, injector, cfr) {
super(component, vcr, injector);
this.cfr = cfr;
}
}
if (false) {
/** @type {?} */
NbComponentPortal.prototype.cfr;
}
/*
* TODO remove after @angular/cdk@7.0.0 relased
* */
export class NbDomPortalOutlet extends DomPortalOutlet {
/**
* @param {?} outletElement
* @param {?} componentFactoryResolver
* @param {?} appRef
* @param {?} defaultInjector
*/
constructor(outletElement, componentFactoryResolver, appRef, defaultInjector) {
super(outletElement, componentFactoryResolver, appRef, defaultInjector);
this.outletElement = outletElement;
this.componentFactoryResolver = componentFactoryResolver;
this.appRef = appRef;
this.defaultInjector = defaultInjector;
}
/*
* Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver.
* @param portal Portal to be attached
* @returns Reference to the created component.
*/
/**
* @template T
* @param {?} portal
* @return {?}
*/
attachComponentPortal(portal) {
/** @type {?} */
const resolver = portal.cfr || this.componentFactoryResolver;
/** @type {?} */
const componentFactory = resolver.resolveComponentFactory(portal.component);
/** @type {?} */
let componentRef;
// If the portal specifies a ViewContainerRef, we will use that as the attachment point
// for the component (in terms of Angular's component tree, not rendering).
// When the ViewContainerRef is missing, we use the factory to create the component directly
// and then manually attach the view to the application.
if (portal.viewContainerRef) {
componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector);
this.setDisposeFn(() => componentRef.destroy());
}
else {
componentRef = componentFactory.create(portal.injector || this.defaultInjector);
this.appRef.attachView(componentRef.hostView);
this.setDisposeFn(() => {
this.appRef.detachView(componentRef.hostView);
componentRef.destroy();
});
}
// At this point the component has been instantiated, so we move it to the location in the DOM
// where we want it to be rendered.
this.outletElement.appendChild(this.getComponentRootNode(componentRef));
return componentRef;
}
/* Gets the root HTMLElement for an instantiated component. */
/**
* @private
* @param {?} componentRef
* @return {?}
*/
getComponentRootNode(componentRef) {
return (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0]));
}
}
if (false) {
/** @type {?} */
NbDomPortalOutlet.prototype.outletElement;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.appRef;
/**
* @type {?}
* @private
*/
NbDomPortalOutlet.prototype.defaultInjector;
}
export class NbOverlay extends Overlay {
/**
* @param {?} scrollStrategies
* @param {?} overlayContainer
* @param {?} componentFactoryResolver
* @param {?} positionBuilder
* @param {?} keyboardDispatcher
* @param {?} injector
* @param {?} ngZone
* @param {?} document
* @param {?} directionality
*/
constructor(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) {
super(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality);
this.scrollStrategies = scrollStrategies;
this.overlayContainer = overlayContainer;
this.componentFactoryResolver = componentFactoryResolver;
this.positionBuilder = positionBuilder;
this.keyboardDispatcher = keyboardDispatcher;
this.injector = injector;
this.ngZone = ngZone;
this.document = document;
this.directionality = directionality;
}
/*
* Creates an overlay.
* @param config Configuration applied to the overlay.
* @returns Reference to the created overlay.
*/
/**
* @param {?=} config
* @return {?}
*/
create(config) {
/** @type {?} */
const host = this.createHostElement();
/** @type {?} */
const pane = this.createPaneElement(host);
/** @type {?} */
const portalOutlet = this.createPortalOutlet(pane);
/** @type {?} */
const overlayConfig = new OverlayConfig(config);
overlayConfig.direction = overlayConfig.direction || this.directionality.value;
return new OverlayRef(portalOutlet, host, pane, overlayConfig, this.ngZone, this.keyboardDispatcher, this.document);
}
/*
* Creates the DOM element for an overlay and appends it to the overlay container.
* @returns Newly-created pane element
*/
/**
* @protected
* @param {?} host
* @return {?}
*/
createPaneElement(host) {
/** @type {?} */
const pane = this.document.createElement('div');
pane.id = `cdk-overlay-${NbOverlay.nextUniqueId++}`;
pane.classList.add('cdk-overlay-pane');
host.appendChild(pane);
return pane;
}
/*
* Creates the host element that wraps around an overlay
* and can be used for advanced positioning.
* @returns Newly-create host element.
*/
/**
* @protected
* @return {?}
*/
createHostElement() {
/** @type {?} */
const host = this.document.createElement('div');
this.overlayContainer.getContainerElement().appendChild(host);
return host;
}
/*
* Create a DomPortalOutlet into which the overlay content can be loaded.
* @param pane The DOM element to turn into a portal outlet.
* @returns A portal outlet for the given DOM element.
*/
/**
* @protected
* @param {?} pane
* @return {?}
*/
createPortalOutlet(pane) {
// We have to resolve the ApplicationRef later in order to allow people
// to use overlay-based providers during app initialization.
if (!this.appRef) {
this.appRef = this.injector.get(ApplicationRef);
}
return new NbDomPortalOutlet(pane, this.componentFactoryResolver, this.appRef, this.injector);
}
}
NbOverlay.nextUniqueId = 0;
NbOverlay.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbOverlay.ctorParameters = () => [
{ type: ScrollStrategyOptions },
{ type: OverlayContainer },
{ type: ComponentFactoryResolver },
{ type: OverlayPositionBuilder },
{ type: OverlayKeyboardDispatcher },
{ type: Injector },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: Directionality }
];
if (false) {
/**
* @type {?}
* @protected
*/
NbOverlay.nextUniqueId;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.appRef;
/** @type {?} */
NbOverlay.prototype.scrollStrategies;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.overlayContainer;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.componentFactoryResolver;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.positionBuilder;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.keyboardDispatcher;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.injector;
/**
* @type {?}
* @protected
*/
NbOverlay.prototype.ngZone;
/**
* @type {?}
* @private
*/
NbOverlay.prototype.document;
/**
* @type {?}
* @private
*/
NbOverlay.prototype.directionality;
}
export class NbPlatform extends Platform {
}
NbPlatform.decorators = [
{ type: Injectable }
];
export class NbOverlayPositionBuilder extends OverlayPositionBuilder {
}
NbOverlayPositionBuilder.decorators = [
{ type: Injectable }
];
/**
* @template T
*/
export class NbTemplatePortal extends TemplatePortal {
/**
* @param {?} template
* @param {?=} viewContainerRef
* @param {?=} context
*/
constructor(template, viewContainerRef, context) {
super(template, viewContainerRef, context);
}
}
export class NbOverlayContainer extends OverlayContainer {
}
/** @nocollapse */ NbOverlayContainer.ngInjectableDef = i0.defineInjectable({ factory: function NbOverlayContainer_Factory() { return new NbOverlayContainer(i0.inject(i1.DOCUMENT)); }, token: NbOverlayContainer, providedIn: "root" });
export class NbFlexibleConnectedPositionStrategy extends FlexibleConnectedPositionStrategy {
}
export class NbPortalInjector extends PortalInjector {
}
/** @type {?} */
const CDK_MODULES = [OverlayModule, PortalModule];
/*
* This module helps us to keep all angular/cdk deps inside our cdk module via providing aliases.
* Approach will help us move cdk in separate npm package and refactor nebular/theme code.
* */
export class NbCdkMappingModule {
/**
* @return {?}
*/
static forRoot() {
return (/** @type {?} */ ({
ngModule: NbCdkMappingModule,
providers: [
NbOverlay,
NbPlatform,
NbOverlayPositionBuilder,
],
}));
}
}
NbCdkMappingModule.decorators = [
{ type: NgModule, args: [{
imports: [...CDK_MODULES],
exports: [
...CDK_MODULES,
NbPortalDirective,
NbPortalOutletDirective,
],
declarations: [NbPortalDirective, NbPortalOutletDirective],
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L21hcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBRXhCLFNBQVMsRUFFVCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFFUixRQUFRLEVBQ1IsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEVBRWYsY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBS0wsaUNBQWlDLEVBQ2pDLE9BQU8sRUFDUCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFHVixxQkFBcUIsR0FDdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBSXJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxTQUFTOzs7WUFEL0MsU0FBUyxTQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTs7QUFLckMsTUFBTSxPQUFPLHVCQUF3QixTQUFRLGVBQWU7OztZQUQzRCxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7Ozs7O0FBSTNDLE1BQU0sT0FBTyxpQkFBMkIsU0FBUSxlQUFrQjs7Ozs7OztJQUNoRSxZQUFZLFNBQTJCLEVBQzNCLEdBQXNCLEVBQ3RCLFFBQW1CLEVBQ1osR0FBOEI7UUFDL0MsS0FBSyxDQUFDLFNBQVMs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dkMsVUFBVTs7QUFLWCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsc0JBQXNCOzs7WUFEbkUsVUFBVTs7Ozs7QUFJWCxNQUFNLE9BQU8sZ0JBQTBCLFNBQVEsY0FBaUI7Ozs7OztJQUM5RCxZQUFZLFFBQXdCLEVBQUUsZ0JBQW1DLEVBQUUsT0FBVztRQUNwRixLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7OztBQUd4RCxNQUFNLE9BQU8sbUNBQW9DLFNBQVEsaUNBQWlDO0NBQ3pGO0FBRUQsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGNBQWM7Q0FDbkQ7O01BYUssV0FBVyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQzs7Ozs7QUFlakQsTUFBTSxPQUFPLGtCQUFrQjs7OztJQUM3QixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU8sbUJBQXNCO1lBQzNCLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsU0FBUyxFQUFFO2dCQUNULFNBQVM7Z0JBQ1QsVUFBVTtnQkFDVix3QkFBd0I7YUFDekI7U0FDRixFQUFBLENBQUM7SUFDSixDQUFDOzs7WUFuQkYsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUN6QixPQUFPLEVBQUU7b0JBQ1AsR0FBRyxXQUFXO29CQUNkLGlCQUFpQjtvQkFDakIsdUJBQXVCO2lCQUN4QjtnQkFDRCxZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQzthQUMzRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25SZWYsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRW1iZWRkZWRWaWV3UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIE1vZHVsZVdpdGhQcm92aWRlcnMsXHJcbiAgTmdNb2R1bGUsXHJcbiAgTmdab25lLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2RrUG9ydGFsLFxyXG4gIENka1BvcnRhbE91dGxldCxcclxuICBDb21wb25lbnRQb3J0YWwsXHJcbiAgRG9tUG9ydGFsT3V0bGV0LFxyXG4gIFBvcnRhbCxcclxuICBQb3J0YWxJbmplY3RvcixcclxuICBQb3J0YWxNb2R1bGUsXHJcbiAgVGVtcGxhdGVQb3J0YWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50VHlwZSxcclxuICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXHJcbiAgQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5Q29uZmlnLFxyXG4gIE92ZXJsYXlDb250YWluZXIsXHJcbiAgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcixcclxuICBPdmVybGF5TW9kdWxlLFxyXG4gIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgT3ZlcmxheVJlZixcclxuICBQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIFNjcm9sbFN0cmF0ZWd5LFxyXG4gIFNjcm9sbFN0cmF0ZWd5T3B0aW9ucyxcclxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcblxyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcnRhbF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcnRhbE91dGxldF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbE91dGxldERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbE91dGxldCB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkNvbXBvbmVudFBvcnRhbDxUID0gYW55PiBleHRlbmRzIENvbXBvbmVudFBvcnRhbDxUPiB7XHJcbiAgY29uc3RydWN0b3IoY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LFxyXG4gICAgICAgICAgICAgIHZjcj86IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgaW5qZWN0b3I/OiBJbmplY3RvcixcclxuICAgICAgICAgICAgICBwdWJsaWMgY2ZyPzogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnQsIHZjciwgaW5qZWN0b3IpO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVE9ETyByZW1vdmUgYWZ0ZXIgQGFuZ3VsYXIvY2RrQDcuMC4wIHJlbGFzZWRcclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iRG9tUG9ydGFsT3V0bGV0IGV4dGVuZHMgRG9tUG9ydGFsT3V0bGV0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8qIEVsZW1lbnQgaW50byB3aGljaCB0aGUgY29udGVudCBpcyBwcm9qZWN0ZWQuICovXHJcbiAgICBwdWJsaWMgb3V0bGV0RWxlbWVudDogRWxlbWVudCxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIGRlZmF1bHRJbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHN1cGVyKG91dGxldEVsZW1lbnQsIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgYXBwUmVmLCBkZWZhdWx0SW5qZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBBdHRhY2ggdGhlIGdpdmVuIENvbXBvbmVudFBvcnRhbCB0byBET00gZWxlbWVudCB1c2luZyB0aGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLlxyXG4gICAqIEBwYXJhbSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkXHJcbiAgICogQHJldHVybnMgUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBhdHRhY2hDb21wb25lbnRQb3J0YWw8VD4ocG9ydGFsOiBOYkNvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XHJcbiAgICBjb25zdCByZXNvbHZlciA9IHBvcnRhbC5jZnIgfHwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XHJcbiAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gcmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocG9ydGFsLmNvbXBvbmVudCk7XHJcbiAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VD47XHJcblxyXG4gICAgLy8gSWYgdGhlIHBvcnRhbCBzcGVjaWZpZXMgYSBWaWV3Q29udGFpbmVyUmVmLCB3ZSB3aWxsIHVzZSB0aGF0IGFzIHRoZSBhdHRhY2htZW50IHBvaW50XHJcbiAgICAvLyBmb3IgdGhlIGNvbXBvbmVudCAoaW4gdGVybXMgb2YgQW5ndWxhcidzIGNvbXBvbmVudCB0cmVlLCBub3QgcmVuZGVyaW5nKS5cclxuICAgIC8vIFdoZW4gdGhlIFZpZXdDb250YWluZXJSZWYgaXMgbWlzc2luZywgd2UgdXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGRpcmVjdGx5XHJcbiAgICAvLyBhbmQgdGhlbiBtYW51YWxseSBhdHRhY2ggdGhlIHZpZXcgdG8gdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgaWYgKHBvcnRhbC52aWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgIGNvbXBvbmVudFJlZiA9IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChcclxuICAgICAgICBjb21wb25lbnRGYWN0b3J5LFxyXG4gICAgICAgIHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcclxuICAgICAgICBwb3J0YWwuaW5qZWN0b3IgfHwgcG9ydGFsLnZpZXdDb250YWluZXJSZWYucGFyZW50SW5qZWN0b3IpO1xyXG5cclxuICAgICAgdGhpcy5zZXREaXNwb3NlRm4oKCkgPT4gY29tcG9uZW50UmVmLmRlc3Ryb3koKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShwb3J0YWwuaW5qZWN0b3IgfHwgdGhpcy5kZWZhdWx0SW5qZWN0b3IpO1xyXG4gICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgIHRoaXMuc2V0RGlzcG9zZUZuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgICAgY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5zdGFudGlhdGVkLCBzbyB3ZSBtb3ZlIGl0IHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgRE9NXHJcbiAgICAvLyB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgdGhpcy5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmKSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcclxuICB9XHJcblxyXG4gIC8qIEdldHMgdGhlIHJvb3QgSFRNTEVsZW1lbnQgZm9yIGFuIGluc3RhbnRpYXRlZCBjb21wb25lbnQuICovXHJcbiAgcHJpdmF0ZSBnZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5iT3ZlcmxheSBleHRlbmRzIE92ZXJsYXkge1xyXG4gIHByb3RlY3RlZCBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmO1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV4dFVuaXF1ZUlkID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvKiBTY3JvbGxpbmcgc3RyYXRlZ2llcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gb3ZlcmxheS4gKi9cclxuICAgIHB1YmxpYyBzY3JvbGxTdHJhdGVnaWVzOiBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcmxheUNvbnRhaW5lcjogT3ZlcmxheUNvbnRhaW5lcixcclxuICAgIHByb3RlY3RlZCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByb3RlY3RlZCBwb3NpdGlvbkJ1aWxkZXI6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICBwcm90ZWN0ZWQga2V5Ym9hcmREaXNwYXRjaGVyOiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLFxyXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByb3RlY3RlZCBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIEBJbmplY3QoTkJfRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcclxuICAgIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgc2Nyb2xsU3RyYXRlZ2llcyxcclxuICAgICAgb3ZlcmxheUNvbnRhaW5lcixcclxuICAgICAgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgICBwb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgIGtleWJvYXJkRGlzcGF0Y2hlcixcclxuICAgICAgaW5qZWN0b3IsXHJcbiAgICAgIG5nWm9uZSxcclxuICAgICAgZG9jdW1lbnQsXHJcbiAgICAgIGRpcmVjdGlvbmFsaXR5LFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhbiBvdmVybGF5LlxyXG4gICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBvdmVybGF5LlxyXG4gICAqIEByZXR1cm5zIFJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBvdmVybGF5LlxyXG4gICAqL1xyXG4gIGNyZWF0ZShjb25maWc/OiBPdmVybGF5Q29uZmlnKTogT3ZlcmxheVJlZiB7XHJcbiAgICBjb25zdCBob3N0ID0gdGhpcy5jcmVhdGVIb3N0RWxlbWVudCgpO1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuY3JlYXRlUGFuZUVsZW1lbnQoaG9zdCk7XHJcbiAgICBjb25zdCBwb3J0YWxPdXRsZXQgPSB0aGlzLmNyZWF0ZVBvcnRhbE91dGxldChwYW5lKTtcclxuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyhjb25maWcpO1xyXG5cclxuICAgIG92ZXJsYXlDb25maWcuZGlyZWN0aW9uID0gb3ZlcmxheUNvbmZpZy5kaXJlY3Rpb24gfHwgdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gbmV3IE92ZXJsYXlSZWYocG9ydGFsT3V0bGV0LCBob3N0LCBwYW5lLCBvdmVybGF5Q29uZmlnLCB0aGlzLm5nWm9uZSxcclxuICAgICAgdGhpcy5rZXlib2FyZERpc3BhdGNoZXIsIHRoaXMuZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIHRoZSBET00gZWxlbWVudCBmb3IgYW4gb3ZlcmxheSBhbmQgYXBwZW5kcyBpdCB0byB0aGUgb3ZlcmxheSBjb250YWluZXIuXHJcbiAgICogQHJldHVybnMgTmV3bHktY3JlYXRlZCBwYW5lIGVsZW1lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlUGFuZUVsZW1lbnQoaG9zdDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICBwYW5lLmlkID0gYGNkay1vdmVybGF5LSR7TmJPdmVybGF5Lm5leHRVbmlxdWVJZCsrfWA7XHJcbiAgICBwYW5lLmNsYXNzTGlzdC5hZGQoJ2Nkay1vdmVybGF5LXBhbmUnKTtcclxuICAgIGhvc3QuYXBwZW5kQ2hpbGQocGFuZSk7XHJcblxyXG4gICAgcmV0dXJuIHBhbmU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgdGhlIGhvc3QgZWxlbWVudCB0aGF0IHdyYXBzIGFyb3VuZCBhbiBvdmVybGF5XHJcbiAgICogYW5kIGNhbiBiZSB1c2VkIGZvciBhZHZhbmNlZCBwb3NpdGlvbmluZy5cclxuICAgKiBAcmV0dXJucyBOZXdseS1jcmVhdGUgaG9zdCBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjcmVhdGVIb3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBob3N0ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMub3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KCkuYXBwZW5kQ2hpbGQoaG9zdCk7XHJcbiAgICByZXR1cm4gaG9zdDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlIGEgRG9tUG9ydGFsT3V0bGV0IGludG8gd2hpY2ggdGhlIG92ZXJsYXkgY29udGVudCBjYW4gYmUgbG9hZGVkLlxyXG4gICAqIEBwYXJhbSBwYW5lIFRoZSBET00gZWxlbWVudCB0byB0dXJuIGludG8gYSBwb3J0YWwgb3V0bGV0LlxyXG4gICAqIEByZXR1cm5zIEEgcG9ydGFsIG91dGxldCBmb3IgdGhlIGdpdmVuIERPTSBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3J0YWxPdXRsZXQocGFuZTogSFRNTEVsZW1lbnQpOiBOYkRvbVBvcnRhbE91dGxldCB7XHJcbiAgICAvLyBXZSBoYXZlIHRvIHJlc29sdmUgdGhlIEFwcGxpY2F0aW9uUmVmIGxhdGVyIGluIG9yZGVyIHRvIGFsbG93IHBlb3BsZVxyXG4gICAgLy8gdG8gdXNlIG92ZXJsYXktYmFzZWQgcHJvdmlkZXJzIGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24uXHJcbiAgICBpZiAoIXRoaXMuYXBwUmVmKSB7XHJcbiAgICAgIHRoaXMuYXBwUmVmID0gdGhpcy5pbmplY3Rvci5nZXQ8QXBwbGljYXRpb25SZWY+KEFwcGxpY2F0aW9uUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IE5iRG9tUG9ydGFsT3V0bGV0KHBhbmUsIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCB0aGlzLmFwcFJlZiwgdGhpcy5pbmplY3Rvcik7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlBsYXRmb3JtIGV4dGVuZHMgUGxhdGZvcm0ge1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIgZXh0ZW5kcyBPdmVybGF5UG9zaXRpb25CdWlsZGVyIHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iVGVtcGxhdGVQb3J0YWw8VCA9IGFueT4gZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbDxUPiB7XHJcbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IFRlbXBsYXRlUmVmPFQ+LCB2aWV3Q29udGFpbmVyUmVmPzogVmlld0NvbnRhaW5lclJlZiwgY29udGV4dD86IFQpIHtcclxuICAgIHN1cGVyKHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyUmVmLCBjb250ZXh0KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXlDb250YWluZXIgZXh0ZW5kcyBPdmVybGF5Q29udGFpbmVyIHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IGV4dGVuZHMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iUG9ydGFsSW5qZWN0b3IgZXh0ZW5kcyBQb3J0YWxJbmplY3RvciB7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE5iUG9ydGFsPFQgPSBhbnk+ID0gUG9ydGFsPFQ+O1xyXG5leHBvcnQgdHlwZSBOYk92ZXJsYXlSZWYgPSBPdmVybGF5UmVmO1xyXG5leHBvcnQgdHlwZSBOYkNvbXBvbmVudFR5cGU8VCA9IGFueT4gPSBDb21wb25lbnRUeXBlPFQ+O1xyXG5leHBvcnQgdHlwZSBOYlBvc2l0aW9uU3RyYXRlZ3kgPSBQb3NpdGlvblN0cmF0ZWd5O1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3RlZFBvc2l0aW9uID0gQ29ubmVjdGVkUG9zaXRpb247XHJcbmV4cG9ydCB0eXBlIE5iQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlID0gQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlO1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3Rpb25Qb3NpdGlvblBhaXIgPSBDb25uZWN0aW9uUG9zaXRpb25QYWlyO1xyXG5leHBvcnQgdHlwZSBOYk92ZXJsYXlDb25maWcgPSBPdmVybGF5Q29uZmlnO1xyXG5leHBvcnQgdHlwZSBOYlNjcm9sbFN0cmF0ZWd5T3B0aW9ucyA9IFNjcm9sbFN0cmF0ZWd5T3B0aW9ucztcclxuZXhwb3J0IHR5cGUgTmJTY3JvbGxTdHJhdGVneSA9IFNjcm9sbFN0cmF0ZWd5O1xyXG5cclxuY29uc3QgQ0RLX01PRFVMRVMgPSBbT3ZlcmxheU1vZHVsZSwgUG9ydGFsTW9kdWxlXTtcclxuXHJcbi8qXHJcbiAqIFRoaXMgbW9kdWxlIGhlbHBzIHVzIHRvIGtlZXAgYWxsIGFuZ3VsYXIvY2RrIGRlcHMgaW5zaWRlIG91ciBjZGsgbW9kdWxlIHZpYSBwcm92aWRpbmcgYWxpYXNlcy5cclxuICogQXBwcm9hY2ggd2lsbCBoZWxwIHVzIG1vdmUgY2RrIGluIHNlcGFyYXRlIG5wbSBwYWNrYWdlIGFuZCByZWZhY3RvciBuZWJ1bGFyL3RoZW1lIGNvZGUuXHJcbiAqICovXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogWy4uLkNES19NT0RVTEVTXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICAuLi5DREtfTU9EVUxFUyxcclxuICAgIE5iUG9ydGFsRGlyZWN0aXZlLFxyXG4gICAgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmUsXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtOYlBvcnRhbERpcmVjdGl2ZSwgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJDZGtNYXBwaW5nTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcclxuICAgIHJldHVybiA8TW9kdWxlV2l0aFByb3ZpZGVycz4ge1xyXG4gICAgICBuZ01vZHVsZTogTmJDZGtNYXBwaW5nTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBOYk92ZXJsYXksXHJcbiAgICAgICAgTmJQbGF0Zm9ybSxcclxuICAgICAgICBOYk92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgIF0sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=