Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
EF0F660FC701F1C34E281097D2FDDF5718D555855C4AA3D5A6BE57A7B28AD632

Transaction overview

Status
Success
Execution completed
Block
#321161
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
26,249,536
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g17khqpukees4237dtn3astzapmp462vjhsz6st4

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CrinAQoML3ZtLm1fYWRkcGtnEqanAQooZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NBL4pgEKA25mdBJAZ25vLmxhbmQvci9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L3NldHRsZXJzL25mdBrkFgoJUkVBRE1FLm1kEtYWIyBHbm8ubGFuZCBTZXR0bGVycwoKU2V0dGxlcnMgYXJlIHNtYWxsIHBpeGVsLWFydCBnbm9tZXMsIGFuZCBlYWNoIG9uZSBiZWxvbmdzIHRvIGEgc2luZ2xlIEduby5sYW5kIGFjY291bnQsIGZvcmV2ZXIuIEEgU2V0dGxlcgpjYW4ndCBiZSBzb2xkLCB0cmFkZWQsIG9yIGdpdmVuIHRvIGFueW9uZSBlbHNlLiBPbmNlIGl0J3MgeW91cnMsIGl0IHN0YXlzIHlvdXJzLgoKIyMgV2h5IHRoZXkgZXhpc3QKClNldHRsZXJzIGFyZSBhIHRoYW5rLXlvdSB0byB0aGUgcGVvcGxlIHdobyB3ZXJlIHBhcnQgb2YgR25vLmxhbmQgZnJvbSB0aGUgdmVyeSBiZWdpbm5pbmcuIEFueW9uZSB3aG9zZQphY2NvdW50IGFscmVhZHkgaGVsZCBhdCBsZWFzdCAxNSBHTk9UIHdoZW4gdGhlIGBnbm9sYW5kLTFgIGNoYWluIGxhdW5jaGVkIGNhbiBjbGFpbSBvbmUgU2V0dGxlci4gSXQncyBhCnNpbXBsZSwgcGVybWFuZW50IHdheSBvZiBzYXlpbmcgInRoaXMgYWNjb3VudCB3YXMgaGVyZSBhdCB0aGUgc3RhcnQuIgoKIyMgTm8gdHdvIGFyZSBhbGlrZQoKTm9ib2R5IHBpY2tzIGhvdyB0aGVpciBTZXR0bGVyIGxvb2tzLiBJdHMgc2tpbiB0b25lLCBoYXQsIGJlYXJkLCBjbG90aGVzLCBnbGFzc2VzIGFuZCBiYWNrZ3JvdW5kIGFyZSBhbGwKd29ya2VkIG91dCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGFjY291bnQgdGhhdCBjbGFpbXMgaXQgYW5kIHRoZSBtb21lbnQgaXQncyBjbGFpbWVkLCBhbmQgdGhlIGNvbGxlY3Rpb24KbWFrZXMgc3VyZSB0aGUgc2FtZSBjb21iaW5hdGlvbiBpcyBuZXZlciBkcmF3biB0d2ljZS4gU28gZXZlcnkgU2V0dGxlciBpcyBvbmUgb2YgYSBraW5kLCBhbmQgaXQncyBhIGxpdHRsZQpzdXJwcmlzZSB0byBzZWUgd2hpY2ggb25lIHlvdSBnZXQuCgojIyBPbmUgcGVyIGFjY291bnQKCkVhY2ggZWxpZ2libGUgYWNjb3VudCBjYW4gY2xhaW0gZXhhY3RseSBvbmUgU2V0dGxlciwgb24gYSBmaXJzdC1jb21lLCBmaXJzdC1zZXJ2ZWQgYmFzaXMsIHVudGlsIGFsbCBvZiB0aGVtCmFyZSBnb25lICh0aGVyZSBhcmUgMywwMDAgaW4gdG90YWwpLiBUaGVyZSdzIG5vIGNvc3QgYmV5b25kIHRoZSB1c3VhbCBjb3N0IG9mIHNlbmRpbmcgYSB0cmFuc2FjdGlvbi4KCiMjIEhvdyB0byBnZXQgb25lCgpJZiB5b3VyIGFjY291bnQgd2FzIGVsaWdpYmxlLCB5b3UgY2FuIGNsYWltIHlvdXIgU2V0dGxlciBmcm9tIHRoZSBtaW50IHBhZ2UgYXQKW2plcm9uaW1vYWxiaS5naXRodWIuaW8vZ25vbGFuZC1zZXR0bGVyc10oaHR0cHM6Ly9qZXJvbmltb2FsYmkuZ2l0aHViLmlvL2dub2xhbmQtc2V0dGxlcnMvKS4gT25jZSBjbGFpbWVkLCB5b3UKY2FuIGxvb2sgdXAgYW55IFNldHRsZXIsIGFuZCBzZWUgd2hvIGl0IGJlbG9uZ3MgdG8sIHJpZ2h0IGhlcmUgaW4gdGhpcyByZWFsbS4KClRoZSBtaW50IHBhZ2UgaXMgYWxzbyB0aGUgcXVpY2tlc3Qgd2F5IHRvIGdldCB0aGUgcHJvb2YgZm9yIHRoZQpbYE1pbnRgXSgvci9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L3NldHRsZXJzL25mdCRoZWxwJmZ1bmM9TWludCkgY2FsbCwgdHlwZSB5b3VyIGFkZHJlc3MgdGhlcmUgYW5kIGl0IHNob3dzIGJvdGggdGhlIHByb29mCmFuZCB0aGUgZXhhY3QgYGdub2tleWAgY29tbWFuZCwgcmVhZHkgdG8gY29weS4KCiMjIEEgZnJpZW5kbHkgd29yZCBvZiBjYXV0aW9uCgpUaGlzIHByb2plY3QgaXMgbWFkZSBieSBvbmUgcGVyc29uLCBmb3IgZnVuLiBJdCBoYXMgbm90IGJlZW4gYXVkaXRlZCBieSBhbnlvbmUuIEV2ZXJ5dGhpbmcgaGVyZSBpcyBvcGVuIHNvdXJjZSwKc28gcGxlYXNlIGhhdmUgYSBsb29rIHlvdXJzZWxmLCBvciBhc2sgc29tZW9uZSB5b3UgdHJ1c3QgdG8sIGJlZm9yZSBjb25uZWN0aW5nIGEgd2FsbGV0IG9yIHNpZ25pbmcgYW55dGhpbmcuCk5vYm9keSBpbnZvbHZlZCBpbiB0aGlzIHByb2plY3QgaXMgcmVzcG9uc2libGUgZm9yIHdoYXQgaGFwcGVucyB0byB5b3VyIGFjY291bnQgb3IgeW91ciBmdW5kczsgdXNpbmcgaXQgaXMKZW50aXJlbHkgeW91ciBvd24gY2hvaWNlIGFuZCB5b3VyIG93biByZXNwb25zaWJpbGl0eS4KCiMjIE1pbnRpbmcgd2l0aG91dCB0aGUgd2ViIHBhZ2UKCklmIHlvdSdkIHJhdGhlciBub3QgdXNlIHRoZSBtaW50IHBhZ2UgYXQgYWxsLCBvciBqdXN0IHdhbnQgdG8gc2VlIGV2ZXJ5dGhpbmcgZm9yIHlvdXJzZWxmIGZpcnN0LCB5b3UgY2FuIGRvCnRoZSB3aG9sZSB0aGluZyBieSBoYW5kIHdpdGggYSB0ZXJtaW5hbC4gTm90aGluZyBoZXJlIG5lZWRzIHRydXN0aW5nIGEgd2Vic2l0ZTogdGhlIGxpc3Qgb2YgZWxpZ2libGUgYWNjb3VudHMKYW5kIHlvdXIgcHJvb2YgYXJlIGJvdGggd29ya2VkIG91dCBmcm9tIHRoZSBwdWJsaWMgZ2VuZXNpcyBvZiBgZ25vbGFuZC0xYCwgYW5kIHlvdSBjYW4gY2hlY2sgZXZlcnkgc3RlcApmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyB5b3UgY2FuIGZpbmQgaW4gW2plcm9uaW1vYWxiaS9nbm9sYW5kLXNldHRsZXJzXShodHRwczovL2dpdGh1Yi5jb20vamVyb25pbW9hbGJpL2dub2xhbmQtc2V0dGxlcnMpCnJlcG9zaXRvcnkuCgojIyBTZWUgeW91ciBTZXR0bGVyIGFzIGEgcGljdHVyZQoKT25jZSB5b3UgaGF2ZSB5b3VyIFNldHRsZXIsIGEgc2VwYXJhdGUgW2F2YXRhciByZWFsbV0oL3IvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9zZXR0bGVycy9hdmF0YXIpIGNhbiBkcmF3IGl0IGFzIGEgcGljdHVyZQp3aGVuZXZlciBpdCdzIGFza2VkIHRvLCBzbyB5b3UsIG9yIGFueSBvdGhlciByZWFsbSBvciB3ZWIgYXBwLCBjYW4gc2hvdyBpdCBuZXh0IHRvIHlvdXIgYWRkcmVzcywgYXMgcHJvZmlsZQpwaWN0dXJlLCBpbiBmb3J1bSBwb3N0LCBhIGxlYWRlcmJvYXJkIHJvdywgd2hlcmV2ZXIgeW91IGxpa2UuChpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3IvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9zZXR0bGVycy9uZnQiCmdubyA9ICIwLjkiChqSDgoKZ3JjNzIxLmdubxKDDnBhY2thZ2UgbmZ0CgppbXBvcnQgImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoKLy8gVG9rZW4gcmV0dXJucyB0aGUgY29sbGVjdGlvbiBhcyBhIHJlYWQtb25seSBHUkM3MjEgdGVsbGVyLgpmdW5jIFRva2VuKCkgZ3JjNzIxLlRlbGxlciB7IHJldHVybiBjb2xsZWN0aW9uLlJlYWRvbmx5VGVsbGVyKCkgfQoKLy8gR2V0TmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uLgpmdW5jIEdldE5hbWUoKSBzdHJpbmcgeyByZXR1cm4gY29sbGVjdGlvbi5HZXROYW1lKCkgfQoKLy8gR2V0U3ltYm9sIHJldHVybnMgdGhlIHN5bWJvbCBvZiB0aGUgY29sbGVjdGlvbi4KZnVuYyBHZXRTeW1ib2woKSBzdHJpbmcgeyByZXR1cm4gY29sbGVjdGlvbi5HZXRTeW1ib2woKSB9CgovLyBJRCByZXR1cm5zIHRoZSBJRCBvZiB0aGUgY29sbGVjdGlvbi4KZnVuYyBJRCgpIHN0cmluZyB7IHJldHVybiBjb2xsZWN0aW9uLklEKCkgfQoKLy8gVG90YWxTdXBwbHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNldHRsZXJzIG1pbnRlZCBzbyBmYXIuCmZ1bmMgVG90YWxTdXBwbHkoKSBpbnQ2NCB7IHJldHVybiBjb2xsZWN0aW9uLlRvdGFsU3VwcGx5KCkgfQoKLy8gQmFsYW5jZU9mIHJldHVybnMgdGhlIG51bWJlciBvZiBTZXR0bGVycyBvZiBhbiBhY2NvdW50LCAwIG9yIDEuCmZ1bmMgQmFsYW5jZU9mKG93bmVyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpIHsgcmV0dXJuIGNvbGxlY3Rpb24uQmFsYW5jZU9mKG93bmVyKSB9CgovLyBPd25lck9mIHJldHVybnMgdGhlIG93bmVyIGFjY291bnQgb2YgYSBTZXR0bGVyLgpmdW5jIE93bmVyT2YodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpIHsgcmV0dXJuIGNvbGxlY3Rpb24uT3duZXJPZih0aWQpIH0KCi8vIEdldEFwcHJvdmVkIHJldHVybnMgdGhlIGFjY291bnQgYWxsb3dlZCB0byBtb3ZlIGEgU2V0dGxlciBvbiBiZWhhbGYgb2YgaXRzIG93bmVyLgovLyBTZXR0bGVycyBhcmUgc291bGJvdW5kLCBzbyBpdCBhbHdheXMgZmFpbHMuCmZ1bmMgR2V0QXBwcm92ZWQodGlkIGdyYzcyMS5Ub2tlbklEKSAoYWRkcmVzcywgZXJyb3IpIHsgcmV0dXJuIGNvbGxlY3Rpb24uR2V0QXBwcm92ZWQodGlkKSB9CgovLyBJc0FwcHJvdmVkRm9yQWxsIHJlcG9ydHMgd2hldGhlciBhbiBhY2NvdW50IGlzIGFsbG93ZWQgdG8gbW92ZSB0aGUgU2V0dGxlciBvZiBhbm90aGVyIGFjY291bnQuCi8vIFNldHRsZXJzIGFyZSBzb3VsYm91bmQsIHNvIGl0IGlzIGFsd2F5cyBmYWxzZS4KZnVuYyBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sIHsKCXJldHVybiBjb2xsZWN0aW9uLklzQXBwcm92ZWRGb3JBbGwob3duZXIsIG9wZXJhdG9yKQp9CgovLyBBcHByb3ZlIGFsd2F5cyBmYWlscywgU2V0dGxlcnMgYXJlIHNvdWxib3VuZC4KZnVuYyBBcHByb3ZlKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7IHBhbmljKEVyclNvdWxib3VuZCkgfQoKLy8gU2V0QXBwcm92YWxGb3JBbGwgYWx3YXlzIGZhaWxzLCBTZXR0bGVycyBhcmUgc291bGJvdW5kLgpmdW5jIFNldEFwcHJvdmFsRm9yQWxsKGN1ciByZWFsbSwgb3BlcmF0b3IgYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgeyBwYW5pYyhFcnJTb3VsYm91bmQpIH0KCi8vIFRyYW5zZmVyRnJvbSBhbHdheXMgZmFpbHMsIFNldHRsZXJzIGFyZSBzb3VsYm91bmQuCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7IHBhbmljKEVyclNvdWxib3VuZCkgfQoa0wsKDG1ldGFkYXRhLmdubxLCC3BhY2thZ2UgbmZ0CgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUiCgoJImduby5sYW5kL3AvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9zZXR0bGVycy9uZnQvdjAiCgkiZ25vLmxhbmQvcC9udC9ncmM3MjEvdjAiCikKCi8vIFRva2VuVVJJIHJldHVybnMgdGhlIFNldHRsZXIgaW1hZ2UgYXMgYW4gU1ZHIGRhdGEgVVJJLgovLyBXYWxsZXRzIHN1Y2ggYXMgQWRlbmEgcmVhZCBUb2tlblVSSSBkaXJlY3RseSBhcyB0aGUgdG9rZW4gaW1hZ2UsCi8vIHNvIHRoaXMgbXVzdCBiZSB0aGUgaW1hZ2UgaXRzZWxmLiBUaGUgbWV0YWRhdGEgbGl2ZXMgaW4gVG9rZW5NZXRhZGF0YS4KZnVuYyBUb2tlblVSSSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7Cgl0cmFpdHMsIGVyciA6PSBUcmFpdHNPZih0aWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIGVycgoJfQoKCXJldHVybiBuZnQuUmVuZGVyRGF0YVVSSSh0cmFpdHMsIG5mdC5PcHRpb25ze1NpemU6IG5mdC5DYW5vbmljYWxTaXplfSksIG5pbAp9CgovLyBUb2tlbk1ldGFkYXRhIHJldHVybnMgYSBKU09OIHN0cmluZyB3aXRoIHRoZSBtZXRhZGF0YSBvZiBhIFNldHRsZXIKLy8gaW4gdGhlIGZvcm1hdCB0aGUgQWRlbmEgd2FsbGV0IGNhbiB1bmRlcnN0YW5kLgpmdW5jIFRva2VuTWV0YWRhdGEodGlkIGdyYzcyMS5Ub2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewoJdHJhaXRzLCBlcnIgOj0gVHJhaXRzT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCgl2YXIgYXR0cnMgc3RyaW5nCglmb3IgaSwgYXR0ciA6PSByYW5nZSB0cmFpdHMuQXR0cmlidXRlcygpIHsKCQlpZiBpID4gMCB7CgkJCWF0dHJzICs9ICIsIgoJCX0KCgkJYXR0cnMgKz0gYHsidHJhaXRUeXBlIjoiYCArIGF0dHIuVHlwZSArIGAiLCJ2YWx1ZSI6ImAgKyBhdHRyLlZhbHVlICsgYCJ9YAoJfQoKCXJldHVybiBgeyJuYW1lIjoiU2V0dGxlciAjYCArIHN0cmluZyh0aWQpICsgYCIsYCArCgkJYCJkZXNjcmlwdGlvbiI6IlNvdWxib3VuZCBnbm9tZSBvZiB0aGUgZWFybHkgc2V0dGxlcnMgb2YgR25vLmxhbmQuIGAgKyBuZnQuQ3JlZGl0cyArIGAiLGAgKwoJCWAiaW1hZ2UiOiJgICsgbmZ0LlJlbmRlckRhdGFVUkkodHJhaXRzLCBuZnQuT3B0aW9uc3tTaXplOiBuZnQuQ2Fub25pY2FsU2l6ZX0pICsgYCIsYCArCgkJYCJleHRlcm5hbFVybCI6ImAgKyBFeHRlcm5hbFVSTCh0aWQpICsgYCIsYCArCgkJYCJhdHRyaWJ1dGVzIjpbYCArIGF0dHJzICsgYF19YCwgbmlsCn0KCi8vIEV4dGVybmFsVVJMIHJldHVybnMgdGhlIFVSTCB0byBhIFNldHRsZXIgcHJvZmlsZSBwYWdlLgpmdW5jIEV4dGVybmFsVVJMKHRpZCBncmM3MjEuVG9rZW5JRCkgc3RyaW5nIHsKCXJldHVybiAiaHR0cHM6Ly8iICsgcnVudGltZS5DaGFpbkRvbWFpbigpICsgUmVhbG1QYXRoICsgIjp0b2tlbi8iICsgc3RyaW5nKHRpZCkKfQoa+ksKB25mdC5nbm8S7ktwYWNrYWdlIG5mdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNyeXB0by9tZXJrbGUiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgkiZXJyb3JzIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL2cxN2tocXB1a2VlczQyMzdkdG4zYXN0emFwbXA0NjJ2amhzejZzdDQvYmxvb20vdjAiCgkiZ25vLmxhbmQvcC9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L3NldHRsZXJzL25mdC92MCIKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9wL250L21kYWxlcnQvdjAiCgkiZ25vLmxhbmQvcC9udC9vd25hYmxlL3YwIgopCgpjb25zdCAoCgkvLyBOYW1lIGlzIHRoZSBORlQgdG9rZW4ncyBuYW1lLgoJTmFtZSA9ICJTZXR0bGVycyIKCgkvLyBTeW1ib2wgaXMgdGhlIE5GVCB0b2tlbidzIHN5bWJvbC4KCVN5bWJvbCA9ICJTRVRUTEVSIgoKCS8vIENhcGFjaXR5IGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgU2V0dGxlcnMgdGhhdCBjYW4gYmUgbWludGVkLgoJY2FwYWNpdHkgPSAzMDAwCgoJLy8gTWF4IG5vbmNlIGlzIGhvdyBtYW55IGdub21lcyBhcmUgdHJpZWQgZm9yIGEgdG9rZW4gYmVmb3JlIGdpdmluZyB1cCwKCS8vIHdoZW4gdGhlIG9uZXMgdGhhdCBjb21lIG91dCBhcmUgYWxyZWFkeSB0YWtlbi4KCW1heE5vbmNlID0gNjQKCgkvLyBNYXggYXVudHMgaXMgdGhlIGxvbmdlc3QgcHJvb2YgYWNjZXB0ZWQuCgltYXhBdW50cyA9IDQwCikKCi8vIEVyclNvdWxib3VuZCBpcyByZXR1cm5lZCBmb3Igb3BlcmF0aW9uIHRoYXQgYXJlIG5vdCBhbGxvd2VkIG9uIGEgc291bGJvdW5kIE5GVC4KdmFyIEVyclNvdWxib3VuZCA9IGVycm9ycy5OZXcoInNldHRsZXJzIGFyZSBzb3VsYm91bmQsIHRoZXkgY2FuJ3QgYmUgdHJhbnNmZXJyZWQgb3IgYXBwcm92ZWQiKQoKdmFyICgKCS8vIFJlYWxtIHBhdGggaXMgdGhlIHBhdGggb2YgdGhpcyByZWFsbS4KCVJlYWxtUGF0aCBzdHJpbmcKCgkvLyBOb3RpY2UgaXMgYSByZWFsbS13aWRlIG1lc3NhZ2UgdGhlIGFkbWluIGNhbiBwb3N0IGF0IGFueSB0aW1lLCBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLgoJLy8gSXQgbmV2ZXIgYWZmZWN0cyBTVkcsIFVSSSBvciBNYXJrZG93biwgaXQgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwuCglOb3RpY2Ugc3RyaW5nCgoJLy8gTm90aWNlVHlwZSBpcyB0aGUgc3R5bGUgTm90aWNlIGlzIHNob3duIGFzLgoJTm90aWNlVHlwZSBtZGFsZXJ0LlR5cGUKCgkvLyBBZG1pbiBhY2NvdW50IGZvciB0aGUgcmVhbG0uCgkvLyBUaGlzIGFjY291bnQgaXMgb25seSB2YWxpZCB0byBzZXQgc25hcHNob3QgcGFyYW1zLCBvbmNlIHNldHRlZCBtaW50aW5nCgkvLyBjYW4gc3RhcnQgYW5kIGFmdGVyIHRoZSBmaXJzdCBORlQgaXMgbWludGVkIHRoZSBhY2NvdW50IGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZQoJLy8gc25hcHNob3QgcGFyYW1zIGFueW1vcmUuCgkvLyBJdCBpcyBhbHdheXMgYWxsb3dlZCB0byBwb3N0IG9yIGNsZWFyIHJlYWxtLXdpZGUgbm90aWNlcy4KCWFkbWluICpvd25hYmxlLk93bmFibGUKCgkvLyBTdXBwbHkgY2FwIGlzIHRoZSBudW1iZXIgb2YgU2V0dGxlcnMgdGhhdCBjYW4gYmUgbWludGVkLgoJc3VwcGx5Q2FwID0gY2FwYWNpdHkKCgkvLyBSb290IGlzIHRoZSBNZXJrbGUgcm9vdCB2YWx1ZS4KCXJvb3QgW11ieXRlCgoJLy8gVG90YWwgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBsZWF2ZXMgb2YgdGhlIGxpc3Qgb2YgZWxlZ2libGUgYWNjb3VudHMuCgl0b3RhbCBpbnQKCgkvLyBDb2xsZWN0aW9uIGlzIHRoZSBHUkM3MjEgdG9rZW4sIGl0IGtlZXBzIHRoZSBvd25lcnMgYW5kIGJhbGFuY2VzIGFuZCBlbWl0cyB0aGUgc3RhbmRhcmQgZXZlbnRzLgoJY29sbGVjdGlvbiAqZ3JjNzIxLlRva2VuCgoJLy8gTGVkZ2VyIGlzIHRoZSB3cml0YWJsZSBzaWRlIG9mIHRoZSBjb2xsZWN0aW9uLCBvbmx5IHVzZWQgdG8gbWludC4KCWxlZGdlciAqZ3JjNzIxLlByaXZhdGVMZWRnZXIKCgkvLyBUb2tlbnMgaGFzIHRoZSBwYWNrZWQgdHJhaXRzIG9mIGV2ZXJ5IHRva2VuLCBieSBJRCAoemVyby1wYWRkZWQsIHNvIGl0IGlzIGluIG1pbnQgb3JkZXIpLgoJdG9rZW5zID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCgkvLyBDbGFpbWVkIGhhcyB0aGUgSUQgb2YgdGhlIHRva2VuIGZvciBlYWNoIGFjY291bnQuCgljbGFpbWVkID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCgkvLyBTZWVuIHRyYWl0cyBoYXMgdGhlIHBhY2tlZCB0cmFpdHMgb2YgbWludGVkIHRva2VucyB0byBjaGVjayB0aGF0IHR3byBTZXR0bGVycyBhcmUgbmV2ZXIgdGhlIHNhbWUuCglzZWVuVHJhaXRzID0gbmV3VHJhaXRzRmlsdGVyKCkKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJUmVhbG1QYXRoID0gc3RyaW5ncy5UcmltUHJlZml4KGN1ci5Qa2dQYXRoKCksIHJ1bnRpbWUuQ2hhaW5Eb21haW4oKSkKCWFkbWluID0gb3duYWJsZS5OZXdXaXRoQWRkcmVzcyhjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgljb2xsZWN0aW9uLCBsZWRnZXIgPSBuZXdDb2xsZWN0aW9uKGN1cikKfQoKLy8gU291bGJvdW5kIGlzIGEgR1JDNzIxIGV4dGVuc2lvbiB0aGF0IGFib3J0cyBhbnkgdHJhbnNmZXIgb2YgYSBTZXR0bGVyLgovLyBUaGUgcmVhbG0gbmV2ZXIgZXhwb3NlcyBhIHRlbGxlciB0aGF0IGNhbiB3cml0ZSwgc28gYSB0cmFuc2ZlciBjYW4ndCBiZSBzdGFydGVkLAovLyB0aGlzIG1ha2VzIHN1cmUgdGhhdCBpdCBjb3VsZCBuZXZlciBmaW5pc2ggZWl0aGVyLgp0eXBlIHNvdWxib3VuZCBzdHJ1Y3R7fQoKZnVuYyAoc291bGJvdW5kKSBFeHRlbnNpb25LaW5kKCkgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAic291bGJvdW5kIiB9CmZ1bmMgKHNvdWxib3VuZCkgT25NaW50KGFkZHJlc3MsIGdyYzcyMS5Ub2tlbklEKSAgICAgICAgICAgICAge30KZnVuYyAoc291bGJvdW5kKSBPblRyYW5zZmVyKGFkZHJlc3MsIGFkZHJlc3MsIGdyYzcyMS5Ub2tlbklEKSB7IHBhbmljKEVyclNvdWxib3VuZCkgfQpmdW5jIChzb3VsYm91bmQpIE9uQnVybihncmM3MjEuVG9rZW5JRCkgICAgICAgICAgICAgICAgICAgICAgIHt9CgovLyBuZXdDb2xsZWN0aW9uIGNyZWF0ZXMgdGhlIEdSQzcyMSB0b2tlbiBvZiB0aGUgU2V0dGxlcnMuCmZ1bmMgbmV3Q29sbGVjdGlvbihjdXIgcmVhbG0pICgqZ3JjNzIxLlRva2VuLCAqZ3JjNzIxLlByaXZhdGVMZWRnZXIpIHsKCXRvaywgbGVkIDo9IGdyYzcyMS5OZXdUb2tlbihOYW1lLCBTeW1ib2wsIDAsIGN1cikKCWxlZC5SZWdpc3RlckV4dGVuc2lvbihzb3VsYm91bmR7fSkKCXJldHVybiB0b2ssIGxlZAp9CgovLyBTZXRTbmFwc2hvdCBvcGVucyB0aGUgbWludC4KLy8gSXQgc2V0cyB0aGUgTWVya2xlIHJvb3Qgb2YgdGhlIGxpc3Qgb2YgZWxpZ2libGUgYWNjb3VudHMsIGluIGhleCwgYW5kIHRoZQovLyBudW1iZXIgb2YgYWNjb3VudHMgaW4gdGhlIGxpc3QuIE9ubHkgdGhlIG93bmVyIGNhbiBjYWxsIGl0LgovLyBJdCBjYW4gYmUgY2FsbGVkIGFnYWluIHRvIGNvcnJlY3QgYSBtaXN0YWtlIHVudGlsIHRoZSBmaXJzdCBTZXR0bGVyIGlzIG1pbnRlZCwKLy8gZnJvbSB0aGVuIG9uIHRoZSBsaXN0IGlzIGZyb3plbi4KZnVuYyBTZXRTbmFwc2hvdChjdXIgcmVhbG0sIHJvb3RIZXggc3RyaW5nLCBjb3VudCBpbnQpIHsKCWFzc2VydElzQ3VycmVudChjdXIpCglhZG1pbi5Bc3NlcnRPd25lZEJ5KGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCglpZiB0b2tlbnMuU2l6ZSgpID4gMCB7CgkJcGFuaWMoInRoZSBzbmFwc2hvdCBpcyBmcm96ZW46IFNldHRsZXJzIHdlcmUgYWxyZWFkeSBtaW50ZWQiKQoJfQoKCWJ6LCBlcnIgOj0gaGV4LkRlY29kZVN0cmluZyhyb290SGV4KQoJaWYgZXJyICE9IG5pbCB8fCBsZW4oYnopICE9IDMyIHsKCQlwYW5pYygidGhlIHJvb3QgbXVzdCBiZSAzMiBieXRlcyBpbiBoZXgiKQoJfQoKCWlmIGNvdW50IDwgMSB7CgkJcGFuaWMoInRoZSBsaXN0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWNjb3VudCIpCgl9CgoJcm9vdCA9IGJ6Cgl0b3RhbCA9IGNvdW50CgljaGFpbi5FbWl0KAoJCSJTbmFwc2hvdFNldCIsCgkJInJvb3QiLCByb290SGV4LAoJCSJ0b3RhbCIsIHN0cmNvbnYuSXRvYShjb3VudCksCgkpCn0KCi8vIEFkbWluIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFkbWluIGFjY291bnQuCmZ1bmMgQWRtaW4oKSBhZGRyZXNzIHsgcmV0dXJuIGFkbWluLk93bmVyKCkgfQoKLy8gVHJhbnNmZXJBZG1pbiBtYWtlcyBhbm90aGVyIGFjY291bnQgdGhlIGFkbWluLiBPbmx5IHRoZSBhZG1pbiBjYW4gY2FsbCBpdC4KZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgbmV3QWRtaW4gYWRkcmVzcykgewoJYXNzZXJ0SXNDdXJyZW50KGN1cikKCWlmIGVyciA6PSBhZG1pbi5UcmFuc2Zlck93bmVyc2hpcCgwLCBjdXIsIG5ld0FkbWluKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBTZXROb3RpY2UgcG9zdHMgYSByZWFsbS13aWRlIG1lc3NhZ2UsIHNob3duIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UuCmZ1bmMgU2V0Tm90aWNlKGN1ciByZWFsbSwgYWxlcnRUeXBlIG1kYWxlcnQuVHlwZSwgbXNnIHN0cmluZykgewoJYXNzZXJ0SXNDdXJyZW50KGN1cikKCWFkbWluLkFzc2VydE93bmVkQnkoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJYXNzZXJ0SXNWYWxpZEFsZXJ0VHlwZShhbGVydFR5cGUpCgoJTm90aWNlVHlwZSA9IGFsZXJ0VHlwZQoJTm90aWNlID0gbXNnCgljaGFpbi5FbWl0KCJOb3RpY2VTZXQiLCAidHlwZSIsIHN0cmluZyhhbGVydFR5cGUpKQp9CgovLyBDbGVhck5vdGljZSByZW1vdmVzIHRoZSBjdXJyZW50IG5vdGljZS4KZnVuYyBDbGVhck5vdGljZShjdXIgcmVhbG0pIHsKCWFzc2VydElzQ3VycmVudChjdXIpCglhZG1pbi5Bc3NlcnRPd25lZEJ5KGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCglOb3RpY2VUeXBlID0gIiIKCU5vdGljZSA9ICIiCgljaGFpbi5FbWl0KCJOb3RpY2VDbGVhcmVkIikKfQoKLy8gTWludCBtaW50cyBhIFNldHRsZXIgdG8gdGhlIGNhbGxlciBhbmQgcmV0dXJucyBpdHMgSUQuCi8vCi8vIFRoZSBwcm9vZiBzaG93cyB0aGF0IHRoZSBjYWxsZXIgaXMgaW4gdGhlIGxpc3Qgb2YgZWxpZ2libGUgYWNjb3VudHMuCi8vIFByb29mIGZvcm1hdCBpcyAiPGluZGV4Pi48YXVudHM+Ii4KLy8gT25seSB1c2VyIGFjY291bnRzIGNhbiBtaW50LCBlaXRoZXIgd2l0aCBhIGNhbGwgb3IgYSBydW4gdHJhbnNhY3Rpb24sIHJlYWxtcyBjYW4ndC4KZnVuYyBNaW50KGN1ciByZWFsbSwgcHJvb2Ygc3RyaW5nKSBncmM3MjEuVG9rZW5JRCB7Cglhc3NlcnRJc0N1cnJlbnQoY3VyKQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlcigpIHsKCQlwYW5pYygib25seSB1c2VyIGFjY291bnRzIGNhbiBtaW50IikKCX0KCglpZiBsZW4ocm9vdCkgPT0gMCB7CgkJcGFuaWMoInRoZSBtaW50IGlzIG5vdCBvcGVuIHlldCIpCgl9CgoJbWludGVkIDo9IHRva2Vucy5TaXplKCkKCWlmIG1pbnRlZCA+PSBzdXBwbHlDYXAgewoJCXBhbmljKCJzb2xkIG91dCIpCgl9CgoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2xhaW1lZC5IYXMoY2FsbGVyLlN0cmluZygpKSB7CgkJcGFuaWMoInRoaXMgYWNjb3VudCBoYXMgYWxyZWFkeSBtaW50ZWQiKQoJfQoKCWluZGV4LCBhdW50cywgZXJyIDo9IHNwbGl0UHJvb2YocHJvb2YpCglpZiBlcnIgIT0gIiIgewoJCXBhbmljKGVycikKCX0KCglpZiAhbWVya2xlLlZlcmlmeVNpbXBsZVByb29mKHJvb3QsIFtdYnl0ZShjYWxsZXIpLCBpbmRleCwgdG90YWwsIGF1bnRzKSB7CgkJcGFuaWMoInRoZSBwcm9vZiBpcyBub3QgdmFsaWQgZm9yIHRoaXMgYWNjb3VudDogIiArIGNhbGxlci5TdHJpbmcoKSkKCX0KCglzZXR0bGVySUQgOj0gbWludGVkICsgMQoJcHJlZml4IDo9IHNlZWRQcmVmaXgoY2FsbGVyLCBzZXR0bGVySUQpCgoJdmFyICgKCQlwYWNrZWQgICAgdWludDMyCgkJcGFja2VkS2V5IHN0cmluZwoJKQoJZm9yIG5vbmNlIDo9IDA7IDsgbm9uY2UrKyB7CgkJaWYgbm9uY2UgPT0gbWF4Tm9uY2UgewoJCQlwYW5pYygiY291bGQgbm90IGZpbmQgYSBuZXcgZ25vbWUsIHRyeSBhZ2FpbiIpCgkJfQoKCQlzZWVkIDo9IGhhc2hTZWVkKHByZWZpeCwgbm9uY2UpCgkJdHJhaXRzIDo9IG5mdC5OZXdUcmFpdHMoc2VlZCkKCQlwYWNrZWQgPSBuZnQuUGFjayh0cmFpdHMuTm9ybWFsaXplZCgpKQoJCXBhY2tlZEtleSA9IHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQocGFja2VkKSwgMTApCgkJaWYgIXNlZW5UcmFpdHMuQ29udGFpbnNTdHJpbmcocGFja2VkS2V5KSB7CgkJCWJyZWFrCgkJfQoJfQoKCXRpZCA6PSB0b2tlbklEKHNldHRsZXJJRCkKCWlmIGVyciA6PSBsZWRnZXIuTWludChjYWxsZXIsIHRpZCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgl0b2tlbnMuU2V0KG1ha2VLZXkoc2V0dGxlcklEKSwgcGFja2VkKQoJc2VlblRyYWl0cy5BZGRTdHJpbmcocGFja2VkS2V5KQoJY2xhaW1lZC5TZXQoY2FsbGVyLlN0cmluZygpLCB0aWQpCglyZXR1cm4gdGlkCn0KCi8vIENhcCByZXR1cm5zIHRoZSBudW1iZXIgb2YgU2V0dGxlcnMgdGhhdCBjYW4gYmUgbWludGVkLgpmdW5jIENhcCgpIGludCB7IHJldHVybiBzdXBwbHlDYXAgfQoKLy8gTWVya2xlUm9vdCByZXR1cm5zIHRoZSBNZXJrbGUgcm9vdCBvZiB0aGUgbGlzdCBvZiBlbGlnaWJsZSBhY2NvdW50cywgaW4gaGV4LgpmdW5jIE1lcmtsZVJvb3QoKSBzdHJpbmcgeyByZXR1cm4gaGV4LkVuY29kZVRvU3RyaW5nKHJvb3QpIH0KCi8vIFRvdGFsIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGlnaWJsZSBhY2NvdW50cyBpbiB0aGUgbGlzdC4KZnVuYyBUb3RhbCgpIGludCB7IHJldHVybiB0b3RhbCB9CgovLyBUb2tlbk9mIHJldHVybnMgdGhlIElEIG9mIHRoZSBTZXR0bGVyIG9mIGFuIGFjY291bnQsIG9yIGFuIGVtcHR5IElEIGlmIGl0IGhhcyBub25lLgpmdW5jIFRva2VuT2YoYWRkciBhZGRyZXNzKSBncmM3MjEuVG9rZW5JRCB7Cgl2IDo9IGNsYWltZWQuR2V0KGFkZHIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gdi4oZ3JjNzIxLlRva2VuSUQpCn0KCi8vIFRyYWl0c09mIHJldHVybnMgdGhlIHRyYWl0cyBvZiBhIFNldHRsZXIuCmZ1bmMgVHJhaXRzT2YodGlkIGdyYzcyMS5Ub2tlbklEKSAobmZ0LlRyYWl0cywgZXJyb3IpIHsKCXBhY2tlZCwgb2sgOj0gdHJhaXRzT2YodGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gbmZ0LlRyYWl0c3t9LCBncmM3MjEuRXJySW52YWxpZFRva2VuSWQKCX0KCXJldHVybiBuZnQuVW5wYWNrKHBhY2tlZCksIG5pbAp9CgovLyB0cmFpdHNPZiByZXR1cm5zIHRoZSBwYWNrZWQgdHJhaXRzIG9mIGEgU2V0dGxlciwgb3IgZmFsc2UgaWYgdGhlIElEIGlzIG5vdCBhIG1pbnRlZCBTZXR0bGVyLgpmdW5jIHRyYWl0c09mKHRpZCBncmM3MjEuVG9rZW5JRCkgKHVpbnQzMiwgYm9vbCkgewoJc2V0dGxlcklELCBvayA6PSBwYXJzZVRva2VuSUQodGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCgl2IDo9IHRva2Vucy5HZXQobWFrZUtleShzZXR0bGVySUQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHYuKHVpbnQzMiksIHRydWUKfQoKLy8gdG9rZW5JRCByZXR1cm5zIHRoZSBHUkM3MjEgSUQgb2YgYSBTZXR0bGVyIG51bWJlci4KZnVuYyB0b2tlbklEKHNldHRsZXJJRCBpbnQpIGdyYzcyMS5Ub2tlbklEIHsKCXJldHVybiBncmM3MjEuVG9rZW5JRChzdHJjb252Lkl0b2Eoc2V0dGxlcklEKSkKfQoKLy8gcGFyc2VUb2tlbklEIHJldHVybnMgdGhlIFNldHRsZXIgbnVtYmVyIG9mIGFuIElELCBvbmx5IGZvciB0aGUgY2Fub25pY2FsIGZvcm0gKCIxIiwgbm90ICIwMSIgb3IgIisxIikuCmZ1bmMgcGFyc2VUb2tlbklEKHRpZCBncmM3MjEuVG9rZW5JRCkgKGludCwgYm9vbCkgewoJc2V0dGxlcklELCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmluZyh0aWQpKQoJaWYgZXJyICE9IG5pbCB8fCBzZXR0bGVySUQgPCAxIHx8IHN0cmNvbnYuSXRvYShzZXR0bGVySUQpICE9IHN0cmluZyh0aWQpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzZXR0bGVySUQsIHRydWUKfQoKZnVuYyBuZXdUcmFpdHNGaWx0ZXIoKSAqYmxvb20uQmxvb20gewoJbSA6PSB1aW50NjQoMjg3NTYpIC8vIGJpdHMKCWsgOj0gdWludDY0KDcpICAgICAvLyBoYXNoZXMKCXJldHVybiBibG9vbS5OZXdXaXRoTUsobSwgaykKfQoKZnVuYyBnZW5lcmF0ZVNlZWQoY2FsbGVyIGFkZHJlc3MsIHNldHRsZXJJRCwgbm9uY2UgaW50KSBzdHJpbmcgewoJcmV0dXJuIGhhc2hTZWVkKHNlZWRQcmVmaXgoY2FsbGVyLCBzZXR0bGVySUQpLCBub25jZSkKfQoKZnVuYyBzZWVkUHJlZml4KGNhbGxlciBhZGRyZXNzLCBzZXR0bGVySUQgaW50KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHRpbWUuTm93KCkuVW5peE5hbm8oKSwgMTApICsgIjoiICsgY2FsbGVyLlN0cmluZygpICsKCQkiOiIgKyBzdHJjb252Lkl0b2Eoc2V0dGxlcklEKSArICI6Igp9CgpmdW5jIGhhc2hTZWVkKHByZWZpeCBzdHJpbmcsIG5vbmNlIGludCkgc3RyaW5nIHsKCXN1bSA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShwcmVmaXggKyBzdHJjb252Lkl0b2Eobm9uY2UpKSkKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoc3VtWzpdKQp9CgpmdW5jIHNwbGl0UHJvb2YocHJvb2Ygc3RyaW5nKSAoaW50LCBbXWJ5dGUsIHN0cmluZykgewoJZG90IDo9IHN0cmluZ3MuSW5kZXgocHJvb2YsICIuIikKCWlmIGRvdCA8IDEgewoJCXJldHVybiAwLCBuaWwsICJ0aGUgcHJvb2YgbXVzdCBiZSA8aW5kZXg+LjxhdW50cz4iCgl9CgoJaW5kZXgsIGVyciA6PSBzdHJjb252LkF0b2kocHJvb2ZbOmRvdF0pCglpZiBlcnIgIT0gbmlsIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSB0b3RhbCB7CgkJcmV0dXJuIDAsIG5pbCwgInRoZSBpbmRleCBvZiB0aGUgcHJvb2YgaXMgbm90IHZhbGlkIgoJfQoKCWF1bnRzLCBlcnIgOj0gaGV4LkRlY29kZVN0cmluZyhwcm9vZltkb3QrMTpdKQoJaWYgZXJyICE9IG5pbCB8fCBsZW4oYXVudHMpJTMyICE9IDAgfHwgbGVuKGF1bnRzKSA+IDMyKm1heEF1bnRzIHsKCQlyZXR1cm4gMCwgbmlsLCAidGhlIGF1bnRzIG9mIHRoZSBwcm9vZiBtdXN0IGJlIGhhc2hlcyBvZiAzMiBieXRlcyBpbiBoZXgiCgl9CglyZXR1cm4gaW5kZXgsIGF1bnRzLCAiIgp9CgpmdW5jIG1ha2VLZXkoc2V0dGxlcklEIGludCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5JdG9hKHNldHRsZXJJRCkKCXJldHVybiBzdHJpbmdzLlJlcGVhdCgiMCIsIDUtbGVuKHMpKSArIHMKfQoKZnVuYyBhc3NlcnRJc0N1cnJlbnQoY3VyIHJlYWxtKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygidW5hdXRob3JpemVkIikKCX0KfQoKZnVuYyBhc3NlcnRJc1ZhbGlkQWxlcnRUeXBlKHQgbWRhbGVydC5UeXBlKSB7Cglzd2l0Y2ggdCB7CgljYXNlIG1kYWxlcnQuVHlwZUNhdXRpb24sIG1kYWxlcnQuVHlwZUluZm8sIG1kYWxlcnQuVHlwZU5vdGUsCgkJbWRhbGVydC5UeXBlU3VjY2VzcywgbWRhbGVydC5UeXBlVGlwLCBtZGFsZXJ0LlR5cGVXYXJuaW5nOgoJCXJldHVybgoJfQoJcGFuaWMoImludmFsaWQgbm90aWNlIHR5cGUiKQp9ChrSKAoKcmVuZGVyLmdubxLDKHBhY2thZ2UgbmZ0CgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9zZXR0bGVycy9uZnQvdjAiCgkiZ25vLmxhbmQvcC9tb3VsL21kL3YwIgoJImduby5sYW5kL3AvbW91bC9tZHRhYmxlL3YwIgoJImduby5sYW5kL3AvbnQvZ3JjNzIxL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCgkiZ25vLmxhbmQvcC9udC9tZGFsZXJ0L3YwIgoJImduby5sYW5kL3AvbnQvbXV4L3YwIgopCgpjb25zdCAoCgkvLyBHYWxsZXJ5IHdpZHRoIGlzIHRoZSB3aWR0aC9oZWlnaHQgb2YgZ2FsbGVyeSBTZXR0bGVyIGltYWdlcy4KCWdhbGxlcnlXaWR0aCA9IDk2CgoJLy8gRGV0YWlsIHdpZHRoIGlzIHRoZSB3aWR0aC9oZWlnaHQgb2YgU2V0dGxlciB0aGUgaW1hZ2UgZm9yIGRldGFpbCB2aWV3cy4KCWRldGFpbFdpZHRoID0gMjU2CgoJLy8gR2FsbGVyeSBsZW5ndGggaXMgdGhlIG51bWJlciBvZiBsYXN0IG1pbnRlZCBTZXR0bGVycyBvZiB0aGUgaG9tZSBwYWdlLgoJZ2FsbGVyeUxlbiA9IDUKKQoKLy8gUmVuZGVyIHJlbmRlcnMgdGhlIHJlYWxtLgovLwovLyBCeSBkZWZhdWx0IHJlbmRlcnMgdGhlIHN0YXRlIG9mIHRoZSBtaW50IGFuZCB0aGUgbGFzdCBtaW50ZWQgU2V0dGxlcnMuCi8vCi8vIFBhdGhzOgovLyAgIC0gYHRva2VuL3tpZH1gOiBBIFNldHRsZXIgd2l0aCBpdHMgdHJhaXRzIGFuZCBpdHMgb3duZXIuCi8vICAgLSBgYWRkci97YWRkcmVzc31gOiBUaGUgU2V0dGxlciBvZiBhbiBhY2NvdW50LgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXJvdXRlciA6PSBtdXguTmV3Um91dGVyKCkKCXJvdXRlci5Ob3RGb3VuZEhhbmRsZXIgPSBmdW5jKHJlcyAqbXV4LlJlc3BvbnNlV3JpdGVyLCBfICptdXguUmVxdWVzdCkgewoJCXJlcy5Xcml0ZSgiUGF0aCBub3QgZm91bmQiKQoJfQoKCXJvdXRlci5IYW5kbGVGdW5jKCIiLCByZW5kZXJIb21lKQoJcm91dGVyLkhhbmRsZUZ1bmMoInRva2VuL3tpZH0iLCByZW5kZXJUb2tlbikKCXJvdXRlci5IYW5kbGVGdW5jKCJhZGRyL3thZGRyfSIsIHJlbmRlckFkZHIpCgoJcmV0dXJuIHJvdXRlci5SZW5kZXIocGF0aCkKfQoKZnVuYyByZW5kZXJIb21lKHJlcyAqbXV4LlJlc3BvbnNlV3JpdGVyLCBfICptdXguUmVxdWVzdCkgewoJcmVzLldyaXRlKG1kLkgxKCJTZXR0bGVycyIpKQoKCWlmIE5vdGljZSAhPSAiIiB7CgkJcmVzLldyaXRlKG1kYWxlcnQuTmV3KE5vdGljZVR5cGUsICJNZXNzYWdlIiwgTm90aWNlLCBmYWxzZSkuU3RyaW5nKCkgKyAiXG5cbiIpCgl9CgoJcmVzLldyaXRlKG1kLlBhcmFncmFwaCgKCQkiU291bGJvdW5kIHBpeGVsLWFydCBnbm9tZXMgZm9yIHRoZSBlYXJseSBzZXR0bGVycyBvZiBHbm8ubGFuZC4gIiArCgkJCSJFdmVyeSBhY2NvdW50IHRoYXQgaGFkIGF0IGxlYXN0IDE1IEdOT1QgYXQgdGhlIGxhdW5jaCBvZiBgZ25vbGFuZC0xYCBjYW4gbWludCBvbmUsICIgKwoJCQkiZmlyc3QgY29tZSBmaXJzdCBzZXJ2ZWQuIEEgU2V0dGxlciBjYW4ndCBiZSB0cmFuc2ZlcnJlZCwgaXQncyBzb3VsYm91bmQiLAoJKSkKCglyZXMuV3JpdGUobWQuUGFyYWdyYXBoKCJSZWFsbSBwYXRoczoiKSkKCXBhdGhzVGFibGUgOj0gbWR0YWJsZS5UYWJsZXtIZWFkZXJzOiBbXXN0cmluZ3siUGF0aCIsICJEZXNjcmlwdGlvbiJ9fQoJcGF0aHNUYWJsZS5BcHBlbmQoW11zdHJpbmd7CgkJbWQuSW5saW5lQ29kZSgidG9rZW4ve2lkfSIpLAoJCSJBIFNldHRsZXIgd2l0aCBpdHMgdHJhaXRzIGFuZCBpdHMgb3duZXIuIiwKCX0pCglwYXRoc1RhYmxlLkFwcGVuZChbXXN0cmluZ3sKCQltZC5JbmxpbmVDb2RlKCJhZGRyL3thZGRyZXNzfSIpLAoJCSJUaGUgU2V0dGxlciBvZiBhbiBhY2NvdW50LiIsCgl9KQoJcmVzLldyaXRlKHBhdGhzVGFibGUuU3RyaW5nKCkgKyAiXG4iKQoKCW1pbnRlZCA6PSB0b2tlbnMuU2l6ZSgpCglpZiBsZW4ocm9vdCkgPT0gMCB7CgkJcmVzLldyaXRlKG1kLlBhcmFncmFwaCgiVGhlIG1pbnQgaXMgbm90IG9wZW4geWV0LiIpKQoJfSBlbHNlIHsKCQlyZXMuV3JpdGUobWQuUGFyYWdyYXBoKAoJCQltZC5CdWxsZXRJdGVtKG1kLkJvbGQoIk1pbnRlZDoiKSsiICIrc3RyY29udi5JdG9hKG1pbnRlZCkrIiBvZiAiK3N0cmNvbnYuSXRvYShzdXBwbHlDYXApKSArCgkJCQltZC5CdWxsZXRJdGVtKG1kLkJvbGQoIkVsaWdpYmxlIGFjY291bnRzOiIpKyIgIitzdHJjb252Lkl0b2EodG90YWwpKSArCgkJCQltZC5CdWxsZXRJdGVtKG1kLkJvbGQoIk1lcmtsZSByb290OiIpKyIgIittZC5JbmxpbmVDb2RlKE1lcmtsZVJvb3QoKSkpLAoJCSkpCgoJCXJlcy5Xcml0ZShtZC5QYXJhZ3JhcGgoCgkJCSJUbyBtaW50LCBnZXQgeW91ciBwcm9vZiBmcm9tIHRoZSBsaXN0IG9mIGVsaWdpYmxlIGFjY291bnRzIGFuZCBjYWxsICIgKwoJCQkJbWQuTGluaygiTWludCIsIFJlYWxtUGF0aCsiJGhlbHAmZnVuYz1NaW50IikgKyAiIHdpdGggaXQ7IHRoZSBhY2NvdW50IHRoYXQgIiArCgkJCQkic2lnbnMgdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBvbmUgdGhhdCBnZXRzIHRoZSBTZXR0bGVyLiIsCgkJKSkKCQlyZXMuV3JpdGUobWQuUGFyYWdyYXBoKAoJCQkiQ2hlY2sgdGhlICIgKyBtZC5MaW5rKCJSRUFETUUiLCBSZWFsbVBhdGgrIiRzb3VyY2UmZmlsZT1SRUFETUUubWQiKSArICIgZm9yIHRoZSBmdWxsIGluc3RydWN0aW9ucy4iLAoJCSkpCgl9CgoJaWYgbWludGVkID4gMCB7CgkJcmVzLldyaXRlKG1kLkgyKCJMYXN0IFNldHRsZXJzIikpCgkJdG9rZW5zLlJldmVyc2VJdGVyYXRlQnlPZmZzZXQoMCwgZ2FsbGVyeUxlbiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCQlzZXR0bGVySUQsIF8gOj0gc3RyY29udi5BdG9pKGtleSkKCQkJaW1nIDo9IGltYWdlKHNldHRsZXJJRCwgbmZ0LlVucGFjayh2YWx1ZS4odWludDMyKSksIGdhbGxlcnlXaWR0aCkKCQkJcmVzLldyaXRlKCJbIiArIGltZyArICJdKCIgKyB0b2tlblBhdGgoc2V0dGxlcklEKSArICIpICIpCgkJCXJldHVybiBmYWxzZQoJCX0pCgkJcmVzLldyaXRlKCJcblxuIikKCX0KCglyZXMuV3JpdGUoZm9vdGVyKCkpCn0KCmZ1bmMgcmVuZGVyVG9rZW4ocmVzICptdXguUmVzcG9uc2VXcml0ZXIsIHJlcSAqbXV4LlJlcXVlc3QpIHsKCXRpZCA6PSBncmM3MjEuVG9rZW5JRChyZXEuR2V0VmFyKCJpZCIpKQoJc2V0dGxlcklELCBfIDo9IHBhcnNlVG9rZW5JRCh0aWQpCglwYWNrZWQsIG9rIDo9IHRyYWl0c09mKHRpZCkKCWlmICFvayB7CgkJcmVzLldyaXRlKG1kLlBhcmFncmFwaCgiU2V0dGxlciBub3QgZm91bmQuIikpCgkJcmVzLldyaXRlKG1kLlBhcmFncmFwaChiYWNrSG9tZUxpbmsoKSkpCgkJcmV0dXJuCgl9CgoJcmVzLldyaXRlKG1kLkgxKHNldHRsZXJOYW1lKHNldHRsZXJJRCkpKQoJdCA6PSBuZnQuVW5wYWNrKHBhY2tlZCkKCXJlcy5Xcml0ZShpbWFnZShzZXR0bGVySUQsIHQsIGRldGFpbFdpZHRoKSArICJcblxuIikKCglvd25lckFkZHIsIF8gOj0gT3duZXJPZih0aWQpCglvd25lciA6PSBvd25lckFkZHIuU3RyaW5nKCkKCXJlcy5Xcml0ZShtZC5QYXJhZ3JhcGgoCgkJIk93bmVyOiAiICsgbWQuTGluayhvd25lciwgUmVhbG1QYXRoKyI6YWRkci8iK293bmVyKSArCgkJCSIgwrcgc291bGJvdW5kLCBpdCBjYW4ndCBiZSB0cmFuc2ZlcnJlZCIsCgkpKQoKCXJlcy5Xcml0ZSgifCBUcmFpdCB8IFZhbHVlIHxcbnwgLS0tIHwgLS0tIHxcbiIpCglmb3IgXywgYXR0ciA6PSByYW5nZSB0LkF0dHJpYnV0ZXMoKSB7CgkJcmVzLldyaXRlKCJ8ICIgKyBhdHRyLlR5cGUgKyAiIHwgIiArIGF0dHIuVmFsdWUgKyAiIHxcbiIpCgl9CglyZXMuV3JpdGUoIlxuIikKCglyZXMuV3JpdGUobWQuUGFyYWdyYXBoKGJhY2tIb21lTGluaygpKSkKCXJlcy5Xcml0ZShmb290ZXIoKSkKfQoKZnVuYyByZW5kZXJBZGRyKHJlcyAqbXV4LlJlc3BvbnNlV3JpdGVyLCByZXEgKm11eC5SZXF1ZXN0KSB7CglhZGRyIDo9IHNhbml0aXplLkJlY2hTdHJpbmcocmVxLkdldFZhcigiYWRkciIpLCAiZyIpCglpZiBhZGRyID09ICIiIHsKCQlyZXMuV3JpdGUobWQuUGFyYWdyYXBoKCJOb3QgYSB2YWxpZCBhZGRyZXNzLiIpKQoJCXJlcy5Xcml0ZShtZC5QYXJhZ3JhcGgoYmFja0hvbWVMaW5rKCkpKQoJCXJldHVybgoJfQoKCXRpZCA6PSBUb2tlbk9mKGFkZHJlc3MoYWRkcikpCglpZiB0aWQgPT0gIiIgewoJCXJlcy5Xcml0ZShtZC5IMSgiU2V0dGxlciBvZiAiICsgbWQuSW5saW5lQ29kZShhZGRyKSkpCgkJcmVzLldyaXRlKG1kLlBhcmFncmFwaCgiVGhpcyBhY2NvdW50IGhhcyBub3QgbWludGVkIGEgU2V0dGxlci4iKSkKCQlyZXMuV3JpdGUobWQuUGFyYWdyYXBoKGJhY2tIb21lTGluaygpKSkKCQlyZXR1cm4KCX0KCglzZXR0bGVySUQsIF8gOj0gcGFyc2VUb2tlbklEKHRpZCkKCXBhY2tlZCwgXyA6PSB0cmFpdHNPZih0aWQpCglpbWcgOj0gaW1hZ2Uoc2V0dGxlcklELCBuZnQuVW5wYWNrKHBhY2tlZCksIGRldGFpbFdpZHRoKQoJcmVzLldyaXRlKG1kLkgxKCJTZXR0bGVyIG9mICIgKyBtZC5JbmxpbmVDb2RlKGFkZHIpKSkKCXJlcy5Xcml0ZSgiWyIgKyBpbWcgKyAiXSgiICsgdG9rZW5QYXRoKHNldHRsZXJJRCkgKyAiKVxuXG4iKQoJcmVzLldyaXRlKG1kLlBhcmFncmFwaChiYWNrSG9tZUxpbmsoKSkpCglyZXMuV3JpdGUoZm9vdGVyKCkpCn0KCmZ1bmMgaW1hZ2Uoc2V0dGxlcklEIGludCwgdCBuZnQuVHJhaXRzLCB3aWR0aCBpbnQpIHN0cmluZyB7CglhbHQgOj0gc2V0dGxlck5hbWUoc2V0dGxlcklEKQoJcmV0dXJuICIhWyIgKyBhbHQgKyAiXSgiICsgbmZ0LlJlbmRlckRhdGFVUkkodCwgbmZ0Lk9wdGlvbnN7U2l6ZTogd2lkdGh9KSArICIpIgp9CgpmdW5jIHRva2VuUGF0aChzZXR0bGVySUQgaW50KSBzdHJpbmcgewoJcmV0dXJuIFJlYWxtUGF0aCArICI6dG9rZW4vIiArIHN0cmNvbnYuSXRvYShzZXR0bGVySUQpCn0KCmZ1bmMgYmFja0hvbWVMaW5rKCkgc3RyaW5nIHsKCXJldHVybiBtZC5MaW5rKCI8IEhvbWUiLCBSZWFsbVBhdGgpCn0KCmZ1bmMgc2V0dGxlck5hbWUoc2V0dGxlcklEIGludCkgc3RyaW5nIHsKCXJldHVybiAiU2V0dGxlciAjIiArIHN0cmNvbnYuSXRvYShzZXR0bGVySUQpCn0KCmZ1bmMgZm9vdGVyKCkgc3RyaW5nIHsKCXJldHVybiBtZC5CbG9ja3F1b3RlKG5mdC5DcmVkaXRzKQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBITCIDKte4BEgsyNTAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQLg/HIt+xiL9BCyqzFswoh/47e7ozrWoMlW2tsQ5FheyBJAkZ8gmJnpBeJYxGIr/GS5Qo0VTw46lTaESKpD0YQjRt4iALpEAbzigyNp4RJfu+KC6l/RNUKsq1Vu/fkJaoVV8hooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data