#include<bits/stdc++.h>
using namespace std;
const int maxn=300100;
const int md=1e9+7;
char str[maxn];
int dp[maxn][2][3][3];
void Add(int &x,int y){
	(x+=y)%=md;
}
int main(){
//	freopen("E.in","r",stdin);
	int n;
	scanf("%s",str+1);
	n=strlen(str+1);
	str[n+1]='1';
	dp[0][0][0][0]=1;
	for(int i=1;i<=n+1;i++){
		if(str[i]!='1'){
			for(int j=0;j<=1;j++)
				for(int k=0;k<3;k++)
					for(int l=0;l<3;l++)
						Add(dp[i][j][k>1?k-1:k+1][l],dp[i-1][j][k][l]);
		}
		if(str[i]!='0'){
			Add(dp[i][1][0][1],dp[i-1][0][0][0]);
			Add(dp[i][1][0][1],dp[i-1][0][0][1]);
			Add(dp[i][1][0][2],dp[i-1][0][0][2]);

			Add(dp[i][0][0][0],dp[i-1][1][0][0]);
			Add(dp[i][0][0][2],dp[i-1][1][0][1]);
			Add(dp[i][0][0][2],dp[i-1][1][0][2]);

			for(int j=0;j<=1;j++)
				for(int l=0;l<3;l++)
					Add(dp[i][j][0][l],dp[i-1][j][1][l]);

			for(int j=0;j<=1;j++)
				for(int l=0;l<3;l++)
					Add(dp[i][j^1][0][l],dp[i-1][j][2][l]);
		}
	}
	int ans=0;
	for(int j=0;j<=1;j++)
		Add(ans,dp[n+1][j][0][2]);
	printf("%d\n",ans);
	return 0;
}
