Problem: There are some coins in the xy-plane. The positions of the coins are represented by a grid of characters with H rows and W columns. If the character at the i-th row and j-th column, s_{ij}, is `#`, there is one coin at point (i,j); if that character is `.`, there is no coin at point (i,j). There are no other coins in the xy-plane.

There is no coin at point (x,y) where 1\leq i\leq H,1\leq j\leq W does not hold. There is also no coin at point (x,y) where x or y (or both) is not an integer. Additionally, two or more coins never exist at the same point.

Find the number of triples of different coins that satisfy the following condition:

* Choosing any two of the three coins would result in the same Manhattan distance between the points where they exist.



Here, the Manhattan distance between points (x,y) and (x',y') is |x-x'|+|y-y'|. Two triples are considered the same if the only difference between them is the order of the coins.

Constraints

* 1 \leq H,W \leq 300
* s_{ij} is `#` or `.`.

Input

Input is given from Standard Input in the following format:


H W
s_{11}...s_{1W}
:
s_{H1}...s_{HW}


Output

Print the number of triples that satisfy the condition.

Examples

Input

5 4
#.##
.##.
#...
..##
...#


Output

3


Input

5 4
.##
.##.
...
..##
...#


Output

3


Input

13 27
......#.........#.......#..
...#.....###..
..............#####...##...
...#######......#...#######
...#.....#.....###...#...#.
...#######....#.#.#.#.###.#
..............#.#.#...#.#..
.#.#.#...###..
...........#...#...#######
..#######..#...#...#.....#
..#.....#..#...#...#.###.#
..#######..#...#...#.#.#.#
..........##...#...#.#####


Output

870

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define ppb pop_back
#define umax(x,y) x=max(x,y)
#define umin(x,y) x=min(x,y)
#define ll long long
#define ii pair<int,int>
#define iii pair<ii,int>
#define iiii pair<ii,ii>
#define sz(x) ((int) x.size())
#define orta ((bas+son)>>1)
#define all(x) x.begin(),x.end()
#define dbgs(x) cerr<<(#x)<<" --> "<<(x)<<" "
#define dbg(x) cerr<<(#x)<<" --> "<<(x)<<endl;getchar()
#define pw(x) (1<<(x))
#define inf 1005000000
#define MOD 1000000007
#define N 903
#define M 1000005
#define LOG 20
#define KOK 32000
using namespace std;

char s[N][N];
int h,w,pre[2][N][N];
ll ans;

int main() {

	//freopen("input.txt","r",stdin);

	scanf("%d %d",&h,&w);

	for(int i=h+1;i<=2*h;i++) scanf("%s",s[i]+1+w);

	for(int i=1;i<=3*h;i++) {

		for(int j=1;j<=3*w;j++) {

			pre[0][i][j]=pre[0][i-1][j-1]+(s[i][j]=='#');

		}

		for(int j=3*w;j>=1;j--) {

			pre[1][i][j]=pre[1][i-1][j+1]+(s[i][j]=='#');

		}

	}

	for(int i=h+1;i<=2*h;i++) {

		for(int j=w+1;j<=2*w;j++) {

			for(int k=1;k<=max(h,w);k++) {

				int tot=(s[i-k][j]=='#')+(s[i+k][j]=='#')+(s[i][j-k]=='#')+(s[i][j+k]=='#');

				ans+=tot*(tot-1)*(tot-2)/6;

				if(s[i-k][j]=='#' && s[i][j+k]=='#') {

					tot=pre[0][i+k-1][j-1]-pre[0][i][j-k];

					ans+=tot;

				}

				if(s[i][j+k]=='#' && s[i+k][j]=='#') {

					tot=pre[1][i-1][j-k+1]-pre[1][i-k][j];

					ans+=tot;

				}

				if(s[i+k][j]=='#' && s[i][j-k]=='#') {

					tot=pre[0][i-1][j+k-1]-pre[0][i-k][j];

					ans+=tot;

				}

				if(s[i][j-k]=='#' && s[i-k][j]=='#') {

					tot=pre[1][i+k-1][j+1]-pre[1][i][j+k];

					ans+=tot;

				}

			}

		}

	}

	printf("%lld",ans);

}