#include <bits/stdc++.h>
using namespace std;
char s[600][600];
char t[1200][1200];
signed main() {
  int h, w;
  scanf("%d%d", &h, &w);
  map<int, vector<int>> mp;
  map<int, vector<int>> mp2;
  for (int i = 0; i < (2 * (h + w)); i++)
    for (int j = 0; j < (2 * (h + w)); j++) t[i][j] = '.';
  for (int i = 0; i < (h); i++) {
    scanf("%s", s[i]);
    for (int j = 0; j < (w); j++) {
      if (s[i][j] == '#') {
        mp[i - j].push_back(i + j);
        mp2[i + j].push_back(i - j);
        t[i - j + h + w][i + j + h + w] = '#';
      }
    }
  }
  int ans = 0;
  for (auto& p : mp) {
    auto& v = p.second;
    sort(v.begin(), v.end());
    for (int i = 0; i < (v.size()); i++)
      for (int j = i + 1; j < v.size(); j++) {
        int d = v[j] - v[i];
        auto& u = mp[p.first - d];
        ans += upper_bound(u.begin(), u.end(), v[j]) -
               lower_bound(u.begin(), u.end(), v[i]);
        u = mp[p.first + d];
        ans += upper_bound(u.begin(), u.end(), v[j]) -
               lower_bound(u.begin(), u.end(), v[i]);
      }
  }
  for (auto& p : mp2) {
    auto& v = p.second;
    sort(v.begin(), v.end());
    for (int i = 0; i < (v.size()); i++)
      for (int j = i + 1; j < v.size(); j++) {
        int d = v[j] - v[i];
        auto& u = mp2[p.first - d];
        ans += lower_bound(u.begin(), u.end(), v[j]) -
               upper_bound(u.begin(), u.end(), v[i]);
        u = mp2[p.first + d];
        ans += lower_bound(u.begin(), u.end(), v[j]) -
               upper_bound(u.begin(), u.end(), v[i]);
      }
  }
  cout << ans << endl;
}
