#include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   char maz[505][505];   int dp[10][505][505];   inline void cm(int& x) {     if (x >= mod) x -= mod;   }   int main() {     int n, m;     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; ++i) scanf( %s , maz[i] + 1);     int up = (n + m - 1) / 2;     if (maz[1][1] != maz[n][m]) {       puts( 0 );       return 0;     }     dp[0][1][m] = 1;     for (int i = 0; i < up; ++i) {       int ni = (i + 1) & 1, li = i & 1;       memset(dp[ni], 0, sizeof(dp[ni]));       for (int j = 1; j <= m; ++j) {         int y1 = i + 2 - j;         if (y1 < 1 || y1 > n) continue;         for (int k = m; k >= 1; --k) {           int y2 = n + m - i - k;           if (y2 < 1 || y2 > n || maz[y1][j] != maz[y2][k]) continue;           if (y1 < n && y2 > 1 && maz[y1 + 1][j] == maz[y2 - 1][k])             dp[ni][j][k] += dp[li][j][k];           if (y1 < n && k > 1 && maz[y1 + 1][j] == maz[y2][k - 1])             dp[ni][j][k - 1] += dp[li][j][k];           if (j < m && y2 > 1 && maz[y1][j + 1] == maz[y2 - 1][k])             dp[ni][j + 1][k] += dp[li][j][k];           if (j < m && k > 1 && maz[y1][j + 1] == maz[y2][k - 1])             dp[ni][j + 1][k - 1] += dp[li][j][k];           cm(dp[ni][j][k]);           cm(dp[ni][j][k - 1]);           cm(dp[ni][j + 1][k]);           cm(dp[ni][j + 1][k - 1]);         }       }     }     int ans = 0;     if ((n + m - 1) % 2) {       for (int i = 1; i <= n; ++i) {         ans += dp[up & 1][up + 2 - i][up + 2 - i];         cm(ans);       }     } else {       up--;       for (int i = 1; i <= n; ++i) {         ans += dp[up & 1][up + 2 - i][up + 3 - i];         cm(ans);         ans += dp[up & 1][up + 2 - i][up + 2 - i];         cm(ans);       }     }     printf( %d n , ans);   }   