You are given two integers n and m. Calculate the number of pairs of arrays (a, b) such that:

  * the length of both arrays is equal to m; 
  * each element of each array is an integer between 1 and n (inclusive); 
  * a_i ≤ b_i for any index i from 1 to m; 
  * array a is sorted in non-descending order; 
  * array b is sorted in non-ascending order. 



As the result can be very large, you should print it modulo 10^9+7.

Input

The only line contains two integers n and m (1 ≤ n ≤ 1000, 1 ≤ m ≤ 10).

Output

Print one integer – the number of arrays a and b satisfying the conditions described above modulo 10^9+7.

Examples

Input


2 2


Output


5


Input


10 1


Output


55


Input


723 9


Output


157557417

Note

In the first test there are 5 suitable arrays: 

  * a = [1, 1], b = [2, 2]; 
  * a = [1, 2], b = [2, 2]; 
  * a = [2, 2], b = [2, 2]; 
  * a = [1, 1], b = [2, 1]; 
  * a = [1, 1], b = [1, 1]. 
#include <bits/stdc++.h>
using namespace std;
template <class T>
struct rge {
  T b, e;
};
template <class T>
rge<T> range(T i, T j) {
  return rge<T>{i, j};
}
struct debug {
  ~debug() { cout << endl; }
  template <class T>
  debug& operator<<(T x) {
    cout << boolalpha << x;
    return *this;
  }
  template <class B, class C>
  debug& operator<<(pair<B, C> x) {
    return *this << "(" << x.first << ", " << x.second << ")";
  }
  template <class T>
  debug& operator<<(rge<T> x) {
    *this << "[";
    for (auto it = x.b; it != x.e; it++) {
      *this << ", " + 2 * (it == x.b) << *it;
    }
    return *this << "]";
  }
  template <class T>
  debug& operator<<(vector<T> x) {
    return *this << range(x.begin(), x.end());
  }
};
void add_self(long long& a, long long b) { a += b, a %= 1000000007; }
bool solve(void) {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<vector<long long>> dp(n, vector<long long>(n));
  vector<vector<long long>> pre(n + 1, vector<long long>(n + 1));
  auto sum = [&](int a, int b, int c, int d) {
    long long ans =
        pre[c + 1][d + 1] - pre[a][d + 1] - pre[c + 1][b] + pre[a][b];
    while (ans < 0) ans += 1000000007;
    while (ans >= 1000000007) ans -= 1000000007;
    return ans;
  };
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) dp[i][j] = i <= j;
  for (int rep = 0; rep < m - 1; rep++) {
    vector<vector<long long>> new_dp(n, vector<long long>(n));
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) {
        pre[i + 1][j + 1] =
            pre[i + 1][j] + pre[i][j + 1] - pre[i][j] + dp[i][j];
        pre[i + 1][j + 1] %= 1000000007;
        while (pre[i + 1][j + 1] < 0) pre[i + 1][j + 1] += 1000000007;
      }
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) new_dp[i][j] = sum(i, 0, n - 1, j);
    dp = new_dp;
  }
  long long ans = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) add_self(ans, dp[i][j]);
  printf("%lld\n", ans);
  return true;
}
int main(int argc, char* argv[]) {
  solve();
  return 0;
}
