#include<bits/stdc++.h>
#define rep(i,s,t) for (int i=s;i<=t;i++)
typedef long long LL;
using namespace std;
int n,m,p,x,y,cnt;
const int maxn = 601;
int visit[maxn][maxn];
int lefts[maxn], rights[maxn], father[maxn];
LL f[maxn][maxn];
int mission[maxn];
int sz[maxn];
LL a[maxn];
int _;
int tc, nc;
const LL mod = 1e9 + 7;
queue<int> Q;
void dfs(int k)
{
	nc--;
	if (lefts[k])
	{
		if (mission[lefts[k]]) Q.push(lefts[k]);
		else dfs(lefts[k]);
	}
	else tc++;
	if (rights[k])
	{
		if (mission[rights[k]]) Q.push(rights[k]);
		else dfs(rights[k]);
	}
	else tc++;
}

LL solve(int k)
{
	LL ret = 1;
	Q.push(1);
	while (!Q.empty())
	{
		int x = Q.front();
		Q.pop();
		tc = 0;
		nc = mission[x];
		dfs(x);
		ret = ret * f[tc][nc] % mod;
	}
	return ret;
}
int main()
{
	a[0] = a[1] = 1;
	rep(i,2,600) rep(k,0,i-1) a[i] = (a[i] + a[k] * a[i-k-1]) % mod;
	f[0][0] = 1;
	rep(i,1,600) f[0][i] = 0;
	rep(i,1,600)
	{
		f[i][0] = 0;
		rep(j,0,600) rep(k,0,j)
			f[i][j] = (f[i][j] + f[i-1][j-k] * a[k]) % mod;
	}
	while (scanf("%d",&n)!=EOF)
	{
		_++;
		memset(lefts,0,sizeof(lefts));
		memset(sz,0,sizeof(sz));
		memset(rights,0,sizeof(rights));
		memset(mission,0,sizeof(mission));
		cnt = 1;
		int tem = 1;
		mission[1] = 1;
		rep(i,1,n)
		{
			scanf("%d",&x);
			if (x == 0) tem = father[tem];
			else if (x == 1)
			{
				if (lefts[tem] == 0) 
				{
					lefts[tem] = ++cnt;
					father[cnt] = tem;
				}
				tem = lefts[tem];
			}
			else if (x == 2) 
			{
				if (rights[tem] == 0) 
				{
					rights[tem] = ++cnt;
					father[rights[tem]] = tem;
				}
				tem = rights[tem];
			}
			else if (x == 3)
			{
				scanf("%d",&y);
				lefts[tem] = ++cnt;
				mission[lefts[tem]] = y;
				father[lefts[tem]] = tem;
			}
			else if (x == 4)
			{
				scanf("%d",&y);
				rights[tem] = ++cnt;
				father[rights[tem]] = tem;
				mission[rights[tem]] = y;
			}
		}
		LL ans = solve(1);
		printf("Case #%d: ", _);
		cout << ans << endl;
	}
}
