#include<bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define lli long long int
#define ulli unsigned long long int
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define bs binary_search
#define loopl(i,a,b) for(lli i=a;i<b;i++) 
#define loop(i,a,b) for(int i=a;i<b;i++)
#define mod 1000000007
#define inf 1000000000000000
#define lld long double
#define pll pair<long long int,long long int>
#define vpll vector<pll>
#define vll vector<lli>
#define eps 0.000001
#define endl '\n'
 
using namespace std ;
 
#define MAXN 10000000
//lli spf[MAXN];  
//void sieve();
//set<lli> factors(lli x);
//lli power(lli x,lli y,lli p);

//void getZarr(string str, lli Z[]);

int main()
{  
    
    lli x,y; //X:number of rows, Y: number of columns
    cin>>x>>y; //assuming 10X10 matrix

    string s[x];
    
    loopl(i,0,x)
    cin>>s[i];

    lli NumWays[x][y]; //declare the NumWays matrix
    NumWays[x-1][y-1] = 1;
    // initialize first row of NumWays matrix
    for(lli i=y-2;i>=0;i--)
        {
            if(s[x-1][i]=='.')
            NumWays[x-1][i] = NumWays[x-1][i+1];

            else
                NumWays[x-1][i] = 0;

        }
    //Initialize first column of NumWays Matrix
    for(lli i=x-2;i>=0;i--)
        {
            if(s[i][y-1]=='.')
            NumWays[i][y-1] = NumWays[i+1][y-1];

            else
                NumWays[i][y-1] = 0;

        }
    //This bottom-up approach ensures that all the sub-problems needed
    // have already been calculated.
    for(lli i=x-2;i>=0;i--)
    {
        for(lli j=y-2;j>=0;j--)
        {
            if(s[i][j]=='.')
            {
                NumWays[i][j] = (NumWays[i+1][j] + NumWays[i][j+1])%mod;
            }

            else
                NumWays[i][j] = 0;
        }
    }
    
    cout<<NumWays[0][0]<<endl;
    return 0;

}
        
 

        
 
 
 
 /*   void sieve() 
    { 
        spf[1] = 1; 
        loopl(i,2,MAXN) 
            spf[i] = i; 
        for (lli i=4; i<MAXN; i+=2) 
            spf[i] = 2; 
      
        for (lli i=3; i*i<MAXN; i++) { 
            if (spf[i] == i) { 
                for (lli j=i*i; j<MAXN; j+=i) 
                    if (spf[j]==j) 
                        spf[j] = i; 
            } 
        }
 
    }*/ 
    /*
    multiset<lli> factors(lli x) 
    { 
        multiset<lli> pr; 
        while (x != 1) 
        { 
            pr.insert(spf[x]); 
            x = x / spf[x]; 
        } 
        return pr; 
    }
 
    */
 
    /*
    void dfs(lli q,lli root) 
    {
        vis[q]=1;
        
        ans[q]=1;
        for(auto x: v[q])
        {
            if(!vis[x])
            {
                if(a[x]==a[root] && x<root) continue;
                if(a[x]<a[root] || a[x]>a[root]+d) continue;
                dfs(x,root);
                ans[q]=(ans[q]*((ans[x]+1)%mod))%mod ;
            }
        }
            
    }
    */
 
 
 
    /*void getZarr(string str, lli Z[])
    {
        lli n = str.length();
        lli L, R, k;
        L = R = 0;
        for (lli i = 1; i < n; ++i){
            if (i > R){
                L = R = i;
                while (R<n && str[R-L] == str[R])
                    R++;
                Z[i] = R-L;
                R--;
            } else {
                k = i-L;
                if (Z[k] < R-i+1)
                    Z[i] = Z[k];
                else {
                    L = i;
                    while (R<n && str[R-L] == str[R])
                        R++;
                    Z[i] = R-L;
                    R--;
                }
            }
        }
    }
 
    */
 
    
  /*  lli power(lli x, lli y, lli p) 
    { 
        lli res = 1;   
        x = x % p;  
        while (y > 0) 
        { 
            if (y & 1) 
                res = (res*x) % p; 
      
            y = y>>1;  
            x = (x*x) % p;   
        } 
        return res; 
    } 
    */  
 
 

Measured memory_bytes: 9088