Problem: Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral. 

Input

The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide. 

Output

Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

Examples

Input

5
0 0
0 4
4 0
4 4
2 3


Output

16.000000

Note

In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
inline int Int() {
  int x;
  scanf("%d", &x);
  return x;
}
inline long long Long() {
  long long x;
  scanf("%lld", &x);
  return x;
}
void err(istream_iterator<string> it) { cout << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << ' ';
  err(++it, args...);
}
const int N = (int)2e5 + 5;
const int maxN = (int)1e6 + 6;
const long long Mod = (long long)1e9 + 7;
const int inf = (int)2e9;
const long long Inf = (long long)1e18;
const int mod = (int)1e9 + 7;
inline int add(int a, int b, int mod) {
  a += b;
  return a >= mod ? a - mod : a;
}
inline int sub(int a, int b, int mod) {
  a -= b;
  return a < 0 ? a + mod : a;
}
inline int mul(int a, int b, int mod) { return (long long)a * b % mod; }
struct point {
  int x, y;
  point() : x(0), y(0) {}
  point(int _x, int _y) : x(_x), y(_y) {}
};
struct vec {
  int x, y;
  vec() : x(0), y(0) {}
  vec(int _x, int _y) : x(_x), y(_y) {}
};
vec toVector(point a, point b) { return vec(b.x - a.x, b.y - a.y); }
int cross(vec a, vec b) { return a.x * b.y - a.y * b.x; }
bool ccw(point a, point b, point c) {
  vec ab = toVector(a, b), ac = toVector(a, c);
  return cross(ac, ab) > 0;
}
double Area(point a, point b, point c) {
  return fabs(0.5 *
              (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y)));
}
int main() {
  int test = 1, tc = 0;
  while (test--) {
    int n = Int();
    vector<point> p(n + 1);
    for (int i = 1; i <= n; ++i) {
      p[i] = point(Int(), Int());
    }
    double res = -inf;
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) {
        if (i == j) continue;
        double LA = -inf, RA = -inf, area;
        for (int k = 1; k <= n; ++k) {
          if (i == k or j == k) continue;
          bool f = ccw(p[i], p[j], p[k]);
          area = Area(p[i], p[j], p[k]);
          if (f) {
            if (area > LA) LA = area;
          } else {
            if (area > RA) RA = area;
          }
          if (res < LA + RA) res = LA + RA;
        }
      }
    }
    printf("%.10f\n", res);
  }
  return 0;
}