import java.util.ArrayList;
import java.util.Scanner;
import static java.
lang.
Math.
*;
public class Main {
//problem specific variables
static ArrayList<Pair> adj[];
static int U[], V[];
//HLD stuff
static int subtree_size[], chain[], chainHead[], position[], chainId = 0,pos = 0;
//LCA stuff
static int parent[][], level[], MAX;
//Segment tree related stuff
static int n, arr[], tree[];
public static void main
(String[] args
) { Scanner scanner
= new Scanner
(System.
in); int t = scanner.nextInt();
while(t-->0) {
//reset
chainId = 0;
pos = 0;
n = scanner.nextInt();
MAX = (int)(log(n)/log(2));
for(int i=1;i<=n;++i) {
adj[i] = new ArrayList<>();
}
U = new int[n];
V = new int[n];
for(int i=1;i<n;++i) {
int u = scanner.nextInt(), v = scanner.nextInt(), c = scanner.nextInt();
adj[u].add(new Pair(v, c));
adj[v].add(new Pair(u, c));
U[i] = u;
V[i] = v;
}
parent = new int[n+1][MAX+1];
chain = new int[n+1];
chainHead = new int[n+1];
position = new int[n+1];
subtree_size = new int[n+1];
arr = new int[n];
level = new int[n+1];
int sz = (int)pow(2, ceil(log(n)/log(2)) + 1);
tree = new int[sz];
dfs(1,0, 0);
chainHead[0] = 1;
HLD(1,0);
//print the array
build(1,0, n-1);
while(true) {
if(s.equals("DONE")) {
break;
}
if(s.equals("QUERY")) {
int u = scanner.nextInt(), v = scanner.nextInt() , LCA = lca(u,v);
int max = 0;
max = max(max, queryUp(u, LCA));
max = max(max, queryUp(v, LCA));
}
else {
int idx = scanner.nextInt(), cost = scanner.nextInt();
int u = U[idx], v = V[idx];
if(level[u]>level[v]) {
update(position[u], cost);
}
else {
update(position[v], cost);
}
}
}
}
}
static void dfs(int v, int par, int l) {
parent[v][0] = par;
for(int i=1;i<=MAX;++i) {
if(parent[v][i-1]!=0) {
parent[v][i] = parent[parent[v][i-1]][i-1];
}
}
subtree_size[v] += 1;
level[v] = l;
for(Pair p : adj[v]) {
if(p.x!=par) {
dfs(p.x, v, l+1);
subtree_size[v]+=subtree_size[p.x];
}
}
}
/**
* Decompose the tree into chains, keeping all of all values we need
*/
static void HLD(int v, int par) {
int heavyChild = -1, heavySize = 0,heavyEdgeWeight = -1;
chain[v] = chainId;
position[v] = pos++;
for(Pair p : adj[v]) {
if(p.x!=par) {
if(subtree_size[p.x] > heavySize) {
heavySize = subtree_size[p.x];
heavyChild = p.x;
heavyEdgeWeight = p.y;
}
}
}
if(heavyChild!=-1) {
arr[pos] = heavyEdgeWeight;
HLD(heavyChild, v);
}
for(Pair p : adj[v]) {
if(p.x != par && p.x != heavyChild) {
chainId++;
chainHead[chainId] = p.x;
arr[pos] = p.y;
HLD(p.x, v);
}
}
}
/**
* Returns the maximum in path from node from to node to. Node to should be a ancestor of from.
* Uses the decomposition to reduce the number of queries to at most log(n)
* @param from
* @param to
* @return
*/
static int queryUp(int from, int to) {
int curr = from;
int ans = 0;
while(chain[curr] != chain[to]) {
ans = max(ans, query(position[chainHead[chain[curr]]], position[curr]));
curr = parent[chainHead[chain[curr]]][0];
}
ans = max(ans, query(position[to] + 1, position[curr]));
return ans;
}
//calculates lca of node u and node v
static int lca(int u, int v) {
if(level[u]>level[v]) {
int temp = u;
u = v;
v = temp;
}
int diff = level[v] - level[u];
for(int i=MAX;i>=0;--i) {
if((diff&(1<<i))!=0) {
v = parent[v][i];
}
}
if(u==v) {
return u;
}
for(int i=MAX;i>=0;--i) {
if(parent[u][i] != parent[v][i]) {
u = parent[u][i];
v = parent[v][i];
}
}
return parent[u][0];
}
//segment tree build
static void build(int treein,int low,int high)
{
if(low==high)
tree[treein] = arr[low];
else
{
int mid = (low+high)>>1;
build(2*treein,low,mid);
build(2*treein+1,mid+1,high);
tree[treein] = max(tree[2*treein],tree[2*treein+1]);
}
}
//segment tree update
static void update(int treein,int low,int high,int idx,int val)
{
if(low==high)
tree[treein] = val;
else
{
int mid = (low+high)>>1;
if(idx<=mid)
update(2*treein,low,mid,idx,val);
else update(2*treein+1,mid+1,high,idx,val);
tree[treein] = max(tree[2*treein],tree[2*treein+1]);
}
}
//segment tree query
static int query(int treein,int low,int high,int l,int r)
{
if(l<=low && high<=r)
return tree[treein];
if(low>r || high<l)
return 0;
int mid = (low+high)>>1;
return max(query(2*treein,low,mid,l,r),query(2*treein+1,mid+1,high,l,r));
}
static int query(int l,int r)
{
if(l>r) {
return 0;
}
return query(1,0,n-1,l,r);
}
static void update(int idx,int val)
{
update(1,0,n-1,idx,val);
}
static class Pair implements Comparable<Pair>
{
int x,y;
Pair(int x,int y)
{
this.x=x;
this.y=y;
}
public int compareTo(Pair other)
{
if(this.x!=other.x)
return this.x-other.x;
return this.y-other.y;
}
{
return "("+x+","+y+")";
}
}
}
/*
2
3
1 2 1
1 3 2
QUERY 1 2
CHANGE 1 3
QUERY 1 2
DONE
3
1 2 1
1 3 2
QUERY 1 2
CHANGE 1 3
QUERY 1 2
DONE
*/
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC4qOwoKCnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIC8vcHJvYmxlbSBzcGVjaWZpYyB2YXJpYWJsZXMKICAgIHN0YXRpYyBBcnJheUxpc3Q8UGFpcj4gYWRqW107CiAgICBzdGF0aWMgaW50IFVbXSwgVltdOwoKICAgIC8vSExEIHN0dWZmCiAgICBzdGF0aWMgaW50IHN1YnRyZWVfc2l6ZVtdLCBjaGFpbltdLCBjaGFpbkhlYWRbXSwgcG9zaXRpb25bXSwgY2hhaW5JZCA9IDAscG9zID0gMDsKICAgIAogICAgLy9MQ0Egc3R1ZmYKICAgIHN0YXRpYyBpbnQgcGFyZW50W11bXSwgbGV2ZWxbXSwgTUFYOwoKICAgIC8vU2VnbWVudCB0cmVlIHJlbGF0ZWQgc3R1ZmYKICAgIHN0YXRpYyBpbnQgbiwgYXJyW10sIHRyZWVbXTsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoU3lzdGVtLmluKTsKICAgICAgICBpbnQgdCA9IHNjYW5uZXIubmV4dEludCgpOwogICAgICAgIHdoaWxlKHQtLT4wKSB7CiAgICAgICAgICAgIC8vcmVzZXQKICAgICAgICAgICAgY2hhaW5JZCA9IDA7CiAgICAgICAgICAgIHBvcyA9IDA7CgogICAgICAgICAgICBuID0gc2Nhbm5lci5uZXh0SW50KCk7CiAgICAgICAgICAgIE1BWCA9IChpbnQpKGxvZyhuKS9sb2coMikpOwogICAgICAgICAgICBhZGogPSBuZXcgQXJyYXlMaXN0W24rMV07CiAgICAgICAgICAgIGZvcihpbnQgaT0xO2k8PW47KytpKSB7CiAgICAgICAgICAgICAgICBhZGpbaV0gPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBVID0gbmV3IGludFtuXTsKICAgICAgICAgICAgViA9IG5ldyBpbnRbbl07CiAgICAgICAgICAgIGZvcihpbnQgaT0xO2k8bjsrK2kpIHsKICAgICAgICAgICAgICAgIGludCB1ID0gc2Nhbm5lci5uZXh0SW50KCksIHYgPSBzY2FubmVyLm5leHRJbnQoKSwgYyA9IHNjYW5uZXIubmV4dEludCgpOwogICAgICAgICAgICAgICAgYWRqW3VdLmFkZChuZXcgUGFpcih2LCBjKSk7CiAgICAgICAgICAgICAgICBhZGpbdl0uYWRkKG5ldyBQYWlyKHUsIGMpKTsKICAgICAgICAgICAgICAgIFVbaV0gPSB1OwogICAgICAgICAgICAgICAgVltpXSA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyZW50ID0gbmV3IGludFtuKzFdW01BWCsxXTsKICAgICAgICAgICAgY2hhaW4gPSBuZXcgaW50W24rMV07CiAgICAgICAgICAgIGNoYWluSGVhZCA9IG5ldyBpbnRbbisxXTsKICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgaW50W24rMV07CiAgICAgICAgICAgIHN1YnRyZWVfc2l6ZSA9IG5ldyBpbnRbbisxXTsKICAgICAgICAgICAgYXJyID0gbmV3IGludFtuXTsKICAgICAgICAgICAgbGV2ZWwgPSBuZXcgaW50W24rMV07CiAgICAgICAgICAgIGludCBzeiA9IChpbnQpcG93KDIsIGNlaWwobG9nKG4pL2xvZygyKSkgKyAxKTsKICAgICAgICAgICAgdHJlZSA9IG5ldyBpbnRbc3pdOwogICAgICAgICAgICBkZnMoMSwwLCAwKTsKICAgICAgICAgICAgY2hhaW5IZWFkWzBdID0gMTsKICAgICAgICAgICAgSExEKDEsMCk7CiAgICAgICAgICAgIC8vcHJpbnQgdGhlIGFycmF5CiAgICAgICAgICAgIGJ1aWxkKDEsMCwgbi0xKTsKICAgICAgICAgICAgd2hpbGUodHJ1ZSkgewogICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzY2FubmVyLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmKHMuZXF1YWxzKCJET05FIikpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHMuZXF1YWxzKCJRVUVSWSIpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IHUgPSBzY2FubmVyLm5leHRJbnQoKSwgdiA9IHNjYW5uZXIubmV4dEludCgpICwgTENBID0gbGNhKHUsdik7CiAgICAgICAgICAgICAgICAgICAgaW50IG1heCA9IDA7CiAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KG1heCwgcXVlcnlVcCh1LCBMQ0EpKTsKICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgobWF4LCBxdWVyeVVwKHYsIExDQSkpOwogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtYXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHNjYW5uZXIubmV4dEludCgpLCBjb3N0ID0gc2Nhbm5lci5uZXh0SW50KCk7CiAgICAgICAgICAgICAgICAgICAgaW50IHUgPSBVW2lkeF0sIHYgPSBWW2lkeF07CiAgICAgICAgICAgICAgICAgICAgaWYobGV2ZWxbdV0+bGV2ZWxbdl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHBvc2l0aW9uW3VdLCBjb3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShwb3NpdGlvblt2XSwgY29zdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc3RhdGljIHZvaWQgZGZzKGludCB2LCBpbnQgcGFyLCBpbnQgbCkgewogICAgICAgIHBhcmVudFt2XVswXSA9IHBhcjsKICAgICAgICBmb3IoaW50IGk9MTtpPD1NQVg7KytpKSB7CiAgICAgICAgICAgIGlmKHBhcmVudFt2XVtpLTFdIT0wKSB7CiAgICAgICAgICAgICAgICBwYXJlbnRbdl1baV0gPSBwYXJlbnRbcGFyZW50W3ZdW2ktMV1dW2ktMV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3VidHJlZV9zaXplW3ZdICs9IDE7CiAgICAgICAgbGV2ZWxbdl0gPSBsOwogICAgICAgIGZvcihQYWlyIHAgOiBhZGpbdl0pIHsKICAgICAgICAgICAgaWYocC54IT1wYXIpIHsKICAgICAgICAgICAgICAgIGRmcyhwLngsIHYsIGwrMSk7CiAgICAgICAgICAgICAgICBzdWJ0cmVlX3NpemVbdl0rPXN1YnRyZWVfc2l6ZVtwLnhdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAgLyoqCiAgICAgICogRGVjb21wb3NlIHRoZSB0cmVlIGludG8gY2hhaW5zLCBrZWVwaW5nIGFsbCBvZiBhbGwgdmFsdWVzIHdlIG5lZWQKICAgICovCiAgICBzdGF0aWMgdm9pZCBITEQoaW50IHYsIGludCBwYXIpIHsKICAgICAgICBpbnQgaGVhdnlDaGlsZCA9IC0xLCBoZWF2eVNpemUgPSAwLGhlYXZ5RWRnZVdlaWdodCA9IC0xOwogICAgICAgIGNoYWluW3ZdID0gY2hhaW5JZDsKICAgICAgICBwb3NpdGlvblt2XSA9IHBvcysrOwogICAgICAgIGZvcihQYWlyIHAgOiBhZGpbdl0pIHsKICAgICAgICAgICAgaWYocC54IT1wYXIpIHsKICAgICAgICAgICAgICAgIGlmKHN1YnRyZWVfc2l6ZVtwLnhdID4gaGVhdnlTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhdnlTaXplID0gc3VidHJlZV9zaXplW3AueF07CiAgICAgICAgICAgICAgICAgICAgaGVhdnlDaGlsZCA9IHAueDsKICAgICAgICAgICAgICAgICAgICBoZWF2eUVkZ2VXZWlnaHQgPSBwLnk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoaGVhdnlDaGlsZCE9LTEpIHsKICAgICAgICAgICAgYXJyW3Bvc10gPSBoZWF2eUVkZ2VXZWlnaHQ7CiAgICAgICAgICAgIEhMRChoZWF2eUNoaWxkLCB2KTsKICAgICAgICB9CiAgICAgICAgZm9yKFBhaXIgcCA6IGFkalt2XSkgewogICAgICAgICAgICBpZihwLnggIT0gcGFyICYmIHAueCAhPSBoZWF2eUNoaWxkKSB7CiAgICAgICAgICAgICAgICBjaGFpbklkKys7CiAgICAgICAgICAgICAgICBjaGFpbkhlYWRbY2hhaW5JZF0gPSBwLng7CiAgICAgICAgICAgICAgICBhcnJbcG9zXSA9IHAueTsKICAgICAgICAgICAgICAgIEhMRChwLngsIHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBpbiBwYXRoIGZyb20gbm9kZSBmcm9tIHRvIG5vZGUgdG8uIE5vZGUgdG8gc2hvdWxkIGJlIGEgYW5jZXN0b3Igb2YgZnJvbS4KICAgICAqIFVzZXMgdGhlIGRlY29tcG9zaXRpb24gdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgcXVlcmllcyB0byAgYXQgbW9zdCBsb2cobikKICAgICAqIEBwYXJhbSBmcm9tCiAgICAgKiBAcGFyYW0gdG8KICAgICAqIEByZXR1cm4KICAgICAqLwogICAgc3RhdGljIGludCBxdWVyeVVwKGludCBmcm9tLCBpbnQgdG8pIHsKICAgICAgICBpbnQgY3VyciA9IGZyb207CiAgICAgICAgaW50IGFucyA9IDA7CiAgICAgICAgd2hpbGUoY2hhaW5bY3Vycl0gIT0gY2hhaW5bdG9dKSB7CiAgICAgICAgICAgIGFucyA9IG1heChhbnMsIHF1ZXJ5KHBvc2l0aW9uW2NoYWluSGVhZFtjaGFpbltjdXJyXV1dLCBwb3NpdGlvbltjdXJyXSkpOwogICAgICAgICAgICBjdXJyID0gcGFyZW50W2NoYWluSGVhZFtjaGFpbltjdXJyXV1dWzBdOwogICAgICAgIH0KICAgICAgICBhbnMgPSBtYXgoYW5zLCBxdWVyeShwb3NpdGlvblt0b10gKyAxLCBwb3NpdGlvbltjdXJyXSkpOwogICAgICAgIHJldHVybiBhbnM7CiAgICB9CiAgICAKICAgIC8vY2FsY3VsYXRlcyBsY2Egb2Ygbm9kZSB1IGFuZCBub2RlIHYKICAgIHN0YXRpYyBpbnQgbGNhKGludCB1LCBpbnQgdikgewogICAgICAgIGlmKGxldmVsW3VdPmxldmVsW3ZdKSB7CiAgICAgICAgICAgIGludCB0ZW1wID0gdTsKICAgICAgICAgICAgdSA9IHY7CiAgICAgICAgICAgIHYgPSB0ZW1wOwogICAgICAgIH0KICAgICAgICBpbnQgZGlmZiA9IGxldmVsW3ZdIC0gbGV2ZWxbdV07CiAgICAgICAgZm9yKGludCBpPU1BWDtpPj0wOy0taSkgewogICAgICAgICAgICBpZigoZGlmZiYoMTw8aSkpIT0wKSB7CiAgICAgICAgICAgICAgICB2ID0gcGFyZW50W3ZdW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKHU9PXYpIHsKICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaT1NQVg7aT49MDstLWkpIHsKICAgICAgICAgICAgaWYocGFyZW50W3VdW2ldICE9IHBhcmVudFt2XVtpXSkgewogICAgICAgICAgICAgICAgdSA9IHBhcmVudFt1XVtpXTsKICAgICAgICAgICAgICAgIHYgPSBwYXJlbnRbdl1baV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmVudFt1XVswXTsKICAgIH0KICAgIAogICAgLy9zZWdtZW50IHRyZWUgYnVpbGQKICAgIHN0YXRpYyB2b2lkIGJ1aWxkKGludCB0cmVlaW4saW50IGxvdyxpbnQgaGlnaCkKICAgIHsKICAgICAgICBpZihsb3c9PWhpZ2gpCiAgICAgICAgICAgIHRyZWVbdHJlZWluXSA9IGFycltsb3ddOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGludCBtaWQgPSAobG93K2hpZ2gpPj4xOwogICAgICAgICAgICBidWlsZCgyKnRyZWVpbixsb3csbWlkKTsKICAgICAgICAgICAgYnVpbGQoMip0cmVlaW4rMSxtaWQrMSxoaWdoKTsKICAgICAgICAgICAgdHJlZVt0cmVlaW5dID0gbWF4KHRyZWVbMip0cmVlaW5dLHRyZWVbMip0cmVlaW4rMV0pOwogICAgICAgIH0KICAgIH0KICAgIC8vc2VnbWVudCB0cmVlIHVwZGF0ZQogICAgc3RhdGljIHZvaWQgdXBkYXRlKGludCB0cmVlaW4saW50IGxvdyxpbnQgaGlnaCxpbnQgaWR4LGludCB2YWwpCiAgICB7CiAgICAgICAgaWYobG93PT1oaWdoKQogICAgICAgICAgICB0cmVlW3RyZWVpbl0gPSB2YWw7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW50IG1pZCA9IChsb3craGlnaCk+PjE7CiAgICAgICAgICAgIGlmKGlkeDw9bWlkKQogICAgICAgICAgICAgICAgdXBkYXRlKDIqdHJlZWluLGxvdyxtaWQsaWR4LHZhbCk7CiAgICAgICAgICAgIGVsc2UgdXBkYXRlKDIqdHJlZWluKzEsbWlkKzEsaGlnaCxpZHgsdmFsKTsKICAgICAgICAgICAgdHJlZVt0cmVlaW5dID0gbWF4KHRyZWVbMip0cmVlaW5dLHRyZWVbMip0cmVlaW4rMV0pOwogICAgICAgIH0KICAgIH0KICAgIC8vc2VnbWVudCB0cmVlIHF1ZXJ5CiAgICBzdGF0aWMgaW50IHF1ZXJ5KGludCB0cmVlaW4saW50IGxvdyxpbnQgaGlnaCxpbnQgbCxpbnQgcikKICAgIHsKICAgICAgICBpZihsPD1sb3cgJiYgaGlnaDw9cikKICAgICAgICAgICAgcmV0dXJuIHRyZWVbdHJlZWluXTsKICAgICAgICBpZihsb3c+ciB8fCBoaWdoPGwpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGludCBtaWQgPSAobG93K2hpZ2gpPj4xOwogICAgICAgIHJldHVybiBtYXgocXVlcnkoMip0cmVlaW4sbG93LG1pZCxsLHIpLHF1ZXJ5KDIqdHJlZWluKzEsbWlkKzEsaGlnaCxsLHIpKTsKICAgIH0KICAgIHN0YXRpYyBpbnQgcXVlcnkoaW50IGwsaW50IHIpCiAgICB7CiAgICAgICAgaWYobD5yKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcXVlcnkoMSwwLG4tMSxsLHIpOwogICAgfQogICAgc3RhdGljIHZvaWQgdXBkYXRlKGludCBpZHgsaW50IHZhbCkKICAgIHsKICAgICAgICB1cGRhdGUoMSwwLG4tMSxpZHgsdmFsKTsKICAgIH0KICAgIHN0YXRpYyBjbGFzcyBQYWlyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQYWlyPgogICAgewogICAgICAgIGludCB4LHk7CiAgICAgICAgUGFpcihpbnQgeCxpbnQgeSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMueD14OwogICAgICAgICAgICB0aGlzLnk9eTsKICAgICAgICB9CiAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oUGFpciBvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIGlmKHRoaXMueCE9b3RoZXIueCkKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLngtb3RoZXIueDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMueS1vdGhlci55OwogICAgICAgIH0KICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAiKCIreCsiLCIreSsiKSI7CiAgICAgICAgfQogICAgfQp9Ci8qCjIKCjMKMSAyIDEKMSAzIDIKUVVFUlkgMSAyCkNIQU5HRSAxIDMKUVVFUlkgMSAyCkRPTkUKCjMKMSAyIDEKMSAzIDIKUVVFUlkgMSAyCkNIQU5HRSAxIDMKUVVFUlkgMSAyCkRPTkUKICov