#include <iostream>
#include <cstring>
int visited[50][50];
char arr[51][51];
bool isSafe(int i, int j, int n){
if(i>=0 && i<n && j>=0 && j<n && visited[i][j]==0 && arr[i][j]=='?'){
//std::cout << "i " << i << " j " << j << std::endl;
return true;
}
return false;
}
bool dfsutil(int n, int r, int c){
//std::cout << "dfsutil for r " << r << " c " << c << std::endl;
int row[]={0, 0, -1, 1};
int col[]={-1, 1, 0, 0};
visited[r][c]=1;
int i,j;
bool temp=false;
for(int k=0;k<4;k++){
i=r+row[k];
j=c+col[k];
//std::cout << "k " << k << std::endl;
if(isSafe(i, j, n)){
temp=true;
dfsutil(n, i, j);
}
}
return temp;
}
long long dfs(int n){
memset(visited, 0, sizeof(int)*50*50);
int r[]={0, 0, -1, 1};
int c[]={-1, 1, 0, 0};
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(arr[i][j]=='G'){
for(int k=0;k<4;k++){
if(arr[i+r[k]][j+c[k]] == 'G' || arr[i+r[k]][j+c[k]] == '?' || arr[i+r[k]][j+c[k]] == 'P' || arr[i+r[k]][j+c[k]] == 'B')
return 0;
}
}
else if(arr[i][j]=='B'){
for(int k=0;k<4;k++){
if(arr[i+r[k]][j+c[k]] == 'G' || arr[i+r[k]][j+c[k]] == 'P')
return 0;
else if(arr[i+r[k]][j+c[k]] == '?')
arr[i+r[k]][j+c[k]] = 'B';
}
}
else if(arr[i][j]=='P'){
for(int k=0;k<4;k++){
if(arr[i+r[k]][j+c[k]] == 'G' || arr[i+r[k]][j+c[k]] == 'B')
return 0;
else if(arr[i+r[k]][j+c[k]] == '?')
arr[i+r[k]][j+c[k]] = 'P';
}
}
}
}
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
std::cout << arr[i][j] << " ";
std::cout << std::endl;
}*/
long long ans=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
bool temp=false;
bool ques=false;
if(isSafe(i, j, n)){
ques=true;
temp=dfsutil(n, i, j);
}
if(temp && ques)
ans *= 2;
else if(!temp and ques)
ans *= 3;
ans %= 1000000007;
//std::cout << "ans " << ans << std::endl;
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
std::cout << visited[i][j] << " ";
std::cout << std::endl;
}*/
}
}
return ans;
}
int main() {
int t, n;
std::cin >> t;
while(t--){
std::cin >> n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
std::cin >> arr[i][j];
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
std::cout << arr[i][j] << " ";
std::cout << std::endl;
}*/
std::cout << dfs(n) << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCmludCB2aXNpdGVkWzUwXVs1MF07CmNoYXIgYXJyWzUxXVs1MV07Cgpib29sIGlzU2FmZShpbnQgaSwgaW50IGosIGludCBuKXsKCWlmKGk+PTAgJiYgaTxuICYmIGo+PTAgJiYgajxuICYmIHZpc2l0ZWRbaV1bal09PTAgJiYgYXJyW2ldW2pdPT0nPycpewoJCS8vc3RkOjpjb3V0IDw8ICJpICIgPDwgaSA8PCAiIGogIiA8PCBqIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKYm9vbCBkZnN1dGlsKGludCBuLCBpbnQgciwgaW50IGMpewoJLy9zdGQ6OmNvdXQgPDwgImRmc3V0aWwgZm9yIHIgIiA8PCByIDw8ICIgYyAiIDw8IGMgPDwgc3RkOjplbmRsOwoJaW50IHJvd1tdPXswLCAwLCAtMSwgMX07CglpbnQgY29sW109ey0xLCAxLCAwLCAwfTsKCXZpc2l0ZWRbcl1bY109MTsKCWludCBpLGo7Cglib29sIHRlbXA9ZmFsc2U7Cglmb3IoaW50IGs9MDtrPDQ7aysrKXsKCQlpPXIrcm93W2tdOwoJCWo9Yytjb2xba107CgkJLy9zdGQ6OmNvdXQgPDwgImsgIiA8PCBrIDw8IHN0ZDo6ZW5kbDsKCQlpZihpc1NhZmUoaSwgaiwgbikpewoJCQl0ZW1wPXRydWU7CgkJCWRmc3V0aWwobiwgaSwgaik7CgkJfQoJfQoJcmV0dXJuIHRlbXA7Cn0KCmxvbmcgbG9uZyBkZnMoaW50IG4pewoJCgltZW1zZXQodmlzaXRlZCwgMCwgc2l6ZW9mKGludCkqNTAqNTApOwoJaW50IHJbXT17MCwgMCwgLTEsIDF9OwoJaW50IGNbXT17LTEsIDEsIDAsIDB9OwoJZm9yKGludCBpPTA7aTxuO2krKyl7CgkJZm9yKGludCBqPTA7ajxuO2orKyl7CgkJCWlmKGFycltpXVtqXT09J0cnKXsKCQkJCWZvcihpbnQgaz0wO2s8NDtrKyspewoJCQkJCWlmKGFycltpK3Jba11dW2orY1trXV0gPT0gJ0cnIHx8IGFycltpK3Jba11dW2orY1trXV0gPT0gJz8nIHx8IGFycltpK3Jba11dW2orY1trXV0gPT0gJ1AnIHx8IGFycltpK3Jba11dW2orY1trXV0gPT0gJ0InKQoJCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKGFycltpXVtqXT09J0InKXsKCQkJCWZvcihpbnQgaz0wO2s8NDtrKyspewoJCQkJCWlmKGFycltpK3Jba11dW2orY1trXV0gPT0gJ0cnIHx8IGFycltpK3Jba11dW2orY1trXV0gPT0gJ1AnKQoJCQkJCQlyZXR1cm4gMDsKCQkJCQllbHNlIGlmKGFycltpK3Jba11dW2orY1trXV0gPT0gJz8nKQoJCQkJCQlhcnJbaStyW2tdXVtqK2Nba11dID0gJ0InOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoYXJyW2ldW2pdPT0nUCcpewoJCQkJZm9yKGludCBrPTA7azw0O2srKyl7CgkJCQkJaWYoYXJyW2krcltrXV1baitjW2tdXSA9PSAnRycgfHwgYXJyW2krcltrXV1baitjW2tdXSA9PSAnQicpCgkJCQkJCXJldHVybiAwOwoJCQkJCWVsc2UgaWYoYXJyW2krcltrXV1baitjW2tdXSA9PSAnPycpCgkJCQkJCWFycltpK3Jba11dW2orY1trXV0gPSAnUCc7CgkJCQl9CgkJCX0KCQl9Cgl9CgkKCS8qZm9yKGludCBpPTA7aTxuO2krKyl7CgkJZm9yKGludCBqPTA7ajxuO2orKykKCQkJc3RkOjpjb3V0IDw8IGFycltpXVtqXSA8PCAiICAiOwoJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cgl9Ki8KCWxvbmcgbG9uZyBhbnM9MTsKCWZvcihpbnQgaT0wO2k8bjtpKyspewoJCWZvcihpbnQgaj0wO2o8bjtqKyspewoJCQlib29sIHRlbXA9ZmFsc2U7CgkJCWJvb2wgcXVlcz1mYWxzZTsKCQkJaWYoaXNTYWZlKGksIGosIG4pKXsKCQkJCXF1ZXM9dHJ1ZTsKCQkJCXRlbXA9ZGZzdXRpbChuLCBpLCBqKTsKCQkJfQoJCQlpZih0ZW1wICYmIHF1ZXMpCgkJCQlhbnMgKj0gMjsKCQkJZWxzZSBpZighdGVtcCBhbmQgcXVlcykKCQkJCWFucyAqPSAzOwoJCQlhbnMgJT0gMTAwMDAwMDAwNzsKCQkJLy9zdGQ6OmNvdXQgPDwgImFucyAiIDw8IGFucyA8PCBzdGQ6OmVuZGw7CgkJCS8qZm9yKGludCBpPTA7aTxuO2krKyl7CgkJCQlmb3IoaW50IGo9MDtqPG47aisrKQoJCQkJCXN0ZDo6Y291dCA8PCB2aXNpdGVkW2ldW2pdIDw8ICIgICI7CgkJCQlzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJCQl9Ki8KCQl9Cgl9CglyZXR1cm4gYW5zOwp9CgppbnQgbWFpbigpIHsKCWludCB0LCBuOwoJc3RkOjpjaW4gPj4gdDsKCXdoaWxlKHQtLSl7CgkJc3RkOjpjaW4gPj4gbjsKCQlmb3IoaW50IGk9MDtpPG47aSsrKQoJCQlmb3IoaW50IGo9MDtqPG47aisrKQoJCQkJc3RkOjpjaW4gPj4gYXJyW2ldW2pdOwoJCS8qZm9yKGludCBpPTA7aTxuO2krKyl7CgkJCWZvcihpbnQgaj0wO2o8bjtqKyspCgkJCQlzdGQ6OmNvdXQgPDwgYXJyW2ldW2pdIDw8ICIgICI7CgkJCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgkJfSovCgkJc3RkOjpjb3V0IDw8IGRmcyhuKSA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==