Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
FC3C8E0CA07FE9B497722F49F1C7D2F8C2C9F049FFC63BA764AA28A66BC7F177
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
100,000,000
Requested gas limit
GAS USED
28,636,042
Gas consumed
FEE
1000000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr20000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CuOqAQoML3ZtLm1fYWRkcGtnEtGqAQooZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3chKUqgEKB21pbGxpb24SPmduby5sYW5kL3IvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9taWxsaW9uL3YwGtYICglSRUFETUUubWQSyAgjIG1pbGxpb24KClJlYWxtIGBnbm8ubGFuZC9yL2cxc3c1eGtseGpqdXYweXZ1eHk1ZjVzM2wzbW5qMG5xcTYyNmE5d3IvbWlsbGlvbi92MGA6IGEgMTI1MCB4IDgwMCAob25lIG1pbGxpb24gcGl4ZWxzLCAxNjoxMCkgcGF5LXBlci1waXhlbCBjYW52YXMKYnVpbHQgb24gYGduby5sYW5kL3AvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9jYW52YXMvdjBgLgoKUGFpbnQgZnJvbSB0aGUgQ0xJOgoKYGBgc2gKZ25va2V5IG1ha2V0eCBjYWxsIC1wa2dwYXRoIGduby5sYW5kL3IvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9taWxsaW9uL3YwIC1mdW5jIFBhaW50QmF0Y2ggXAogIC1hcmdzICIxMCwxMCw2OzExLDEwLDYiIC1zZW5kIDEwMDAwMHVnbm90IFwKICAtZ2FzLWZlZSAxMDAwMDAwdWdub3QgLWdhcy13YW50ZWQgNTAwMDAwMCAtYnJvYWRjYXN0IC1jaGFpbmlkIGRldiAtcmVtb3RlIDEyNy4wLjAuMToyNjY1NyA8a2V5PgpgYGAKClRoZSBhbW91bnQgc2VudCBtdXN0IGVxdWFsIGBQcmljZSgpYCB0aW1lcyB0aGUgbnVtYmVyIG9mIHBpeGVscywgYW5kIHRoZQpjYWxsIG11c3QgY29tZSBkaXJlY3RseSBmcm9tIGEgdXNlciB0cmFuc2FjdGlvbi4gUGF5bWVudHMgYXJlIGZvcndhcmRlZCB0bwp0aGUgYWRtaW4gd2FsbGV0IChgT3duZXIoKWApIGFzIHRoZXkgYXJyaXZlOyB0aGUgYWRtaW4gcGFpbnRzIGZvciBmcmVlIGFuZApjYW4gYFNldFByaWNlYCwgYFdpdGhkcmF3YCBhbmQgYFRyYW5zZmVyT3duZXJzaGlwYC4gUmVhZCBmdW5jdGlvbnMgdXNlZCBieSBjbGllbnRzOgpgR2V0V2lkdGhgLCBgR2V0SGVpZ2h0YCwgYFByaWNlYCwgYFBhbGV0dGVgLCBgTWF4QmF0Y2hTaXplYCwgYFBhaW50ZWRgLApgUGl4ZWwoeCwgeSlgLCBgUm93cyhmcm9tLCB0bylgLCBgVmVyc2lvbigpYCwgYERpcnR5Um93cyhzaW5jZSlgLgoKYFZlcnNpb24oKWAgY291bnRzIHN1Y2Nlc3NmdWwgcGFpbnQgY2FsbHMgYW5kIGBEaXJ0eVJvd3Moc2luY2UpYCBsaXN0cyB0aGUKcm93cyB0b3VjaGVkIGFmdGVyIHRoYXQgdmVyc2lvbiwgc28gY2xpZW50cyBmZXRjaCBvbmx5IHdoYXQgY2hhbmdlZC4KGmUKC2dub21vZC50b21sElZtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXN3NXhrbHhqanV2MHl2dXh5NWY1czNsM21uajBucXE2MjZhOXdyL21pbGxpb24vdjAiCmdubyA9ICIwLjkiChqlSAoLbWlsbGlvbi5nbm8SlUgvLyBQYWNrYWdlIG1pbGxpb24gaXMgYSBwYXktcGVyLXBpeGVsIGNvbGxhYm9yYXRpdmUgY2FudmFzOiBhbnlvbmUgY2FuIHBhaW50Ci8vIGFueSBwaXhlbCBvZiBhIFdpZHRoIHggSGVpZ2h0IGdyaWQgaW4gb25lIG9mIDE1IGNvbG9ycyBieSBzZW5kaW5nIGV4YWN0bHkKLy8gUHJpY2UoKSB1Z25vdCBwZXIgcGl4ZWwgYWxvbmcgd2l0aCB0aGUgY2FsbC4gUGl4ZWxzIGNhbiBiZSByZXBhaW50ZWQgYnkKLy8gYW55b25lLCBmb3IgdGhlIHNhbWUgcHJpY2UuIFBheW1lbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGFkbWluIHdhbGxldAovLyBhcyB0aGV5IGFycml2ZSwgYW5kIHRoZSBhZG1pbiBwYWludHMgZm9yIGZyZWUuCi8vCi8vIFRoZSBncmlkIGxvZ2ljIGxpdmVzIGluIGduby5sYW5kL3AvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9jYW52YXMvdjA7IHRoaXMgcmVhbG0gYWRkcyB0aGUKLy8gcGF5bWVudCBndWFyZCwgdGhlIG93bmVyIGNvbnRyb2xzIGFuZCB0aGUgcmVhZCBBUEkgdXNlZCBieSB0aGUgd2ViIGNsaWVudC4KcGFja2FnZSBtaWxsaW9uCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9jYW52YXMvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCgkvLyBXaWR0aCBhbmQgSGVpZ2h0IGFyZSBmaXhlZCBmb3IgdGhlIGxpZmUgb2YgdGhpcyB2ZXJzaW9uOiBjaGFuZ2luZwoJLy8gdGhlbSB3b3VsZCBjaGFuZ2UgdGhlIHN0b3JhZ2UgbGF5b3V0LCBzbyBpdCBtZWFucyBhIG5ldyAvdk4uCgkvLyAxMjUwIHggODAwIGlzIG9uZSBtaWxsaW9uIHBpeGVscyBpbiBhIDE2OjEwIGxhcHRvcCBhc3BlY3QgcmF0aW8uCglXaWR0aCAgPSAxMjUwCglIZWlnaHQgPSA4MDAKCgkvLyBNYXhCYXRjaCBib3VuZHMgYSBzaW5nbGUgUGFpbnRCYXRjaCBjYWxsIHNvIG9uZSB0eCBjYW5ub3QgYmxvdyB0aGUKCS8vIGJsb2NrIGdhcyBsaW1pdCBvciBvdmVyZmxvdyB0aGUgcHJpY2UgYXJpdGhtZXRpYy4KCU1heEJhdGNoID0gNTAwCgoJLy8gRGVmYXVsdFByaWNlIGlzIHRoZSBpbml0aWFsIHByaWNlIHBlciBwaXhlbCwgaW4gdWdub3QgKDAuMDUgR05PVCkuCglEZWZhdWx0UHJpY2UgaW50NjQgPSA1MF8wMDAKCgkvLyBEZWZhdWx0QWRtaW4gcmVjZWl2ZXMgZXZlcnkgcGF5bWVudCwgcGFpbnRzIGZvciBmcmVlIGFuZCBob2xkcyB0aGUKCS8vIG93bmVyIGNvbnRyb2xzLiBDaGFuZ2UgaXQgYmVmb3JlIGRlcGxveWluZzsgVHJhbnNmZXJPd25lcnNoaXAgbW92ZXMKCS8vIGl0IGFmdGVyd2FyZHMuCglEZWZhdWx0QWRtaW4gPSAiZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ciIKCglEZW5vbSA9ICJ1Z25vdCIKKQoKdmFyICgKCWJvYXJkID0gY2FudmFzLk5ldyhXaWR0aCwgSGVpZ2h0KQoJcHJpY2UgPSBEZWZhdWx0UHJpY2UKCW93bmVyID0gYWRkcmVzcyhEZWZhdWx0QWRtaW4pCgoJLy8gU3RhdHMuCglyZXZlbnVlIGludDY0IC8vIHRvdGFsIHVnbm90IGV2ZXIgcGFpZCBmb3IgcGl4ZWxzCglwYWludHMgIGludDY0IC8vIG51bWJlciBvZiBzdWNjZXNzZnVsIFBhaW50L1BhaW50QmF0Y2ggY2FsbHMKCgkvLyBDaGFuZ2UgdHJhY2tpbmcsIHNvIGNsaWVudHMgZmV0Y2ggb25seSB0aGUgcm93cyB0aGF0IG1vdmVkLgoJLy8gdmVyc2lvbiBidW1wcyBvbmNlIHBlciBzdWNjZXNzZnVsIHBhaW50IGNhbGw7IHJvd1ZlcnNpb24gaG9sZHMgdGhlCgkvLyB2ZXJzaW9uIG9mIHRoZSBsYXN0IHBhaW50IHRoYXQgdG91Y2hlZCBlYWNoIHJvdyAoMCA9IG5ldmVyIHBhaW50ZWQpLgoJdmVyc2lvbiAgICBpbnQ2NAoJcm93VmVyc2lvbiA9IG1ha2UoW11pbnQ2NCwgSGVpZ2h0KQopCgovLyBQYWludCBjb2xvcnMgb25lIHBpeGVsLiBTZW5kIGV4YWN0bHkgUHJpY2UoKSB1Z25vdCAobm90aGluZyBmb3IgdGhlIGFkbWluKS4KZnVuYyBQYWludChjdXIgcmVhbG0sIHgsIHksIGNvbG9yIGludCkgewoJaWYgY29sb3IgPD0gMCB8fCBjb2xvciA+IGludChjYW52YXMuTWF4Q29sb3IpIHsKCQlwYW5pYyhjYW52YXMuRXJySW52YWxpZENvbG9yKQoJfQoJcGFpbnQoW11jYW52YXMuUGl4ZWx7e1g6IHgsIFk6IHksIENvbG9yOiBieXRlKGNvbG9yKX19LCBjdXIpCn0KCi8vIFBhaW50QmF0Y2ggY29sb3JzIHVwIHRvIE1heEJhdGNoIHBpeGVscyBpbiBvbmUgY2FsbC4gVGhlIGFyZ3VtZW50IGlzCi8vICJ4LHksY29sb3I7eCx5LGNvbG9yOy4uLiIuIFNlbmQgZXhhY3RseSBQcmljZSgpICogY291bnQgdWdub3QgKG5vdGhpbmcKLy8gZm9yIHRoZSBhZG1pbikuCmZ1bmMgUGFpbnRCYXRjaChjdXIgcmVhbG0sIHBpeGVscyBzdHJpbmcpIHsKCXB4LCBlcnIgOj0gY2FudmFzLlBhcnNlUGl4ZWxzKHBpeGVscykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXBhaW50KHB4LCBjdXIpCn0KCi8vIHBhaW50IHRha2VzIHRoZSByZWFsbSBhcyBpdHMgTEFTVCBwYXJhbWV0ZXIgb24gcHVycG9zZTogYSByZWFsbSBmaXJzdAovLyBwYXJhbWV0ZXIgd291bGQgbWFrZSBpdCBhIGNyb3NzaW5nIGZ1bmN0aW9uIGFuZCBQcmV2aW91cygpIHdvdWxkIHRoZW4KLy8gYmUgdGhpcyByZWFsbSBpbnN0ZWFkIG9mIHRoZSB1c2VyLgpmdW5jIHBhaW50KHB4IFtdY2FudmFzLlBpeGVsLCBybG0gcmVhbG0pIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKCJzcG9vZmVkIHJlYWxtIikKCX0KCS8vIFBheW1lbnQgZ3VhcmQ6IHVuc2FmZS5PcmlnaW5TZW5kKCkgZGVzY3JpYmVzIHRoZSBjb2lucyBhdHRhY2hlZCB0bwoJLy8gdGhlIHRyYW5zYWN0aW9uLCB3aGljaCBvbmx5IHByb3ZhYmx5IGxhbmRlZCBoZXJlIHdoZW4gdGhlIGNhbGxlciBpcwoJLy8gYSBwbGFpbiB1c2VyIGNhbGwgKG5vIGludGVybWVkaWF0ZSBvciBlcGhlbWVyYWwgcmVhbG0pLiBLZWVwIHRoZSB0d28KCS8vIGNoZWNrcyB0b2dldGhlci4gdW5zYWZlIGlzIGltcG9ydGVkIGZvciBPcmlnaW5TZW5kIG9ubHk7IGNhbGxlcgoJLy8gaWRlbnRpdHkgYWx3YXlzIGNvbWVzIGZyb20gdGhlIHJlYWxtIGhhbmRsZS4KCWlmICFybG0uUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhIHVzZXIgKG1ha2V0eCBjYWxsKSIpCgl9CglwYWludGVyIDo9IHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKQoJbiA6PSBsZW4ocHgpCglpZiBuID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIHBhaW50IikKCX0KCWlmIG4gPiBNYXhCYXRjaCB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0b28gbWFueSBwaXhlbHM6ICVkID4gJWQiLCBuLCBNYXhCYXRjaCkpCgl9Cglmb3IgXywgcCA6PSByYW5nZSBweCB7CgkJaWYgZXJyIDo9IGJvYXJkLkNoZWNrKHApOyBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoZXJyKQoJCX0KCX0KCgljb3N0IDo9IHByaWNlICogaW50NjQobikKCWlmIHBhaW50ZXIgPT0gb3duZXIgewoJCWNvc3QgPSAwIC8vIHRoZSBhZG1pbiBwYWludHMgZm9yIGZyZWUKCX0KCWlmIHNlbnQgOj0gc2VudFVnbm90KHVuc2FmZS5PcmlnaW5TZW5kKCkpOyBzZW50ICE9IGNvc3QgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibXVzdCBzZW5kIGV4YWN0bHkgJWQlcyBmb3IgJWQgcGl4ZWwocyksIGdvdCAlZCVzIiwgY29zdCwgRGVub20sIG4sIHNlbnQsIERlbm9tKSkKCX0KCWlmIGNvc3QgPiAwIHsKCQkvLyBGb3J3YXJkIHRoZSBwYXltZW50IHRvIHRoZSBhZG1pbiByaWdodCBhd2F5LCBzbyBub3RoaW5nCgkJLy8gYWNjdW11bGF0ZXMgaW4gdGhlIHJlYWxtLiBCYW5rZXJUeXBlT3JpZ2luU2VuZCBjYW4gb25seSBtb3ZlCgkJLy8gd2hhdCB0aGlzIHZlcnkgbWVzc2FnZSBzZW50LCB3aGljaCBpcyBleGFjdGx5IGNvc3QuCgkJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVPcmlnaW5TZW5kLCBybG0pCgkJYm5rLlNlbmRDb2lucyhybG0uQWRkcmVzcygpLCBvd25lciwgY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihEZW5vbSwgY29zdCkpKQoJfQoKCXZlcnNpb24rKwoJZm9yIF8sIHAgOj0gcmFuZ2UgcHggewoJCWJvYXJkLlNldChwKQoJCXJvd1ZlcnNpb25bcC5ZXSA9IHZlcnNpb24KCX0KCXJldmVudWUgKz0gY29zdAoJcGFpbnRzKysKCgkvLyBUaGUgcGl4ZWwgbGlzdCBpdHNlbGYgaXMgbm90IGVtaXR0ZWQ6IGV2ZW50IGF0dHJpYnV0ZSB2YWx1ZXMgYXJlCgkvLyBzaXplLWNhcHBlZCBieSB0aGUgbm9kZSBhbmQgYSBmdWxsIGJhdGNoIGV4Y2VlZHMgaXQuIENsaWVudHMgcmUtcmVhZAoJLy8gUm93cygpIGFmdGVyIGEgcGFpbnQuCgljaGFpbi5FbWl0KCJQYWludCIsCgkJInBhaW50ZXIiLCBwYWludGVyLlN0cmluZygpLAoJCSJjb3VudCIsIHN0cmNvbnYuSXRvYShuKSwKCQkicGFpZCIsIHN0cmNvbnYuSXRvYShpbnQoY29zdCkpK0Rlbm9tLAoJKQp9CgovLyBzZW50VWdub3QgcmV0dXJucyB0aGUgdWdub3QgYW1vdW50IGluIGNvaW5zIGFuZCByZWplY3RzIGFueSBvdGhlciBkZW5vbSwKLy8gc28gYSBjYWxsZXIgY2Fubm90IHBheSB3aXRoIHNvbWV0aGluZyB0aGUgcmVhbG0gZG9lcyBub3QgcHJpY2UuCmZ1bmMgc2VudFVnbm90KGNvaW5zIGNoYWluLkNvaW5zKSBpbnQ2NCB7Cgl2YXIgYW1vdW50IGludDY0Cglmb3IgXywgYyA6PSByYW5nZSBjb2lucyB7CgkJaWYgYy5EZW5vbSAhPSBEZW5vbSB7CgkJCXBhbmljKCJvbmx5ICIgKyBEZW5vbSArICIgaXMgYWNjZXB0ZWQiKQoJCX0KCQlhbW91bnQgKz0gYy5BbW91bnQKCX0KCXJldHVybiBhbW91bnQKfQoKLy8gLS0tIG93bmVyIGNvbnRyb2xzIC0tLQoKLy8gYXNzZXJ0T3duZXIgcGFuaWNzIHVubGVzcyB0aGUgdmVyaWZpZWQgY2FsbGVyIGJlaGluZCBybG0gaXMgdGhlIG93bmVyLgovLyBUaGUgcmVhbG0gaXMgZGVsaWJlcmF0ZWx5IG5vdCB0aGUgZmlyc3QgcGFyYW1ldGVyIChzZWUgcGFpbnQpOyB0aGUKLy8gbGVhZGluZyBibGFuayBpbnQgaXMgdGhlIHNhbWUgaWRpb20gZ25vLmxhbmQvcC9udC9vd25hYmxlIHVzZXMuCmZ1bmMgYXNzZXJ0T3duZXIoXyBpbnQsIHJsbSByZWFsbSkgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG0iKQoJfQoJaWYgcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IG93bmVyIHsKCQlwYW5pYygib3duZXIgb25seSIpCgl9Cn0KCi8vIFNldFByaWNlIGNoYW5nZXMgdGhlIHByaWNlIHBlciBwaXhlbCwgaW4gdWdub3QuIFplcm8gbWFrZXMgcGFpbnRpbmcgZnJlZQovLyBmb3IgZXZlcnlvbmUuCmZ1bmMgU2V0UHJpY2UoY3VyIHJlYWxtLCB1Z25vdCBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoMCwgY3VyKQoJaWYgdWdub3QgPCAwIHsKCQlwYW5pYygicHJpY2UgbXVzdCBub3QgYmUgbmVnYXRpdmUiKQoJfQoJcHJpY2UgPSB1Z25vdAp9CgovLyBXaXRoZHJhdyBzZW5kcyBhbW91bnQgdWdub3QgaGVsZCBieSB0aGUgcmVhbG0gdG8gdGhlIGdpdmVuIGFkZHJlc3MuCi8vIFBheW1lbnRzIGFyZSBmb3J3YXJkZWQgb24gYXJyaXZhbCwgc28gdGhpcyBvbmx5IG1hdHRlcnMgZm9yIGNvaW5zIHNlbnQKLy8gdG8gdGhlIHJlYWxtIG91dHNpZGUgb2YgYSBwYWludCBjYWxsLgpmdW5jIFdpdGhkcmF3KGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglpZiAhdG8uSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBhZGRyZXNzIikKCX0KCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQoJYm5rIDo9IGJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikKCWJuay5TZW5kQ29pbnMoY3VyLkFkZHJlc3MoKSwgdG8sIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oRGVub20sIGFtb3VudCkpKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBoYW5kcyB0aGUgYWRtaW4gcm9sZSAocGF5bWVudHMsIGZyZWUgcGFpbnRpbmcgYW5kIHRoZQovLyBvd25lciBjb250cm9scykgdG8gbmV3T3duZXIuCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBuZXdPd25lciBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigwLCBjdXIpCglpZiAhbmV3T3duZXIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBhZGRyZXNzIikKCX0KCW93bmVyID0gbmV3T3duZXIKfQoKLy8gLS0tIHJlYWQgQVBJICh1c2VkIGJ5IHRoZSB3ZWIgY2xpZW50IHRocm91Z2ggdm0vcWV2YWwpIC0tLQoKZnVuYyBHZXRXaWR0aCgpIGludCAgICB7IHJldHVybiBXaWR0aCB9CmZ1bmMgR2V0SGVpZ2h0KCkgaW50ICAgeyByZXR1cm4gSGVpZ2h0IH0KZnVuYyBQcmljZSgpIGludDY0ICAgICB7IHJldHVybiBwcmljZSB9CmZ1bmMgT3duZXIoKSBhZGRyZXNzICAgeyByZXR1cm4gb3duZXIgfQpmdW5jIFBhaW50ZWQoKSBpbnQgICAgIHsgcmV0dXJuIGJvYXJkLlBhaW50ZWQoKSB9CmZ1bmMgUmV2ZW51ZSgpIGludDY0ICAgeyByZXR1cm4gcmV2ZW51ZSB9CmZ1bmMgUGFpbnRzKCkgaW50NjQgICAgeyByZXR1cm4gcGFpbnRzIH0KZnVuYyBNYXhCYXRjaFNpemUoKSBpbnQgeyByZXR1cm4gTWF4QmF0Y2ggfQoKLy8gUGl4ZWwgcmV0dXJucyB0aGUgY29sb3IgaW5kZXggYXQgKHgsIHkpOyAwIG1lYW5zIG5ldmVyIHBhaW50ZWQuCmZ1bmMgUGl4ZWwoeCwgeSBpbnQpIGludCB7IHJldHVybiBpbnQoYm9hcmQuR2V0KHgsIHkpKSB9CgovLyBSb3dzIHJldHVybnMgcm93cyBbZnJvbSwgdG8pIGFzIG9uZSBoZXggZGlnaXQgcGVyIHBpeGVsLCBXaWR0aCBkaWdpdHMgcGVyCi8vIHJvdywgd2l0aCBubyBzZXBhcmF0b3JzLiBDbGllbnRzIHBhZ2UgdGhyb3VnaCB0aGUgZ3JpZCB3aXRoIGl0LgpmdW5jIFJvd3MoZnJvbSwgdG8gaW50KSBzdHJpbmcgeyByZXR1cm4gYm9hcmQuUm93cyhmcm9tLCB0bykgfQoKLy8gVmVyc2lvbiBpcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgcGFpbnQgY2FsbHMgc28gZmFyLiBDbGllbnRzIHJlbWVtYmVyCi8vIGl0IGFuZCBhc2sgRGlydHlSb3dzIGZvciB3aGF0IGNoYW5nZWQgc2luY2UuCmZ1bmMgVmVyc2lvbigpIGludDY0IHsgcmV0dXJuIHZlcnNpb24gfQoKLy8gRGlydHlSb3dzIGxpc3RzIHRoZSByb3dzIHBhaW50ZWQgYWZ0ZXIgdmVyc2lvbiBgc2luY2VgLCBhcyAieSx5LHkiIGluCi8vIGFzY2VuZGluZyBvcmRlci4gRGlydHlSb3dzKDApIGlzIGV2ZXJ5IHJvdyB0aGF0IHdhcyBldmVyIHBhaW50ZWQsIHdoaWNoCi8vIGlzIGFsbCBhIGZyZXNoIGNsaWVudCBuZWVkcyB0byBsb2FkOiB0aGUgb3RoZXJzIGFyZSBibGFuay4KZnVuYyBEaXJ0eVJvd3Moc2luY2UgaW50NjQpIHN0cmluZyB7CglpZiBzaW5jZSA8IDAgewoJCXNpbmNlID0gMAoJfQoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIHksIHYgOj0gcmFuZ2Ugcm93VmVyc2lvbiB7CgkJaWYgdiA8PSBzaW5jZSB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIHNiLkxlbigpID4gMCB7CgkJCXNiLldyaXRlQnl0ZSgnLCcpCgkJfQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYSh5KSkKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBQYWxldHRlIHJldHVybnMgdGhlIDE2IHBhbGV0dGUgY29sb3JzIGFzIGNvbW1hLXNlcGFyYXRlZCBDU1MgaGV4IHZhbHVlcywKLy8gaW5kZXggMCBiZWluZyB0aGUgYmxhbmsgY29sb3IuCmZ1bmMgUGFsZXR0ZSgpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5ncy5Kb2luKGNhbnZhcy5QYWxldHRlWzpdLCAiLCIpCn0KCi8vIFJlbmRlciBzaG93cyB0aGUgZ2FtZSBzdGF0cyBvbiBnbm93ZWIuIFRoZSBwYXRoIGlzIGlnbm9yZWQuCmZ1bmMgUmVuZGVyKF8gc3RyaW5nKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgTWlsbGlvbiBHbm9cblxuIikKCXNiLldyaXRlU3RyaW5nKCJBIHBheS1wZXItcGl4ZWwgY2FudmFzLiBQaWNrIGEgY29sb3IsIHBheSB0aGUgcHJpY2UsIG93biB0aGUgcGl4ZWwgdW50aWwgc29tZW9uZSByZXBhaW50cyBpdC4gUGF5bWVudHMgZ28gdG8gdGhlIGFkbWluIHdhbGxldCwgd2hpY2ggcGFpbnRzIGZvciBmcmVlLlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgU2l6ZSB8ICVkIHggJWQgfFxuIiwgV2lkdGgsIEhlaWdodCkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgUHJpY2UgcGVyIHBpeGVsIHwgJWQlcyB8XG4iLCBwcmljZSwgRGVub20pKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFBpeGVscyBwYWludGVkIHwgJWQgLyAlZCB8XG4iLCBib2FyZC5QYWludGVkKCksIFdpZHRoKkhlaWdodCkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgUGFpbnQgY2FsbHMgfCAlZCB8XG4iLCBwYWludHMpKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJ8IFZlcnNpb24gfCAlZCB8XG4iLCB2ZXJzaW9uKSkKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBSZXZlbnVlIHwgJWQlcyB8XG4iLCByZXZlbnVlLCBEZW5vbSkpCglzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgQWRtaW4gfCAlcyB8XG4iLCBvd25lci5TdHJpbmcoKSkpCglzYi5Xcml0ZVN0cmluZygiXG4jIyBQYWxldHRlXG5cbiIpCglmb3IgaSA6PSAxOyBpIDw9IGludChjYW52YXMuTWF4Q29sb3IpOyBpKysgewoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiLSAlZDogYCVzYFxuIiwgaSwgY2FudmFzLlBhbGV0dGVbaV0pKQoJfQoJc2IuV3JpdGVTdHJpbmcoIlxuIyMgUGFpbnRcblxuIikKCXNiLldyaXRlU3RyaW5nKCItIFtQYWludCBvbmUgcGl4ZWxdKCIgKyBSZWFsbSArICIkaGVscCZmdW5jPVBhaW50KTogYFBhaW50KHgsIHksIGNvbG9yKWAgd2l0aCBgLXNlbmQgPHByaWNlPnVnbm90YFxuIikKCXNiLldyaXRlU3RyaW5nKCItIFtQYWludCBhIGJhdGNoXSgiICsgUmVhbG0gKyAiJGhlbHAmZnVuYz1QYWludEJhdGNoKTogYFBhaW50QmF0Y2goXCJ4LHksY29sb3I7eCx5LGNvbG9yXCIpYCB3aXRoIGAtc2VuZCA8cHJpY2UqY291bnQ+dWdub3RgXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIFJlYWxtIGlzIHRoaXMgcmVhbG0ncyBnbm93ZWIgcGF0aC4KY29uc3QgUmVhbG0gPSAiL3IvZzFzdzV4a2x4amp1djB5dnV4eTVmNXMzbDNtbmowbnFxNjI2YTl3ci9taWxsaW9uL3YwIgoavFcKEG1pbGxpb25fdGVzdC5nbm8Sp1dwYWNrYWdlIG1pbGxpb24KCmltcG9ydCAoCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKdmFyICgKCWRlcGxveWVyID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJkZXBsb3llciIpCglhbGljZSAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYWxpY2UiKQoJYm9iICAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJvYiIpCikKCnZhciByZWFsbUFkZHIgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nMXN3NXhrbHhqanV2MHl2dXh5NWY1czNsM21uajBucXE2MjZhOXdyL21pbGxpb24vdjAiKQoKLy8gVGVzdHMgb3duIHRoZSBhZG1pbiByb2xlIHRocm91Z2ggYSB0ZXN0IGFkZHJlc3MgcmF0aGVyIHRoYW4gRGVmYXVsdEFkbWluLgpmdW5jIGluaXQoKSB7Cglvd25lciA9IGRlcGxveWVyCn0KCi8vIGZ1bmQgY3JlZGl0cyB0aGUgcmVhbG0gd2l0aCB3aGF0IHRoZSBuZXh0IHBhaW50IGNhbGwgY2xhaW1zIHRvIHNlbmQsIGFzCi8vIHRoZSBjaGFpbiB3b3VsZCBiZWZvcmUgcnVubmluZyB0aGUgbWVzc2FnZSwgYW5kIHJlc2V0cyB0aGUgcGVyLW1lc3NhZ2UKLy8gb3JpZ2luLXNlbmQgc3BlbmRpbmcgbGltaXQgdGhhdCB0aGUgcHJldmlvdXMgY2FsbCB1c2VkIHVwLgpmdW5jIGZ1bmQobiBpbnQ2NCkgewoJdGVzdGluZy5TZXRPcmlnaW5TcGVuZChuaWwpCglpZiBuID4gMCB7CgkJdGVzdGluZy5Jc3N1ZUNvaW5zKHJlYWxtQWRkciwgdWdub3QobikpCgl9Cn0KCmZ1bmMgYmFsYW5jZU9mKGEgYWRkcmVzcykgaW50NjQgewoJcmV0dXJuIGJhbmtlci5OZXdSZWFkb25seUJhbmtlcigpLkdldENvaW4oYSwgRGVub20pCn0KCmZ1bmMgdWdub3QobiBpbnQ2NCkgY2hhaW4uQ29pbnMgewoJcmV0dXJuIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oRGVub20sIG4pKQp9CgovLyB0ZXN0aW5nLlNldFJlYWxtIG9ubHkgYWZmZWN0cyB0aGUgZnJhbWUgdGhhdCBjYWxscyBpdCwgc28gaXQgY2Fubm90IGJlCi8vIHdyYXBwZWQgaW4gYSBoZWxwZXI6IGV2ZXJ5IHRlc3Qgc2V0cyB0aGUgY2FsbGVyIGlubGluZS4KCmZ1bmMgVGVzdEluaXRpYWxTdGF0ZSh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuRXF1YWwodCwgV2lkdGgsIEdldFdpZHRoKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIEhlaWdodCwgR2V0SGVpZ2h0KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIERlZmF1bHRQcmljZSwgUHJpY2UoKSkKCXVhc3NlcnQuRXF1YWwodCwgTWF4QmF0Y2gsIE1heEJhdGNoU2l6ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgwLCAwKSkKCXVhc3NlcnQuRXF1YWwodCwgZGVwbG95ZXIsIE93bmVyKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDE2LCBsZW4oc3RyaW5ncy5TcGxpdChQYWxldHRlKCksICIsIikpKQp9CgpmdW5jIFRlc3RQYWludE9uZVBpeGVsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglhZG1pbkJlZm9yZSA6PSBiYWxhbmNlT2Yob3duZXIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJZnVuZChwcmljZSkKCVBhaW50KGNyb3NzKGN1ciksIDEwLCAyMCwgNikKCgl1YXNzZXJ0LkVxdWFsKHQsIDYsIFBpeGVsKDEwLCAyMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIFBhaW50ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgcHJpY2UsIFJldmVudWUoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIFBhaW50cygpKQoJLy8gVGhlIHBheW1lbnQgd2VudCBzdHJhaWdodCB0byB0aGUgYWRtaW4sIG5vdGhpbmcgc3RheWVkIGluIHRoZSByZWFsbS4KCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUrcHJpY2UsIGJhbGFuY2VPZihvd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBiYWxhbmNlT2YocmVhbG1BZGRyKSkKCgkvLyBBbnlvbmUgY2FuIHJlcGFpbnQgZm9yIHRoZSBzYW1lIHByaWNlOyB0aGUgY291bnQgZG9lcyBub3QgZ3Jvdy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCglmdW5kKHByaWNlKQoJUGFpbnQoY3Jvc3MoY3VyKSwgMTAsIDIwLCAxNSkKCXVhc3NlcnQuRXF1YWwodCwgMTUsIFBpeGVsKDEwLCAyMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIFBhaW50ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMipwcmljZSwgUmV2ZW51ZSgpKQoJdWFzc2VydC5FcXVhbCh0LCBhZG1pbkJlZm9yZSsyKnByaWNlLCBiYWxhbmNlT2Yob3duZXIpKQp9CgpmdW5jIFRlc3RBZG1pblBhaW50c0ZvckZyZWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWFkbWluQmVmb3JlIDo9IGJhbGFuY2VPZihvd25lcikKCXJldmVudWVCZWZvcmUgOj0gUmV2ZW51ZSgpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUGFpbnQoY3Jvc3MoY3VyKSwgNDAwLCA0MDAsIDgpCgl1YXNzZXJ0LkVxdWFsKHQsIDgsIFBpeGVsKDQwMCwgNDAwKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQYWludEJhdGNoKGNyb3NzKGN1ciksICI0MDEsNDAwLDk7NDAyLDQwMCwxMCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEwLCBQaXhlbCg0MDIsIDQwMCkpCgoJLy8gRnJlZSBtZWFucyBleGFjdGx5IGZyZWU6IHRoZSBhZG1pbiBtdXN0IG5vdCBhdHRhY2ggY29pbnMgZWl0aGVyLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSAwdWdub3QiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCA0MDMsIDQwMCwgMSkgfSkKCgl1YXNzZXJ0LkVxdWFsKHQsIHJldmVudWVCZWZvcmUsIFJldmVudWUoKSkKCXVhc3NlcnQuRXF1YWwodCwgYWRtaW5CZWZvcmUsIGJhbGFuY2VPZihvd25lcikpCn0KCmZ1bmMgVGVzdFBhaW50UmVqZWN0c1dyb25nUGF5bWVudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVmb3JlIDo9IFBhaW50ZWQoKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlLTEpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIDAsIDEpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UrMSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm11c3Qgc2VuZCBleGFjdGx5IiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKCJ1YXRvbSIsIHByaWNlKSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm9ubHkgdWdub3QgaXMgYWNjZXB0ZWQiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCAwLCAxKSB9KQoKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlLCBQYWludGVkKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIFBpeGVsKDAsIDApKQp9CgpmdW5jIFRlc3RQYWludFJlamVjdHNJbnZhbGlkUGl4ZWxzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIFdpZHRoLCAwLCAxKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvdXQgb2YgcmFuZ2UiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCAwLCBIZWlnaHQsIDEpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm91dCBvZiByYW5nZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIC0xLCAwLCAxKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJjb2xvciBtdXN0IGJlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgMCkgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiY29sb3IgbXVzdCBiZSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDAsIDAsIDE2KSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJjb2xvciBtdXN0IGJlIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMCwgMCwgLTEpIH0pCn0KCmZ1bmMgVGVzdFBhaW50UmVqZWN0c0NvZGVSZWFsbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJLy8gUmVncmVzc2lvbiBmb3IgdGhlIE9yaWdpblNlbmQgYnlwYXNzOiBhbiBpbnRlcm1lZGlhdGUgcmVhbG0gZm9yd2FyZHMKCS8vIHRoZSBjYWxsIHdoaWxlIHRoZSBlbnZlbG9wZSBjbGFpbXMgdGhlIGNvaW5zIHdlcmUgc2VudC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvYXR0YWNrZXIvd3JhcHBlciIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KHByaWNlKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiZGlyZWN0bHkgYnkgYSB1c2VyIiwgZnVuYygpIHsgUGFpbnQoY3Jvc3MoY3VyKSwgMSwgMSwgMSkgfSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgUGl4ZWwoMSwgMSkpCn0KCmZ1bmMgVGVzdFBhaW50QmF0Y2goY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZm9yZSA6PSBQYWludGVkKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDMgKiBwcmljZSkpCglmdW5kKDMgKiBwcmljZSkKCVBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjEwMCwxMDAsMTsxMDEsMTAwLDI7MTAyLDEwMCwzOyIpCgoJdWFzc2VydC5FcXVhbCh0LCAxLCBQaXhlbCgxMDAsIDEwMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIFBpeGVsKDEwMSwgMTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgMywgUGl4ZWwoMTAyLCAxMDApKQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUrMywgUGFpbnRlZCgpKQoKCXJvdyA6PSBSb3dzKDEwMCwgMTAxKQoJdWFzc2VydC5FcXVhbCh0LCBXaWR0aCwgbGVuKHJvdykpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMjMiLCByb3dbMTAwOjEwM10pCn0KCmZ1bmMgVGVzdFBhaW50QmF0Y2hJc0F0b21pYyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJLy8gT25lIGJhZCBwaXhlbCByZWplY3RzIHRoZSB3aG9sZSBiYXRjaCBiZWZvcmUgYW55dGhpbmcgaXMgd3JpdHRlbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDIqcHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJvdXQgb2YgcmFuZ2UiLCBmdW5jKCkgeyBQYWludEJhdGNoKGNyb3NzKGN1ciksICIyMDAsMjAwLDE7OTk5OSwwLDEiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgyMDAsIDIwMCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgIjIwMCwyMDAsMTsyMDEsMjAwLDEiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAwLCBQaXhlbCgyMDAsIDIwMCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocHJpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJ4LHksY29sb3IiLCBmdW5jKCkgeyBQYWludEJhdGNoKGNyb3NzKGN1ciksICJnYXJiYWdlIikgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAieCx5LGNvbG9yIiwgZnVuYygpIHsgUGFpbnRCYXRjaChjcm9zcyhjdXIpLCAiIikgfSkKfQoKZnVuYyBUZXN0UGFpbnRCYXRjaFRvb0xhcmdlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglmb3IgaSA6PSAwOyBpIDw9IE1heEJhdGNoOyBpKysgewoJCWlmIGkgPiAwIHsKCQkJc2IuV3JpdGVCeXRlKCc7JykKCQl9CgkJc2IuV3JpdGVTdHJpbmcoIjAsIikKCQlzYi5Xcml0ZVN0cmluZyhpdG9hKGkpKQoJCXNiLldyaXRlU3RyaW5nKCIsMSIpCgl9Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChpbnQ2NChNYXhCYXRjaCsxKSpwcmljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRvbyBtYW55IHBpeGVscyIsIGZ1bmMoKSB7IFBhaW50QmF0Y2goY3Jvc3MoY3VyKSwgc2IuU3RyaW5nKCkpIH0pCn0KCmZ1bmMgVGVzdFNldFByaWNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyIG9ubHkiLCBmdW5jKCkgeyBTZXRQcmljZShjcm9zcyhjdXIpLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicHJpY2UgbXVzdCBub3QgYmUgbmVnYXRpdmUiLCBmdW5jKCkgeyBTZXRQcmljZShjcm9zcyhjdXIpLCAtMSkgfSkKCVNldFByaWNlKGNyb3NzKGN1ciksIDApCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQcmljZSgpKQoKCS8vIEZyZWUgcGFpbnRpbmcgcmVxdWlyZXMgc2VuZGluZyBub3RoaW5nLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUGFpbnQoY3Jvc3MoY3VyKSwgMzAwLCAzMDAsIDQpCgl1YXNzZXJ0LkVxdWFsKHQsIDQsIFBpeGVsKDMwMCwgMzAwKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJtdXN0IHNlbmQgZXhhY3RseSIsIGZ1bmMoKSB7IFBhaW50KGNyb3NzKGN1ciksIDMwMCwgMzAxLCA0KSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVNldFByaWNlKGNyb3NzKGN1ciksIERlZmF1bHRQcmljZSkKfQoKZnVuYyBUZXN0V2l0aGRyYXcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIHVnbm90KDFfMDAwKSkKCXJvIDo9IGJhbmtlci5OZXdSZWFkb25seUJhbmtlcigpCglib2JCZWZvcmUgOj0gcm8uR2V0Q29pbihib2IsIERlbm9tKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIGFsaWNlLCAxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiLCBmdW5jKCkgeyBXaXRoZHJhdyhjcm9zcyhjdXIpLCBib2IsIDApIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgYWRkcmVzcyIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1ciksIGFkZHJlc3MoIm5vcGUiKSwgMSkgfSkKCVdpdGhkcmF3KGNyb3NzKGN1ciksIGJvYiwgNjAwKQoKCXVhc3NlcnQuRXF1YWwodCwgYm9iQmVmb3JlKzYwMCwgcm8uR2V0Q29pbihib2IsIERlbm9tKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNDAwKSwgcm8uR2V0Q29pbihyZWFsbUFkZHIsIERlbm9tKSkKCS8vIExlYXZlIHRoZSByZWFsbSBlbXB0eSBmb3IgdGhlIHRlc3RzIHRoYXQgYXNzZXJ0IG9uIGl0LgoJV2l0aGRyYXcoY3Jvc3MoY3VyKSwgYm9iLCA0MDApCn0KCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglvcmlnaW5hbCA6PSBvd25lcgoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsIGZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGFsaWNlKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3JpZ2luYWwpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiaW52YWxpZCBhZGRyZXNzIiwgZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYWRkcmVzcygibm9wZSIpKSB9KQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYWxpY2UpCgl1YXNzZXJ0LkVxdWFsKHQsIGFsaWNlLCBPd25lcigpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIG9yaWdpbmFsKQoJdWFzc2VydC5FcXVhbCh0LCBvcmlnaW5hbCwgT3duZXIoKSkKfQoKZnVuYyBUZXN0VmVyc2lvbkFuZERpcnR5Um93cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdiA6PSBWZXJzaW9uKCkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIERpcnR5Um93cyh2KSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgzICogcHJpY2UpKQoJZnVuZCgzICogcHJpY2UpCglQYWludEJhdGNoKGNyb3NzKGN1ciksICIwLDcwMCwxOzEsNzAwLDI7MCw3MDEsMyIpCgoJdWFzc2VydC5FcXVhbCh0LCB2KzEsIFZlcnNpb24oKSkKCXVhc3NlcnQuRXF1YWwodCwgIjcwMCw3MDEiLCBEaXJ0eVJvd3ModikpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBEaXJ0eVJvd3MoVmVyc2lvbigpKSkKCgkvLyBBIHNlY29uZCBjYWxsIG9uIG9uZSBvZiB0aG9zZSByb3dzIG1vdmVzIG9ubHkgdGhhdCByb3cgZm9yd2FyZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChwcmljZSkpCglmdW5kKHByaWNlKQoJUGFpbnQoY3Jvc3MoY3VyKSwgNSwgNzAxLCA0KQoJdWFzc2VydC5FcXVhbCh0LCB2KzIsIFZlcnNpb24oKSkKCXVhc3NlcnQuRXF1YWwodCwgIjcwMSIsIERpcnR5Um93cyh2KzEpKQoJdWFzc2VydC5FcXVhbCh0LCAiNzAwLDcwMSIsIERpcnR5Um93cyh2KSkKCgkvLyBBIHJlamVjdGVkIHBhaW50IGNoYW5nZXMgbm90aGluZy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibXVzdCBzZW5kIGV4YWN0bHkiLCBmdW5jKCkgeyBQYWludChjcm9zcyhjdXIpLCA1LCA3MDIsIDQpIH0pCgl1YXNzZXJ0LkVxdWFsKHQsIHYrMiwgVmVyc2lvbigpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgRGlydHlSb3dzKHYrMikpCgoJLy8gTmVnYXRpdmUgInNpbmNlIiBiZWhhdmVzIGxpa2UgemVybzogcGFpbnRlZCByb3dzIG9ubHksIG5ldmVyIGJsYW5rIG9uZXMuCgl1YXNzZXJ0LkVxdWFsKHQsIERpcnR5Um93cygwKSwgRGlydHlSb3dzKC0xKSkKCXVhc3NlcnQuVHJ1ZSh0LCAhc3RyaW5ncy5Db250YWlucygiLCIrRGlydHlSb3dzKDApKyIsIiwgIiw3OTksIiksICJyb3cgNzk5IHdhcyBuZXZlciBwYWludGVkIikKfQoKZnVuYyBUZXN0UmVuZGVyKHQgKnRlc3RpbmcuVCkgewoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIiMgTWlsbGlvbiBHbm8iKSwgInRpdGxlIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInwgU2l6ZSB8IDEyNTAgeCA4MDAgfCIpLCAic2l6ZSByb3ciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAifCBQcmljZSBwZXIgcGl4ZWwgfCA1MDAwMHVnbm90IHwiKSwgInByaWNlIHJvdyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJ8IEFkbWluIHwgIitvd25lci5TdHJpbmcoKSsiIHwiKSwgImFkbWluIHJvdyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIkaGVscCZmdW5jPVBhaW50QmF0Y2giKSwgImhlbHAgbGluayIpCn0KCmZ1bmMgaXRvYShuIGludCkgc3RyaW5nIHsKCWlmIG4gPT0gMCB7CgkJcmV0dXJuICIwIgoJfQoJdmFyIGIgW11ieXRlCglmb3IgbiA+IDAgewoJCWIgPSBhcHBlbmQoW11ieXRle2J5dGUoJzAnICsgbiUxMCl9LCBiLi4uKQoJCW4gLz0gMTAKCX0KCXJldHVybiBzdHJpbmcoYikKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTIwMDAwMDAwdWdub3QSEwiAhK9fEgwxMDAwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEC5ZmClgNjCNcYMZnidknoXGp5YHfsbdlNEvz+UrLFaMESQNRL76OKjKbSh2jU9g7s2OMZ0gdGrb/+Y5i4x01ZMDA8BwoWYZ+TueOgVmuLuFqOkcbfvGhCvHJsE/7j1PkDsKYaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=