#include <iostream>
#include<set>
#include<vector>
using namespace std;
int mod=1000000007;
int inv=(mod+1)/2;
int add(int x, int y)
{
	int c=x+y;
	if(c>=mod)c-=mod;
	return c;
}
int sub(int x, int y)
{
	int c=x-y;
	if(c<0)c+=mod;
	return c;
}
int mlt(int x, int y)
{
	long long c=x*1LL*y;
	if(c>=mod)c%=mod;
	return c;
}
vector<int>rec(vector<int>&dp, int m)
{
	vector<int>res(m+1), dpml(m+1), pref(m+1), pows(m+1), dvas(m+1);
	pows[0]=1;
	dvas[0]=1;
	for(int i=1; i<=m; i++)
	{
		pows[i] = mlt(pows[i - 1], inv);
		dvas[i] = mlt(dvas[i - 1], 2);
	}
	res[1]=add(dp[1],dp[1]);
	for(int i=1; i<=m-1; i++)
	{
		dpml[i]=mlt(dp[i], mlt(pows[i+1], i));
	}
	pref[0]=0;
	for(int i=1; i<m; i++)
		pref[i]=add(pref[i-1], dpml[i]);
	for(int i=2; i<=m; i++)
	{
		res[i]=mlt(dp[i], i+1);
	//	cout<<i<<' '<<res[i]<<endl;
		int val=pref[i-1];
		val=mlt(val, dvas[i]);
		res[i]=add(res[i], val);
	}
	return res;
}
int main()
{
	int n, m;
	cin>>n>>m;
	vector<int>dp(m+1);
	for(int i=1; i<=m; i++)
		dp[i]=1;
	for(int i=1; i<=n; i++)
	{
		dp =rec(dp, m);
		//for(int i=1; i<=m; i++)cout<<dp[i]<<' ';
	//cout << endl;
	}
	cout<<dp[m]<<endl;
}
