#include <bits/stdc++.h>
const int N = 155, mod = 1000000007;
long long dp[2][N][N][5], f[N][N];
long long M(long long &a) { return a > mod ? a %= mod : a; }
int main() {
  int n, m, i, j, k, t, n1, n2;
  long long ans = 0;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; ++i) {
    n1 = i & 1;
    n2 = (i + 1) & 1;
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k) {
        M(++dp[n1][j][k][0]);
        for (t = 0; t <= 3; ++t) M(ans += dp[n1][j][k][t]);
      }
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k) M(f[j][k] = f[j][k - 1] + dp[n1][j][k][0]);
    for (k = m; k >= 1; --k)
      for (j = k; j >= 1; --j) dp[n2][j][k][0] = M(f[j][k] += f[j + 1][k]);
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k)
        M(f[j][k] = dp[n1][j][k][1] + dp[n1][j - 1][k][0]);
    for (j = 1; j <= m; ++j) {
      for (k = j; k <= m; ++k) M(f[j][k] += f[j - 1][k]);
      for (k = j; k <= m; ++k)
        M(dp[n2][j][k][1] = dp[n2][j][k - 1][1] + f[j][k]);
    }
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k)
        M(f[j][k] = dp[n1][j][k][2] + dp[n1][j][k + 1][0]);
    for (k = m; k >= 1; --k) {
      for (j = k; j >= 1; --j) (f[j][k] += f[j][k + 1]) %= mod;
      for (j = k; j >= 1; --j)
        dp[n2][j][k][2] = (dp[n2][j + 1][k][2] + f[j][k]) % mod;
    }
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k)
        M(f[j][k] = dp[n1][j][k][3] + dp[n1][j - 1][k][2] +
                    dp[n1][j][k + 1][1] + dp[n1][j - 1][k + 1][0]);
    for (j = 1; j <= m; ++j)
      for (k = m; k >= j; --k) M(f[j][k] += f[j][k + 1]);
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k) M(f[j][k] += f[j - 1][k]);
    for (j = 1; j <= m; ++j)
      for (k = j; k <= m; ++k) dp[n2][j][k][3] = f[j][k];
  }
  printf("%I64d", ans);
  return 0;
}
