#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int mod=1e9+7;
int n;
LL a[N];
LL f1[N],f0[N],g1[N],g0[N],cur[N];
LL solve(int l,int r){
if(l==r){
return a[l];
}
if(r-l==1){
return a[l]+a[r]+max(a[l],a[r]);
}
if (r-l==2){
return a[l]+a[l+1]+a[r]+max(a[l],a[l+1])+max(a[l+1],a[r])+max(a[l+1],a[l]+a[r]);
}
int mid=(l+r)>>1;
LL ans=(solve(l,mid)+solve(mid+1,r))%mod;
for(int i=l;i<=r;i++)f1[i]=f0[i]=0;
for(int i=l;i<=r;i++)g1[i]=g0[i]=0;
f1[mid]=a[mid];
for(int i=mid-1;i>=l;i--){
f1[i]=max(f1[i+1],f1[i+2]+a[i]);
}
for(int i=mid-1;i>=l;i--){
f0[i]=max(f0[i+1],f0[i+2]+a[i]);
}
g1[mid+1]=a[mid+1];
for(int i=mid+2;i<=r;i++){
g1[i]=max(g1[i-1],g1[i-2]+a[i]);
}
for(int i=mid+2;i<=r;i++){
g0[i]=max(g0[i-1],g0[i-2]+a[i]);
}
for(int i=mid+1;i<=r;i++){
cur[i]=g1[i]-g0[i];
}
sort(cur+mid+1,cur+r+1);
for(int i=l;i<=mid;i++){
LL p=f1[i]-f0[i];
LL op=lower_bound(cur+mid+1,cur+r+1,p)-(cur+mid+1);
ans+=f1[i]*(op);
ans+=f0[i]*((r-mid-op));
}
for(int i=l;i<=mid;i++){
cur[i]=f1[i]-f0[i];
}
sort(cur+l,cur+mid+1);
for(int i=mid+1;i<=r;i++){
LL p=g1[i]-g0[i];
LL op=lower_bound(cur+l,cur+mid+1,p)-(cur+l);
ans+=g1[i]*(op);
ans+=g0[i]*(mid-l-op+1);
}
ans%=mod;
return ans;
}
int main () {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
printf("%d\n",solve(1,n));
return 0;
}