""" https://yukicoder.me/problems/no/179 ずらし方全探索 """ class DSU(): def __init__(self, n:int): self.n = n self.p = [i for i in range(n)] self.rank = [i for i in range(n)] self.sizelis = [1] * n def leader(self,a): stk = [] while self.p[a] != a: stk.append(a) a = self.p[a] for v in stk: self.p[v] = a return a def merge(self, a, b): ap = self.leader(a) bp = self.leader(b) if ap == bp: return ap if self.rank[ap] > self.rank[bp]: self.p[bp] = ap self.sizelis[ap] += self.sizelis[bp] elif self.rank[ap] < self.rank[bp]: self.p[ap] = bp self.sizelis[bp] += self.sizelis[ap] else: self.p[bp] = ap self.sizelis[ap] += self.sizelis[bp] self.rank[ap] += 1 return self.p[ap] def same(self,a,b): return self.leader(a) == self.leader(b) def size(self,a): return self.sizelis[ self.leader(a) ] def groups(self): dic = {} for v in range(self.n): vp = self.leader(v) if vp not in dic: dic[vp] = [v] else: dic[vp].append(v) return list(dic.values()) import sys def check(dx,dy): uf = DSU(H*W) for i in range(H): for j in range(W): if S[i][j] == ".": continue cnt = 0 if 0 <= i+dx < H and 0 <= j+dy < W and S[i+dx][j+dy] == "#": uf.merge( i*W+j , (i+dx)*W+j+dy ) if 0 <= i-dx < H and 0 <= j-dy < W and S[i-dx][j-dy] == "#": uf.merge( i*W+j , (i-dx)*W+j-dy ) for i in range(H): for j in range(W): if S[i][j] == "#" and uf.size(i*W+j)%2==1: return False return True H,W = map(int,input().split()) S = [ input() for i in range(H) ] for dx in range(-50,51): for dy in range(-50,51): if check(dx,dy): print ("YES") sys.exit() print ("NO")