You are given a set of n points in a 2D plane. No three points are collinear.

A pentagram is a set of 5 points A,B,C,D,E that can be arranged as follows. <image> Note the length of the line segments don't matter, only that those particular intersections exist.

Count the number of ways to choose 5 points from the given set that form a pentagram.

Input

The first line contains an integer n (5 ≤ n ≤ 300) — the number of points.

Each of the next n lines contains two integers x_i, y_i (-10^6 ≤ x_i,y_i ≤ 10^6) — the coordinates of the i-th point. It is guaranteed that no three points are collinear.

Output

Print a single integer, the number of sets of 5 points that form a pentagram.

Examples

Input


5
0 0
0 2
2 0
2 2
1 3


Output


1


Input


5
0 0
4 0
0 4
4 4
2 3


Output


0


Input


10
841746 527518
595261 331297
-946901 129987
670374 -140388
-684770 309555
-302589 415564
-387435 613331
-624940 -95922
945847 -199224
24636 -565799


Output


85

Note

A picture of the first sample: <image> A picture of the second sample: <image> A picture of the third sample: <image>
#include <bits/stdc++.h>
using namespace std;
const long long LLMAX = 2e18;
const int MOD = 1e9 + 7;
const double eps = 1e-8;
const int MAXN = 1e6 + 10;
const int hmod1 = 0x48E2DCE7;
const int hmod2 = 0x60000005;
inline long long sqr(long long x) { return x * x; }
inline int sqr(int x) { return x * x; }
inline double sqr(double x) { return x * x; }
long long __gcd(long long a, long long b) {
  return b == 0 ? a : __gcd(b, a % b);
}
long long qpow(long long a, long long n) {
  long long sum = 1;
  while (n) {
    if (n & 1) sum = sum * a % MOD;
    a = a * a % MOD;
    n >>= 1;
  }
  return sum;
}
inline int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return (x > 0 ? 1 : -1);
}
long long dp[310][310][6];
struct Point {
  long long x, y, u, v;
  Point() { x = y = u = v = 0; }
  Point(long long a, long long b) { x = a, y = b; }
  Point(Point a, long long c, long long d) { x = a.x, y = a.y, u = c, v = d; }
  Point operator-(const Point &n) const { return Point(x - n.x, y - n.y); }
  double polar() { return atan2(y, x); }
} point[310], vec[100010];
long long cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
bool cmp(Point a, Point b) {
  double x = a.polar(), y = b.polar();
  if (dcmp(x - y) != 0) return x < y;
  return cross(vec[a.v] - vec[a.u], vec[b.v] - vec[a.u]) < 0;
}
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long n, cnt = 0, ans = 0;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> point[i].x >> point[i].y;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j) vec[cnt++] = Point(point[j] - point[i], i, j);
  sort(vec, vec + cnt, cmp);
  for (int i = 0; i < cnt; i++) {
    int u = vec[i].u, v = vec[i].v;
    dp[u][v][1] = 1;
    for (int j = 1; j <= n; j++)
      for (int k = 2; k <= 5; k++) dp[j][v][k] += dp[j][u][k - 1];
  }
  for (int i = 1; i <= n; i++) ans += dp[i][i][5];
  cout << ans << endl;
  return 0;
}
