#include<bits/stdc++.h>
#define fo(i,a,b)for(int i=a,_e=b;i<=_e;++i)
#define ll long long
using namespace std;
const int N=3e5+5,mo=1e9+7;
int n;
ll f[2][3][7];
char c[N];
inline void up(ll &x){x%=mo;}
int main(){
	scanf("%s",c+1);n=strlen(c+1);c[n+1]='1';
	f[0][0][0]=1;
	fo(o,1,n+1){
		int p=o&1,q=!p;
		memset(f[p],0,sizeof f[p]);
		bool is=c[o]=='?';
		if(is)c[o]='0';
		if(c[o]=='0'){
			fo(j,0,2)fo(i,0,6)
				up(f[p][j==0?1:j%2+1][i]+=f[q][j][i]);
		}
		if(is)c[o]='1';
		if(c[o]=='1'){
			fo(i,0,6)up(f[p][0][i]+=f[q][1][i]);
			up(f[p][0][0]+=f[q][0][4]+f[q][2][4]);
			up(f[p][0][1]+=f[q][0][0]+f[q][0][5]+f[q][2][5]);
			up(f[p][0][2]+=f[q][0][1]+f[q][0][6]+f[q][2][6]);
			up(f[p][0][3]+=f[q][0][2]+f[q][0][3]+f[q][2][3]);
			up(f[p][0][4]+=f[q][2][0]);
			up(f[p][0][5]+=f[q][2][1]);
			up(f[p][0][6]+=f[q][2][2]);
		}
	}
	int p=(n+1)&1;
	cout<<(f[p][0][2]+f[p][0][3])%mo;
}