#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
char s[maxn][maxn];
int n, m;
bool vis[maxn][maxn];
bool f(int x, int y);
bool ok(int x, int y) {
  if (x < 0 || x >= n - 1 || y < 0 || y >= m - 1 || vis[x][y]) return 0;
  return f(x, y);
}
struct node {
  int x, y;
  node() {}
  node(int a, int b) : x(a), y(b) {}
} q[maxn * maxn];
bool f(int x, int y) {
  int c = 0;
  if (s[x][y] == '*') {
    c++;
  }
  if (s[x][y + 1] == '*') {
    c++;
  }
  if (s[x + 1][y] == '*') {
    c++;
  }
  if (s[x + 1][y + 1] == '*') {
    c++;
  }
  return c == 1;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", s + i);
  }
  int front = 1, tail = 0;
  for (int i = 0; i < n - 1; i++)
    for (int j = 0; j < m - 1; j++)
      if (f(i, j)) {
        q[++tail] = node(i, j);
      }
  while (tail >= front) {
    node t = q[front++], p;
    int c = 0;
    if (s[t.x][t.y] == '*') {
      c++;
      p = node(t.x, t.y);
    }
    if (s[t.x][t.y + 1] == '*') {
      c++;
      p = node(t.x, t.y + 1);
    }
    if (s[t.x + 1][t.y] == '*') {
      c++;
      p = node(t.x + 1, t.y);
    }
    if (s[t.x + 1][t.y + 1] == '*') {
      c++;
      p = node(t.x + 1, t.y + 1);
    }
    vis[t.x][t.y] = 1;
    if (c == 1) {
      s[p.x][p.y] = '.';
      if (ok(p.x, p.y)) q[++tail] = node(p.x, p.y);
      if (ok(p.x - 1, p.y - 1)) q[++tail] = node(p.x - 1, p.y - 1);
      if (ok(p.x - 1, p.y)) q[++tail] = node(p.x - 1, p.y);
      if (ok(p.x, p.y - 1)) q[++tail] = node(p.x, p.y - 1);
    }
  }
  for (int i = 0; i < n; i++) printf("%s\n", s + i);
}
