import java.util.*; public class Solution { private static final int MODS = 1000000007; static int solve(int[] A) { // Return the sum of S(S(A)) modulo 10^9+7. int[] newA = getSOfA(A, A.length); A = null; return (int) getSOfASum(newA, newA.length); } private static int[] getSOfA(int[] A, int n) { int newSize = (n * (n + 1)) / 2; int[] newA = new int[newSize]; System.arraycopy(A, 0, newA, 0, n); A = null; for (int k = 0; k < n ; k++) { for (int i = 0; i < n - k; i++) { int j = i + k; if (i == j) { continue; } int newAPos = transform(i, j, n, newSize); int prevPos = transform(i, j - 1, n, newSize); newA[newAPos] = Math.max(newA[prevPos], newA[j]); } } return newA; } private static long getSOfASum(int[] A, int n) { long answer = 0; int newSize = (n * (n + 1)) / 2; int[] newA = new int[newSize]; System.arraycopy(A, 0, newA, 0, n); A = null; for (int k = 0; k < n ; k++) { for (int i = 0; i < n - k; i++) { int j = i + k; if (i == j) { answer = (answer + newA[j]) % MODS; continue; } int newAPos = transform(i, j, n, newSize); int prevPos = transform(i, j - 1, n, newSize); newA[newAPos] = Math.max(newA[prevPos], newA[j]); answer = (answer + newA[newAPos]) % MODS; } } return answer; } private static int transform(int i, int j, int n, int newSize) { int delta = n - j + i; int newDelta = (delta * (delta + 1)) / 2; return newSize - newDelta + i; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] a = new int[n]; for (int a_i = 0; a_i < n; a_i++) { a[a_i] = in.nextInt(); } int result = solve(a); System.out.println(result); in.close(); } }