#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxd = 64;
const int mod = 1e9+7;
int a[maxd],b[maxd];
long long dp[maxd][2][2][2],n,m;
long long dfs(int p,int l,int r,int f)
{
	//位数，是否填过小于m的值，是否填过大于n的值，是否填过a<b,最高位是否都为1
	if(p < 0) return 1;
	long long &ans = dp[p][l][r][f];
	// 记忆化搜索
	if(ans) return ans;
	for(int i=0;i<2;i++)  // y
		for(int j=0;j<2;j++) // x
		{
			int nl = l,nr = r,nf = f;
			if(!nf && i && i!=j) continue;
			if((j&i)!=j) continue;
			if(!nl && j < a[p]) continue; // 如果值小于n了
			if(!nr && i > b[p]) continue; // 如果值大于m了
			if(j > a[p]) nl = 1;
			if(i < b[p]) nr = 1;
			if(j) nf = 1;

			ans += dfs(p-1,nl,nr,nf);
			ans %= mod;
		}
	return ans;
}
int main()
{
	// freopen("a.in","r",stdin);
	// freopen("k.out","w",stdout);
	scanf("%lld %lld",&n,&m);
	for(int i=0;i<=63;i++) a[i] = (n>>i)&1 , b[i] = (m>>i)&1;
	long long ans = dfs(63,0,0,0);
	printf("%lld",ans);
	return 0;
}