#pragma GCC optimize("-O3","-funroll-all-loops","-ffast-math")
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
#include <assert.h>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define fe first
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
#define SZ 666666
int T,n,m,ea[SZ],eb[SZ],ec[SZ];
#define M M_
int M=0,fst[SZ],vb[SZ],nxt[SZ];
void ad_de(int a,int b)
{++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}
void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#undef M
char s[SZ];
int sz[SZ],son[SZ],dep[SZ],fa[SZ];
const int M=262144;
int ls[SZ],rs[SZ],ss[SZ];
#define CL(x) memset(x,0,sizeof x)
namespace Seg
{
bool tk[SZ];
int ta[SZ],mi[SZ],mc[SZ];
ll su[SZ],ms[SZ],tb[SZ];
inline void clr()
{
CL(mi); CL(su);
CL(ms); CL(tb); CL(ta);
for(int i=0;i<SZ;++i) tk[i]=1,mi[i]=1e9;
}
inline void pd(int x)
{
if(ta[x]||tb[x]||tk[x]!=1);
else return;
mi[x]+=ta[x]; su[x]-=ms[x];
ms[x]=ms[x]*tk[x]+mc[x]*tb[x];
su[x]+=ms[x];
if(x<=M)
{
ta[x+x]+=ta[x],ta[x+x+1]+=ta[x];
int u=min(mi[x+x],mi[x+x+1]);
if(mi[x+x]==u)
{
tk[x+x]&=tk[x];
tb[x+x]=tb[x+x]*tk[x]+tb[x];
}
if(mi[x+x+1]==u)
{
tk[x+x+1]&=tk[x];
tb[x+x+1]=tb[x+x+1]*tk[x]+tb[x];
}
}
ta[x]=tb[x]=0; tk[x]=1;
}
inline void upd(int x)
{
pd(x+x); pd(x+x+1);
su[x]=su[x+x]+su[x+x+1];
if(mi[x+x]<mi[x+x+1])
mi[x]=mi[x+x],mc[x]=mc[x+x],ms[x]=ms[x+x];
else if(mi[x+x]>mi[x+x+1])
mi[x]=mi[x+x+1],mc[x]=mc[x+x+1],ms[x]=ms[x+x+1];
else mi[x]=mi[x+x],
mc[x]=mc[x+x]+mc[x+x+1],
ms[x]=ms[x+x]+ms[x+x+1];
// mi[x]=min(mi[x+x],mi[x+x+1]); mc[x]=ms[x]=0;
// if(mi[x]==mi[x+x]) mc[x]+=mc[x+x],ms[x]+=ms[x+x];
// if(mi[x]==mi[x+x+1]) mc[x]+=mc[x+x+1],ms[x]+=ms[x+x+1];
}
inline void add(int x,int ql,int qr,int v)
{
if(ql>qr||rs[x]<ql||qr<ls[x]) return;
pd(x);
if(ql<=ls[x]&&rs[x]<=qr)
{
ta[x]+=v; return;
}
add(x+x,ql,qr,v);
add(x+x+1,ql,qr,v);
upd(x);
}
inline int qmin(int x,int ql,int qr)
{
if(ql>qr||rs[x]<ql||qr<ls[x]) return 2e9;
pd(x);
if(ql<=ls[x]&&rs[x]<=qr) return mi[x];
int g=min(qmin(x+x,ql,qr),
qmin(x+x+1,ql,qr));
upd(x); return g;
}
inline ll qsum(int x,int ql,int qr)
{
if(ql>qr||rs[x]<ql||qr<ls[x]) return 0;
pd(x);
if(ql<=ls[x]&&rs[x]<=qr) return su[x];
ll g=qsum(x+x,ql,qr)+qsum(x+x+1,ql,qr);
upd(x); return g;
}
inline void pt(int x,int ql,int qr,int u,int k,int b)
{
if(ql>qr||rs[x]<ql||qr<ls[x]) return;
pd(x);
if(mi[x]>u) return;
if(ql<=ls[x]&&rs[x]<=qr)
{
assert(mi[x]==u);
// cerr<<"PUTSHIT:"<<ls[x]<<"~"<<rs[x]<<" "<<k<<","<<b<<"\n";
tk[x]=k; tb[x]=b; return;
}
pt(x+x,ql,qr,u,k,b);
pt(x+x+1,ql,qr,u,k,b);
upd(x);
}
inline pair<int,ll> qms(int x,int ql,int qr)
{
if(ql>qr||rs[x]<ql||qr<ls[x])
return pair<int,ll>(2e9,0);
pd(x);
if(ql<=ls[x]&&rs[x]<=qr)
return pair<int,ll>(mi[x],ms[x]);
pair<int,ll> g=qms(x+x,ql,qr);
pd(x+x+1);
if(mi[x+x+1]>g.fi)
{
upd(x); return g;
}
pair<int,ll> h=qms(x+x+1,ql,qr);
upd(x);
if(g.fi<h.fi) return g;
if(g.fi>h.fi) return h;
return pair<int,ll>(g.fi,g.se+h.se);
}
inline void eds(int x,int p,ll s)
{
pd(x);
if(ls[x]==rs[x])
{
su[x]=ms[x]=s;
return;
}
if(p<=rs[x+x])
eds(x+x,p,s);
else eds(x+x+1,p,s);
upd(x);
}
}
void dfs(int x,int f=0)
{
sz[x]=1; dep[x]=dep[f]+1; fa[x]=f; son[x]=0;
for esb(x,e,b) if(b!=f)
{
dfs(b,x); sz[x]+=sz[b];
if(sz[b]>sz[son[x]]) son[x]=b;
}
}
int bs[SZ];
void edt(int x,int y)
{
for(;x<SZ;x+=x&-x) bs[x]+=y;
}
int qs(int x)
{
int s=0;
for(;x>=1;x-=x&-x) s+=bs[x];
return s;
}
namespace B2
{
int bs[SZ];
void edt(int x,int y)
{
for(;x<SZ;x+=x&-x) bs[x]+=y;
}
int qs(int x)
{
int s=0;
for(;x>=1;x-=x&-x) s+=bs[x];
return s;
}
int qs(int l,int r)
{return qs(r)-qs(l-1);}
}
int top[SZ],fe[SZ],rv[SZ],C,ed[SZ],p1[SZ],p2[SZ],Q=0;
void dfs2(int x,int t)
{
top[x]=t; fe[x]=++C; rv[C]=x; p1[x]=++Q;
if(son[x]) dfs2(son[x],t);
for esb(x,e,b)
if(b!=son[x]&&b!=fa[x])
dfs2(b,b);
ed[x]=C; p2[x]=++Q;
}
int lca(int a,int b)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]]) b=fa[top[b]];
else a=fa[top[a]];
}
if(dep[a]<dep[b]) return a;
return b;
}
int lt[SZ],E=3; ll la[SZ];
#define EDT ++E
namespace Seg2
{
int g[SZ];
void upd(int x,int y)
{
x+=M; g[x]=y;
while(x>>=1)
g[x]=max(g[x+x],g[x+x+1]);
}
int lp(int x,int ql,int qr,int u)
{
if(ql>qr||rs[x]<ql||qr<ls[x]||g[x]<u) return 0;
if(ls[x]==rs[x]) return ls[x];
int uu=lp(x+x+1,ql,qr,u);
if(uu) return uu;
return lp(x+x,ql,qr,u);
}
}
int ftop(int x)
{return rv[Seg2::lp(1,1,fe[x],ed[x])];}
inline int fc(int x) {return qs(p1[x]);}
set<int> w;
ll ca=0;
ll QS(int x)
{
if(lt[x]==E) return la[x];
lt[x]=E;
return la[x]=Seg::qms(1,fe[x],ed[x]).se;
}
void edb(int x,int v,bool chk=1)
{
x=ftop(x);
//cerr<<x<<" "<<Seg::qms(1,fe[x],ed[x],F)<<"QWQ\n";
int u=fe[x];
if(v==-1)
{
if(!w.count(u)) return;
B2::edt(u,-1);
if(w.size()<=2)
{
w.erase(u);
ca=0; return;
}
auto U=w.find(u);
int L,R;
++U;
if(U!=w.end()) R=*U;
else R=*w.begin();
--U;
if(U!=w.begin()) L=*(--U),++U;
else L=*w.rbegin();
int A=rv[L],B=rv[*U],C=rv[R];
int AB=lca(A,B),AC=lca(A,C),BC=lca(B,C);
ca-=fc(B)-fc(AB)-fc(BC)+fc(AC);
w.erase(U);
}
else
{
if(w.count(u)) return;
if(chk&&!QS(x)) return;
B2::edt(u,1);
if(w.size()<=0)
{
w.insert(u);
ca=0; return;
}
auto U=w.insert(u).fi;
int L,R;
++U;
if(U!=w.end()) R=*U;
else R=*w.begin();
--U;
if(U!=w.begin()) L=*(--U),++U;
else L=*w.rbegin();
int A=rv[L],B=rv[*U],C=rv[R];
int AB=lca(A,B),AC=lca(A,C),BC=lca(B,C);
ca+=fc(B)-fc(AB)-fc(BC)+fc(AC);
}
}
void flip(int e)
{
if(ec[e]) //block
{
int ww=B2::qs(fe[eb[e]],ed[eb[e]]);
if(ww&&ww!=int(w.size())) ca++;
edt(p1[eb[e]],1);
edt(p2[eb[e]],-1);
edb(ea[e],-1);
Seg2::upd(fe[eb[e]],ed[eb[e]]);
EDT;
Seg::add(1,fe[eb[e]],ed[eb[e]],1);
ec[e]^=1;
edb(ea[e],1);
edb(eb[e],1);
}
else //unblock
{
int ww=B2::qs(fe[eb[e]],ed[eb[e]]);
if(ww&&ww!=int(w.size())) ca--;
edt(p1[eb[e]],-1);
edt(p2[eb[e]],1);
edb(ea[e],-1);
edb(eb[e],-1);
Seg2::upd(fe[eb[e]],0);
EDT;
Seg::add(1,fe[eb[e]],ed[eb[e]],-1);
ec[e]^=1;
edb(ea[e],1);
}
}
void sol()
{
scanf("%d%d",&n,&m); M_=C=0;
// cerr<<"+"<<n<<"w"<<m<<"\n";
Seg::clr();
for(int i=1;i<=n;++i)
fst[i]=0,Seg::mc[i+M]=1,Seg::mi[i+M]=0;
for(int i=1,a,b;i<n;++i)
scanf("%d%d",&a,&b),
ea[i]=a,eb[i]=b,ec[i]=0,
adde(a,b);
dfs(1); dfs2(1,1);
for(int i=1;i<=n;++i)
Seg2::upd(fe[i],ed[i]);
for(int i=1;i<n;++i)
{
if(fa[ea[i]]==eb[i]) swap(ea[i],eb[i]);
assert(fa[eb[i]]==ea[i]);
}
if(n>1) scanf("%s",s); //is it a trap?
// for(int i=1;i<=n;++i)
// cerr<<fe[i]<<",";
// cerr<<"\n";
for(int i=1;i<=n;++i)
scanf("%lld",&Seg::su[fe[i]+M]),
Seg::ms[fe[i]+M]=Seg::su[fe[i]+M];
for(int i=M-1;i>=1;--i)
Seg::upd(i);
for(int i=1;i<n;++i)
Seg::add(1,fe[eb[i]],ed[eb[i]],1),
edt(p1[eb[i]],1),
edt(p2[eb[i]],-1);
for(int i=1;i<=n;++i) edb(i,1);
// cerr<<ca<<"w"<<ca/2<<" "<<n<<"\n";
// for(auto p:w)
// cerr<<rv[p]<<",";cerr<<"\n";
for(int i=0;i+1<n;++i)
if(s[i]=='0') flip(i+1);
// cerr<<ca<<"w"<<ca/2<<"\n";
while(m--)
{
int o;
scanf("%d",&o);
if(o==1)
{
int e;
scanf("%d",&e);
flip(e);
}
else if(o==2)
{
int x,w;
scanf("%d%d",&x,&w);
if(w==0) continue;
x=ftop(x);
int s=fc(x);
EDT;
Seg::pt(1,fe[x],ed[x],s,1,w);
edb(x,1,0);
}
else if(o==4)
{
int x;
scanf("%d",&x);
auto OP=Seg::qsum(1,fe[x],fe[x]);
printf("%lld\n",OP);
fflush(stdout);
}
else if(o==5)
{
int x,x_;
scanf("%d",&x);
x_=x;
x=ftop(x);
// cerr<<x<<"!\n";
int s=fc(x);
auto OP=QS(x);
printf("%lld\n",OP);
fflush(stdout);
}
else if(o==6)
{
int x;
scanf("%d",&x);
x=ftop(x);
int s=fc(x); EDT;
Seg::pt(1,fe[x],ed[x],s,0,0);
edb(x,-1);
}
else if(o==3)
{
int x;
scanf("%d",&x);
int y=ftop(x);
// cerr<<y<<"!"<<fe[y]<<"w"<<ed[y]<<"\n";
int s=fc(y);
ll w=QS(y); EDT;
Seg::pt(1,fe[y],ed[y],s,0,0);
// cerr<<"w="<<w<<" y="<<y<<" "<<fe[y]<<"w"<<ed[y]<<"?\n";
// cerr<<"REP"<<Seg::qms(1,fe[y],fe[y],s)<<" "<<fe[x]<<"?\n";
Seg::eds(1,fe[x],w);
}
else if(o==7)
{
printf("%lld\n",ca);
// for(auto u:w)
// cerr<<u<<",";
// cerr<<"\n";
fflush(stdout);
}
else throw "???";
}
}
int main()
{
for(int i=1;i<=M;++i) ls[i+M]=rs[i+M]=i;
for(int i=M-1;i>=1;--i)
ls[i]=ls[i+i],rs[i]=rs[i+i+1];
for(int i=0;i<=M+M;++i)
ss[i]=rs[i]-ls[i]+1;
scanf("%d",&T); sol();
cerr<<clock()<<"ms\n";
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1PMyIsIi1mdW5yb2xsLWFsbC1sb29wcyIsIi1mZmFzdC1tYXRoIikKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxhc3NlcnQuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBtcCBtYWtlX3BhaXIKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHBpaTsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgZmUgZmlyc3QKI2RlZmluZSBGTyh4KSB7ZnJlb3BlbigjeCIuaW4iLCJyIixzdGRpbik7ZnJlb3BlbigjeCIub3V0IiwidyIsc3Rkb3V0KTt9CiNkZWZpbmUgRWRnIGludCBNPTAsZnN0W1NaXSx2YltTWl0sbnh0W1NaXTt2b2lkIGFkX2RlKGludCBhLGludCBiKXsrK007bnh0W01dPWZzdFthXTtmc3RbYV09TTt2YltNXT1iO312b2lkIGFkZGUoaW50IGEsaW50IGIpe2FkX2RlKGEsYik7YWRfZGUoYixhKTt9CiNkZWZpbmUgRWRnYyBpbnQgTT0wLGZzdFtTWl0sdmJbU1pdLG54dFtTWl0sdmNbU1pdO3ZvaWQgYWRfZGUoaW50IGEsaW50IGIsaW50IGMpeysrTTtueHRbTV09ZnN0W2FdO2ZzdFthXT1NO3ZiW01dPWI7dmNbTV09Yzt9dm9pZCBhZGRlKGludCBhLGludCBiLGludCBjKXthZF9kZShhLGIsYyk7YWRfZGUoYixhLGMpO30KI2RlZmluZSBlcyh4LGUpIChpbnQgZT1mc3RbeF07ZTtlPW54dFtlXSkKI2RlZmluZSBlc2IoeCxlLGIpIChpbnQgZT1mc3RbeF0sYj12YltlXTtlO2U9bnh0W2VdLGI9dmJbZV0pCiNkZWZpbmUgU1ogNjY2NjY2CmludCBULG4sbSxlYVtTWl0sZWJbU1pdLGVjW1NaXTsKI2RlZmluZSBNIE1fIAppbnQgTT0wLGZzdFtTWl0sdmJbU1pdLG54dFtTWl07CnZvaWQgYWRfZGUoaW50IGEsaW50IGIpCnsrK007bnh0W01dPWZzdFthXTtmc3RbYV09TTt2YltNXT1iO30Kdm9pZCBhZGRlKGludCBhLGludCBiKXthZF9kZShhLGIpO2FkX2RlKGIsYSk7fQojdW5kZWYgTQpjaGFyIHNbU1pdOwppbnQgc3pbU1pdLHNvbltTWl0sZGVwW1NaXSxmYVtTWl07CmNvbnN0IGludCBNPTI2MjE0NDsKaW50IGxzW1NaXSxyc1tTWl0sc3NbU1pdOwojZGVmaW5lIENMKHgpIG1lbXNldCh4LDAsc2l6ZW9mIHgpCm5hbWVzcGFjZSBTZWcKewpib29sIHRrW1NaXTsKaW50IHRhW1NaXSxtaVtTWl0sbWNbU1pdOwpsbCBzdVtTWl0sbXNbU1pdLHRiW1NaXTsKaW5saW5lIHZvaWQgY2xyKCkKewoJQ0wobWkpOyBDTChzdSk7CglDTChtcyk7IENMKHRiKTsgQ0wodGEpOwoJZm9yKGludCBpPTA7aTxTWjsrK2kpIHRrW2ldPTEsbWlbaV09MWU5Owp9CmlubGluZSB2b2lkIHBkKGludCB4KQp7CglpZih0YVt4XXx8dGJbeF18fHRrW3hdIT0xKTsKCWVsc2UgcmV0dXJuOwoJbWlbeF0rPXRhW3hdOyBzdVt4XS09bXNbeF07Cgltc1t4XT1tc1t4XSp0a1t4XSttY1t4XSp0Ylt4XTsKCXN1W3hdKz1tc1t4XTsKCWlmKHg8PU0pCgl7CgkJdGFbeCt4XSs9dGFbeF0sdGFbeCt4KzFdKz10YVt4XTsKCQlpbnQgdT1taW4obWlbeCt4XSxtaVt4K3grMV0pOwoJCWlmKG1pW3greF09PXUpCgkJewoJCXRrW3greF0mPXRrW3hdOwoJCXRiW3greF09dGJbeCt4XSp0a1t4XSt0Ylt4XTsKCQl9CgkJaWYobWlbeCt4KzFdPT11KQoJCXsKCQl0a1t4K3grMV0mPXRrW3hdOwoJCXRiW3greCsxXT10Ylt4K3grMV0qdGtbeF0rdGJbeF07CgkJfQoJfQoJdGFbeF09dGJbeF09MDsgdGtbeF09MTsKfQppbmxpbmUgdm9pZCB1cGQoaW50IHgpCnsKCXBkKHgreCk7IHBkKHgreCsxKTsKCXN1W3hdPXN1W3greF0rc3VbeCt4KzFdOwoJaWYobWlbeCt4XTxtaVt4K3grMV0pCgkJbWlbeF09bWlbeCt4XSxtY1t4XT1tY1t4K3hdLG1zW3hdPW1zW3greF07CgllbHNlIGlmKG1pW3greF0+bWlbeCt4KzFdKQoJCW1pW3hdPW1pW3greCsxXSxtY1t4XT1tY1t4K3grMV0sbXNbeF09bXNbeCt4KzFdOwoJZWxzZSBtaVt4XT1taVt4K3hdLAoJbWNbeF09bWNbeCt4XSttY1t4K3grMV0sCgltc1t4XT1tc1t4K3hdK21zW3greCsxXTsKLy8JbWlbeF09bWluKG1pW3greF0sbWlbeCt4KzFdKTsgbWNbeF09bXNbeF09MDsKLy8JaWYobWlbeF09PW1pW3greF0pIG1jW3hdKz1tY1t4K3hdLG1zW3hdKz1tc1t4K3hdOwovLwlpZihtaVt4XT09bWlbeCt4KzFdKSBtY1t4XSs9bWNbeCt4KzFdLG1zW3hdKz1tc1t4K3grMV07Cn0KaW5saW5lIHZvaWQgYWRkKGludCB4LGludCBxbCxpbnQgcXIsaW50IHYpCnsKCWlmKHFsPnFyfHxyc1t4XTxxbHx8cXI8bHNbeF0pIHJldHVybjsKCXBkKHgpOwoJaWYocWw8PWxzW3hdJiZyc1t4XTw9cXIpCgl7CgkJdGFbeF0rPXY7IHJldHVybjsKCX0KCWFkZCh4K3gscWwscXIsdik7CglhZGQoeCt4KzEscWwscXIsdik7Cgl1cGQoeCk7Cn0KaW5saW5lIGludCBxbWluKGludCB4LGludCBxbCxpbnQgcXIpCnsKCWlmKHFsPnFyfHxyc1t4XTxxbHx8cXI8bHNbeF0pIHJldHVybiAyZTk7CglwZCh4KTsKCWlmKHFsPD1sc1t4XSYmcnNbeF08PXFyKSByZXR1cm4gbWlbeF07CglpbnQgZz1taW4ocW1pbih4K3gscWwscXIpLAoJcW1pbih4K3grMSxxbCxxcikpOwoJdXBkKHgpOyByZXR1cm4gZzsKfQppbmxpbmUgbGwgcXN1bShpbnQgeCxpbnQgcWwsaW50IHFyKQp7CglpZihxbD5xcnx8cnNbeF08cWx8fHFyPGxzW3hdKSByZXR1cm4gMDsKCXBkKHgpOwoJaWYocWw8PWxzW3hdJiZyc1t4XTw9cXIpIHJldHVybiBzdVt4XTsKCWxsIGc9cXN1bSh4K3gscWwscXIpK3FzdW0oeCt4KzEscWwscXIpOwoJdXBkKHgpOyByZXR1cm4gZzsKfQppbmxpbmUgdm9pZCBwdChpbnQgeCxpbnQgcWwsaW50IHFyLGludCB1LGludCBrLGludCBiKQp7CglpZihxbD5xcnx8cnNbeF08cWx8fHFyPGxzW3hdKSByZXR1cm47CglwZCh4KTsKCWlmKG1pW3hdPnUpIHJldHVybjsKCWlmKHFsPD1sc1t4XSYmcnNbeF08PXFyKQoJewoJCWFzc2VydChtaVt4XT09dSk7Ci8vCQljZXJyPDwiUFVUU0hJVDoiPDxsc1t4XTw8In4iPDxyc1t4XTw8IiAiPDxrPDwiLCI8PGI8PCJcbiI7CgkJdGtbeF09azsgdGJbeF09YjsgcmV0dXJuOwoJfQoJcHQoeCt4LHFsLHFyLHUsayxiKTsKCXB0KHgreCsxLHFsLHFyLHUsayxiKTsKCXVwZCh4KTsKfQppbmxpbmUgcGFpcjxpbnQsbGw+IHFtcyhpbnQgeCxpbnQgcWwsaW50IHFyKQp7CglpZihxbD5xcnx8cnNbeF08cWx8fHFyPGxzW3hdKQoJCXJldHVybiBwYWlyPGludCxsbD4oMmU5LDApOwoJcGQoeCk7CglpZihxbDw9bHNbeF0mJnJzW3hdPD1xcikKCQlyZXR1cm4gcGFpcjxpbnQsbGw+KG1pW3hdLG1zW3hdKTsKCXBhaXI8aW50LGxsPiBnPXFtcyh4K3gscWwscXIpOwoJcGQoeCt4KzEpOwoJaWYobWlbeCt4KzFdPmcuZmkpCgl7CgkJdXBkKHgpOyByZXR1cm4gZzsKCX0KCXBhaXI8aW50LGxsPiBoPXFtcyh4K3grMSxxbCxxcik7Cgl1cGQoeCk7CglpZihnLmZpPGguZmkpIHJldHVybiBnOwoJaWYoZy5maT5oLmZpKSByZXR1cm4gaDsKCXJldHVybiBwYWlyPGludCxsbD4oZy5maSxnLnNlK2guc2UpOwp9CmlubGluZSB2b2lkIGVkcyhpbnQgeCxpbnQgcCxsbCBzKQp7CglwZCh4KTsKCWlmKGxzW3hdPT1yc1t4XSkKCXsKCQlzdVt4XT1tc1t4XT1zOwoJCXJldHVybjsKCX0KCWlmKHA8PXJzW3greF0pCgkJZWRzKHgreCxwLHMpOwoJZWxzZSBlZHMoeCt4KzEscCxzKTsKCXVwZCh4KTsKfQp9CnZvaWQgZGZzKGludCB4LGludCBmPTApCnsKCXN6W3hdPTE7IGRlcFt4XT1kZXBbZl0rMTsgZmFbeF09Zjsgc29uW3hdPTA7Cglmb3IgZXNiKHgsZSxiKSBpZihiIT1mKQoJewoJCWRmcyhiLHgpOyBzelt4XSs9c3pbYl07CgkJaWYoc3pbYl0+c3pbc29uW3hdXSkgc29uW3hdPWI7Cgl9Cn0KaW50IGJzW1NaXTsKdm9pZCBlZHQoaW50IHgsaW50IHkpCnsKCWZvcig7eDxTWjt4Kz14Ji14KSBic1t4XSs9eTsKfQppbnQgcXMoaW50IHgpCnsKCWludCBzPTA7Cglmb3IoO3g+PTE7eC09eCYteCkgcys9YnNbeF07CglyZXR1cm4gczsKfQpuYW1lc3BhY2UgQjIKewppbnQgYnNbU1pdOwp2b2lkIGVkdChpbnQgeCxpbnQgeSkKewoJZm9yKDt4PFNaO3grPXgmLXgpIGJzW3hdKz15Owp9CmludCBxcyhpbnQgeCkKewoJaW50IHM9MDsKCWZvcig7eD49MTt4LT14Ji14KSBzKz1ic1t4XTsKCXJldHVybiBzOwp9CmludCBxcyhpbnQgbCxpbnQgcikKe3JldHVybiBxcyhyKS1xcyhsLTEpO30KfQppbnQgdG9wW1NaXSxmZVtTWl0scnZbU1pdLEMsZWRbU1pdLHAxW1NaXSxwMltTWl0sUT0wOwp2b2lkIGRmczIoaW50IHgsaW50IHQpCnsKCXRvcFt4XT10OyBmZVt4XT0rK0M7IHJ2W0NdPXg7IHAxW3hdPSsrUTsKCWlmKHNvblt4XSkgZGZzMihzb25beF0sdCk7Cglmb3IgZXNiKHgsZSxiKQoJCWlmKGIhPXNvblt4XSYmYiE9ZmFbeF0pCgkJCWRmczIoYixiKTsKCWVkW3hdPUM7IHAyW3hdPSsrUTsKfQppbnQgbGNhKGludCBhLGludCBiKQp7Cgl3aGlsZSh0b3BbYV0hPXRvcFtiXSkKCXsKCQlpZihkZXBbdG9wW2FdXTxkZXBbdG9wW2JdXSkgYj1mYVt0b3BbYl1dOwoJCWVsc2UgYT1mYVt0b3BbYV1dOwoJfQoJaWYoZGVwW2FdPGRlcFtiXSkgcmV0dXJuIGE7CglyZXR1cm4gYjsKfQppbnQgbHRbU1pdLEU9MzsgbGwgbGFbU1pdOwojZGVmaW5lIEVEVCArK0UKbmFtZXNwYWNlIFNlZzIKewppbnQgZ1tTWl07CnZvaWQgdXBkKGludCB4LGludCB5KQp7Cgl4Kz1NOyBnW3hdPXk7Cgl3aGlsZSh4Pj49MSkKCQlnW3hdPW1heChnW3greF0sZ1t4K3grMV0pOwp9CmludCBscChpbnQgeCxpbnQgcWwsaW50IHFyLGludCB1KQp7CglpZihxbD5xcnx8cnNbeF08cWx8fHFyPGxzW3hdfHxnW3hdPHUpIHJldHVybiAwOwoJaWYobHNbeF09PXJzW3hdKSByZXR1cm4gbHNbeF07CglpbnQgdXU9bHAoeCt4KzEscWwscXIsdSk7CglpZih1dSkgcmV0dXJuIHV1OwoJcmV0dXJuIGxwKHgreCxxbCxxcix1KTsKfQp9CmludCBmdG9wKGludCB4KQp7cmV0dXJuIHJ2W1NlZzI6OmxwKDEsMSxmZVt4XSxlZFt4XSldO30KaW5saW5lIGludCBmYyhpbnQgeCkge3JldHVybiBxcyhwMVt4XSk7fQpzZXQ8aW50PiB3OwpsbCBjYT0wOwpsbCBRUyhpbnQgeCkKewoJaWYobHRbeF09PUUpIHJldHVybiBsYVt4XTsKCWx0W3hdPUU7CglyZXR1cm4gbGFbeF09U2VnOjpxbXMoMSxmZVt4XSxlZFt4XSkuc2U7Cn0Kdm9pZCBlZGIoaW50IHgsaW50IHYsYm9vbCBjaGs9MSkKewoJeD1mdG9wKHgpOwoJLy9jZXJyPDx4PDwiICI8PFNlZzo6cW1zKDEsZmVbeF0sZWRbeF0sRik8PCJRV1FcbiI7CglpbnQgdT1mZVt4XTsKCWlmKHY9PS0xKQoJewoJCWlmKCF3LmNvdW50KHUpKSByZXR1cm47CgkJQjI6OmVkdCh1LC0xKTsKCQlpZih3LnNpemUoKTw9MikKCQl7CgkJCXcuZXJhc2UodSk7CgkJCWNhPTA7IHJldHVybjsKCQl9CgkJYXV0byBVPXcuZmluZCh1KTsKCQlpbnQgTCxSOwoJCSsrVTsKCQlpZihVIT13LmVuZCgpKSBSPSpVOwoJCWVsc2UgUj0qdy5iZWdpbigpOwoJCS0tVTsKCQlpZihVIT13LmJlZ2luKCkpIEw9KigtLVUpLCsrVTsKCQllbHNlIEw9KncucmJlZ2luKCk7CgkJaW50IEE9cnZbTF0sQj1ydlsqVV0sQz1ydltSXTsKCQlpbnQgQUI9bGNhKEEsQiksQUM9bGNhKEEsQyksQkM9bGNhKEIsQyk7CgkJY2EtPWZjKEIpLWZjKEFCKS1mYyhCQykrZmMoQUMpOwoJCXcuZXJhc2UoVSk7Cgl9CgllbHNlCgl7CgkJaWYody5jb3VudCh1KSkgcmV0dXJuOwoJCWlmKGNoayYmIVFTKHgpKSByZXR1cm47CgkJQjI6OmVkdCh1LDEpOwoJCWlmKHcuc2l6ZSgpPD0wKQoJCXsKCQkJdy5pbnNlcnQodSk7CgkJCWNhPTA7IHJldHVybjsKCQl9CgkJYXV0byBVPXcuaW5zZXJ0KHUpLmZpOwoJCWludCBMLFI7CgkJKytVOwoJCWlmKFUhPXcuZW5kKCkpIFI9KlU7CgkJZWxzZSBSPSp3LmJlZ2luKCk7CgkJLS1VOwoJCWlmKFUhPXcuYmVnaW4oKSkgTD0qKC0tVSksKytVOwoJCWVsc2UgTD0qdy5yYmVnaW4oKTsKCQlpbnQgQT1ydltMXSxCPXJ2WypVXSxDPXJ2W1JdOwoJCWludCBBQj1sY2EoQSxCKSxBQz1sY2EoQSxDKSxCQz1sY2EoQixDKTsKCQljYSs9ZmMoQiktZmMoQUIpLWZjKEJDKStmYyhBQyk7Cgl9Cn0Kdm9pZCBmbGlwKGludCBlKQp7CglpZihlY1tlXSkgLy9ibG9jawoJewoJCWludCB3dz1CMjo6cXMoZmVbZWJbZV1dLGVkW2ViW2VdXSk7CgkJaWYod3cmJnd3IT1pbnQody5zaXplKCkpKSBjYSsrOwoJCWVkdChwMVtlYltlXV0sMSk7CgkJZWR0KHAyW2ViW2VdXSwtMSk7CgkJZWRiKGVhW2VdLC0xKTsKCQlTZWcyOjp1cGQoZmVbZWJbZV1dLGVkW2ViW2VdXSk7CgkJRURUOwoJCVNlZzo6YWRkKDEsZmVbZWJbZV1dLGVkW2ViW2VdXSwxKTsKCQllY1tlXV49MTsKCQllZGIoZWFbZV0sMSk7CgkJZWRiKGViW2VdLDEpOwoJfQoJZWxzZSAvL3VuYmxvY2sKCXsKCQlpbnQgd3c9QjI6OnFzKGZlW2ViW2VdXSxlZFtlYltlXV0pOwoJCWlmKHd3JiZ3dyE9aW50KHcuc2l6ZSgpKSkgY2EtLTsKCQllZHQocDFbZWJbZV1dLC0xKTsKCQllZHQocDJbZWJbZV1dLDEpOwoJCWVkYihlYVtlXSwtMSk7CgkJZWRiKGViW2VdLC0xKTsKCQlTZWcyOjp1cGQoZmVbZWJbZV1dLDApOwoJCUVEVDsKCQlTZWc6OmFkZCgxLGZlW2ViW2VdXSxlZFtlYltlXV0sLTEpOwoJCWVjW2VdXj0xOwoJCWVkYihlYVtlXSwxKTsKCX0KfQp2b2lkIHNvbCgpCnsKCXNjYW5mKCIlZCVkIiwmbiwmbSk7IE1fPUM9MDsKLy8JY2Vycjw8IisiPDxuPDwidyI8PG08PCJcbiI7CglTZWc6OmNscigpOwoJZm9yKGludCBpPTE7aTw9bjsrK2kpCgkJZnN0W2ldPTAsU2VnOjptY1tpK01dPTEsU2VnOjptaVtpK01dPTA7Cglmb3IoaW50IGk9MSxhLGI7aTxuOysraSkKCQlzY2FuZigiJWQlZCIsJmEsJmIpLAoJCWVhW2ldPWEsZWJbaV09YixlY1tpXT0wLAoJCWFkZGUoYSxiKTsKCWRmcygxKTsgZGZzMigxLDEpOwoJZm9yKGludCBpPTE7aTw9bjsrK2kpCgkJU2VnMjo6dXBkKGZlW2ldLGVkW2ldKTsKCWZvcihpbnQgaT0xO2k8bjsrK2kpCgl7CgkJaWYoZmFbZWFbaV1dPT1lYltpXSkgc3dhcChlYVtpXSxlYltpXSk7CgkJYXNzZXJ0KGZhW2ViW2ldXT09ZWFbaV0pOwoJfQoJaWYobj4xKSBzY2FuZigiJXMiLHMpOyAvL2lzIGl0IGEgdHJhcD8KLy8JZm9yKGludCBpPTE7aTw9bjsrK2kpCi8vCQljZXJyPDxmZVtpXTw8IiwiOwovLwljZXJyPDwiXG4iOwoJZm9yKGludCBpPTE7aTw9bjsrK2kpCgkJc2NhbmYoIiVsbGQiLCZTZWc6OnN1W2ZlW2ldK01dKSwKCQlTZWc6Om1zW2ZlW2ldK01dPVNlZzo6c3VbZmVbaV0rTV07Cglmb3IoaW50IGk9TS0xO2k+PTE7LS1pKQoJCVNlZzo6dXBkKGkpOwoJZm9yKGludCBpPTE7aTxuOysraSkKCQlTZWc6OmFkZCgxLGZlW2ViW2ldXSxlZFtlYltpXV0sMSksCgkJZWR0KHAxW2ViW2ldXSwxKSwKCQllZHQocDJbZWJbaV1dLC0xKTsKCWZvcihpbnQgaT0xO2k8PW47KytpKSBlZGIoaSwxKTsKLy8JY2Vycjw8Y2E8PCJ3Ijw8Y2EvMjw8IiAiPDxuPDwiXG4iOwovLwlmb3IoYXV0byBwOncpCi8vCQljZXJyPDxydltwXTw8IiwiO2NlcnI8PCJcbiI7Cglmb3IoaW50IGk9MDtpKzE8bjsrK2kpCgkJaWYoc1tpXT09JzAnKSBmbGlwKGkrMSk7Ci8vCWNlcnI8PGNhPDwidyI8PGNhLzI8PCJcbiI7Cgl3aGlsZShtLS0pCgl7CgkJaW50IG87CgkJc2NhbmYoIiVkIiwmbyk7CgkJaWYobz09MSkKCQl7CgkJCWludCBlOwoJCQlzY2FuZigiJWQiLCZlKTsKCQkJZmxpcChlKTsKCQl9CgkJZWxzZSBpZihvPT0yKQoJCXsKCQkJaW50IHgsdzsKCQkJc2NhbmYoIiVkJWQiLCZ4LCZ3KTsKCQkJaWYodz09MCkgY29udGludWU7CgkJCXg9ZnRvcCh4KTsKCQkJaW50IHM9ZmMoeCk7CgkJCUVEVDsKCQkJU2VnOjpwdCgxLGZlW3hdLGVkW3hdLHMsMSx3KTsKCQkJZWRiKHgsMSwwKTsKCQl9CgkJZWxzZSBpZihvPT00KQoJCXsKCQkJaW50IHg7CgkJCXNjYW5mKCIlZCIsJngpOwoJCQlhdXRvIE9QPVNlZzo6cXN1bSgxLGZlW3hdLGZlW3hdKTsKCQkJcHJpbnRmKCIlbGxkXG4iLE9QKTsKCQkJZmZsdXNoKHN0ZG91dCk7CgkJfQoJCWVsc2UgaWYobz09NSkKCQl7CgkJCWludCB4LHhfOwoJCQlzY2FuZigiJWQiLCZ4KTsKCQkJeF89eDsKCQkJeD1mdG9wKHgpOwovLwkJCWNlcnI8PHg8PCIhXG4iOwoJCQlpbnQgcz1mYyh4KTsKCQkJYXV0byBPUD1RUyh4KTsKCQkJcHJpbnRmKCIlbGxkXG4iLE9QKTsKCQkJZmZsdXNoKHN0ZG91dCk7CgkJfQoJCWVsc2UgaWYobz09NikKCQl7CgkJCWludCB4OwoJCQlzY2FuZigiJWQiLCZ4KTsKCQkJeD1mdG9wKHgpOwoJCQlpbnQgcz1mYyh4KTsgRURUOwoJCQlTZWc6OnB0KDEsZmVbeF0sZWRbeF0scywwLDApOwoJCQllZGIoeCwtMSk7CgkJfQoJCWVsc2UgaWYobz09MykKCQl7CgkJCWludCB4OwoJCQlzY2FuZigiJWQiLCZ4KTsKCQkJaW50IHk9ZnRvcCh4KTsKLy8JCQljZXJyPDx5PDwiISI8PGZlW3ldPDwidyI8PGVkW3ldPDwiXG4iOwoJCQlpbnQgcz1mYyh5KTsKCQkJbGwgdz1RUyh5KTsgRURUOwoJCQlTZWc6OnB0KDEsZmVbeV0sZWRbeV0scywwLDApOwovLwkJCWNlcnI8PCJ3PSI8PHc8PCIgeT0iPDx5PDwiICI8PGZlW3ldPDwidyI8PGVkW3ldPDwiP1xuIjsKLy8JCQljZXJyPDwiUkVQIjw8U2VnOjpxbXMoMSxmZVt5XSxmZVt5XSxzKTw8IiAiPDxmZVt4XTw8Ij9cbiI7CgkJCVNlZzo6ZWRzKDEsZmVbeF0sdyk7CgkJfQoJCWVsc2UgaWYobz09NykKCQl7CgkJCXByaW50ZigiJWxsZFxuIixjYSk7Ci8vCQkJZm9yKGF1dG8gdTp3KQovLwkJCQljZXJyPDx1PDwiLCI7Ci8vCQkJY2Vycjw8IlxuIjsKCQkJZmZsdXNoKHN0ZG91dCk7CgkJfQoJCWVsc2UgdGhyb3cgIj8/PyI7Cgl9Cn0KaW50IG1haW4oKQp7Cglmb3IoaW50IGk9MTtpPD1NOysraSkgbHNbaStNXT1yc1tpK01dPWk7Cglmb3IoaW50IGk9TS0xO2k+PTE7LS1pKQoJCWxzW2ldPWxzW2kraV0scnNbaV09cnNbaStpKzFdOwoJZm9yKGludCBpPTA7aTw9TStNOysraSkKCQlzc1tpXT1yc1tpXS1sc1tpXSsxOwoJc2NhbmYoIiVkIiwmVCk7IHNvbCgpOwoJY2Vycjw8Y2xvY2soKTw8Im1zXG4iOwp9