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 JAVA):

Solution:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class A {

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);

		int n = sc.nextInt();
		Point[] pts = new Point[n];
		for(int i = 0; i < n; ++i)
			pts[i] = new Point(sc.nextInt(), sc.nextInt());
		double ans = 0;
		for(int i = 0; i < n; ++i)
			for(int j = i + 1; j < n; ++j)
			{
				Point pi = pts[i], pj = pts[j], pk;
				double leftArea = 0, rightArea = 0;
				for(int k = 0; k < n; ++k)
					if(k != i && k != j)
					{
						pk = pts[k];
					
						leftArea = Math.min(leftArea, area(pi, pj, pk));
						
						rightArea = Math.max(rightArea, area(pi, pj, pk));
					}
				if(leftArea < 0 && rightArea > 0)
					ans = Math.max(ans, rightArea - leftArea);
			}
		out.println(ans);
		out.flush();
		out.close();
	}

	static class Point
	{
		int x, y;
		
		Point(int a, int b) { x = a; y = b; }
	}
	
	static double area(Point a, Point b, Point c)
	{
		return (a.x * b.y - a.y * b.x + b.x * c.y - b.y * c.x + c.x * a.y - c.y * a.x) / 2.0; 
	}
	
	static class Scanner 
	{
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

		public String next() throws IOException 
		{
			while (st == null || !st.hasMoreTokens()) 
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public int nextInt() throws IOException {return Integer.parseInt(next());}

		public long nextLong() throws IOException {return Long.parseLong(next());}

		public String nextLine() throws IOException {return br.readLine();}

		public double nextDouble() throws IOException { return Double.parseDouble(next()); }

		public boolean ready() throws IOException {return br.ready();} 
	}
}