@covalent/core
Version:
Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.
236 lines • 36.9 kB
JavaScript
/* tslint:disable */
import { Directive, Inject, Injectable, InjectFlags, InjectionToken, Injector, Optional, SkipSelf, TemplateRef, Type, } from '@angular/core';
import { Overlay, OverlayConfig, } from '@angular/cdk/overlay';
import { ComponentPortal, TemplatePortal, } from '@angular/cdk/portal';
import { MAT_DIALOG_DATA, MAT_DIALOG_DEFAULT_OPTIONS, } from '@angular/material/dialog';
import { AnimationCurves, AnimationDurations } from '@angular/material/core';
import { CovalentSideSheetContainerComponent, } from './side-sheet-container';
import { Subject, of } from 'rxjs';
import { filter, take } from 'rxjs/operators';
import { Directionality } from '@angular/cdk/bidi';
import { CovalentSideSheetRef } from './side-sheet-ref';
import { SubPageMode, CovalentSideSheetConfig } from './side-sheet.config';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
import * as i2 from "./side-sheet.config";
export class _CovalentSideSheetBase {
_overlay;
_injector;
_defaultOptions;
_parentSideSheet;
_sideSheetRefConstructor;
_sideSheetContainerType;
_sideSheetDataToken;
_openSideSheetsAtThisLevel = [];
_afterAllClosedAtThisLevel = new Subject();
_afterOpenedAtThisLevel = new Subject();
_animationStateSubscriptions;
defaultSidebarConfig = {
minWidth: '400px',
maxWidth: '100vw',
};
constructor(_overlay, _injector, _defaultOptions, _parentSideSheet, _sideSheetRefConstructor, _sideSheetContainerType, _sideSheetDataToken) {
this._overlay = _overlay;
this._injector = _injector;
this._defaultOptions = _defaultOptions;
this._parentSideSheet = _parentSideSheet;
this._sideSheetRefConstructor = _sideSheetRefConstructor;
this._sideSheetContainerType = _sideSheetContainerType;
this._sideSheetDataToken = _sideSheetDataToken;
}
/** Keeps track of the currently-open side-sheets. */
get openSideSheets() {
return this._parentSideSheet
? this._parentSideSheet.openSideSheets
: this._openSideSheetsAtThisLevel;
}
open(componentOrTemplateRef, config) {
config = {
...(this._defaultOptions || new CovalentSideSheetConfig()),
...this.defaultSidebarConfig,
...config,
};
const overlayRef = this._createOverlay(config);
const sideSheetContainer = this._attachSideSheetContainer(overlayRef, config);
const sideSheetRef = this._attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config);
const prevSideSheetRef = this.openSideSheets.slice(-1)[0];
const prevOverlayRef = prevSideSheetRef?.overlayRef;
if (prevOverlayRef?.overlayElement &&
config.subPageMode !== SubPageMode.none) {
prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.COMPLEX} ${AnimationCurves.DECELERATION_CURVE}`;
if (config.subPageMode === SubPageMode.pushed) {
// Animate previous side sheet to full width
prevOverlayRef.overlayElement.style.minWidth = `${window.innerWidth}px`;
}
else if (config.subPageMode === SubPageMode.shifted) {
// Animate previous side sheet to current sidesheet width + 200px
prevOverlayRef.overlayElement.style.minWidth = `${sideSheetRef.overlayRef.overlayElement.offsetWidth + 200}px`;
}
}
// Revert the previous side sheet config & size
sideSheetRef._containerInstance._animationStateChanged
.pipe(filter((event) => event.state === 'closing' && !!(prevSideSheetRef && prevOverlayRef)), take(1))
.subscribe(() => {
prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.EXITING} ${AnimationCurves.DECELERATION_CURVE}`;
prevSideSheetRef.updateSize();
});
// Add new side sheet to open list
this.openSideSheets.push(sideSheetRef);
// Remove side sheet ref after closed
sideSheetRef
.afterClosed()
.pipe(take(1))
.subscribe(() => this._removeOpenSideSheet(sideSheetRef));
// Notify the side-sheet container that the content has been attached.
sideSheetContainer._initializeWithAttachedContent();
return sideSheetRef;
}
ngOnDestroy() {
// Only close the side-sheets at this level on destroy
// since the parent service may still be active.
this._closeSideSheets(this._openSideSheetsAtThisLevel);
this._afterAllClosedAtThisLevel.complete();
this._afterOpenedAtThisLevel.complete();
// Clean up any subscriptions to side-sheet that never finished opening.
if (this._animationStateSubscriptions) {
this._animationStateSubscriptions.unsubscribe();
}
}
/**
* Closes all of the currently-open side-sheets.
*/
closeAll() {
this._closeSideSheets(this.openSideSheets);
}
_createOverlay(config) {
const overlayConfig = new OverlayConfig({
positionStrategy: this._overlay.position().global(),
scrollStrategy: this._overlay.scrollStrategies.block(),
panelClass: config.panelClass,
hasBackdrop: config.hasBackdrop,
direction: config.direction,
minWidth: config.minWidth,
minHeight: config.minHeight,
maxWidth: config.maxWidth,
});
const overlayRef = this._overlay.create(overlayConfig);
const positionStrategy = overlayRef.getConfig()
.positionStrategy;
positionStrategy.right('0px');
return overlayRef;
}
/**
* Attaches a container to a side-sheets's already-created overlay.
* @param overlay Reference to the side-sheet's underlying overlay.
* @param config The side-sheet configuration.
* @returns A promise resolving to a ComponentRef for the attached container.
*/
_attachSideSheetContainer(overlay, config) {
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
const injector = Injector.create({
parent: userInjector || this._injector,
providers: [{ provide: CovalentSideSheetConfig, useValue: config }],
});
const containerPortal = new ComponentPortal(this._sideSheetContainerType, config.viewContainerRef, injector, config.componentFactoryResolver);
const containerRef = overlay.attach(containerPortal);
return containerRef.instance;
}
/**
* Attaches the user-provided component to the already-created side sheet container.
* @param componentOrTemplateRef The type of component being loaded into the side-sheet,
* or a TemplateRef to instantiate as the content.
* @param dialogContainer Reference to the wrapping side-sheet container.
* @param overlayRef Reference to the overlay in which the side-sheet resides.
* @param config The side-sheet configuration.
* @returns A promise resolving to the CovalentSideSheetRef that should be returned to the user.
*/
_attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config) {
// Create a reference to the side-sheet we're creating in order to give the user a handle
// to modify and close it.
const sideSheetRef = new this._sideSheetRefConstructor(overlayRef, config, sideSheetContainer, config.id);
if (componentOrTemplateRef instanceof TemplateRef) {
sideSheetContainer.attachTemplatePortal(
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
new TemplatePortal(componentOrTemplateRef, null, {
$implicit: config.data,
sideSheetRef,
}));
}
else {
const injector = this._createInjector(config, sideSheetRef, sideSheetContainer);
const contentRef = sideSheetContainer.attach(new ComponentPortal(componentOrTemplateRef, config.viewContainerRef, injector));
sideSheetRef.componentInstance = contentRef.instance;
}
sideSheetRef.updateSize(config.width, config.height);
return sideSheetRef;
}
_createInjector(config, sideSheetRef, sideSheetContainer) {
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
// The side-sheet container should be provided as the side-sheet container and the side-sheet's
// content are created out of the same `ViewContainerRef` and as such, are siblings
// for injector purposes. To allow the hierarchy that is expected, the side-sheet
// container is explicitly provided in the injector.
const providers = [
{ provide: this._sideSheetContainerType, useValue: sideSheetContainer },
{ provide: this._sideSheetDataToken, useValue: config.data },
{ provide: this._sideSheetRefConstructor, useValue: sideSheetRef },
];
if (config.direction &&
(!userInjector ||
!userInjector.get(Directionality, null, InjectFlags.Optional))) {
providers.push({
provide: Directionality,
useValue: { value: config.direction, change: of() },
});
}
return Injector.create({
parent: userInjector || this._injector,
providers,
});
}
/**
* Removes a side sheet from the array of open side sheets.
* @param sideSheetRef Side Sheet to be removed.
*/
_removeOpenSideSheet(sideSheetRef) {
const index = this.openSideSheets.indexOf(sideSheetRef);
if (index > -1) {
this.openSideSheets.splice(index, 1);
}
}
/** Closes all of the side-sheet in an array. */
_closeSideSheets(sideSheets) {
let i = sideSheets.length;
while (i--) {
sideSheets[i].close();
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: _CovalentSideSheetBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.2", type: _CovalentSideSheetBase, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: _CovalentSideSheetBase, decorators: [{
type: Directive
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.Injector }, { type: undefined }, { type: undefined }, { type: i0.Type }, { type: i0.Type }, { type: i0.InjectionToken }] });
/**
* Service to open Covalent Design side-sheet.
*/
export class CovalentSideSheet extends _CovalentSideSheetBase {
constructor(overlay, injector, defaultOptions, parentSideSheet) {
super(overlay, injector, defaultOptions, parentSideSheet, CovalentSideSheetRef, CovalentSideSheetContainerComponent, MAT_DIALOG_DATA);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: MAT_DIALOG_DEFAULT_OPTIONS, optional: true }, { token: CovalentSideSheet, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.Injector }, { type: i2.CovalentSideSheetConfig, decorators: [{
type: Optional
}, {
type: Inject,
args: [MAT_DIALOG_DEFAULT_OPTIONS]
}] }, { type: CovalentSideSheet, decorators: [{
type: Optional
}, {
type: SkipSelf
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1zaGVldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zaWRlLXNoZWV0L3NyYy9zaWRlLXNoZWV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxRQUFRLEVBRVIsUUFBUSxFQUNSLFFBQVEsRUFFUixXQUFXLEVBQ1gsSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGVBQWUsRUFFZixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQ0wsbUNBQW1DLEdBRXBDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUczRSxNQUFNLE9BQU8sc0JBQXNCO0lBZ0J2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQW5CRiwwQkFBMEIsR0FBb0MsRUFBRSxDQUFDO0lBQ3hELDBC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QUdHO0lBQ0ssb0JBQW9CLENBQUMsWUFBMkM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUN4QyxnQkFBZ0IsQ0FBQyxVQUF1QztRQUM5RCxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBRTFCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQzt1R0F6UlUsc0JBQXNCOzJGQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRGxDLFNBQVM7O0FBNlJWOztHQUVHO0FBRUgsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHNCQUEyRDtJQUNoRyxZQUNFLE9BQWdCLEVBQ2hCLFFBQWtCLEVBR2xCLGNBQXVDLEVBQ2YsZUFBa0M7UUFFMUQsS0FBSyxDQUNILE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsbUNBQW1DLEVBQ25DLGVBQWUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7dUdBbEJVLGlCQUFpQixpRUFLbEIsMEJBQTBCOzJHQUx6QixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7OzBCQUtOLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsMEJBQTBCOzswQkFFakMsUUFBUTs7MEJBQUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0RmxhZ3MsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgU2tpcFNlbGYsXG4gIFN0YXRpY1Byb3ZpZGVyLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmLFxuICBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRQb3J0YWwsXG4gIENvbXBvbmVudFR5cGUsXG4gIFRlbXBsYXRlUG9ydGFsLFxufSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIE1BVF9ESUFMT0dfREFUQSxcbiAgTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBBbmltYXRpb25DdXJ2ZXMsIEFuaW1hdGlvbkR1cmF0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ292YWxlbnRTaWRlU2hlZXRDb250YWluZXJDb21wb25lbnQsXG4gIF9Db3ZhbGVudFNpZGVTaGVldENvbnRhaW5lckJhc2UsXG59IGZyb20gJy4vc2lkZS1zaGVldC1jb250YWluZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5cbmltcG9ydCB7IENvdmFsZW50U2lkZVNoZWV0UmVmIH0gZnJvbSAnLi9zaWRlLXNoZWV0LXJlZic7XG5pbXBvcnQgeyBTdWJQYWdlTW9kZSwgQ292YWxlbnRTaWRlU2hlZXRDb25maWcgfSBmcm9tICcuL3NpZGUtc2hlZXQuY29uZmlnJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgX0NvdmFsZW50U2lkZVNoZWV0QmFzZTxDIGV4dGVuZHMgX0NvdmFsZW50U2lkZVNoZWV0Q29udGFpbmVyQmFzZT5cbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBfb3BlblNpZGVTaGVldHNBdFRoaXNMZXZlbDogQ292YWxlbnRTaWRlU2hlZXRSZWY8dW5rbm93bj5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PFxuICAgIENvdmFsZW50U2lkZVNoZWV0UmVmPHVua25vd24+XG4gID4oKTtcbiAgcHJpdmF0ZSBfYW5pbWF0aW9uU3RhdGVTdWJzY3JpcHRpb25zITogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgZGVmYXVsdFNpZGViYXJDb25maWcgPSB7XG4gICAgbWluV2lkdGg6ICc0MDBweCcsXG4gICAgbWF4V2lkdGg6ICcxMDB2dycsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM6IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX3BhcmVudFNpZGVTaGVldDogX0NvdmFsZW50U2lkZVNoZWV0QmFzZTxDPiB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9zaWRlU2hlZXRSZWZDb25zdHJ1Y3RvcjogVHlwZTxDb3ZhbGVudFNpZGVTaGVldFJlZjxhbnk+PixcbiAgICBwcml2YXRlIF9zaWRlU2hlZXRDb250YWluZXJUeXBlOiBUeXBlPEM+LFxuICAgIHByaXZhdGUgX3NpZGVTaGVldERhdGFUb2tlbjogSW5qZWN0aW9uVG9rZW48dW5rbm93bj5cbiAgKSB7fVxuXG4gIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudGx5LW9wZW4gc2lkZS1zaGVldHMuICovXG4gIGdldCBvcGVuU2lkZVNoZWV0cygpOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U2lkZVNoZWV0XG4gICAgICA/IHRoaXMuX3BhcmVudFNpZGVTaGVldC5vcGVuU2lkZVNoZWV0c1xuICAgICAgOiB0aGlzLl9vcGVuU2lkZVNoZWV0c0F0VGhpc0xldmVsO1xuICB9XG5cbiAgb3BlbjxULCBEID0gdW5rbm93biwgUiA9IHVua25vd24+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZzxEPlxuICApOiBDb3ZhbGVudFNpZGVTaGVldFJlZjxULCBSPiB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uKHRoaXMuX2RlZmF1bHRPcHRpb25zIHx8IG5ldyBDb3ZhbGVudFNpZGVTaGVldENvbmZpZygpKSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdFNpZGViYXJDb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KGNvbmZpZyk7XG4gICAgY29uc3Qgc2lkZVNoZWV0Q29udGFpbmVyID0gdGhpcy5fYXR0YWNoU2lkZVNoZWV0Q29udGFpbmVyKFxuICAgICAgb3ZlcmxheVJlZixcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gICAgY29uc3Qgc2lkZVNoZWV0UmVmID0gdGhpcy5fYXR0YWNoU2lkZVNoZWV0Q29udGVudDxULCBSPihcbiAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsXG4gICAgICBzaWRlU2hlZXRDb250YWluZXIsXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBwcmV2U2lkZVNoZWV0UmVmOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPiA9XG4gICAgICB0aGlzLm9wZW5TaWRlU2hlZXRzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBwcmV2T3ZlcmxheVJlZiA9IHByZXZTaWRlU2hlZXRSZWY/Lm92ZXJsYXlSZWY7XG5cbiAgICBpZiAoXG4gICAgICBwcmV2T3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQgJiZcbiAgICAgIGNvbmZpZy5zdWJQYWdlTW9kZSAhPT0gU3ViUGFnZU1vZGUubm9uZVxuICAgICkge1xuICAgICAgcHJldk92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IGAke0FuaW1hdGlvbkR1cmF0aW9ucy5DT01QTEVYfSAke0FuaW1hdGlvbkN1cnZlcy5ERUNFTEVSQVRJT05fQ1VSVkV9YDtcbiAgICAgIGlmIChjb25maWcuc3ViUGFnZU1vZGUgPT09IFN1YlBhZ2VNb2RlLnB1c2hlZCkge1xuICAgICAgICAvLyBBbmltYXRlIHByZXZpb3VzIHNpZGUgc2hlZXQgdG8gZnVsbCB3aWR0aFxuICAgICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGAke1xuICAgICAgICAgICh3aW5kb3cgYXMgYW55KS5pbm5lcldpZHRoXG4gICAgICAgIH1weGA7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5zdWJQYWdlTW9kZSA9PT0gU3ViUGFnZU1vZGUuc2hpZnRlZCkge1xuICAgICAgICAvLyBBbmltYXRlIHByZXZpb3VzIHNpZGUgc2hlZXQgdG8gY3VycmVudCBzaWRlc2hlZXQgd2lkdGggKyAyMDBweFxuICAgICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGAke1xuICAgICAgICAgIHNpZGVTaGVldFJlZi5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50Lm9mZnNldFdpZHRoICsgMjAwXG4gICAgICAgIH1weGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV2ZXJ0IHRoZSBwcmV2aW91cyBzaWRlIHNoZWV0IGNvbmZpZyAmIHNpemVcbiAgICBzaWRlU2hlZXRSZWYuX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKGV2ZW50KSA9PlxuICAgICAgICAgICAgZXZlbnQuc3RhdGUgPT09ICdjbG9zaW5nJyAmJiAhIShwcmV2U2lkZVNoZWV0UmVmICYmIHByZXZPdmVybGF5UmVmKVxuICAgICAgICApLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgcHJldk92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IGAke0FuaW1hdGlvbkR1cmF0aW9ucy5FWElUSU5HfSAke0FuaW1hdGlvbkN1cnZlcy5ERUNFTEVSQVRJT05fQ1VSVkV9YDtcbiAgICAgICAgcHJldlNpZGVTaGVldFJlZi51cGRhdGVTaXplKCk7XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBuZXcgc2lkZSBzaGVldCB0byBvcGVuIGxpc3RcbiAgICB0aGlzLm9wZW5TaWRlU2hlZXRzLnB1c2goc2lkZVNoZWV0UmVmKTtcblxuICAgIC8vIFJlbW92ZSBzaWRlIHNoZWV0IHJlZiBhZnRlciBjbG9zZWRcbiAgICBzaWRlU2hlZXRSZWZcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZW1vdmVPcGVuU2lkZVNoZWV0KHNpZGVTaGVldFJlZikpO1xuXG4gICAgLy8gTm90aWZ5IHRoZSBzaWRlLXNoZWV0IGNvbnRhaW5lciB0aGF0IHRoZSBjb250ZW50IGhhcyBiZWVuIGF0dGFjaGVkLlxuICAgIHNpZGVTaGVldENvbnRhaW5lci5faW5pdGlhbGl6ZVdpdGhBdHRhY2hlZENvbnRlbnQoKTtcblxuICAgIHJldHVybiBzaWRlU2hlZXRSZWY7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBPbmx5IGNsb3NlIHRoZSBzaWRlLXNoZWV0cyBhdCB0aGlzIGxldmVsIG9uIGRlc3Ryb3lcbiAgICAvLyBzaW5jZSB0aGUgcGFyZW50IHNlcnZpY2UgbWF5IHN0aWxsIGJlIGFjdGl2ZS5cbiAgICB0aGlzLl9jbG9zZVNpZGVTaGVldHModGhpcy5fb3BlblNpZGVTaGVldHNBdFRoaXNMZXZlbCk7XG4gICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgICAvLyBDbGVhbiB1cCBhbnkgc3Vic2NyaXB0aW9ucyB0byBzaWRlLXNoZWV0IHRoYXQgbmV2ZXIgZmluaXNoZWQgb3BlbmluZy5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uU3RhdGVTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gc2lkZS1zaGVldHMuXG4gICAqL1xuICBjbG9zZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbG9zZVNpZGVTaGVldHModGhpcy5vcGVuU2lkZVNoZWV0cyk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5PFQ+KGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWcpOiBPdmVybGF5UmVmIHtcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgcGFuZWxDbGFzczogY29uZmlnLnBhbmVsQ2xhc3MsXG4gICAgICBoYXNCYWNrZHJvcDogY29uZmlnLmhhc0JhY2tkcm9wLFxuICAgICAgZGlyZWN0aW9uOiBjb25maWcuZGlyZWN0aW9uLFxuICAgICAgbWluV2lkdGg6IGNvbmZpZy5taW5XaWR0aCxcbiAgICAgIG1pbkhlaWdodDogY29uZmlnLm1pbkhlaWdodCxcbiAgICAgIG1heFdpZHRoOiBjb25maWcubWF4V2lkdGgsXG4gICAgfSk7XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSBvdmVybGF5UmVmLmdldENvbmZpZygpXG4gICAgICAucG9zaXRpb25TdHJhdGVneSBhcyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5O1xuICAgIHBvc2l0aW9uU3RyYXRlZ3kucmlnaHQoJzBweCcpO1xuXG4gICAgcmV0dXJuIG92ZXJsYXlSZWY7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBjb250YWluZXIgdG8gYSBzaWRlLXNoZWV0cydzIGFscmVhZHktY3JlYXRlZCBvdmVybGF5LlxuICAgKiBAcGFyYW0gb3ZlcmxheSBSZWZlcmVuY2UgdG8gdGhlIHNpZGUtc2hlZXQncyB1bmRlcmx5aW5nIG92ZXJsYXkuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIHNpZGUtc2hlZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byBhIENvbXBvbmVudFJlZiBmb3IgdGhlIGF0dGFjaGVkIGNvbnRhaW5lci5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaFNpZGVTaGVldENvbnRhaW5lcihcbiAgICBvdmVybGF5OiBPdmVybGF5UmVmLFxuICAgIGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWdcbiAgKTogQyB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQ292YWxlbnRTaWRlU2hlZXRDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgdGhpcy5fc2lkZVNoZWV0Q29udGFpbmVyVHlwZSxcbiAgICAgIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBjb25maWcuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAgKTtcbiAgICBjb25zdCBjb250YWluZXJSZWYgPSBvdmVybGF5LmF0dGFjaDxDPihjb250YWluZXJQb3J0YWwpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lclJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgdXNlci1wcm92aWRlZCBjb21wb25lbnQgdG8gdGhlIGFscmVhZHktY3JlYXRlZCBzaWRlIHNoZWV0IGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgVGhlIHR5cGUgb2YgY29tcG9uZW50IGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBzaWRlLXNoZWV0LFxuICAgKiAgICAgb3IgYSBUZW1wbGF0ZVJlZiB0byBpbnN0YW50aWF0ZSBhcyB0aGUgY29udGVudC5cbiAgICogQHBhcmFtIGRpYWxvZ0NvbnRhaW5lciBSZWZlcmVuY2UgdG8gdGhlIHdyYXBwaW5nIHNpZGUtc2hlZXQgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gb3ZlcmxheVJlZiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJsYXkgaW4gd2hpY2ggdGhlIHNpZGUtc2hlZXQgcmVzaWRlcy5cbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgc2lkZS1zaGVldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb3ZhbGVudFNpZGVTaGVldFJlZiB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgdXNlci5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaFNpZGVTaGVldENvbnRlbnQ8VCwgUj4oXG4gICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZjogQ29tcG9uZW50VHlwZTxUPiB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIHNpZGVTaGVldENvbnRhaW5lcjogQyxcbiAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgIGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWdcbiAgKTogQ292YWxlbnRTaWRlU2hlZXRSZWY8VCwgUj4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgc2lkZS1zaGVldCB3ZSdyZSBjcmVhdGluZyBpbiBvcmRlciB0byBnaXZlIHRoZSB1c2VyIGEgaGFuZGxlXG4gICAgLy8gdG8gbW9kaWZ5IGFuZCBjbG9zZSBpdC5cbiAgICBjb25zdCBzaWRlU2hlZXRSZWYgPSBuZXcgdGhpcy5fc2lkZVNoZWV0UmVmQ29uc3RydWN0b3IoXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgY29uZmlnLFxuICAgICAgc2lkZVNoZWV0Q29udGFpbmVyLFxuICAgICAgY29uZmlnLmlkXG4gICAgKTtcblxuICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHNpZGVTaGVldENvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgbmV3IFRlbXBsYXRlUG9ydGFsPFQ+KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIG51bGwhLCA8YW55PntcbiAgICAgICAgICAkaW1wbGljaXQ6IGNvbmZpZy5kYXRhLFxuICAgICAgICAgIHNpZGVTaGVldFJlZixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5fY3JlYXRlSW5qZWN0b3I8VD4oXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc2lkZVNoZWV0UmVmLFxuICAgICAgICBzaWRlU2hlZXRDb250YWluZXJcbiAgICAgICk7XG4gICAgICBjb25zdCBjb250ZW50UmVmID0gc2lkZVNoZWV0Q29udGFpbmVyLmF0dGFjaDxUPihcbiAgICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChcbiAgICAgICAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmLFxuICAgICAgICAgIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgIGluamVjdG9yXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBzaWRlU2hlZXRSZWYuY29tcG9uZW50SW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHNpZGVTaGVldFJlZi51cGRhdGVTaXplKGNvbmZpZy53aWR0aCwgY29uZmlnLmhlaWdodCk7XG5cbiAgICByZXR1cm4gc2lkZVNoZWV0UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSW5qZWN0b3I8VD4oXG4gICAgY29uZmlnOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyxcbiAgICBzaWRlU2hlZXRSZWY6IENvdmFsZW50U2lkZVNoZWV0UmVmPFQ+LFxuICAgIHNpZGVTaGVldENvbnRhaW5lcjogQ1xuICApOiBJbmplY3RvciB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcblxuICAgIC8vIFRoZSBzaWRlLXNoZWV0IGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdmlkZWQgYXMgdGhlIHNpZGUtc2hlZXQgY29udGFpbmVyIGFuZCB0aGUgc2lkZS1zaGVldCdzXG4gICAgLy8gY29udGVudCBhcmUgY3JlYXRlZCBvdXQgb2YgdGhlIHNhbWUgYFZpZXdDb250YWluZXJSZWZgIGFuZCBhcyBzdWNoLCBhcmUgc2libGluZ3NcbiAgICAvLyBmb3IgaW5qZWN0b3IgcHVycG9zZXMuIFRvIGFsbG93IHRoZSBoaWVyYXJjaHkgdGhhdCBpcyBleHBlY3RlZCwgdGhlIHNpZGUtc2hlZXRcbiAgICAvLyBjb250YWluZXIgaXMgZXhwbGljaXRseSBwcm92aWRlZCBpbiB0aGUgaW5qZWN0b3IuXG4gICAgY29uc3QgcHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW1xuICAgICAgeyBwcm92aWRlOiB0aGlzLl9zaWRlU2hlZXRDb250YWluZXJUeXBlLCB1c2VWYWx1ZTogc2lkZVNoZWV0Q29udGFpbmVyIH0sXG4gICAgICB7IHByb3ZpZGU6IHRoaXMuX3NpZGVTaGVldERhdGFUb2tlbiwgdXNlVmFsdWU6IGNvbmZpZy5kYXRhIH0sXG4gICAgICB7IHByb3ZpZGU6IHRoaXMuX3NpZGVTaGVldFJlZkNvbnN0cnVjdG9yLCB1c2VWYWx1ZTogc2lkZVNoZWV0UmVmIH0sXG4gICAgXTtcblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kaXJlY3Rpb24gJiZcbiAgICAgICghdXNlckluamVjdG9yIHx8XG4gICAgICAgICF1c2VySW5qZWN0b3IuZ2V0PERpcmVjdGlvbmFsaXR5IHwgbnVsbD4oXG4gICAgICAgICAgRGlyZWN0aW9uYWxpdHksXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBJbmplY3RGbGFncy5PcHRpb25hbFxuICAgICAgICApKVxuICAgICkge1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBEaXJlY3Rpb25hbGl0eSxcbiAgICAgICAgdXNlVmFsdWU6IHsgdmFsdWU6IGNvbmZpZy5kaXJlY3Rpb24sIGNoYW5nZTogb2YoKSB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgc2lkZSBzaGVldCBmcm9tIHRoZSBhcnJheSBvZiBvcGVuIHNpZGUgc2hlZXRzLlxuICAgKiBAcGFyYW0gc2lkZVNoZWV0UmVmIFNpZGUgU2hlZXQgdG8gYmUgcmVtb3ZlZC5cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZU9wZW5TaWRlU2hlZXQoc2lkZVNoZWV0UmVmOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuU2lkZVNoZWV0cy5pbmRleE9mKHNpZGVTaGVldFJlZik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5vcGVuU2lkZVNoZWV0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgYWxsIG9mIHRoZSBzaWRlLXNoZWV0IGluIGFuIGFycmF5LiAqL1xuICBwcml2YXRlIF9jbG9zZVNpZGVTaGVldHMoc2lkZVNoZWV0czogQ292YWxlbnRTaWRlU2hlZXRSZWY8YW55PltdKSB7XG4gICAgbGV0IGkgPSBzaWRlU2hlZXRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHNpZGVTaGVldHNbaV0uY2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG9wZW4gQ292YWxlbnQgRGVzaWduIHNpZGUtc2hlZXQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb3ZhbGVudFNpZGVTaGVldCBleHRlbmRzIF9Db3ZhbGVudFNpZGVTaGVldEJhc2U8Q292YWxlbnRTaWRlU2hlZXRDb250YWluZXJDb21wb25lbnQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREVGQVVMVF9PUFRJT05TKVxuICAgIGRlZmF1bHRPcHRpb25zOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRTaWRlU2hlZXQ6IENvdmFsZW50U2lkZVNoZWV0XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgb3ZlcmxheSxcbiAgICAgIGluamVjdG9yLFxuICAgICAgZGVmYXVsdE9wdGlvbnMsXG4gICAgICBwYXJlbnRTaWRlU2hlZXQsXG4gICAgICBDb3ZhbGVudFNpZGVTaGVldFJlZixcbiAgICAgIENvdmFsZW50U2lkZVNoZWV0Q29udGFpbmVyQ29tcG9uZW50LFxuICAgICAgTUFUX0RJQUxPR19EQVRBXG4gICAgKTtcbiAgfVxufVxuIl19