#ifdef DEBUG
#define _GLIBCXX_DEBUG
#endif
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
int n, m;
const int mod = (int)1e9 + 7;
const int maxN = 5005;
int mult(int a, int b) {
    return (1LL * a * b) % mod;
}

int pw(int a, int b) {
    if (b == 0) return 1;
    if (b & 1) return mult(a, pw(a, b - 1));
    int res = pw(a, b / 2);
    return mult(res, res);
}

int sub(int a, int b) {
    int s = a - b;
    if (s < 0) s += mod;
    return s;
}

int sum(int a, int b) {
    int s = a + b;
    if (s >= mod) s -= mod;
    return s;
};

int fact[maxN], invfact[maxN], inv[maxN];

void init() {
    inv[1] = invfact[1] = invfact[0] = fact[0] = fact[1] = 1;
    for (int i = 2; i < maxN; i++) {
        fact[i] = mult(fact[i - 1], i);
        inv[i] = mult(inv[mod % i], mod - mod / i);
        invfact[i] = mult(invfact[i - 1], inv[i]);
    }
}

int cnk(int n, int k) {
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return mult(fact[n], mult(invfact[k], invfact[n - k]));
}

int invNumber(int a) {
    return pw(a, mod - 2);
}
int pw2[maxN];
int inv2[maxN];
int dp[maxN][maxN];
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
//    freopen("input.txt", "r", stdin);
    init();
    cin >> n >> m;
    pw2[0] = 1;
    inv2[0] = 1;
    for (int i = 1; i <= m; i++) inv2[i] = mult(inv2[i - 1], pw(2, mod - 2));
    for (int i = 1; i <= m; i++) pw2[i] = mult(2, pw2[i - 1]);
    for (int i = 1; i <= m; i++) dp[0][i] = 1;
    for (int bit = 0; bit < n; bit++) {
        int cur_sum = 0;
        for (int i = 1; i <= m; i++) {
            if (i > 1) {
                cur_sum = sum(cur_sum, mult(dp[bit][i - 1], mult(i - 1, inv2[i - 1])));
            }
            dp[bit + 1][i] = mult(cur_sum, pw2[i - 1]);
            dp[bit + 1][i] = sum(dp[bit + 1][i], mult(dp[bit][i], i + 1));
        }
    }
    cout << dp[n][m];
    return 0;
}