ll n,m,ex,ey,now,last,ans,a[105][105],mod=300005,head1[300005],nxt[2<<24],b[2][2<<24],v[2][2<<24],len[2],res[15];
char s[105][105];
/*哈希表板子 */
void insert(ll bit,ll d)
{
ll u=bit%mod+1;
for(ll i=head1[u];i;i=nxt[i])
if(b[now][i]==bit)
{
v[now][i]+=d;
return ;
}
nxt[++len[now]]=head1[u];
head1[u]=len[now];
b[now][len[now]]=bit;
v[now][len[now]]=d;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf(" %s",s[i]+1);
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++)
if(s[i][j]=='.')
a[i][j]=1,ex=i,ey=j;
res[0]=1;
for(ll i=1;i<=13;i++)
res[i]=res[i-1]<<2;
len[now]=1,v[now][1]=1,b[now][1]=0;
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=len[now];j++)
b[now][j]<<=2;
for(ll j=1;j<=m;j++)
{
memset(head1,0,sizeof head1);
last=now;now^=1;
len[now]=0;
for(ll k=1,bit,d,b1,b2;k<=len[last];k++)
{
bit=b[last][k],d=v[last][k];
b1=(bit>>((j-1)<<1))%4,b2=(bit>>(j<<1))%4;
// printf("%lld.%lld.%lld.%lld\n",bit,d,b1,b2);
if(!a[i][j])
{
if((!b1)&&(!b2))
insert(bit,d);
}
else
if((!b1)&&(!b2))
{
if(a[i+1][j]&&a[i][j+1])
insert(bit^(res[j]<<1)^res[j-1],d);
}
else
if((!b1)&&b2)
{
if(a[i][j+1])
insert(bit,d);
else
if(a[i+1][j])
insert(bit^(res[j]*b2)^(res[j-1]*b2),d);
}
else
if(b1&&(!b2))
{
if(a[i+1][j])
insert(bit,d);
else
if(a[i][j+1])
insert(bit^(res[j]*b1)^(res[j-1]*b1),d);
}
else
if(b1==1&&b2==1)
{
ll l=1;
for(ll p=j+1;p<=m;p++)
{
if((bit>>(p<<1))%4==1)
l++;
if((bit>>(p<<1))%4==2)
l--;
if(!l)
{
insert(bit^res[j]^res[j-1]^res[p],d);
break;
}
}
}
else
if(b1==2&&b2==2)
{
ll r=1;
for(ll p=j-2;p>=0;p--)
{
if((bit>>(p<<1))%4==2)
r++;
if((bit>>(p<<1))%4==1)
r--;
if(!r)
{
insert(bit^(res[j]<<1)^(res[j-1]<<1)^res[p],d);
break;
}
}
}
else
if(b1==2&&b2==1)
insert(bit^res[j]^(res[j-1]<<1),d);
else
if(b1==1&&b2==2)
{
if(i==ex&&j==ey)
ans+=d;
}
else
return puts("WTF"),0;
}
}
}
return printf("%lld\n",ans),0;
}
thx