#include <bits/stdc++.h>
using namespace std;
char graph[60][60];
int type[60];
int main() {
  int n, m;
  char t;
  scanf("%d%d", &n, &m);
  getchar();
  for (int i = 0; i < n; i++)
    for (int j = 0; j <= m; j++) scanf("%c", &graph[i][j]);
  unordered_set<int> sett;
  bool ans = true;
  int ptype = 1;
  for (int i = 0; i < m; i++) {
    unordered_set<int> tocompare;
    for (int j = 0; j < n; j++) {
      if (graph[j][i] == '#') {
        tocompare.insert(j);
      }
    }
    if (tocompare.size() == 0 || tocompare.size() == 1) {
      for (int row : tocompare) sett.insert(row);
      continue;
    }
    vector<int> cmp;
    int firsttype = -1;
    bool fail = false;
    for (int row : tocompare) {
      if (firsttype == -1)
        firsttype = type[row];
      else if (firsttype != type[row]) {
        fail = true;
        break;
      }
    }
    if (fail) {
      ans = false;
      break;
    }
    if (firsttype != 0) continue;
    fail = false;
    for (int row : tocompare) {
      sett.insert(row);
      type[row] = ptype;
    }
    ptype++;
    for (int c = 0; c < m; c++) {
      int fir = 0;
      for (int row : tocompare) {
        if (fir == 0)
          fir = graph[row][c];
        else if (graph[row][c] != fir) {
          fir = -1;
          fail = true;
          break;
        }
      }
      if (fir == -1) break;
    }
    if (fail) {
      ans = false;
      break;
    }
  }
  if (ans)
    printf("Yes\n");
  else
    printf("No\n");
  return 0;
}
