#include <bits/stdc++.h>
using namespace std;
const int NMax = (1 << 7);
const int MOD = 1000000007;
int A[NMax + 5][NMax + 5], X[NMax + 5][NMax + 5];
void precalcX(int height) {
  for (int i = 0; i < (1 << height); i++)
    for (int j = 0; j < (1 << height); j++) {
      X[i][j] = 0;
      for (int mask = 0; mask < (1 << height); mask++)
        if ((i | j | mask | (mask << 1)) == ((1 << (height)) - 1)) X[i][j]++;
    }
}
void Copy(int A[][NMax + 5], int B[][NMax + 5], int m) {
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) A[i][j] = B[i][j];
}
void multiplicate(int A[][NMax + 5], int B[][NMax + 5], int ans[][NMax + 5],
                  int m) {
  int C[NMax + 5][NMax + 5];
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) {
      C[i][j] = 0;
      for (int k = 0; k < m; k++) {
        C[i][j] += (1LL * A[i][k] * B[k][j]) % MOD;
        if (C[i][j] >= MOD) C[i][j] -= MOD;
      }
    }
  Copy(ans, C, m);
}
void initA() {
  for (int i = 0; i < NMax; i++) A[i][i] = 1;
}
void Solve() {
  int w;
  initA();
  for (int i = 1; i <= 7; i++) {
    precalcX(i);
    cin >> w;
    while (w) {
      if (w % 2 == 1) multiplicate(A, X, A, (1 << i));
      multiplicate(X, X, X, (1 << i));
      w /= 2;
    }
  }
  cout << A[0][0] << "\n";
}
int main() {
  Solve();
  return 0;
}
