@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
126 lines • 20.2 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class OverlayPlacementService {
/** Updates the position of the current menu. */
updatePosition(overlayRef, placement, alignment, customFallbackPlacement) {
const position = overlayRef.getConfig().positionStrategy;
const origin = this.getOrigin(placement, alignment);
const overlay = this.getOverlayPosition(placement, alignment);
position.withPositions(this.addPositions(origin, overlay, customFallbackPlacement));
}
/** Apply position to position strategy */
addPositions(origin, overlay, customFallbackPlacement) {
if (customFallbackPlacement) {
return [
{ ...origin.main, ...overlay.main },
this.getFallbackPosition(customFallbackPlacement),
];
}
else {
return [
{ ...origin.main, ...overlay.main },
{ ...origin.fallback, ...overlay.fallback },
{ ...{ originX: origin.main.originX, originY: this.invertHorizontalPosition(origin.main.originY) }, ...{ overlayX: overlay.main.overlayX, overlayY: this.invertHorizontalPosition(overlay.main.overlayY) } },
{ ...{ originX: origin.fallback.originX, originY: this.invertHorizontalPosition(origin.fallback.originY) }, ...{ overlayX: overlay.fallback.overlayX, overlayY: this.invertHorizontalPosition(overlay.fallback.overlayY) } }
];
}
}
/** Get the origin position based on the specified tooltip placement */
getOrigin(initialPlacement, alignment) {
// ensure placement is defined
const placement = initialPlacement || 'bottom';
let originPosition;
if (placement === 'top' || placement === 'bottom') {
originPosition = { originX: alignment, originY: placement };
}
if (placement === 'left') {
originPosition = { originX: 'start', originY: this.getVerticalAlignment(alignment) };
}
if (placement === 'right') {
originPosition = { originX: 'end', originY: this.getVerticalAlignment(alignment) };
}
const { x, y } = this.invertPosition(placement, originPosition.originX, originPosition.originY);
return {
main: originPosition,
fallback: { originX: x, originY: y },
};
}
/** Calculate the overlay position based on the specified tooltip placement */
getOverlayPosition(initialPlacement, alignment) {
// ensure placement is defined
const placement = initialPlacement || 'top';
let overlayPosition;
if (placement === 'top') {
overlayPosition = { overlayX: alignment, overlayY: 'bottom' };
}
if (placement === 'bottom') {
overlayPosition = { overlayX: alignment, overlayY: 'top' };
}
if (placement === 'left') {
overlayPosition = { overlayX: 'end', overlayY: this.getVerticalAlignment(alignment) };
}
if (placement === 'right') {
overlayPosition = { overlayX: 'start', overlayY: this.getVerticalAlignment(alignment) };
}
const { x, y } = this.invertPosition(placement, overlayPosition.overlayX, overlayPosition.overlayY);
return {
main: overlayPosition,
fallback: { overlayX: x, overlayY: y },
};
}
/** Convert the alignment property to a valid CDK alignment value */
getVerticalAlignment(alignment) {
switch (alignment) {
case 'start':
return 'top';
case 'end':
return 'bottom';
default:
return alignment;
}
}
/** Inverts an overlay position. */
invertPosition(placement, x, y) {
if (placement === 'top' || placement === 'bottom') {
if (y === 'top') {
y = 'bottom';
}
else if (y === 'bottom') {
y = 'top';
}
}
else {
if (x === 'end') {
x = 'start';
}
else if (x === 'start') {
x = 'end';
}
}
return { x, y };
}
invertHorizontalPosition(y) {
return y === 'top' ? 'bottom' : 'top';
}
getFallbackPosition(fallbackPlacement) {
switch (fallbackPlacement) {
case 'left':
return { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' };
case 'right':
return { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' };
case 'top':
return { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' };
case 'bottom':
return { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' };
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: OverlayPlacementService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: OverlayPlacementService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: OverlayPlacementService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wbGFjZW1lbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9vdmVybGF5LXBsYWNlbWVudC9vdmVybGF5LXBsYWNlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyx1QkFBdUI7SUFFaEMsZ0RBQWdEO0lBQ2hELGNBQWMsQ0FDVixVQUFzQixFQUN0QixTQUFpQixFQUNqQixTQUFpQixFQUNqQix1QkFBeUM7UUFFekMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLGdCQUFxRCxDQUFDO1FBQzlGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFOUQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCwwQ0FBMEM7SUFDbEMsWUFBWSxDQUNoQixNQUFnQyxFQUNoQyxPQUFrQyxFQUNsQyx1QkFBd0M7UUFFeEMsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQzFCLE9BQU87Z0JBQ0gsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsdUJBQXVCLENBQUM7YUFDcEQsQ0FBQztRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ0osT0FBTztnQkFDSCxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJ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RVQsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICAgIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxuICAgIE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbixcbiAgICBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uLFxuICAgIE92ZXJsYXlSZWYsXG4gICAgVmVydGljYWxDb25uZWN0aW9uUG9zXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuY2hvclBsYWNlbWVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9vdmVybGF5L2luZGV4JztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgT3ZlcmxheVBsYWNlbWVudFNlcnZpY2Uge1xuXG4gICAgLyoqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1lbnUuICovXG4gICAgdXBkYXRlUG9zaXRpb24oXG4gICAgICAgIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgICAgIHBsYWNlbWVudDogc3RyaW5nLFxuICAgICAgICBhbGlnbm1lbnQ6IHN0cmluZyxcbiAgICAgICAgY3VzdG9tRmFsbGJhY2tQbGFjZW1lbnQ/OiBBbmNob3JQbGFjZW1lbnQsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5nZXRPcmlnaW4ocGxhY2VtZW50LCBhbGlnbm1lbnQpO1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5nZXRPdmVybGF5UG9zaXRpb24ocGxhY2VtZW50LCBhbGlnbm1lbnQpO1xuXG4gICAgICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnModGhpcy5hZGRQb3NpdGlvbnMob3JpZ2luLCBvdmVybGF5LCBjdXN0b21GYWxsYmFja1BsYWNlbWVudCkpO1xuICAgIH1cblxuICAgIC8qKiBBcHBseSBwb3NpdGlvbiB0byBwb3NpdGlvbiBzdHJhdGVneSAqL1xuICAgIHByaXZhdGUgYWRkUG9zaXRpb25zKFxuICAgICAgICBvcmlnaW46IE9yaWdpbkNvbm5lY3RlZFBvc2l0aW9ucyxcbiAgICAgICAgb3ZlcmxheTogT3ZlcmxheUNvbm5lY3RlZFBvc2l0aW9ucyxcbiAgICAgICAgY3VzdG9tRmFsbGJhY2tQbGFjZW1lbnQ6IEFuY2hvclBsYWNlbWVudFxuICAgICk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICBpZiAoY3VzdG9tRmFsbGJhY2tQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgeyAuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWluIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRGYWxsYmFja1Bvc2l0aW9uKGN1c3RvbUZhbGxiYWNrUGxhY2VtZW50KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHsgLi4ub3JpZ2luLm1haW4sIC4uLm92ZXJsYXkubWFpbiB9LFxuICAgICAgICAgICAgICAgIHsgLi4ub3JpZ2luLmZhbGxiYWNrLCAuLi5vdmVybGF5LmZhbGxiYWNrIH0sXG4gICAgICAgICAgICAgICAgeyAuLi57IG9yaWdpblg6IG9yaWdpbi5tYWluLm9yaWdpblgsIG9yaWdpblk6IHRoaXMuaW52ZXJ0SG9yaXpvbnRhbFBvc2l0aW9uKG9yaWdpbi5tYWluLm9yaWdpblkpIH0sIC4uLnsgb3ZlcmxheVg6IG92ZXJsYXkubWFpbi5vdmVybGF5WCwgb3ZlcmxheVk6IHRoaXMuaW52ZXJ0SG9yaXpvbnRhbFBvc2l0aW9uKG92ZXJsYXkubWFpbi5vdmVybGF5WSkgfSB9LFxuICAgICAgICAgICAgICAgIHsgLi4ueyBvcmlnaW5YOiBvcmlnaW4uZmFsbGJhY2sub3JpZ2luWCwgb3JpZ2luWTogdGhpcy5pbnZlcnRIb3Jpem9udGFsUG9zaXRpb24ob3JpZ2luLmZhbGxiYWNrLm9yaWdpblkpIH0sIC4uLnsgb3ZlcmxheVg6IG92ZXJsYXkuZmFsbGJhY2sub3ZlcmxheVgsIG92ZXJsYXlZOiB0aGlzLmludmVydEhvcml6b250YWxQb3NpdGlvbihvdmVybGF5LmZhbGxiYWNrLm92ZXJsYXlZKSB9IH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSBvcmlnaW4gcG9zaXRpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCB0b29sdGlwIHBsYWNlbWVudCAqL1xuICAgIHByaXZhdGUgZ2V0T3JpZ2luKFxuICAgICAgICBpbml0aWFsUGxhY2VtZW50OiBzdHJpbmcsXG4gICAgICAgIGFsaWdubWVudDogc3RyaW5nXG4gICAgKTogT3JpZ2luQ29ubmVjdGVkUG9zaXRpb25zIHtcbiAgICAgICAgLy8gZW5zdXJlIHBsYWNlbWVudCBpcyBkZWZpbmVkXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IGluaXRpYWxQbGFjZW1lbnQgfHwgJ2JvdHRvbSc7XG4gICAgICAgIGxldCBvcmlnaW5Qb3NpdGlvbjogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIG9yaWdpblBvc2l0aW9uID0geyBvcmlnaW5YOiBhbGlnbm1lbnQgYXMgSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsIG9yaWdpblk6IHBsYWNlbWVudCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogdGhpcy5nZXRWZXJ0aWNhbEFsaWdubWVudChhbGlnbm1lbnQpIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhY2VtZW50ID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6IHRoaXMuZ2V0VmVydGljYWxBbGlnbm1lbnQoYWxpZ25tZW50KSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmludmVydFBvc2l0aW9uKHBsYWNlbWVudCwgb3JpZ2luUG9zaXRpb24hLm9yaWdpblgsIG9yaWdpblBvc2l0aW9uIS5vcmlnaW5ZKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFpbjogb3JpZ2luUG9zaXRpb24sXG4gICAgICAgICAgICBmYWxsYmFjazogeyBvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5IH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZSB0aGUgb3ZlcmxheSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHRvb2x0aXAgcGxhY2VtZW50ICovXG4gICAgcHJpdmF0ZSBnZXRPdmVybGF5UG9zaXRpb24oXG4gICAgICAgIGluaXRpYWxQbGFjZW1lbnQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBzdHJpbmdcbiAgICApOiBPdmVybGF5Q29ubmVjdGVkUG9zaXRpb25zIHtcbiAgICAgICAgLy8gZW5zdXJlIHBsYWNlbWVudCBpcyBkZWZpbmVkXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IGluaXRpYWxQbGFjZW1lbnQgfHwgJ3RvcCc7XG4gICAgICAgIGxldCBvdmVybGF5UG9zaXRpb246IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6IGFsaWdubWVudCBhcyBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgb3ZlcmxheVk6ICdib3R0b20nIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgb3ZlcmxheVBvc2l0aW9uID0geyBvdmVybGF5WDogYWxpZ25tZW50IGFzIEhvcml6b250YWxDb25uZWN0aW9uUG9zLCBvdmVybGF5WTogJ3RvcCcgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgb3ZlcmxheVBvc2l0aW9uID0geyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiB0aGlzLmdldFZlcnRpY2FsQWxpZ25tZW50KGFsaWdubWVudCkgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiB0aGlzLmdldFZlcnRpY2FsQWxpZ25tZW50KGFsaWdubWVudCkgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5pbnZlcnRQb3NpdGlvbihwbGFjZW1lbnQsIG92ZXJsYXlQb3NpdGlvbiEub3ZlcmxheVgsIG92ZXJsYXlQb3NpdGlvbiEub3ZlcmxheVkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYWluOiBvdmVybGF5UG9zaXRpb24hLFxuICAgICAgICAgICAgZmFsbGJhY2s6IHsgb3ZlcmxheVg6IHgsIG92ZXJsYXlZOiB5IH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIENvbnZlcnQgdGhlIGFsaWdubWVudCBwcm9wZXJ0eSB0byBhIHZhbGlkIENESyBhbGlnbm1lbnQgdmFsdWUgKi9cbiAgICBwcml2YXRlIGdldFZlcnRpY2FsQWxpZ25tZW50KGFsaWdubWVudDogc3RyaW5nKTogVmVydGljYWxDb25uZWN0aW9uUG9zIHtcbiAgICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvcCc7XG5cbiAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdib3R0b20nO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbm1lbnQgYXMgVmVydGljYWxDb25uZWN0aW9uUG9zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludmVydHMgYW4gb3ZlcmxheSBwb3NpdGlvbi4gKi9cbiAgICBwcml2YXRlIGludmVydFBvc2l0aW9uKHBsYWNlbWVudDogc3RyaW5nLCB4OiBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgeTogVmVydGljYWxDb25uZWN0aW9uUG9zKSB7XG4gICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIGlmICh5ID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIHkgPSAnYm90dG9tJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICB5ID0gJ3RvcCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICB4ID0gJ3N0YXJ0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgICAgICAgIHggPSAnZW5kJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9XG5cbiAgICBpbnZlcnRIb3Jpem9udGFsUG9zaXRpb24oeTogc3RyaW5nKTogJ3RvcCcgfCAnY2VudGVyJyB8ICdib3R0b20nIHtcbiAgICAgICAgcmV0dXJuIHkgPT09ICd0b3AnID8gJ2JvdHRvbScgOiAndG9wJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZhbGxiYWNrUG9zaXRpb24oZmFsbGJhY2tQbGFjZW1lbnQ6IHN0cmluZyk6IENvbm5lY3RlZFBvc2l0aW9uIHtcbiAgICAgICAgc3dpdGNoIChmYWxsYmFja1BsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInIH07XG4gICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInIH07XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScgfTtcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAndG9wJyB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgT3JpZ2luQ29ubmVjdGVkUG9zaXRpb25zIHtcbiAgICBtYWluOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247XG4gICAgZmFsbGJhY2s6IE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbjtcbn1cblxuaW50ZXJmYWNlIE92ZXJsYXlDb25uZWN0ZWRQb3NpdGlvbnMge1xuICAgIG1haW46IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XG4gICAgZmFsbGJhY2s6IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XG59Il19