#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 253;
const int MAX_B = 16;
const int MOD = 1000000007;
int dp[(1 << MAX_B) + 5][MAX_B + 3][2][2][2];
vector<char> g;
char a[MAX_N][MAX_N];
int n, m;
int parse(int x, int y) { return min(n * m - 1, (x - 1) * m + y - 1); }
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
    }
  }
  if (n > m) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        g.push_back(a[i][j]);
      }
    }
  } else {
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
        g.push_back(a[j][i]);
      }
    }
    swap(n, m);
  }
  dp[0][m][0][0][0] = 1;
  for (int x = 0; x <= n; x++) {
    int curPos = x & 1;
    int nxtPos = !curPos;
    for (int mask = 0; mask < (1 << m); mask++) {
      for (int y = 0; y <= m; y++) {
        for (int v = 0; v <= 1; v++) {
          for (int protect = 0; protect <= 1; protect++) {
            dp[mask][y][v][protect][nxtPos] = 0;
          }
        }
      }
    }
    for (int mask = 0; mask < (1 << m); mask++) {
      for (int y = 0; y <= m; y++) {
        for (int v = 0; v <= 1; v++) {
          for (int protect = 0; protect <= 1; protect++) {
            if (dp[mask][y][v][protect][curPos] == 0) {
              continue;
            }
            int val = dp[mask][y][v][protect][curPos];
            int nxtMask = mask;
            if (y == m) {
              for (int i = 1; i <= m; i++) {
                if (g[parse(x + 1, i)] == 'x' &&
                    ((nxtMask & (1 << (i - 1))) > 0)) {
                  nxtMask ^= (1 << (i - 1));
                }
              }
              (dp[nxtMask][0][v][0][nxtPos] += val) %= MOD;
            } else {
              if (g[parse(x, y + 1)] == 'x') {
                (dp[mask][y + 1][v][0][curPos] += val) %= MOD;
              } else {
                if (v == 1) {
                  if ((mask & (1 << y)) > 0) {
                    if (protect == 0) {
                      (dp[mask][y + 1][v][0][curPos] += val) %= MOD;
                      (dp[mask][y + 1][v][1][curPos] += val) %= MOD;
                    } else {
                      (dp[mask][y + 1][v][1][curPos] += (2 * val) % MOD) %= MOD;
                    }
                  } else {
                    if (protect == 0) {
                      (dp[mask | (1 << y)][y + 1][v][1][curPos] += val) %= MOD;
                    } else {
                      (dp[mask][y + 1][v][1][curPos] += val) %= MOD;
                      (dp[mask | (1 << y)][y + 1][v][1][curPos] += val) %= MOD;
                    }
                  }
                } else {
                  if (protect == 0) {
                    if ((mask & (1 << y)) > 0) {
                      (dp[mask][y + 1][v][0][curPos] += val) %= MOD;
                      (dp[mask][y + 1][v][1][curPos] += val) %= MOD;
                    } else {
                      (dp[mask][y + 1][v + 1][0][curPos] += val) %= MOD;
                      (dp[mask | (1 << y)][y + 1][v][1][curPos] += val) %= MOD;
                    }
                  } else {
                    if ((mask & (1 << y)) > 0) {
                      (dp[mask][y + 1][v][1][curPos] += (2 * val) % MOD) %= MOD;
                    } else {
                      (dp[mask][y + 1][v][1][curPos] += val) %= MOD;
                      (dp[mask | (1 << y)][y + 1][v][1][curPos] += val) %= MOD;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  int res = 0;
  for (int mask = 0; mask < (1 << m); mask++) {
    for (int protect = 0; protect <= 1; protect++) {
      (res +=
       (dp[mask][m][0][protect][n & 1] + dp[mask][m][1][protect][n & 1]) %
       MOD) %= MOD;
    }
  }
  cout << res;
  return 0;
}
