/**********************************************
Author : smiley007
***********************************************/
//Data Structure Includes
#include <vector>
#include <queue>
#include <deque>
#include <bitset>
#include <stack>
#include <list>
#include <set>
#include <map>
#include <unordered_set>
//Other Includes
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cctype>
#include <cassert>
#include <numeric>
#include <algorithm>
#include <ctime>
#include <sstream>
#include <climits>
#include <iomanip>
using namespace std ;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<vvll> vvvll;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
typedef vector<vpii> vvpii;
typedef vector<pll> vpll;
typedef vector<vpll> vvpll;
typedef vector<vvpll> vvvpll;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef vector<vs> vvs;
#ifdef LocalHost
#define eprintf(...) fprintf(stderr,__VA_ARGS__)
#endif
//Code Begins Here ------ >>>
class HLD {
private:
const static int N = 1e4 + 44;
const static int LN = 14;
int parent[N], depth[N], subsize[N];
int chainNum[N], valuePos[N], chainPos[N], chainHead[N] = {-1};
int tree[2 * N];
vpii g[N];
int a[N], b[N];
int p[N][LN]; //[#node][height from node]
int currChain = 0; // # of available chains
int n;
int ptr = 0;
public:
void reset() {
ptr = 0;
currChain = 0;
for (int i = 1; i <= n; i++) {
chainHead[i] = -1;
g[i].clear();
for (int j = 0; j < LN; j++) p[i][j] = -1;
}
}
void read() {
scanf("%d", &n);
reset();
for (int i = 1; i <= n - 1; i++) {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
a[i] = x; b[i] = y;
g[x].push_back(make_pair(y, z));
g[y].push_back(make_pair(x, z));
}
}
void solve() {
dfs(1, 0, -1);
for (int i = 1; i <= n; i++) {
p[i][0] = parent[i];
}
for (int i = 1; i < LN; i++) {
for (int j = 1; j <= n; j++) if (p[j][i - 1] != -1){
p[j][i] = p[p[j][i - 1]][i - 1];
}
}
make_hld(1, -1, 0);
build(1, ptr, 1);
}
/**
(u -> current node, l -> current level, p -> parent node)
**/
void dfs(int u, int l, int p) {
parent[u] = p;
depth[u] = l;
int res = 1;
for (auto it : g[u]) {
int v = it.first;
if (v != p) {
dfs(v, l + 1, u);
res += subsize[v];
}
}
subsize[u] = res;
return;
}
int getLCA(int a, int b) {
if (depth[a] < depth[b]) swap(a, b);
int diff = depth[a] - depth[b];
for (int i = LN - 1; i >= 0; i--) if ((diff >> i) & 1) {
a = p[a][i];
}
if (a == b) return a;
for (int i = LN - 1; i >= 0; i--) {
if (p[a][i] != p[b][i]) {
a = p[a][i];
b = p[b][i];
}
}
return p[a][0];
}
void make_hld(int curr, int p, int cst) {
if (chainHead[currChain] == -1) {
chainHead[currChain] = curr;
}
chainNum[curr] = currChain;
chainPos[curr] = ++ptr;
valuePos[ptr] = cst;
int idx = -1, mx = -1;
for (int i = 0; i < (int)g[curr].size(); i++) {
int v = g[curr][i].first;
if (v != p) {
if (mx < subsize[v]) {
mx = subsize[v];
idx = i;
}
}
}
if (idx != -1) make_hld(g[curr][idx].first, curr, g[curr][idx].second);
for (int i = 0; i < (int)g[curr].size(); i++) {
int v = g[curr][i].first;
if (v != p && i != idx) {
currChain++;
make_hld(g[curr][i].first, curr, g[curr][i].second);
}
}
}
void build(int l, int r, int idx) {
if (l == r) {
tree[idx] = valuePos[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, idx + idx);
build(mid + 1, r, idx + idx + 1);
tree[idx] = max(tree[idx + idx], tree[idx + idx + 1]);
}
void update_tree(int l, int r, int idx, int pos, int val) {
if (l == r) {
tree[idx] = val;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update_tree(l, mid, idx + idx, pos, val);
else update_tree(mid + 1, r, idx + idx + 1, pos, val);
tree[idx] = max(tree[idx + idx], tree[idx + idx + 1]);
}
void update(int numEdge, int cst) {
int u = a[numEdge];
int v = b[numEdge];
int pu = chainPos[u];
int pv = chainPos[v];
update_tree(1, ptr, 1, max(pu, pv), cst);
}
int query_tree(int l, int r, int idx, int a, int b) {
if (l > b || r < a) return 0;
if (a <= l && r <= b) return tree[idx];
int mid = (l + r) >> 1;
int ans = query_tree(l, mid, idx + idx, a, b);
ans = max(ans, query_tree(mid + 1, r, idx + idx + 1, a, b));
return ans;
}
int query(int u, int v) {
int ans = 0;
while (u != v) {
int cu = chainNum[u];
int cv = chainNum[v];
int pu = chainPos[u];
int pv = chainPos[v];
int h = chainHead[cu];
int ph = chainPos[h];
if (cu == cv) {
ans = max(ans, query_tree(1, ptr, 1, pv + 1, pu));
break;
} else {
ans = max(ans, query_tree(1, ptr, 1, ph, pu));
u = parent[h];
}
}
return ans;
}
// void out() {
// cout << "depth : \n";
// for (int i = 1; i <= n; i++)
// cout << i << " : " << depth[i] << "\n";
// cout << "\n\nparent : \n";
// for (int i = 1; i <= n; i++)
// cout << i << " : " << parent[i] << "\n";
// cout << "\n\nsubtree size : \n";
// for (int i = 1; i <= n; i++)
// cout << i << " : " << subsize[i] << "\n";
// cout << "\n";
// cout << "currChain : " << currChain << "\n";
// for (int i = 0; i <= currChain; i++) {
// for (int j = 0; j < chainSize[i]; j++) {
// cout << chains[i][j] << " ";
// }
// cout << "\n\n";
// }
// }
};
int main(){
#ifdef LocalHost
freopen("input.txt","r",stdin);
#endif
int t;
cin >> t;
HLD obj = HLD();
while (t--) {
obj.read();
obj.solve();
while (true) {
string s;
cin >> s;
if (s[0] == 'D') break;
int a, b;
cin >> a >> b;
if (s[0] == 'Q') {
int lca = obj.getLCA(a, b);
cout << max(obj.query(a, lca), obj.query(b, lca)) << "\n";
} else {
obj.update(a, b);
}
}
}
#ifdef LocalHost
cout<<endl<<"Execution time = "<<(float)clock()/CLOCKS_PER_SEC <<" s"<<endl;
#endif
return 0;
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgQXV0aG9yIDogc21pbGV5MDA3ICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovL0RhdGEgU3RydWN0dXJlIEluY2x1ZGVzCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8c2V0PiAgICAgICAgICAKI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CgovL090aGVyIEluY2x1ZGVzCiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjYXNzZXJ0PgojaW5jbHVkZSA8bnVtZXJpYz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxpb21hbmlwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZCA7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsbGw+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGw+IHZsbDsKdHlwZWRlZiB2ZWN0b3I8dmxsPiB2dmxsOwp0eXBlZGVmIHZlY3Rvcjx2dmxsPiB2dnZsbDsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3Rvcjx2cGlpPiB2dnBpaTsKdHlwZWRlZiB2ZWN0b3I8dnBpaT4gdnZwaWk7CnR5cGVkZWYgdmVjdG9yPHBsbD4gdnBsbDsKdHlwZWRlZiB2ZWN0b3I8dnBsbD4gdnZwbGw7CnR5cGVkZWYgdmVjdG9yPHZ2cGxsPiB2dnZwbGw7CnR5cGVkZWYgdmVjdG9yPHZpPiB2dmk7CnR5cGVkZWYgdmVjdG9yPHN0cmluZz4gdnM7CnR5cGVkZWYgdmVjdG9yPHZzPiB2dnM7CgojaWZkZWYgTG9jYWxIb3N0CiAgICAjZGVmaW5lIGVwcmludGYoLi4uKSBmcHJpbnRmKHN0ZGVycixfX1ZBX0FSR1NfXykKI2VuZGlmCgovL0NvZGUgQmVnaW5zIEhlcmUgLS0tLS0tID4+PgoKCmNsYXNzIEhMRCB7Cgpwcml2YXRlOgogICAgY29uc3Qgc3RhdGljIGludCBOID0gMWU0ICsgNDQ7CiAgICBjb25zdCBzdGF0aWMgaW50IExOID0gMTQ7CiAgICBpbnQgcGFyZW50W05dLCBkZXB0aFtOXSwgc3Vic2l6ZVtOXTsKICAgIGludCBjaGFpbk51bVtOXSwgdmFsdWVQb3NbTl0sIGNoYWluUG9zW05dLCBjaGFpbkhlYWRbTl0gPSB7LTF9OwogICAgaW50IHRyZWVbMiAqIE5dOwogICAgdnBpaSBnW05dOwogICAgaW50IGFbTl0sIGJbTl07CiAgICBpbnQgcFtOXVtMTl07IC8vWyNub2RlXVtoZWlnaHQgZnJvbSBub2RlXQogICAgaW50IGN1cnJDaGFpbiA9IDA7IC8vICMgb2YgYXZhaWxhYmxlIGNoYWlucwogICAgaW50IG47CiAgICBpbnQgcHRyID0gMDsKCnB1YmxpYzoKCiAgICB2b2lkIHJlc2V0KCkgewogICAgICAgIHB0ciA9IDA7CiAgICAgICAgY3VyckNoYWluID0gMDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIGNoYWluSGVhZFtpXSA9IC0xOwogICAgICAgICAgICBnW2ldLmNsZWFyKCk7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTE47IGorKykgICAgcFtpXVtqXSA9IC0xOwogICAgICAgIH0KCiAgICB9CgogICAgIHZvaWQgcmVhZCgpIHsKICAgICAgICBzY2FuZigiJWQiLCAmbik7CiAgICAgICAgcmVzZXQoKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIGludCB4LCB5LCB6OwogICAgICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCAmeCwgJnksICZ6KTsKICAgICAgICAgICAgYVtpXSA9IHg7ICAgYltpXSA9IHk7CiAgICAgICAgICAgIGdbeF0ucHVzaF9iYWNrKG1ha2VfcGFpcih5LCB6KSk7CiAgICAgICAgICAgIGdbeV0ucHVzaF9iYWNrKG1ha2VfcGFpcih4LCB6KSk7CiAgICAgICAgfQoKICAgIH0KCiAgICB2b2lkIHNvbHZlKCkgewogICAgICAgIAogICAgICAgIGRmcygxLCAwLCAtMSk7IAogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBwW2ldWzBdID0gcGFyZW50W2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IExOOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgaisrKSBpZiAocFtqXVtpIC0gMV0gIT0gLTEpewogICAgICAgICAgICAgICAgcFtqXVtpXSA9IHBbcFtqXVtpIC0gMV1dW2kgLSAxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtYWtlX2hsZCgxLCAtMSwgMCk7CiAgICAgICAgYnVpbGQoMSwgcHRyLCAxKTsKICAgICAgICAKICAgIH0KCiAgIAoKICAgIC8qKgogICAgKHUgLT4gY3VycmVudCBub2RlLCBsIC0+IGN1cnJlbnQgbGV2ZWwsIHAgLT4gcGFyZW50IG5vZGUpCiAgICAqKi8KICAgIHZvaWQgZGZzKGludCB1LCBpbnQgbCwgaW50IHApIHsKICAgICAgICBwYXJlbnRbdV0gPSBwOwogICAgICAgIGRlcHRoW3VdID0gbDsKICAgICAgICBpbnQgcmVzID0gMTsKICAgICAgICBmb3IgKGF1dG8gaXQgOiBnW3VdKSB7CiAgICAgICAgICAgIGludCB2ID0gaXQuZmlyc3Q7CiAgICAgICAgICAgIGlmICh2ICE9IHApIHsKICAgICAgICAgICAgICAgIGRmcyh2LCBsICsgMSwgdSk7CiAgICAgICAgICAgICAgICByZXMgKz0gc3Vic2l6ZVt2XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdWJzaXplW3VdID0gcmVzOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgZ2V0TENBKGludCBhLCBpbnQgYikgewogICAgICAgIGlmIChkZXB0aFthXSA8IGRlcHRoW2JdKSAgICBzd2FwKGEsIGIpOwogICAgICAgIGludCBkaWZmID0gZGVwdGhbYV0gLSBkZXB0aFtiXTsKICAgICAgICBmb3IgKGludCBpID0gTE4gLSAxOyBpID49IDA7IGktLSkgICBpZiAoKGRpZmYgPj4gaSkgJiAxKSB7CiAgICAgICAgICAgIGEgPSBwW2FdW2ldOwogICAgICAgIH0KICAgICAgICBpZiAoYSA9PSBiKSByZXR1cm4gYTsKICAgICAgICBmb3IgKGludCBpID0gTE4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAocFthXVtpXSAhPSBwW2JdW2ldKSB7CiAgICAgICAgICAgICAgICBhID0gcFthXVtpXTsKICAgICAgICAgICAgICAgIGIgPSBwW2JdW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwW2FdWzBdOwogICAgfQoKCiAgICB2b2lkIG1ha2VfaGxkKGludCBjdXJyLCBpbnQgcCwgaW50IGNzdCkgewogICAgICAgIGlmIChjaGFpbkhlYWRbY3VyckNoYWluXSA9PSAtMSkgewogICAgICAgICAgICBjaGFpbkhlYWRbY3VyckNoYWluXSA9IGN1cnI7CiAgICAgICAgfSAgCiAgICAgICAgY2hhaW5OdW1bY3Vycl0gPSBjdXJyQ2hhaW47CiAgICAgICAgY2hhaW5Qb3NbY3Vycl0gPSArK3B0cjsKICAgICAgICB2YWx1ZVBvc1twdHJdID0gY3N0OwogICAgICAgIGludCBpZHggPSAtMSwgbXggPSAtMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZ1tjdXJyXS5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpbnQgdiA9IGdbY3Vycl1baV0uZmlyc3Q7CiAgICAgICAgICAgIGlmICh2ICE9IHApIHsKICAgICAgICAgICAgICAgIGlmIChteCA8IHN1YnNpemVbdl0pIHsKICAgICAgICAgICAgICAgICAgICBteCA9IHN1YnNpemVbdl07CiAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaWR4ICE9IC0xKSAgbWFrZV9obGQoZ1tjdXJyXVtpZHhdLmZpcnN0LCBjdXJyLCBnW2N1cnJdW2lkeF0uc2Vjb25kKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZ1tjdXJyXS5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpbnQgdiA9IGdbY3Vycl1baV0uZmlyc3Q7CiAgICAgICAgICAgIGlmICh2ICE9IHAgJiYgaSAhPSBpZHgpIHsKICAgICAgICAgICAgICAgIGN1cnJDaGFpbisrOwogICAgICAgICAgICAgICAgbWFrZV9obGQoZ1tjdXJyXVtpXS5maXJzdCwgY3VyciwgZ1tjdXJyXVtpXS5zZWNvbmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgYnVpbGQoaW50IGwsIGludCByLCBpbnQgaWR4KSB7CiAgICAgICAgaWYgKGwgPT0gcikgewogICAgICAgICAgICB0cmVlW2lkeF0gPSB2YWx1ZVBvc1tsXTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBidWlsZChsLCBtaWQsIGlkeCArIGlkeCk7CiAgICAgICAgYnVpbGQobWlkICsgMSwgciwgaWR4ICsgaWR4ICsgMSk7CiAgICAgICAgdHJlZVtpZHhdID0gbWF4KHRyZWVbaWR4ICsgaWR4XSwgdHJlZVtpZHggKyBpZHggKyAxXSk7CiAgICB9CgogICAgdm9pZCB1cGRhdGVfdHJlZShpbnQgbCwgaW50IHIsIGludCBpZHgsIGludCBwb3MsIGludCB2YWwpIHsKICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgIHRyZWVbaWR4XSA9IHZhbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIGlmIChwb3MgPD0gbWlkKSB1cGRhdGVfdHJlZShsLCBtaWQsIGlkeCArIGlkeCwgcG9zLCB2YWwpOwogICAgICAgIGVsc2UgICAgdXBkYXRlX3RyZWUobWlkICsgMSwgciwgaWR4ICsgaWR4ICsgMSwgcG9zLCB2YWwpOwogICAgICAgIHRyZWVbaWR4XSA9IG1heCh0cmVlW2lkeCArIGlkeF0sIHRyZWVbaWR4ICsgaWR4ICsgMV0pOwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBudW1FZGdlLCBpbnQgY3N0KSB7CiAgICAgICAgaW50IHUgPSBhW251bUVkZ2VdOwogICAgICAgIGludCB2ID0gYltudW1FZGdlXTsKCiAgICAgICAgaW50IHB1ID0gY2hhaW5Qb3NbdV07CiAgICAgICAgaW50IHB2ID0gY2hhaW5Qb3Nbdl07CgogICAgICAgIHVwZGF0ZV90cmVlKDEsIHB0ciwgMSwgbWF4KHB1LCBwdiksIGNzdCk7CiAgICAgICAgCiAgICB9CgogICAgaW50IHF1ZXJ5X3RyZWUoaW50IGwsIGludCByLCBpbnQgaWR4LCBpbnQgYSwgaW50IGIpIHsKICAgICAgICBpZiAobCA+IGIgfHwgciA8IGEpIHJldHVybiAwOwogICAgICAgIGlmIChhIDw9IGwgJiYgciA8PSBiKSAgIHJldHVybiB0cmVlW2lkeF07CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBpbnQgYW5zID0gcXVlcnlfdHJlZShsLCBtaWQsIGlkeCArIGlkeCwgYSwgYik7CiAgICAgICAgYW5zID0gbWF4KGFucywgcXVlcnlfdHJlZShtaWQgKyAxLCByLCBpZHggKyBpZHggKyAxLCBhLCBiKSk7CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KCiAgICBpbnQgcXVlcnkoaW50IHUsIGludCB2KSB7CiAgICAgICAgaW50IGFucyA9IDA7CiAgICAgICAgd2hpbGUgKHUgIT0gdikgewogICAgICAgICAgICBpbnQgY3UgPSBjaGFpbk51bVt1XTsKICAgICAgICAgICAgaW50IGN2ID0gY2hhaW5OdW1bdl07CiAgICAgICAgICAgIGludCBwdSA9IGNoYWluUG9zW3VdOwogICAgICAgICAgICBpbnQgcHYgPSBjaGFpblBvc1t2XTsKICAgICAgICAgICAgaW50IGggPSBjaGFpbkhlYWRbY3VdOwogICAgICAgICAgICBpbnQgcGggPSBjaGFpblBvc1toXTsKICAgICAgICAgICAgaWYgKGN1ID09IGN2KSB7ICAgCiAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBxdWVyeV90cmVlKDEsIHB0ciwgMSwgcHYgKyAxLCBwdSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBxdWVyeV90cmVlKDEsIHB0ciwgMSwgcGgsIHB1KSk7CiAgICAgICAgICAgICAgICB1ID0gcGFyZW50W2hdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnM7CiAgICB9ICAgCgoKICAgIC8vIHZvaWQgb3V0KCkgewogICAgLy8gICAgIGNvdXQgPDwgImRlcHRoIDogXG4iOwogICAgLy8gICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIC8vICAgICAgICAgY291dCA8PCBpIDw8ICIgOiAgIiA8PCBkZXB0aFtpXSA8PCAiXG4iOwogICAgLy8gICAgIGNvdXQgPDwgIlxuXG5wYXJlbnQgOiBcbiI7CiAgICAvLyAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgLy8gICAgICAgICBjb3V0IDw8IGkgPDwgIiA6ICAiIDw8IHBhcmVudFtpXSA8PCAiXG4iOwogICAgLy8gICAgIGNvdXQgPDwgIlxuXG5zdWJ0cmVlIHNpemUgOiBcbiI7CiAgICAvLyAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgLy8gICAgICAgICBjb3V0IDw8IGkgPDwgIiA6ICAiIDw8IHN1YnNpemVbaV0gPDwgIlxuIjsKICAgIC8vICAgICBjb3V0IDw8ICJcbiI7CiAgICAvLyAgICAgY291dCA8PCAiY3VyckNoYWluIDogIiA8PCBjdXJyQ2hhaW4gPDwgIlxuIjsKICAgIC8vICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBjdXJyQ2hhaW47IGkrKykgewogICAgLy8gICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYWluU2l6ZVtpXTsgaisrKSB7CiAgICAvLyAgICAgICAgICAgICBjb3V0IDw8IGNoYWluc1tpXVtqXSA8PCAiICI7CiAgICAvLyAgICAgICAgIH0KICAgIC8vICAgICAgICAgY291dCA8PCAiXG5cbiI7CiAgICAvLyAgICAgfQogICAgLy8gfQoKCn07CgoKCmludCBtYWluKCl7CiAgICAjaWZkZWYgTG9jYWxIb3N0CiAgICAgICAgZnJlb3BlbigiaW5wdXQudHh0IiwiciIsc3RkaW4pOwogICAgI2VuZGlmCgogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIEhMRCBvYmogPSBITEQoKTsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBvYmoucmVhZCgpOwogICAgICAgIG9iai5zb2x2ZSgpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHN0cmluZyBzOwogICAgICAgICAgICBjaW4gPj4gczsKICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ0QnKSAgICBicmVhazsKICAgICAgICAgICAgaW50IGEsIGI7CiAgICAgICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgICAgIGlmIChzWzBdID09ICdRJykgewogICAgICAgICAgICAgICAgaW50IGxjYSA9IG9iai5nZXRMQ0EoYSwgYik7CiAgICAgICAgICAgICAgICBjb3V0IDw8IG1heChvYmoucXVlcnkoYSwgbGNhKSwgb2JqLnF1ZXJ5KGIsIGxjYSkpIDw8ICJcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvYmoudXBkYXRlKGEsIGIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCgoKCgoKCgoKCiAgICAjaWZkZWYgTG9jYWxIb3N0CiAgICAgICAgY291dDw8ZW5kbDw8IkV4ZWN1dGlvbiB0aW1lID0gIjw8KGZsb2F0KWNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMgPDwiIHMiPDxlbmRsOwogICAgI2VuZGlmCgogICAgCgogICAgcmV0dXJuIDA7Cn0=