@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
239 lines • 53.1 kB
JavaScript
export function checkCropperPosition(cropperPosition, cropperState, maintainSize) {
cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);
return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);
}
export function checkCropperSizeRestriction(cropperPosition, cropperState) {
let cropperWidth = cropperPosition.x2 - cropperPosition.x1;
let cropperHeight = cropperPosition.y2 - cropperPosition.y1;
const centerX = cropperPosition.x1 + cropperWidth / 2;
const centerY = cropperPosition.y1 + cropperHeight / 2;
if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {
cropperWidth = cropperState.maxSize.width > cropperState.options.cropperStaticWidth
? cropperState.options.cropperStaticWidth
: cropperState.maxSize.width;
cropperHeight = cropperState.maxSize.height > cropperState.options.cropperStaticHeight
? cropperState.options.cropperStaticHeight
: cropperState.maxSize.height;
}
else {
cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize.width));
cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize.height));
if (cropperState.options.maintainAspectRatio) {
if (cropperState.maxSize.width / cropperState.options.aspectRatio < cropperState.maxSize.height) {
cropperHeight = cropperWidth / cropperState.options.aspectRatio;
}
else {
cropperWidth = cropperHeight * cropperState.options.aspectRatio;
}
}
}
const x1 = centerX - cropperWidth / 2;
const x2 = x1 + cropperWidth;
const y1 = centerY - cropperHeight / 2;
const y2 = y1 + cropperHeight;
return { x1, x2, y1, y2 };
}
export function checkCropperWithinMaxSizeBounds(position, cropperState, maintainSize = false) {
if (position.x1 < 0) {
position = {
...position,
x1: 0,
x2: position.x2 - (maintainSize ? position.x1 : 0)
};
}
if (position.y1 < 0) {
position = {
...position,
y2: position.y2 - (maintainSize ? position.y1 : 0),
y1: 0
};
}
if (position.x2 > cropperState.maxSize.width) {
position = {
...position,
x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize.width) : 0),
x2: cropperState.maxSize.width
};
}
if (position.y2 > cropperState.maxSize.height) {
position = {
...position,
y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize.height) : 0),
y2: cropperState.maxSize.height
};
}
return position;
}
export function moveCropper(event, moveStart) {
const diffX = getClientX(event) - moveStart.clientX;
const diffY = getClientY(event) - moveStart.clientY;
return {
x1: moveStart.cropper.x1 + diffX,
y1: moveStart.cropper.y1 + diffY,
x2: moveStart.cropper.x2 + diffX,
y2: moveStart.cropper.y2 + diffY
};
}
export function resizeCropper(event, moveStart, cropperState) {
const cropperPosition = { ...cropperState.cropper };
const moveX = getClientX(event) - moveStart.clientX;
const moveY = getClientY(event) - moveStart.clientY;
switch (moveStart.position) {
case 'left':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
break;
case 'topleft':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'top':
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'topright':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'right':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
break;
case 'bottomright':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'bottom':
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'bottomleft':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'center':
const scale = 'scale' in event ? event.scale : 1;
const newWidth = Math.min(Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale), cropperState.cropperScaledMaxWidth);
const newHeight = Math.min(Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale), cropperState.cropperScaledMaxHeight);
cropperPosition.x1 = moveStart.clientX - newWidth / 2;
cropperPosition.x2 = moveStart.clientX + newWidth / 2;
cropperPosition.y1 = moveStart.clientY - newHeight / 2;
cropperPosition.y2 = moveStart.clientY + newHeight / 2;
if (cropperPosition.x1 < 0) {
cropperPosition.x2 -= cropperPosition.x1;
cropperPosition.x1 = 0;
}
else if (cropperPosition.x2 > cropperState.maxSize.width) {
cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize.width);
cropperPosition.x2 = cropperState.maxSize.width;
}
if (cropperPosition.y1 < 0) {
cropperPosition.y2 -= cropperPosition.y1;
cropperPosition.y1 = 0;
}
else if (cropperPosition.y2 > cropperState.maxSize.height) {
cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize.height);
cropperPosition.y2 = cropperState.maxSize.height;
}
break;
}
if (cropperState.options.maintainAspectRatio) {
return checkAspectRatio(moveStart.position, cropperPosition, cropperState);
}
else {
return cropperPosition;
}
}
export function checkAspectRatio(position, cropperPosition, cropperState) {
cropperPosition = { ...cropperPosition };
let overflowX = 0;
let overflowY = 0;
switch (position) {
case 'top':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'bottom':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);
}
break;
case 'topleft':
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(0 - cropperPosition.x1, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'topright':
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'right':
case 'bottomright':
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'left':
case 'bottomleft':
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(0 - cropperPosition.x1, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'center':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
const overflowX1 = Math.max(0 - cropperPosition.x1, 0);
const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
const overflowY2 = Math.max(0 - cropperPosition.y1, 0);
if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {
cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;
cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;
cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;
cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;
}
break;
}
return cropperPosition;
}
export function getClientX(event) {
if ('touches' in event && event.touches[0]) {
return event.touches[0].clientX;
}
else if ('clientX' in event) {
return event.clientX;
}
return 0;
}
export function getClientY(event) {
if ('touches' in event && event.touches[0]) {
return event.touches[0].clientY;
}
else if ('clientX' in event) {
return event.clientY;
}
return 0;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvdXRpbHMvY3JvcHBlci1wb3NpdGlvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxZQUEwQixFQUFFLFlBQXFCO0lBQ3RILGVBQWUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsZUFBZ0MsRUFBRSxZQUEwQjtJQUN0RyxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdkQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7WUFDbEYsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ3pDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBUSxDQUFD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TyxFQUFDLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsUUFBUSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNO1lBQ1QsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDLEVBQzNILGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDM0QsTUFBTTtRQUNSLEtBQUssU0FBUztZQUNaLGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzSCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzNELGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUM1SCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzVELE1BQU07UUFDUixLQUFLLEtBQUs7WUFDUixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxD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QUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDNUgsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxNQUFNO1FBQ1IsS0FBSyxRQUFRO1lBQ1gsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzdHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzlHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3ZDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FB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QyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBc0M7SUFDL0QsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyb3BwZXJQb3NpdGlvbiwgTW92ZVN0YXJ0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU3RhdGUgfSBmcm9tICcuLi9jb21wb25lbnQvY3JvcHBlci5zdGF0ZSc7XG5pbXBvcnQgeyBCYXNpY0V2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyUG9zaXRpb24oY3JvcHBlclBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemU6IGJvb2xlYW4pOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjcm9wcGVyUG9zaXRpb24gPSBjaGVja0Nyb3BwZXJTaXplUmVzdHJpY3Rpb24oY3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGUpO1xuICByZXR1cm4gY2hlY2tDcm9wcGVyV2l0aGluTWF4U2l6ZUJvdW5kcyhjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSwgbWFpbnRhaW5TaXplKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ3JvcHBlclNpemVSZXN0cmljdGlvbihjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBsZXQgY3JvcHBlcldpZHRoID0gY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxO1xuICBsZXQgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MTtcbiAgY29uc3QgY2VudGVyWCA9IGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IGNlbnRlclkgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVySGVpZ2h0IC8gMjtcblxuICBpZiAoY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodCAmJiBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGgpIHtcbiAgICBjcm9wcGVyV2lkdGggPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGggPiBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGhcbiAgICAgID8gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY1dpZHRoXG4gICAgICA6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aDtcbiAgICBjcm9wcGVySGVpZ2h0ID0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCA+IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNIZWlnaHRcbiAgICAgID8gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodFxuICAgICAgOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGNyb3BwZXJXaWR0aCA9IE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgsIE1hdGgubWluKGNyb3BwZXJXaWR0aCwgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCwgY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoKSk7XG4gICAgY3JvcHBlckhlaWdodCA9IE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0LCBNYXRoLm1pbihjcm9wcGVySGVpZ2h0LCBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCwgY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCkpO1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBpZiAoY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8gPCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgICAgIGNyb3BwZXJIZWlnaHQgPSBjcm9wcGVyV2lkdGggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyb3BwZXJXaWR0aCA9IGNyb3BwZXJIZWlnaHQgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB4MSA9IGNlbnRlclggLSBjcm9wcGVyV2lkdGggLyAyO1xuICBjb25zdCB4MiA9IHgxICsgY3JvcHBlcldpZHRoO1xuICBjb25zdCB5MSA9IGNlbnRlclkgLSBjcm9wcGVySGVpZ2h0IC8gMjtcbiAgY29uc3QgeTIgPSB5MSArIGNyb3BwZXJIZWlnaHQ7XG4gIHJldHVybiB7eDEsIHgyLCB5MSwgeTJ9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyV2l0aGluTWF4U2l6ZUJvdW5kcyhwb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSwgbWFpbnRhaW5TaXplID0gZmFsc2UpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBpZiAocG9zaXRpb24ueDEgPCAwKSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHgxOiAwLFxuICAgICAgeDI6IHBvc2l0aW9uLngyIC0gKG1haW50YWluU2l6ZSA/IHBvc2l0aW9uLngxIDogMClcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbi55MSA8IDApIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeTI6IHBvc2l0aW9uLnkyIC0gKG1haW50YWluU2l6ZSA/IHBvc2l0aW9uLnkxIDogMCksXG4gICAgICB5MTogMFxuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uLngyID4gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoKSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHgxOiBwb3NpdGlvbi54MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIDogMCksXG4gICAgICB4MjogY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24ueTIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHkxOiBwb3NpdGlvbi55MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSA6IDApLFxuICAgICAgeTI6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHRcbiAgICB9O1xuICB9XG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVDcm9wcGVyKGV2ZW50OiBFdmVudCB8IEJhc2ljRXZlbnQsIG1vdmVTdGFydDogTW92ZVN0YXJ0KTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgY29uc3QgZGlmZlggPSBnZXRDbGllbnRYKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRYO1xuICBjb25zdCBkaWZmWSA9IGdldENsaWVudFkoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFk7XG5cbiAgcmV0dXJuIHtcbiAgICB4MTogbW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBkaWZmWCxcbiAgICB5MTogbW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBkaWZmWSxcbiAgICB4MjogbW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBkaWZmWCxcbiAgICB5MjogbW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBkaWZmWVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplQ3JvcHBlcihldmVudDogRXZlbnQgfCBCYXNpY0V2ZW50LCBtb3ZlU3RhcnQ6IE1vdmVTdGFydCwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjb25zdCBjcm9wcGVyUG9zaXRpb24gPSB7Li4uY3JvcHBlclN0YXRlLmNyb3BwZXJ9O1xuICBjb25zdCBtb3ZlWCA9IGdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gIGNvbnN0IG1vdmVZID0gZ2V0Q2xpZW50WShldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WTtcbiAgc3dpdGNoIChtb3ZlU3RhcnQucG9zaXRpb24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLngxICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcGxlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3ByaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci54MiArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbXJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjb25zdCBzY2FsZSA9ICdzY2FsZScgaW4gZXZlbnQgPyBldmVudC5zY2FsZSBhcyBudW1iZXIgOiAxO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCwgKE1hdGguYWJzKG1vdmVTdGFydC5jcm9wcGVyLngyIC0gbW92ZVN0YXJ0LmNyb3BwZXIueDEpKSAqIHNjYWxlKSxcbiAgICAgICAgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCk7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIChNYXRoLmFicyhtb3ZlU3RhcnQuY3JvcHBlci55MiAtIG1vdmVTdGFydC5jcm9wcGVyLnkxKSkgKiBzY2FsZSksXG4gICAgICAgIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IG1vdmVTdGFydC5jbGllbnRYIC0gbmV3V2lkdGggLyAyO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gbW92ZVN0YXJ0LmNsaWVudFggKyBuZXdXaWR0aCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBtb3ZlU3RhcnQuY2xpZW50WSAtIG5ld0hlaWdodCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBtb3ZlU3RhcnQuY2xpZW50WSArIG5ld0hlaWdodCAvIDI7XG4gICAgICBpZiAoY3JvcHBlclBvc2l0aW9uLngxIDwgMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gY3JvcHBlclBvc2l0aW9uLngxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjcm9wcGVyUG9zaXRpb24ueDIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxIC09IChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoY3JvcHBlclBvc2l0aW9uLnkxIDwgMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gY3JvcHBlclBvc2l0aW9uLnkxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjcm9wcGVyUG9zaXRpb24ueTIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSAtPSAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgcmV0dXJuIGNoZWNrQXNwZWN0UmF0aW8obW92ZVN0YXJ0LnBvc2l0aW9uISwgY3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcm9wcGVyUG9zaXRpb247XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXNwZWN0UmF0aW8ocG9zaXRpb246IHN0cmluZywgY3JvcHBlclBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlKTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgY3JvcHBlclBvc2l0aW9uID0gey4uLmNyb3BwZXJQb3NpdGlvbn07XG4gIGxldCBvdmVyZmxvd1ggPSAwO1xuICBsZXQgb3ZlcmZsb3dZID0gMDtcbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IChvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3BsZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLngxLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3ByaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBjcm9wcGVyUG9zaXRpb24ueTIgLSAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueTEsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAnYm90dG9tcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclBvc2l0aW9uLnkxICsgKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXg