#include <iostream>
using namespace std;

char a[20004][20004]={0};//在主函数外定义数组,节省内存,注意使用char类型存储字符
int main() {
    int n{},m{};//n行m列
    cin>>n>>m;
    n+=10;
    m+=10;//将n和m都往后移十位,目的是防止数组访问越界(也可以移动其他位数)
    for(int i=10;i<n;i++)//往后移了十位所以循环初始值也+10
    {
        for(int j=10;j<m;j++)//到这里输入了n行m列
        {
            cin>>a[i][j];
            // cout<<a[i][j];
        }
    }


    int cnt{};//计数器,记录地雷个数
    int line{};//判断何时换行
    for(int i=10;i<n;i++)
    {
        for(int j=10;j<m;j++)//对这个n行m列的矩阵进行检索
        {
            if(a[i][j]=='*')//本位置为地雷则输出*
            {
                cout<<"*";
            }
            else//判断其他位置有多少地雷
            {
                if(a[i-1][j-1]=='*')//左上方
                cnt++;

                if(a[i-1][j]=='*')//正上方
                cnt++;

                if(a[i-1][j+1]=='*')//右上方
                cnt++;

                if(a[i][j-1]=='*')//左边
                cnt++;

                if(a[i][j+1]=='*')//右边
                cnt++;

                if(a[i+1][j-1]=='*')//左下方
                cnt++;

                if(a[i+1][j]=='*')//正下方
                cnt++;

                if(a[i+1][j+1]=='*')//右下方
                cnt++;

                cout<<cnt;//输出地雷个数
                cnt=0;//重置计数器
                
            }

            line++;//换行计数器加加
                if(line==m-10)//如果换行计数等于原来的列数,就换行
                {
                    line=0;
                    cout<<endl;
                }

        }
    }


    return 0;

    }
// 64 位输出请用 printf("%lld")