#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool getmin(T *a, const T &b) {
  if (b < *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool getmax(T *a, const T &b) {
  if (b > *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline void read(T *a) {
  char c;
  while (isspace(c = getchar())) {
  }
  bool flag = 0;
  if (c == '-')
    flag = 1, *a = 0;
  else
    *a = c - 48;
  while (isdigit(c = getchar())) *a = *a * 10 + c - 48;
  if (flag) *a = -*a;
}
const int mo = 1000000007;
template <class T>
T pow(T a, T b, int c = mo) {
  T res = 1;
  for (T i = 1; i <= b; i <<= 1, a = 1LL * a * a % c)
    if (b & i) res = 1LL * res * a % c;
  return res;
}
const int N = 1 << 7;
int e[10];
struct Matrix {
  int a[N][N];
  Matrix() { memset(a, 0, sizeof a); }
  Matrix(int x) {
    memset(a, 0, sizeof a);
    for (int i = (0); i <= (e[7] - 1); ++i) a[i][i] = x;
  }
};
int T;
Matrix operator*(const Matrix &A, const Matrix &B) {
  Matrix C;
  for (int i = (0); i <= (e[T] - 1); ++i)
    for (int j = (0); j <= (e[T] - 1); ++j) {
      long long tmp = 0;
      for (int k = (0); k <= (e[T] - 1); ++k) {
        tmp += 1LL * A.a[i][k] * B.a[k][j];
        if (tmp >= 1e18) tmp %= mo;
      }
      C.a[i][j] = tmp % mo;
    }
  return C;
}
Matrix pow(Matrix A, int b) {
  Matrix res(1);
  for (int i = 1; i <= (b); i <<= 1, A = A * A)
    if (b & i) res = res * A;
  return res;
}
int w[10];
bool check(int a, int b, int c, int x) {
  if (x == 1 && a && c)
    return false;
  else if (x == 1)
    return true;
  if ((b & 1) && (a & 1) && (c & 1)) return false;
  if ((a & e[x - 1]) && (b & e[x - 2]) && (c & e[x - 1])) return false;
  for (int i = (1); i <= (x - 2); ++i)
    if (a & e[i])
      if (b & e[i - 1])
        if (b & e[i])
          if (c & e[i]) return false;
  return true;
}
Matrix trans(int n) {
  Matrix A;
  for (int i = (0); i <= (e[n] - 1); ++i)
    for (int j = (0); j <= (e[n] - 1); ++j)
      for (int k = (0); k <= (e[n - 1] - 1); ++k) {
        if (check(i, k, j, n)) A.a[i][j]++;
      }
  return A;
}
int f[N], g[N];
int main() {
  for (int i = (0); i <= (7); ++i) e[i] = 1 << i;
  Matrix A;
  f[0] = 1;
  for (int n = (1); n <= (7); ++n) {
    int x;
    cin >> x;
    for (int i = (0); i <= (e[n - 1] - 1); ++i)
      f[i + e[n - 1]] = f[i], f[i] = 0;
    Matrix A = trans(n);
    T = n;
    A = pow(A, x);
    for (int i = (0); i <= (e[n] - 1); ++i)
      for (int j = (0); j <= (e[n] - 1); ++j)
        g[i] = (g[i] + 1LL * f[j] * A.a[j][i] % mo) % mo;
    for (int i = (0); i <= (e[n] - 1); ++i) f[i] = g[i], g[i] = 0;
  }
  cout << f[e[7] - 1] << endl;
  return 0;
}
