def f(S): ret=1 for s in S: s01=s10=True for i in range(len(s)): s01&=s[i]=='?' or s[i]==str(i%2) s10&=s[i]=='?' or s[i]==str((i+1)%2) ret=ret*(int(s01)+int(s10))%MOD return ret MOD=10**9+7 H,W=map(int,input().split()) S=[] T=[""]*W for i in range(H): S.append(input()) for j in range(W): T[j]="".join([T[j],S[i][j]]) ans=f(S)+f(T) P=True Q=True for i in range(H): for j in range(W): P&=S[i][j]=='?' or (S[i][j]==str((i+j)%2)) Q&=S[i][j]=='?' or (S[i][j]==str((i+j+1)%2)) ans-=int(P)+int(Q) print(ans%MOD)