--- /dev/null
+#!/usr/bin/awk -f
+
+BEGIN {
+ FS = ","
+ n = 0
+ mx = my = 0
+}
+
+!/^[0-9,]*$/ {
+ print "error line", NR, $0
+}
+
+NF == 2 {
+ n++
+ x[n] = $1
+ if (mx < $1) mx = $1
+ y[n] = $2
+ if (my < $2) my = $2
+}
+
+function nsort(t, r, i, j, k, l) {
+ l = 0
+ delete r
+ for (i in t) {
+ m = -1
+ for (j = 1; j <= l; j++) {
+ if (r[j] < t[i]) continue
+ m = (r[j] > t[i]) ? j : 0
+ break
+ }
+ if (m == -1) {
+ r[++l] = t[i]
+ } else if (m > 0) {
+ for (j = l; j >= m; j--) r[j + 1] = r[j]
+ r[m] = t[i]
+ l++
+ }
+ }
+ return l
+}
+
+function adisp(n, a) {
+ if (n) printf "%s", n
+ for (i in a) printf " %s", a[i]
+ printf "\n"
+}
+
+function shrink(x, xx, rx, i, j, m) {
+ m = 0
+ for (i in x) {
+ for (j in xx) {
+ if (x[i] == xx[j]) {
+ rx[i] = j * 2
+ if (m < rx[i]) m = rx[i]
+ }
+ }
+ }
+ return m
+}
+
+function draw(b, x, y, i, k, k0, ke, l, lx, ly) {
+ l = length(x)
+ lx = x[l]
+ ly = y[l]
+ for (i = 1; i <= l; i++) {
+ if (lx == x[i]) {
+ if (ly < y[i]) {
+ k0 = ly
+ ke = y[i]
+ } else {
+ k0 = y[i]
+ ke = ly
+ }
+ for (k = k0; k <= ke; k++) {
+ b[x[i] "," k] = "X"
+ }
+ } else if (ly == y[i]) {
+ if (lx < x[i]) {
+ k0 = lx
+ ke = x[i]
+ } else {
+ k0 = x[i]
+ ke = lx
+ }
+ for (k = k0; k <= ke; k++) {
+ b[k "," y[i]] = "X"
+ }
+ } else print "error"
+ lx = x[i]
+ ly = y[i]
+ }
+}
+
+function push(x, v, i) {
+ for (i in x) if (x[i] == v) return
+ x[length(x) + 1] = v
+}
+
+function _fill(b, v, c, i, t, x, y) {
+ while (length(v) > 0) {
+ delete t
+ for (i in v) {
+ if (b[v[i]]) continue
+ b[v[i]] = "O"
+ split(v[i], c, ",")
+ for (x = -1; x <= 1; x++) {
+ for (y = -1; y <= 1; y++) {
+ if ((x == 0) && (y == 0)) continue
+ j = (c[1] + x) "," (c[2] + y)
+ if (!b[j]) push(t, j)
+ }
+ }
+ }
+ delete v
+ for (i in t) v[i] = t[i]
+ }
+}
+
+function fill (b, n, i, v) {
+ for (i = 1; i <= n; i++) {
+ if (b[i "," 3]) break
+ }
+ i++
+ b[i "," 3] = "O"
+ v[1] = i+1 "," 3
+ v[3] = i "," 4
+ v[4] = i+1 "," 4
+ _fill(b, v)
+}
+
+
+function bdisp(b, n, i, j) {
+ for (i = 1; i <= n; i++) {
+ for (j = 1; j <= n; j++) {
+ printf "%s", (b[i "," j]) ? b[i "," j] : "."
+ }
+ printf "\n"
+ }
+}
+
+END {
+ print n, mx, my
+ lx = nsort(x, xx)
+ ly = nsort(y, yy)
+ mrx = shrink(x, xx, rx)
+ mry = shrink(y, yy, ry)
+ #adisp("rx:", rx)
+ #adisp("ry:", ry)
+ draw(b, rx, ry)
+ bl = (mrx > mry) ? mrx + 1: mry + 1
+ fill(b, bl)
+ #bdisp(b, bl)
+ a = 0
+ for (i = 1; i < n; i++) {
+ for (j = i + 1; j <= n; j++) {
+ v = 1
+ if (rx[i] < rx[j]) {
+ rx0 = rx[i]
+ rxe = rx[j]
+ } else {
+ rx0 = rx[j]
+ rxe = rx[i]
+ }
+ if (ry[i] < ry[j]) {
+ ry0 = ry[i]
+ rye = ry[j]
+ } else {
+ ry0 = ry[j]
+ rye = ry[i]
+ }
+ for (k = rx0; (k <= rxe) && v; k++) {
+ for (l = ry0; (l <= rye) && v; l++) {
+ if (!b[k "," l]) v = 0
+ }
+ }
+ if (!v) continue
+ w = (x[i] > x[j]) ? x[i] - x[j] + 1 : x[j] - x[i] + 1
+ h = (y[i] > y[j]) ? y[i] - y[j] + 1 : y[j] - y[i] + 1
+ s = w * h
+ if (a < s) a = s
+ }
+ }
+ print "max:", a
+
+}