#include <bits/stdc++.h>
using namespace std;
inline long long madd(long long a, long long b) {
  return ((a + b) % 1000000007 + 1000000007) % 1000000007;
}
inline long long mmul(long long a, long long b) { return (a * b) % 1000000007; }
const int MAXN = 1e5 + 50;
int a[MAXN], n;
void readInput() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  vector<int> v;
  for (int i = 1; i <= n; i++) v.push_back(a[i]);
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 1; i <= n; i++)
    a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
}
int pl[MAXN], pr[MAXN], pos[MAXN];
void findP() {
  for (int i = 1; i <= n; i++) pos[i] = 0;
  for (int i = 1; i <= n; i++) {
    pl[i] = pos[a[i]];
    pos[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) pos[i] = n + 1;
  for (int i = n; i >= 1; i--) {
    pr[i] = pos[a[i]];
    pos[a[i]] = i;
  }
}
struct Node {
  long long s0, sa, sb, sab;
  long long ta, tb;
} st[4 * MAXN];
void pushUp(int id) {
  st[id].s0 = madd(st[((id) << 1)].s0, st[(((id) << 1) + 1)].s0);
  st[id].sa = madd(st[((id) << 1)].sa, st[(((id) << 1) + 1)].sa);
  st[id].sb = madd(st[((id) << 1)].sb, st[(((id) << 1) + 1)].sb);
  st[id].sab = madd(st[((id) << 1)].sab, st[(((id) << 1) + 1)].sab);
}
void buildTree(int l = 1, int r = n, int id = 1) {
  if (l == r) {
    st[id].sa = l - 1;
    st[id].sb = 0;
    st[id].sab = 0;
    st[id].s0 = 1;
  } else {
    int m = (l + r) >> 1;
    buildTree(l, m, ((id) << 1));
    buildTree(m + 1, r, (((id) << 1) + 1));
    pushUp(id);
  }
}
void addLazy(int id, long long ta, long long tb) {
  st[id].ta = madd(st[id].ta, ta);
  st[id].tb = madd(st[id].tb, tb);
}
void pushDown(int l, int r, int id) {
  if (st[id].ta != 0 || st[id].tb != 0) {
    st[id].sab = madd(st[id].sab,
                      mmul(st[id].ta, st[id].sb) + mmul(st[id].sa, st[id].tb) +
                          mmul(st[id].ta, mmul(st[id].tb, st[id].s0)));
    st[id].sa = madd(st[id].sa, mmul(st[id].s0, st[id].ta));
    st[id].sb = madd(st[id].sb, mmul(st[id].s0, st[id].tb));
    if (l < r) {
      addLazy(((id) << 1), st[id].ta, st[id].tb);
      addLazy((((id) << 1) + 1), st[id].ta, st[id].tb);
    }
    st[id].ta = st[id].tb = 0;
  }
}
void rangeUpdate(int x, int y, long long ta, long long tb, int l = 1, int r = n,
                 int id = 1) {
  if (x <= l && r <= y) addLazy(id, ta, tb);
  pushDown(l, r, id);
  if (r < x || y < l) return;
  if (x <= l && r <= y) return;
  int m = (l + r) >> 1;
  rangeUpdate(x, y, ta, tb, l, m, ((id) << 1));
  rangeUpdate(x, y, ta, tb, m + 1, r, (((id) << 1) + 1));
  pushUp(id);
}
long long rangeSum(int x, int y, int l = 1, int r = n, int id = 1) {
  pushDown(l, r, id);
  if (r < x || y < l) return 0;
  if (x <= l && r <= y) return st[id].sab;
  int m = (l + r) >> 1;
  return madd(rangeSum(x, y, l, m, ((id) << 1)),
              rangeSum(x, y, m + 1, r, (((id) << 1) + 1)));
}
void printTree(int l = 1, int r = n, int id = 1) {
  printf("[%d,%d]: %lld %lld %lld\n", l, r, st[id].sa, st[id].sb, st[id].sab);
  if (l == r) return;
  int m = (l + r) >> 1;
  printTree(l, m, ((id) << 1));
  printTree(m + 1, r, (((id) << 1) + 1));
}
struct Segment {
  int l, r, val;
  Segment(int l_, int r_, int val_) : l(l_), r(r_), val(val_) {}
  void print() { printf("[%d,%d]:%d\n", l, r, val); }
};
int main() {
  readInput();
  findP();
  buildTree();
  rangeUpdate(1, n, 0, -1);
  long long ans = 0;
  int lb = 0;
  vector<Segment> vl, vr;
  for (int k = 1; k <= n; k++) {
    lb = max(lb, pl[k]);
    int cl = k;
    while (!vl.empty() && vl.back().val <= pl[k]) {
      Segment &s = vl.back();
      rangeUpdate(s.l, s.r, s.val, 0);
      cl = s.l;
      vl.pop_back();
    }
    vl.push_back({cl, k, pl[k]});
    rangeUpdate(cl, k, -pl[k], 0);
    cl = k;
    while (!vr.empty() && vr.back().val >= pr[k]) {
      Segment &s = vr.back();
      rangeUpdate(s.l, s.r, 0, -s.val);
      cl = s.l;
      vr.pop_back();
    }
    vr.emplace_back(cl, k, pr[k]);
    rangeUpdate(cl, k, 0, pr[k]);
    rangeUpdate(1, n, 0, -1);
    ans = madd(ans, rangeSum(lb + 1, k));
  }
  printf("%lld\n", ans);
}
