#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); }
template <class T, class S>
struct bvec2 {
  T first, second;
  S operator+(S r) const { return {first + r.first, second + r.second}; }
  S operator-(S r) const { return {first - r.first, second - r.second}; }
  S operator*(T r) const { return {first * r, second * r}; }
  S operator/(T r) const { return {first / r, second / r}; }
  T dot(S r) const { return first * r.first + second * r.second; }
  T cross(S r) const { return first * r.second - second * r.first; }
  T len2() const { return first * first + second * second; }
  double len() const { return sqrt(len2()); }
  S perp() const { return {-second, first}; }
  double angle() const {
    double a = atan2(second, first);
    return (a < 0 ? a + 2 * M_PI : a);
  }
};
struct vec2i : bvec2<ll, vec2i> {
  vec2i() : bvec2{0, 0} {}
  vec2i(ll a, ll b) : bvec2{a, b} {}
  bool operator==(vec2i r) const {
    return first == r.first && second == r.second;
  }
  bool operator<(vec2i r) const {
    if (upper() != r.upper()) return upper();
    auto t = cross(r);
    return t > 0 || (!t && len2() < r.len2());
  }
  bool upper() const { return second > 0 || (second == 0 && first >= 0); }
};
using vec2 = vec2i;
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] - points[i];
      if (p.upper())
        segs.push_back({p, {i, j}});
      else
        segs.push_back({vec2(0, 0) - p, {j, i}});
    }
  sort((segs).begin(), (segs).end());
  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;
}
