#include <bits/stdc++.h>
using namespace std;
const int N = 2 * 1e5 + 9;
const int oo = 1e15;
const int mod = 1e9 + 7;
int n, m, ans, las, nex = 1;
long long dp[2][509][509], bx[] = {0, 1, 0, -1}, by[] = {1, 0, -1, 0};
char s[509][509];
bool check(int x, int y, int i) {
  x += bx[i], y += by[i];
  if (x >= 1 && x <= n && y <= m && y >= 1)
    return true;
  else
    return false;
}
long long Solve(int up, int down, int k) {
  int x = up, y = k - up + 1, x1 = down, y1 = m - (k - n + down) + 1;
  if (up > down || s[x][y] != s[x1][y1]) return 0;
  long long res = 0ll;
  for (int i = 2; i < 4; ++i)
    for (int j = 0; j < 2; ++j) {
      if (check(x, y, i) && check(x1, y1, j) &&
          s[x + bx[i]][y + by[i]] == s[x1 + bx[j]][y1 + by[j]]) {
        res += dp[las][up + bx[i]][down + bx[j]];
        res %= mod;
      }
    }
  return res;
}
bool kt(int i, int j) {
  int x1 = i, y1 = (n + m) / 2 - i + 1, x2 = j,
      y2 = m - ((n + m) / 2 - n + j) + 1;
  if (x1 > 0 && x2 > 0 && y1 > 0 && y2 > 0 && x1 <= n && x2 <= n && y1 <= m &&
      y2 <= m && abs(x1 - x2) + abs(y1 - y2) <= 1)
    return true;
  else
    return false;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j) cin >> s[i][j];
  if (s[1][1] == s[n][m]) {
    dp[las][1][n] = 1;
  }
  for (int k = 2; k <= (n + m) / 2; ++k) {
    for (int i = 1; i <= n; ++i)
      for (int j = i; j <= n; ++j) {
        if (i <= k && (n - j + 1) <= k) {
          dp[nex][i][j] = Solve(i, j, k);
          if (k == (n + m) / 2 && kt(i, j)) ans = (dp[nex][i][j] + ans) % mod;
        }
      }
    swap(las, nex);
    memset(dp[nex], 0ll, sizeof dp[nex]);
  }
  cout << ans;
}
