#include <bits/stdc++.h>
using namespace std;
int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
const int maxn = 130;
const int inf = 1e9 + 10;
const int mod = 1e9 + 7;
struct matrix {
  int a[128][128], N;
  matrix(int v = 0, int n = 128) {
    N = n;
    for (int i = 0; i < N; i++)
      for (int j = 0; j < N; j++) a[i][j] = (i == j ? v : 0);
  }
  inline int *operator[](const int &x) { return a[x]; }
};
inline matrix operator*(matrix &a, matrix &b) {
  int N = a.N;
  matrix ret(0, N);
  for (int i = 0; i < N; i++)
    for (int k = 0; k < N; k++)
      for (int j = 0; j < N; j++)
        ret[i][j] = (1LL * a[i][k] * b[k][j] + ret[i][j]) % mod;
  return ret;
}
inline matrix operator^(matrix &a, int tm) {
  int N = a.N;
  matrix ret(1, N);
  while (tm) {
    if (tm % 2) ret = ret * a;
    tm >>= 1;
    if (tm) a = a * a;
  }
  return ret;
}
int a[maxn], lst = -1;
pair<int, int> B[10];
int extra;
int has[256][10];
int cur = 0;
int32_t main() {
  matrix ans;
  for (int i = 0; i < 7; i++) {
    a[i] = in();
    if (a[i]) B[cur++] = {a[i], i + 1};
  }
  int pre = -1;
  for (int i = 0; i < 256; i++)
    for (int j = 0; j < 10; j++) has[i][j] = i >> j & 1;
  ans[0][(1 << B[0].second) - 1] = 1;
  for (int i = 0; i < cur; i++) {
    pair<int, int> Rect = B[i];
    matrix BLOCK(0, (1 << Rect.second));
    extra = 0;
    if (pre + 1) {
      for (int j = pre; j < Rect.second; j++) extra ^= (1 << j);
      for (int i = 0; i < 128; i++) {
        if (!(i & extra)) {
          ans[0][i | extra] += ans[0][i];
          ans[0][i] = 0;
        }
      }
    }
    for (int Left = 0; Left < (1 << Rect.second); Left++) {
      for (int Right = 0; Right < (1 << Rect.second); Right++) {
        for (int Middle = 0; Middle < (1 << (Rect.second - 1)); Middle++) {
          bool ok = true;
          for (int Cnt = 0; Cnt < Rect.second && ok; Cnt++) {
            ok &= !has[Left][Cnt] || !has[Right][Cnt] ||
                  !(Cnt == 0 || has[Middle][Cnt - 1]) ||
                  !(has[Middle][Cnt] || Cnt + 1 == Rect.second);
          }
          if (ok) {
            BLOCK[Left][Right]++;
          }
        }
      }
    }
    BLOCK = BLOCK ^ Rect.first;
    ans = ans * BLOCK;
    pre = Rect.second;
  }
  cout << ans.a[0][(1 << B[cur - 1].second) - 1] << "\n";
}
