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 CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;

int H,W;
char S[410][410];
bool Sc[410][410];
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
long int b=0,w=0;

void func(int i,int j,bool isBlack){
    char ch;
    if(isBlack){
            b++; ch='.';
    }else{
            w++; ch='#';
    }
    Sc[i][j] = true;

    for (int dir = 0; dir<4; dir++){
        int nx = i + dx[dir];
        int ny = j + dy[dir];
        if (nx < 0 || ny < 0 || nx >= H || ny >= W ) continue;
        if(S[nx][ny]==ch && !Sc[nx][ny]){
               func(nx,ny,!isBlack); 
        }
    }
}

int main(){
     long int fans=0;
     cin >> H >> W;
     for (int i=0; i<H; i++){
        cin >> S[i];
     }
     for (int i=0; i<H; i++){
             for (int j=0; j<W; j++){
                     if(!Sc[i][j]){
                             func(i,j,(S[i][j]=='#'));
                             fans += w*b;
                             w = 0; b = 0;
                     }
             }
     }
     cout << fans << endl;
     return 0;
}