UNPKG

angular-cesium

Version:
353 lines 52.7 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWMtbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9jb21wb25lbnRzL2FjLWxheWVyL2FjLWxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxJQUFJLGNBQWMsRUFBRSxLQUFLLElBQUksZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQzFHLE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRWxGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUc5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRkFBcUYsQ0FBQztB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WUEyQmhCLGdCQUFnQjtZQWhDaEIsc0JBQXNCO1lBTXRCLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIscUJBQXFCO1lBS3JCLG9CQUFvQjtZQUpwQixnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBV2xCLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLHFCQUFxQjtZQUNyQixzQkFBc0I7WUFDdEIsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixzQkFBc0I7WUFidEIsMkJBQTJCO1lBQzNCLDRCQUE0QjtZQUM1Qix5QkFBeUI7WUFDekIsMkJBQTJCO1lBQzNCLDBCQUEwQjtZQUMxQiwwQkFBMEI7WUFTMUIsOEJBQThCO1lBQzlCLDJCQUEyQjtZQUMzQiwrQkFBK0I7WUFFL0IsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixpQkFBaUI7OzttQkE2RXZCLEtBQUs7b0JBRUwsS0FBSztzQkFFTCxLQUFLO29CQUVMLEtBQUs7c0JBRUwsS0FBSztxQkFFTCxLQUFLO29CQUVMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tIGFzIG9ic2VydmFibGVGcm9tLCBtZXJnZSBhcyBvYnNlcnZhYmxlTWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuLy8gdHNsaW50OmRpc2FibGVcclxuaW1wb3J0IHsgQmlsbGJvYXJkRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmlsbGJvYXJkLWRyYXdlci9iaWxsYm9hcmQtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXllci1zZXJ2aWNlL2xheWVyLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLW5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IEFjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IENvbXB1dGF0aW9uQ2FjaGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21wdXRhdGlvbi1jYWNoZS9jb21wdXRhdGlvbi1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGFiZWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9sYWJlbC1kcmF3ZXIvbGFiZWwtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbGxpcHNlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvZWxsaXBzZS1kcmF3ZXIvZWxsaXBzZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtZHJhd2VyL3BvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXJjRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYXJjLWRyYXdlci9hcmMtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2ludERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvaW50LWRyYXdlci9wb2ludC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLWVudGl0eSc7XHJcbmltcG9ydCB7IEJhc2ljRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmFzaWMtZHJhd2VyL2Jhc2ljLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlnb24tZHJhd2VyL3BvbHlnb24tZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYXllck9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbGF5ZXItb3B0aW9ucyc7XHJcbmltcG9ydCB7IER5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvZWxsaXBzZS1kcmF3ZXIvZHluYW1pYy1lbGxpcHNlLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRHluYW1pY1BvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1jaXJjbGUtZHJhd2VyL3N0YXRpYy1jaXJjbGUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1wb2x5bGluZS1kcmF3ZXIvc3RhdGljLXBvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1wb2x5Z29uLWRyYXdlci9wb2x5Z29uLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL2VsbGlwc2UtZHJhd2VyL2VsbGlwc2UtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2RlbERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL21vZGVsLWRyYXdlci9tb2RlbC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEJveERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2JveC1kYXdlci9ib3gtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyaWRvckRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2NvcnJpZG9yLWRhd2VyL2NvcnJpZG9yLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3lsaW5kZXJEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jeWxpbmRlci1kYXdlci9jeWxpbmRlci1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVsbGlwc29pZERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2VsbGlwb2lkLWRyYXdlci9lbGxpcHNvaWQtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlsaW5lLXZvbHVtZS1kYXdlci9wb2x5bGluZS12b2x1bWUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXYWxsRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvd2FsbC1kYXdlci93YWxsLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVjdGFuZ2xlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcmVjdGFuZ2xlLWRhd2VyL3JlY3RhbmdsZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtcHJpbWl0aXZlLWRyYXdlci9wb2x5bGluZS1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2xhYmVsLXByaW1pdGl2ZS1kcmF3ZXIvbGFiZWwtcHJpbWl0aXZlLWRyYXdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmlsbGJvYXJkUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hcExheWVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXAtbGF5ZXJzL21hcC1sYXllcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvaW50UHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9pbnQtcHJpbWl0aXZlLWRyYXdlci9wb2ludC1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdG1sRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvaHRtbC1kcmF3ZXIvaHRtbC1kcmF3ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEN6bWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jem1sLWRyYXdlci9jem1sLWRyYXdlci5zZXJ2aWNlJztcclxuXHJcbi8vIHRzbGludDplbmFibGVcclxuLyoqXHJcbiAqICBUaGlzIGlzIGEgYWMtbGF5ZXIgaW1wbGVtZW50YXRpb24uXHJcbiAqICBUaGUgYWMtbGF5ZXIgZWxlbWVudCBtdXN0IGJlIGEgY2hpbGQgb2YgYWMtbWFwIGVsZW1lbnQuXHJcbiAqICArIGFjRm9yIGB7c3RyaW5nfWAgLSBnZXQgdGhlIHRyYWNrZWQgb2JzZXJ2YWJsZSBhbmQgZW50aXR5TmFtZSAoc2VlIHRoZSBleGFtcGxlKS5cclxuICogICsgc2hvdyBge2Jvb2xlYW59YCAtIHNob3cvaGlkZSBsYXllcidzIGVudGl0aWVzLlxyXG4gKiAgKyBjb250ZXh0IGB7YW55fWAgLSBnZXQgdGhlIGNvbnRleHQgbGF5ZXIgdGhhdCB3aWxsIHVzZSB0aGUgY29tcG9ubmV0IChtb3N0IG9mIHRoZSB0aW1lIGVxdWFsIHRvIFwidGhpc1wiKS5cclxuICogICsgb3B0aW9ucyBge0xheWVyT3B0aW9uc31gIC0gc2V0cyB0aGUgbGF5ZXIgb3B0aW9ucyBmb3IgZWFjaCBkcmF3ZXIuXHJcbiAqICArIHpJbmRleCBge251bWJlcn1gIC0gY29udHJvbHMgdGhlIHpJbmRleCAob3JkZXIpIG9mIHRoZSBsYXllciwgbGF5ZXJzIHdpdGggZ3JlYXRlciB6SW5kZXggd2lsbCBiZSBpbiBmcm9udCBvZiBsYXllcnMgd2l0aCBsb3dlciB6SW5kZXhcclxuICogICAgKEV4Y2VwdGlvbiBGb3IgYEJpbGxib2FyZGAgYW5kIGBMYWJlbGAsIHNob3VsZCB1c2UgYFtleWVPZmZzZXRdYCBwcm9wIGluc3RlYWQpPC9icj5cclxuICogICAgekluZGV4IHdvbid0IHdvcmsgZm9yIHByaXRpbWl0dmUgZGVzY3MgKGxpa2UgYWMtcHJpbWl0aXZlLXBvbHlsaW5lLi4uKVxyXG4gKiAgKyBkZWJ1ZyBge2Jvb2xlYW59YCAtIHByaW50cyBldmVyeSBhY05vdGlmaWNhdGlvblxyXG4gKlxyXG4gKlxyXG4gKiAgX19Vc2FnZSA6X19cclxuICogIGBgYFxyXG4gKiAgPGFjLW1hcD5cclxuICogICAgPGFjLWxheWVyIGFjRm9yPVwibGV0IHRyYWNrIG9mIHRyYWNrcyRcIiBbc2hvd109XCJzaG93XCIgW2NvbnRleHRdPVwidGhpc1wiIFtvcHRpb25zXT1cIm9wdGlvbnNcIiBbekluZGV4XT1cIjFcIj5cclxuICogICAgICA8YWMtYmlsbGJvYXJkLWRlc2MgcHJvcHM9XCJ7XHJcbiAqICAgICAgICBpbWFnZTogdHJhY2suaW1hZ2UsXHJcbiAqICAgICAgICBwb3NpdGlvbjogdHJhY2sucG9zaXRpb24sXHJcbiAqICAgICAgICBzY2FsZTogdHJhY2suc2NhbGUsXHJcbiAqICAgICAgICBjb2xvcjogdHJhY2suY29sb3IsXHJcbiAqICAgICAgICBuYW1lOiB0cmFjay5uYW1lXHJcbiAqICAgICAgfVwiPlxyXG4gKiAgICAgIDwvYWMtYmlsbGJvYXJkLWRlc2M+XHJcbiAqICAgICAgICA8YWMtbGFiZWwtZGVzYyBwcm9wcz1cIntcclxuICogICAgICAgICAgcG9zaXRpb246IHRyYWNrLnBvc2l0aW9uLFxyXG4gKiAgICAgICAgICBwaXhlbE9mZnNldCA6IFstMTUsMjBdIHwgcGl4ZWxPZmZzZXQsXHJcbiAqICAgICAgICAgIHRleHQ6IHRyYWNrLm5hbWUsXHJcbiAqICAgICAgICAgIGZvbnQ6ICcxNXB4IHNhbnMtc2VyaWYnXHJcbiAqICAgICAgICB9XCI+XHJcbiAqICAgICAgPC9hYy1sYWJlbC1kZXNjPlxyXG4gKiAgICA8L2FjLWxheWVyPlxyXG4gKiAgPC9hYy1tYXA+XHJcbiAqICBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWMtbGF5ZXInLFxyXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBMYXllclNlcnZpY2UsXHJcbiAgICBDb21wdXRhdGlvbkNhY2hlLFxyXG4gICAgQmlsbGJvYXJkRHJhd2VyU2VydmljZSxcclxuICAgIExhYmVsRHJhd2VyU2VydmljZSxcclxuICAgIEVsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgQXJjRHJhd2VyU2VydmljZSxcclxuICAgIFBvaW50RHJhd2VyU2VydmljZSxcclxuICAgIFBvbHlnb25EcmF3ZXJTZXJ2aWNlLFxyXG4gICAgTW9kZWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgQm94RHJhd2VyU2VydmljZSxcclxuICAgIENvcnJpZG9yRHJhd2VyU2VydmljZSxcclxuICAgIEN5bGluZGVyRHJhd2VyU2VydmljZSxcclxuICAgIEVsbGlwc29pZERyYXdlclNlcnZpY2UsXHJcbiAgICBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UsXHJcbiAgICBXYWxsRHJhd2VyU2VydmljZSxcclxuICAgIFJlY3RhbmdsZURyYXdlclNlcnZpY2UsXHJcbiAgICBQb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICBMYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICBCaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgUG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgSHRtbERyYXdlclNlcnZpY2UsXHJcbiAgICBDem1sRHJhd2VyU2VydmljZSxcclxuXHJcbiAgICBEeW5hbWljRWxsaXBzZURyYXdlclNlcnZpY2UsXHJcbiAgICBEeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgU3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZSxcclxuICAgIFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSxcclxuICAgIFN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlLFxyXG4gICAgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UsXHJcbiAgXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjTGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKVxyXG4gIHNob3cgPSB0cnVlO1xyXG4gIEBJbnB1dCgpXHJcbiAgYWNGb3I6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIGNvbnRleHQ6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHN0b3JlID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBvcHRpb25zOiBMYXllck9wdGlvbnM7XHJcbiAgQElucHV0KClcclxuICB6SW5kZXggPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhY0ZvclJneCA9IC9ebGV0XFxzKy4rXFxzK29mXFxzKy4rJC87XHJcbiAgcHJpdmF0ZSBlbnRpdHlOYW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdG9wT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwcml2YXRlIG9ic2VydmFibGU6IE9ic2VydmFibGU8QWNOb3RpZmljYXRpb24+O1xyXG4gIHByaXZhdGUgX2RyYXdlckxpc3Q6IE1hcDxzdHJpbmcsIEJhc2ljRHJhd2VyU2VydmljZT47XHJcbiAgcHJpdmF0ZSBfdXBkYXRlU3RyZWFtOiBTdWJqZWN0PEFjTm90aWZpY2F0aW9uPiA9IG5ldyBTdWJqZWN0PEFjTm90aWZpY2F0aW9uPigpO1xyXG4gIHByaXZhdGUgZW50aXRpZXNTdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgcHJpdmF0ZSBsYXllckRyYXdlckRhdGFTb3VyY2VzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbXB1dGF0aW9uQ2FjaGU6IENvbXB1dGF0aW9uQ2FjaGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBtYXBMYXllcnNTZXJ2aWNlOiBNYXBMYXllcnNTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZERyYXdlclNlcnZpY2U6IEJpbGxib2FyZERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgbGFiZWxEcmF3ZXJTZXJ2aWNlOiBMYWJlbERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgZWxsaXBzZURyYXdlclNlcnZpY2U6IEVsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lRHJhd2VyU2VydmljZTogUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlnb25EcmF3ZXJTZXJ2aWNlOiBQb2x5Z29uRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBhcmNEcmF3ZXJTZXJ2aWNlOiBBcmNEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvaW50RHJhd2VyU2VydmljZTogUG9pbnREcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIG1vZGVsRHJhd2VyU2VydmljZTogTW9kZWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJveERyYXdlclNlcnZpY2U6IEJveERyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgY29ycmlkb3JEcmF3ZXJTZXJ2aWNlOiBDb3JyaWRvckRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgY3lsaW5kZXJEcmF3ZXJTZXJ2aWNlOiBDeWxpbmRlckRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgZWxsaXBzb2lkRHJhd2VyU2VyaWNlOiBFbGxpcHNvaWREcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lVm9sdW1lRHJhd2VyU2VydmljZTogUG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHdhbGxEcmF3ZXJTZXJ2aWNlOiBXYWxsRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICByZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlOiBSZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGR5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZTogRHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGR5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2U6IER5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgc3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZTogU3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBzdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2U6IFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSxcclxuICAgICAgICAgICAgICBzdGF0aWNQb2x5Z29uRHJhd2VyU2VydmljZTogU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgc3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2U6IFN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZTogUG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGxhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZTogTGFiZWxQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2U6IEJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlOiBQb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgaHRtbERyYXdlclNlcnZpY2U6IEh0bWxEcmF3ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIGN6bWxEcmF3ZXJTZXJ2aWNlOiBDem1sRHJhd2VyU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fZHJhd2VyTGlzdCA9IG5ldyBNYXAoW1xyXG4gICAgICBbJ2JpbGxib2FyZCcsIGJpbGxib2FyZERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2xhYmVsJywgbGFiZWxEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydlbGxpcHNlJywgZWxsaXBzZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ3BvbHlsaW5lJywgcG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2x5Z29uJywgcG9seWdvbkRyYXdlclNlcnZpY2UgYXMgQmFzaWNEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydhcmMnLCBhcmNEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2ludCcsIHBvaW50RHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnbW9kZWwnLCBtb2RlbERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2JveCcsIGJveERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2NvcnJpZG9yJywgY29ycmlkb3JEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydjeWxpbmRlcicsIGN5bGluZGVyRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnZWxsaXBzb2lkJywgZWxsaXBzb2lkRHJhd2VyU2VyaWNlXSxcclxuICAgICAgWydwb2x5bGluZVZvbHVtZScsIHBvbHlsaW5lVm9sdW1lRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsncmVjdGFuZ2xlJywgcmVjdGFuZ2xlRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnd2FsbCcsIHdhbGxEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydwb2x5bGluZVByaW1pdGl2ZScsIHBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnbGFiZWxQcmltaXRpdmUnLCBsYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2JpbGxib2FyZFByaW1pdGl2ZScsIGJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ3BvaW50UHJpbWl0aXZlJywgcG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydodG1sJywgaHRtbERyYXdlclNlcnZpY2VdLFxyXG4gICAgICBbJ2N6bWwnLCBjem1sRHJhd2VyU2VydmljZV0sXHJcblxyXG4gICAgICBbJ2R5bmFtaWNFbGxpcHNlJywgZHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydkeW5hbWljUG9seWxpbmUnLCBkeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNDaXJjbGUnLCBzdGF0aWNDaXJjbGVEcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNQb2x5bGluZScsIHN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZV0sXHJcbiAgICAgIFsnc3RhdGljUG9seWdvbicsIHN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlXSxcclxuICAgICAgWydzdGF0aWNFbGxpcHNlJywgc3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2VdLFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgdGhpcy5pbml0VmFsaWRQYXJhbXMoKTtcclxuXHJcbiAgICBvYnNlcnZhYmxlTWVyZ2UodGhpcy5fdXBkYXRlU3RyZWFtLCB0aGlzLm9ic2VydmFibGUpLnBpcGU8QWNOb3RpZmljYXRpb24+KHRha2VVbnRpbCh0aGlzLnN0b3BPYnNlcnZhYmxlKSkuc3Vic2NyaWJlKChub3RpZmljYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5fY29tcHV0YXRpb25DYWNoZS5jbGVhcigpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnQWNMYXllciByZWNlaXZlZCBub3RpZmljYXRpb246Jywgbm90aWZpY2F0aW9uKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGNvbnRleHRFbnRpdHkgPSBub3RpZmljYXRpb24uZW50aXR5O1xyXG4gICAgICBpZiAodGhpcy5zdG9yZSkge1xyXG4gICAgICAgIGNvbnRleHRFbnRpdHkgPSB0aGlzLnVwZGF0ZVN0b3JlKG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29udGV4dFt0aGlzLmVudGl0eU5hbWVdID0gY29udGV4dEVudGl0eTtcclxuICAgICAgdGhpcy5sYXllclNlcnZpY2UuZ2V0RGVzY3JpcHRpb25zKCkuZm9yRWFjaCgoZGVzY3JpcHRpb25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5hY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuQUREX1VQREFURTpcclxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQuZHJhdyh0aGlzLmNvbnRleHQsIG5vdGlmaWNhdGlvbi5pZCwgY29udGV4dEVudGl0eSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBBY3Rpb25UeXBlLkRFTEVURTpcclxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQucmVtb3ZlKG5vdGlmaWNhdGlvbi5pZCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2FjLWxheWVyXSB1bmtub3duIEFjTm90aWZpY2F0aW9uLmFjdGlvblR5cGUgZm9yIG5vdGlmaWNhdGlvbjogJyArIG5vdGlmaWNhdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVTdG9yZShub3RpZmljYXRpb246IEFjTm90aWZpY2F0aW9uKTogYW55IHtcclxuICAgIGlmIChub3RpZmljYXRpb24uYWN0aW9uVHlwZSA9PT0gQWN0aW9uVHlwZS5ERUxFVEUpIHtcclxuICAgICAgdGhpcy5lbnRpdGllc1N0b3JlLmRlbGV0ZShub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZW50aXRpZXNTdG9yZS5oYXMobm90aWZpY2F0aW9uLmlkKSkge1xyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXNTdG9yZS5nZXQobm90aWZpY2F0aW9uLmlkKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgbm90aWZpY2F0aW9uLmVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIGVudGl0eTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmVudGl0aWVzU3RvcmUuc2V0KG5vdGlmaWNhdGlvbi5pZCwgbm90aWZpY2F0aW9uLmVudGl0eSk7XHJcbiAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5lbnRpdHk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFZhbGlkUGFyYW1zKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYy1sYXllcjogbXVzdCBpbml0aWFsaXplIFtjb250ZXh0XSAnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYWNGb3JSZ3gudGVzdCh0aGlzLmFjRm9yKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjLWxheWVyOiBJbnZhbGlkIFthY0Zvcl0gc3ludGF4LiBFeHBlY3RlZDogW2FjRm9yXT1cImxldCBpdGVtIG9mIG9ic2VydmFibGVcIiAuSW5zdGVhZCByZWNlaXZlZDogJHt0aGlzLmFjRm9yfWApO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWNGb3JBcnIgPSB0aGlzLmFjRm9yLnNwbGl0KCcgJyk7XHJcbiAgICB0aGlzLm9ic2VydmFibGUgPSB0aGlzLmNvbnRleHRbYWNGb3JBcnJbM11dO1xyXG4gICAgdGhpcy5lbnRpdHlOYW1lID0gYWNGb3JBcnJbMV07XHJcbiAgICBpZiAoIXRoaXMuaXNPYnNlcnZhYmxlKHRoaXMub2JzZXJ2YWJsZSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYy1sYXllcjogbXVzdCBpbml0YWlsaXplIFthY0Zvcl0gd2l0aCByeCBvYnNlcnZhYmxlLCBpbnN0ZWFkIHJlY2VpdmVkOiAnICsgdGhpcy5vYnNlcnZhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxheWVyU2VydmljZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgdGhpcy5sYXllclNlcnZpY2Uuc2V0RW50aXR5TmFtZSh0aGlzLmVudGl0eU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlc3QgZm9yIGEgcnhqcyBPYnNlcnZhYmxlICovXHJcbiAgcHJpdmF0ZSBpc09ic2VydmFibGUob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIC8qIGNoZWNrIHZpYSBkdWNrLXR5cGluZyByYXRoZXIgdGhhbiBpbnN0YW5jZSBvZlxyXG4gICAgICogdG8gYWxsb3cgcGFzc2luZyBiZXR3ZWVuIHdpbmRvdyBjb250ZXh0cyAqL1xyXG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJztcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxheWVyU2VydmljZS5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgdGhpcy5sYXllclNlcnZpY2Uub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnNob3cgPSB0aGlzLnNob3c7XHJcbiAgICB0aGlzLmxheWVyU2VydmljZS56SW5kZXggPSB0aGlzLnpJbmRleDtcclxuICAgIHRoaXMuX2RyYXdlckxpc3QuZm9yRWFjaCgoZHJhd2VyLCBkcmF3ZXJOYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IGluaXRPcHRpb25zID0gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zW2RyYXdlck5hbWVdIDogdW5kZWZpbmVkO1xyXG4gICAgICBjb25zdCBkcmF3ZXJEYXRhU291cmNlcyA9IGRyYXdlci5pbml0KGluaXRPcHRpb25zKTtcclxuICAgICAgLy8gb25seSBlbnRpdGllcyBkcmF3ZXJzIGNyZWF0ZSBkYXRhIHNvdXJjZXNcclxuICAgICAgaWYgKGRyYXdlckRhdGFTb3VyY2VzKSB7XHJcbiAgICAgICAgLy8gdGhpcy5tYXBMYXllcnNTZXJ2aWNlLnJlZ2lzdGVyTGF5ZXJEYXRhU291cmNlcyhkcmF3ZXJEYXRhU291cmNlcywgdGhpcy56SW5kZXgpO1xyXG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgQmFkIFBlcmZvcm1hbmNlXHJcbiAgICAgICAgdGhpcy5sYXllckRyYXdlckRhdGFTb3VyY2VzLnB1c2goLi4uZHJhd2VyRGF0YVNvdXJjZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIGRyYXdlci5zZXRTaG93KHRoaXMuc2hvdyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNob3cgJiYgIWNoYW5nZXMuc2hvdy5maXJzdENoYW5nZSkge1xyXG4gICAgICBjb25zdCBzaG93VmFsdWUgPSBjaGFuZ2VzWydzaG93J10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLmxheWVyU2VydmljZS5zaG93ID0gc2hvd1ZhbHVlO1xyXG4gICAgICB0aGlzLl9kcmF3ZXJMaXN0LmZvckVhY2goKGRyYXdlcikgPT4gZHJhd2VyLnNldFNob3coc2hvd1ZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuekluZGV4ICYmICFjaGFuZ2VzLnpJbmRleC5maXJzdENoYW5nZSkge1xyXG4gICAgICBjb25zdCB6SW5kZXhWYWx1ZSA9IGNoYW5nZXNbJ3pJbmRleCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5sYXllclNlcnZpY2UuekluZGV4ID0gekluZGV4VmFsdWU7XHJcbiAgICAgIHRoaXMubWFwTGF5ZXJzU2VydmljZS51cGRhdGVBbmRSZWZyZXNoKHRoaXMubGF5ZXJEcmF3ZXJEYXRhU291cmNlcywgekluZGV4VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hcExheWVyc1NlcnZpY2UucmVtb3ZlRGF0YVNvdXJjZXModGhpcy5sYXllckRyYXdlckR