#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int inf = 1e9;
using ii = pair<int, int>;
using ll = long long;
using db = long double;
const int N = 1e5 + 5, M = 1 << 7, K = 55, MOD = 1e9 + 7, MOD2 = 998244353;
const ll MX = 1e15;
const int blkSz = 200;
const db EPS = 1e-7;
const int PI = 3;
int dp[8][8][M][M][2];
int limit;
int solve(int h, int row, int mask1, int mask2, bool up) {
  int col = row - 1;
  if (row == h) {
    if (up && (mask1 >> col & 1) && (mask2 >> col & 1)) {
      return 0;
    }
    return 1;
  }
  int &ret = dp[h][row][mask1][mask2][up];
  if (~ret) return ret;
  ret = solve(h, row + 1, mask1, mask2, 0);
  if (!(up && (mask1 >> col & 1) && (mask2 >> col & 1))) {
    ret += solve(h, row + 1, mask1, mask2, 1);
    if (ret >= MOD) ret -= MOD;
  }
  return ret;
}
int w[8], n = 7;
vector<int> v;
array<array<int, M>, M> ret;
array<array<int, M>, M> curMat, tmpMat, go[8];
array<array<int, M>, M> Mul(array<array<int, M>, M> a,
                            array<array<int, M>, M> b) {
  for (int i = 0; i < limit; i++)
    for (int j = 0; j < limit; j++) {
      ret[i][j] = 0;
      for (int k = 0; k < limit; k++) {
        ret[i][j] += 1ll * a[i][k] * b[k][j] % MOD;
        if (ret[i][j] >= MOD) ret[i][j] -= MOD;
      }
    }
  return ret;
}
array<array<int, M>, M> I() {
  array<array<int, M>, M> ret;
  for (int i = 0; i < M; i++)
    for (int j = 0; j < M; j++) ret[i][j] = i == j;
  return ret;
}
array<array<int, M>, M> fast(array<array<int, M>, M> b, int e) {
  if (!e) {
    return I();
  }
  if (e & 1) return Mul(b, fast(b, e - 1));
  return fast(Mul(b, b), e >> 1);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  for (int i = 1; i <= n; i++) {
    cin >> w[i];
  }
  memset(dp, -1, sizeof dp);
  for (int i = 1; i <= n; i++) {
    for (int m1 = 0; m1 < 1 << i; m1++) {
      for (int m2 = 0; m2 < 1 << i; m2++) {
        go[i][m1][m2] = solve(i, 1, m1, m2, 1);
      }
    }
  }
  curMat[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < (1 << (i - 1)); j++) {
      for (int k = 0; k < (1 << (i - 1)); k++) {
        tmpMat[k | (1 << (i - 1))][k | (1 << (i - 1))] += curMat[j][k];
        if (tmpMat[k | (1 << (i - 1))][k | (1 << (i - 1))] >= MOD)
          tmpMat[k | (1 << (i - 1))][k | (1 << (i - 1))] -= MOD;
      }
    }
    for (int j = 0; j < 1 << i; j++)
      for (int k = 0; k < 1 << i; k++) {
        curMat[j][k] = tmpMat[j][k];
        tmpMat[j][k] = 0;
      }
    limit = 1 << i;
    auto x = fast(go[i], w[i]);
    curMat = Mul(curMat, x);
  }
  int ans = 0;
  for (int i = 0; i < M; i++) {
    ans += curMat[i][(1 << 7) - 1];
    if (ans >= MOD) ans -= MOD;
  }
  cout << ans << '\n';
  return 0;
}
