#include <bits/stdc++.h>
using namespace std;
const long long big = 1000000007;
long long n, m, k, T;
long long FAC[1001] = {0};
long long INV[1001] = {0};
vector<long long> H;
long long DP[1001] = {0};
bool DPC[1001] = {0};
long long upp(long long i, long long j) {
  if (j == 0) return 1;
  long long h = upp(i, j / 2);
  if (j % 2 == 0) return (h * h) % big;
  return (i * ((h * h) % big)) % big;
}
long long bin(long long i, long long j) {
  if (i < j || i < 0 || j < 0) return 0;
  return (FAC[i] * ((INV[i - j] * INV[j]) % big)) % big;
}
long long dp(long long i) {
  if (i == 0) return 1;
  if (DPC[i]) return DP[i];
  long long ans = 0;
  for (long long c1 = 1; c1 <= i; c1++) {
    ans += bin(i - 1, c1 - 1) * dp(i - c1);
    ans %= big;
  }
  DP[i] = ans;
  DPC[i] = 1;
  return ans;
}
int main() {
  long long a, b, c, d;
  long long t = 1;
  for (long long c1 = 0; c1 < 1001; c1++) {
    FAC[c1] = t;
    INV[c1] = upp(t, big - 2);
    t *= c1 + 1;
    t %= big;
  }
  cin >> m >> n;
  for (long long c1 = 0; c1 < m; c1++) {
    H.push_back(0);
  }
  string s;
  t = 1;
  for (long long c1 = 0; c1 < n; c1++) {
    cin >> s;
    for (long long c2 = 0; c2 < m; c2++) {
      if (s[c2] == '1') {
        H[c2] += t;
      }
    }
    t *= 2;
  }
  sort(H.begin(), H.end());
  long long prev = H[0];
  long long now = 0;
  long long ans = 1;
  for (long long c1 = 0; c1 < m; c1++) {
    if (H[c1] != prev) {
      ans *= dp(now);
      ans %= big;
      now = 1;
    } else {
      now++;
    }
    prev = H[c1];
  }
  ans *= dp(now);
  ans %= big;
  cout << ans << "\n";
  return 0;
}
