UNPKG

angular-cesium-ivy

Version:
393 lines 57.5 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 { 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'; import * as i0 from "@angular/core"; import * as i1 from "../../services/layer-service/layer-service.service"; import * as i2 from "../../services/computation-cache/computation-cache.service"; import * as i3 from "../../services/map-layers/map-layers.service"; import * as i4 from "../../services/drawers/billboard-drawer/billboard-drawer.service"; import * as i5 from "../../services/drawers/label-drawer/label-drawer.service"; import * as i6 from "../../services/drawers/ellipse-drawer/ellipse-drawer.service"; import * as i7 from "../../services/drawers/polyline-drawer/polyline-drawer.service"; import * as i8 from "../../services/drawers/polygon-drawer/polygon-drawer.service"; import * as i9 from "../../services/drawers/arc-drawer/arc-drawer.service"; import * as i10 from "../../services/drawers/point-drawer/point-drawer.service"; import * as i11 from "../../services/drawers/model-drawer/model-drawer.service"; import * as i12 from "../../services/drawers/box-dawer/box-drawer.service"; import * as i13 from "../../services/drawers/corridor-dawer/corridor-drawer.service"; import * as i14 from "../../services/drawers/cylinder-dawer/cylinder-drawer.service"; import * as i15 from "../../services/drawers/ellipoid-drawer/ellipsoid-drawer.service"; import * as i16 from "../../services/drawers/polyline-volume-dawer/polyline-volume-drawer.service"; import * as i17 from "../../services/drawers/wall-dawer/wall-drawer.service"; import * as i18 from "../../services/drawers/rectangle-dawer/rectangle-drawer.service"; import * as i19 from "../../services/drawers/static-dynamic/ellipse-drawer/dynamic-ellipse-drawer.service"; import * as i20 from "../../services/drawers/static-dynamic/dynamic-polyline-drawer/dynamic-polyline-drawer.service"; import * as i21 from "../../services/drawers/static-dynamic/static-circle-drawer/static-circle-drawer.service"; import * as i22 from "../../services/drawers/static-dynamic/static-polyline-drawer/static-polyline-drawer.service"; import * as i23 from "../../services/drawers/static-dynamic/static-polygon-drawer/polygon-drawer.service"; import * as i24 from "../../services/drawers/static-dynamic/ellipse-drawer/ellipse-drawer.service"; import * as i25 from "../../services/drawers/polyline-primitive-drawer/polyline-primitive-drawer.service"; import * as i26 from "../../services/drawers/label-primitive-drawer/label-primitive-drawer.service"; import * as i27 from "../../services/drawers/billboard-primitive-drawer/billboard-primitive-drawer.service"; import * as i28 from "../../services/drawers/point-primitive-drawer/point-primitive-drawer.service"; import * as i29 from "../../services/drawers/html-drawer/html-drawer.service"; import * as i30 from "../../services/drawers/czml-drawer/czml-drawer.service"; const _c0 = ["*"]; // 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.ɵfac = function AcLayerComponent_Factory(t) { return new (t || AcLayerComponent)(i0.ɵɵdirectiveInject(i1.LayerService), i0.ɵɵdirectiveInject(i2.ComputationCache), i0.ɵɵdirectiveInject(i3.MapLayersService), i0.ɵɵdirectiveInject(i4.BillboardDrawerService), i0.ɵɵdirectiveInject(i5.LabelDrawerService), i0.ɵɵdirectiveInject(i6.EllipseDrawerService), i0.ɵɵdirectiveInject(i7.PolylineDrawerService), i0.ɵɵdirectiveInject(i8.PolygonDrawerService), i0.ɵɵdirectiveInject(i9.ArcDrawerService), i0.ɵɵdirectiveInject(i10.PointDrawerService), i0.ɵɵdirectiveInject(i11.ModelDrawerService), i0.ɵɵdirectiveInject(i12.BoxDrawerService), i0.ɵɵdirectiveInject(i13.CorridorDrawerService), i0.ɵɵdirectiveInject(i14.CylinderDrawerService), i0.ɵɵdirectiveInject(i15.EllipsoidDrawerService), i0.ɵɵdirectiveInject(i16.PolylineVolumeDrawerService), i0.ɵɵdirectiveInject(i17.WallDrawerService), i0.ɵɵdirectiveInject(i18.RectangleDrawerService), i0.ɵɵdirectiveInject(i19.DynamicEllipseDrawerService), i0.ɵɵdirectiveInject(i20.DynamicPolylineDrawerService), i0.ɵɵdirectiveInject(i21.StaticCircleDrawerService), i0.ɵɵdirectiveInject(i22.StaticPolylineDrawerService), i0.ɵɵdirectiveInject(i23.StaticPolygonDrawerService), i0.ɵɵdirectiveInject(i24.StaticEllipseDrawerService), i0.ɵɵdirectiveInject(i25.PolylinePrimitiveDrawerService), i0.ɵɵdirectiveInject(i26.LabelPrimitiveDrawerService), i0.ɵɵdirectiveInject(i27.BillboardPrimitiveDrawerService), i0.ɵɵdirectiveInject(i28.PointPrimitiveDrawerService), i0.ɵɵdirectiveInject(i29.HtmlDrawerService), i0.ɵɵdirectiveInject(i30.CzmlDrawerService)); }; AcLayerComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AcLayerComponent, selectors: [["ac-layer"]], inputs: { show: "show", acFor: "acFor", context: "context", store: "store", options: "options", zIndex: "zIndex", debug: "debug" }, features: [i0.ɵɵProvidersFeature([ 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, ]), i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function AcLayerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵprojection(0); } }, encapsulation: 2, changeDetection: 0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AcLayerComponent, [{ 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, }] }], function () { return [{ type: i1.LayerService }, { type: i2.ComputationCache }, { type: i3.MapLayersService }, { type: i4.BillboardDrawerService }, { type: i5.LabelDrawerService }, { type: i6.EllipseDrawerService }, { type: i7.PolylineDrawerService }, { type: i8.PolygonDrawerService }, { type: i9.ArcDrawerService }, { type: i10.PointDrawerService }, { type: i11.ModelDrawerService }, { type: i12.BoxDrawerService }, { type: i13.CorridorDrawerService }, { type: i14.CylinderDrawerService }, { type: i15.EllipsoidDrawerService }, { type: i16.PolylineVolumeDrawerService }, { type: i17.WallDrawerService }, { type: i18.RectangleDrawerService }, { type: i19.DynamicEllipseDrawerService }, { type: i20.DynamicPolylineDrawerService }, { type: i21.StaticCircleDrawerService }, { type: i22.StaticPolylineDrawerService }, { type: i23.StaticPolygonDrawerService }, { type: i24.StaticEllipseDrawerService }, { type: i25.PolylinePrimitiveDrawerService }, { type: i26.LabelPrimitiveDrawerService }, { type: i27.BillboardPrimitiveDrawerService }, { type: i28.PointPrimitiveDrawerService }, { type: i29.HtmlDrawerService }, { type: i30.CzmlDrawerService }]; }, { 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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Q3RCLGtCQUFrQjtvQkFDbEIsb0JBQW9CO29CQUNwQixxQkFBcUI7b0JBQ3JCLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQixvQkFBb0I7b0JBQ3BCLGtCQUFrQjtvQkFDbEIsZ0JBQWdCO29CQUNoQixxQkFBcUI7b0JBQ3JCLHFCQUFxQjtvQkFDckIsc0JBQXNCO29CQUN0QiwyQkFBMkI7b0JBQzNCLGlCQUFpQjtvQkFDakIsc0JBQXNCO29CQUN0Qiw4QkFBOEI7b0JBQzlCLDJCQUEyQjtvQkFDM0IsK0JBQStCO29CQUMvQiwyQkFBMkI7b0JBQzNCLGlCQUFpQjtvQkFDakIsaUJBQWlCO29CQUVqQiwyQkFBMkI7b0JBQzNCLDRCQUE0QjtvQkFDNUIseUJBQXlCO29CQUN6QiwyQkFBMkI7b0JBQzNCLDBCQUEwQjtvQkFDMUIsMEJBQTBCO2lCQUMzQjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDtzb0NBR0MsSUFBSTtrQkFESCxLQUFLO1lBR04sS0FBSztrQkFESixLQUFLO1lBR04sT0FBTztrQkFETixLQUFLO1lBR04sS0FBSztrQkFESixLQUFLO1lBR04sT0FBTztrQkFETixLQUFLO1lBR04sTUFBTTtrQkFETCxLQUFLO1lBR04sS0FBSztrQkFESixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbSBhcyBvYnNlcnZhYmxlRnJvbSwgbWVyZ2UgYXMgb2JzZXJ2YWJsZU1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbi8vIHRzbGludDpkaXNhYmxlXG5pbXBvcnQgeyBCaWxsYm9hcmREcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9iaWxsYm9hcmQtZHJhd2VyL2JpbGxib2FyZC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbGF5ZXItc2VydmljZS9sYXllci1zZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNOb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IEFjdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBDb21wdXRhdGlvbkNhY2hlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcHV0YXRpb24tY2FjaGUvY29tcHV0YXRpb24tY2FjaGUuc2VydmljZSc7XG5pbXBvcnQgeyBMYWJlbERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2xhYmVsLWRyYXdlci9sYWJlbC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBFbGxpcHNlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvZWxsaXBzZS1kcmF3ZXIvZWxsaXBzZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb2x5bGluZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlsaW5lLWRyYXdlci9wb2x5bGluZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBcmNEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9hcmMtZHJhd2VyL2FyYy1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb2ludERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvaW50LWRyYXdlci9wb2ludC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBY0VudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9hYy1lbnRpdHknO1xuaW1wb3J0IHsgQmFzaWNEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9iYXNpYy1kcmF3ZXIvYmFzaWMtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlnb24tZHJhd2VyL3BvbHlnb24tZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5ZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2xheWVyLW9wdGlvbnMnO1xuaW1wb3J0IHsgRHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9zdGF0aWMtZHluYW1pYy9lbGxpcHNlLWRyYXdlci9keW5hbWljLWVsbGlwc2UtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY1BvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIvZHluYW1pYy1wb2x5bGluZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0aWNDaXJjbGVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9zdGF0aWMtZHluYW1pYy9zdGF0aWMtY2lyY2xlLWRyYXdlci9zdGF0aWMtY2lyY2xlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvc3RhdGljLXBvbHlsaW5lLWRyYXdlci9zdGF0aWMtcG9seWxpbmUtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1wb2x5Z29uLWRyYXdlci9wb2x5Z29uLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9zdGF0aWMtZHluYW1pYy9lbGxpcHNlLWRyYXdlci9lbGxpcHNlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGVsRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvbW9kZWwtZHJhd2VyL21vZGVsLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEJveERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2JveC1kYXdlci9ib3gtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ycmlkb3JEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jb3JyaWRvci1kYXdlci9jb3JyaWRvci1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDeWxpbmRlckRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2N5bGluZGVyLWRhd2VyL2N5bGluZGVyLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEVsbGlwc29pZERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2VsbGlwb2lkLWRyYXdlci9lbGxpcHNvaWQtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9wb2x5bGluZS12b2x1bWUtZGF3ZXIvcG9seWxpbmUtdm9sdW1lLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbGxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy93YWxsLWRhd2VyL3dhbGwtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVjdGFuZ2xlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcmVjdGFuZ2xlLWRhd2VyL3JlY3RhbmdsZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlsaW5lLXByaW1pdGl2ZS1kcmF3ZXIvcG9seWxpbmUtcHJpbWl0aXZlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvbGFiZWwtcHJpbWl0aXZlLWRyYXdlci9sYWJlbC1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmlsbGJvYXJkUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIvYmlsbGJvYXJkLXByaW1pdGl2ZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNYXBMYXllcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFwLWxheWVycy9tYXAtbGF5ZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9wb2ludC1wcmltaXRpdmUtZHJhd2VyL3BvaW50LXByaW1pdGl2ZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBIdG1sRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvaHRtbC1kcmF3ZXIvaHRtbC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDem1sRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvY3ptbC1kcmF3ZXIvY3ptbC1kcmF3ZXIuc2VydmljZSc7XG5cbi8vIHRzbGludDplbmFibGVcbi8qKlxuICogIFRoaXMgaXMgYSBhYy1sYXllciBpbXBsZW1lbnRhdGlvbi5cbiAqICBUaGUgYWMtbGF5ZXIgZWxlbWVudCBtdXN0IGJlIGEgY2hpbGQgb2YgYWMtbWFwIGVsZW1lbnQuXG4gKiAgKyBhY0ZvciBge3N0cmluZ31gIC0gZ2V0IHRoZSB0cmFja2VkIG9ic2VydmFibGUgYW5kIGVudGl0eU5hbWUgKHNlZSB0aGUgZXhhbXBsZSkuXG4gKiAgKyBzaG93IGB7Ym9vbGVhbn1gIC0gc2hvdy9oaWRlIGxheWVyJ3MgZW50aXRpZXMuXG4gKiAgKyBjb250ZXh0IGB7YW55fWAgLSBnZXQgdGhlIGNvbnRleHQgbGF5ZXIgdGhhdCB3aWxsIHVzZSB0aGUgY29tcG9ubmV0IChtb3N0IG9mIHRoZSB0aW1lIGVxdWFsIHRvIFwidGhpc1wiKS5cbiAqICArIG9wdGlvbnMgYHtMYXllck9wdGlvbnN9YCAtIHNldHMgdGhlIGxheWVyIG9wdGlvbnMgZm9yIGVhY2ggZHJhd2VyLlxuICogICsgekluZGV4IGB7bnVtYmVyfWAgLSBjb250cm9scyB0aGUgekluZGV4IChvcmRlcikgb2YgdGhlIGxheWVyLCBsYXllcnMgd2l0aCBncmVhdGVyIHpJbmRleCB3aWxsIGJlIGluIGZyb250IG9mIGxheWVycyB3aXRoIGxvd2VyIHpJbmRleFxuICogICAgKEV4Y2VwdGlvbiBGb3IgYEJpbGxib2FyZGAgYW5kIGBMYWJlbGAsIHNob3VsZCB1c2UgYFtleWVPZmZzZXRdYCBwcm9wIGluc3RlYWQpPC9icj5cbiAqICAgIHpJbmRleCB3b24ndCB3b3JrIGZvciBwcml0aW1pdHZlIGRlc2NzIChsaWtlIGFjLXByaW1pdGl2ZS1wb2x5bGluZS4uLilcbiAqICArIGRlYnVnIGB7Ym9vbGVhbn1gIC0gcHJpbnRzIGV2ZXJ5IGFjTm90aWZpY2F0aW9uXG4gKlxuICpcbiAqICBfX1VzYWdlIDpfX1xuICogIGBgYFxuICogIDxhYy1tYXA+XG4gKiAgICA8YWMtbGF5ZXIgYWNGb3I9XCJsZXQgdHJhY2sgb2YgdHJhY2tzJFwiIFtzaG93XT1cInNob3dcIiBbY29udGV4dF09XCJ0aGlzXCIgW29wdGlvbnNdPVwib3B0aW9uc1wiIFt6SW5kZXhdPVwiMVwiPlxuICogICAgICA8YWMtYmlsbGJvYXJkLWRlc2MgcHJvcHM9XCJ7XG4gKiAgICAgICAgaW1hZ2U6IHRyYWNrLmltYWdlLFxuICogICAgICAgIHBvc2l0aW9uOiB0cmFjay5wb3NpdGlvbixcbiAqICAgICAgICBzY2FsZTogdHJhY2suc2NhbGUsXG4gKiAgICAgICAgY29sb3I6IHRyYWNrLmNvbG9yLFxuICogICAgICAgIG5hbWU6IHRyYWNrLm5hbWVcbiAqICAgICAgfVwiPlxuICogICAgICA8L2FjLWJpbGxib2FyZC1kZXNjPlxuICogICAgICAgIDxhYy1sYWJlbC1kZXNjIHByb3BzPVwie1xuICogICAgICAgICAgcG9zaXRpb246IHRyYWNrLnBvc2l0aW9uLFxuICogICAgICAgICAgcGl4ZWxPZmZzZXQgOiBbLTE1LDIwXSB8IHBpeGVsT2Zmc2V0LFxuICogICAgICAgICAgdGV4dDogdHJhY2submFtZSxcbiAqICAgICAgICAgIGZvbnQ6ICcxNXB4IHNhbnMtc2VyaWYnXG4gKiAgICAgICAgfVwiPlxuICogICAgICA8L2FjLWxhYmVsLWRlc2M+XG4gKiAgICA8L2FjLWxheWVyPlxuICogIDwvYWMtbWFwPlxuICogIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhYy1sYXllcicsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIHByb3ZpZGVyczogW1xuICAgIExheWVyU2VydmljZSxcbiAgICBDb21wdXRhdGlvbkNhY2hlLFxuICAgIEJpbGxib2FyZERyYXdlclNlcnZpY2UsXG4gICAgTGFiZWxEcmF3ZXJTZXJ2aWNlLFxuICAgIEVsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxuICAgIFBvbHlsaW5lRHJhd2VyU2VydmljZSxcbiAgICBBcmNEcmF3ZXJTZXJ2aWNlLFxuICAgIFBvaW50RHJhd2VyU2VydmljZSxcbiAgICBQb2x5Z29uRHJhd2VyU2VydmljZSxcbiAgICBNb2RlbERyYXdlclNlcnZpY2UsXG4gICAgQm94RHJhd2VyU2VydmljZSxcbiAgICBDb3JyaWRvckRyYXdlclNlcnZpY2UsXG4gICAgQ3lsaW5kZXJEcmF3ZXJTZXJ2aWNlLFxuICAgIEVsbGlwc29pZERyYXdlclNlcnZpY2UsXG4gICAgUG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlLFxuICAgIFdhbGxEcmF3ZXJTZXJ2aWNlLFxuICAgIFJlY3RhbmdsZURyYXdlclNlcnZpY2UsXG4gICAgUG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgIExhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZSxcbiAgICBCaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgIFBvaW50UHJpbWl0aXZlRHJhd2VyU2VydmljZSxcbiAgICBIdG1sRHJhd2VyU2VydmljZSxcbiAgICBDem1sRHJhd2VyU2VydmljZSxcblxuICAgIER5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZSxcbiAgICBEeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgIFN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2UsXG4gICAgU3RhdGljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgIFN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlLFxuICAgIFN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQWNMYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBzaG93ID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYWNGb3I6IHN0cmluZztcbiAgQElucHV0KClcbiAgY29udGV4dDogYW55O1xuICBASW5wdXQoKVxuICBzdG9yZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBvcHRpb25zOiBMYXllck9wdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHpJbmRleCA9IDA7XG4gIEBJbnB1dCgpXG4gIGRlYnVnID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY0ZvclJneCA9IC9ebGV0XFxzKy4rXFxzK29mXFxzKy4rJC87XG4gIHByaXZhdGUgZW50aXR5TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0b3BPYnNlcnZhYmxlID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBwcml2YXRlIG9ic2VydmFibGU6IE9ic2VydmFibGU8QWNOb3RpZmljYXRpb24+O1xuICBwcml2YXRlIF9kcmF3ZXJMaXN0OiBNYXA8c3RyaW5nLCBCYXNpY0RyYXdlclNlcnZpY2U+O1xuICBwcml2YXRlIF91cGRhdGVTdHJlYW06IFN1YmplY3Q8QWNOb3RpZmljYXRpb24+ID0gbmV3IFN1YmplY3Q8QWNOb3RpZmljYXRpb24+KCk7XG4gIHByaXZhdGUgZW50aXRpZXNTdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgbGF5ZXJEcmF3ZXJEYXRhU291cmNlczogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb21wdXRhdGlvbkNhY2hlOiBDb21wdXRhdGlvbkNhY2hlLFxuICAgICAgICAgICAgICBwcml2YXRlIG1hcExheWVyc1NlcnZpY2U6IE1hcExheWVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIGJpbGxib2FyZERyYXdlclNlcnZpY2U6IEJpbGxib2FyZERyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGxhYmVsRHJhd2VyU2VydmljZTogTGFiZWxEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBlbGxpcHNlRHJhd2VyU2VydmljZTogRWxsaXBzZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHBvbHlsaW5lRHJhd2VyU2VydmljZTogUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwb2x5Z29uRHJhd2VyU2VydmljZTogUG9seWdvbkRyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGFyY0RyYXdlclNlcnZpY2U6IEFyY0RyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHBvaW50RHJhd2VyU2VydmljZTogUG9pbnREcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBtb2RlbERyYXdlclNlcnZpY2U6IE1vZGVsRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgYm94RHJhd2VyU2VydmljZTogQm94RHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgY29ycmlkb3JEcmF3ZXJTZXJ2aWNlOiBDb3JyaWRvckRyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGN5bGluZGVyRHJhd2VyU2VydmljZTogQ3lsaW5kZXJEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBlbGxpcHNvaWREcmF3ZXJTZXJpY2U6IEVsbGlwc29pZERyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHBvbHlsaW5lVm9sdW1lRHJhd2VyU2VydmljZTogUG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICB3YWxsRHJhd2VyU2VydmljZTogV2FsbERyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHJlY3RhbmdsZURyYXdlclNlcnZpY2U6IFJlY3RhbmdsZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGR5bmFtaWNFbGxpcHNlRHJhd2VyU2VydmljZTogRHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBkeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlOiBEeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBzdGF0aWNDaXJjbGVEcmF3ZXJTZXJ2aWNlOiBTdGF0aWNDaXJjbGVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBzdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2U6IFN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgc3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2U6IFN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBzdGF0aWNFbGxpcHNlRHJhd2VyU2VydmljZTogU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZTogUG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBsYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2U6IExhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgYmlsbGJvYXJkUHJpbWl0aXZlRHJhd2VyU2VydmljZTogQmlsbGJvYXJkUHJpbWl0aXZlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlOiBQb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGh0bWxEcmF3ZXJTZXJ2aWNlOiBIdG1sRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgY3ptbERyYXdlclNlcnZpY2U6IEN6bWxEcmF3ZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2RyYXdlckxpc3QgPSBuZXcgTWFwKFtcbiAgICAgIFsnYmlsbGJvYXJkJywgYmlsbGJvYXJkRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2xhYmVsJywgbGFiZWxEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnZWxsaXBzZScsIGVsbGlwc2VEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsncG9seWxpbmUnLCBwb2x5bGluZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydwb2x5Z29uJywgcG9seWdvbkRyYXdlclNlcnZpY2UgYXMgQmFzaWNEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnYXJjJywgYXJjRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3BvaW50JywgcG9pbnREcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnbW9kZWwnLCBtb2RlbERyYXdlclNlcnZpY2VdLFxuICAgICAgWydib3gnLCBib3hEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnY29ycmlkb3InLCBjb3JyaWRvckRyYXdlclNlcnZpY2VdLFxuICAgICAgWydjeWxpbmRlcicsIGN5bGluZGVyRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2VsbGlwc29pZCcsIGVsbGlwc29pZERyYXdlclNlcmljZV0sXG4gICAgICBbJ3BvbHlsaW5lVm9sdW1lJywgcG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsncmVjdGFuZ2xlJywgcmVjdGFuZ2xlRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3dhbGwnLCB3YWxsRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3BvbHlsaW5lUHJpbWl0aXZlJywgcG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnbGFiZWxQcmltaXRpdmUnLCBsYWJlbFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydiaWxsYm9hcmRQcmltaXRpdmUnLCBiaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsncG9pbnRQcmltaXRpdmUnLCBwb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydodG1sJywgaHRtbERyYXdlclNlcnZpY2VdLFxuICAgICAgWydjem1sJywgY3ptbERyYXdlclNlcnZpY2VdLFxuXG4gICAgICBbJ2R5bmFtaWNFbGxpcHNlJywgZHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnZHluYW1pY1BvbHlsaW5lJywgZHluYW1pY1BvbHlsaW5lRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3N0YXRpY0NpcmNsZScsIHN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydzdGF0aWNQb2x5bGluZScsIHN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3N0YXRpY1BvbHlnb24nLCBzdGF0aWNQb2x5Z29uRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3N0YXRpY0VsbGlwc2UnLCBzdGF0aWNFbGxpcHNlRHJhd2VyU2VydmljZV0sXG4gICAgXSk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuaW5pdFZhbGlkUGFyYW1zKCk7XG5cbiAgICBvYnNlcnZhYmxlTWVyZ2UodGhpcy5fdXBkYXRlU3RyZWFtLCB0aGlzLm9ic2VydmFibGUpLnBpcGU8QWNOb3RpZmljYXRpb24+KHRha2VVbnRpbCh0aGlzLnN0b3BPYnNlcnZhYmxlKSkuc3Vic2NyaWJlKChub3RpZmljYXRpb24pID0+IHtcbiAgICAgIHRoaXMuX2NvbXB1dGF0aW9uQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FjTGF5ZXIgcmVjZWl2ZWQgbm90aWZpY2F0aW9uOicsIG5vdGlmaWNhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb2