#include <bits/stdc++.h>
#define sd(x) scanf("%lld",&x)
#define sd2(x,y) scanf("%lld%lld",&x,&y)
#define sd3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define foreach(it, v) for(__typeof((v).begin()) it=(v).begin(); it != (v).end(); ++it)
#define meta __FUNCTION__,__LINE__
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define __ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
template<typename S, typename T>
ostream& operator<<(ostream& out,pair<S,T> const& p){out<<'('<<p.fi<<", "<<p.se<<')';return out;}
template<typename T>
ostream& operator<<(ostream& out,vector<T> const& v){
ll l=v.size();for(ll i=0;i<l-1;i++)out<<v[i]<<' ';if(l>0)out<<v[l-1];return out;}
void tr(){cout << endl;}
template<typename S, typename ... Strings>
void tr(S x, const Strings&... rest){cout<<x<<' ';tr(rest...);}
const ll LOGN = 19;
const ll N = 1 << LOGN;
const ll INF = 1ll << 40;
ll n, q, A, B, P;
vector<ll> g[N];
ll c[N];
ll indx;
ll baseArray[N], chainHead[N], pos[N], chain[N], sz[N], chain_no;
ll p[LOGN][N], lvl[N];
int vis[N];
struct node{
ll cnt, maxval, lazy;
node(){
cnt = maxval = lazy = 0;
}
void assign(ll value){
lazy = 0;
maxval = value;
cnt = (maxval < P)? 1 : 0;
}
void update(ll value){
maxval += value, lazy += value;
}
void combine(node &left, node &right){
maxval = max(left.maxval, right.maxval) + lazy;
cnt = left.cnt + right.cnt;
}
} tree[2*N];
void build(ll id = 1, ll l = 0, ll r = n){
if(l+1 == r){
tree[id].assign(baseArray[l]);
return;
}
ll left = id << 1, right = left + 1, mid = (l + r) >> 1;
tree[id].lazy = 0;
build(left, l, mid); build(right, mid, r);
tree[id].combine(tree[left], tree[right]);
return;
}
void updateSegTree(ll x, ll y, ll val, ll id = 1, ll l = 0, ll r = n){
if(x >= r or l >= y or x >= y) return;
if(x <= l and r <= y){
tree[id].update(val);
return;
}
ll left = id << 1, right = left+1, mid = (l+r) >> 1;
updateSegTree(x, y, val, left, l, mid);
updateSegTree(x, y, val, right, mid, r);
tree[id].combine(tree[left], tree[right]);
}
void propagateSegTree(ll id, ll x, ll y, ll lazy){
if(tree[id].maxval + lazy < P or !tree[id].cnt){
tree[id].update(lazy);
return;
}
if(x+1 == y){
if(tree[id].maxval + lazy >= P) tree[id].maxval = -INF, tree[id].cnt = 0;
return;
}
lazy += tree[id].lazy;
tree[id].lazy = 0;
ll left = id << 1, right = left + 1, mid = (x+y) >> 1;
propagateSegTree(left, x, mid, lazy);
propagateSegTree(right, mid, y, lazy);
tree[id].combine(tree[left], tree[right]);
}
ll querySegTree(ll x, ll y, ll id = 1, ll l = 0, ll r = n, ll lazy = 0){
tree[id].update(lazy);
if(x >= r or l >= y or x >= y) return 0;
if(x <= l and r <= y){
propagateSegTree(id, l, r, 0);
return r - l - tree[id].cnt;
}
ll left = id << 1, right = left+1, mid = (l+r) >> 1;
lazy = tree[id].lazy;
tree[id].lazy = 0;
int ret = querySegTree(x, y, left, l, mid, lazy) + querySegTree(x, y, right, mid, r, lazy);
tree[id].combine(tree[left], tree[right]);
return ret;
}
void dfs(ll cur, ll prev){
vis[cur] = 1;
sz[cur] = 1;
foreach(it, g[cur]){
if(*it == prev) continue;
if(vis[*it]) continue;
lvl[*it] = lvl[cur] + 1;
p[0][*it] = cur;
dfs(*it, cur);
sz[cur] += sz[*it];
}
}
void heavyLightDecomposition(ll cur, ll prev){
chain[cur] = chain_no, pos[cur] = ++indx;
baseArray[indx] = c[cur];
ll heavy_child = -1, heavy_size = 0;
foreach(it, g[cur]){
if(*it == prev) continue;
if(sz[*it] > heavy_size){
heavy_size = sz[*it];
heavy_child = *it;
}
}
if(heavy_child != -1) heavyLightDecomposition(heavy_child, cur);
foreach(it, g[cur]){
if(*it == prev or *it == heavy_child) continue;
chain_no++;
chainHead[chain_no] = *it;
heavyLightDecomposition(*it, cur);
}
}
void preprocess(){
for(ll i = 1; i < LOGN; i++)
for(ll j = 1; j <= n; j++)
p[i][j] = p[i-1][p[i-1][j]];
}
ll LCA(ll x, ll y){
if(lvl[x] < lvl[y]) swap(x,y);
ll tmp = 1; while((1 << tmp) <= lvl[x]) tmp++; tmp--;
for(ll i = tmp; i >= 0; i--) if(lvl[x] - (1<<i) >= lvl[y]) x = p[i][x];
if(x == y) return y;
for(ll i = tmp; i >= 0; i--) if(p[i][x] > 0 and p[i][x] != p[i][y]) x = p[i][x], y = p[i][y];
return p[0][x];
}
void chainUpdate(ll x, ll y, ll w, ll flag){
while(true){
if(chain[x] == chain[y]){
updateSegTree(pos[y]+flag, pos[x]+1, w);
return;
}
ll head = chainHead[chain[x]];
updateSegTree(pos[head], pos[x]+1, w);
x = p[0][head];
}
}
ll chainQuery(ll x, ll y, ll flag){
ll total = 0;
while(true){
if(chain[x] == chain[y]){
total += querySegTree(pos[y]+flag, pos[x]+1);
return total;
}
ll head = chainHead[chain[x]];
total += querySegTree(pos[head], pos[x]+1);
x = p[0][head];
}
}
void update(ll u, ll v, ll w){
ll lca = LCA(u,v);
assert(lca > 0 and lca <= n);
chainUpdate(u, lca, w, 0);
chainUpdate(v, lca, w, 1);
}
ll query(ll u, ll v){
ll lca = LCA(u,v);
assert(lca > 0 and lca <= n);
return chainQuery(u, lca, 0) + chainQuery(v, lca, 1);
}
void solve(){
sd2(n,q); sd2(A,B);
if(A == 0)
P = (B >= 0)? -INF: INF;
else
P = (B < 0)? ceil((-1.0*B)/A): (-B)/A;
for(ll i = 1; i <= n; i++) sd(c[i]);
for(int i = 0; i <= 3*n; i++){
tree[i] = *(new node);
}
for(int i = 0; i <= n; i++){
g[i].clear();
sz[i] = 0;
lvl[i] = 0;
vis[i] = 0;
for(int j = 0; j < LOGN; j++) p[j][i] = 0;
}
for(ll i = 1; i < n; i++){
ll u, v; sd2(u,v);
g[u].pb(v);
g[v].pb(u);
}
lvl[1] = 0;
for(int j = 0; j < LOGN; j++){
p[j][1] = 1;
}
dfs(1,-1);
chain_no = 1, indx = -1, chainHead[1] = 1;
heavyLightDecomposition(1,-1);
preprocess();
build();
ll type, u, v, w;
while(q--){
sd3(type,u,v);
if(type == 1){
sd(w);
update(u,v,w);
}
else{
int res = query(u,v);
assert(res >= 0 and res <= n);
printf("%lld\n", res);
}
}
}
int main(){
ll t; sd(t);
while(t--) solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIHNkKHgpIHNjYW5mKCIlbGxkIiwmeCkKI2RlZmluZSBzZDIoeCx5KSBzY2FuZigiJWxsZCVsbGQiLCZ4LCZ5KQojZGVmaW5lIHNkMyh4LHkseikgc2NhbmYoIiVsbGQlbGxkJWxsZCIsJngsJnksJnopCgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgZm9yZWFjaChpdCwgdikgZm9yKF9fdHlwZW9mKCh2KS5iZWdpbigpKSBpdD0odikuYmVnaW4oKTsgaXQgIT0gKHYpLmVuZCgpOyArK2l0KQojZGVmaW5lIG1ldGEgX19GVU5DVElPTl9fLF9fTElORV9fCgojZGVmaW5lIF8gaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Y2luLnRpZShOVUxMKTtjb3V0LnRpZShOVUxMKTsKI2RlZmluZSBfXyBmcmVvcGVuKCJpbnB1dC50eHQiLCJyIixzdGRpbik7ZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxsbCxsbD4gcGlpOwoKdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4gCm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LHBhaXI8UyxUPiBjb25zdCYgcCl7b3V0PDwnKCc8PHAuZmk8PCIsICI8PHAuc2U8PCcpJztyZXR1cm4gb3V0O30KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LHZlY3RvcjxUPiBjb25zdCYgdil7CmxsIGw9di5zaXplKCk7Zm9yKGxsIGk9MDtpPGwtMTtpKyspb3V0PDx2W2ldPDwnICc7aWYobD4wKW91dDw8dltsLTFdO3JldHVybiBvdXQ7fQoKdm9pZCB0cigpe2NvdXQgPDwgZW5kbDt9CnRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIC4uLiBTdHJpbmdzPgp2b2lkIHRyKFMgeCwgY29uc3QgU3RyaW5ncyYuLi4gcmVzdCl7Y291dDw8eDw8JyAnO3RyKHJlc3QuLi4pO30KCmNvbnN0IGxsIExPR04gPSAxOTsKY29uc3QgbGwgTiA9IDEgPDwgTE9HTjsKY29uc3QgbGwgSU5GID0gMWxsIDw8IDQwOwoKbGwgbiwgcSwgQSwgQiwgUDsKCnZlY3RvcjxsbD4gZ1tOXTsKbGwgY1tOXTsKCmxsIGluZHg7CmxsIGJhc2VBcnJheVtOXSwgY2hhaW5IZWFkW05dLCBwb3NbTl0sIGNoYWluW05dLCBzeltOXSwgY2hhaW5fbm87CmxsIHBbTE9HTl1bTl0sIGx2bFtOXTsKCmludCB2aXNbTl07CgpzdHJ1Y3Qgbm9kZXsKCWxsIGNudCwgbWF4dmFsLCBsYXp5OwoJCglub2RlKCl7CgkJY250ID0gbWF4dmFsID0gbGF6eSA9IDA7Cgl9CgkKCXZvaWQgYXNzaWduKGxsIHZhbHVlKXsKCQlsYXp5ID0gMDsKCQltYXh2YWwgPSB2YWx1ZTsKCQljbnQgPSAobWF4dmFsIDwgUCk/IDEgOiAwOwoJfQoJCgl2b2lkIHVwZGF0ZShsbCB2YWx1ZSl7CgkJbWF4dmFsICs9IHZhbHVlLCBsYXp5ICs9IHZhbHVlOwoJfQoJCgl2b2lkIGNvbWJpbmUobm9kZSAmbGVmdCwgbm9kZSAmcmlnaHQpewoJCW1heHZhbCA9IG1heChsZWZ0Lm1heHZhbCwgcmlnaHQubWF4dmFsKSArIGxhenk7CgkJY250ID0gbGVmdC5jbnQgKyByaWdodC5jbnQ7Cgl9CgkKfSB0cmVlWzIqTl07Cgp2b2lkIGJ1aWxkKGxsIGlkID0gMSwgbGwgbCA9IDAsIGxsIHIgPSBuKXsKCWlmKGwrMSA9PSByKXsKCQl0cmVlW2lkXS5hc3NpZ24oYmFzZUFycmF5W2xdKTsKCQlyZXR1cm47Cgl9CgkKCWxsIGxlZnQgPSBpZCA8PCAxLCByaWdodCA9IGxlZnQgKyAxLCBtaWQgPSAobCArIHIpID4+IDE7CgoJdHJlZVtpZF0ubGF6eSA9IDA7CQoJYnVpbGQobGVmdCwgbCwgbWlkKTsgYnVpbGQocmlnaHQsIG1pZCwgcik7CgkKCXRyZWVbaWRdLmNvbWJpbmUodHJlZVtsZWZ0XSwgdHJlZVtyaWdodF0pOwoJcmV0dXJuOwp9Cgp2b2lkIHVwZGF0ZVNlZ1RyZWUobGwgeCwgbGwgeSwgbGwgdmFsLCBsbCBpZCA9IDEsIGxsIGwgPSAwLCBsbCByID0gbil7CglpZih4ID49IHIgb3IgbCA+PSB5IG9yIHggPj0geSkgcmV0dXJuOwoJaWYoeCA8PSBsIGFuZCByIDw9IHkpewoJCXRyZWVbaWRdLnVwZGF0ZSh2YWwpOwoJCXJldHVybjsKCX0KCQoJbGwgbGVmdCA9IGlkIDw8IDEsIHJpZ2h0ID0gbGVmdCsxLCBtaWQgPSAobCtyKSA+PiAxOwoJCgl1cGRhdGVTZWdUcmVlKHgsIHksIHZhbCwgbGVmdCwgbCwgbWlkKTsgCgl1cGRhdGVTZWdUcmVlKHgsIHksIHZhbCwgcmlnaHQsIG1pZCwgcik7CgkKCXRyZWVbaWRdLmNvbWJpbmUodHJlZVtsZWZ0XSwgdHJlZVtyaWdodF0pOwp9Cgp2b2lkIHByb3BhZ2F0ZVNlZ1RyZWUobGwgaWQsIGxsIHgsIGxsIHksIGxsIGxhenkpewoJaWYodHJlZVtpZF0ubWF4dmFsICsgbGF6eSA8IFAgb3IgIXRyZWVbaWRdLmNudCl7CgkJdHJlZVtpZF0udXBkYXRlKGxhenkpOwoJCXJldHVybjsKCX0KCQoJaWYoeCsxID09IHkpewoJCWlmKHRyZWVbaWRdLm1heHZhbCArIGxhenkgPj0gUCkgdHJlZVtpZF0ubWF4dmFsID0gLUlORiwgdHJlZVtpZF0uY250ID0gMDsKCQlyZXR1cm47Cgl9CgkKCWxhenkgKz0gdHJlZVtpZF0ubGF6eTsKCXRyZWVbaWRdLmxhenkgPSAwOwoJCglsbCBsZWZ0ID0gaWQgPDwgMSwgcmlnaHQgPSBsZWZ0ICsgMSwgbWlkID0gKHgreSkgPj4gMTsKCglwcm9wYWdhdGVTZWdUcmVlKGxlZnQsIHgsIG1pZCwgbGF6eSk7Cglwcm9wYWdhdGVTZWdUcmVlKHJpZ2h0LCBtaWQsIHksIGxhenkpOwoJCgl0cmVlW2lkXS5jb21iaW5lKHRyZWVbbGVmdF0sIHRyZWVbcmlnaHRdKTsKfQoKbGwgcXVlcnlTZWdUcmVlKGxsIHgsIGxsIHksIGxsIGlkID0gMSwgbGwgbCA9IDAsIGxsIHIgPSBuLCBsbCBsYXp5ID0gMCl7Cgl0cmVlW2lkXS51cGRhdGUobGF6eSk7CglpZih4ID49IHIgb3IgbCA+PSB5IG9yIHggPj0geSkgcmV0dXJuIDA7CgkKCWlmKHggPD0gbCBhbmQgciA8PSB5KXsKCQlwcm9wYWdhdGVTZWdUcmVlKGlkLCBsLCByLCAwKTsKCQlyZXR1cm4gciAtIGwgLSB0cmVlW2lkXS5jbnQ7Cgl9CgkKCWxsIGxlZnQgPSBpZCA8PCAxLCByaWdodCA9IGxlZnQrMSwgbWlkID0gKGwrcikgPj4gMTsKCQoJbGF6eSA9IHRyZWVbaWRdLmxhenk7Cgl0cmVlW2lkXS5sYXp5ID0gMDsKCQoJaW50IHJldCA9IHF1ZXJ5U2VnVHJlZSh4LCB5LCBsZWZ0LCBsLCBtaWQsIGxhenkpICsgcXVlcnlTZWdUcmVlKHgsIHksIHJpZ2h0LCBtaWQsIHIsIGxhenkpOwoJdHJlZVtpZF0uY29tYmluZSh0cmVlW2xlZnRdLCB0cmVlW3JpZ2h0XSk7CglyZXR1cm4gcmV0Owp9Cgp2b2lkIGRmcyhsbCBjdXIsIGxsIHByZXYpewoJdmlzW2N1cl0gPSAxOwoJc3pbY3VyXSA9IDE7Cglmb3JlYWNoKGl0LCBnW2N1cl0pewoJCWlmKCppdCA9PSBwcmV2KSBjb250aW51ZTsKCQlpZih2aXNbKml0XSkgY29udGludWU7CgkJCgkJbHZsWyppdF0gPSBsdmxbY3VyXSArIDE7CgkJcFswXVsqaXRdID0gY3VyOwoJCQoJCWRmcygqaXQsIGN1cik7CgkJc3pbY3VyXSArPSBzelsqaXRdOwoJfQp9Cgp2b2lkIGhlYXZ5TGlnaHREZWNvbXBvc2l0aW9uKGxsIGN1ciwgbGwgcHJldil7CgljaGFpbltjdXJdID0gY2hhaW5fbm8sIHBvc1tjdXJdID0gKytpbmR4OwoJYmFzZUFycmF5W2luZHhdID0gY1tjdXJdOwoJCglsbCBoZWF2eV9jaGlsZCA9IC0xLCBoZWF2eV9zaXplID0gMDsKCWZvcmVhY2goaXQsIGdbY3VyXSl7CgkJaWYoKml0ID09IHByZXYpIGNvbnRpbnVlOwoJCQoJCWlmKHN6WyppdF0gPiBoZWF2eV9zaXplKXsKCQkJaGVhdnlfc2l6ZSA9IHN6WyppdF07CgkJCWhlYXZ5X2NoaWxkID0gKml0OwoJCX0KCX0KCQoJaWYoaGVhdnlfY2hpbGQgIT0gLTEpIGhlYXZ5TGlnaHREZWNvbXBvc2l0aW9uKGhlYXZ5X2NoaWxkLCBjdXIpOwoKCWZvcmVhY2goaXQsIGdbY3VyXSl7CgkJaWYoKml0ID09IHByZXYgb3IgKml0ID09IGhlYXZ5X2NoaWxkKSBjb250aW51ZTsKCgkJY2hhaW5fbm8rKzsKCQljaGFpbkhlYWRbY2hhaW5fbm9dID0gKml0OwoJCWhlYXZ5TGlnaHREZWNvbXBvc2l0aW9uKCppdCwgY3VyKTsKCX0JCn0KCnZvaWQgcHJlcHJvY2VzcygpewoJZm9yKGxsIGkgPSAxOyBpIDwgTE9HTjsgaSsrKQoJCWZvcihsbCBqID0gMTsgaiA8PSBuOyBqKyspCgkJCXBbaV1bal0gPSBwW2ktMV1bcFtpLTFdW2pdXTsKfQoKbGwgTENBKGxsIHgsIGxsIHkpewoJaWYobHZsW3hdIDwgbHZsW3ldKSBzd2FwKHgseSk7CgkKCWxsIHRtcCA9IDE7IHdoaWxlKCgxIDw8IHRtcCkgPD0gbHZsW3hdKSB0bXArKzsgdG1wLS07CgkKCWZvcihsbCBpID0gdG1wOyBpID49IDA7IGktLSkgaWYobHZsW3hdIC0gKDE8PGkpID49IGx2bFt5XSkgeCA9IHBbaV1beF07CglpZih4ID09IHkpIHJldHVybiB5OwoJCglmb3IobGwgaSA9IHRtcDsgaSA+PSAwOyBpLS0pIGlmKHBbaV1beF0gPiAwIGFuZCBwW2ldW3hdICE9IHBbaV1beV0pIHggPSBwW2ldW3hdLCB5ID0gcFtpXVt5XTsKCXJldHVybiBwWzBdW3hdOwp9Cgp2b2lkIGNoYWluVXBkYXRlKGxsIHgsIGxsIHksIGxsIHcsIGxsIGZsYWcpewoJd2hpbGUodHJ1ZSl7CgkJaWYoY2hhaW5beF0gPT0gY2hhaW5beV0pewoJCQl1cGRhdGVTZWdUcmVlKHBvc1t5XStmbGFnLCBwb3NbeF0rMSwgdyk7CgkJCXJldHVybjsKCQl9CgkJCgkJbGwgaGVhZCA9IGNoYWluSGVhZFtjaGFpblt4XV07CgkJdXBkYXRlU2VnVHJlZShwb3NbaGVhZF0sIHBvc1t4XSsxLCB3KTsKCQl4ID0gcFswXVtoZWFkXTsKCX0KfQoKbGwgY2hhaW5RdWVyeShsbCB4LCBsbCB5LCBsbCBmbGFnKXsKCWxsIHRvdGFsID0gMDsKCXdoaWxlKHRydWUpewoJCWlmKGNoYWluW3hdID09IGNoYWluW3ldKXsKCQkJdG90YWwgKz0gcXVlcnlTZWdUcmVlKHBvc1t5XStmbGFnLCBwb3NbeF0rMSk7CgkJCXJldHVybiB0b3RhbDsKCQl9CgkJCgkJbGwgaGVhZCA9IGNoYWluSGVhZFtjaGFpblt4XV07CgkJdG90YWwgKz0gcXVlcnlTZWdUcmVlKHBvc1toZWFkXSwgcG9zW3hdKzEpOwoJCXggPSBwWzBdW2hlYWRdOwoJfQp9Cgp2b2lkIHVwZGF0ZShsbCB1LCBsbCB2LCBsbCB3KXsKCWxsIGxjYSA9IExDQSh1LHYpOwoJYXNzZXJ0KGxjYSA+IDAgYW5kIGxjYSA8PSBuKTsKCWNoYWluVXBkYXRlKHUsIGxjYSwgdywgMCk7CgljaGFpblVwZGF0ZSh2LCBsY2EsIHcsIDEpOwp9CgpsbCBxdWVyeShsbCB1LCBsbCB2KXsKCWxsIGxjYSA9IExDQSh1LHYpOwoJYXNzZXJ0KGxjYSA+IDAgYW5kIGxjYSA8PSBuKTsKCXJldHVybiBjaGFpblF1ZXJ5KHUsIGxjYSwgMCkgKyBjaGFpblF1ZXJ5KHYsIGxjYSwgMSk7Cn0KCnZvaWQgc29sdmUoKXsKCXNkMihuLHEpOyBzZDIoQSxCKTsKCQoJaWYoQSA9PSAwKQoJCVAgPSAoQiA+PSAwKT8gLUlORjogSU5GOwoJZWxzZQoJCVAgPSAoQiA8IDApPyBjZWlsKCgtMS4wKkIpL0EpOiAoLUIpL0E7CgkKCWZvcihsbCBpID0gMTsgaSA8PSBuOyBpKyspIHNkKGNbaV0pOwoJZm9yKGludCBpID0gMDsgaSA8PSAzKm47IGkrKyl7CgkJdHJlZVtpXSA9ICoobmV3IG5vZGUpOwoJfQoJCglmb3IoaW50IGkgPSAwOyBpIDw9IG47IGkrKyl7CgkJZ1tpXS5jbGVhcigpOwoJCXN6W2ldID0gMDsKCQlsdmxbaV0gPSAwOwoJCXZpc1tpXSA9IDA7CgkJZm9yKGludCBqID0gMDsgaiA8IExPR047IGorKykgcFtqXVtpXSA9IDA7Cgl9CgkKCWZvcihsbCBpID0gMTsgaSA8IG47IGkrKyl7CgkJbGwgdSwgdjsgc2QyKHUsdik7CgkJZ1t1XS5wYih2KTsKCQlnW3ZdLnBiKHUpOwoJfQoJCglsdmxbMV0gPSAwOwoJZm9yKGludCBqID0gMDsgaiA8IExPR047IGorKyl7CgkJcFtqXVsxXSA9IDE7CQoJfQoJCglkZnMoMSwtMSk7CgkKCWNoYWluX25vID0gMSwgaW5keCA9IC0xLCBjaGFpbkhlYWRbMV0gPSAxOwoJaGVhdnlMaWdodERlY29tcG9zaXRpb24oMSwtMSk7CgkKCXByZXByb2Nlc3MoKTsKCWJ1aWxkKCk7CgkKCWxsIHR5cGUsIHUsIHYsIHc7Cgl3aGlsZShxLS0pewoJCXNkMyh0eXBlLHUsdik7CgkJaWYodHlwZSA9PSAxKXsKCQkJc2Qodyk7CgkJCXVwZGF0ZSh1LHYsdyk7CgkJfQoJCWVsc2V7CgkJCWludCByZXMgPSBxdWVyeSh1LHYpOwoJCQlhc3NlcnQocmVzID49IDAgYW5kIHJlcyA8PSBuKTsKCQkJcHJpbnRmKCIlbGxkXG4iLCByZXMpOwoJCX0KCX0KfQoKaW50IG1haW4oKXsKCWxsIHQ7IHNkKHQpOwoJd2hpbGUodC0tKSBzb2x2ZSgpOwoJcmV0dXJuIDA7Cn0=