#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define ri register int
using namespace std;
typedef double db;
typedef long double ld;
typedef long long ll;
typedef vector <int> poly;
typedef pair <int, int> pii;
typedef pair <ll, int> pli;
typedef pair <int, ll> pil;
typedef pair <ll, ll> pll;
typedef unsigned long long ulll;
typedef unsigned int uii;
typedef string strr;
#define fi first
#define se second
#define pb push_back
#define ppp pop_back
#define rez resize
const ll Inf = 2e18;
const int rlen = 1 << 20, inf = 0x3f3f3f3f;
char buf[rlen], *ib = buf, *ob = buf;
#define gc() (((ib == ob) && (ob = (ib =  buf) + fread(buf, 1, rlen, stdin)), ib == ob) ? -1 : *ib++)
inline int read() {
  static int ans, f;
  static char ch;
  ans = 0, ch = gc(), f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = gc();
  while (isdigit(ch)) ans = (ans << 3) + (ans << 1) + (ch ^ 48), ch = gc();
  return f ? ans: -ans;
}
inline ll readl() {
  static ll ans;
  static char ch;
  for (ans = 0, ch = gc(); !isdigit(ch); ch = gc());
  while (isdigit(ch)) ans = ((ans << 2) + ans << 1) + (ch ^ 48), ch = gc();
  return ans;
}
inline int Read(char *s) {
  static int top;
  static char ch;
  top = 0, ch = gc();
  while (!isalpha(ch) && !isdigit(ch)) ch = gc();
  while (isalpha(ch) || isdigit(ch)) s[++top] = ch, ch = gc();
  return top;
}
namespace modular {
  const int mod = 998244353;// = 1e9 + 7;
  //int mod;
  int ret;
  inline int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; }
  inline int dec(int a, int b) { return a < b ? a - b + mod : a - b; }
  inline int mul(int a, int b) { return (ll) a * b % mod; }
  inline void Add(int &a, int b) { a = a + b < mod ? a + b : a + b - mod; }
  inline void Dec(int &a, int b) { a = a < b? a - b + mod : a - b; }
  inline void Mul(int &a, int b) { a = (ll) a * b % mod; }
  inline int ksm(int a, int p) {
    for (ret = 1; p; p >>= 1, Mul(a, a)) (p & 1) && (Mul(ret, a), 1);
    return ret;
  }
  inline int Inv(int a) { return ksm(a, mod - 2); }
  inline int sqr(int a) { return (ll) a * a % mod; }
  inline int cub(int a) { return (ll) a * a % mod * a % mod; }
} using namespace modular;
template <typename T> inline void ckmax(T &a, T b) { a < b ? a = b : 0; }
template <typename T> inline void ckmin(T &a, T b) { a > b ? a = b : 0; }
template <typename T> inline T Abs(T a) { return a < 0 ? -a : a; }
template <typename T> inline T gcd(T a, T b) {
  T t;
  while (b) t = a, a = b, b = t - t / a * a;
  return a;
}
template <typename T> inline void exgcd(T a, T b, T &x, T &y) {
  if (!b) {
    x = 1, y = 0;
    return;
  }
  exgcd(b, a - a / b * b, y, x);
  y -= a / b * x;
}
const int N = 15;
int n, m, H[N][N][2], L[N][N][2], mx, cnt[1 << 12], C[N][N], pw[N];
char s[N][N];
inline int calc(int x, int y) {
  int res = add(add(L[x][y][0], L[x][y][1]), add(H[x][y][0], H[x][y][1]));
  return mul(res, Inv(mul(C[n][x], C[m][y])));
}
int main() {
  #ifdef ldxcaicai
  freopen("lx.in", "r", stdin);
  #endif
  scanf("%d%d", &n, &m), mx = 1 << max(n, m);
  for (ri i = 1; i < mx; ++i) cnt[i] = cnt[i >> 1] + (i & 1);
  for (ri i = 0; i < n; ++i) scanf("%s", s[i]);
  pw[0] = 1;
  for (ri i = 1; i <= max(n, m); ++i) pw[i] = add(pw[i - 1], pw[i - 1]);
  for (ri i = 0; i <= max(n, m); ++i) for (ri j = C[i][0] = 1; j <= i; ++j) C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
  for (ri i = 1; i <= m; ++i) L[n][i][1] = mul(C[m][i], pw[m - i]);
  int res = 0, _n = 1 << n, _m = 1 << m;
  for (ri i = n; i; --i) for (ri j = m; j; --j) {
    for (ri x = 1; x < i; ++x) {
      Add(H[x][j][0], mul(add(L[i][j][0], mul(2, L[i][j][1])), C[i][x]));
      Add(H[x][j][1], mul(L[i][j][1], mul(C[i][x], dec(pw[i - x], 2))));
    }
    for (ri y = 1; y < j; ++y) {
      Add(L[i][y][0], mul(add(H[i][j][0], mul(2, H[i][j][1])), C[j][y]));
      Add(L[i][y][1], mul(H[i][j][1], mul(C[j][y], dec(pw[j - y], 2))));
    }
    Add(res, mul(L[i][j][1], dec(pw[i], 2)));
    Add(res, mul(H[i][j][1], dec(pw[j], 2)));
  }
  Add(res, 1 << m);
  for (ri s1 = 1; s1 < _n; ++s1) for (ri s2 = 1; s2 < _m; ++s2) {
    int ct1 = cnt[s1], ct2 = cnt[s2], ct;
    bool ff = 1;
    for (ri i = 0; i < n; ++i) if (s1 >> i & 1) {
      ct = 0;
      for (ri j = 0; j < m; ++j) if (s2 >> j & 1) ct += s[i][j] == '#';
      if (!ct || ct == ct2) {
        ff = 0;
        break;
      }
    }
    if (!ff) continue;
    for (ri i = 0; i < m; ++i) if (s2 >> i & 1) {
      ct = 0;
      for (ri j = 0; j < n; ++j) if (s1 >> j & 1) ct += s[j][i] == '#';
      if (!ct || ct == ct1) {
        ff = 0;
        break;
      }
    }
    if (!ff) continue;
    Add(res, calc(ct1, ct2));
  }
  cout << res;
  return 0;
}

Measured memory_bytes: 256