#include <set>
#include <array>
#include <vector>
#include <iostream>
using namespace std;
array<int, 4> type;
set<array<int, 4>> S;
vector g(3, vector<bool> (3));
void dfs(int L = 0) {
if (L < 4) {
dfs(L + 1);
int x = 0, y = 0;
if (L < 2) {
y += L;
} else {
x += 1;
y += L - 2;
}
if (!g[x][y] && !g[x + 1][y] && !g[x][y + 1]) {
type[3] += 1;
g[x][y] = 1;
g[x + 1][y] = 1;
g[x][y + 1] = 1;
dfs(L + 1);
type[3] -= 1;
g[x][y] = 0;
g[x + 1][y] = 0;
g[x][y + 1] = 0;
}
return;
}
if (L < 8) {
dfs(L + 1);
int x = 0, y = 2;
if (L < 6) {
y -= L - 4;
} else {
x += 1;
y -= L - 6;
}
if (!g[x][y] && !g[x + 1][y] && !g[x][y - 1]) {
type[3] += 1;
g[x][y] = 1;
g[x + 1][y] = 1;
g[x][y - 1] = 1;
dfs(L + 1);
type[3] -= 1;
g[x][y] = 0;
g[x + 1][y] = 0;
g[x][y - 1] = 0;
}
return;
}
if (L < 12) {
dfs(L + 1);
int x = 2, y = 0;
if (L < 10) {
y += L - 8;
} else {
x -= 1;
y += L - 10;
}
if (!g[x][y] && !g[x - 1][y] && !g[x][y + 1]) {
type[3] += 1;
g[x][y] = 1;
g[x - 1][y] = 1;
g[x][y + 1] = 1;
dfs(L + 1);
type[3] -= 1;
g[x][y] = 0;
g[x - 1][y] = 0;
g[x][y + 1] = 0;
}
return;
}
if (L < 16) {
dfs(L + 1);
int x = 2, y = 2;
if (L < 14) {
y -= L - 12;
} else {
x -= 1;
y -= L - 14;
}
if (!g[x][y] && !g[x - 1][y] && !g[x][y - 1]) {
type[3] += 1;
g[x][y] = 1;
g[x - 1][y] = 1;
g[x][y - 1] = 1;
dfs(L + 1);
type[3] -= 1;
g[x][y] = 0;
g[x - 1][y] = 0;
g[x][y - 1] = 0;
}
return;
}
if (L < 22) {
dfs(L + 1);
int x = 0, y = 0;
if (L < 19) {
y = L - 16;
} else {
x = 1;
y = L - 19;
}
if (!g[x][y] && !g[x + 1][y]) {
type[1] += 1;
g[x][y] = 1;
g[x + 1][y] = 1;
dfs(L + 1);
type[1] -= 1;
g[x][y] = 0;
g[x + 1][y] = 0;
}
return;
}
if (L < 28) {
dfs(L + 1);
int x = 0, y = 0;
if (L < 25) {
x = L - 22;
} else {
y = 1;
x = L - 25;
}
if (!g[x][y] && !g[x][y + 1]) {
type[1] += 1;
g[x][y] = 1;
g[x][y + 1] = 1;
dfs(L + 1);
type[1] -= 1;
g[x][y] = 0;
g[x][y + 1] = 0;
}
return;
}
if (L < 31) {
dfs(L + 1);
int x = 0, y = L - 28;
if (!g[x][y] && !g[x + 1][y] && !g[x + 2][y]) {
type[2] += 1;
g[x][y] = 1;
g[x + 1][y] = 1;
g[x + 2][y] = 1;
dfs(L + 1);
type[2] -= 1;
g[x][y] = 0;
g[x + 1][y] = 0;
g[x + 2][y] = 0;
}
return;
}
if (L < 34) {
dfs(L + 1);
int x = L - 31, y = 0;
if (!g[x][y] && !g[x][y + 1] && !g[x][y + 2]) {
type[2] += 1;
g[x][y] = 1;
g[x][y + 1] = 1;
g[x][y + 2] = 1;
dfs(L + 1);
type[2] -= 1;
g[x][y] = 0;
g[x][y + 1] = 0;
g[x][y + 2] = 0;
}
return;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
type[0] += !g[i][j];
}
}
S.insert(type);
type[0] = 0;
}
const int N = 41;
int f[N + 1][N + 1][N + 1][N + 1];
inline void Max(int& a, int b) {
a = max(a, b);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
for (int i = 0; i < 4; i++) {
type[i] = 0;
}
dfs();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++) {
for (int l = 0; l < N; l++) {
Max(f[i + 1][j][k][l], f[i][j][k][l]);
Max(f[i][j + 1][k][l], f[i][j][k][l]);
Max(f[i][j][k + 1][l], f[i][j][k][l]);
Max(f[i][j][k][l + 1], f[i][j][k][l]);
for (auto [a, b, c, d] : S) {
if (i + a <= N && j + b <= N && k + c <= N && l + d <= N) {
Max(f[i + a][j + b][k + c][l + d], f[i][j][k][l] + 1);
}
}
}
}
}
}
int t;
cin >> t;
for (int i = 1; i <= t; i++) {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << "Case " << i << ": " << f[a][b][c][d] << '\n';
}
return 0;
}