import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String exp = in.nextLine();
            String str = in.nextLine();
            process2(exp, str);
        }
    }

    // 方法一:动态规划
    private static void process(String exp, String str) {
        exp = exp.toLowerCase();
        str = str.toLowerCase();
        char[] exps = getExps(exp);
        char[] strs = str.toCharArray();
        int n = exps.length;
        int m = strs.length;
        Boolean[][] dp = new Boolean[n + 1][m + 1];
        dp[0][0] = true;
        //填充初始值,如果表达式 * 开头 第0行为true
        for (int i = 1; i <= n; i++) {
            dp[i][0] = exps[0] == '*';
        }
        for (int i = 1; i <= m; i++) {
            dp[0][i] = false;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                //场景一, 表达式第i个字符,与字符串中第j个字符相同
                if (exps[i - 1] == strs[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    //场景二,表达式第i个字符,与字符串中第j个字符不相同
                    //      1. 字符串中第j个字符不是数字或字母,结果为false
                    if (!(strs[j - 1] >= 'a' && strs[j - 1] <= 'z') && !(strs[j - 1] >= '0' &&
                            strs[j - 1] <= '9')) {
                        dp[i][j] = false;
                        continue;
                    }
                    char e = exps[i - 1];
                    //      2.表达式第i个字符为 ?,结果与i-1, j-1一致
                    if (e == '?') {
                        dp[i][j] = dp[i - 1][j - 1];
                    //      3.表达式第i个字符为 *
                    } else if (e == '*') {
                        dp[i][j] = dp[i][j - 1] || dp[i - 1][j] || dp[i - 1][j - 1];
                    } else {
                        dp[i][j] = false;
                    }
                }
            }
        }
        System.out.println(dp[n][m]);
    }

    //方法二:动态规划 + 空间压缩
    private static void process2(String exp, String str) {
        exp = exp.toLowerCase();
        str = str.toLowerCase();
        char[] exps = getExps(exp);
        char[] strs = str.toCharArray();
        int n = exps.length;
        int m = strs.length;
        Boolean[] dp = new Boolean[n+1];
        dp[0] = true;
        for (int i = 1; i <= n; i++) {
            if( exps[0] == '*' && i==1) {
                dp[i] =true;
            } else {
                dp[i] =false;
            }
        }
        for (int i = 1; i <= m; i++) {
            boolean leftUp = i == 1, backUp;
            if(i==2) {
                leftUp = exps[0] == '*';
            }
            for (int j = 1; j <= n; j++) {
                backUp = dp[j];
                if(exps[j-1] == strs[i-1]) {
                    dp[j] = leftUp;
                } else {
                    if(!(strs[i-1] >='a' && strs[i-1]<= 'z') &&
                     !(strs[i-1] >='0' && strs[i-1]<= '9')){
                        dp[j] = false;
                        leftUp = backUp;
                        continue;
                    }
                    char e = exps[j-1];
                    if(e == '?'){
                        dp[j] = leftUp;
                    }else if(e == '*'){
                        dp[j] = dp[j-1] || dp[j] || leftUp;
                    }else{
                        dp[j] = false;
                    }
                }
                leftUp = backUp;
            }
        }
        System.out.println(dp[n]);
    }

    // 转成字符数组前,去掉重复的 *
    private static char[] getExps(String exp) {
        List<Character> list = new ArrayList<>();
        char pre = 0;
        for (int i = 0; i < exp.length(); i++) {
            char c = exp.charAt(i);
            if ((pre == '*' ^ c == '*') || (pre != '*' && c != '*')) {
                list.add(c);
                pre = c;
            }
        }
        char[] arr = new char[list.size()];
        for (int i = 0; i < list.size(); i++) {
            arr[i] = list.get(i);
        }

        return arr;
    }
}