#include <bits/stdc++.h>
using namespace std;
int B[1000][1000];
bool V[1000][1000];
int nr, nc;
int valid(int r, int c) { return r >= 0 && c >= 0 && r < nr && c < nc; }
int nlabel = 0;
int dr[4] = {1, -1, 0, 0};
int dc[4] = {0, 0, 1, -1};
bool label(int r, int c, bool root) {
  V[r][c] = true;
  assert(B[r][c] == -1);
  int res = 1;
  int alabel = -1;
  for (int d = 0; d < 4; d++) {
    int tr = r + dr[d], tc = c + dc[d];
    if (!valid(tr, tc) || V[tr][tc] || B[tr][tc] != -1) continue;
    label(tr, tc, false);
    if (B[tr][tc] == -1) {
      if (B[r][c] == -1) B[r][c] = nlabel++;
      B[tr][tc] = B[r][c];
      res++;
    } else {
      alabel = B[tr][tc];
    }
  }
  if (root && res == 1) {
    if (alabel == -1) return false;
    B[r][c] = alabel;
  }
  return true;
}
int main() {
  cin >> nr >> nc;
  memset(B, 255, sizeof(B));
  for (int r = 0; r < nr; r++) {
    string s;
    cin >> s;
    for (int c = 0; c < nc; c++)
      if (s[c] == '#') B[r][c] = -2;
  }
  memset(V, 0, sizeof(V));
  bool fail = false;
  for (int r = 0; r < nr; r++)
    for (int c = 0; c < nc; c++)
      if (!V[r][c] && B[r][c] == -1) {
        if (!label(r, c, true)) fail = true;
      }
  if (fail) {
    printf("-1\n");
    return 0;
  }
  queue<int> q;
  vector<int> D(nlabel);
  vector<int> C(nlabel);
  vector<set<int> > A(nlabel);
  for (int r = 0; r < nr; r++)
    for (int c = 0; c < nc; c++)
      if (B[r][c] >= 0) {
        for (int d = 0; d < 4; d++) {
          int tr = r + dr[d], tc = c + dc[d];
          if (!valid(tr, tc)) continue;
          if (B[tr][tc] >= 0 && B[tr][tc] != B[r][c]) {
            A[B[r][c]].insert(B[tr][tc]);
            D[B[r][c]]++;
          }
        }
      }
  for (int i = 0; i < nlabel; i++)
    if (D[i] <= 5) {
      q.push(i);
      D[i] = -1;
    }
  vector<int> order;
  while (!q.empty()) {
    int at = q.front();
    q.pop();
    order.push_back(at);
    for (typeof((A[at]).begin()) it = (A[at]).begin(); it != (A[at]).end();
         ++it)
      if (D[*it] >= 0) {
        D[*it]--;
        if (D[*it] <= 5) {
          q.push(*it);
          D[*it] = -1;
        }
      }
  }
  assert(int((order).size()) == nlabel);
  int opt[10];
  for (int i = int((order).size()) - 1; i >= 0; i--) {
    memset(opt, 1, sizeof(opt));
    int at = order[i];
    for (typeof((A[at]).begin()) it = (A[at]).begin(); it != (A[at]).end();
         ++it) {
      int v = C[*it];
      if (v != -1) opt[v] = 0;
    }
    for (int i = 0; i < 10; i++)
      if (opt[i]) {
        C[at] = i;
      }
  }
  for (int r = 0; r < nr; r++) {
    for (int c = 0; c < nc; c++) {
      int v = B[r][c];
      if (v == -2)
        cout << "#";
      else
        printf("%d", C[v]);
    }
    cout << endl;
  }
}
