#include <bits/stdc++.h>
using namespace std;
using namespace rel_ops;
using ll = int64_t;
using Pii = pair<int, int>;
using ull = uint64_t;
using Vi = vector<int>;
void run();
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(10);
  run();
  return 0;
}
int uplg(int n) { return 32 - __builtin_clz(n); }
int uplg(ll n) { return 64 - __builtin_clzll(n); }
using vec2 = pair<ll, ll>;
ll cross(vec2 a, vec2 b) { return a.first * b.second - a.second * b.first; }
void run() {
  int n;
  cin >> n;
  vector<vec2> points(n);
  for (auto& p : (points)) cin >> p.first >> p.second;
  sort((points).begin(), (points).end(), [](vec2 l, vec2 r) {
    return make_pair(l.second, l.first) < make_pair(r.second, r.first);
  });
  vector<pair<vec2, Pii>> segs;
  for (int i = (0); i < (n); i++)
    for (int j = (i + 1); j < (n); j++) {
      vec2 p = points[j], q = points[i];
      p.first -= q.first;
      p.second -= q.second;
      if (p.second < 0 || (p.second == 0 && p.first < 0)) {
        p.first = -p.first;
        p.second = -p.second;
        segs.push_back({p, {j, i}});
      } else {
        segs.push_back({p, {i, j}});
      }
    }
  sort((segs).begin(), (segs).end(), [](pair<vec2, Pii> l, pair<vec2, Pii> r) {
    return cross(l.first, r.first) > 0;
  });
  Vi pos(n);
  iota((pos).begin(), (pos).end(), 0);
  ll ans = 0;
  for (auto& seg : (segs)) {
    assert(pos[seg.second.first] + 1 == pos[seg.second.second]);
    ll k = pos[seg.second.first];
    ans += k * (k - 1) / 2 * (n - k - 2) * (n - k - 3) / 2;
    swap(pos[seg.second.first], pos[seg.second.second]);
    swap(points[seg.second.first], points[seg.second.second]);
  }
  cout << ans << endl;
}
