#include <cstdio>
int a[100];
const int C = 27*27*27*3;
int dp[60][C];
char s[100];
const int mod = 1000000007;
inline void add(int &v, int t) {
v += t;
if (v >= mod) v -= mod;
}
int main() {
int n, x, p, l, r;
scanf("%d%d%d", &n, &x, &p);
dp[0][0] = 1;
int ok[11], f = 1, ans = 0;
for (int i = 0; i < n; i++) {
scanf("%s", s);
if (s[0] == '?') {
l = 0; r = p;
} else {
l = 0;
for (int j = 0; s[j]; j++) {
l = l * 10 + s[j] - '0';
}
r = l;
if (l == 0) {
f = 0;
}
}
if (l == 0) ++l;
for (int j = 0; j < C; j++) {
int t = j;
if (!dp[i][j]) continue;
for (int k = 0; k < x; k++) {
ok[k] = t % 3;
t /= 3;
}
for (int k = l; k <= r; k++) {
int nt = 0, z;
for (int y = x - 1; y >= 0; y--) {
z = ok[y];
if (y + 1 - k == 0) {
z++;
} else if (y + 1 - k > 0) {
z += ok[y-k];
}
if (z >= 2) {
nt = nt * 3 + 2;
} else if (z == 1) {
nt = nt * 3 + 1;
} else {
nt = nt * 3;
}
}
add(dp[i+1][nt], dp[i][j]);
}
}
}
if (!f) {
puts("0");
} else {
for (int j = 0; j < C; j++) {
int t = j;
for (int k = 0; k < x; k++) {
ok[k] = t % 3;
t /= 3;
}
if (ok[x-1] == 1) {
add(ans, dp[n][j]);
}
}
printf("%d\n", ans);
}
return 0;
}