#include <bits/stdc++.h>
using namespace std;
using Int = long long;
template <typename T1, typename T2>
inline void chmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
inline void chmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
const Int MAX = 305;
const Int MAX2 = MAX * 2;
signed ex[MAX2][MAX2];
signed dp1[MAX2 + 2][MAX2 + 2];
signed dp2[MAX2 + 2][MAX2 + 2];
signed main() {
  Int h, w;
  cin >> h >> w;
  vector<string> s(h);
  for (Int i = 0; i < h; i++) cin >> s[i];
  using P = pair<Int, Int>;
  vector<P> vp;
  memset(ex, 0, sizeof(ex));
  for (Int i = 0; i < h; i++) {
    for (Int j = 0; j < w; j++) {
      if (s[i][j] != '#') continue;
      vp.emplace_back(1 + i + j, 1 + i - j + w);
      ex[1 + i + j][1 + i - j + w] = 1;
    }
  }
  auto ch = [&](Int i, Int j) -> Int {
    if (i < 0 || i >= MAX2) return 0;
    if (j < 0 || j >= MAX2) return 0;
    return ex[i][j];
  };
  memset(dp1, 0, sizeof(dp1));
  memset(dp2, 0, sizeof(dp2));
  Int ans = 0;
  const Int LIM = h + w;
  for (Int k = 1; k <= LIM; k++) {
    for (Int i = 0; i < MAX2; i++) {
      for (Int j = 0; j < MAX2; j++) {
        dp1[i][j + 1] = dp1[i][j] + (ex[i][j] && ch(i, j - k));
        dp2[j][i + 1] = dp2[j][i] + (ex[i][j] && ch(i - k, j));
      }
    }
    for (P p : vp) {
      Int i, j;
      tie(i, j) = p;
      if (i - k >= 0) {
        ans += dp1[i - k][min(MAX2 - 1, j + k + 1)] - dp1[i - k][j];
        ans += dp2[j - k][min(MAX2 - 1, i + k + 1)] - dp2[j - k][i];
      }
      if (i + k < MAX2) {
        ans += dp1[i + k][min(MAX2 - 1, j + k + 1)] - dp1[i + k][j];
        ans += dp2[j + k][min(MAX2 - 1, i + k + 1)] - dp2[j + k][i];
      }
    }
  }
  for (P p : vp) {
    Int i, j;
    tie(i, j) = p;
    for (Int k = 1; k <= LIM; k++) {
      if (ch(i + k, j) && ch(i, j + k)) ans--;
      if (ch(i + k, j) && ch(i, j - k)) ans--;
      if (ch(i - k, j) && ch(i, j + k)) ans--;
      if (ch(i - k, j) && ch(i, j - k)) ans--;
    }
  }
  cout << ans << endl;
  return 0;
}
