A + B balls are arranged in a row. The leftmost A balls are colored red, and the rightmost B balls are colored blue.

You perform the following operation:

* First, you choose two integers s, t such that 1 \leq s, t \leq A + B.
* Then, you repeat the following step A + B times: In each step, you remove the first ball or the s-th ball (if it exists) or the t-th ball (if it exists, all indices are 1-based) from left in the row, and give it to Snuke.



In how many ways can you give the balls to Snuke? Compute the answer modulo 10^9 + 7.

Here, we consider two ways to be different if for some k, the k-th ball given to Snuke has different colors. In particular, the choice of s, t doesn't matter. Also, we don't distinguish two balls of the same color.

Constraints

* 1 \leq A, B \leq 2000

Input

Input is given from Standard Input in the following format:


A B


Output

Print the answer.

Examples

Input

3 3


Output

20


Input

4 4


Output

67


Input

7 9


Output

7772


Input

1987 1789


Output

456315553
#include <bits/stdc++.h>
// #pragma GCC optimize ("O3")
// #pragma GCC target ("sse4")
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;

#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,a,b) for (int i=(a); i<(b); ++i)
#define FORD(i,a,b) for (int i=(a)-1; i>=(b); --i)

#define pb push_back
#define mp make_pair
#define st first
#define nd second

const int MOD = 1000000007;

LL SN[2100][2100];
LL SNpartial[2100][2100];

LL DP[2100][2100];

LL get(int R, int B) {
  if (R == 0 || B == 0) return 1;
  if (DP[R][B] > -1) return DP[R][B];

  LL if_blue = (SNpartial[B-1][B] - SNpartial[B-1][max(1,B-R)-1] + MOD) % MOD;
  LL if_red = get(R-1, B);

  DP[R][B] = (if_blue + if_red) % MOD;
  return DP[R][B];
}

int main() {
  // ios_base::sync_with_stdio(0);

  REP(i,2010) {
    SN[i][0] = SN[i][i] = 1;
    FOR(j,1,i) SN[i][j] = (SN[i-1][j-1] + SN[i-1][j]) % MOD;

    SNpartial[i][0] = 0;
    FOR(j,1,i+2) SNpartial[i][j] = (SNpartial[i][j-1] + SN[i][j-1]) % MOD;
  }

  REP(i,2100)REP(j,2100) DP[i][j] = -1;

  int R, B;
  scanf("%d%d", &R, &B);

  LL result = 0;
  REP(reds_in_beginning, R+1) {
    FOR(blue_from_t, max(1, B - (R - reds_in_beginning)), B+1) {
      result += SN[B-1][blue_from_t-1] * get(
        R - reds_in_beginning - (B - blue_from_t),
        B - blue_from_t
      ) % MOD;
      result %= MOD;
    }
  }

  printf("%d\n", (int)(result % MOD));
}
