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 double finf = 1e208, eps = 1e-9;
const int Maxn = 100005, MaxN = 2000005, N = 1000000, inf = 999999999 + 208;
int n;
double ans = 0, min_y[MaxN], max_y[MaxN];
double *miny = min_y + N, *maxy = max_y + N;
inline int get() {
  bool f = 0;
  char ch;
  while (!isdigit(ch = getchar())) f |= ch == '-';
  int v = ch - 48;
  while (isdigit(ch = getchar())) v = v * 10 + ch - 48;
  return f ? -v : v;
}
template <class T, class T2>
inline void gmin(T &x, const T2 &y) {
  if (x > y) x = y;
}
template <class T, class T2>
inline void gmax(T &x, const T2 &y) {
  if (x < y) x = y;
}
struct Point {
  int x, y;
} p[Maxn];
double solve() {
  int minx = inf, maxx = -inf;
  for (int i = 1; i <= n; i++) gmin(minx, p[i].x), gmax(maxx, p[i].x);
  for (int i = minx; i <= maxx; i++) miny[i] = finf, maxy[i] = -finf;
  for (int i = 1; i <= n; i++) {
    Point s = p[i], t = p[i == n ? 1 : i + 1];
    if (s.x == t.x) {
      gmin(miny[s.x], min(s.y, t.y));
      gmax(maxy[s.x], max(s.y, t.y));
    } else {
      if (s.x > t.x) swap(s, t);
      double y, a = 1. / (t.x - s.x);
      for (int i = s.x; i <= t.x; i++) {
        y = s.y + (i - s.x) * a * (t.y - s.y);
        gmin(miny[i], y);
        gmax(maxy[i], y);
      }
    }
  }
  double tot = 0, res = 0, s1 = 0, s2 = 0, s3 = 0, cnt;
  for (int i = minx; i <= maxx; i++) {
    tot += cnt = floor(maxy[i] + eps) - floor(miny[i] - eps);
    res += cnt * (s1 * i * i - 2 * s2 * i + s3);
    s1 += cnt;
    s2 += cnt * i;
    s3 += cnt * i * i;
  }
  res /= tot * (tot - 1) / 2;
  return res;
}
int main() {
  n = get();
  for (int i = 1; i <= n; i++) p[i].x = get(), p[i].y = get();
  ans += solve();
  for (int i = 1; i <= n; i++) swap(p[i].x, p[i].y);
  ans += solve();
  printf("%.8lf\n", ans * 0.5);
  return 0;
}