#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:36777216")
using namespace std;
long long pow_mod(long long x, long long y, long long z) {
  long long res = 1;
  while (y) {
    if (y & 1) res *= x, res %= z;
    x *= x, x %= z, y >>= 1;
  }
  return res % z;
}
void ext_gcd(long long a, long long b, long long &d, long long &x,
             long long &y) {
  if (!b) {
    d = a, x = 1, y = 0;
  } else {
    ext_gcd(b, a % b, d, y, x), y -= x * (a / b);
  }
}
long long inv(long long a, long long c) {
  long long d, x, y;
  ext_gcd(a, c, d, x, y);
  return (x + c) % c;
}
long long fac[111111];
long long C(int x, int y) {
  if (x < y) return 0;
  return fac[x] * inv(fac[y], 1000000007) % 1000000007 *
         inv(fac[x - y], 1000000007) % 1000000007;
}
int n, v;
vector<pair<int, int> > vec;
long long gao(int l, int r, int pre) {
  if (l < 1) return 0;
  if (r > n) return 0;
  long long res;
  if (pre == 1)
    res = 1;
  else
    res = pow_mod(2, pre - 2, 1000000007);
  for (int i = 1; i < vec.size(); i++) {
    if (vec[i].second > r) {
      res *= C(vec[i].first - pre - 1, vec[i].second - r - 1);
      res %= 1000000007;
      if (res == 0) return 0;
      l = l - (vec[i].first - pre - 1 - (vec[i].second - r - 1));
      r = vec[i].second;
    } else if (vec[i].second < l) {
      res *= C(vec[i].first - pre - 1, l - vec[i].second - 1);
      res %= 1000000007;
      if (res == 0) return 0;
      r = r + (vec[i].first - pre - 1 - (l - vec[i].second - 1));
      l = vec[i].second;
    } else
      return 0;
    if (i == vec.size() - 1) return res;
    if (r > n || l < 1) return 0;
    pre = vec[i].first;
  }
  return res;
}
int main() {
  fac[0] = 1;
  for (int i = 1; i <= 100000; i++) fac[i] = fac[i - 1] * i % 1000000007;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &v);
    if (v) vec.push_back(make_pair(v, i));
  }
  if (vec.size() == 0) {
    printf("%I64d\n", pow_mod(2, n - 1, 1000000007));
    return 0;
  }
  vec.push_back(make_pair(n + 1, n + 1));
  sort(vec.begin(), vec.end());
  long long ans;
  if (vec[0].first == 1)
    ans = gao(vec[0].second, vec[0].second, 1);
  else
    ans = gao(vec[0].second - vec[0].first + 1, vec[0].second, vec[0].first) +
          gao(vec[0].second, vec[0].second + vec[0].first - 1, vec[0].first) %
              1000000007;
  printf("%I64d\n", ans);
}
