const fi='network.inp';
fo='network.out';
maxn=round(1e5)*2;
maxn1=round(1e6)*5;
var w,a,h,p,x,y,z,u,v,c,cs,tt,con,nhan,d,loai,nhancuadinh:array[0..maxn]of longint;
it2,it,lazy:array[0..maxn1]of longint;
b:array[0..round(1e5),0..20]of longint;
n,m,slnhan,top:longint;
procedure mo;
begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
end;
procedure dong;
begin
closE(input);closE(output);
end;
procedure nhap;
var i,k:longint;
xx:char;
begin
readln(n,m);
for i:=1 to n-1 do
begin
readln(X[i],y[i],z[i]);
inc(h[x[i]]);
inc(h[y[i]]);
end;
for i:=1 to n+1 do inc(h[i],h[i-1]);
for i:=1 to n-1 do
begin
a[h[x[i]]]:=y[i];
p[h[x[i]]]:=z[i];
dec(h[x[i]]);
a[h[y[i]]]:=x[i];
p[h[y[i]]]:=z[i];
dec(h[y[i]]);
end;
for i:=1 to m do
begin
read(xx);
if xx='P' then
begin
readln(u[i],v[i],c[i]);
loai[i]:=1;
end
else
begin
readln(k,c[i]);
u[i]:=x[k];
v[i]:=y[k];
loai[i]:=2;
end;
end;
end;
procedure swap(var i,j:longint);
var t:longint;
begin
t:=i;
i:=j;
j:=t;
end;
procedure qs(l,r:longint);
var x,i,j:longint;
begin
i:=l;
j:=r;
x:=w[random(r-l)+1+l];
repeat
while w[i]<x do inc(i);
while x<w[j] do dec(j);
if i<=j then
begin
swap(cs[i],cs[j]);
swap(w[i],w[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then qs(i,r);
if l<j then qs(l,j);
end;
procedure qstv(l,r:longint);
var x,i,j:longint;
begin
i:=l;
j:=r;
x:=c[random(r-l)+1+l];
repeat
while (c[i]<x) do inc(i);
while (x<c[j]) do dec(j);
if i<=j then
begin
swap(c[i],c[j]);
swap(u[i],u[j]);
swap(v[i],v[j]);
swap(tt[i],tt[j]);
swap(loai[i],loai[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then qstv(i,r);
if l<j then qstv(l,j);
end;
procedure dfs(u:longint);
var v:longint;
begin
con[u]:=1;
for v:=h[u]+1 to h[u+1] do
if nhan[a[v]]=0 then
begin
w[a[v]]:=p[v];
b[a[v],0]:=u;
d[a[v]]:=d[u]+1;
inc(slnhan);
nhan[a[v]]:=slnhan;
dfs(a[v]);
con[u]:=con[a[v]]+con[u];
end;
end;
procedure sort;
var i:longint;
begin
slnhan:=1;
nhan[1]:=1;
d[1]:=1;
dfs(1);
//for i:=1 to n do
// writeln(nhan[i],' ',con[i]);
for i:=1 to n do cs[i]:=i;
qs(1,n);
//for i:=1 to n do writeln(cs[i],' ',w[i]);
for i:=1 to m do tt[i]:=i;
qstv(1,m);
//for i:=1 to m do writeln(u[i],' ',v[i],' ',c[i],' ',tt[i]);
end;
procedure qsnhan(l,r:longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=nhan[random(r-l)+1+l];
repeat
while nhan[i]<x do inc(i);
while x<nhan[j] do dec(j);
if i<=j then
begin
swap(nhan[i],nhan[j]);
//swap(nhancuadinh[i],nhancuadinh[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then qsnhan(i,r);
if l<j then qsnhan(l,j);
end;
procedure update(u,v,l,r,i:longint);
var mid:longint;
begin
it[i]:=it[i]+lazy[i];
lazy[i*2]:=lazy[i*2]+lazy[i];
lazy[i*2+1]:=lazy[i*2+1]+lazy[i];
lazy[i]:=0;
if (r<u) or (v<l) then exit;
if (u<=l) and (r<=v) then
begin
it[i]:=it[i]+1;
lazy[i]:=0;
lazy[i*2]:=lazy[i*2]+1;
lazy[i*2+1]:=lazy[i*2+1]+1;
exit;
end;
mid:=(l+r) div 2;
update(u,v,l,mid,i*2);
update(u,v,mid+1,r,i*2+1);
//it[i]:=it[i*2]+it[i*2+1];
end;
function find(u,l,r,i:longint):longint;
var mid:longint;
begin
it[i]:=it[i]+lazy[i];
lazy[i*2]:=lazy[i*2]+lazy[i];
lazy[i*2+1]:=lazy[i*2+1]+lazy[i];
lazy[i]:=0;
if (r<u) or (u<l) then exit(0);
if (l=u) and (l=r) then exit(it[i]);
mid:=(l+r) div 2;
exit(find(u,l,mid,i*2)+find(u,mid+1,r,i*2+1));
end;
procedure rmq;
var i,j:longint;
begin
for j:=1 to 20 do
for i:=1 to n do
b[i,j]:=b[b[i,j-1],j-1];
end;
function lca(u,v:longint):longint;
var k,i,res:longint;
begin
if d[u]>=d[v] then
begin
k:=d[u]-d[v];
if k>0 then
for i:=20 downto 0 do
if k>=1 shl i then
begin
k:=k-1 shl i;
u:=b[u,i];
end;
if u=v then exit(u);
for i:=20 downto 0 do
if b[u,i]=b[v,i] then res:=b[u,i] else
begin
u:=b[u,i];
v:=b[v,i];
end;
exit(res);
end
else exit(lca(v,u));
end;
procedure push(xx,tt:longint);
begin
inc(top);
x[top]:=xx;
y[top]:=tt;
end;
procedure update2(u,l,r,i:longint);
var mid:longint;
begin
if (r<u) or (u<l) then exit;
if (l=r) and (l=u) then
begin
it2[i]:=1;
exit;
end;
mid:=(l+r) div 2;
update2(u,l,mid,i*2);
update2(u,mid+1,r,i*2+1);
it2[i]:=it2[i*2]+it2[i*2+1];
end;
function find2(u,v,l,r,i:longint):longint;
var mid:longint;
begin
if (r<u) or (v<l) then exit(0);
if (u<=l) and (r<=v) then exit(it2[i]);
mid:=(l+r) div 2;
exit(find2(u,v,l,mid,i*2)+find2(u,v,mid+1,r,i*2+1));
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure truyvan;
var jj,t,i,j,resu,resc,resv,chung:longint;
begin
rmq;
for i:=1 to n do nhancuadinh[i]:=nhan[i];
qsnhan(1,n);
j:=0;
for i:=1 to m do
begin
while (c[i]>=w[j+1])and (j<n) do
begin
inc(j);
update(nhancuadinh[cs[j]],nhancuadinh[cs[j]]+con[cs[j]]-1,1,n,1);
update2(nhancuadinh[cs[j]],1,n,1);
//writeln(nhancuadinh[cs[j]],' ',nhancuadinh[cs[j]]+con[cs[j]]-1);
{for jj:=1 to n do
begin
t:=(find(jj,1,maxn1,1));
writeln(t);
end; }
end;
if loai[i]=1 then
begin
chung:=lca(u[i],v[i]);
resu:=find(nhancuadinh[u[i]],1,n,1);
resv:=find(nhancuadinh[v[i]],1,n,1);
resc:=find(nhancuadinh[chung],1,n,1);
push(resu+resv-2*resc,tt[i]);
//writeln(resu,' ',resv,' ',resc,' ',u[i],' ',v[i],' ',c[i],' ',resu+resv-2*resc);
//writeln(resu+resv-2*resc);
end
else
begin
if b[v[i],0]=u[i] then
begin
t:=find2(nhancuadinh[v[i]]+1,nhancuadinh[v[i]]+con[v[i]]-1,1,n,1);
push(t,tt[i]);
//writeln(t,' ',u[i],' ',v[i],' ',j);
//writeln(t);
//for jj:=1 to n do
// begin
// writeln(find2(nhancuadinh[jj]+1,nhancuadinh[jj]+con[jj]-1,1,maxn,1),' dinh ',jj);
// end;
end
else
begin
push(find2(nhancuadinh[u[i]]+1,nhancuadinh[u[i]]+con[u[i]]-1,1,n,1),tt[i]);
//writeln(find(v[i],1,maxn1,1)-1);
end;
end;
//writeln(tt[i],' ',x[i]);
end;
end;
procedure qskq(l,r:longint);
var i,j,xx:longint;
begin
i:=l;
j:=r;
xx:=y[random(r-l)+1+l];
repeat
while y[i]<xx do inc(i);
while xx<y[j] do dec(j);
if i<=j then
begin
swap(x[i],x[j]);
swap(y[i],y[j]);
dec(j);
inc(i);
end;
until i>j;
if i<r then qskq(i,r);
if l<j then qskq(l,j);
end;
procedure xuat;
var i:longint;
begin
qskq(1,top);
for i:=1 to top do writeln(x[i]);
//for i:=1 to n do writeln(find(1,1,maxn1,1));
end;
begin
mo;
nhap;
sort;
truyvan;
xuat;
dong;
end.
CiAgICBjb25zdCBmaT0nbmV0d29yay5pbnAnOwogICAgICAgICAgZm89J25ldHdvcmsub3V0JzsKICAgICAgICAgICAgbWF4bj1yb3VuZCgxZTUpKjI7CiAgICAgICAgICAgIG1heG4xPXJvdW5kKDFlNikqNTsKCiAgICB2YXIgdyxhLGgscCx4LHkseix1LHYsYyxjcyx0dCxjb24sbmhhbixkLGxvYWksbmhhbmN1YWRpbmg6YXJyYXlbMC4ubWF4bl1vZiBsb25naW50OwogICAgICAgIGl0MixpdCxsYXp5OmFycmF5WzAuLm1heG4xXW9mIGxvbmdpbnQ7CiAgICAgICAgYjphcnJheVswLi5yb3VuZCgxZTUpLDAuLjIwXW9mIGxvbmdpbnQ7CiAgICAgICAgbixtLHNsbmhhbix0b3A6bG9uZ2ludDsKICAgIHByb2NlZHVyZSBtbzsKICAgICAgICBiZWdpbgogICAgICAgICAgICBhc3NpZ24oaW5wdXQsZmkpO3Jlc2V0KGlucHV0KTsKICAgICAgICAgICAgYXNzaWduKG91dHB1dCxmbyk7cmV3cml0ZShvdXRwdXQpOwogICAgICAgIGVuZDsKCiAgICBwcm9jZWR1cmUgZG9uZzsKICAgICAgICBiZWdpbgogICAgICAgICAgICBjbG9zRShpbnB1dCk7Y2xvc0Uob3V0cHV0KTsKICAgICAgICBlbmQ7CgogICAgcHJvY2VkdXJlIG5oYXA7CiAgICAgICAgdmFyIGksazpsb25naW50OwogICAgICAgICAgICB4eDpjaGFyOwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgcmVhZGxuKG4sbSk7CiAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBuLTEgZG8KICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICByZWFkbG4oWFtpXSx5W2ldLHpbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpbmMoaFt4W2ldXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGluYyhoW3lbaV1dKTsKICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBuKzEgZG8gaW5jKGhbaV0saFtpLTFdKTsKICAgICAgICAgICAgICAgIGZvciBpOj0xIHRvIG4tMSBkbwogICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIGFbaFt4W2ldXV06PXlbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHBbaFt4W2ldXV06PXpbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlYyhoW3hbaV1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgYVtoW3lbaV1dXTo9eFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgcFtoW3lbaV1dXTo9eltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVjKGhbeVtpXV0pOwogICAgICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBtIGRvCiAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCh4eCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHh4PSdQJyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGxuKHVbaV0sdltpXSxjW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWlbaV06PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkbG4oayxjW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1W2ldOj14W2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbaV06PXlba107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9haVtpXTo9MjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgIGVuZDsKCiAgICBwcm9jZWR1cmUgc3dhcCh2YXIgaSxqOmxvbmdpbnQpOwogICAgICAgIHZhciB0OmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICB0Oj1pOwogICAgICAgICAgICAgICAgaTo9ajsKICAgICAgICAgICAgICAgIGo6PXQ7CiAgICAgICAgICAgIGVuZDsKCiAgICBwcm9jZWR1cmUgcXMobCxyOmxvbmdpbnQpOwogICAgICAgIHZhciB4LGksajpsb25naW50OwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgaTo9bDsKICAgICAgICAgICAgICAgIGo6PXI7CiAgICAgICAgICAgICAgICB4Oj13W3JhbmRvbShyLWwpKzErbF07CiAgICAgICAgICAgICAgICByZXBlYXQKICAgICAgICAgICAgICAgICAgICB3aGlsZSB3W2ldPHggZG8gaW5jKGkpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHg8d1tqXSBkbyBkZWMoaik7CiAgICAgICAgICAgICAgICAgICAgaWYgaTw9aiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKGNzW2ldLGNzW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAod1tpXSx3W2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYyhqKTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAgdW50aWwgaT5qOwogICAgICAgICAgICAgICAgaWYgaTxyIHRoZW4gcXMoaSxyKTsKICAgICAgICAgICAgICAgIGlmIGw8aiB0aGVuIHFzKGwsaik7CiAgICAgICAgICAgIGVuZDsKCiAgICBwcm9jZWR1cmUgcXN0dihsLHI6bG9uZ2ludCk7CiAgICAgICAgdmFyIHgsaSxqOmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBpOj1sOwogICAgICAgICAgICAgICAgajo9cjsKICAgICAgICAgICAgICAgIHg6PWNbcmFuZG9tKHItbCkrMStsXTsKICAgICAgICAgICAgICAgIHJlcGVhdAogICAgICAgICAgICAgICAgICAgIHdoaWxlIChjW2ldPHgpIGRvIGluYyhpKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeDxjW2pdKSBkbyBkZWMoaik7CiAgICAgICAgICAgICAgICAgICAgaWYgaTw9aiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKGNbaV0sY1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKHVbaV0sdVtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKHZbaV0sdltqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKHR0W2ldLHR0W2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAobG9haVtpXSxsb2FpW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYyhqKTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAgdW50aWwgaT5qOwogICAgICAgICAgICAgICAgaWYgaTxyIHRoZW4gcXN0dihpLHIpOwogICAgICAgICAgICAgICAgaWYgbDxqIHRoZW4gcXN0dihsLGopOwogICAgICAgICAgICBlbmQ7CgogICAgcHJvY2VkdXJlIGRmcyh1OmxvbmdpbnQpOwogICAgICAgIHZhciB2OmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBjb25bdV06PTE7CiAgICAgICAgICAgICAgICBmb3Igdjo9aFt1XSsxIHRvIGhbdSsxXSBkbwogICAgICAgICAgICAgICAgICAgIGlmIG5oYW5bYVt2XV09MCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3W2Fbdl1dOj1wW3ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlthW3ZdLDBdOj11OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZFthW3ZdXTo9ZFt1XSsxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jKHNsbmhhbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaGFuW2Fbdl1dOj1zbG5oYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnMoYVt2XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25bdV06PWNvblthW3ZdXStjb25bdV07CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgZW5kOwoKICAgIHByb2NlZHVyZSBzb3J0OwogICAgICAgIHZhciBpOmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBzbG5oYW46PTE7CiAgICAgICAgICAgICAgICBuaGFuWzFdOj0xOwogICAgICAgICAgICAgICAgZFsxXTo9MTsKICAgICAgICAgICAgICAgIGRmcygxKTsKICAgICAgICAgICAgICAgIC8vZm9yIGk6PTEgdG8gbiBkbwogICAgICAgICAgICAgICAgLy8gICAgd3JpdGVsbihuaGFuW2ldLCcgJyxjb25baV0pOwogICAgICAgICAgICAgICAgZm9yIGk6PTEgdG8gbiBkbyBjc1tpXTo9aTsKICAgICAgICAgICAgICAgIHFzKDEsbik7CiAgICAgICAgICAgICAgICAvL2ZvciBpOj0xIHRvIG4gZG8gd3JpdGVsbihjc1tpXSwnICcsd1tpXSk7CiAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBtIGRvIHR0W2ldOj1pOwogICAgICAgICAgICAgICAgcXN0digxLG0pOwogICAgICAgICAgICAgICAgLy9mb3IgaTo9MSB0byBtIGRvIHdyaXRlbG4odVtpXSwnICcsdltpXSwnICcsY1tpXSwnICcsdHRbaV0pOwogICAgICAgICAgICBlbmQ7CgogICAgcHJvY2VkdXJlIHFzbmhhbihsLHI6bG9uZ2ludCk7CiAgICAgICAgdmFyIGksaix4OmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBpOj1sOwogICAgICAgICAgICAgICAgajo9cjsKICAgICAgICAgICAgICAgIHg6PW5oYW5bcmFuZG9tKHItbCkrMStsXTsKICAgICAgICAgICAgICAgIHJlcGVhdAogICAgICAgICAgICAgICAgICAgIHdoaWxlIG5oYW5baV08eCBkbyBpbmMoaSk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgeDxuaGFuW2pdIGRvIGRlYyhqKTsKICAgICAgICAgICAgICAgICAgICBpZiBpPD1qIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAobmhhbltpXSxuaGFuW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3dhcChuaGFuY3VhZGluaFtpXSxuaGFuY3VhZGluaFtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWMoaik7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgIHVudGlsIGk+ajsKICAgICAgICAgICAgICAgIGlmIGk8ciB0aGVuIHFzbmhhbihpLHIpOwogICAgICAgICAgICAgICAgaWYgbDxqIHRoZW4gcXNuaGFuKGwsaik7CiAgICAgICAgICAgIGVuZDsKCiAgICAgICAgcHJvY2VkdXJlIHVwZGF0ZSh1LHYsbCxyLGk6bG9uZ2ludCk7CiAgICAgICAgICAgIHZhciBtaWQ6bG9uZ2ludDsKICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgaXRbaV06PWl0W2ldK2xhenlbaV07CiAgICAgICAgICAgICAgICAgICAgbGF6eVtpKjJdOj1sYXp5W2kqMl0rbGF6eVtpXTsKICAgICAgICAgICAgICAgICAgICBsYXp5W2kqMisxXTo9bGF6eVtpKjIrMV0rbGF6eVtpXTsKICAgICAgICAgICAgICAgICAgICBsYXp5W2ldOj0wOwogICAgICAgICAgICAgICAgICAgIGlmIChyPHUpIG9yICh2PGwpIHRoZW4gZXhpdDsKICAgICAgICAgICAgICAgICAgICBpZiAodTw9bCkgYW5kIChyPD12KSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdFtpXTo9aXRbaV0rMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlbaV06PTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5W2kqMl06PWxhenlbaSoyXSsxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVtpKjIrMV06PWxhenlbaSoyKzFdKzE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgICAgbWlkOj0obCtyKSBkaXYgMjsKICAgICAgICAgICAgICAgICAgICB1cGRhdGUodSx2LGwsbWlkLGkqMik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHUsdixtaWQrMSxyLGkqMisxKTsKICAgICAgICAgICAgICAgICAgICAvL2l0W2ldOj1pdFtpKjJdK2l0W2kqMisxXTsKICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgZnVuY3Rpb24gZmluZCh1LGwscixpOmxvbmdpbnQpOmxvbmdpbnQ7CiAgICAgICAgICAgIHZhciBtaWQ6bG9uZ2ludDsKICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgaXRbaV06PWl0W2ldK2xhenlbaV07CiAgICAgICAgICAgICAgICAgICAgbGF6eVtpKjJdOj1sYXp5W2kqMl0rbGF6eVtpXTsKICAgICAgICAgICAgICAgICAgICBsYXp5W2kqMisxXTo9bGF6eVtpKjIrMV0rbGF6eVtpXTsKICAgICAgICAgICAgICAgICAgICBsYXp5W2ldOj0wOwogICAgICAgICAgICAgICAgICAgIGlmIChyPHUpIG9yICh1PGwpIHRoZW4gZXhpdCgwKTsKICAgICAgICAgICAgICAgICAgICBpZiAobD11KSBhbmQgKGw9cikgdGhlbiBleGl0KGl0W2ldKTsKICAgICAgICAgICAgICAgICAgICBtaWQ6PShsK3IpIGRpdiAyOwogICAgICAgICAgICAgICAgICAgIGV4aXQoZmluZCh1LGwsbWlkLGkqMikrZmluZCh1LG1pZCsxLHIsaSoyKzEpKTsKICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgcHJvY2VkdXJlIHJtcTsKICAgICAgICAgICAgdmFyIGksajpsb25naW50OwogICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICBmb3Igajo9MSB0byAyMCBkbwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBuIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW2ksal06PWJbYltpLGotMV0sai0xXTsKICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgZnVuY3Rpb24gbGNhKHUsdjpsb25naW50KTpsb25naW50OwogICAgICAgICAgICB2YXIgayxpLHJlczpsb25naW50OwogICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICBpZiBkW3VdPj1kW3ZdIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs6PWRbdV0tZFt2XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGs+MCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGk6PTIwIGRvd250byAwIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGs+PTEgc2hsIGkgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOj1rLTEgc2hsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTo9Ylt1LGldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdT12IHRoZW4gZXhpdCh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpOj0yMCBkb3dudG8gMCBkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJbdSxpXT1iW3YsaV0gdGhlbiByZXM6PWJbdSxpXSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Oj1iW3UsaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Oj1iW3YsaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgICAgZWxzZSBleGl0KGxjYSh2LHUpKTsKICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgcHJvY2VkdXJlIHB1c2goeHgsdHQ6bG9uZ2ludCk7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBpbmModG9wKTsKICAgICAgICAgICAgICAgIHhbdG9wXTo9eHg7CiAgICAgICAgICAgICAgICB5W3RvcF06PXR0OwogICAgICAgICAgICBlbmQ7CgogICAgICAgIHByb2NlZHVyZSB1cGRhdGUyKHUsbCxyLGk6bG9uZ2ludCk7CiAgICAgICAgICAgIHZhciBtaWQ6bG9uZ2ludDsKICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgaWYgKHI8dSkgb3IgKHU8bCkgdGhlbiBleGl0OwogICAgICAgICAgICAgICAgICAgIGlmIChsPXIpIGFuZCAobD11KSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdDJbaV06PTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgICAgbWlkOj0obCtyKSBkaXYgMjsKICAgICAgICAgICAgICAgICAgICB1cGRhdGUyKHUsbCxtaWQsaSoyKTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGUyKHUsbWlkKzEscixpKjIrMSk7CiAgICAgICAgICAgICAgICAgICAgaXQyW2ldOj1pdDJbaSoyXStpdDJbaSoyKzFdOwogICAgICAgICAgICAgICAgZW5kOwogICAgICAgIGZ1bmN0aW9uIGZpbmQyKHUsdixsLHIsaTpsb25naW50KTpsb25naW50OwogICAgICAgICAgICB2YXIgbWlkOmxvbmdpbnQ7CiAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgIGlmIChyPHUpIG9yICh2PGwpIHRoZW4gZXhpdCgwKTsKICAgICAgICAgICAgICAgICAgICBpZiAodTw9bCkgYW5kIChyPD12KSB0aGVuIGV4aXQoaXQyW2ldKTsKICAgICAgICAgICAgICAgICAgICBtaWQ6PShsK3IpIGRpdiAyOwogICAgICAgICAgICAgICAgICAgIGV4aXQoZmluZDIodSx2LGwsbWlkLGkqMikrZmluZDIodSx2LG1pZCsxLHIsaSoyKzEpKTsKICAgICAgICAgICAgICAgIGVuZDsKCiAgICAgICAgZnVuY3Rpb24gbWluKGEsYjpsb25naW50KTpsb25naW50OwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgaWYgYTxiICB0aGVuIGV4aXQoYSkgZWxzZSBleGl0KGIpOwogICAgICAgICAgICBlbmQ7CgogICAgICAgIHByb2NlZHVyZSB0cnV5dmFuOwogICAgICAgIHZhciBqaix0LGksaixyZXN1LHJlc2MscmVzdixjaHVuZzpsb25naW50OwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgIHJtcTsKICAgICAgICAgICAgICAgICAgICBmb3IgaTo9MSB0byBuIGRvIG5oYW5jdWFkaW5oW2ldOj1uaGFuW2ldOwogICAgICAgICAgICAgICAgICAgIHFzbmhhbigxLG4pOwogICAgICAgICAgICAgICAgICAgIGo6PTA7CiAgICAgICAgICAgICAgICAgICAgZm9yIGk6PTEgdG8gbSBkbwogICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNbaV0+PXdbaisxXSlhbmQgKGo8bikgZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYyhqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobmhhbmN1YWRpbmhbY3Nbal1dLG5oYW5jdWFkaW5oW2NzW2pdXStjb25bY3Nbal1dLTEsMSxuLDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZTIobmhhbmN1YWRpbmhbY3Nbal1dLDEsbiwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlbG4obmhhbmN1YWRpbmhbY3Nbal1dLCcgJyxuaGFuY3VhZGluaFtjc1tqXV0rY29uW2NzW2pdXS0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9yIGpqOj0xIHRvIG4gZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDo9KGZpbmQoamosMSxtYXhuMSwxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbG4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvYWlbaV09MSB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmc6PWxjYSh1W2ldLHZbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1Oj1maW5kKG5oYW5jdWFkaW5oW3VbaV1dLDEsbiwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdjo9ZmluZChuaGFuY3VhZGluaFt2W2ldXSwxLG4sMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2M6PWZpbmQobmhhbmN1YWRpbmhbY2h1bmddLDEsbiwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChyZXN1K3Jlc3YtMipyZXNjLHR0W2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93cml0ZWxuKHJlc3UsJyAnLHJlc3YsJyAnLHJlc2MsJyAnLHVbaV0sJyAnLHZbaV0sJyAnLGNbaV0sJyAnLHJlc3UrcmVzdi0yKnJlc2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlbG4ocmVzdStyZXN2LTIqcmVzYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYlt2W2ldLDBdPXVbaV0gdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Oj1maW5kMihuaGFuY3VhZGluaFt2W2ldXSsxLG5oYW5jdWFkaW5oW3ZbaV1dK2Nvblt2W2ldXS0xLDEsbiwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHQsdHRbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JpdGVsbih0LCcgJyx1W2ldLCcgJyx2W2ldLCcgJyxqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlbG4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3Igamo6PTEgdG8gbiBkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHdyaXRlbG4oZmluZDIobmhhbmN1YWRpbmhbampdKzEsbmhhbmN1YWRpbmhbampdK2Nvbltqal0tMSwxLG1heG4sMSksJyBkaW5oICcsamopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goZmluZDIobmhhbmN1YWRpbmhbdVtpXV0rMSxuaGFuY3VhZGluaFt1W2ldXStjb25bdVtpXV0tMSwxLG4sMSksdHRbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JpdGVsbihmaW5kKHZbaV0sMSxtYXhuMSwxKS0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlbG4odHRbaV0sJyAnLHhbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgIGVuZDsKCiAgICBwcm9jZWR1cmUgcXNrcShsLHI6bG9uZ2ludCk7CiAgICAgICAgdmFyIGksaix4eDpsb25naW50OwogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgaTo9bDsKICAgICAgICAgICAgICAgIGo6PXI7CiAgICAgICAgICAgICAgICB4eDo9eVtyYW5kb20oci1sKSsxK2xdOwogICAgICAgICAgICAgICAgcmVwZWF0CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgeVtpXTx4eCBkbyBpbmMoaSk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgeHg8eVtqXSBkbyBkZWMoaik7CiAgICAgICAgICAgICAgICAgICAgaWYgaTw9aiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKHhbaV0seFtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwKHlbaV0seVtqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWMoaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICAgICAgICAgIHVudGlsIGk+ajsKICAgICAgICAgICAgICAgIGlmIGk8ciB0aGVuIHFza3EoaSxyKTsKICAgICAgICAgICAgICAgIGlmIGw8aiB0aGVuIHFza3EobCxqKTsKICAgICAgICAgICAgZW5kOwoKICAgIHByb2NlZHVyZSB4dWF0OwogICAgICAgIHZhciBpOmxvbmdpbnQ7CiAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBxc2txKDEsdG9wKTsKICAgICAgICAgICAgICAgIGZvciBpOj0xIHRvIHRvcCBkbyB3cml0ZWxuKHhbaV0pOwogICAgICAgICAgICAgICAgLy9mb3IgaTo9MSB0byBuIGRvIHdyaXRlbG4oZmluZCgxLDEsbWF4bjEsMSkpOwogICAgICAgICAgICBlbmQ7CgpiZWdpbgogICAgICAgIG1vOwogICAgICAgIG5oYXA7CiAgICAgICAgc29ydDsKICAgICAgICB0cnV5dmFuOwogICAgICAgIHh1YXQ7CiAgICAgICAgZG9uZzsKICAgIGVuZC4KCg==