/*
* @Author: hungeazy
* @Date: 2024-11-30 23:03:19
* @Last Modified by: hungeazy
* @Last Modified time: 2024-12-01 00:23:03
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name "QPALIN"
#define endl '\n'
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms."
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
int n,k;
string omega,t;
struct bignum {
string s;
bignum() {
this->s = "0";
}
bignum(string a) {
s = a;
}
bignum(int a) {
s = to_string(a);
}
friend istream &operator>>(istream &is, bignum &a) {
is >> a.s;
return is;
}
friend ostream &operator<<(ostream &os, const bignum &a) {
os << a.s;
return os;
}
bool operator<(const bignum &a) const {
if (sz(s) < sz(a.s)) return 1;
if (sz(s) > sz(a.s)) return 0;
return s < a.s;
}
bool operator>(const bignum &a) const {
if (sz(s) > sz(a.s)) return 1;
if (sz(s) < sz(a.s)) return 0;
return s > a.s;
}
bool operator==(const bignum &a) {
return s == a.s;
}
bool operator!=(const bignum &a) {
return s != a.s;
}
bool operator<=(const bignum &a) {
if (sz(s) < sz(a.s)) return 1;
if (sz(s) > sz(a.s)) return 0;
return s <= a.s;
}
bool operator>=(const bignum &a) {
if (sz(s) > sz(a.s)) return 1;
if (sz(s) < sz(a.s)) return 0;
return s >= a.s;
}
bignum operator+(const bignum &a) {
string x = "";
int m = s.size(), n = a.s.size();
int d = abs(m-n), c = 0;
FOD(i,min(n,m)-1,0)
{
int sum = c;
if (m < n) sum += s[i]-'0'+a.s[i+d]-'0';
else sum += s[i+d]-'0'+a.s[i]-'0';
x += sum%10+'0';
c = sum/10;
}
if (m < n)
FOD(i,n-m-1,0)
{
int sum = ((a.s[i]-'0')+c);
x += sum%10+'0';
c = sum/10;
}
else
FOD(i,m-n-1,0)
{
int sum = ((s[i] - '0') + c);
x += sum%10+'0';
c = sum/10;
}
if (c) x += c+'0';
while (x.size() > 1 and x.back() == '0') x.pop_back();
reverse(all(x));
return bignum(x);
}
bignum operator-(const bignum &a) {
string x = "";
int m = s.size(), n = a.s.size();
int d = m-n, c = 0;
FOD(i,n-1,0)
{
int sub = ((s[i+d]-'0')-(a.s[i]-'0')-c);
if (sub < 0)
{
sub += 10;
c = 1;
}
else c = 0;
x += sub+'0';
}
FOD(i,m-n-1,0)
{
if (s[i] == '0' and c)
{
x += '9';
continue;
}
int sub = ((s[i]-'0')-c);
if (i > 0 or sub > 0) x += sub + '0';
c = 0;
}
while (x.size() > 1 and x.back() == '0') x.pop_back();
reverse(all(x));
return bignum(x);
}
bignum operator*(const bignum &a) {
int m = s.size(), n = a.s.size();
string x(m+n, '0');
int p = 0;
FOD(i,m-1,0)
{
int c = 0, q = 0;
FOD(j,n-1,0)
{
int sum = (s[i]-'0')*(a.s[j]-'0')+x[p+q]-'0'+c;
x[p+q] = sum%10+'0';
c = sum/10;
++q;
}
if (c > 0) x[p+q] += c;
++p;
}
while (x.size() > 1 and x.back() == '0') x.pop_back();
reverse(all(x));
return bignum(x);
}
};
namespace sub1 {
bool a[MASK(10)];
int cnt[2];
bool approved()
{
vector<char> vec;
for (char c : omega) vec.pb(c);
sort(all(vec));
vec.erase(unique(all(vec)),vec.end());
return n <= 10 and vec[0] == 'a' and vec[1] == 'b';
}
bool cmp(int x, int y)
{
FOR(i,0,n-1)
{
if ((BIT(x,i)) < (BIT(y,i))) return true;
if ((BIT(x,i)) > (BIT(y,i))) return false;
}
return false;
}
void solve(void)
{
FOR(mask,0,MASK(n)-1)
if (c_bit(mask) == k)
{
if (BIT(mask,0) or BIT(mask,n-1)) continue;
FOR(i,0,MASK(n)-1)
{
if (a[i]) continue;
cnt[0] = cnt[1] = 0;
a[i] = true;
FOR(j,0,n-1)
{
bool cur = BIT(i,j);
++cnt[cur];
if (BIT(mask,j))
{
if ((cnt[0]&1) and (cnt[1]&1))
{
a[i] = false;
break;
}
}
}
if ((cnt[0]&1) and (cnt[1]&1)) a[i] = false;
}
}
vi v;
FOD(i,MASK(n)-1,0)
if (a[i]) v.pb(i);
sort(all(v),cmp);
stringstream geek;
geek << t;
int x;
geek >> x;
FOR(i,0,n-1)
{
bool cnt = BIT(v[x-1],i);
cout << char('a'+cnt);
}
}
}
namespace sub2 {
int dp[12][10][1100];
vector<char> vec;
bool approved()
{
return n <= 10 and !k;
}
int ok(int x)
{
int ans = 0;
while (x) ans += x%2, x /= 2;
return ans;
}
void calc(int pos, int last, int state)
{
int &ans = dp[pos][last][state];
if (pos > n)
{
ans = (ok(state) <= 1);
return;
}
if (ans != -1) return;
ans = 0;
FOR(j,0,vec.size()-1)
{
calc(pos+1,j,state^MASK(j));
ans += dp[pos+1][j][state^MASK(j)];
}
}
void solve(void)
{
fill(dp,-1);
for (char c : omega) vec.pb(c);
sort(all(vec));
vec.erase(unique(all(vec)),vec.end());
calc(1,0,0);
stringstream geek;
geek << t;
int x;
geek >> x;
int state = 0;
FOR(i,1,n)
FOR(j,0,vec.size()-1)
if (dp[i+1][j][state^MASK(j)] < x)
x -= dp[i+1][j][state^MASK(j)];
else
{
cout << vec[j];
state ^= MASK(j);
break;
}
}
}
namespace sub3 {
bool approved()
{
vector<char> vec;
for (char c : omega) vec.pb(c);
sort(all(vec));
vec.erase(unique(all(vec)),vec.end());
return n <= 50 and !k and vec[0] == 'a' and vec[1] == 'b';
}
void solve(void)
{
stringstream geek;
geek << t;
int x;
geek >> x;
if (n&1)
{
x--;
FOD(i,n-1,0)
{
bool cur = BIT(x,i);
cout << char('a'+cur);
}
return;
}
int cnt = 0;
FOD(i,n-1,1)
{
if (x > MASK(i-1))
{
x -= MASK(i-1);
cout << 'b';
++cnt;
}
else cout << 'a';
}
cout << (cnt&1?'b':'a');
}
}
namespace sub4 {
bignum dp[52][6][MASK(5)];
int len;
bool approved()
{
return n <= 50 and !k;
}
int ok(int x)
{
int ans = 0;
while (x) ans += x%2, x /= 2;
return ans;
}
void calc(int pos, int last, int state)
{
auto &ans = dp[pos][last][state];
if (pos > n)
{
ans = bignum(ok(state) <= 1?"1":"0");
return;
}
if (ans != bignum("-1")) return;
ans = bignum("0");
FOR(j,0,len-1)
{
calc(pos+1,j,state^MASK(j));
ans = ans+dp[pos+1][j][state^MASK(j)];
}
}
void solve(void)
{
vector<char> vec;
for (char c : omega) vec.pb(c);
sort(all(vec));
vec.erase(unique(all(vec)),vec.end());
len = vec.size();
FOR(i,0,n)
FOR(j,0,len)
FOR(mask,0,MASK(len)-1) dp[i][j][mask] = bignum("-1");
calc(1,0,0);
bignum x = bignum(t);
int state = 0;
FOR(i,1,n)
FOR(j,0,len-1)
if (dp[i+1][j][state^MASK(j)] < x)
x = x-dp[i+1][j][state^MASK(j)];
else
{
cout << vec[j];
state ^= MASK(j);
break;
}
}
}
namespace sub5 {
bignum dp[52][6][52][MASK(5)];
int len;
int ok(int x)
{
int ans = 0;
while (x) ans += x%2, x /= 2;
return ans;
}
void calc(int pos, int last, int level, int state)
{
auto &ans = dp[pos][last][level][state];
if (pos > n)
{
ans = bignum(ok(state) <= 1 and level >= k+2?"1":"0");
return;
}
if (ans != bignum("-1")) return;
ans = bignum("0");
FOR(j,0,len-1)
{
calc(pos+1,j,level+(ok(state^MASK(j)) <= 1),state^MASK(j));
ans = ans+dp[pos+1][j][level+(ok(state^MASK(j)) <= 1)][state^MASK(j)];
}
}
void solve(void)
{
vector<char> vec;
for (char c : omega) vec.pb(c);
sort(all(vec));
vec.erase(unique(all(vec)),vec.end());
len = vec.size();
FOR(i,0,n)
FOR(j,0,len)
FOR(cur,0,n)
FOR(mask,0,MASK(len)-1) dp[i][j][cur][mask] = bignum("-1");
calc(1,0,0,0);
bignum x = bignum(t);
int state = 0, level = 0;
FOR(i,1,n)
FOR(j,0,len-1)
if (dp[i+1][j][level+(ok(state^MASK(j)) <= 1)][state^MASK(j)] < x)
x = x-dp[i+1][j][level+(ok(state^MASK(j)) <= 1)][state^MASK(j)];
else
{
cout << vec[j];
state ^= MASK(j);
level += (ok(state) <= 1);
break;
}
}
}
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n >> k >> omega >> t;
// if (sub1::approved()) return sub1::solve(), time(), 0;
// if (sub2::approved()) return sub2::solve(), time(), 0;
// if (sub3::approved()) return sub3::solve(), time(), 0;
// if (sub4::approved()) return sub4::solve(), time(), 0;
sub5::solve();
time();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjQtMTEtMzAgMjM6MDM6MTkKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjQtMTItMDEgMDA6MjM6MDMKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiUVBBTElOIgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIHRpbWUoKSBjZXJyIDw8IGVuZGwgPDwgIi0tLS0tLS0tLS0tLS1UaW1lOiIgPDwgMTAwMC4wICogY2xvY2soKSAvIENMT0NLU19QRVJfU0VDIDw8ICJtcy4iCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA8IHZhbCl7IHJlcyA9IHZhbDsgcmV0dXJuIHRydWU7IH07IHJldHVybiBmYWxzZTsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1pbmltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPiB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IHVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZSA8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsIDxUPiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKaW50IG4sazsKc3RyaW5nIG9tZWdhLHQ7CgpzdHJ1Y3QgYmlnbnVtIHsKCiAgICBzdHJpbmcgczsKCiAgICBiaWdudW0oKSB7CiAgICAgICAgdGhpcy0+cyA9ICIwIjsKICAgIH0KCiAgICBiaWdudW0oc3RyaW5nIGEpIHsKICAgICAgICBzID0gYTsKICAgIH0KCiAgICBiaWdudW0oaW50IGEpIHsKICAgICAgICBzID0gdG9fc3RyaW5nKGEpOwogICAgfQoKICAgIGZyaWVuZCBpc3RyZWFtICZvcGVyYXRvcj4+KGlzdHJlYW0gJmlzLCBiaWdudW0gJmEpIHsKICAgICAgICBpcyA+PiBhLnM7CiAgICAgICAgcmV0dXJuIGlzOwogICAgfQoKICAgIGZyaWVuZCBvc3RyZWFtICZvcGVyYXRvcjw8KG9zdHJlYW0gJm9zLCBjb25zdCBiaWdudW0gJmEpIHsKICAgICAgICBvcyA8PCBhLnM7CiAgICAgICAgcmV0dXJuIG9zOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGJpZ251bSAmYSkgY29uc3QgewogICAgICAgIGlmIChzeihzKSA8IHN6KGEucykpIHJldHVybiAxOwogICAgICAgIGlmIChzeihzKSA+IHN6KGEucykpIHJldHVybiAwOwogICAgICAgIHJldHVybiBzIDwgYS5zOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGJpZ251bSAmYSkgY29uc3QgewogICAgICAgIGlmIChzeihzKSA+IHN6KGEucykpIHJldHVybiAxOwogICAgICAgIGlmIChzeihzKSA8IHN6KGEucykpIHJldHVybiAwOwogICAgICAgIHJldHVybiBzID4gYS5zOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBiaWdudW0gJmEpIHsKICAgICAgICByZXR1cm4gcyA9PSBhLnM7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJpZ251bSAmYSkgewogICAgICAgIHJldHVybiBzICE9IGEuczsKICAgIH0KCiAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgYmlnbnVtICZhKSB7CiAgICAgICAgaWYgKHN6KHMpIDwgc3ooYS5zKSkgcmV0dXJuIDE7CiAgICAgICAgaWYgKHN6KHMpID4gc3ooYS5zKSkgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIHMgPD0gYS5zOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBiaWdudW0gJmEpIHsKICAgICAgICBpZiAoc3oocykgPiBzeihhLnMpKSByZXR1cm4gMTsKICAgICAgICBpZiAoc3oocykgPCBzeihhLnMpKSByZXR1cm4gMDsKICAgICAgICByZXR1cm4gcyA+PSBhLnM7CiAgICB9CgogICAgYmlnbnVtIG9wZXJhdG9yKyhjb25zdCBiaWdudW0gJmEpIHsKICAgICAgICBzdHJpbmcgeCA9ICIiOwogICAgICAgIGludCBtID0gcy5zaXplKCksIG4gPSBhLnMuc2l6ZSgpOwogICAgICAgIGludCBkID0gYWJzKG0tbiksIGMgPSAwOwogICAgICAgIEZPRChpLG1pbihuLG0pLTEsMCkgCiAgICAgICAgewogICAgICAgICAgICBpbnQgc3VtID0gYzsKICAgICAgICAgICAgaWYgKG0gPCBuKSBzdW0gKz0gc1tpXS0nMCcrYS5zW2krZF0tJzAnOwogICAgICAgICAgICBlbHNlIHN1bSArPSBzW2krZF0tJzAnK2Euc1tpXS0nMCc7CiAgICAgICAgICAgIHggKz0gc3VtJTEwKycwJzsKICAgICAgICAgICAgYyA9IHN1bS8xMDsKICAgICAgICB9CiAgICAgICAgaWYgKG0gPCBuKSAKICAgICAgICAgICAgRk9EKGksbi1tLTEsMCkgCiAgICAgICAgCXsKICAgICAgICAgICAgICAgIGludCBzdW0gPSAoKGEuc1tpXS0nMCcpK2MpOwogICAgICAgICAgICAgICAgeCArPSBzdW0lMTArJzAnOwogICAgICAgICAgICAgICAgYyA9IHN1bS8xMDsKICAgICAgICAgICAgfQogICAgICAgIGVsc2UgCiAgICAgICAgICAgIEZPRChpLG0tbi0xLDApIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgc3VtID0gKChzW2ldIC0gJzAnKSArIGMpOwogICAgICAgICAgICAgICAgeCArPSBzdW0lMTArJzAnOwogICAgICAgICAgICAgICAgYyA9IHN1bS8xMDsKICAgICAgICAgICAgfQogICAgICAgIGlmIChjKSB4ICs9IGMrJzAnOwogICAgICAgIHdoaWxlICh4LnNpemUoKSA+IDEgYW5kIHguYmFjaygpID09ICcwJykgeC5wb3BfYmFjaygpOwogICAgICAgIHJldmVyc2UoYWxsKHgpKTsKICAgICAgICByZXR1cm4gYmlnbnVtKHgpOwogICAgfQoKICAgIGJpZ251bSBvcGVyYXRvci0oY29uc3QgYmlnbnVtICZhKSB7CiAgICAgICAgc3RyaW5nIHggPSAiIjsKICAgICAgICBpbnQgbSA9IHMuc2l6ZSgpLCBuID0gYS5zLnNpemUoKTsKICAgICAgICBpbnQgZCA9IG0tbiwgYyA9IDA7CiAgICAgICAgRk9EKGksbi0xLDApCiAgICAgICAgewogICAgICAgICAgICBpbnQgc3ViID0gKChzW2krZF0tJzAnKS0oYS5zW2ldLScwJyktYyk7CiAgICAgICAgICAgIGlmIChzdWIgPCAwKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3ViICs9IDEwOwogICAgICAgICAgICAgICAgYyA9IDE7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGVsc2UgYyA9IDA7CiAgICAgICAgICAgIHggKz0gc3ViKycwJzsKICAgICAgICB9CiAgICAgICAgRk9EKGksbS1uLTEsMCkgCiAgICAgICAgewogICAgICAgICAgICBpZiAoc1tpXSA9PSAnMCcgYW5kIGMpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB4ICs9ICc5JzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBzdWIgPSAoKHNbaV0tJzAnKS1jKTsKICAgICAgICAgICAgaWYgKGkgPiAwIG9yIHN1YiA+IDApIHggKz0gc3ViICsgJzAnOwogICAgICAgICAgICBjID0gMDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHguc2l6ZSgpID4gMSBhbmQgeC5iYWNrKCkgPT0gJzAnKSB4LnBvcF9iYWNrKCk7CiAgICAgICAgcmV2ZXJzZShhbGwoeCkpOwogICAgICAgIHJldHVybiBiaWdudW0oeCk7CiAgICB9CgogICAgYmlnbnVtIG9wZXJhdG9yKihjb25zdCBiaWdudW0gJmEpIHsKICAgICAgICBpbnQgbSA9IHMuc2l6ZSgpLCBuID0gYS5zLnNpemUoKTsKICAgICAgICBzdHJpbmcgeChtK24sICcwJyk7CiAgICAgICAgaW50IHAgPSAwOwogICAgICAgIEZPRChpLG0tMSwwKSAKICAgICAgICB7CiAgICAgICAgICAgIGludCBjID0gMCwgcSA9IDA7CiAgICAgICAgICAgIEZPRChqLG4tMSwwKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHN1bSA9IChzW2ldLScwJykqKGEuc1tqXS0nMCcpK3hbcCtxXS0nMCcrYzsKICAgICAgICAgICAgICAgIHhbcCtxXSA9IHN1bSUxMCsnMCc7CiAgICAgICAgICAgICAgICBjID0gc3VtLzEwOwogICAgICAgICAgICAgICAgKytxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjID4gMCkgeFtwK3FdICs9IGM7CiAgICAgICAgICAgICsrcDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHguc2l6ZSgpID4gMSBhbmQgeC5iYWNrKCkgPT0gJzAnKSB4LnBvcF9iYWNrKCk7CiAgICAgICAgcmV2ZXJzZShhbGwoeCkpOwogICAgICAgIHJldHVybiBiaWdudW0oeCk7CiAgICB9Cn07CgpuYW1lc3BhY2Ugc3ViMSB7CgoJYm9vbCBhW01BU0soMTApXTsKCWludCBjbnRbMl07CgoJYm9vbCBhcHByb3ZlZCgpCgl7CgkJdmVjdG9yPGNoYXI+IHZlYzsKCQlmb3IgKGNoYXIgYyA6IG9tZWdhKSB2ZWMucGIoYyk7CgkJc29ydChhbGwodmVjKSk7CgkJdmVjLmVyYXNlKHVuaXF1ZShhbGwodmVjKSksdmVjLmVuZCgpKTsKCQlyZXR1cm4gbiA8PSAxMCBhbmQgdmVjWzBdID09ICdhJyBhbmQgdmVjWzFdID09ICdiJzsKCX0KCglib29sIGNtcChpbnQgeCwgaW50IHkpCgl7CgkJRk9SKGksMCxuLTEpCgkJewoJCQlpZiAoKEJJVCh4LGkpKSA8IChCSVQoeSxpKSkpIHJldHVybiB0cnVlOwoJCQlpZiAoKEJJVCh4LGkpKSA+IChCSVQoeSxpKSkpIHJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQlGT1IobWFzaywwLE1BU0sobiktMSkKCQkJaWYgKGNfYml0KG1hc2spID09IGspCgkJCXsKCQkJCWlmIChCSVQobWFzaywwKSBvciBCSVQobWFzayxuLTEpKSBjb250aW51ZTsKCQkJCUZPUihpLDAsTUFTSyhuKS0xKQoJCQkJewoJCQkJCWlmIChhW2ldKSBjb250aW51ZTsKCQkJCQljbnRbMF0gPSBjbnRbMV0gPSAwOwoJCQkJCWFbaV0gPSB0cnVlOwoJCQkJCUZPUihqLDAsbi0xKQoJCQkJCXsKCQkJCQkJYm9vbCBjdXIgPSBCSVQoaSxqKTsKCQkJCQkJKytjbnRbY3VyXTsKCQkJCQkJaWYgKEJJVChtYXNrLGopKQoJCQkJCQl7CgkJCQkJCQlpZiAoKGNudFswXSYxKSBhbmQgKGNudFsxXSYxKSkKCQkJCQkJCXsKCQkJCQkJCQlhW2ldID0gZmFsc2U7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKChjbnRbMF0mMSkgYW5kIChjbnRbMV0mMSkpIGFbaV0gPSBmYWxzZTsKCQkJCX0KCQkJfQoJCXZpIHY7CgkJRk9EKGksTUFTSyhuKS0xLDApCgkJCWlmIChhW2ldKSB2LnBiKGkpOwoJCXNvcnQoYWxsKHYpLGNtcCk7CgkJc3RyaW5nc3RyZWFtIGdlZWs7CgkJZ2VlayA8PCB0OwoJCWludCB4OwoJCWdlZWsgPj4geDsKCQlGT1IoaSwwLG4tMSkgCgkJewoJCQlib29sIGNudCA9IEJJVCh2W3gtMV0saSk7CgkJCWNvdXQgPDwgY2hhcignYScrY250KTsKCQl9Cgl9Cgp9CgpuYW1lc3BhY2Ugc3ViMiB7CgoJaW50IGRwWzEyXVsxMF1bMTEwMF07Cgl2ZWN0b3I8Y2hhcj4gdmVjOwoKCWJvb2wgYXBwcm92ZWQoKQoJewoJCXJldHVybiBuIDw9IDEwIGFuZCAhazsKCX0KCglpbnQgb2soaW50IHgpCgl7CgkJaW50IGFucyA9IDA7CgkJd2hpbGUgKHgpIGFucyArPSB4JTIsIHggLz0gMjsKCQlyZXR1cm4gYW5zOwoJfQoKCXZvaWQgY2FsYyhpbnQgcG9zLCBpbnQgbGFzdCwgaW50IHN0YXRlKQoJewoJCWludCAmYW5zID0gZHBbcG9zXVtsYXN0XVtzdGF0ZV07CgkJaWYgKHBvcyA+IG4pIAoJCXsKCQkJYW5zID0gKG9rKHN0YXRlKSA8PSAxKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoYW5zICE9IC0xKSByZXR1cm47CgkJYW5zID0gMDsKCQlGT1IoaiwwLHZlYy5zaXplKCktMSkgCgkJewoJCQljYWxjKHBvcysxLGosc3RhdGVeTUFTSyhqKSk7CgkJCWFucyArPSBkcFtwb3MrMV1bal1bc3RhdGVeTUFTSyhqKV07CgkJfQoJfQoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQlmaWxsKGRwLC0xKTsKCQlmb3IgKGNoYXIgYyA6IG9tZWdhKSB2ZWMucGIoYyk7CgkJc29ydChhbGwodmVjKSk7CgkJdmVjLmVyYXNlKHVuaXF1ZShhbGwodmVjKSksdmVjLmVuZCgpKTsKCQljYWxjKDEsMCwwKTsKCQlzdHJpbmdzdHJlYW0gZ2VlazsKCQlnZWVrIDw8IHQ7CgkJaW50IHg7CgkJZ2VlayA+PiB4OwkKCQlpbnQgc3RhdGUgPSAwOwoJCUZPUihpLDEsbikKCQkJRk9SKGosMCx2ZWMuc2l6ZSgpLTEpCgkJCQlpZiAoZHBbaSsxXVtqXVtzdGF0ZV5NQVNLKGopXSA8IHgpIAoJCQkJCXggLT0gZHBbaSsxXVtqXVtzdGF0ZV5NQVNLKGopXTsKCQkJCWVsc2UgCgkJCQl7CgkJCQkJY291dCA8PCB2ZWNbal07CgkJCQkJc3RhdGUgXj0gTUFTSyhqKTsKCQkJCQlicmVhazsKCQkJCX0KCX0KCQp9CgpuYW1lc3BhY2Ugc3ViMyB7CgoJYm9vbCBhcHByb3ZlZCgpCgl7CgkJdmVjdG9yPGNoYXI+IHZlYzsKCQlmb3IgKGNoYXIgYyA6IG9tZWdhKSB2ZWMucGIoYyk7CgkJc29ydChhbGwodmVjKSk7CgkJdmVjLmVyYXNlKHVuaXF1ZShhbGwodmVjKSksdmVjLmVuZCgpKTsKCQlyZXR1cm4gbiA8PSA1MCBhbmQgIWsgYW5kIHZlY1swXSA9PSAnYScgYW5kIHZlY1sxXSA9PSAnYic7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCXN0cmluZ3N0cmVhbSBnZWVrOwoJCWdlZWsgPDwgdDsKCQlpbnQgeDsKCQlnZWVrID4+IHg7CgkJaWYgKG4mMSkKCQl7CgkJCXgtLTsKCQkJRk9EKGksbi0xLDApIAoJCQl7CgkJCQlib29sIGN1ciA9IEJJVCh4LGkpOwoJCQkJY291dCA8PCBjaGFyKCdhJytjdXIpOwoJCQl9CgkJCXJldHVybjsKCQl9CgkJaW50IGNudCA9IDA7CgkJRk9EKGksbi0xLDEpCgkJewoJCQlpZiAoeCA+IE1BU0soaS0xKSkgCgkJCXsKCQkJCXggLT0gTUFTSyhpLTEpOwoJCQkJY291dCA8PCAnYic7CgkJCQkrK2NudDsKCQkJfQoJCQllbHNlIGNvdXQgPDwgJ2EnOwoJCX0KCQljb3V0IDw8IChjbnQmMT8nYic6J2EnKTsKCX0KCn0KCm5hbWVzcGFjZSBzdWI0IHsKCgliaWdudW0gZHBbNTJdWzZdW01BU0soNSldOwoJaW50IGxlbjsKCglib29sIGFwcHJvdmVkKCkKCXsKCQlyZXR1cm4gbiA8PSA1MCBhbmQgIWs7Cgl9CgoJaW50IG9rKGludCB4KQoJewoJCWludCBhbnMgPSAwOwoJCXdoaWxlICh4KSBhbnMgKz0geCUyLCB4IC89IDI7CgkJcmV0dXJuIGFuczsKCX0KCgl2b2lkIGNhbGMoaW50IHBvcywgaW50IGxhc3QsIGludCBzdGF0ZSkKCXsKCQlhdXRvICZhbnMgPSBkcFtwb3NdW2xhc3RdW3N0YXRlXTsKCQlpZiAocG9zID4gbikgCgkJewoJCQlhbnMgPSBiaWdudW0ob2soc3RhdGUpIDw9IDE/IjEiOiIwIik7CgkJCXJldHVybjsKCQl9CgkJaWYgKGFucyAhPSBiaWdudW0oIi0xIikpIHJldHVybjsKCQlhbnMgPSBiaWdudW0oIjAiKTsKCQlGT1IoaiwwLGxlbi0xKSAKCQl7CgkJCWNhbGMocG9zKzEsaixzdGF0ZV5NQVNLKGopKTsKCQkJYW5zID0gYW5zK2RwW3BvcysxXVtqXVtzdGF0ZV5NQVNLKGopXTsKCQl9Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCXZlY3RvcjxjaGFyPiB2ZWM7CgkJZm9yIChjaGFyIGMgOiBvbWVnYSkgdmVjLnBiKGMpOwoJCXNvcnQoYWxsKHZlYykpOwoJCXZlYy5lcmFzZSh1bmlxdWUoYWxsKHZlYykpLHZlYy5lbmQoKSk7CgkJbGVuID0gdmVjLnNpemUoKTsKCQlGT1IoaSwwLG4pCgkJCUZPUihqLDAsbGVuKQoJCQkJRk9SKG1hc2ssMCxNQVNLKGxlbiktMSkgZHBbaV1bal1bbWFza10gPSBiaWdudW0oIi0xIik7CgkJY2FsYygxLDAsMCk7CgkJYmlnbnVtIHggPSBiaWdudW0odCk7CQoJCWludCBzdGF0ZSA9IDA7CgkJRk9SKGksMSxuKQoJCQlGT1IoaiwwLGxlbi0xKQoJCQkJaWYgKGRwW2krMV1bal1bc3RhdGVeTUFTSyhqKV0gPCB4KSAKCQkJCQl4ID0geC1kcFtpKzFdW2pdW3N0YXRlXk1BU0soaildOwoJCQkJZWxzZSAKCQkJCXsKCQkJCQljb3V0IDw8IHZlY1tqXTsKCQkJCQlzdGF0ZSBePSBNQVNLKGopOwoJCQkJCWJyZWFrOwoJCQkJfQoJfQkKCn0KCm5hbWVzcGFjZSBzdWI1IHsKCgliaWdudW0gZHBbNTJdWzZdWzUyXVtNQVNLKDUpXTsKCWludCBsZW47CgoJaW50IG9rKGludCB4KQoJewoJCWludCBhbnMgPSAwOwoJCXdoaWxlICh4KSBhbnMgKz0geCUyLCB4IC89IDI7CgkJcmV0dXJuIGFuczsKCX0KCgl2b2lkIGNhbGMoaW50IHBvcywgaW50IGxhc3QsIGludCBsZXZlbCwgaW50IHN0YXRlKQoJewoJCWF1dG8gJmFucyA9IGRwW3Bvc11bbGFzdF1bbGV2ZWxdW3N0YXRlXTsKCQlpZiAocG9zID4gbikgCgkJewoJCQlhbnMgPSBiaWdudW0ob2soc3RhdGUpIDw9IDEgYW5kIGxldmVsID49IGsrMj8iMSI6IjAiKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoYW5zICE9IGJpZ251bSgiLTEiKSkgcmV0dXJuOwoJCWFucyA9IGJpZ251bSgiMCIpOwoJCUZPUihqLDAsbGVuLTEpIAoJCXsKCQkJY2FsYyhwb3MrMSxqLGxldmVsKyhvayhzdGF0ZV5NQVNLKGopKSA8PSAxKSxzdGF0ZV5NQVNLKGopKTsKCQkJYW5zID0gYW5zK2RwW3BvcysxXVtqXVtsZXZlbCsob2soc3RhdGVeTUFTSyhqKSkgPD0gMSldW3N0YXRlXk1BU0soaildOwoJCX0KCX0KCgl2b2lkIHNvbHZlKHZvaWQpCgl7CgkJdmVjdG9yPGNoYXI+IHZlYzsKCQlmb3IgKGNoYXIgYyA6IG9tZWdhKSB2ZWMucGIoYyk7CgkJc29ydChhbGwodmVjKSk7CgkJdmVjLmVyYXNlKHVuaXF1ZShhbGwodmVjKSksdmVjLmVuZCgpKTsKCQlsZW4gPSB2ZWMuc2l6ZSgpOwoJCUZPUihpLDAsbikKCQkJRk9SKGosMCxsZW4pCgkJCQlGT1IoY3VyLDAsbikKCQkJCQlGT1IobWFzaywwLE1BU0sobGVuKS0xKSBkcFtpXVtqXVtjdXJdW21hc2tdID0gYmlnbnVtKCItMSIpOwoJCWNhbGMoMSwwLDAsMCk7CgkJYmlnbnVtIHggPSBiaWdudW0odCk7CQoJCWludCBzdGF0ZSA9IDAsIGxldmVsID0gMDsKCQlGT1IoaSwxLG4pCgkJCUZPUihqLDAsbGVuLTEpCgkJCQlpZiAoZHBbaSsxXVtqXVtsZXZlbCsob2soc3RhdGVeTUFTSyhqKSkgPD0gMSldW3N0YXRlXk1BU0soaildIDwgeCkgCgkJCQkJeCA9IHgtZHBbaSsxXVtqXVtsZXZlbCsob2soc3RhdGVeTUFTSyhqKSkgPD0gMSldW3N0YXRlXk1BU0soaildOwoJCQkJZWxzZSAKCQkJCXsKCQkJCQljb3V0IDw8IHZlY1tqXTsKCQkJCQlzdGF0ZSBePSBNQVNLKGopOwoJCQkJCWxldmVsICs9IChvayhzdGF0ZSkgPD0gMSk7CgkJCQkJYnJlYWs7CgkJCQl9Cgl9CQoKfQoKc2lnbmVkIG1haW4oKQp7CiAgICBmYXN0OwogICAgaWYgKGZvcGVuKG5hbWUiLmlucCIsInIiKSkKICAgIHsKICAgIAlmcmVvcGVuKG5hbWUiLmlucCIsInIiLHN0ZGluKTsKICAgIAlmcmVvcGVuKG5hbWUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4gPj4gbiA+PiBrID4+IG9tZWdhID4+IHQ7CiAgICAvLyBpZiAoc3ViMTo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjE6OnNvbHZlKCksIHRpbWUoKSwgMDsKICAgIC8vIGlmIChzdWIyOjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMjo6c29sdmUoKSwgdGltZSgpLCAwOwogICAgLy8gaWYgKHN1YjM6OmFwcHJvdmVkKCkpIHJldHVybiBzdWIzOjpzb2x2ZSgpLCB0aW1lKCksIDA7CiAgICAvLyBpZiAoc3ViNDo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjQ6OnNvbHZlKCksIHRpbWUoKSwgMDsKICAgIHN1YjU6OnNvbHZlKCk7CiAgICB0aW1lKCk7CiAgICByZXR1cm4gMDsKfQovLyDilojilojilpEg4paI4paIICDiloggICAg4paI4paIICDilojilojilojiloQgICAg4paIICAg4paE4paI4paI4paI4paICi8v4paT4paI4paI4paRIOKWiOKWiOKWkiDilojiloggIOKWk+KWiOKWiOKWkiDilojilogg4paA4paIICAg4paIICDilojilojilpIg4paA4paI4paSCi8v4paS4paI4paI4paA4paA4paI4paI4paR4paT4paI4paIICDilpLilojilojilpHilpPilojiloggIOKWgOKWiCDilojilojilpLilpLilojilojilpHiloTiloTiloTilpEKLy/ilpHilpPilogg4paR4paI4paIIOKWk+KWk+KWiCAg4paR4paI4paI4paR4paT4paI4paI4paSICDilpDilozilojilojilpLilpHilpPiloggIOKWiOKWiOKWkwovL+KWkeKWk+KWiOKWkuKWkeKWiOKWiOKWk+KWkuKWkuKWiOKWiOKWiOKWiOKWiOKWkyDilpLilojilojilpEgICDilpPilojilojilpHilpHilpLilpPilojilojilojiloDilpIKLy8g4paSIOKWkeKWkeKWkuKWkeKWkuKWkeKWkuKWk+KWkiDilpIg4paSIOKWkSDilpLilpEgICDilpIg4paSICDilpHilpIgICDilpIKLy8g4paSIOKWkeKWkuKWkSDilpHilpHilpHilpLilpEg4paRIOKWkSDilpEg4paR4paRICAg4paRIOKWkuKWkSAg4paRICAg4paRCi8vIOKWkSAg4paR4paRIOKWkSDilpHilpHilpEg4paRIOKWkSAgICDilpEgICDilpEg4paRIOKWkSDilpEgICDilpEKLy8g4paRICDilpEgIOKWkSAgIOKWkSAgICAgICAgICAgICAg4paRICAgICAgIOKWkQo=