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;
int Read() {
  char c;
  while (c = getchar(), (c != '-') && (c < '0' || c > '9'))
    ;
  bool neg = (c == '-');
  int ret = (neg ? 0 : c - 48);
  while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + c - 48;
  return neg ? -ret : ret;
}
const int MAXN = 100005, MAXM = 2000005;
pair<int, int> a[MAXN];
int N, l[MAXM], r[MAXM];
long double cnt;
void init() {
  scanf("%d", &N);
  int mx = MAXM, my = MAXM;
  for (int i = 1; i <= N; i++)
    a[i].first = Read(), a[i].second = Read(), mx = min(mx, a[i].first),
    my = min(my, a[i].second);
  for (int i = 1; i <= N; i++) a[i].first -= (mx - 1), a[i].second -= (my - 1);
}
long double Solve() {
  double rot = 0;
  a[N + 1] = a[1];
  int mx = 0;
  cnt = 0;
  for (int i = 1; i <= N; i++)
    rot += a[i].first * a[i + 1].second - a[i].second * a[i + 1].first,
        mx = max(mx, a[i].first);
  if (rot > 0) reverse(a + 1, a + N + 2);
  for (int i = 1; i <= N; i++) {
    long long x1 = a[i].first, y1 = a[i].second, x2 = a[i + 1].first,
              y2 = a[i + 1].second;
    if (x1 < x2)
      for (int j = x1; j <= x2; j++)
        r[j] = (y1 * (x2 - j) + y2 * (j - x1)) / (x2 - x1);
    if (x1 > x2)
      for (int j = x2; j <= x1; j++)
        l[j] = (y2 * (x1 - j) + y1 * (j - x2) - 1) / (x1 - x2);
  }
  long double s1 = 0, s2 = 0;
  for (int i = 0; i <= mx; i++)
    cnt += r[i] - l[i], s1 += 1.0 * i * (r[i] - l[i]),
        s2 += 1.0 * i * i * (r[i] - l[i]);
  return s2 * cnt - s1 * s1;
}
void work() {
  long double ans = Solve();
  for (int i = 1; i <= N; i++) swap(a[i].first, a[i].second);
  printf("%.10f\n", (double)((ans + Solve()) / cnt / (cnt - 1)));
}
int main() {
  init();
  work();
  return 0 - 0;
}