Problem: There is a grid with H rows and W columns, where each square is painted black or white.

You are given H strings S_1, S_2, ..., S_H, each of length W. If the square at the i-th row from the top and the j-th column from the left is painted black, the j-th character in the string S_i is `#`; if that square is painted white, the j-th character in the string S_i is `.`.

Find the number of pairs of a black square c_1 and a white square c_2 that satisfy the following condition:

* There is a path from the square c_1 to the square c_2 where we repeatedly move to a vertically or horizontally adjacent square through an alternating sequence of black and white squares: black, white, black, white...

Constraints

* 1 \leq H, W \leq 400
* |S_i| = W (1 \leq i \leq H)
* For each i (1 \leq i \leq H), the string S_i consists of characters `#` and `.`.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

Print the answer.

Examples

Input

3 3
.#.
..#
#..


Output

10


Input

3 3
.#.
..#
..


Output

10


Input

2 4
....
....


Output

0


Input

4 3


...


Output

6

Solution (in JAVA):

Solution:
import java.util.*;
class Main {
    static int H;
    static int W;
    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	H = sc.nextInt();
	W = sc.nextInt();
	char[][] board = new char[H][W];
	for(int i = 0; i<H; i++) {
	    String str = sc.next();
	    for(int j = 0; j<W; j++) {
		board[i][j] = str.charAt(j);
	    }
	}
	long result = 0;;
	for(int i = 0; i<H; i++) {
	    for(int j = 0; j<W; j++) {
		if(board[i][j] == '#') {
		    long[] part = searchWhite(board,i,j);
		    result += part[0]*part[1];
		}
	    }
	}
	System.out.println(result);

    }

    public static long[] searchWhite(char[][] board, int i, int j) {
	char target = (board[i][j]=='#')? '.': '#';
	long[] cnt = {0,0};
	if(board[i][j] == '.') cnt[0]++;
	else if(board[i][j] == '#') cnt[1]++;
	board[i][j] = '*';
	long[] result;
	if(i+1<H) {
	    if(board[i+1][j] == target) {
		result = searchWhite(board,i+1,j);
		cnt[0] += result[0];
		cnt[1] += result[1];
	    }
	}
	if(i-1>=0) {
	    if(board[i-1][j] == target){
		result = searchWhite(board,i-1,j);
		cnt[0] += result[0];
		cnt[1] += result[1];
	    }
	}
	if(j+1<W) {
	    if(board[i][j+1] == target){
		result = searchWhite(board,i,j+1);
		cnt[0] += result[0];
		cnt[1] += result[1];
	    }
	}
	if(j-1>=0) {
            if(board[i][j-1] == target){
		result = searchWhite(board,i,j-1);
		cnt[0] += result[0];
		cnt[1] += result[1];
	    }
	}
	return cnt;
    }


}