#pragma GCC optimize("O2,Ofast,inline,unroll-all-loops,-ffast-math")
#pragma GCC target("popcnt")
#include <bits/stdc++.h>
#define maxn 2010
#define ll long long
#define ull unsigned long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define pob pop_back
#define pf push_front
#define pof pop_front
#define pii pair<int, int>
#define pil pair<int, ll>
#define pll pair<ll, ll>
#define IL inline
#define ss system
using namespace std;

int A, B;
ll C[maxn][maxn], S[maxn][maxn], Si[maxn][maxn], ans = 0;
const ll p = 1e9 + 7;
template <class T> void read (T &x) {
  char ch = x = 0;
  bool fl = false;
  while (!isdigit(ch))
    fl |= ch == '-', ch = getchar();
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  x = fl ? -x : x;
}
ll calc(int x, int y) {
  int z = min(x, y);
  if (z < 0)
    return 0;
  return (S[x][z] * (y + 1) - Si[x][z] + p) % p;
}
void init() {
  C[0][0] = 1;
  for (int i = 0; i < maxn; i++) {
    S[0][i] = 1;
  }
  for (int i = 1; i < maxn; i++) {
    for (int j = 0; j <= i; j++) {
      C[i][j] = ((j ? C[i - 1][j - 1] : 0) + C[i - 1][j]) % p;
      S[i][j] = ((j ? S[i][j - 1] : 0) + C[i][j]) % p;
      Si[i][j] = ((j ? Si[i][j - 1] : 0) + C[i][j] * j) % p;
    }
  }
}
int main() {
  read(A), read(B), init();
  for (int x = 0; x <= A; x++) {
    for (int y = 0; y <= B - 1; y++) {
      ll tmp = calc(y - 1, A - x - y) + !y;
      ans = (ans + tmp * C[B - 1][y]) % p;
    }
  }
  printf("%lld\n", ans);
  return 0;
}