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.*;
	import java.util.Map.Entry;
	 
	 
	 class Main {
		 static int mod =  (int) (Math.pow(10,9)+7);
//		 static int mod =  (int) 998244353;
		 public static void main(String[] args) {
	    	
	        Scanner sc = new Scanner(System.in);

	        int H = sc.nextInt();	
	        int W = sc.nextInt();	
	        int[][]m = new int[H][W];
	        for (int i=0 ; i<H; i++) {
	        	String S = sc.next();
	        	char[] c = S.toCharArray();
	            for(int j=0;j<W;j++) {
	            	if(c[j]=='#')m[i][j]=1;
	            }
	        }
	        long ans=0;
	        boolean[][] visited = new boolean[H][W];
    		LinkedList<Integer> q= new LinkedList<Integer>();
	        for (int i=0 ; i<H; i++) {
	            for(int j=0;j<W;j++) {
	            	if(m[i][j]==1&&visited[i][j]!=true) {
	            		q.add(i*W+j);
	            		long cnt1=0;
	            		long cnt2=1;
	            		visited[i][j]=true;
            			int[] dx = {1, -1, 0, 0};
            			int[] dy = {0, 0, 1, -1};
	            		while(!q.isEmpty()) {
	            			int t = q.poll();
	            			int nh = t/W;
	            			int nw = t%W;
	            			int w = m[nh][nw];
	            			for(int k=0;k<4;k++) {
	            				int nx = nh + dx[k];
	            				int ny = nw + dy[k];
	            				if(nx >= 0 && nx < H && ny >= 0 && ny < W) {
	            					if(w==m[nx][ny])continue;
	            					if(visited[nx][ny]==true)continue;
		            				if(m[nx][ny]==0)cnt1++;
		            				else {
		            					cnt2++;
		            				}
		            				visited[nx][ny]=true;
		            				q.add(nx*W+ny);
	            				}
	            			}
	            		}
	            		ans=ans+cnt1*cnt2;
	            	}	
	            }	
	        }
	        
	        
	        System.out.println(ans);
	    }
	}