#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << '\n';
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
const long long dirx[4] = {0, 0, -1, 1};
const long long diry[4] = {-1, 1, 0, 0};
void FASTIO() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
void yn(bool ok) { cout << (ok ? "YES" : "NO") << '\n'; }
const long long mxN = 2e5;
long long n, m, q;
long long a[mxN];
long long ans;
string s;
string k;
vector<long long> cnts;
vector<long long> cntk;
long long ex;
void test_case() {
  ans = ex = 0;
  cnts = cntk = vector<long long>(26, 0);
  cin >> s >> k;
  n = (long long)(s.size());
  for (auto it : s) {
    if (it == '?')
      ex += 1;
    else
      cnts[it - 'a']++;
  }
  for (auto it : k) {
    cntk[it - 'a']++;
  }
  multiset<long long> st;
  for (long long i = 0; i < n and ex; i++) {
    long long exreq = 0;
    for (long long j = 0; j < 26; j++) {
      if (cnts[j] < cntk[j]) exreq += cntk[j] - cnts[j];
    }
    if (ex < exreq) break;
    ex -= exreq;
    vector<long long> buff(26, 0);
    for (long long j = 0; j < 26; j++) {
      long long val = cntk[j] - cnts[j];
      val = max(0LL, val);
      buff[j] += val;
      while (val--) {
        st.insert(j);
      }
    }
    for (long long j = 0; j < 26; j++) {
      cnts[j] -= cntk[j] - buff[j];
    }
  }
  for (long long i = 0; i < n; i++) {
    if (s[i] == '?') {
      long long el = 0;
      if ((long long)(st.size())) {
        el = *(st.begin());
        st.erase(st.begin());
      }
      cout << char(el + 'a');
    } else {
      cout << s[i];
    }
  }
  cout << '\n';
}
int32_t main() {
  FASTIO();
  long long t;
  t = 1;
  for (long long i = 1; i <= t; i++) {
    test_case();
  }
  return 0;
}
