UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

271 lines 39.8 kB
import { Injectable } from "@angular/core"; import isNil from "lodash/isNil"; import { OVERLAY_ARROW_SIZE } from "./constants"; import { OverlayPlacement, OverlayPosition, } from "./types"; import * as i0 from "@angular/core"; var OverlayPanelClass; (function (OverlayPanelClass) { OverlayPanelClass["overlayCenterTop"] = "overlay-center-top"; OverlayPanelClass["overlayTopLeft"] = "overlay-top-left"; OverlayPanelClass["overlayTopRight"] = "overlay-top-right"; OverlayPanelClass["overlayCenterBottom"] = "overlay-center-bottom"; OverlayPanelClass["overlayBottomRight"] = "overlay-bottom-right"; OverlayPanelClass["overlayBottomLeft"] = "overlay-bottom-left"; OverlayPanelClass["overlayCenterLeft"] = "overlay-center-left"; OverlayPanelClass["overlayLeftTop"] = "overlay-left-top"; OverlayPanelClass["overlayLeftBottom"] = "overlay-left-bottom"; OverlayPanelClass["overlayCenterRight"] = "overlay-center-right"; OverlayPanelClass["overlayRightTop"] = "overlay-right-top"; OverlayPanelClass["overlayRightBottom"] = "overlay-right-bottom"; })(OverlayPanelClass || (OverlayPanelClass = {})); export class OverlayPositionService { setOverlayPositionConfig(config) { this.arrowSize = !isNil(config?.arrowSize) ? config?.arrowSize : OVERLAY_ARROW_SIZE; this.arrowPadding = !isNil(config?.arrowPadding) ? config?.arrowPadding : 0; this.overlayPositions = getOverlayPositions(); } updateOffsetOnPositionChanges(positionStrategy, getOverlayRef) { return positionStrategy.positionChanges.subscribe((connectedPosition) => { const overlayRefElement = getOverlayRef().overlayElement; const panelClass = connectedPosition.connectionPair.panelClass; if (!panelClass) { return; } this.setOverlayOffset(panelClass, overlayRefElement); }); } setOverlayOffset(panelClass, overlayRefElement) { if (Array.isArray(panelClass)) { panelClass = this.getOverlayPositionPanelClass(panelClass); } if (!panelClass) { return; } overlayRefElement.style.marginLeft = ""; overlayRefElement.style.marginTop = ""; overlayRefElement.style.marginBottom = ""; overlayRefElement.style.marginRight = ""; switch (panelClass) { case OverlayPanelClass.overlayCenterTop: overlayRefElement.style.marginBottom = this.arrowSize + "px"; break; case OverlayPanelClass.overlayTopLeft: overlayRefElement.style.marginRight = 2 * this.arrowPadding + "px"; overlayRefElement.style.marginBottom = this.arrowSize + "px"; break; case OverlayPanelClass.overlayTopRight: overlayRefElement.style.marginLeft = 2 * this.arrowPadding + "px"; overlayRefElement.style.marginBottom = this.arrowSize + "px"; break; case OverlayPanelClass.overlayCenterBottom: overlayRefElement.style.marginTop = this.arrowSize + "px"; break; case OverlayPanelClass.overlayBottomRight: overlayRefElement.style.marginLeft = 2 * this.arrowPadding + "px"; overlayRefElement.style.marginTop = this.arrowSize + "px"; break; case OverlayPanelClass.overlayBottomLeft: overlayRefElement.style.marginRight = 2 * this.arrowPadding + "px"; overlayRefElement.style.marginTop = this.arrowSize + "px"; break; case OverlayPanelClass.overlayCenterLeft: overlayRefElement.style.marginRight = this.arrowSize + "px"; break; case OverlayPanelClass.overlayLeftTop: overlayRefElement.style.marginRight = this.arrowSize + "px"; break; case OverlayPanelClass.overlayLeftBottom: overlayRefElement.style.marginRight = this.arrowSize + "px"; break; case OverlayPanelClass.overlayCenterRight: overlayRefElement.style.marginLeft = this.arrowSize + "px"; break; case OverlayPanelClass.overlayRightTop: overlayRefElement.style.marginLeft = this.arrowSize + "px"; break; case OverlayPanelClass.overlayRightBottom: overlayRefElement.style.marginLeft = this.arrowSize + "px"; break; } } getPossiblePositionsForPlacement(placement) { const possiblePositions = []; // add positions for the requested placement possiblePositions.push(...this.getPositionsForPlacement(placement)); // add positions for the opposite placement in case the requested placement // would be rendered outside the screen switch (placement) { case OverlayPlacement.Left: possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Right), ...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Bottom)); break; case OverlayPlacement.Right: possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Bottom)); break; case OverlayPlacement.Top: possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Bottom), ...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Right)); break; case OverlayPlacement.Bottom: possiblePositions.push(...this.getPositionsForPlacement(OverlayPlacement.Top), ...this.getPositionsForPlacement(OverlayPlacement.Left), ...this.getPositionsForPlacement(OverlayPlacement.Right)); break; } return possiblePositions; } getOverlayPositionPanelClass(panelClass) { let result; for (const panelClassKey in OverlayPanelClass) { if (OverlayPanelClass.hasOwnProperty(panelClassKey)) { result = panelClass.find((i) => i === panelClassKey); } } return result || ""; } /** * Returns all possible positions for a placement * Eg: left => [OVERLAY_POSITIONS[centerLeft], OVERLAY_POSITIONS[topLeft], OVERLAY_POSITIONS[bottomLeft]] * * @param placement * @returns ConnectedPosition[] */ getPositionsForPlacement(placement) { let possiblePositionNames = []; switch (placement) { case OverlayPlacement.Left: possiblePositionNames = [ OverlayPosition.centerLeft, OverlayPosition.leftTop, OverlayPosition.leftBottom, ]; break; case OverlayPlacement.Right: possiblePositionNames = [ OverlayPosition.centerRight, OverlayPosition.rightTop, OverlayPosition.rightBottom, ]; break; case OverlayPlacement.Top: possiblePositionNames = [ OverlayPosition.centerTop, OverlayPosition.topLeft, OverlayPosition.topRight, ]; break; case OverlayPlacement.Bottom: possiblePositionNames = [ OverlayPosition.centerBottom, OverlayPosition.bottomLeft, OverlayPosition.bottomRight, ]; break; case OverlayPlacement.Custom: throw new Error(`Custom position should be handled by user`); } return possiblePositionNames.map((positionName) => this.overlayPositions[positionName]); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverlayPositionService, decorators: [{ type: Injectable }] }); export function getOverlayPositions() { return { // TOP [OverlayPosition.centerTop]: { panelClass: "overlay-center-top", originX: "center", originY: "top", overlayX: "center", overlayY: "bottom", }, [OverlayPosition.topLeft]: { panelClass: "overlay-top-left", originX: "end", originY: "top", overlayX: "end", overlayY: "bottom", }, [OverlayPosition.topRight]: { panelClass: "overlay-top-right", originX: "start", originY: "top", overlayX: "start", overlayY: "bottom", }, // BOTTOM [OverlayPosition.centerBottom]: { panelClass: "overlay-center-bottom", originX: "center", originY: "bottom", overlayX: "center", overlayY: "top", }, [OverlayPosition.bottomRight]: { panelClass: "overlay-bottom-right", originX: "start", originY: "bottom", overlayX: "start", overlayY: "top", }, [OverlayPosition.bottomLeft]: { panelClass: "overlay-bottom-left", originX: "end", originY: "bottom", overlayX: "end", overlayY: "top", }, // LEFT [OverlayPosition.centerLeft]: { panelClass: "overlay-center-left", originX: "start", originY: "center", overlayX: "end", overlayY: "center", }, [OverlayPosition.leftTop]: { panelClass: "overlay-left-top", originX: "start", originY: "bottom", overlayX: "end", overlayY: "bottom", }, [OverlayPosition.leftBottom]: { panelClass: "overlay-left-bottom", originX: "start", originY: "top", overlayX: "end", overlayY: "top", }, // RIGHT [OverlayPosition.centerRight]: { panelClass: "overlay-center-right", originX: "end", originY: "center", overlayX: "start", overlayY: "center", }, [OverlayPosition.rightTop]: { panelClass: "overlay-right-top", originX: "end", originY: "bottom", overlayX: "start", overlayY: "bottom", }, [OverlayPosition.rightBottom]: { panelClass: "overlay-right-bottom", originX: "end", originY: "top", overlayX: "start", overlayY: "top", }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wb3NpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9vdmVybGF5L292ZXJsYXktcG9zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEwQkEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFHakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFFSCxnQkFBZ0IsRUFDaEIsZUFBZSxHQUNsQixNQUFNLFNBQVMsQ0FBQzs7QUFFakIsSUFBSyxpQkFhSjtBQWJELFdBQUssaUJBQWlCO0lBQ2xCLDREQUF1QyxDQUFBO0lBQ3ZDLHdEQUFtQyxDQUFBO0lBQ25DLDBEQUFxQyxDQUFBO0lBQ3JDLGtFQUE2QyxDQUFBO0lBQzdDLGdFQUEyQyxDQUFBO0lBQzNDLDhEQUF5QyxDQUFBO0lBQ3pDLDhEQUF5QyxDQUFBO0lBQ3pDLHdEQUFtQyxDQUFBO0lBQ25DLDhEQUF5QyxDQUFBO0lBQ3pDLGdFQUEyQyxDQUFBO0lBQzNDLDBEQUFxQyxDQUFBO0lBQ3JDLGdFQUEyQyxDQUFBO0FBQy9DLENBQUMsRUFiSSxpQkFBaUIsS0FBakIsaUJBQWlCLFFBYXJCO0FBR0QsTUFBTSxPQUFPLHNCQUFzQjtJQU94Qix3QkFBd0IsQ0FDM0IsTUFBc0M7UUFFdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ3RDLENBQUMsQ0FBUyxNQUFNLEVBQUUsU0FBUztZQUMzQixDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO1lBQzVDLENBQUMsQ0FBUyxNQUFNLEVBQUUsWUFBWTtZQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVNLDZCQUE2QixDQUNoQyxnQkFBbUQsRUFDbkQsYUFBK0I7UUFFL0IsT0FBTyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUM3QyxDQUFDLGlCQUFpRCxFQUFFLEVBQUU7WUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztZQUMvRCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNiLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FDcEIsVUFBNkIsRUFDN0IsaUJBQThCO1FBRTlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLE9BQU87U0FDVjtRQUVELGlCQUFpQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQzFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXpDLFFBQVEsVUFBVSxFQUFFO1lBQ2hCLEtBQUssaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUNuQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUM3RCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxjQUFjO2dCQUNqQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVztvQkFDL0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUM3RCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO2dCQUNsQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDOUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUM3RCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxtQkFBbUI7Z0JBQ3RDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQzFELE1BQU07WUFDVixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtnQkFDckMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVU7b0JBQzlCLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDakMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDMUQsTUFBTTtZQUNWLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO2dCQUNwQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVztvQkFDL0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUMxRCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7Z0JBQ3BDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQzVELE1BQU07WUFDVixLQUFLLGlCQUFpQixDQUFDLGNBQWM7Z0JBQ2pDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQzVELE1BQU07WUFDVixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjtnQkFDcEMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDNUQsTUFBTTtZQUNWLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO2dCQUNyQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUMzRCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO2dCQUNsQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUMzRCxNQUFNO1lBQ1YsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7Z0JBQ3JDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQzNELE1BQU07U0FDYjtJQUNMLENBQUM7SUFFTSxnQ0FBZ0MsQ0FDbkMsU0FBMkI7UUFFM0IsTUFBTSxpQkFBaUIsR0FBd0IsRUFBRSxDQUFDO1FBRWxELDRDQUE0QztRQUM1QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVwRSwyRUFBMkU7UUFDM0UsdUNBQXVDO1FBQ3ZDLFFBQVEsU0FBUyxFQUFFO1lBQ2YsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJO2dCQUN0QixpQkFBaUIsQ0FBQyxJQUFJLENBQ2xCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUN4RCxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFDdEQsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQzVELENBQUM7Z0JBQ0YsTUFBTTtZQUNWLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDdkIsaUJBQWlCLENBQUMsSUFBSSxDQUNsQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFDdkQsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQ3RELEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUM1RCxDQUFDO2dCQUNGLE1BQU07WUFDVixLQUFLLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3JCLGlCQUFpQixDQUFDLElBQUksQ0FDbEIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQ3pELEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUN2RCxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FDM0QsQ0FBQztnQkFDRixNQUFNO1lBQ1YsS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxJQUFJLENBQ2xCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUN0RCxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFDdkQsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQzNELENBQUM7Z0JBQ0YsTUFBTTtTQUNiO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sNEJBQTRCLENBQUMsVUFBb0I7UUFDckQsSUFBSSxNQUFNLENBQUM7UUFDWCxLQUFLLE1BQU0sYUFBYSxJQUFJLGlCQUFpQixFQUFFO1lBQzNDLElBQUksaUJBQWlCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDO2FBQ3hEO1NBQ0o7UUFDRCxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHdCQUF3QixDQUM1QixTQUEyQjtRQUUzQixJQUFJLHFCQUFxQixHQUFzQixFQUFFLENBQUM7UUFDbEQsUUFBUSxTQUFTLEVBQUU7WUFDZixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3RCLHFCQUFxQixHQUFHO29CQUNwQixlQUFlLENBQUMsVUFBVTtvQkFDMUIsZUFBZSxDQUFDLE9BQU87b0JBQ3ZCLGVBQWUsQ0FBQyxVQUFVO2lCQUM3QixDQUFDO2dCQUNGLE1BQU07WUFFVixLQUFLLGdCQUFnQixDQUFDLEtBQUs7Z0JBQ3ZCLHFCQUFxQixHQUFHO29CQUNwQixlQUFlLENBQUMsV0FBVztvQkFDM0IsZUFBZSxDQUFDLFFBQVE7b0JBQ3hCLGVBQWUsQ0FBQyxXQUFXO2lCQUM5QixDQUFDO2dCQUNGLE1BQU07WUFFVixLQUFLLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3JCLHFCQUFxQixHQUFHO29CQUNwQixlQUFlLENBQUMsU0FBUztvQkFDekIsZUFBZSxDQUFDLE9BQU87b0JBQ3ZCLGVBQWUsQ0FBQyxRQUFRO2lCQUMzQixDQUFDO2dCQUNGLE1BQU07WUFFVixLQUFLLGdCQUFnQixDQUFDLE1BQU07Z0JBQ3hCLHFCQUFxQixHQUFHO29CQUNwQixlQUFlLENBQUMsWUFBWTtvQkFDNUIsZUFBZSxDQUFDLFVBQVU7b0JBQzFCLGVBQWUsQ0FBQyxXQUFXO2lCQUM5QixDQUFDO2dCQUNGLE1BQU07WUFFVixLQUFLLGdCQUFnQixDQUFDLE1BQU07Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUNwRTtRQUVELE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUM1QixDQUFDLFlBQTZCLEVBQUUsRUFBRSxDQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQzFDLENBQUM7SUFDTixDQUFDOytHQTlNUSxzQkFBc0I7bUhBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVTs7QUFrTlgsTUFBTSxVQUFVLG1CQUFtQjtJQUkvQixPQUFPO1FBQ0gsTUFBTTtRQUNOLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3pCLFVBQVUsRUFBRSxvQkFBb0I7WUFDaEMsT0FBTyxFQUFFLFFBQVE7WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtRQUNELENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsT0FBTyxFQUFFLEtBQUs7WUFDZCxPQUFPLEVBQUUsS0FBSztZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxTQUFTO1FBQ1QsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDNUIsVUFBVSxFQUFFLHVCQUF1QjtZQUNuQyxPQUFPLEVBQUUsUUFBUTtZQUNqQixPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsS0FBSztTQUNsQjtRQUNELENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzNCLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLEtBQUs7U0FDbEI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQixVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztTQUNsQjtRQUNELE9BQU87UUFDUCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQixVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixVQUFVLEVBQUUsa0JBQWtCO1lBQzlCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQixVQUFVLEVBQUUscUJBQXFCO1lBQ2pDLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztTQUNsQjtRQUNELFFBQVE7UUFDUixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzQixVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLFFBQVE7WUFDakIsUUFBUSxFQUFFLE9BQU87WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDckI7UUFDRCxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzQixVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsS0FBSztTQUNsQjtLQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxuICAgIENvbm5lY3RlZFBvc2l0aW9uLFxuICAgIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgICBPdmVybGF5UmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IE9WRVJMQVlfQVJST1dfU0laRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgICBJT3ZlcmxheVBvc2l0aW9uU2VydmljZUNvbmZpZyxcbiAgICBPdmVybGF5UGxhY2VtZW50LFxuICAgIE92ZXJsYXlQb3NpdGlvbixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZW51bSBPdmVybGF5UGFuZWxDbGFzcyB7XG4gICAgb3ZlcmxheUNlbnRlclRvcCA9IFwib3ZlcmxheS1jZW50ZXItdG9wXCIsXG4gICAgb3ZlcmxheVRvcExlZnQgPSBcIm92ZXJsYXktdG9wLWxlZnRcIixcbiAgICBvdmVybGF5VG9wUmlnaHQgPSBcIm92ZXJsYXktdG9wLXJpZ2h0XCIsXG4gICAgb3ZlcmxheUNlbnRlckJvdHRvbSA9IFwib3ZlcmxheS1jZW50ZXItYm90dG9tXCIsXG4gICAgb3ZlcmxheUJvdHRvbVJpZ2h0ID0gXCJvdmVybGF5LWJvdHRvbS1yaWdodFwiLFxuICAgIG92ZXJsYXlCb3R0b21MZWZ0ID0gXCJvdmVybGF5LWJvdHRvbS1sZWZ0XCIsXG4gICAgb3ZlcmxheUNlbnRlckxlZnQgPSBcIm92ZXJsYXktY2VudGVyLWxlZnRcIixcbiAgICBvdmVybGF5TGVmdFRvcCA9IFwib3ZlcmxheS1sZWZ0LXRvcFwiLFxuICAgIG92ZXJsYXlMZWZ0Qm90dG9tID0gXCJvdmVybGF5LWxlZnQtYm90dG9tXCIsXG4gICAgb3ZlcmxheUNlbnRlclJpZ2h0ID0gXCJvdmVybGF5LWNlbnRlci1yaWdodFwiLFxuICAgIG92ZXJsYXlSaWdodFRvcCA9IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICBvdmVybGF5UmlnaHRCb3R0b20gPSBcIm92ZXJsYXktcmlnaHQtYm90dG9tXCIsXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPdmVybGF5UG9zaXRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIG92ZXJsYXlQb3NpdGlvbnM6IFJlY29yZDxPdmVybGF5UG9zaXRpb24sIENvbm5lY3RlZFBvc2l0aW9uPjtcblxuICAgIHByaXZhdGUgYXJyb3dTaXplOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBhcnJvd1BhZGRpbmc6IG51bWJlcjtcbiAgICBwdWJsaWMgY29uZmlnOiBJT3ZlcmxheVBvc2l0aW9uU2VydmljZUNvbmZpZztcblxuICAgIHB1YmxpYyBzZXRPdmVybGF5UG9zaXRpb25Db25maWcoXG4gICAgICAgIGNvbmZpZz86IElPdmVybGF5UG9zaXRpb25TZXJ2aWNlQ29uZmlnXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXJyb3dTaXplID0gIWlzTmlsKGNvbmZpZz8uYXJyb3dTaXplKVxuICAgICAgICAgICAgPyA8bnVtYmVyPmNvbmZpZz8uYXJyb3dTaXplXG4gICAgICAgICAgICA6IE9WRVJMQVlfQVJST1dfU0laRTtcbiAgICAgICAgdGhpcy5hcnJvd1BhZGRpbmcgPSAhaXNOaWwoY29uZmlnPy5hcnJvd1BhZGRpbmcpXG4gICAgICAgICAgICA/IDxudW1iZXI+Y29uZmlnPy5hcnJvd1BhZGRpbmdcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgdGhpcy5vdmVybGF5UG9zaXRpb25zID0gZ2V0T3ZlcmxheVBvc2l0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVPZmZzZXRPblBvc2l0aW9uQ2hhbmdlcyhcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICAgICAgICBnZXRPdmVybGF5UmVmOiAoKSA9PiBPdmVybGF5UmVmXG4gICAgKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uU3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICAgICAgIChjb25uZWN0ZWRQb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVJlZkVsZW1lbnQgPSBnZXRPdmVybGF5UmVmKCkub3ZlcmxheUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxDbGFzcyA9IGNvbm5lY3RlZFBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLnBhbmVsQ2xhc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRPdmVybGF5T2Zmc2V0KHBhbmVsQ2xhc3MsIG92ZXJsYXlSZWZFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE92ZXJsYXlPZmZzZXQoXG4gICAgICAgIHBhbmVsQ2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvdmVybGF5UmVmRWxlbWVudDogSFRNTEVsZW1lbnRcbiAgICApIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFuZWxDbGFzcykpIHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3MgPSB0aGlzLmdldE92ZXJsYXlQb3NpdGlvblBhbmVsQ2xhc3MocGFuZWxDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhbmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIlwiO1xuICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IFwiXCI7XG5cbiAgICAgICAgc3dpdGNoIChwYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlDZW50ZXJUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luQm90dG9tID0gdGhpcy5hcnJvd1NpemUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlUb3BMZWZ0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgMiAqIHRoaXMuYXJyb3dQYWRkaW5nICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkJvdHRvbSA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5VG9wUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9XG4gICAgICAgICAgICAgICAgICAgIDIgKiB0aGlzLmFycm93UGFkZGluZyArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLmFycm93U2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBhbmVsQ2xhc3Mub3ZlcmxheUNlbnRlckJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmFycm93U2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBhbmVsQ2xhc3Mub3ZlcmxheUJvdHRvbVJpZ2h0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPVxuICAgICAgICAgICAgICAgICAgICAyICogdGhpcy5hcnJvd1BhZGRpbmcgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gdGhpcy5hcnJvd1NpemUgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQYW5lbENsYXNzLm92ZXJsYXlCb3R0b21MZWZ0OlxuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblJpZ2h0ID1cbiAgICAgICAgICAgICAgICAgICAgMiAqIHRoaXMuYXJyb3dQYWRkaW5nICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlSZWZFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5Q2VudGVyTGVmdDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5TGVmdFRvcDpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5TGVmdEJvdHRvbTpcbiAgICAgICAgICAgICAgICBvdmVybGF5UmVmRWxlbWVudC5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5Q2VudGVyUmlnaHQ6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5UmlnaHRUb3A6XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGFuZWxDbGFzcy5vdmVybGF5UmlnaHRCb3R0b206XG4gICAgICAgICAgICAgICAgb3ZlcmxheVJlZkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYXJyb3dTaXplICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBvc3NpYmxlUG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IE92ZXJsYXlQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgcG9zc2libGVQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXTtcblxuICAgICAgICAvLyBhZGQgcG9zaXRpb25zIGZvciB0aGUgcmVxdWVzdGVkIHBsYWNlbWVudFxuICAgICAgICBwb3NzaWJsZVBvc2l0aW9ucy5wdXNoKC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KHBsYWNlbWVudCkpO1xuXG4gICAgICAgIC8vIGFkZCBwb3NpdGlvbnMgZm9yIHRoZSBvcHBvc2l0ZSBwbGFjZW1lbnQgaW4gY2FzZSB0aGUgcmVxdWVzdGVkIHBsYWNlbWVudFxuICAgICAgICAvLyB3b3VsZCBiZSByZW5kZXJlZCBvdXRzaWRlIHRoZSBzY3JlZW5cbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LlRvcCksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuQm90dG9tKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5MZWZ0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5Ub3ApLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkJvdHRvbSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPdmVybGF5UGxhY2VtZW50LlRvcDpcbiAgICAgICAgICAgICAgICBwb3NzaWJsZVBvc2l0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkJvdHRvbSksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuTGVmdCksXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRQb3NpdGlvbnNGb3JQbGFjZW1lbnQoT3ZlcmxheVBsYWNlbWVudC5Ub3ApLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LkxlZnQpLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmdldFBvc2l0aW9uc0ZvclBsYWNlbWVudChPdmVybGF5UGxhY2VtZW50LlJpZ2h0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zc2libGVQb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPdmVybGF5UG9zaXRpb25QYW5lbENsYXNzKHBhbmVsQ2xhc3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbENsYXNzS2V5IGluIE92ZXJsYXlQYW5lbENsYXNzKSB7XG4gICAgICAgICAgICBpZiAoT3ZlcmxheVBhbmVsQ2xhc3MuaGFzT3duUHJvcGVydHkocGFuZWxDbGFzc0tleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBwYW5lbENsYXNzLmZpbmQoKGkpID0+IGkgPT09IHBhbmVsQ2xhc3NLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgXCJcIjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBwb3NzaWJsZSBwb3NpdGlvbnMgZm9yIGEgcGxhY2VtZW50XG4gICAgICogRWc6IGxlZnQgPT4gW09WRVJMQVlfUE9TSVRJT05TW2NlbnRlckxlZnRdLCBPVkVSTEFZX1BPU0lUSU9OU1t0b3BMZWZ0XSwgT1ZFUkxBWV9QT1NJVElPTlNbYm90dG9tTGVmdF1dXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhY2VtZW50XG4gICAgICogQHJldHVybnMgQ29ubmVjdGVkUG9zaXRpb25bXVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UG9zaXRpb25zRm9yUGxhY2VtZW50KFxuICAgICAgICBwbGFjZW1lbnQ6IE92ZXJsYXlQbGFjZW1lbnRcbiAgICApOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgbGV0IHBvc3NpYmxlUG9zaXRpb25OYW1lczogT3ZlcmxheVBvc2l0aW9uW10gPSBbXTtcbiAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUG9zaXRpb25OYW1lcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLmNlbnRlckxlZnQsXG4gICAgICAgICAgICAgICAgICAgIE92ZXJsYXlQb3NpdGlvbi5sZWZ0VG9wLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIE92ZXJsYXlQbGFjZW1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIE92ZXJsYXlQb3NpdGlvbi5yaWdodFRvcCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Ub3A6XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyVG9wLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24udG9wTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgcG9zc2libGVQb3NpdGlvbk5hbWVzID0gW1xuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uY2VudGVyQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICBPdmVybGF5UG9zaXRpb24uYm90dG9tTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgT3ZlcmxheVBvc2l0aW9uLmJvdHRvbVJpZ2h0LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgT3ZlcmxheVBsYWNlbWVudC5DdXN0b206XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDdXN0b20gcG9zaXRpb24gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdXNlcmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlUG9zaXRpb25OYW1lcy5tYXAoXG4gICAgICAgICAgICAocG9zaXRpb25OYW1lOiBPdmVybGF5UG9zaXRpb24pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5UG9zaXRpb25zW3Bvc2l0aW9uTmFtZV1cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdmVybGF5UG9zaXRpb25zKCk6IFJlY29yZDxcbiAgICBPdmVybGF5UG9zaXRpb24sXG4gICAgQ29ubmVjdGVkUG9zaXRpb25cbj4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRPUFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLmNlbnRlclRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1jZW50ZXItdG9wXCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24udG9wTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS10b3AtbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLnRvcFJpZ2h0XToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXRvcC1yaWdodFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQk9UVE9NXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyQm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LWNlbnRlci1ib3R0b21cIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfSxcbiAgICAgICAgW092ZXJsYXlQb3NpdGlvbi5ib3R0b21SaWdodF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1ib3R0b20tcmlnaHRcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uYm90dG9tTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1ib3R0b20tbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcInRvcFwiLFxuICAgICAgICB9LFxuICAgICAgICAvLyBMRUZUXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyTGVmdF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1jZW50ZXItbGVmdFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiY2VudGVyXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24ubGVmdFRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1sZWZ0LXRvcFwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwiYm90dG9tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24ubGVmdEJvdHRvbV06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1sZWZ0LWJvdHRvbVwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcImVuZFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJJR0hUXG4gICAgICAgIFtPdmVybGF5UG9zaXRpb24uY2VudGVyUmlnaHRdOiB7XG4gICAgICAgICAgICBwYW5lbENsYXNzOiBcIm92ZXJsYXktY2VudGVyLXJpZ2h0XCIsXG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJjZW50ZXJcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJjZW50ZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAgW092ZXJsYXlQb3NpdGlvbi5yaWdodFRvcF06IHtcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwib3ZlcmxheS1yaWdodC10b3BcIixcbiAgICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwic3RhcnRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9LFxuICAgICAgICBbT3ZlcmxheVBvc2l0aW9uLnJpZ2h0Qm90dG9tXToge1xuICAgICAgICAgICAgcGFuZWxDbGFzczogXCJvdmVybGF5LXJpZ2h0LWJvdHRvbVwiLFxuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3ZlcmxheVk6IFwidG9wXCIsXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdfQ==