#include <bits/stdc++.h>
using namespace std;
typedef int64_t ll;
typedef pair<ll,ll> lll;
typedef pair<ll,int> lli;
typedef pair<int,int> ii;
#define EL printf("\n")
#define OK printf("OK")
#define pb push_back
#define mp make_pair
#define ep emplace_back
#define X first
#define Y second
#define fillchar(a,x) memset(a, x, sizeof(a))
#define FOR(i,l,r) for (int i=l;i<=r;i++)
#define FORD(i,r,l) for (int i=r;i>=l;i--)
const int base = 1e9;
typedef vector<int> BigInt;
void Set(BigInt &a) {
while (a.size() > 1 && a.back() == 0) a.pop_back();
}
void Print(BigInt a) {
Set(a);
printf("%d", (a.size() == 0) ? 0 : a.back());
FORD(i,a.size()-2,0) printf("%09d", a[i]); EL;
}
BigInt Integer(string s) {
BigInt ans;
if (s[0] == '-') return ans;
if (s.size() == 0) {ans.pb(0); return ans;}
while (s.size()%9 != 0) s = '0'+s;
for (int i=0;i<s.size();i+=9) {
int v = 0;
for (int j=i;j<i+9;j++) v = v*10+(s[j]-'0');
ans.insert(ans.begin(),v);
}
Set(ans);
return ans;
}
BigInt Integer(char c[]) {
string s = "";
FOR(i,0,strlen(c)-1) s = s + c[i];
return Integer(s);
}
BigInt Integer(ll x) {
string s = "";
while (x > 0) s = char(x%10+'0') + s, x /= 10;
return Integer(s);
}
BigInt Integer(int x) {
return Integer((ll) x);
}
void operator >> (istream &in, BigInt &a) {
string s;
getline(cin, s);
a = Integer(s);
}
void operator << (ostream &out, BigInt a) {
Print(a);
}
bool operator < (BigInt a, BigInt b) {
Set(a);
Set(b);
if (a.size() != b.size()) return (a.size() < b.size());
FORD(i,a.size()-1,0)
if (a[i] != b[i]) return (a[i] < b[i]);
return false;
}
bool operator > (BigInt a, BigInt b) {
return (b < a);
}
bool operator == (BigInt a, BigInt b) {
return (!(a < b) && !(b < a));
}
bool operator <= (BigInt a, BigInt b) {
return (a < b || a == b);
}
bool operator >= (BigInt a, BigInt b) {
return (b < a || b == a);
}
bool operator < (BigInt a, int b) {
return (a < Integer(b));
}
bool operator > (BigInt a, int b) {
return (a > Integer(b));
}
bool operator == (BigInt a, int b) {
return (a == Integer(b));
}
bool operator >= (BigInt a, int b) {
return (a >= Integer(b));
}
bool operator <= (BigInt a, int b) {
return (a <= Integer(b));
}
BigInt max(BigInt a, BigInt b) {
if (a > b) return a;
return b;
}
BigInt min(BigInt a, BigInt b) {
if (a < b) return a;
return b;
}
BigInt operator + (BigInt a, BigInt b) {
Set(a);
Set(b);
BigInt ans;
int carry = 0;
FOR(i,0,max(a.size(), b.size())-1) {
if (i < a.size()) carry += a[i];
if (i < b.size()) carry += b[i];
ans.pb(carry%base);
carry /= base;
}
if (carry) ans.pb(carry);
Set(ans);
return ans;
}
BigInt operator + (BigInt a, int b) {
return a + Integer(b);
}
BigInt operator ++ (BigInt &a) { // ++a
a = a + 1;
return a;
}
void operator += (BigInt &a, BigInt b) {
a = a + b;
}
void operator += (BigInt &a, int b) {
a = a + b;
}
BigInt operator - (BigInt a, BigInt b) {
Set(a);
Set(b);
BigInt ans;
int carry = 0;
FOR(i,0,a.size()-1) {
carry += a[i] - (i < b.size() ? b[i] : 0);
if (carry < 0) ans.pb(carry+base), carry = -1;
else ans.pb(carry), carry = 0;
}
Set(ans);
return ans;
}
BigInt operator - (BigInt a, int b) {
return a - Integer(b);
}
void operator -- (BigInt &a) { // --a
a = a - 1;
}
void operator -= (BigInt &a, BigInt b) {
a = a + b;
}
void operator -= (BigInt &a, int b) {
a = a - b;
}
BigInt operator * (BigInt a, BigInt b) {
Set(a);
Set(b);
BigInt ans;
ans.assign(a.size()+b.size(), 0);
FOR(i,0,a.size()-1) {
ll carry = 0ll;
for (int j=0;j<b.size() || carry > 0;j++) {
ll s = ans[i+j] + carry + (ll)a[i]*(j<b.size()?(ll)b[j]:0ll);
ans[i+j] = s%base;
carry = s/base;
}
}
Set(ans);
return ans;
}
BigInt operator * (BigInt a, int b) {
return a * Integer(b);
}
void operator *= (BigInt &a, BigInt b) {
a = a * b;
}
void operator *= (BigInt &a, int b) {
a = a * b;
}
BigInt operator / (BigInt a, BigInt b) {
Set(a);
Set(b);
if (b == Integer(0)) return Integer("-1");
BigInt ans, cur;
FORD(i,a.size()-1,0) {
cur.insert(cur.begin(), a[i]);
int x = 0, L = 0, R = base;
while (L <= R) {
int mid = (L+R)>>1;
if (b*Integer(mid) > cur) {
x = mid;
R = mid-1;
}
else
L = mid+1;
}
cur = cur - Integer(x-1)*b;
ans.insert(ans.begin(),x-1);
}
Set(ans);
return ans;
}
BigInt operator / (BigInt a, int b) {
Set(a);
BigInt ans;
ll cur = 0ll;
FORD(i,a.size()-1,0) {
cur = (cur*(ll)base + (ll)a[i]);
ans.insert(ans.begin(),cur/b);
cur %= b;
}
Set(ans);
return ans;
}
void operator /= (BigInt &a, BigInt b) {
a = a / b;
}
void operator /= (BigInt &a, int b) {
a = a / b;
}
BigInt operator % (BigInt a, BigInt b) {
Set(a);
Set(b);
if (b == Integer(0)) return Integer("-1");
BigInt ans;
FORD(i,a.size()-1,0) {
ans.insert(ans.begin(), a[i]);
int x = 0, L = 0, R = base;
while (L <= R) {
int mid = (L+R)>>1;
if (b*Integer(mid) > ans) {
x = mid;
R = mid-1;
}
else
L = mid+1;
}
ans = ans - Integer(x-1)*b;
}
Set(ans);
return ans;
}
int operator % (BigInt a, int b) {
Set(a);
if (b == 0) return -1;
int ans = 0;
FORD(i,a.size()-1,0)
ans = (ans*(base%b) + a[i]%b)%b;
return ans;
}
void operator %= (BigInt &a, BigInt b) {
a = a % b;
}
void operator %= (BigInt &a, int b) {
a = a % Integer(b);
}
BigInt gcd(BigInt a, BigInt b) {
Set(a);
Set(b);
while (b > Integer(0)) {
BigInt r = a%b;
a = b;
b = r;
}
Set(a);
return a;
}
BigInt lcm(BigInt a, BigInt b) {
return (a*b/gcd(a,b));
}
BigInt sqrt(BigInt a) {
BigInt x0 = a, x1 = (a+1)/2;
while (x1 < x0) {
x0 = x1;
x1 = (x1+a/x1)/2;
}
return x0;
}
BigInt pow(BigInt a, BigInt b) {
if (b == Integer(0)) return Integer(1);
BigInt tmp = pow(a, b/2);
if (b%2 == 0) return tmp * tmp;
return tmp * tmp * a;
}
BigInt pow(BigInt a, int b) {
return pow(a,(Integer(b)));
}
int log(int n, BigInt a) { // log_n(a)
Set(a);
int ans = 0;
while (a > Integer(1)) {
ans++;
a /= n;
}
return ans;
}
int main()
{
BigInt A;cin>>A;
BigInt B;cin>>B;
BigInt TempA=pow(A,B);
BigInt TempB=pow(B,A);
//cout<<TempA<<" "<<TempB<<endl;
Print(TempA - TempB);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBpbnQ2NF90IGxsOwp0eXBlZGVmIHBhaXI8bGwsbGw+IGxsbDsKdHlwZWRlZiBwYWlyPGxsLGludD4gbGxpOwp0eXBlZGVmIHBhaXI8aW50LGludD4gaWk7CgojZGVmaW5lIEVMIHByaW50ZigiXG4iKQojZGVmaW5lIE9LIHByaW50ZigiT0siKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGVwIGVtcGxhY2VfYmFjawojZGVmaW5lIFggIGZpcnN0CiNkZWZpbmUgWSAgc2Vjb25kCiNkZWZpbmUgZmlsbGNoYXIoYSx4KSBtZW1zZXQoYSwgeCwgc2l6ZW9mKGEpKQojZGVmaW5lIEZPUihpLGwscikgZm9yIChpbnQgaT1sO2k8PXI7aSsrKQojZGVmaW5lIEZPUkQoaSxyLGwpIGZvciAoaW50IGk9cjtpPj1sO2ktLSkKCmNvbnN0IGludCBiYXNlID0gMWU5Owp0eXBlZGVmIHZlY3RvcjxpbnQ+IEJpZ0ludDsKCnZvaWQgU2V0KEJpZ0ludCAmYSkgewogICAgd2hpbGUgKGEuc2l6ZSgpID4gMSAmJiBhLmJhY2soKSA9PSAwKSBhLnBvcF9iYWNrKCk7Cn0KCnZvaWQgUHJpbnQoQmlnSW50IGEpIHsKICAgIFNldChhKTsKICAgIHByaW50ZigiJWQiLCAoYS5zaXplKCkgPT0gMCkgPyAwIDogYS5iYWNrKCkpOwogICAgRk9SRChpLGEuc2l6ZSgpLTIsMCkgcHJpbnRmKCIlMDlkIiwgYVtpXSk7IEVMOwp9CgoKCkJpZ0ludCBJbnRlZ2VyKHN0cmluZyBzKSB7CiAgICBCaWdJbnQgYW5zOwogICAgaWYgKHNbMF0gPT0gJy0nKSByZXR1cm4gYW5zOwogICAgaWYgKHMuc2l6ZSgpID09IDApIHthbnMucGIoMCk7IHJldHVybiBhbnM7fQogICAgd2hpbGUgKHMuc2l6ZSgpJTkgIT0gMCkgcyA9ICcwJytzOwogICAgZm9yIChpbnQgaT0wO2k8cy5zaXplKCk7aSs9OSkgewogICAgICAgIGludCB2ID0gMDsKICAgICAgICBmb3IgKGludCBqPWk7ajxpKzk7aisrKSB2ID0gdioxMCsoc1tqXS0nMCcpOwogICAgICAgIGFucy5pbnNlcnQoYW5zLmJlZ2luKCksdik7CiAgICB9CiAgICBTZXQoYW5zKTsKICAgIHJldHVybiBhbnM7Cn0KCkJpZ0ludCBJbnRlZ2VyKGNoYXIgY1tdKSB7CiAgICBzdHJpbmcgcyA9ICIiOwogICAgRk9SKGksMCxzdHJsZW4oYyktMSkgcyA9IHMgKyBjW2ldOwogICAgcmV0dXJuIEludGVnZXIocyk7Cn0KCkJpZ0ludCBJbnRlZ2VyKGxsIHgpIHsKICAgIHN0cmluZyBzID0gIiI7CiAgICB3aGlsZSAoeCA+IDApIHMgPSBjaGFyKHglMTArJzAnKSArIHMsIHggLz0gMTA7CiAgICByZXR1cm4gSW50ZWdlcihzKTsKfQoKQmlnSW50IEludGVnZXIoaW50IHgpIHsKICAgIHJldHVybiBJbnRlZ2VyKChsbCkgeCk7Cn0KCgoKCnZvaWQgb3BlcmF0b3IgPj4gKGlzdHJlYW0gJmluLCBCaWdJbnQgJmEpIHsKICAgIHN0cmluZyBzOwogICAgZ2V0bGluZShjaW4sIHMpOwogICAgYSA9IEludGVnZXIocyk7Cn0KCnZvaWQgb3BlcmF0b3IgPDwgKG9zdHJlYW0gJm91dCwgQmlnSW50IGEpIHsKICAgIFByaW50KGEpOwp9CgoKCgpib29sIG9wZXJhdG9yIDwgKEJpZ0ludCBhLCBCaWdJbnQgYikgewogICAgU2V0KGEpOwogICAgU2V0KGIpOwogICAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6ZSgpKSByZXR1cm4gKGEuc2l6ZSgpIDwgYi5zaXplKCkpOwogICAgRk9SRChpLGEuc2l6ZSgpLTEsMCkKICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSByZXR1cm4gKGFbaV0gPCBiW2ldKTsKICAgIHJldHVybiBmYWxzZTsKfQoKYm9vbCBvcGVyYXRvciA+IChCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIHJldHVybiAoYiA8IGEpOwp9Cgpib29sIG9wZXJhdG9yID09IChCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIHJldHVybiAoIShhIDwgYikgJiYgIShiIDwgYSkpOwp9Cgpib29sIG9wZXJhdG9yIDw9IChCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIHJldHVybiAoYSA8IGIgfHwgYSA9PSBiKTsKfQoKYm9vbCBvcGVyYXRvciA+PSAoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICByZXR1cm4gKGIgPCBhIHx8IGIgPT0gYSk7Cn0KCmJvb2wgb3BlcmF0b3IgPCAoQmlnSW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gKGEgPCBJbnRlZ2VyKGIpKTsKfQoKYm9vbCBvcGVyYXRvciA+IChCaWdJbnQgYSwgaW50IGIpIHsKICAgIHJldHVybiAoYSA+IEludGVnZXIoYikpOwp9Cgpib29sIG9wZXJhdG9yID09IChCaWdJbnQgYSwgaW50IGIpIHsKICAgIHJldHVybiAoYSA9PSBJbnRlZ2VyKGIpKTsKfQoKYm9vbCBvcGVyYXRvciA+PSAoQmlnSW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gKGEgPj0gSW50ZWdlcihiKSk7Cn0KCmJvb2wgb3BlcmF0b3IgPD0gKEJpZ0ludCBhLCBpbnQgYikgewogICAgcmV0dXJuIChhIDw9IEludGVnZXIoYikpOwp9CgoKCkJpZ0ludCBtYXgoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBpZiAoYSA+IGIpIHJldHVybiBhOwogICAgcmV0dXJuIGI7Cn0KCkJpZ0ludCBtaW4oQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBpZiAoYSA8IGIpIHJldHVybiBhOwogICAgcmV0dXJuIGI7Cn0KCgoKCkJpZ0ludCBvcGVyYXRvciArIChCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIFNldChhKTsKICAgIFNldChiKTsKICAgIEJpZ0ludCBhbnM7CiAgICBpbnQgY2FycnkgPSAwOwogICAgRk9SKGksMCxtYXgoYS5zaXplKCksIGIuc2l6ZSgpKS0xKSB7CiAgICAgICAgaWYgKGkgPCBhLnNpemUoKSkgY2FycnkgKz0gYVtpXTsKICAgICAgICBpZiAoaSA8IGIuc2l6ZSgpKSBjYXJyeSArPSBiW2ldOwogICAgICAgIGFucy5wYihjYXJyeSViYXNlKTsKICAgICAgICBjYXJyeSAvPSBiYXNlOwogICAgfQogICAgaWYgKGNhcnJ5KSBhbnMucGIoY2FycnkpOwogICAgU2V0KGFucyk7CiAgICByZXR1cm4gYW5zOwp9CgpCaWdJbnQgb3BlcmF0b3IgKyAoQmlnSW50IGEsIGludCBiKSB7CiAgICByZXR1cm4gYSArIEludGVnZXIoYik7Cn0KCkJpZ0ludCBvcGVyYXRvciArKyAoQmlnSW50ICZhKSB7IC8vICsrYQogICAgYSA9IGEgKyAxOwogICAgcmV0dXJuIGE7Cn0KCnZvaWQgb3BlcmF0b3IgKz0gKEJpZ0ludCAmYSwgQmlnSW50IGIpIHsKICAgIGEgPSBhICsgYjsKfQoKdm9pZCBvcGVyYXRvciArPSAoQmlnSW50ICZhLCBpbnQgYikgewogICAgYSA9IGEgKyBiOwp9CgoKCgpCaWdJbnQgb3BlcmF0b3IgLSAoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBTZXQoYSk7CiAgICBTZXQoYik7CiAgICBCaWdJbnQgYW5zOwogICAgaW50IGNhcnJ5ID0gMDsKICAgIEZPUihpLDAsYS5zaXplKCktMSkgewogICAgICAgIGNhcnJ5ICs9IGFbaV0gLSAoaSA8IGIuc2l6ZSgpID8gYltpXSA6IDApOwogICAgICAgIGlmIChjYXJyeSA8IDApIGFucy5wYihjYXJyeStiYXNlKSwgY2FycnkgPSAtMTsKICAgICAgICBlbHNlIGFucy5wYihjYXJyeSksIGNhcnJ5ID0gMDsKICAgIH0KICAgIFNldChhbnMpOwogICAgcmV0dXJuIGFuczsKfQoKQmlnSW50IG9wZXJhdG9yIC0gKEJpZ0ludCBhLCBpbnQgYikgewogICAgcmV0dXJuIGEgLSBJbnRlZ2VyKGIpOwp9Cgp2b2lkIG9wZXJhdG9yIC0tIChCaWdJbnQgJmEpIHsgLy8gLS1hCiAgICBhID0gYSAtIDE7Cn0KCnZvaWQgb3BlcmF0b3IgLT0gKEJpZ0ludCAmYSwgQmlnSW50IGIpIHsKICAgIGEgPSBhICsgYjsKfQoKdm9pZCBvcGVyYXRvciAtPSAoQmlnSW50ICZhLCBpbnQgYikgewogICAgYSA9IGEgLSBiOwp9CgoKCgpCaWdJbnQgb3BlcmF0b3IgKiAoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBTZXQoYSk7CiAgICBTZXQoYik7CiAgICBCaWdJbnQgYW5zOwogICAgYW5zLmFzc2lnbihhLnNpemUoKStiLnNpemUoKSwgMCk7CiAgICBGT1IoaSwwLGEuc2l6ZSgpLTEpIHsKICAgICAgICBsbCBjYXJyeSA9IDBsbDsKICAgICAgICBmb3IgKGludCBqPTA7ajxiLnNpemUoKSB8fCBjYXJyeSA+IDA7aisrKSB7CiAgICAgICAgICAgIGxsIHMgPSBhbnNbaStqXSArIGNhcnJ5ICsgKGxsKWFbaV0qKGo8Yi5zaXplKCk/KGxsKWJbal06MGxsKTsKICAgICAgICAgICAgYW5zW2kral0gPSBzJWJhc2U7CiAgICAgICAgICAgIGNhcnJ5ID0gcy9iYXNlOwogICAgICAgIH0KICAgIH0KICAgIFNldChhbnMpOwogICAgcmV0dXJuIGFuczsKfQoKQmlnSW50IG9wZXJhdG9yICogKEJpZ0ludCBhLCBpbnQgYikgewogICAgcmV0dXJuIGEgKiBJbnRlZ2VyKGIpOwp9Cgp2b2lkIG9wZXJhdG9yICo9IChCaWdJbnQgJmEsIEJpZ0ludCBiKSB7CiAgICBhID0gYSAqIGI7Cn0KCnZvaWQgb3BlcmF0b3IgKj0gKEJpZ0ludCAmYSwgaW50IGIpIHsKICAgIGEgPSBhICogYjsKfQoKCgpCaWdJbnQgb3BlcmF0b3IgLyAoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBTZXQoYSk7CiAgICBTZXQoYik7CiAgICBpZiAoYiA9PSBJbnRlZ2VyKDApKSByZXR1cm4gSW50ZWdlcigiLTEiKTsKICAgIEJpZ0ludCBhbnMsIGN1cjsKICAgIEZPUkQoaSxhLnNpemUoKS0xLDApIHsKICAgICAgICBjdXIuaW5zZXJ0KGN1ci5iZWdpbigpLCBhW2ldKTsKICAgICAgICBpbnQgeCA9IDAsIEwgPSAwLCBSID0gYmFzZTsKICAgICAgICB3aGlsZSAoTCA8PSBSKSB7CiAgICAgICAgICAgIGludCBtaWQgPSAoTCtSKT4+MTsKICAgICAgICAgICAgaWYgKGIqSW50ZWdlcihtaWQpID4gY3VyKSB7CiAgICAgICAgICAgICAgICB4ID0gbWlkOwogICAgICAgICAgICAgICAgUiA9IG1pZC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIEwgPSBtaWQrMTsKICAgICAgICB9CiAgICAgICAgY3VyID0gY3VyIC0gSW50ZWdlcih4LTEpKmI7CiAgICAgICAgYW5zLmluc2VydChhbnMuYmVnaW4oKSx4LTEpOwogICAgfQogICAgU2V0KGFucyk7CiAgICByZXR1cm4gYW5zOwp9CgpCaWdJbnQgb3BlcmF0b3IgLyAoQmlnSW50IGEsIGludCBiKSB7CiAgICBTZXQoYSk7CiAgICBCaWdJbnQgYW5zOwogICAgbGwgY3VyID0gMGxsOwogICAgRk9SRChpLGEuc2l6ZSgpLTEsMCkgewogICAgICAgIGN1ciA9IChjdXIqKGxsKWJhc2UgKyAobGwpYVtpXSk7CiAgICAgICAgYW5zLmluc2VydChhbnMuYmVnaW4oKSxjdXIvYik7CiAgICAgICAgY3VyICU9IGI7CiAgICB9CiAgICBTZXQoYW5zKTsKICAgIHJldHVybiBhbnM7Cn0KCnZvaWQgb3BlcmF0b3IgLz0gKEJpZ0ludCAmYSwgQmlnSW50IGIpIHsKICAgIGEgPSBhIC8gYjsKfQoKdm9pZCBvcGVyYXRvciAvPSAoQmlnSW50ICZhLCBpbnQgYikgewogICAgYSA9IGEgLyBiOwp9CgoKCkJpZ0ludCBvcGVyYXRvciAlIChCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIFNldChhKTsKICAgIFNldChiKTsKICAgIGlmIChiID09IEludGVnZXIoMCkpIHJldHVybiBJbnRlZ2VyKCItMSIpOwogICAgQmlnSW50IGFuczsKICAgIEZPUkQoaSxhLnNpemUoKS0xLDApIHsKICAgICAgICBhbnMuaW5zZXJ0KGFucy5iZWdpbigpLCBhW2ldKTsKICAgICAgICBpbnQgeCA9IDAsIEwgPSAwLCBSID0gYmFzZTsKICAgICAgICB3aGlsZSAoTCA8PSBSKSB7CiAgICAgICAgICAgIGludCBtaWQgPSAoTCtSKT4+MTsKICAgICAgICAgICAgaWYgKGIqSW50ZWdlcihtaWQpID4gYW5zKSB7CiAgICAgICAgICAgICAgICB4ID0gbWlkOwogICAgICAgICAgICAgICAgUiA9IG1pZC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIEwgPSBtaWQrMTsKICAgICAgICB9CiAgICAgICAgYW5zID0gYW5zIC0gSW50ZWdlcih4LTEpKmI7CiAgICB9CiAgICBTZXQoYW5zKTsKICAgIHJldHVybiBhbnM7Cn0KCmludCBvcGVyYXRvciAlIChCaWdJbnQgYSwgaW50IGIpIHsKICAgIFNldChhKTsKICAgIGlmIChiID09IDApIHJldHVybiAtMTsKICAgIGludCBhbnMgPSAwOwogICAgRk9SRChpLGEuc2l6ZSgpLTEsMCkKICAgICAgICBhbnMgPSAoYW5zKihiYXNlJWIpICsgYVtpXSViKSViOwogICAgcmV0dXJuIGFuczsKfQoKdm9pZCBvcGVyYXRvciAlPSAoQmlnSW50ICZhLCBCaWdJbnQgYikgewogICAgYSA9IGEgJSBiOwp9Cgp2b2lkIG9wZXJhdG9yICU9IChCaWdJbnQgJmEsIGludCBiKSB7CiAgICBhID0gYSAlIEludGVnZXIoYik7Cn0KCkJpZ0ludCBnY2QoQmlnSW50IGEsIEJpZ0ludCBiKSB7CiAgICBTZXQoYSk7CiAgICBTZXQoYik7CiAgICB3aGlsZSAoYiA+IEludGVnZXIoMCkpIHsKICAgICAgICBCaWdJbnQgciA9IGElYjsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcjsKICAgIH0KICAgIFNldChhKTsKICAgIHJldHVybiBhOwp9CgpCaWdJbnQgbGNtKEJpZ0ludCBhLCBCaWdJbnQgYikgewogICAgcmV0dXJuIChhKmIvZ2NkKGEsYikpOwp9CgoKQmlnSW50IHNxcnQoQmlnSW50IGEpIHsKICAgIEJpZ0ludCB4MCA9IGEsIHgxID0gKGErMSkvMjsKICAgIHdoaWxlICh4MSA8IHgwKSB7CiAgICAgICAgeDAgPSB4MTsKICAgICAgICB4MSA9ICh4MSthL3gxKS8yOwogICAgfQogICAgcmV0dXJuIHgwOwp9CgoKQmlnSW50IHBvdyhCaWdJbnQgYSwgQmlnSW50IGIpIHsKICAgIGlmIChiID09IEludGVnZXIoMCkpIHJldHVybiBJbnRlZ2VyKDEpOwogICAgQmlnSW50IHRtcCA9IHBvdyhhLCBiLzIpOwogICAgaWYgKGIlMiA9PSAwKSByZXR1cm4gdG1wICogdG1wOwogICAgcmV0dXJuIHRtcCAqIHRtcCAqIGE7Cn0KCgpCaWdJbnQgcG93KEJpZ0ludCBhLCBpbnQgYikgewogICAgcmV0dXJuIHBvdyhhLChJbnRlZ2VyKGIpKSk7Cn0KCgppbnQgbG9nKGludCBuLCBCaWdJbnQgYSkgeyAvLyBsb2dfbihhKQogICAgU2V0KGEpOwogICAgaW50IGFucyA9IDA7CiAgICB3aGlsZSAoYSA+IEludGVnZXIoMSkpIHsKICAgICAgICBhbnMrKzsKICAgICAgICBhIC89IG47CiAgICB9CiAgICByZXR1cm4gYW5zOwp9CgoKaW50IG1haW4oKQp7CiAgICAKICAgIEJpZ0ludCBBO2Npbj4+QTsKICAgIEJpZ0ludCBCO2Npbj4+QjsKICAgIAogICAgQmlnSW50IFRlbXBBPXBvdyhBLEIpOwogICAgQmlnSW50IFRlbXBCPXBvdyhCLEEpOwogICAgLy9jb3V0PDxUZW1wQTw8IiAiPDxUZW1wQjw8ZW5kbDsKICAgIFByaW50KFRlbXBBIC0gVGVtcEIpOwogICAgcmV0dXJuIDA7Cn0=