#include <algorithm>
#include <stdio.h>
using namespace std;
#define MAX 1505
#define DIM 15
int f[DIM],n1[MAX],n2[MAX],rez1[MAX],rez2[MAX],fin[MAX];
int nrt;
void read ()
{
int i;
for (i=1; i<10; ++i)
{
scanf ("%d",&f[i]);
nrt+=f[i];
}
}
inline int find ()
{
int i;
for (i=9; i>=1; --i)
if (f[i])
{
--f[i];
return i;
}
return 0;
}
inline void memset (int a[MAX],int val)
{
int i;
for (i=0; i<MAX; ++i)
a[i]=val;
}
inline void mult_mare (int c[MAX],int a[MAX],int b[MAX])
{
int i,j,t;
memset (c,0);
for (i=1; i<=a[0]; ++i)
{
for (t=0, j=1; j<=b[0] || t; ++j, t/=10)
c[i+j-1]=(t+=c[i+j-1]+a[i]*b[j])%10;
if (i+j-2>c[0])
c[0]=i+j-2;
}
}
inline void print (int a[MAX])
{
int i;
for (i=a[0]; i>=1; --i)
printf ("%d",a[i]);
}
inline int cmp (int a[MAX],int b[MAX])
{
int i;
if (a[0]<b[0])
return -1;
else if (a[0]>b[0])
return 1;
else
for (i=a[0]; i>=1; --i)
if (a[i]<b[i])
return -1;
else if (a[i]>b[i])
return 1;
return 0;
}
void solve ()
{
int c,c1,c2;
while (nrt>1)
{
c1=find (); c2=find (); nrt-=2;
n1[++n1[0]]=c1;
n2[++n2[0]]=c2;
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
mult_mare (rez1,n1,n2);
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
n1[n1[0]]=c2;
n2[n2[0]]=c1;
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
mult_mare (rez2,n1,n2);
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
if (cmp (rez1,rez2)>0)
{
n1[n1[0]]=c1;
n2[n2[0]]=c2;
}
else
{
n1[n1[0]]=c2;
n2[n2[0]]=c1;
}
}
if (nrt)
{
c=find ();
n1[++n1[0]]=c;
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
mult_mare (rez1,n1,n2);
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
n1[n1[0]--]=0;
n2[++n2[0]]=c;
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
mult_mare (rez2,n1,n2);
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
n2[n2[0]--]=0;
if (cmp (rez1,rez2)>0)
n1[++n1[0]]=c;
else
n2[++n2[0]]=c;
}
reverse (n1+1,n1+n1[0]+1);
reverse (n2+1,n2+n2[0]+1);
mult_mare (fin,n1,n2);
print (fin);
}
int main ()
{
freopen ("prod.in","r",stdin);
freopen ("prod.out","w",stdout);
read ();
solve ();
return 0;
}