# your code goes here
n, m=map (int, input (). split ()) 
house=[]
place={}
rev_place={} 
sz=0
for i in range (n) :
    house.append(input ()) 
    for j in range (m) :
        if(house[i][j] ==".") :
            place[sz]=i*m+j
            rev_place[place[sz]]=sz
            sz+=1
if(n==1 and m==1):
    if(house[0][0]=='.'):
        print (1)
    else:
        print (0)
    from sys import exit 
    exit()      
from fractions import gcd
matrix=[[0 for i in range (sz)] for i in range (sz)] 
for x in range (sz):
    order=place[x] 
    i=order//m
    j=order%m
    if(j>0 and house[i][j-1]=='.'):
        matrix[x][x]-=1
        matrix[x][rev_place[i*m+j-1]]=1
    if(i>0 and house[i-1][j]=='.'):
        matrix[x][x]-=1
        matrix[x][rev_place[(i-1)*m+j]]=1
    if(j<m-1 and house[i][j+1]=='.'):
        matrix[x][x]-=1
        matrix[x][rev_place[i*m+j+1]]=1
    if(i<n-1 and house[i+1][j]=='.'):
        matrix[x][x]-=1
        matrix[x][rev_place[(i+1)*m+j]]=1


det=1
det_denom=1
row=0
col=0
while (row<sz-1 and col<sz) :
    max_abs=abs(matrix[row][col]) 
    next_row=row
    for i in range (row+1,sz):
        cur_abs=abs(matrix [i][col]) 
        if(cur_abs>max_abs):
            max_abs=cur_abs
            next_row=i
    if(max_abs==0):
        col+=1
        continue
    for i in range (m) :
        matrix[row] [i], matrix[next_row] [i] =matrix[next_row] [i], matrix[row] [i] 
    for i in range (row+1,sz):
        if(matrix[i] [col]!=0):
            GCD=gcd(matrix [row] [col], matrix[i] [col] )
            m1=matrix [i] [col]//GCD
            m2=matrix[row] [col]//GCD
            det_denom*=m1*m2
            for j in range (col, sz) :
                matrix[row][j]*=m1
                matrix[i][j]*=m2
                matrix[i][j]=abs(matrix[i] [j]) - abs(matrix[row][j]) 
    row+=1
    col+=1
main_d=[] 
for i in range (sz):
    cur=matrix[i] [i] 
    if(cur!=0):
        main_d. append (cur) 
if(len(main_d)==0):
    det=0;
for i in main_d :
    det*=i

M=10**9    
det=(abs(det//det_denom))%M
print(det) 