Problem: Ksusha is a vigorous mathematician. She is keen on absolutely incredible mathematical riddles. 

Today Ksusha came across a convex polygon of non-zero area. She is now wondering: if she chooses a pair of distinct points uniformly among all integer points (points with integer coordinates) inside or on the border of the polygon and then draws a square with two opposite vertices lying in the chosen points, what will the expectation of this square's area be?

A pair of distinct points is chosen uniformly among all pairs of distinct points, located inside or on the border of the polygon. Pairs of points p, q (p ≠ q) and q, p are considered the same.

Help Ksusha! Count the required expectation.

Input

The first line contains integer n (3 ≤ n ≤ 105) — the number of vertices of Ksusha's convex polygon. Next n lines contain the coordinates of the polygon vertices in clockwise or counterclockwise order. The i-th line contains integers xi, yi (|xi|, |yi| ≤ 106) — the coordinates of the vertex that goes i-th in that order.

Output

Print a single real number — the required expected area. 

The answer will be considered correct if its absolute and relative error doesn't exceed 10 - 6.

Examples

Input

3
0 0
5 5
5 0


Output

4.6666666667


Input

4
-1 3
4 5
6 2
3 -5


Output

8.1583333333


Input

3
17 136
859 937
16 641


Output

66811.3704155169

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int N = 2000005;
const double eps = 1e-6;
struct _two {
  int a, b;
} a[N];
int n;
int num[N];
double Min[N], Max[N], sum[N], sum1[N];
double ans, s;
void Work(_two x, _two y) {
  if (x.a > y.a) swap(x, y);
  if (x.a == y.a) return;
  double t = (y.b - x.b) / (0. + y.a - x.a), cur = x.b;
  for (int i = x.a; i <= y.a; i++) {
    Min[i] = min(Min[i], cur);
    Max[i] = max(Max[i], cur);
    cur += t;
  }
}
void Calc() {
  a[0] = a[n];
  for (int i = 0; i <= N - 1; i++) Min[i] = N, Max[i] = 0;
  for (int i = 1; i <= n; i++) Work(a[i - 1], a[i]);
  memset(num, 0, sizeof(num));
  s = 0;
  for (int i = 0; i <= N - 1; i++)
    if (Min[i] < Max[i] + eps) {
      int L = (int)(Min[i] - eps) + 1, R = (int)(Max[i] + eps);
      s += num[i] = R - L + 1;
    }
  sum[0] = sum1[0] = 0;
  for (int i = 1; i <= N - 1; i++) sum[i] = sum[i - 1] + num[i];
  for (int i = 1; i <= N - 1; i++) sum1[i] = sum1[i - 1] + sum[i] + sum[i - 1];
  double cur = 0;
  for (int i = 1; i <= N - 1; i++) {
    ans += num[i] * cur;
    cur += sum1[i];
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &a[i].a, &a[i].b);
    a[i].a += N / 2;
    a[i].b += N / 2;
  }
  Calc();
  for (int i = 1; i <= n; i++) swap(a[i].a, a[i].b);
  Calc();
  printf("%.7lf\n", ans / (s * (s - 1)));
  return 0;
}