This time our child has a simple polygon. He has to find the number of ways to split the polygon into non-degenerate triangles, each way must satisfy the following requirements:

  * each vertex of each triangle is one of the polygon vertex; 
  * each side of the polygon must be the side of exactly one triangle; 
  * the area of intersection of every two triangles equals to zero, and the sum of all areas of triangles equals to the area of the polygon; 
  * each triangle must be completely inside the polygon; 
  * each side of each triangle must contain exactly two vertices of the polygon. 



The picture below depicts an example of a correct splitting.

<image>

Please, help the child. Calculate the described number of ways modulo 1000000007 (109 + 7) for him.

Input

The first line contains one integer n (3 ≤ n ≤ 200) — the number of vertices of the polygon. Then follow n lines, each line containing two integers. The i-th line contains xi, yi (|xi|, |yi| ≤ 107) — the i-th vertex of the polygon in clockwise or counterclockwise order.

It's guaranteed that the polygon is simple.

Output

Output the number of ways modulo 1000000007 (109 + 7).

Examples

Input

4
0 0
0 1
1 1
1 0


Output

2


Input

4
0 0
1 0
0 1
-1 0


Output

1


Input

5
0 0
1 0
1 1
0 1
-2 -1


Output

3

Note

In the first sample, there are two possible splittings:

<image>

In the second sample, there are only one possible splitting:

<image>
#include <bits/stdc++.h>
using namespace std;
const int MOD = (int)1e9 + 7;
const int INF = (int)1e9;
const long long LINF = (long long)1e18;
const long double PI = 2 * acos((long double)0);
long long gcd(long long a, long long b) {
  long long r;
  while (b) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
long long fpow(long long n, long long k, int p = MOD) {
  long long r = 1;
  for (; k; k >>= 1) {
    if (k & 1) r = r * n % p;
    n = n * n % p;
  }
  return r;
}
template <class T>
void setmin(T& a, T val) {
  if (a > val) a = val;
}
template <class T>
void setmax(T& a, T val) {
  if (a < val) a = val;
}
void addmod(int& a, int val, int p = MOD) {
  if ((a = (a + val)) >= p) a -= p;
}
void submod(int& a, int val, int p = MOD) {
  if ((a = (a - val)) < 0) a += p;
}
int mult(int a, int b, int p = MOD) { return (long long)a * b % p; }
int inv(int a, int p = MOD) { return fpow(a, p - 2, p); }
struct PT {
  long double x, y;
  PT() {}
  PT(long double x, long double y) : x(x), y(y) {}
  PT(const PT& p) : x(p.x), y(p.y) {}
  bool operator<(const PT& rhs) const {
    return make_pair(y, x) < make_pair(rhs.y, rhs.x);
  }
  bool operator==(const PT& rhs) const {
    return make_pair(y, x) == make_pair(rhs.y, rhs.x);
  }
  PT operator+(const PT& p) const { return PT(x + p.x, y + p.y); }
  PT operator-(const PT& p) const { return PT(x - p.x, y - p.y); }
  PT operator*(long double c) const { return PT(x * c, y * c); }
  PT operator/(long double c) const { return PT(x / c, y / c); }
};
long double cross(PT p, PT q) { return p.x * q.y - p.y * q.x; }
long double area(PT a, PT b, PT c) {
  return fabs(cross(a, b) + cross(b, c) + cross(c, a)) / 2;
}
long double area2(PT a, PT b, PT c) {
  return cross(a, b) + cross(b, c) + cross(c, a);
}
long double dot(PT p, PT q) { return p.x * q.x + p.y * q.y; }
long double dist(PT p, PT q) { return sqrt(dot(p - q, p - q)); }
long double dist2(PT p, PT q) { return dot(p - q, p - q); }
PT RotateCCW90(PT p) { return PT(-p.y, p.x); }
PT RotateCW90(PT p) { return PT(p.y, -p.x); }
PT RotateCCW(PT p, long double t) {
  return PT(p.x * cos(t) - p.y * sin(t), p.x * sin(t) + p.y * cos(t));
}
PT ProjectPointLine(PT a, PT b, PT c) {
  return a + (b - a) * dot(c - a, b - a) / dot(b - a, b - a);
}
PT ProjectPointSegment(PT a, PT b, PT c) {
  long double r = dot(b - a, b - a);
  if (fabs(r) < 1e-9) return a;
  r = dot(c - a, b - a) / r;
  if (r < 0) return a;
  if (r > 1) return b;
  return a + (b - a) * r;
}
long double DistancePointSegment(PT a, PT b, PT c) {
  return dist(c, ProjectPointSegment(a, b, c));
}
long double DistancePointPlane(long double x, long double y, long double z,
                               long double a, long double b, long double c,
                               long double d) {
  return fabs(a * x + b * y + c * z - d) / sqrt(a * a + b * b + c * c);
}
int LinesParallel(PT a, PT b, PT c, PT d) {
  return fabs(cross(b - a, c - d)) < 1e-9;
}
int LinesCollinear(PT a, PT b, PT c, PT d) {
  return LinesParallel(a, b, c, d) && fabs(cross(a - b, a - c)) < 1e-9 &&
         fabs(cross(c - d, c - a)) < 1e-9;
}
int SegmentsIntersect(PT a, PT b, PT c, PT d) {
  if (LinesCollinear(a, b, c, d)) {
    if (dist2(a, c) < 1e-9 || dist2(a, d) < 1e-9 || dist2(b, c) < 1e-9 ||
        dist2(b, d) < 1e-9)
      return 1;
    if (dot(c - a, c - b) > 0 && dot(d - a, d - b) > 0 && dot(c - b, d - b) > 0)
      return 0;
    return 1;
  }
  if (cross(d - a, b - a) * cross(c - a, b - a) > 0) return 0;
  if (cross(a - c, d - c) * cross(b - c, d - c) > 0) return 0;
  return 1;
}
int PointInPolygon(const vector<PT>& p, PT q) {
  int c = 0;
  for (int i = 0; i < p.size(); i++) {
    int j = (i + 1) % p.size();
    if ((p[i].y <= q.y && q.y < p[j].y || p[j].y <= q.y && q.y < p[i].y) &&
        q.x < p[i].x + (p[j].x - p[i].x) * (q.y - p[i].y) / (p[j].y - p[i].y))
      c = !c;
  }
  return c;
}
int PointOnPolygon(const vector<PT>& p, PT q) {
  for (int i = 0; i < p.size(); i++)
    if (dist2(ProjectPointSegment(p[i], p[(i + 1) % p.size()], q), q) < 1e-9)
      return 1;
  return 0;
}
const int maxn = 210;
int n;
PT pt[maxn];
int f[maxn][maxn];
int g[maxn][maxn];
int calc(int u, int v) {
  if (u + 2 == v) {
    return abs(area2(pt[u], pt[u + 1], pt[v])) > 1e-9;
  }
  int& res = f[u][v];
  if (~res) return res;
  res = 0;
  for (int i = (u + 1); i < (v); i++) {
    if (!g[u][i] && !g[v][i] && abs(area2(pt[u], pt[i], pt[v])) > 1e-9) {
      int r1 = 1, r2 = 1;
      if (i != u + 1) r1 = calc(u, i);
      if (i != v - 1) r2 = calc(i, v);
      addmod(res, (long long)r1 * r2 % MOD);
    }
  }
  return res;
}
void solve() {
  cin >> n;
  vector<PT> vp;
  for (int i = (0); i < (n); i++) {
    cin >> pt[i].x >> pt[i].y;
    vp.push_back(pt[i]);
  }
  for (int i = (0); i < (n); i++)
    for (int j = (i + 1); j < (n); j++) {
      for (int k = (0); k < (n); k++) {
        int l = (k + 1) % n;
        if (i != k && i != l && j != k && j != l) {
          if (SegmentsIntersect(pt[i], pt[j], pt[k], pt[l])) {
            g[i][j] = g[j][i] = 1;
            break;
          }
        }
      }
      if (!PointOnPolygon(vp, (pt[i] + pt[j]) / 2) &&
          !PointInPolygon(vp, (pt[i] + pt[j]) / 2)) {
        g[i][j] = g[j][i] = 1;
      }
    }
  memset(f, -1, sizeof(f));
  cout << calc(0, n - 1);
}
int main() {
  solve();
  return 0;
}
