#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
int main()
{
	int h, w;
	cin>>h>>w;
	string s[300];
	for(int i=0; i<h; i++) cin>>s[i];
	char c[1000][1000];
	for(int i=0; i<1000; i++){
		fill(c[i], c[i]+1000, '.');
	}
	for(int i=0; i<h; i++){
		for(int j=0; j<w; j++){
			if(s[i][j]=='#') c[i+300][j+300]='#';
		}
	}

	ll ct1[601][301], ct2[601][301];
	for(int k=0; k<h+w-1; k++){
		ct1[k][0]=0;
		for(int j=1; j<=w; j++){
			ct1[k][j]=ct1[k][j-1];
			if(c[k-j+1+300][j-1+300]=='#') ct1[k][j]++;
		}
	}
	for(int k=0; k<h+w-1; k++){
		ct2[k][0]=0;
		for(int j=1; j<=w; j++){
			ct2[k][j]=ct2[k][j-1];
			if(c[k-w+1+j-1+300][j-1+300]=='#') ct2[k][j]++;
		}
	}

	ll ans=0;
	for(int i=0; i<h; i++){
		for(int j=0; j<w; j++){
			if(s[i][j]!='#') continue;
			for(int d=1; i-d>=0 && j+d<w; d++){
				if(s[i-d][j+d]!='#') continue;
				if(i+j-2*d<0) continue;
				ans-=ct1[i+j-2*d][max(0, j-d)];
				ans+=ct1[i+j-2*d][j];
			}
			for(int d=1; i-d>=0 && j+d<w; d++){
				if(s[i-d][j+d]!='#') continue;
				if(i+j+2*d>=h+w-1) continue;
				ans-=ct1[i+j+2*d][min(w, j+d+1)];
				ans+=ct1[i+j+2*d][min(w, j+2*d+1)];
			}
			for(int d=1; i+d<h && j+d<w; d++){
				if(s[i+d][j+d]!='#') continue;
				if(i-j-2*d<=-w) continue;
				ans-=ct2[i-j-2*d+w-1][min(j+d, w)];
				ans+=ct2[i-j-2*d+w-1][min(j+2*d, w)];
			}
			for(int d=1; i+d<h && j+d<w; d++){
				if(s[i+d][j+d]!='#') continue;
				if(i-j+2*d>=h) continue;
				ans-=ct2[i-j+2*d+w-1][max(j-d+1, 0)];
				ans+=ct2[i-j+2*d+w-1][j+1];
			}
		}
	}
	cout<<ans<<endl;
    return 0;
}