Problem: There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.



Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

* '.' - a black tile
* '#' - a red tile
* '@' - a man on a black tile(appears exactly once in a data set)


The end of the input is indicated by a line consisting of two zeros.

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Examples

Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0


Output

45
59
6
13


Input

6 9
....#.
.....#
......
......
......
......
......
@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
.###
...@...
.###
..#.#..
..#.#..
0 0


Output

45
59
6
13

Solution (in JAVA):

Solution:
import java.util.*;

public class Main {
  public static void main(String[] args) {
    new Main().run();
  }

  private void run() {
    while(sc.hasNext()) {
      final int w = sc.nextInt();
      final int h = sc.nextInt();
      sc.nextLine();

      if(w == 0 && h == 0) break;

      final Tiles map = new Tiles(w, h);
      int px = -1;
      int py = -1;

      for(int y = 0; y < h; y++) {
        String line = sc.nextLine();
        for(int x = 0; x < w; x++) {
          switch(line.charAt(x)) {
          case '.' : map.setBlack(x, y); break;
          case '#' : map.setRed(x, y);   break;
          case '@' : map.setBlack(x, y); px = x; py = y; break;
          }
        }
      }

      System.out.println(map.blackArea(px, py));
    }
  }

  private final Scanner sc = new Scanner(System.in);
}

class Tiles {
  public Tiles(int w, int h) {
    this.w = w;
    this.h = h;
    this.map = new int[w * h];

    for(int i = 0; i < w * h; i++) map[i] = -1;
  }

  public void setBlack(int x, int y) {
    final int pos = x + y * w;

    map[pos] = -1;

    if(x != 0 && map[pos - 1] != RED) union(pos, pos - 1);
    if(y != 0 && map[pos - w] != RED) union(pos, pos - w);
  }

  public void setRed(int x, int y) {
    map[x + y * w] = RED;
  }

  public int blackArea(int x, int y) {
    return - map[root(x + y * w)];
  }

  private void union(int a, int b) {
    a = root(a);
    b = root(b);

    if(a != b) {
      if(map[a] < map[b]) {
        map[a] += map[b];
        map[b] = a;
      }
      else {
        map[b] += map[a];
        map[a] = b;
      }
    }
  }

  private int root(int a) {
    if(map[a] < 0) return a;

    map[a] = root(map[a]);
    return map[a];
  }

  private final int w;
  private final int h;
  private final int[] map;

  private static final int RED = 10000000;
}