#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
char pan[n + 2][m + 2]; // 使用 n+2 和 m+2 避免边界检查
// 初始化边界为 '.',防止越界访问
for (int i = 0; i < n + 2; i++) {
for (int j = 0; j < m + 2; j++) {
pan[i][j] = '.';
}
}
// 读取输入,注意跳过换行符
for (int a = 1; a <= n; a++) {
scanf(" "); // 跳过可能的换行符
for (int b = 1; b <= m; b++) {
scanf("%c", &pan[a][b]);
}
}
// 计算每个格子周围的地雷数
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= m; b++) {
if (pan[a][b] == '*') {
continue; // 如果是地雷,跳过
}
int shu = 0;
// 检查周围的8个方向
if (pan[a][b - 1] == '*') shu++; // ←
if (pan[a - 1][b - 1] == '*') shu++; // ↖
if (pan[a - 1][b] == '*') shu++; // ↑
if (pan[a - 1][b + 1] == '*') shu++; // ↗
if (pan[a][b + 1] == '*') shu++; // →
if (pan[a + 1][b + 1] == '*') shu++; // ↘
if (pan[a + 1][b] == '*') shu++; // ↓
if (pan[a + 1][b - 1] == '*') shu++; // ↙
pan[a][b] = shu + '0'; // 将数字转换为字符
}
}
// 输出结果
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= m; b++) {
printf("%c", pan[a][b]);
}
printf("\n"); // 每行结束后换行
}
return 0;
}