%%%g1n0st
#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=20110520;
int j,k,n,m;
int p[N],Ans;
bool b[N][N];
char s[N];
vector<int>f[N][11];
inline void Add(int& x,int y){
x=(x+y)%M;
}
inline void Update(int x,int y,int k,int z){
if(y==1)k*=3;
if(x==n+1){
if(!k)Add(Ans,z);
}else
Add(f[x][y][k],z);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++)
b[i][j]=(s[j]=='*'?1:0);
}
if(n<m){
for(int i=1;i<=n;i++)
for(int j=i+1;j<=m;j++)
swap(b[i][j],b[j][i]);
swap(n,m);
}
p[0]=1;
for(int i=1;i<=m+1;i++)p[i]=p[i-1]*3;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=p[m+1];k++)
f[i][j].push_back(0);
f[1][1][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<p[m+1];k++)
if(f[i][j][k]){
int nxi,nxj;
if(j==m)nxi=i+1,nxj=1;else nxi=i,nxj=j+1;
int p1=(k%p[j])/p[j-1],p2=(k%p[j+1])/p[j];
if(b[i][j]){
if(p1||p2)continue;
Update(nxi,nxj,k,f[i][j][k]);
continue;
}
if(!p1&&!p2){
if(j<m)Update(nxi,nxj,k+p[j],f[i][j][k]),Update(nxi,nxj,k+p[j-1]*2+p[j]*2,f[i][j][k]);
Update(nxi,nxj,k+p[j-1],f[i][j][k]);
}
if(p1==1&&!p2){
if(j<m)Update(nxi,nxj,k-p[j-1]+p[j],f[i][j][k]);
Update(nxi,nxj,k+p[j-1],f[i][j][k]);
}
if(!p1&&p2==1){
if(j<m)Update(nxi,nxj,k+p[j],f[i][j][k]);
Update(nxi,nxj,k-p[j]+p[j-1],f[i][j][k]);
}
if(p1==2&&!p2){
if(j<m)Update(nxi,nxj,k-p[j-1]*2+p[j]*2,f[i][j][k]);
Update(nxi,nxj,k-p[j-1]*2,f[i][j][k]);
}
if(!p1&&p2==2){
Update(nxi,nxj,k+p[j-1]*2-p[j]*2,f[i][j][k]);
Update(nxi,nxj,k-p[j]*2,f[i][j][k]);
}
if(p1==1&&p2==1){
Update(nxi,nxj,k-p[j-1]-p[j],f[i][j][k]);
}
}
cout<<Ans<<endl;
return 0;
}