#include <bits/stdc++.h>
static inline unsigned long long rdtsc() {
  unsigned long long d;
  __asm__ __volatile__("rdtsc" : "=A"(d));
  return d;
}
using namespace std;
const int inf = (int)1e9;
const double eps = 1e-9;
const int maxn = 150;
const int mod = (int)1e9 + 7;
const long long MX = (((long long)7e18) / mod) * mod;
int N = 128;
int A[maxn][maxn];
int R[maxn][maxn];
int tmp[maxn][maxn];
inline void multRA() {
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) tmp[i][j] = 0;
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) {
      long long C = 0;
      for (int k = 0; (k) < (N); ++k) {
        C += R[i][k] * (long long)A[k][j];
        if (C >= MX) C -= MX;
      }
      tmp[i][j] = C % mod;
    }
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) R[i][j] = tmp[i][j];
}
inline void multRR() {
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) tmp[i][j] = 0;
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) {
      long long C = 0;
      for (int k = 0; (k) < (N); ++k) {
        C += R[i][k] * (long long)R[k][j];
        if (C >= MX) C -= MX;
      }
      tmp[i][j] = C % mod;
    }
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) R[i][j] = tmp[i][j];
}
void toN(int n) {
  vector<int> v;
  while (n > 0) {
    if (n & 1) {
      v.push_back(1);
      n -= 1;
    } else {
      v.push_back(2);
      n >>= 1;
    }
  }
  reverse((v).begin(), v.end());
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) R[i][j] = 0;
  for (int i = 0; (i) < (N); ++i) R[i][i] = 1;
  for (int i = 0; (i) < (((int)(v).size())); ++i) {
    if (v[i] == 1)
      multRA();
    else
      multRR();
  }
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) A[i][j] = R[i][j];
}
int V[maxn];
int tmpV[maxn];
inline void multAV() {
  for (int i = 0; (i) < (N); ++i) tmpV[i] = 0;
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j)
      tmpV[i] = (tmpV[i] + A[i][j] * (long long)V[j]) % mod;
  for (int i = 0; (i) < (N); ++i) V[i] = tmpV[i];
}
void build(int n) {
  for (int i = 0; (i) < (N); ++i)
    for (int j = 0; (j) < (N); ++j) A[i][j] = 0;
  for (int i = 0; (i) < (1 << n); ++i)
    for (int j = 0; (j) < (1 << n); ++j)
      for (int k = 0; (k) < (1 << (n - 1)); ++k) {
        bool ok = true;
        for (int x = 0; (x) < (n); ++x) {
          int T = 0;
          if (x == 0)
            T += 1;
          else if ((k >> (x - 1)) & 1)
            T += 1;
          if (x == n - 1)
            T += 1;
          else if ((k >> x) & 1)
            T += 1;
          if ((i >> x) & 1) T += 1;
          if ((j >> x) & 1) T += 1;
          if (T == 4) {
            ok = false;
            break;
          }
        }
        if (ok) {
          int ii = (1 << 7) - (1 << n) + i;
          int jj = (1 << 7) - (1 << n) + j;
          A[ii][jj] += 1;
        }
      }
}
const int n = 7;
int a[n + 1];
int main() {
  for (int i = 0; (i) < (n); ++i) scanf("%d", &a[i + 1]);
  V[127] = 1;
  for (int i = 1; i <= 7; ++i) {
    build(i);
    toN(a[i]);
    multAV();
  }
  int res = V[127];
  printf("%d\n", res);
  return 0;
}
