You are given an integer m.

Let M = 2m - 1.

You are also given a set of n integers denoted as the set T. The integers will be provided in base 2 as n binary strings of length m.

A set of integers S is called "good" if the following hold. 

  1. If <image>, then <image>. 
  2. If <image>, then <image>
  3. <image>
  4. All elements of S are less than or equal to M. 



Here, <image> and <image> refer to the bitwise XOR and bitwise AND operators, respectively.

Count the number of good sets S, modulo 109 + 7.

Input

The first line will contain two integers m and n (1 ≤ m ≤ 1 000, 1 ≤ n ≤ min(2m, 50)).

The next n lines will contain the elements of T. Each line will contain exactly m zeros and ones. Elements of T will be distinct.

Output

Print a single integer, the number of good sets modulo 109 + 7. 

Examples

Input

5 3
11010
00101
11000


Output

4


Input

30 2
010101010101010010101010101010
110110110110110011011011011011


Output

860616440

Note

An example of a valid set S is {00000, 00101, 00010, 00111, 11000, 11010, 11101, 11111}.
#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const int N = 3000;
const int MOD = 1e9 + 7;
long long sum(long long a, long long b) {
  a += b;
  if (a < 0) return a + MOD;
  if (a >= MOD)
    return a - MOD;
  else
    return a;
}
long long mult(long long a, long long b) {
  long long c = 1LL * (a % MOD) * (b % MOD);
  return c % MOD;
}
int poww(long long a, long long b) {
  long long res = 1;
  a %= MOD;
  while (b > 0) {
    if (b % 2) res = (res * a) % MOD;
    a = (a * a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
vector<int> g[N];
int n, m;
long long stt[N][N];
string a[N];
bitset<2000> used;
vector<int> topsort;
void dfs(int u) {
  used[u] = 1;
  for (auto v : g[u]) {
    if (!used[v]) dfs(v);
  }
  topsort.push_back(u);
}
long long ans = 1;
void precalc() {
  stt[0][0] = ans;
  for (int i = 0; i < m; i++) {
    for (int j = 0; j <= i; j++) {
      stt[i + 1][j] = sum(stt[i + 1][j], mult(stt[i][j], j));
      stt[i + 1][j + 1] = sum(stt[i + 1][j + 1], stt[i][j]);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  swap(n, m);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  precalc();
  for (int i = 0; i < m; i++) {
    for (int j = i + 1; j < m; j++) {
      bool flag = 0;
      for (int k = 0; k < n; k++) {
        if (a[k][j] != a[k][i]) flag = 1;
      }
      if (!flag) {
        g[i].push_back(j);
        g[j].push_back(i);
      }
    }
  }
  for (int u = 0; u < m; u++) {
    dfs(u);
    int p = topsort.size();
    if (!p) continue;
    int res = 0;
    for (int i = 0; i < topsort.size() + 1; i++) {
      res = 1LL * sum(res, stt[topsort.size()][i]) % MOD;
    }
    ans = mult(ans, res);
    topsort.clear();
  }
  cout << ans << "\n";
  return 0;
}
