angular-cesium
Version:
Angular library for working with Cesium.
353 lines • 52.7 kB
JavaScript
import { from as observableFrom, merge as observableMerge, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
// tslint:disable
import { BillboardDrawerService } from '../../services/drawers/billboard-drawer/billboard-drawer.service';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { LayerService } from '../../services/layer-service/layer-service.service';
import { ActionType } from '../../models/action-type.enum';
import { ComputationCache } from '../../services/computation-cache/computation-cache.service';
import { LabelDrawerService } from '../../services/drawers/label-drawer/label-drawer.service';
import { EllipseDrawerService } from '../../services/drawers/ellipse-drawer/ellipse-drawer.service';
import { PolylineDrawerService } from '../../services/drawers/polyline-drawer/polyline-drawer.service';
import { ArcDrawerService } from '../../services/drawers/arc-drawer/arc-drawer.service';
import { PointDrawerService } from '../../services/drawers/point-drawer/point-drawer.service';
import { PolygonDrawerService } from '../../services/drawers/polygon-drawer/polygon-drawer.service';
import { DynamicEllipseDrawerService } from '../../services/drawers/static-dynamic/ellipse-drawer/dynamic-ellipse-drawer.service';
import { DynamicPolylineDrawerService } from '../../services/drawers/static-dynamic/dynamic-polyline-drawer/dynamic-polyline-drawer.service';
import { StaticCircleDrawerService } from '../../services/drawers/static-dynamic/static-circle-drawer/static-circle-drawer.service';
import { StaticPolylineDrawerService } from '../../services/drawers/static-dynamic/static-polyline-drawer/static-polyline-drawer.service';
import { StaticPolygonDrawerService } from '../../services/drawers/static-dynamic/static-polygon-drawer/polygon-drawer.service';
import { StaticEllipseDrawerService } from '../../services/drawers/static-dynamic/ellipse-drawer/ellipse-drawer.service';
import { ModelDrawerService } from '../../services/drawers/model-drawer/model-drawer.service';
import { BoxDrawerService } from '../../services/drawers/box-dawer/box-drawer.service';
import { CorridorDrawerService } from '../../services/drawers/corridor-dawer/corridor-drawer.service';
import { CylinderDrawerService } from '../../services/drawers/cylinder-dawer/cylinder-drawer.service';
import { EllipsoidDrawerService } from '../../services/drawers/ellipoid-drawer/ellipsoid-drawer.service';
import { PolylineVolumeDrawerService } from '../../services/drawers/polyline-volume-dawer/polyline-volume-drawer.service';
import { WallDrawerService } from '../../services/drawers/wall-dawer/wall-drawer.service';
import { RectangleDrawerService } from '../../services/drawers/rectangle-dawer/rectangle-drawer.service';
import { PolylinePrimitiveDrawerService } from '../../services/drawers/polyline-primitive-drawer/polyline-primitive-drawer.service';
import { LabelPrimitiveDrawerService } from '../../services/drawers/label-primitive-drawer/label-primitive-drawer.service';
import { BillboardPrimitiveDrawerService } from '../../services/drawers/billboard-primitive-drawer/billboard-primitive-drawer.service';
import { MapLayersService } from '../../services/map-layers/map-layers.service';
import { PointPrimitiveDrawerService } from '../../services/drawers/point-primitive-drawer/point-primitive-drawer.service';
import { HtmlDrawerService } from '../../services/drawers/html-drawer/html-drawer.service';
import { CzmlDrawerService } from '../../services/drawers/czml-drawer/czml-drawer.service';
// tslint:enable
/**
* This is a ac-layer implementation.
* The ac-layer element must be a child of ac-map element.
* + acFor `{string}` - get the tracked observable and entityName (see the example).
* + show `{boolean}` - show/hide layer's entities.
* + context `{any}` - get the context layer that will use the componnet (most of the time equal to "this").
* + options `{LayerOptions}` - sets the layer options for each drawer.
* + zIndex `{number}` - controls the zIndex (order) of the layer, layers with greater zIndex will be in front of layers with lower zIndex
* (Exception For `Billboard` and `Label`, should use `[eyeOffset]` prop instead)</br>
* zIndex won't work for pritimitve descs (like ac-primitive-polyline...)
* + debug `{boolean}` - prints every acNotification
*
*
* __Usage :__
* ```
* <ac-map>
* <ac-layer acFor="let track of tracks$" [show]="show" [context]="this" [options]="options" [zIndex]="1">
* <ac-billboard-desc props="{
* image: track.image,
* position: track.position,
* scale: track.scale,
* color: track.color,
* name: track.name
* }">
* </ac-billboard-desc>
* <ac-label-desc props="{
* position: track.position,
* pixelOffset : [-15,20] | pixelOffset,
* text: track.name,
* font: '15px sans-serif'
* }">
* </ac-label-desc>
* </ac-layer>
* </ac-map>
* ```
*/
export class AcLayerComponent {
constructor(layerService, _computationCache, mapLayersService, billboardDrawerService, labelDrawerService, ellipseDrawerService, polylineDrawerService, polygonDrawerService, arcDrawerService, pointDrawerService, modelDrawerService, boxDrawerService, corridorDrawerService, cylinderDrawerService, ellipsoidDrawerSerice, polylineVolumeDrawerService, wallDrawerService, rectangleDrawerService, dynamicEllipseDrawerService, dynamicPolylineDrawerService, staticCircleDrawerService, staticPolylineDrawerService, staticPolygonDrawerService, staticEllipseDrawerService, polylinePrimitiveDrawerService, labelPrimitiveDrawerService, billboardPrimitiveDrawerService, pointPrimitiveDrawerService, htmlDrawerService, czmlDrawerService) {
this.layerService = layerService;
this._computationCache = _computationCache;
this.mapLayersService = mapLayersService;
this.show = true;
this.store = false;
this.zIndex = 0;
this.debug = false;
this.acForRgx = /^let\s+.+\s+of\s+.+$/;
this.stopObservable = new Subject();
this._updateStream = new Subject();
this.entitiesStore = new Map();
this.layerDrawerDataSources = [];
this._drawerList = new Map([
['billboard', billboardDrawerService],
['label', labelDrawerService],
['ellipse', ellipseDrawerService],
['polyline', polylineDrawerService],
['polygon', polygonDrawerService],
['arc', arcDrawerService],
['point', pointDrawerService],
['model', modelDrawerService],
['box', boxDrawerService],
['corridor', corridorDrawerService],
['cylinder', cylinderDrawerService],
['ellipsoid', ellipsoidDrawerSerice],
['polylineVolume', polylineVolumeDrawerService],
['rectangle', rectangleDrawerService],
['wall', wallDrawerService],
['polylinePrimitive', polylinePrimitiveDrawerService],
['labelPrimitive', labelPrimitiveDrawerService],
['billboardPrimitive', billboardPrimitiveDrawerService],
['pointPrimitive', pointPrimitiveDrawerService],
['html', htmlDrawerService],
['czml', czmlDrawerService],
['dynamicEllipse', dynamicEllipseDrawerService],
['dynamicPolyline', dynamicPolylineDrawerService],
['staticCircle', staticCircleDrawerService],
['staticPolyline', staticPolylineDrawerService],
['staticPolygon', staticPolygonDrawerService],
['staticEllipse', staticEllipseDrawerService],
]);
}
init() {
this.initValidParams();
observableMerge(this._updateStream, this.observable).pipe(takeUntil(this.stopObservable)).subscribe((notification) => {
this._computationCache.clear();
if (this.debug) {
console.log('AcLayer received notification:', notification);
}
let contextEntity = notification.entity;
if (this.store) {
contextEntity = this.updateStore(notification);
}
this.context[this.entityName] = contextEntity;
this.layerService.getDescriptions().forEach((descriptionComponent) => {
switch (notification.actionType) {
case ActionType.ADD_UPDATE:
descriptionComponent.draw(this.context, notification.id, contextEntity);
break;
case ActionType.DELETE:
descriptionComponent.remove(notification.id);
break;
default:
console.error('[ac-layer] unknown AcNotification.actionType for notification: ' + notification);
}
});
});
}
updateStore(notification) {
if (notification.actionType === ActionType.DELETE) {
this.entitiesStore.delete(notification.id);
return undefined;
}
else {
if (this.entitiesStore.has(notification.id)) {
const entity = this.entitiesStore.get(notification.id);
Object.assign(entity, notification.entity);
return entity;
}
else {
this.entitiesStore.set(notification.id, notification.entity);
return notification.entity;
}
}
}
initValidParams() {
if (!this.context) {
throw new Error('ac-layer: must initialize [context] ');
}
if (!this.acForRgx.test(this.acFor)) {
throw new Error(`ac-layer: Invalid [acFor] syntax. Expected: [acFor]="let item of observable" .Instead received: ${this.acFor}`);
}
const acForArr = this.acFor.split(' ');
this.observable = this.context[acForArr[3]];
this.entityName = acForArr[1];
if (!this.isObservable(this.observable)) {
throw new Error('ac-layer: must initailize [acFor] with rx observable, instead received: ' + this.observable);
}
this.layerService.context = this.context;
this.layerService.setEntityName(this.entityName);
}
/** Test for a rxjs Observable */
isObservable(obj) {
/* check via duck-typing rather than instance of
* to allow passing between window contexts */
return obj && typeof obj.subscribe === 'function';
}
ngAfterContentInit() {
this.init();
}
ngOnInit() {
this.layerService.context = this.context;
this.layerService.options = this.options;
this.layerService.show = this.show;
this.layerService.zIndex = this.zIndex;
this._drawerList.forEach((drawer, drawerName) => {
const initOptions = this.options ? this.options[drawerName] : undefined;
const drawerDataSources = drawer.init(initOptions);
// only entities drawers create data sources
if (drawerDataSources) {
// this.mapLayersService.registerLayerDataSources(drawerDataSources, this.zIndex);
// TODO: Check if the following line causes Bad Performance
this.layerDrawerDataSources.push(...drawerDataSources);
}
drawer.setShow(this.show);
});
}
ngOnChanges(changes) {
if (changes.show && !changes.show.firstChange) {
const showValue = changes['show'].currentValue;
this.layerService.show = showValue;
this._drawerList.forEach((drawer) => drawer.setShow(showValue));
}
if (changes.zIndex && !changes.zIndex.firstChange) {
const zIndexValue = changes['zIndex'].currentValue;
this.layerService.zIndex = zIndexValue;
this.mapLayersService.updateAndRefresh(this.layerDrawerDataSources, zIndexValue);
}
}
ngOnDestroy() {
this.mapLayersService.removeDataSources(this.layerDrawerDataSources);
this.stopObservable.next(true);
this.removeAll();
}
getLayerService() {
return this.layerService;
}
/**
* Returns an array of DataSources registered by a drawer of this layer
* @return Array of Cesium.DataSources
*/
getLayerDrawerDataSources() {
return this.layerDrawerDataSources;
}
/**
* Returns an Array of DataSources of the drawer with the provided DataSource.name
* Example: getDataSourceOfDrawer('polyline') returns the dataSource of polyline drawer
* @return Array of Cesium.DataSources
*/
getDrawerDataSourcesByName(name) {
return this.layerDrawerDataSources.filter(d => d.name === name);
}
/**
* Returns the store.
*/
getStore() {
return this.entitiesStore;
}
/**
* Remove all the entities from the layer.
*/
removeAll() {
this.layerService.getDescriptions().forEach((description) => description.removeAll());
this.entitiesStore.clear();
}
/**
* remove entity from the layer
*/
remove(entityId) {
this._updateStream.next({ id: entityId, actionType: ActionType.DELETE });
this.entitiesStore.delete(entityId);
}
/**
* add/update entity to/from the layer
*/
updateNotification(notification) {
this._updateStream.next(notification);
}
/**
* add/update entity to/from the layer
*/
update(entity, id) {
this._updateStream.next({ entity, id, actionType: ActionType.ADD_UPDATE });
}
refreshAll(collection) {
// TODO make entity interface: collection of type entity not notification
observableFrom(collection).subscribe((entity) => this._updateStream.next(entity));
}
}
AcLayerComponent.decorators = [
{ type: Component, args: [{
selector: 'ac-layer',
template: '<ng-content></ng-content>',
providers: [
LayerService,
ComputationCache,
BillboardDrawerService,
LabelDrawerService,
EllipseDrawerService,
PolylineDrawerService,
ArcDrawerService,
PointDrawerService,
PolygonDrawerService,
ModelDrawerService,
BoxDrawerService,
CorridorDrawerService,
CylinderDrawerService,
EllipsoidDrawerService,
PolylineVolumeDrawerService,
WallDrawerService,
RectangleDrawerService,
PolylinePrimitiveDrawerService,
LabelPrimitiveDrawerService,
BillboardPrimitiveDrawerService,
PointPrimitiveDrawerService,
HtmlDrawerService,
CzmlDrawerService,
DynamicEllipseDrawerService,
DynamicPolylineDrawerService,
StaticCircleDrawerService,
StaticPolylineDrawerService,
StaticPolygonDrawerService,
StaticEllipseDrawerService,
],
changeDetection: ChangeDetectionStrategy.OnPush
},] }
];
AcLayerComponent.ctorParameters = () => [
{ type: LayerService },
{ type: ComputationCache },
{ type: MapLayersService },
{ type: BillboardDrawerService },
{ type: LabelDrawerService },
{ type: EllipseDrawerService },
{ type: PolylineDrawerService },
{ type: PolygonDrawerService },
{ type: ArcDrawerService },
{ type: PointDrawerService },
{ type: ModelDrawerService },
{ type: BoxDrawerService },
{ type: CorridorDrawerService },
{ type: CylinderDrawerService },
{ type: EllipsoidDrawerService },
{ type: PolylineVolumeDrawerService },
{ type: WallDrawerService },
{ type: RectangleDrawerService },
{ type: DynamicEllipseDrawerService },
{ type: DynamicPolylineDrawerService },
{ type: StaticCircleDrawerService },
{ type: StaticPolylineDrawerService },
{ type: StaticPolygonDrawerService },
{ type: StaticEllipseDrawerService },
{ type: PolylinePrimitiveDrawerService },
{ type: LabelPrimitiveDrawerService },
{ type: BillboardPrimitiveDrawerService },
{ type: PointPrimitiveDrawerService },
{ type: HtmlDrawerService },
{ type: CzmlDrawerService }
];
AcLayerComponent.propDecorators = {
show: [{ type: Input }],
acFor: [{ type: Input }],
context: [{ type: Input }],
store: [{ type: Input }],
options: [{ type: Input }],
zIndex: [{ type: Input }],
debug: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWMtbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9jb21wb25lbnRzL2FjLWxheWVyL2FjLWxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxJQUFJLGNBQWMsRUFBRSxLQUFLLElBQUksZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQzFHLE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRWxGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUc5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRkFBcUYsQ0FBQztBQUNsSSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrRkFBK0YsQ0FBQztBQUM3SSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5RkFBeUYsQ0FBQztBQUNwSSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2RkFBNkYsQ0FBQztBQUMxSSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvRkFBb0YsQ0FBQztBQUNoSSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2RUFBNkUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN2RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN0RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN0RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2RUFBNkUsQ0FBQztBQUMxSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxvRkFBb0YsQ0FBQztBQUNwSSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUMzSCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzRkFBc0YsQ0FBQztBQUN2SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUMzSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUzRixnQkFBZ0I7QUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBc0NILE1BQU0sT0FBTyxnQkFBZ0I7SUF5QjNCLFlBQW9CLFlBQTBCLEVBQzFCLGlCQUFtQyxFQUNuQyxnQkFBa0MsRUFDMUMsc0JBQThDLEVBQzlDLGtCQUFzQyxFQUN0QyxvQkFBMEMsRUFDMUMscUJBQTRDLEVBQzVDLG9CQUEwQyxFQUMxQyxnQkFBa0MsRUFDbEMsa0JBQXNDLEVBQ3RDLGtCQUFzQyxFQUN0QyxnQkFBa0MsRUFDbEMscUJBQTRDLEVBQzVDLHFCQUE0QyxFQUM1QyxxQkFBNkMsRUFDN0MsMkJBQXdELEVBQ3hELGlCQUFvQyxFQUNwQyxzQkFBOEMsRUFDOUMsMkJBQXdELEVBQ3hELDRCQUEwRCxFQUMxRCx5QkFBb0QsRUFDcEQsMkJBQXdELEVBQ3hELDBCQUFzRCxFQUN0RCwwQkFBc0QsRUFDdEQsOEJBQThELEVBQzlELDJCQUF3RCxFQUN4RCwrQkFBZ0UsRUFDaEUsMkJBQXdELEVBQ3hELGlCQUFvQyxFQUNwQyxpQkFBb0M7UUE3QjVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXpCdEQsU0FBSSxHQUFHLElBQUksQ0FBQztRQU1aLFVBQUssR0FBRyxLQUFLLENBQUM7UUFJZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRVgsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVHLGFBQVEsR0FBRyxzQkFBc0IsQ0FBQztRQUUzQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFHcEMsa0JBQWEsR0FBNEIsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDdkUsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQ3ZDLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQWlDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUN6QixDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQztZQUNyQyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQztZQUM3QixDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQztZQUNqQyxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQztZQUNuQyxDQUFDLFNBQVMsRUFBRSxvQkFBMEMsQ0FBQztZQUN2RCxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQztZQUN6QixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQztZQUM3QixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQztZQUM3QixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQztZQUN6QixDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQztZQUNuQyxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQztZQUNuQyxDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQztZQUNwQyxDQUFDLGdCQUFnQixFQUFFLDJCQUEyQixDQUFDO1lBQy9DLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDO1lBQ3JDLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDO1lBQzNCLENBQUMsbUJBQW1CLEVBQUUsOEJBQThCLENBQUM7WUFDckQsQ0FBQyxnQkFBZ0IsRUFBRSwyQkFBMkIsQ0FBQztZQUMvQyxDQUFDLG9CQUFvQixFQUFFLCtCQUErQixDQUFDO1lBQ3ZELENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUM7WUFDL0MsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUM7WUFDM0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUM7WUFFM0IsQ0FBQyxnQkFBZ0IsRUFBRSwyQkFBMkIsQ0FBQztZQUMvQyxDQUFDLGlCQUFpQixFQUFFLDRCQUE0QixDQUFDO1lBQ2pELENBQUMsY0FBYyxFQUFFLHlCQUF5QixDQUFDO1lBQzNDLENBQUMsZ0JBQWdCLEVBQUUsMkJBQTJCLENBQUM7WUFDL0MsQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLENBQUM7WUFDN0MsQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLENBQUM7U0FDOUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBaUIsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ25JLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUM3RDtZQUVELElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2hEO1lBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtnQkFDbkUsUUFBUSxZQUFZLENBQUMsVUFBVSxFQUFFO29CQUMvQixLQUFLLFVBQVUsQ0FBQyxVQUFVO3dCQUN4QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUN4RSxNQUFNO29CQUNSLEtBQUssVUFBVSxDQUFDLE1BQU07d0JBQ3BCLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQzdDLE1BQU07b0JBQ1I7d0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxpRUFBaUUsR0FBRyxZQUFZLENBQUMsQ0FBQztpQkFDbkc7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxZQUE0QjtRQUM5QyxJQUFJLFlBQVksQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0MsT0FBTyxTQUFTLENBQUM7U0FDbEI7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxNQUFNLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsbUdBQW1HLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ2xJO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvRztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxpQ0FBaUM7SUFDekIsWUFBWSxDQUFDLEdBQVE7UUFDM0I7c0RBQzhDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLE9BQU8sR0FBRyxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUM7SUFDcEQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3hFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuRCw0Q0FBNEM7WUFDNUMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsa0ZBQWtGO2dCQUNsRiwyREFBMkQ7Z0JBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzdDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUNqRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ2xGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCwwQkFBMEIsQ0FBQyxJQUFZO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsWUFBNEI7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQWdCLEVBQUUsRUFBVTtRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxVQUFVLENBQUMsVUFBNEI7UUFDckMseUVBQXlFO1FBQ3pFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQzs7O1lBN1NGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsU0FBUyxFQUFFO29CQUNULFlBQVk7b0JBQ1osZ0JBQWdCO29CQUNoQixzQkFBc0I7b0JBQ3RCLGtCQUFrQjtvQkFDbEIsb0JBQW9CO29CQUNwQixxQkFBcUI7b0JBQ3JCLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQixvQkFBb0I7b0JBQ3BCLGtCQUFrQjtvQkFDbEIsZ0JBQWdCO29CQUNoQixxQkFBcUI7b0JBQ3JCLHFCQUFxQjtvQkFDckIsc0JBQXNCO29CQUN0QiwyQkFBMkI7b0JBQzNCLGlCQUFpQjtvQkFDakIsc0JBQXNCO29CQUN0Qiw4QkFBOEI7b0JBQzlCLDJCQUEyQjtvQkFDM0IsK0JBQStCO29CQUMvQiwyQkFBMkI7b0JBQzNCLGlCQUFpQjtvQkFDakIsaUJBQWlCO29CQUVqQiwyQkFBMkI7b0JBQzNCLDRCQUE0QjtvQkFDNUIseUJBQXlCO29CQUN6QiwyQkFBMkI7b0JBQzNCLDBCQUEwQjtvQkFDMUIsMEJBQTBCO2lCQUMzQjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDs7O1lBNUdRLFlBQVk7WUFHWixnQkFBZ0I7WUEyQmhCLGdCQUFnQjtZQWhDaEIsc0JBQXNCO1lBTXRCLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIscUJBQXFCO1lBS3JCLG9CQUFvQjtZQUpwQixnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBV2xCLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLHFCQUFxQjtZQUNyQixzQkFBc0I7WUFDdEIsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixzQkFBc0I7WUFidEIsMkJBQTJCO1lBQzNCLDRCQUE0QjtZQUM1Qix5QkFBeUI7WUFDekIsMkJBQTJCO1lBQzNCLDBCQUEwQjtZQUMxQiwwQkFBMEI7WUFTMUIsOEJBQThCO1lBQzlCLDJCQUEyQjtZQUMzQiwrQkFBK0I7WUFFL0IsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixpQkFBaUI7OzttQkE2RXZCLEtBQUs7b0JBRUwsS0FBSztzQkFFTCxLQUFLO29CQUVMLEtBQUs7c0JBRUwsS0FBSztxQkFFTCxLQUFLO29CQUVMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tIGFzIG9ic2VydmFibGVGcm9tLCBtZXJnZSBhcyBvYnNlcnZhYmxlTWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuLy8gdHNsaW50OmRpc2FibGVcclxuaW1wb3J0IHsgQmlsbGJvYXJkRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmlsbGJvYXJkLWRyYXdlci9iaWxsYm9hcmQtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXllci1zZXJ2aWNlL2xheWVyLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLW5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IEFjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IENvbXB1dGF0aW9uQ2FjaGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21wdXRhdGlvbi1jYWNoZS9jb21wdXRhdGlvbi1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGFiZWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9sYWJlbC1kcmF3ZXIvbGFiZWwtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbGxpcHNlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvZWxsaXBzZS1kcmF3ZXIvZWxsaXBzZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtZHJhd2VyL3BvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXJjRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYXJjLWRyYXdlci9hcmMtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2ludERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvaW50LWRyYXdlci9wb2ludC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLWVudGl0eSc7XHJcbmltcG9ydCB7IEJhc2ljRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmFzaWMtZHJhd2VyL2Jhc2ljLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlnb24tZHJhd2VyL3BvbHlnb24tZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYXllck9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbGF5ZXItb3B0aW9ucyc7XHJcbmltcG9ydCB7IER5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvZWxsaXBzZS1kcmF3ZXIvZHluYW1pYy1lbGxpcHNlLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHluYW1pY1BvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1jaXJjbGUtZHJhd2VyL3N0YXRpYy1jaXJjbGUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1wb2x5bGluZS1kcmF3ZXIvc3RhdGljLXBvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1wb2x5Z29uLWRyYXdlci9wb2x5Z29uLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL2VsbGlwc2UtZHJhd2VyL2VsbGlwc2UtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2RlbERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL21vZGVsLWRyYXdlci9tb2RlbC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJveERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2JveC1kYXdlci9ib3gtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyaWRvckRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2NvcnJpZG9yLWRhd2VyL2NvcnJpZG9yLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3lsaW5kZXJEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jeWxpbmRlci1kYXdlci9jeWxpbmRlci1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVsbGlwc29pZERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2VsbGlwb2lkLWRyYXdlci9lbGxpcHNvaWQtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlsaW5lLXZvbHVtZS1kYXdlci9wb2x5bGluZS12b2x1bWUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXYWxsRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvd2FsbC1kYXdlci93YWxsLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVjdGFuZ2xlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcmVjdGFuZ2xlLWRhd2VyL3JlY3RhbmdsZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtcHJpbWl0aXZlLWRyYXdlci9wb2x5bGluZS1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2xhYmVsLXByaW1pdGl2ZS1kcmF3ZXIvbGFiZWwtcHJpbWl0aXZlLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmlsbGJvYXJkUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcExheWVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXAtbGF5ZXJzL21hcC1sYXllcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvaW50UHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9pbnQtcHJpbWl0aXZlLWRyYXdlci9wb2ludC1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdG1sRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvaHRtbC1kcmF3ZXIvaHRtbC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEN6bWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jem1sLWRyYXdlci9jem1sLWRyYXdlci5zZXJ2aWNlJztcclxuXHJcbi8vIHRzbGludDplbmFibGVcclxuLyoqXHJcbiAqICBUaGlzIGlzIGEgYWMtbGF5ZXIgaW1wbGVtZW50YXRpb24uXHJcbiAqICBUaGUgYWMtbGF5ZXIgZWxlbWVudCBtdXN0IGJlIGEgY2hpbGQgb2YgYWMtbWFwIGVsZW1lbnQuXHJcbiAqICArIGFjRm9yIGB7c3RyaW5nfWAgLSBnZXQgdGhlIHRyYWNrZWQgb2JzZXJ2YWJsZSBhbmQgZW50aXR5TmFtZSAoc2VlIHRoZSBleGFtcGxlKS5cclxuICogICsgc2hvdyBge2Jvb2xlYW59YCAtIHNob3cvaGlkZSBsYXllcidzIGVudGl0aWVzLlxyXG4gKiAgKyBjb250ZXh0IGB7YW55fWAgLSBnZXQgdGhlIGNvbnRleHQgbGF5ZXIgdGhhdCB3aWxsIHVzZSB0aGUgY29tcG9ubmV0IChtb3N0IG9mIHRoZSB0aW1lIGVxdWFsIHRvIFwidGhpc1wiKS5cclxuICogICsgb3B0aW9ucyBge0xheWVyT3B0aW9uc31gIC0gc2V0cyB0aGUgbGF5ZXIgb3B0aW9ucyBmb3IgZWFjaCBkcmF3ZXIuXHJcbiAqICArIHpJbmRleCBge251bWJlcn1gIC0gY29udHJvbHMgdGhlIHpJbmRleCAob3JkZXIpIG9mIHRoZSBsYXllciwgbGF5ZXJzIHdpdGggZ3JlYXRlciB6SW5kZXggd2lsbCBiZSBpbiBmcm9udCBvZiBsYXllcnMgd2l0aCBsb3dlciB6SW5kZXhcclxuICogICAgKEV4Y2VwdGlvbiBGb3IgYEJpbGxib2FyZGAgYW5kIGBMYWJlbGAsIHNob3VsZCB1c2UgYFtleWVPZmZzZXRdYCBwcm9wIGluc3RlYWQpPC9icj5cclxuICogICAgekluZGV4IHdvbid0IHdvcmsgZm9yIHByaXRpbWl0dmUgZGVzY3MgKGxpa2UgYWMtcHJpbWl0aXZlLXBvbHlsaW5lLi4uKVxyXG4gKiAgKyBkZWJ1ZyBge2Jvb2xlYW59YCAtIHByaW50cyBldmVyeSBhY05vdGlmaWNhdGlvblxyXG4gKlxyXG4gKlxyXG4gKiAgX19Vc2FnZSA6X19cclxuICogIGBgYFxyXG4gKiAgPGFjLW1hcD5cclxuICogICAgPGFjLWxheWVyIGFjRm9yPVwibGV0IHRyYWNrIG9mIHRyYWNrcyRcIiBbc2hvd109XCJzaG93XCIgW2NvbnRleHRdPVwidGhpc1wiIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbekluZGV4XT1cIjFcIj5cclxuICogICAgICA8YWMtYmlsbGJvYXJkLWRlc2MgcHJvcHM9XCJ7XHJcbiAqICAgICAgICBpbWFnZTogdHJhY2suaW1hZ2UsXHJcbiAqICAgICAgICBwb3NpdGlvbjogdHJhY2sucG9zaXRpb24sXHJcbiAqICAgICAgICBzY2FsZTogdHJhY2suc2NhbGUsXHJcbiAqICAgICAgICBjb2xvcjogdHJhY2suY29sb3IsXHJcbiAqICAgICAgICBuYW1lOiB0cmFjay5uYW1lXHJcbiAqICAgICAgfVwiPlxyXG4gKiAgICAgIDwvYWMtYmlsbGJvYXJkLWRlc2M+XHJcbiAqICAgICAgICA8YWMtbGFiZWwtZGVzYyBwcm9wcz1cIntcclxuICogICAgICAgICAgcG9zaXRpb246IHRyYWNrLnBvc2l0aW9uLFxyXG4gKiAgICAgICAgICBwaXhlbE9mZnNldCA6IFstMTUsMjBdIHwgcGl4ZWxPZmZzZXQsXHJcbiAqICAgICAgICAgIHRleHQ6IHRyYWNrLm5hbWUsXHJcbiAqICAgICAgICAgIGZvbnQ6ICcxNXB4IHNhbnMtc2VyaWYnXHJcbiAqICAgICAgICB9XCI+XHJcbiAqICAgICAgPC9hYy1sYWJlbC1kZXNjPlxyXG4gKiAgICA8L2FjLWxheWVyPlxyXG4gKiAgPC9hYy1tYXA+XHJcbiAqICBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWMtbGF5ZXInLFxyXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBMYXllclNlcnZpY2UsXHJcbiAgICBDb21wdXRhdGlvbkNhY2hlLFxyXG4gICAgQmlsbGJvYXJkRHJhd2VyU2VydmljZSxcclxuICAgIExhYmVsRHJhd2VyU2VydmljZSxcclxuICAgIEVsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgQXJjRHJhd2VyU2VydmljZSxcclxuICAgIFBvaW50RHJhd2VyU2VydmljZSxcclxuICAgIFBvbHlnb25EcmF3ZXJTZXJ2aWNlLFxyXG4gICAgTW9kZWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgQm94RHJhd2VyU2VydmljZSxcclxuICAgIENvcnJpZG9yRHJhd2VyU2VydmljZSxcclxuICAgIEN5bGluZGVyRHJhd2VyU2VydmljZSxcclxuICAgIEVsbGlwc29pZERyYXdlclNlcnZpY2UsXHJcbiAgICBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UsXHJcbiAgICBXYWxsRHJhd2VyU2VydmljZSxcclxuICAgIFJlY3RhbmdsZURyYXdlclNlcnZpY2UsXHJcbiAgICBQb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICBMYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICBCaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgUG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgSHRtbERyYXdlclNlcnZpY2UsXHJcbiAgICBDem1sRHJhd2VyU2VydmljZSxcclxuXHJcbiAgICBEeW5hbWljRWxsaXBzZURyYXdlclNlcnZpY2UsXHJcbiAgICBEeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgU3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZSxcclxuICAgIFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSxcclxuICAgIFN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlLFxyXG4gICAgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UsXHJcbiAgXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjTGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKVxyXG4gIHNob3cgPSB0cnVlO1xyXG4gIEBJbnB1dCgpXHJcbiAgYWNGb3I6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIGNvbnRleHQ6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHN0b3JlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBvcHRpb25zOiBMYXllck9wdGlvbnM7XHJcbiAgQElucHV0KClcclxuICB6SW5kZXggPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY0ZvclJneCA9IC9ebGV0XFxzKy4rXFxzK29mXFxzKy4rJC87XHJcbiAgcHJpdmF0ZSBlbnRpdHlOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdG9wT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwcml2YXRlIG9ic2VydmFibGU6IE9ic2VydmFibGU8QWNOb3RpZmljYXRpb24+O1xyXG4gIHByaXZhdGUgX2RyYXdlckxpc3Q6IE1hcDxzdHJpbmcsIEJhc2ljRHJhd2VyU2VydmljZT47XHJcbiAgcHJpdmF0ZSBfdXBkYXRlU3RyZWFtOiBTdWJqZWN0PEFjTm90aWZpY2F0aW9uPiA9IG5ldyBTdWJqZWN0PEFjTm90aWZpY2F0aW9uPigpO1xyXG4gIHByaXZhdGUgZW50aXRpZXNTdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgcHJpdmF0ZSBsYXllckRyYXdlckRhdGFTb3VyY2VzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbXB1dGF0aW9uQ2FjaGU6IENvbXB1dGF0aW9uQ2FjaGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBtYXBMYXllcnNTZXJ2aWNlOiBNYXBMYXllcnNTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZERyYXdlclNlcnZpY2U6IEJpbGxib2FyZERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgbGFiZWxEcmF3ZXJTZXJ2aWNlOiBMYWJlbERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgZWxsaXBzZURyYXdlclNlcnZpY2U6IEVsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lRHJhd2VyU2VydmljZTogUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlnb25EcmF3ZXJTZXJ2aWNlOiBQb2x5Z29uRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBhcmNEcmF3ZXJTZXJ2aWNlOiBBcmNEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvaW50RHJhd2VyU2VydmljZTogUG9pbnREcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIG1vZGVsRHJhd2VyU2VydmljZTogTW9kZWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJveERyYXdlclNlcnZpY2U6IEJveERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgY29ycmlkb3JEcmF3ZXJTZXJ2aWNlOiBDb3JyaWRvckRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgY3lsaW5kZXJEcmF3ZXJTZXJ2aWNlOiBDeWxpbmRlckRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgZWxsaXBzb2lkRHJhd2VyU2VyaWNlOiBFbGxpcHNvaWREcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lVm9sdW1lRHJhd2VyU2VydmljZTogUG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHdhbGxEcmF3ZXJTZXJ2aWNlOiBXYWxsRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICByZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlOiBSZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGR5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZTogRHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGR5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2U6IER5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgc3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZTogU3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBzdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2U6IFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBzdGF0aWNQb2x5Z29uRHJhd2VyU2VydmljZTogU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgc3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2U6IFN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZTogUG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGxhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZTogTGFiZWxQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2U6IEJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlOiBQb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgaHRtbERyYXdlclNlcnZpY2U6IEh0bWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGN6bWxEcmF3ZXJTZXJ2aWNlOiBDem1sRHJhd2VyU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fZHJhd2VyTGlzdCA9IG5ldyBNYXAoW1xyXG4gICAgICBbJ2JpbGxib2FyZCcsIGJpbGxib2FyZERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2xhYmVsJywgbGFiZWxEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydlbGxpcHNlJywgZWxsaXBzZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ3BvbHlsaW5lJywgcG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2x5Z29uJywgcG9seWdvbkRyYXdlclNlcnZpY2UgYXMgQmFzaWNEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydhcmMnLCBhcmNEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2ludCcsIHBvaW50RHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnbW9kZWwnLCBtb2RlbERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2JveCcsIGJveERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2NvcnJpZG9yJywgY29ycmlkb3JEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydjeWxpbmRlcicsIGN5bGluZGVyRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnZWxsaXBzb2lkJywgZWxsaXBzb2lkRHJhd2VyU2VyaWNlXSxcclxuICAgICAgWydwb2x5bGluZVZvbHVtZScsIHBvbHlsaW5lVm9sdW1lRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsncmVjdGFuZ2xlJywgcmVjdGFuZ2xlRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnd2FsbCcsIHdhbGxEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2x5bGluZVByaW1pdGl2ZScsIHBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnbGFiZWxQcmltaXRpdmUnLCBsYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2JpbGxib2FyZFByaW1pdGl2ZScsIGJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ3BvaW50UHJpbWl0aXZlJywgcG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydodG1sJywgaHRtbERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2N6bWwnLCBjem1sRHJhd2VyU2VydmljZV0sXHJcblxyXG4gICAgICBbJ2R5bmFtaWNFbGxpcHNlJywgZHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydkeW5hbWljUG9seWxpbmUnLCBkeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNDaXJjbGUnLCBzdGF0aWNDaXJjbGVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNQb2x5bGluZScsIHN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnc3RhdGljUG9seWdvbicsIHN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNFbGxpcHNlJywgc3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2VdLFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgdGhpcy5pbml0VmFsaWRQYXJhbXMoKTtcclxuXHJcbiAgICBvYnNlcnZhYmxlTWVyZ2UodGhpcy5fdXBkYXRlU3RyZWFtLCB0aGlzLm9ic2VydmFibGUpLnBpcGU8QWNOb3RpZmljYXRpb24+KHRha2VVbnRpbCh0aGlzLnN0b3BPYnNlcnZhYmxlKSkuc3Vic2NyaWJlKChub3RpZmljYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5fY29tcHV0YXRpb25DYWNoZS5jbGVhcigpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQWNMYXllciByZWNlaXZlZCBub3RpZmljYXRpb246Jywgbm90aWZpY2F0aW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNvbnRleHRFbnRpdHkgPSBub3RpZmljYXRpb24uZW50aXR5O1xyXG4gICAgICBpZiAodGhpcy5zdG9yZSkge1xyXG4gICAgICAgIGNvbnRleHRFbnRpdHkgPSB0aGlzLnVwZGF0ZVN0b3JlKG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29udGV4dFt0aGlzLmVudGl0eU5hbWVdID0gY29udGV4dEVudGl0eTtcclxuICAgICAgdGhpcy5sYXllclNlcnZpY2UuZ2V0RGVzY3JpcHRpb25zKCkuZm9yRWFjaCgoZGVzY3JpcHRpb25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5hY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuQUREX1VQREFURTpcclxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQuZHJhdyh0aGlzLmNvbnRleHQsIG5vdGlmaWNhdGlvbi5pZCwgY29udGV4dEVudGl0eSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLkRFTEVURTpcclxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQucmVtb3ZlKG5vdGlmaWNhdGlvbi5pZCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2FjLWxheWVyXSB1bmtub3duIEFjTm90aWZpY2F0aW9uLmFjdGlvblR5cGUgZm9yIG5vdGlmaWNhdGlvbjogJyArIG5vdGlmaWNhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTdG9yZShub3RpZmljYXRpb246IEFjTm90aWZpY2F0aW9uKTogYW55IHtcclxuICAgIGlmIChub3RpZmljYXRpb24uYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5ERUxFVEUpIHtcclxuICAgICAgdGhpcy5lbnRpdGllc1N0b3JlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZW50aXRpZXNTdG9yZS5oYXMobm90aWZpY2F0aW9uLmlkKSkge1xyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXNTdG9yZS5nZXQobm90aWZpY2F0aW9uLmlkKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgbm90aWZpY2F0aW9uLmVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVudGl0aWVzU3RvcmUuc2V0KG5vdGlmaWNhdGlvbi5pZCwgbm90aWZpY2F0aW9uLmVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5lbnRpdHk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFZhbGlkUGFyYW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYy1sYXllcjogbXVzdCBpbml0aWFsaXplIFtjb250ZXh0XSAnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYWNGb3JSZ3gudGVzdCh0aGlzLmFjRm9yKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjLWxheWVyOiBJbnZhbGlkIFthY0Zvcl0gc3ludGF4LiBFeHBlY3RlZDogW2FjRm9yXT1cImxldCBpdGVtIG9mIG9ic2VydmFibGVcIiAuSW5zdGVhZCByZWNlaXZlZDogJHt0aGlzLmFjRm9yfWApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWNGb3JBcnIgPSB0aGlzLmFjRm9yLnNwbGl0KCcgJyk7XHJcbiAgICB0aGlzLm9ic2VydmFibGUgPSB0aGlzLmNvbnRleHRbYWNGb3JBcnJbM11dO1xyXG4gICAgdGhpcy5lbnRpdHlOYW1lID0gYWNGb3JBcnJbMV07XHJcbiAgICBpZiAoIXRoaXMuaXNPYnNlcnZhYmxlKHRoaXMub2JzZXJ2YWJsZSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYy1sYXllcjogbXVzdCBpbml0YWlsaXplIFthY0Zvcl0gd2l0aCByeCBvYnNlcnZhYmxlLCBpbnN0ZWFkIHJlY2VpdmVkOiAnICsgdGhpcy5vYnNlcnZhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheWVyU2VydmljZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgdGhpcy5sYXllclNlcnZpY2Uuc2V0RW50aXR5TmFtZSh0aGlzLmVudGl0eU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlc3QgZm9yIGEgcnhqcyBPYnNlcnZhYmxlICovXHJcbiAgcHJpdmF0ZSBpc09ic2VydmFibGUob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIC8qIGNoZWNrIHZpYSBkdWNrLXR5cGluZyByYXRoZXIgdGhhbiBpbnN0YW5jZSBvZlxyXG4gICAgICogdG8gYWxsb3cgcGFzc2luZyBiZXR3ZWVuIHdpbmRvdyBjb250ZXh0cyAqL1xyXG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJztcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxheWVyU2VydmljZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgdGhpcy5sYXllclNlcnZpY2Uub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnNob3cgPSB0aGlzLnNob3c7XHJcbiAgICB0aGlzLmxheWVyU2VydmljZS56SW5kZXggPSB0aGlzLnpJbmRleDtcclxuICAgIHRoaXMuX2RyYXdlckxpc3QuZm9yRWFjaCgoZHJhd2VyLCBkcmF3ZXJOYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IGluaXRPcHRpb25zID0gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zW2RyYXdlck5hbWVdIDogdW5kZWZpbmVkO1xyXG4gICAgICBjb25zdCBkcmF3ZXJEYXRhU291cmNlcyA9IGRyYXdlci5pbml0KGluaXRPcHRpb25zKTtcclxuICAgICAgLy8gb25seSBlbnRpdGllcyBkcmF3ZXJzIGNyZWF0ZSBkYXRhIHNvdXJjZXNcclxuICAgICAgaWYgKGRyYXdlckRhdGFTb3VyY2VzKSB7XHJcbiAgICAgICAgLy8gdGhpcy5tYXBMYXllcnNTZXJ2aWNlLnJlZ2lzdGVyTGF5ZXJEYXRhU291cmNlcyhkcmF3ZXJEYXRhU291cmNlcywgdGhpcy56SW5kZXgpO1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgQmFkIFBlcmZvcm1hbmNlXHJcbiAgICAgICAgdGhpcy5sYXllckRyYXdlckRhdGFTb3VyY2VzLnB1c2goLi4uZHJhd2VyRGF0YVNvdXJjZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGRyYXdlci5zZXRTaG93KHRoaXMuc2hvdyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNob3cgJiYgIWNoYW5nZXMuc2hvdy5maXJzdENoYW5nZSkge1xyXG4gICAgICBjb25zdCBzaG93VmFsdWUgPSBjaGFuZ2VzWydzaG93J10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLmxheWVyU2VydmljZS5zaG93ID0gc2hvd1ZhbHVlO1xyXG4gICAgICB0aGlzLl9kcmF3ZXJMaXN0LmZvckVhY2goKGRyYXdlcikgPT4gZHJhd2VyLnNldFNob3coc2hvd1ZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuekluZGV4ICYmICFjaGFuZ2VzLnpJbmRleC5maXJzdENoYW5nZSkge1xyXG4gICAgICBjb25zdCB6SW5kZXhWYWx1ZSA9IGNoYW5nZXNbJ3pJbmRleCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5sYXllclNlcnZpY2UuekluZGV4ID0gekluZGV4VmFsdWU7XHJcbiAgICAgIHRoaXMubWFwTGF5ZXJzU2VydmljZS51cGRhdGVBbmRSZWZyZXNoKHRoaXMubGF5ZXJEcmF3ZXJEYXRhU291cmNlcywgekluZGV4VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hcExheWVyc1NlcnZpY2UucmVtb3ZlRGF0YVNvdXJjZXModGhpcy5sYXllckRyYXdlckR