#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int mod = 1000000007;
int dp[31][31][31][31][31];

int dn[30];
int A1, A2, A3, A4, A5;
int AA[6];

int getDP( int a1, int a2, int a3, int a4, int a5 )
{
    if ( dp[a1][a2][a3][a4][a5] != -1 )
        return dp[a1][a2][a3][a4][a5];
    int aa[6], na[6], la[6];
    aa[1] = a1; aa[2] = a2; aa[3] = a3; aa[4] = a4; aa[5] = a5;
    int i, j, k;
//    int na1, na2, na3, na4, na5;
    long long sol = 0;
    k = 0;

    for ( i = 1; i <= 5; i++ )
    {
        na[i] = (AA[i]>>(aa[i]/2));
    }

    for ( i = 1; i <= 5; i++ )
    {
        if ( ( na[i]%2 == 1 ) && ( aa[i]%2 == 1 ) )
            na[i]--;
        else if ( ( na[i]%2 == 0 ) && ( aa[i]%2 == 1 ) )
        {
            aa[i]--;
            sol = getDP( aa[1], aa[2], aa[3], aa[4], aa[5] );
            dp[a1][a2][a3][a4][a5] = sol;
            return sol;
        }
    }

    k = 0;
    for ( i = 1; i <= 5; i++ )
    {
        if ( na[i] > 0 ) k++;
    }
    if ( k == 0 )
    {
        dp[a1][a2][a3][a4][a5] = 1;
        return 1;
    }

    sol = 0;
    for ( i = 1; i < 5; i++ )
    {
        if ( ( na[i] % 2 == 1 ) && ( na[i+1] %2 == 1 ) )
        {
            aa[i]++; aa[i+1]++;
            sol = sol + getDP( aa[1], aa[2], aa[3], aa[4], aa[5] );
            aa[i]--; aa[i+1]--;
            if ( sol >= mod ) sol = sol % mod;
        }
    }
    if ( ( na[5] % 2 == 1 ) && ( na[1] % 2 == 1 ) )
    {
        sol = sol + getDP( aa[1]+1, aa[2], aa[3], aa[4], aa[5]+1 );
        if ( sol >= mod ) sol = sol % mod;
    }
    for ( i = 1; i < 5; i++ )
    {
        if ( ( na[i] > 0 ) && ( na[i+1] > 0 ) )
        {
            la[i] = aa[i]; la[i+1] = aa[i+1];
            if ( aa[i]%2 == 1 ) aa[i]++;
            else aa[i] = aa[i] + 2;
            if ( aa[i+1]%2 == 1 ) aa[i+1]++;
            else aa[i+1] = aa[i+1] + 2;
            sol = sol + getDP( aa[1], aa[2], aa[3], aa[4], aa[5] );
            aa[i] = la[i];
            aa[i+1] = la[i+1];
            if ( sol >= mod ) sol = sol % mod;
        }
    }
        if ( ( na[5] > 0 ) && ( na[1] > 0 ) )
        {
            la[5] = aa[5]; la[1] = aa[1];
            if ( aa[5]%2 == 1 ) aa[5]++;
            else aa[5] = aa[5] + 2;
            if ( aa[1]%2 == 1 ) aa[1]++;
            else aa[1] = aa[1] + 2;
            sol = sol + getDP( aa[1], aa[2], aa[3], aa[4], aa[5] );
            if ( sol >= mod ) sol = sol % mod;
            aa[5] = la[5];
            aa[1] = la[1];
        }
    dp[a1][a2][a3][a4][a5] = sol;
    //cout << "GETDP " << a1 << " " << a2 << " " << a3 << " " << a4 << " " << a5 << " " << sol << endl;
    return sol;
}

int main()
{
    int i, j, k;
    dn[0] = 1;
    for ( i = 1; i < 30; i++ )
    {
        dn[i] = dn[i-1]*2;
    }
    scanf( "%d %d %d %d %d", &A1, &A2, &A3, &A4, &A5 );
    memset( dp, -1, sizeof( dp ) );
    AA[1] = A1;
    AA[2] = A2;
    AA[3] = A3;
    AA[4] = A4;
    AA[5] = A5;
    printf( "%d\n", getDP( 0, 0, 0, 0, 0 ) );
    return 0;
}
