Transaction executed successfully

Transaction Details

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

Transaction hash
106B6898BCB6B3ACE45AF04F9B61063E8B066736272272961B9F2282903A8165

Transaction overview

Status
Success
Execution completed
Block
#351458
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
40,329,970
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CuDpAQoML3ZtLm1fYWRkcGtnEs7pAQooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKR6QEKBnVwa2VlcBI6Z25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3Vwa2VlcBphCgtnbm9tb2QudG9tbBJSbW9kdWxlID0gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS91cGtlZXAiCmdubyA9ICIwLjkiChr6dAoKdXBrZWVwLmdubxLrdC8vIFBhY2thZ2UgdXBrZWVwIHBheXMgcGVvcGxlIHRvIHJ1biB0aGUgZWNvc3lzdGVtJ3MgcGVybWlzc2lvbmxlc3MKLy8gdmFsdmVzLiBUaGUgcG9ydGZvbGlvJ3MgcmVhbG1zIGRlbGliZXJhdGVseSBleHBvc2UgbWFpbnRlbmFuY2UKLy8gZW50cnlwb2ludHMgdGhhdCBhbnlvbmUgbWF5IGNhbGwg4oCUIHN1YnNjcmlwdGlvbnMuRXhwaXJlIGZyZWVzIGEgbGFwc2VkCi8vIHN1YnNjcmlwdGlvbiBzbG90LCB0aW1lbG9ja19ndWFyZGlhbi5FeGVjdXRlIGZpcmVzIGEgbWF0dXJlZCB0aW1lbG9ja2VkCi8vIGFjdGlvbiDigJQgYmVjYXVzZSBubyBzbG90J3MgbGl2ZW5lc3MgbWF5IGRlcGVuZCBvbiBhbiBpbnRlcmVzdGVkIHBhcnR5Ci8vIHNob3dpbmcgdXAuIFRoaXMgcmVhbG0gYWRkcyB0aGUgbWlzc2luZyBlY29ub21pY3M6IGZ1bmRlcnMgZmluYW5jZSBhCi8vIHJld2FyZCBwb3QsIGFuZCB3aG9ldmVyIHRyaWdnZXJzIGEgdmFsdmUgVEhST1VHSCB0aGlzIHJlYWxtIGlzIGNyZWRpdGVkCi8vIGEgYm91bmRlZCByZXdhcmQsIGNsYWltYWJsZSBieSBwdWxsLgovLwovLyBUSEUgUkVBTE0tVE8tUkVBTE0gQk9VTkRBUlksIFBSRUNJU0VMWToKLy8KLy8Jd2hpY2ggY2FsbHMgd2hpY2ggICAgIDogdXBrZWVwIC0+IHN1YnNjcmlwdGlvbnMuRXhwaXJlKGNyb3NzLCBpZCkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgdXBrZWVwIC0+IHRpbWVsb2NrX2d1YXJkaWFuLkV4ZWN1dGUoY3Jvc3MsIGlkKQovLwl3aHkgaXQgaXMgbmVjZXNzYXJ5ICAgOiB0aGUgcmV3YXJkIG11c3QgYmUgY29uZGl0aW9uZWQgb24gdGhlIHZhbHZlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IGZpcmluZy4gT25seSBtYWtpbmcgdGhlIGNhbGwgZnJvbQovLwkgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgdGhpcyByZWFsbSB0aWVzICJ0aGUgdmFsdmUgZmlyZWQiIGFuZAovLwkgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHJld2FyZCBpcyBjcmVkaXRlZCIgaW50byBvbmUgYXRvbWljCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOyBvYnNlcnZpbmcgZnJvbSBvdXRzaWRlIGNhbm5vdC4KLy8JY2FsbGVyIGlkZW50aXR5ICAgICAgIDogZG93bnN0cmVhbSBzZWVzIGN1ci5QcmV2aW91cygpID0gVEhJUyByZWFsbSwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgbm90IHRoZSBwb2tpbmcgRU9BLiBCb3RoIHZhbHZlcyBhcmUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbmxlc3MgQlkgREVTSUdOIGFuZCB1c2UgdGhlIGNhbGxlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eSBmb3Igbm90aGluZywgc28gdGhlIGludGVybWVkaWFyeQovLwkgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIG5vIGF1dGhvcml6YXRpb24gb3V0Y29tZS4gVGhpcyByZWFsbQovLwkgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYSBkZXB1dHkgZm9yIGFueSBkb3duc3RyZWFtIGF1dGhvcml0eQovLwkgICAgICAgICAgICAgICAgICAgICAgICDigJQgaXQgaG9sZHMgbm9uZSB0byBjb25mdXNlLgovLwlhdXRob3JpemF0aW9uIGJvdW5kYXJ5OiB1cHN0cmVhbSwgYW55b25lIG1heSBwb2tlICh0aGUgcmV3YXJkIGlzIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHRoaW5nIGF0IHN0YWtlIGFuZCB0aGUgcG90IGlzIHRoZSBvbmx5Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSkuIERvd25zdHJlYW0sIGVhY2ggdmFsdmUgZW5mb3JjZXMgaXRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG93biBTVEFURSBjb25kaXRpb25zIChncmFjZSBlbGFwc2VkLCBkZWxheQovLwkgICAgICAgICAgICAgICAgICAgICAgICBtYXR1cmVkKSBleGFjdGx5IGFzIGl0IHdvdWxkIGZvciBhIGRpcmVjdAovLwkgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIuCi8vCW9yZGVyaW5nICAgICAgICAgICAgICA6IGRvd25zdHJlYW0gY2FsbCBGSVJTVCwgcmV3YXJkIGFjY291bnRpbmcKLy8JICAgICAgICAgICAgICAgICAgICAgICAgQUZURVIuIEEgZG93bnN0cmVhbSBhYm9ydCB0aGVyZWZvcmUgcmV2ZXJ0cwovLwkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYmVmb3JlIGFueSBwb3Qgb3IKLy8JICAgICAgICAgICAgICAgICAgICAgICAgbGVkZ2VyIG11dGF0aW9uIGV4aXN0cy4KLy8JZmFpbHVyZSBiZWhhdmlvciAgICAgIDogYW55IGRvd25zdHJlYW0gcGFuaWMgKG5vdCBleHBpcmFibGUsIHRvbwovLwkgICAgICAgICAgICAgICAgICAgICAgICBlYXJseSwgYWxyZWFkeSBleGVjdXRlZCwgdW5rbm93biBpZC4uLikKLy8JICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRzIHRoaXMgdHJhbnNhY3Rpb24uIE5vIHBhcnRpYWwgc3RhdGUsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG5vIHJld2FyZCwgYnkgVk0gYXRvbWljaXR5IOKAlCBub3QgYnkgY2xlYW51cAovLwkgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLgovLwlhdG9taWNpdHkgYXNzdW1wdGlvbnMgOiBhIEdubyB0cmFuc2FjdGlvbiBpcyBhbGwtb3Itbm90aGluZyBhY3Jvc3MKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0gYm91bmRhcmllczsgdGhlcmUgaXMgbm8gY2F0Y2gvcmVjb3ZlcgovLwkgICAgICAgICAgICAgICAgICAgICAgICBhbnl3aGVyZSBvbiB0aGlzIHBhdGggKGFuZCBub25lIG1heSBiZSBhZGRlZAovLwkgICAgICAgICAgICAgICAgICAgICAgICDigJQgcmVjb3Zlcnkgd291bGQgYnJlYWsgZXhhY3RseSB0aGlzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJhbnRlZSkuCi8vCXZhbHVlIG1vdmVtZW50ICAgICAgICA6IG5vbmUgY3Jvc3NlcyB0aGUgYm91bmRhcnkuIEJvdGggdmFsdmVzIG1vdmUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgbm8gY29pbnM7IHRoZSBwb2tlIHRyYW5zYWN0aW9uIG11c3QgY2Fycnkgbm8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgY29pbnMgKHN1YnNjcmlwdGlvbnMnIGFzc2VydE5vU2VuZCByZWFkcyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgT1JJR0lOIGVudmVsb3BlIHVuY29uZGl0aW9uYWxseSDigJQgbWVhc3VyZWQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhc3N1bWVkKS4gUmV3YXJkcyBtb3ZlIG9ubHkgaW5zaWRlIHRoaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0ncyBsZWRnZXIsIGZ1bmRlZCBieSBleHBsaWNpdCBGdW5kCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy4KLy8JZG93bnN0cmVhbSByZWplY3Rpb24gIDogcmV3YXJkIGRlbmllZCBhdXRvbWF0aWNhbGx5IOKAlCB0aGUgYWJvcnQgaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlbmlhbC4KLy8JZG93bnN0cmVhbSB0cnVzdCAgICAgIDogbmVpdGhlciB2YWx2ZSB0cnVzdHMgbm9yIHZhbGlkYXRlcyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyOyBib3RoIHZhbGlkYXRlIHN0YXRlLiBUaGlzIHJlYWxtCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY2FsbHkgZG9lcyBub3QgdHJ1c3QgdGhlIGRvd25zdHJlYW0KLy8JICAgICAgICAgICAgICAgICAgICAgICAgUkVQTFkgYmV5b25kICJpdCBkaWQgbm90IGFib3J0Ii4KLy8JcmVwbGF5ICAgICAgICAgICAgICAgIDogZW5mb3JjZWQgZG93bnN0cmVhbS4gQSBzZWNvbmQgRXhwaXJlIG9uIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIHN1YnNjcmlwdGlvbiBhYm9ydHMgKCJzdWJzY3JpcHRpb24gaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlZCIpOyBhIHNlY29uZCBFeGVjdXRlIGFib3J0cyAoImFjdGlvbgovLwkgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4ZWN1dGVkIikuIEEgcG9rZXIgY2Fubm90IGJlIHBhaWQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgdHdpY2UgZm9yIG9uZSB2YWx2ZSBldmVudC4KLy8JYWR2ZXJzYXJpYWwgY2FsbGVycyAgIDogYW4gRU9BIG9yIHJlYWxtIHBva2luZyB3aXRoIGJvZ3VzIGlkcywKLy8JICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWF0dXJlIHRhcmdldHMsIG9yIHJlcGxheXMgaGl0cyBhCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW0gYWJvcnQgYW5kIHBheXMgaXRzIG93biBnYXMuIFRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgZWNvbm9taWMgZWRnZSDigJQgbWFudWZhY3R1cmluZwovLwkgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmFibGUgc3RhdGUgdG8gZmFybSByZXdhcmRzIOKAlCBkaWZmZXJzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHBlciB0YXNrLiBzdWJfZXhwaXJlOiBldmVyeSBmYXJtZWQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uIHBlcm1hbmVudGx5IGxvY2tzIGEgc3ViLXJlY29yZAovLwkgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlIGRlcG9zaXQgb2Ygcm91Z2hseSAzMCwwMDB1Z25vdCBhdAovLwkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb2JzZXJ2ZWQgMTAwdWdub3QvYnl0ZSByYXRlIChFeHBpcmUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHMgc3RhdHVzOyBpdCBkb2VzIG5vdCBmcmVlIHRoZSByZWNvcmQpLAovLwkgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBleGNlZWRzIE1heFJld2FyZCBiZWZvcmUgcHJpY2UgYW5kCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGdhcyDigJQgbG9zcy1tYWtpbmcgYXQgYW55IGxlZ2FsIHNldHRpbmcuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVsb2NrX2V4ZWN1dGU6IGEgZmFybWVkIEFjdGlvbiByZWNvcmQgaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgc21hbGwgYW5kIGl0cyBkZXBvc2l0IGNhbiBzaXQgYmVsb3cgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGNhcCwgc28gZmFybWluZyByZXNpc3RhbmNlIHRoZXJlIHJlc3RzIG9uCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhZG1pbiBrZWVwaW5nIHRoZSBzZXR0aW5nIGJlbG93IHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZCBjeWNsZSBjb3N0LiBGdW5kZXJzIHRydXN0IHRoZSBjYXAKLy8JICAgICAgICAgICAgICAgICAgICAgICAgQU5EIHRoZSBhZG1pbidzIHJld2FyZCBwb2xpY3ksIG5vdCB0aGUgY2FwCi8vCSAgICAgICAgICAgICAgICAgICAgICAgIGFsb25lLiBUaGUgcG90IGlzIGEgZG9uYXRpb24gZWl0aGVyIHdheSDigJQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgZmFybWluZyBjYW4gZHJhaW4gaXQsIG5ldmVyIHRoaXJkLXBhcnR5Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VzLgovLwovLyBSZXdhcmRzIGRlZmF1bHQgdG8gMCBwZXIgdGFzazsgdGhlIGFkbWluIHNldHMgdGhlbSB3aXRoaW4gdGhlCi8vIGNvbXBpbGUtdGltZSBNYXhSZXdhcmQuIFRoZSBwb3Qgb25seSBtb3ZlcyBkb3duIHZpYSBzdWNjZXNzZnVsIHBva2VzCi8vIGFuZCBvbmx5IHVwIHZpYSBGdW5kLiBDb25zZXJ2YXRpb246IEhlbGQgPT0gcG90ICsgVXNlcnNUb3RhbAovLyAoKyBvdXQtb2YtYmFuZCBzdXJwbHVzLCByZWNvdmVyYWJsZSBhYm92ZSB0aGF0IHJlc2VydmUgYnkgU3dlZXBEZW5vbSkuCi8vIFRoZSBsZWRnZXIncyBmZWUgY2FwIGlzIDAg4oCUIG5vIGZlZSBleGlzdHMgYW55d2hlcmUgaW4gdGhpcyByZWFsbS4KcGFja2FnZSB1cGtlZXAKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZmVlbGVkZ2VyIgoKCXN1YnMgImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zdWJzY3JpcHRpb25zIgoJZ3VhcmRpYW4gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS90aW1lbG9ja19ndWFyZGlhbiIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIFRhc2sgaWRlbnRpZmllcnMg4oCUIHRoZSB0d28gc3VwcG9ydGVkIHZhbHZlcy4KY29uc3QgKAoJVGFza1N1YkV4cGlyZSAgICAgICA9ICJzdWJfZXhwaXJlIgoJVGFza1RpbWVsb2NrRXhlY3V0ZSA9ICJ0aW1lbG9ja19leGVjdXRlIgopCgovLyBNYXhSZXdhcmQgaXMgdGhlIGNvbXBpbGUtdGltZSBjZWlsaW5nIG9uIHRoZSBwZXItcG9rZSByZXdhcmQ6Ci8vIDIwLDAwMHVnbm90ICgwLjAyIEdOT1QpLiBJdCBib3VuZHMgd2hhdCBhbnkgc2luZ2xlIHBva2UgY2FuIGV4dHJhY3QKLy8gZnJvbSB0aGUgcG90LiBGb3Igc3ViX2V4cGlyZSBpdCBhbHNvIGRlZmVhdHMgZmFybWluZyBvdXRyaWdodDogb25lCi8vIG1hbnVmYWN0dXJlZCBleHBpcmFibGUgc3Vic2NyaXB0aW9uIHBlcm1hbmVudGx5IGxvY2tzIGEgc3ViLXJlY29yZAovLyBkZXBvc2l0IG9mIH4zMCwwMDB1Z25vdCBhdCB0aGUgb2JzZXJ2ZWQgMTAwdWdub3QvYnl0ZSByYXRlIOKAlCBhbHJlYWR5Ci8vIGFib3ZlIHRoZSBjYXAgYmVmb3JlIHByaWNlIGFuZCBnYXMuIEZvciB0aW1lbG9ja19leGVjdXRlIHRoZSBmYXJtZWQKLy8gQWN0aW9uIHJlY29yZCBpcyBzbWFsbGVyIGFuZCBpdHMgZGVwb3NpdCBjYW4gc2l0IGJlbG93IHRoZSBjYXAsIHNvCi8vIHRoZXJlIHRoZSBhZG1pbidzIHNldHRpbmcsIGtlcHQgYmVsb3cgdGhlIG1lYXN1cmVkIGZhcm0tY3ljbGUgY29zdCwKLy8gaXMgd2hhdCBkZXRlcnMgZmFybWluZy4gRnVuZGVycyB0cnVzdCB0aGUgY2FwIGFuZCB0aGUgYWRtaW4ncwovLyBwb2xpY3kgdG9nZXRoZXI7IHRoZSBwb3QgdGhleSBmdW5kIGlzIGFuIGV4cGxpY2l0IGRvbmF0aW9uIGVpdGhlcgovLyB3YXkuCmNvbnN0IE1heFJld2FyZCA9IGludDY0KDIwMDAwKQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzIC8vIG1heSBzZXQgcmV3YXJkcywgc3RhZ2UgYSBzdWNjZXNzb3IKCXBlbmRpbmdBZG1pbiBhZGRyZXNzIC8vIHN0YWdlZCBieSBUcmFuc2ZlckFkbWluLCBjb21wbGV0ZXMgdmlhIEFjY2VwdEFkbWluCglzd2VlcGVyICAgICAgYWRkcmVzcyAvLyBtYXkgc3dlZXAgb3V0LW9mLWJhbmQgc3VycGx1cwoKCXNlbGYgYWRkcmVzcyAvLyB0aGlzIHJlYWxtJ3MgYWRkcmVzcywgY2FwdHVyZWQgYXQgZGVwbG95Cglwb3QgIGludDY0ICAgLy8gZnVuZGVkLCBub3QteWV0LWF3YXJkZWQgdWdub3QKCglyZXdhcmRzID0gbWFwW3N0cmluZ11pbnQ2NHsKCQlUYXNrU3ViRXhwaXJlOiAgICAgICAwLAoJCVRhc2tUaW1lbG9ja0V4ZWN1dGU6IDAsCgl9CglsZWRnZXIgPSBmZWVsZWRnZXIuTXVzdE5ldygwKQoKCS8vIGxpZmV0aW1lIGNvdW50ZXJzLCByZW5kZXJlZCBmb3Igb3BlcmF0b3JzCglwb2tlcyAgaW50NjQKCWZ1bmRlZCBpbnQ2NAopCgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJc3dlZXBlciA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gZnVuZGluZyAtLS0KCi8vIEZ1bmQgYWRkcyB0aGUgYXR0YWNoZWQgY29pbnMgdG8gdGhlIHJld2FyZCBwb3QuIEFueW9uZSBtYXkgZnVuZDsKLy8gZnVuZGluZyBpcyBhIGRvbmF0aW9uIHRvIGVjb3N5c3RlbSBtYWludGVuYW5jZSBhbmQgaXMgbm90IHJlZnVuZGFibGUuCmZ1bmMgRnVuZChjdXIgcmVhbG0pIHsKCWZ1bmRlciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCgluZXdQb3QsIG9rIDo9IGNoZWNrZWRBZGQocG90LCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJwb3Qgd291bGQgb3ZlcmZsb3ciKQoJfQoJcG90ID0gbmV3UG90CglmdW5kZWQgKz0gYW1vdW50CgljaGFpbi5FbWl0KCJGdW5kZWQiLCAiZnJvbSIsIGZ1bmRlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG90IiwgaXRvYShwb3QpKQp9CgovLyAtLS0gdGhlIHBva2VzOiB0aGUgcmVhbG0tdG8tcmVhbG0gY2FsbHMgLS0tCgovLyBQb2tlRXhwaXJlIHRyaWdnZXJzIHN1YnNjcmlwdGlvbnMuRXhwaXJlKHN1YklEKSB0aHJvdWdoIHRoaXMgcmVhbG0gYW5kCi8vIGNyZWRpdHMgdGhlIGNhbGxlciB0aGUgc3ViX2V4cGlyZSByZXdhcmQuIFRoZSBkb3duc3RyZWFtIHJlYWxtIGRlY2lkZXMKLy8gd2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGV4cGlyYWJsZTsgaXRzIGFib3J0IGlzIHRoZSBhdXRob3JpemF0aW9uLgovLyBUaGUgdHJhbnNhY3Rpb24gbXVzdCBhdHRhY2ggbm8gY29pbnMgKHRoZSBkb3duc3RyZWFtIHJlYWxtIGNoZWNrcyB0aGUKLy8gb3JpZ2luIGVudmVsb3BlKS4KZnVuYyBQb2tlRXhwaXJlKGN1ciByZWFsbSwgc3ViSUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglyZXdhcmQgOj0gcmVxdWlyZVJld2FyZChUYXNrU3ViRXhwaXJlKQoKCS8vIERvd25zdHJlYW0gZmlyc3Q6IGFuIGFib3J0IGhlcmUgcmV2ZXJ0cyBldmVyeXRoaW5nIGJlbG93LgoJc3Vicy5FeHBpcmUoY3Jvc3MoY3VyKSwgc3ViSUQpCgoJYXdhcmQoY2FsbGVyLCByZXdhcmQsIFRhc2tTdWJFeHBpcmUsIGl0b2Eoc3ViSUQpKQp9CgovLyBQb2tlRXhlY3V0ZSB0cmlnZ2VycyB0aW1lbG9ja19ndWFyZGlhbi5FeGVjdXRlKGFjdGlvbklEKSB0aHJvdWdoIHRoaXMKLy8gcmVhbG0gYW5kIGNyZWRpdHMgdGhlIGNhbGxlciB0aGUgdGltZWxvY2tfZXhlY3V0ZSByZXdhcmQuIFRoZSBndWFyZGlhbgovLyBkZWNpZGVzIHdoZXRoZXIgdGhlIGFjdGlvbiBpcyBleGVjdXRhYmxlOyBpdHMgYWJvcnQgaXMgdGhlCi8vIGF1dGhvcml6YXRpb24uCmZ1bmMgUG9rZUV4ZWN1dGUoY3VyIHJlYWxtLCBhY3Rpb25JRCBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglyZXdhcmQgOj0gcmVxdWlyZVJld2FyZChUYXNrVGltZWxvY2tFeGVjdXRlKQoKCWd1YXJkaWFuLkV4ZWN1dGUoY3Jvc3MoY3VyKSwgYWN0aW9uSUQpCgoJYXdhcmQoY2FsbGVyLCByZXdhcmQsIFRhc2tUaW1lbG9ja0V4ZWN1dGUsIGFjdGlvbklEKQp9CgovLyBhd2FyZCBtb3ZlcyByZXdhcmQgZnJvbSB0aGUgcG90IHRvIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZS4KLy8gQ2FsbGVycyBoYXZlIGFscmVhZHkgZXN0YWJsaXNoZWQgdGhhdCB0aGUgcG90IGNvdmVycyBpdC4KZnVuYyBhd2FyZChjYWxsZXIgYWRkcmVzcywgcmV3YXJkIGludDY0LCB0YXNrLCB0YXJnZXQgc3RyaW5nKSB7Cglwb3QgLT0gcmV3YXJkCglsZWRnZXIuTXVzdERlcG9zaXQoY2FsbGVyLlN0cmluZygpLCByZXdhcmQsIDApCglwb2tlcysrCgljaGFpbi5FbWl0KCJQb2tlZCIsCgkJInRhc2siLCB0YXNrLAoJCSJ0YXJnZXQiLCB0YXJnZXQsCgkJImNhbGxlciIsIGNhbGxlci5TdHJpbmcoKSwKCQkicmV3YXJkIiwgaXRvYShyZXdhcmQpLAoJCSJwb3QiLCBpdG9hKHBvdCksCgkpCn0KCi8vIHJlcXVpcmVSZXdhcmQgcmV0dXJucyB0aGUgY29uZmlndXJlZCByZXdhcmQgZm9yIGEgdGFzaywgcmVmdXNpbmcgd2hlbgovLyB0aGUgdGFzayBpcyB1bmtub3duLCB1bnJld2FyZGVkLCBvciB0aGUgcG90IGNhbm5vdCBjb3ZlciBpdC4gUmVmdXNhbAovLyBvbiBhbiBlbXB0eSBwb3QgaXMgZGVsaWJlcmF0ZTogYm90aCB2YWx2ZXMgcmVtYWluIGRpcmVjdGx5IGNhbGxhYmxlIG9uCi8vIHRoZWlyIG93biByZWFsbXMsIHNvIGFuIHVucmV3YXJkZWQgZGV0b3VyIHRocm91Z2ggdGhpcyBvbmUgaXMgb25seSBhCi8vIGdhcyB0cmFwIGZvciB0aGUgY2FsbGVyLgpmdW5jIHJlcXVpcmVSZXdhcmQodGFzayBzdHJpbmcpIGludDY0IHsKCXIsIG9rIDo9IHJld2FyZHNbdGFza10KCWlmICFvayB7CgkJcGFuaWMoInVua25vd24gdGFzazogIiArIHRhc2spCgl9CglpZiByIDw9IDAgewoJCXBhbmljKCJubyByZXdhcmQgY29uZmlndXJlZCBmb3IgIiArIHRhc2spCgl9CglpZiBwb3QgPCByIHsKCQlwYW5pYygicmV3YXJkIHBvdCBjYW5ub3QgY292ZXIgIiArIHRhc2sgKyAiOiBwb3QgIiArIGl0b2EocG90KSArCgkJCSIsIHJld2FyZCAiICsgaXRvYShyKSkKCX0KCXJldHVybiByCn0KCi8vIC0tLSBjbGFpbXMgLS0tCgovLyBDbGFpbSBzZW5kcyBhbW91bnQgdWdub3Qgb2YgdGhlIGNhbGxlcidzIGVhcm5lZCBiYWxhbmNlIGJhY2sgdG8gdGhlCi8vIGNhbGxlci4KZnVuYyBDbGFpbShjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGVyciA6PSBsZWRnZXIuV2l0aGRyYXcoY2FsbGVyLlN0cmluZygpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIENsYWltQWxsIHNlbmRzIHRoZSBjYWxsZXIncyBlbnRpcmUgZWFybmVkIGJhbGFuY2UgYmFjayB0byB0aGUgY2FsbGVyLgpmdW5jIENsYWltQWxsKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCwgZXJyIDo9IGxlZGdlci5XaXRoZHJhd0FsbChjYWxsZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vdGhpbmcgdG8gY2xhaW0iKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyAtLS0gYWRtaW5pc3RyYXRpb24gLS0tCgovLyBTZXRSZXdhcmQgY29uZmlndXJlcyB0aGUgcGVyLXBva2UgcmV3YXJkIGZvciBhIHRhc2ssIGJvdW5kZWQgYnkKLy8gTWF4UmV3YXJkLiBBZG1pbiBvbmx5LiBaZXJvIGRpc2FibGVzIHRoZSB0YXNrLgpmdW5jIFNldFJld2FyZChjdXIgcmVhbG0sIHRhc2sgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBfLCBvayA6PSByZXdhcmRzW3Rhc2tdOyAhb2sgewoJCXBhbmljKCJ1bmtub3duIHRhc2s6ICIgKyB0YXNrKQoJfQoJaWYgYW1vdW50IDwgMCB8fCBhbW91bnQgPiBNYXhSZXdhcmQgewoJCXBhbmljKCJyZXdhcmQgbXVzdCBiZSBpbiBbMCwgIiArIGl0b2EoTWF4UmV3YXJkKSArICJdIikKCX0KCW9sZCA6PSByZXdhcmRzW3Rhc2tdCglyZXdhcmRzW3Rhc2tdID0gYW1vdW50CgljaGFpbi5FbWl0KCJSZXdhcmRDaGFuZ2VkIiwgInRhc2siLCB0YXNrLCAib2xkIiwgaXRvYShvbGQpLCAibmV3IiwgaXRvYShhbW91bnQpKQp9CgovLyBTd2VlcERlbm9tIHJlY292ZXJzIG91dC1vZi1iYW5kIGNvaW5zIHRvIHRoZSBzd2VlcGVyLiBGb3IgdGhlIHBvdAovLyBkZW5vbSB0aGUgcmVzZXJ2ZSBpcyBwb3QgKyBlYXJuZWQgYmFsYW5jZXMg4oCUIGJvdGggc3RydWN0dXJhbGx5Ci8vIHVucmVhY2hhYmxlLiBTd2VlcGVyIG9ubHkuCmZ1bmMgU3dlZXBEZW5vbShjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBzd2VlcGVyIHsKCQlwYW5pYygic3dlZXBlciBvbmx5IikKCX0KCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gcG90ICsgbGVkZ2VyLkxpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIHN3ZWVwZXIsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgc3dlZXBlci5TdHJpbmcoKSwgImNvaW5zIiwgaXRvYShzd2VwdCkrZGVub20pCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIGEgdHdvLXN0ZXAgYWRtaW4gaGFuZG92ZXIuCmZ1bmMgVHJhbnNmZXJBZG1pbihjdXIgcmVhbG0sIHN1Y2Nlc3NvciBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJdmFyIHplcm8gYWRkcmVzcwoJaWYgc3VjY2Vzc29yID09IHplcm8gewoJCXBhbmljKCJzdWNjZXNzb3IgbXVzdCBub3QgYmUgdGhlIHplcm8gYWRkcmVzcyIpCgl9CglwZW5kaW5nQWRtaW4gPSBzdWNjZXNzb3IKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJTdGFnZWQiLCAiZnJvbSIsIGFkbWluLlN0cmluZygpLCAidG8iLCBzdWNjZXNzb3IuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyB0aGUgaGFuZG92ZXI7IG9ubHkgdGhlIHN0YWdlZCBzdWNjZXNzb3IgbWF5LgovLyBUaGUgc3dlZXBlciByb2xlIG1vdmVzIHdpdGggdGhlIGFkbWluLgpmdW5jIEFjY2VwdEFkbWluKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJvbmx5IHRoZSBzdGFnZWQgc3VjY2Vzc29yIG1heSBhY2NlcHQiKQoJfQoJb2xkIDo9IGFkbWluCglhZG1pbiA9IGNhbGxlcgoJc3dlZXBlciA9IGNhbGxlcgoJdmFyIHplcm8gYWRkcmVzcwoJcGVuZGluZ0FkbWluID0gemVybwoJY2hhaW4uRW1pdCgiQWRtaW5UcmFuc2ZlcnJlZCIsICJmcm9tIiwgb2xkLlN0cmluZygpLCAidG8iLCBhZG1pbi5TdHJpbmcoKSkKfQoKLy8gLS0tIHZpZXdzIC0tLQoKZnVuYyBBZG1pbigpIGFkZHJlc3MgICAgICAgIHsgcmV0dXJuIGFkbWluIH0KZnVuYyBQZW5kaW5nQWRtaW4oKSBhZGRyZXNzIHsgcmV0dXJuIHBlbmRpbmdBZG1pbiB9CmZ1bmMgUG90KCkgaW50NjQgICAgICAgICAgICB7IHJldHVybiBwb3QgfQpmdW5jIFJld2FyZEZvcih0YXNrIHN0cmluZykgaW50NjQgewoJciwgb2sgOj0gcmV3YXJkc1t0YXNrXQoJaWYgIW9rIHsKCQlwYW5pYygidW5rbm93biB0YXNrOiAiICsgdGFzaykKCX0KCXJldHVybiByCn0KZnVuYyBCYWxhbmNlT2YoYSBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuQmFsYW5jZU9mKGEuU3RyaW5nKCkpIH0KZnVuYyBVc2Vyc1RvdGFsKCkgaW50NjQgICAgICAgICB7IHJldHVybiBsZWRnZXIuVXNlcnNUb3RhbCgpIH0KZnVuYyBQb2tlcygpIGludDY0ICAgICAgICAgICAgICB7IHJldHVybiBwb2tlcyB9CmZ1bmMgRnVuZGVkKCkgaW50NjQgICAgICAgICAgICAgeyByZXR1cm4gZnVuZGVkIH0KZnVuYyBBZGRyZXNzKCkgYWRkcmVzcyAgICAgICAgICB7IHJldHVybiBzZWxmIH0KZnVuYyBIZWxkKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CgovLyAtLS0gcmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoICE9ICIiIHsKCQlyZXR1cm4gInVua25vd24gcGFnZTsgdHJ5IHRoZSByZWFsbSByb290IgoJfQoJb3V0IDo9ICIjIHVwa2VlcFxuXG4iCglvdXQgKz0gIlJld2FyZHMgZm9yIHJ1bm5pbmcgdGhlIGVjb3N5c3RlbSdzIHBlcm1pc3Npb25sZXNzIHZhbHZlcy4gIiArCgkJIkZ1bmQgdGhlIHBvdDsgcG9rZSBhIHZhbHZlIHRocm91Z2ggdGhpcyByZWFsbTsgY2xhaW0gd2hhdCB5b3UgIiArCgkJImVhcm4uIEEgcG9rZSBzdWNjZWVkcyBvbmx5IHdoZW4gdGhlIGRvd25zdHJlYW0gcmVhbG0gYWNjZXB0cyAiICsKCQkidGhlIHZhbHZlIGNhbGwgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24uXG5cbiIKCW91dCArPSAiLSBwb3Q6ICIgKyBpdG9hKHBvdCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBlYXJuZWQsIHVuY2xhaW1lZDogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBsaWZldGltZSBwb2tlczogIiArIGl0b2EocG9rZXMpICsgIlxuIgoJb3V0ICs9ICItIGxpZmV0aW1lIGZ1bmRpbmc6ICIgKyBpdG9hKGZ1bmRlZCkgKyBEZW5vbSArICJcblxuIgoJb3V0ICs9ICIjIyByZXdhcmRzIHBlciBwb2tlXG5cbiIKCW91dCArPSAiLSBgIiArIFRhc2tTdWJFeHBpcmUgKyAiYCAoc3Vic2NyaXB0aW9ucy5FeHBpcmUpOiAiICsKCQlpdG9hKHJld2FyZHNbVGFza1N1YkV4cGlyZV0pICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gYCIgKyBUYXNrVGltZWxvY2tFeGVjdXRlICsgImAgKHRpbWVsb2NrX2d1YXJkaWFuLkV4ZWN1dGUpOiAiICsKCQlpdG9hKHJld2FyZHNbVGFza1RpbWVsb2NrRXhlY3V0ZV0pICsgRGVub20gKyAiXG4iCglvdXQgKz0gIlxuKGNhcCBwZXIgcG9rZTogIiArIGl0b2EoTWF4UmV3YXJkKSArIERlbm9tICsgIiwgY29tcGlsZS10aW1lKVxuIgoJcmV0dXJuIG91dAp9CgovLyAtLS0gaW50ZXJuYWxzIC0tLQoKZnVuYyBhc3NlcnROb1NlbmQoKSB7CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKZnVuYyBhc3NlcnRBZG1pbihjYWxsZXIgYWRkcmVzcykgewoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9Cn0KCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCWlmIGIgPiAwICYmIGEgPiBpbnQ2NChedWludDY0KDApPj4xKS1iIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhICsgYiwgdHJ1ZQp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9ChrGcgoPdXBrZWVwX3Rlc3QuZ25vErJycGFja2FnZSB1cGtlZXAKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoKCXN1YnMgImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zdWJzY3JpcHRpb25zIgoJZ3VhcmRpYW4gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS90aW1lbG9ja19ndWFyZGlhbiIKKQoKdmFyICgKCXRlc3RBZG1pbiA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidWthZG1pbiIpCglmdW5kZXIgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInVrZnVuZGVyIikKCXBva2VyICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidWtwb2tlciIpCgltYWxsb3J5ICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInVrbWFsbG9yeSIpCglwcm92aWRlciAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInVrcHJvdiIpCglzdWJiZXIgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInVrc3ViYmVyIikKCXRvd25lciAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygidWt0b3duZXIiKQopCgovLyBIYXJuZXNzIGZhY3RzLCBjYXJyaWVkIGZyb20gdGhlIHNpYmxpbmcgc3VpdGVzOiBpbml0IHJ1bnMgd2l0aCBhbgovLyBlbXB0eSBvcmlnaW4gKHJlYWwgZGVwbG95cyBjYXB0dXJlIHRoZSBzaWduZXIpOyByZWFsbSBnbG9iYWxzIHBlcnNpc3QKLy8gYWNyb3NzIHRlc3RzIHdoaWxlIHRoZSBiYW5rZXIgcmVzZXRzOyBTZXRSZWFsbSBiaW5kcyB0byB0aGUgQ0FMTElORwovLyBmcmFtZSBvbmx5LCBzbyBhcm1pbmcgaXMgaW5saW5lZCBhdCBldmVyeSBzaXRlOyBTa2lwSGVpZ2h0cyBhZHZhbmNlcwovLyB0aGUgY2xvY2sgNXMgcGVyIGhlaWdodCBBTkQgd2lwZXMgdGhlIG9yaWdpbiBjb250ZXh0LgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHRlc3RBZG1pbgoJc3dlZXBlciA9IHRlc3RBZG1pbgoJc2VsZiA9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvdXBrZWVwIikKfQoKZnVuYyB1Z25vdChuIGludDY0KSBjaGFpbi5Db2lucyB7IHJldHVybiBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKERlbm9tLCBuKSkgfQoKZnVuYyBjb2luc09mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihhLCBEZW5vbSkgfQoKLy8gY29uc2VydmVkIGFzc2VydHMgdGhlIHJlYWxtJ3MgbW9uZXRhcnkgaW52YXJpYW50OiBldmVyeXRoaW5nIHRoZSByZWFsbQovLyBob2xkcyBpcyBlaXRoZXIgdW5zcGVudCBwb3Qgb3IgZWFybmVkLWJ1dC11bmNsYWltZWQgYmFsYW5jZS4KZnVuYyBjb25zZXJ2ZWQodCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglpZiBIZWxkKCkgIT0gUG90KCkrVXNlcnNUb3RhbCgpIHsKCQl0LkZhdGFsZigiY29uc2VydmF0aW9uIHZpb2xhdGVkOiBIZWxkPSVkIHBvdD0lZCB1c2Vycz0lZCIsCgkJCUhlbGQoKSwgUG90KCksIFVzZXJzVG90YWwoKSkKCX0KfQoKLy8gc3luY0hlbGQgcmUtaXNzdWVzIHRoZSByZWFsbSdzIGV4cGVjdGVkIGhvbGRpbmdzLiBUaGUgaGFybmVzcyBiYW5rZXIKLy8gcmVzZXRzIGJldHdlZW4gdGVzdHMgd2hpbGUgcmVhbG0gZ2xvYmFscyAocG90LCBsZWRnZXIpIHBlcnNpc3QsIHNvCi8vIGVhY2ggbW9uZXktdG91Y2hpbmcgdGVzdCBzdGFydHMgYnkgbWFraW5nIHRoZSBiYW5rZXIgbWF0Y2ggdGhlIGJvb2tzLgpmdW5jIHN5bmNIZWxkKCkgewoJd2FudCA6PSBQb3QoKSArIFVzZXJzVG90YWwoKQoJaGF2ZSA6PSBjb2luc09mKEFkZHJlc3MoKSkKCWlmIHdhbnQgPiBoYXZlIHsKCQl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCh3YW50LWhhdmUpKQoJfQp9CgpmdW5jIGZ1bmRBcyhjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgYW1vdW50IGludDY0KSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyb20pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnJvbSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChhbW91bnQpKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoYW1vdW50KSkKCUZ1bmQoY3Jvc3MoY3VyKSkKfQoKZnVuYyBhZG1pblNldChjdXIgcmVhbG0sIHRhc2sgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRSZXdhcmQoY3Jvc3MoY3VyKSwgdGFzaywgYW1vdW50KQp9CgovLyBleHBpcmFibGVTdWIgZHJpdmVzIHRoZSBSRUFMIHN1YnNjcmlwdGlvbnMgcmVhbG0gdG8gYSBzdGF0ZSB3aGVyZSBvbmUKLy8gc3Vic2NyaXB0aW9uIGlzIHBhc3QgaXRzIGdyYWNlIHdpbmRvdywgYW5kIHJldHVybnMgaXRzIGlkLiBUaGlzIGlzCi8vIHRoZSBkb3duc3RyZWFtIGZpeHR1cmUgZm9yIHRoZSByZWFsbS10by1yZWFsbSB0ZXN0czogbm90aGluZyBpcwovLyBtb2NrZWQuCmZ1bmMgZXhwaXJhYmxlU3ViKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSBpbnQ2NCB7Cgl0LkhlbHBlcigpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3ZpZGVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3ZpZGVyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXBsYW5JRCA6PSBzdWJzLkNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgInVwa2VlcC1maXh0dXJlIiwgImQiLCAxLCAxMCwgMTAwMCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHN1YmJlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihzdWJiZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoc3Vicy5BZGRyZXNzKCksIHVnbm90KDEpKQoJc3ViSUQgOj0gc3Vicy5TdWJzY3JpYmUoY3Jvc3MoY3VyKSwgcGxhbklEKQoKCS8vIHBhaWRUaHJvdWdoID0gaCsxMDsgZXhwaXJhYmxlIGF0IHBhaWRUaHJvdWdoKzEwLiBTa2lwIHdlbGwgcGFzdC4KCXRlc3RpbmcuU2tpcEhlaWdodHMoMjUpCglyZXR1cm4gc3ViSUQKfQoKLy8gbWF0dXJlZEFjdGlvbiBkcml2ZXMgdGhlIFJFQUwgZ3VhcmRpYW4gcmVhbG0gdG8gYSBtYXR1cmVkIHRpbWVsb2NrZWQKLy8gYWN0aW9uIGFuZCByZXR1cm5zIGl0cyBpZC4KdmFyIHRhcmdldFNlcSBpbnQKCmZ1bmMgbWF0dXJlZEFjdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgc3RyaW5nIHsKCXQuSGVscGVyKCkKCXRhcmdldFNlcSsrCgluYW1lIDo9ICJ1a3RhcmdldCIgKyBzdHJpbmcocnVuZSgnYScrdGFyZ2V0U2VxJTI2KSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRvd25lcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglndWFyZGlhbi5SZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCBuYW1lLCBndWFyZGlhbi5NaW5EZWxheUZsb29yLCAiIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRvd25lcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0b3duZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJaWQgOj0gZ3VhcmRpYW4uU2NoZWR1bGUoY3Jvc3MoY3VyKSwgbmFtZSwgInBva2UtZml4dHVyZSIsIGd1YXJkaWFuLk1pbkRlbGF5Rmxvb3IpCgoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxMykgLy8gNjVzIGF0IDVzL2hlaWdodCA+PSB0aGUgNjBzIGZsb29yCglyZXR1cm4gaWQKfQoKZnVuYyBUZXN0SW5pdGlhbFN0YXRlKHQgKnRlc3RpbmcuVCkgewoJaWYgQWRtaW4oKSAhPSB0ZXN0QWRtaW4gfHwgUG90KCkgIT0gMCB8fCBQb2tlcygpICE9IDAgfHwgRnVuZGVkKCkgIT0gMCB7CgkJdC5GYXRhbCgidW5leHBlY3RlZCBpbml0aWFsIHN0YXRlIikKCX0KCWlmIFJld2FyZEZvcihUYXNrU3ViRXhwaXJlKSAhPSAwIHx8IFJld2FyZEZvcihUYXNrVGltZWxvY2tFeGVjdXRlKSAhPSAwIHsKCQl0LkZhdGFsKCJyZXdhcmRzIG11c3QgZGVmYXVsdCB0byAwIikKCX0KCWNvbnNlcnZlZCh0KQp9CgpmdW5jIFRlc3RGdW5kQW5kUmV3YXJkQ29uZmlnKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglmdW5kQXMoY3VyLCBmdW5kZXIsIDEwMDAwMCkKCWlmIFBvdCgpICE9IDEwMDAwMCB8fCBGdW5kZWQoKSAhPSAxMDAwMDAgewoJCXQuRmF0YWxmKCJwb3Q9JWQgZnVuZGVkPSVkIiwgUG90KCksIEZ1bmRlZCgpKQoJfQoJY29uc2VydmVkKHQpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvbmx5IiwgZnVuYygpIHsKCQlTZXRSZXdhcmQoY3Jvc3MoY3VyKSwgVGFza1N1YkV4cGlyZSwgMTAwKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJyZXdhcmQgbXVzdCBiZSBpbiIsIGZ1bmMoKSB7CgkJU2V0UmV3YXJkKGNyb3NzKGN1ciksIFRhc2tTdWJFeHBpcmUsIE1heFJld2FyZCsxKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidW5rbm93biB0YXNrIiwgZnVuYygpIHsKCQlTZXRSZXdhcmQoY3Jvc3MoY3VyKSwgIm5vc3VjaCIsIDEpCgl9KQoKCWFkbWluU2V0KGN1ciwgVGFza1N1YkV4cGlyZSwgNTAwMCkKCWFkbWluU2V0KGN1ciwgVGFza1RpbWVsb2NrRXhlY3V0ZSwgNzAwMCkKCWlmIFJld2FyZEZvcihUYXNrU3ViRXhwaXJlKSAhPSA1MDAwIHx8IFJld2FyZEZvcihUYXNrVGltZWxvY2tFeGVjdXRlKSAhPSA3MDAwIHsKCQl0LkZhdGFsKCJyZXdhcmRzIG5vdCBzZXQiKQoJfQp9CgovLyBUaGUgcmVhbG0tdG8tcmVhbG0gaGFwcHkgcGF0aDogcG9rZSB0aGUgUkVBTCBzdWJzY3JpcHRpb25zIHJlYWxtLgpmdW5jIFRlc3RQb2tlRXhwaXJlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzeW5jSGVsZCgpCglzdWJJRCA6PSBleHBpcmFibGVTdWIoY3VyLCB0KQoKCS8vIERvd25zdHJlYW0gc3RhdGUgYmVmb3JlOiBzdGlsbCBBY3RpdmUuCglfLCBfLCBfLCBfLCBfLCBfLCBzdGF0dXMgOj0gc3Vicy5TdWJJbmZvKHN1YklEKQoJaWYgc3RhdHVzICE9ICJhY3RpdmUiIHsKCQl0LkZhdGFsZigiZml4dHVyZSBzdGF0dXMgJXEiLCBzdGF0dXMpCgl9CgoJcG90QmVmb3JlLCBiYWxCZWZvcmUgOj0gUG90KCksIEJhbGFuY2VPZihwb2tlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocG9rZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocG9rZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJUG9rZUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCgkvLyBEb3duc3RyZWFtIHN0YXRlIGNoYW5nZWQgYnkgT1VSIHJlYWxtJ3MgY3Jvc3NpbmcgY2FsbC4uLgoJXywgXywgXywgXywgXywgXywgc3RhdHVzID0gc3Vicy5TdWJJbmZvKHN1YklEKQoJaWYgc3RhdHVzICE9ICJleHBpcmVkIiB7CgkJdC5GYXRhbGYoImRvd25zdHJlYW0gbm90IGV4cGlyZWQ6ICVxIiwgc3RhdHVzKQoJfQoJLy8gLi4uYW5kIHRoZSByZXdhcmQgbW92ZWQgcG90IC0+IGNhbGxlciBiYWxhbmNlIGF0b21pY2FsbHkuCglpZiBQb3QoKSAhPSBwb3RCZWZvcmUtNTAwMCB8fCBCYWxhbmNlT2YocG9rZXIpICE9IGJhbEJlZm9yZSs1MDAwIHsKCQl0LkZhdGFsZigicmV3YXJkIGFjY291bnRpbmcgd3Jvbmc6IHBvdCAlZC0+JWQgYmFsICVkLT4lZCIsCgkJCXBvdEJlZm9yZSwgUG90KCksIGJhbEJlZm9yZSwgQmFsYW5jZU9mKHBva2VyKSkKCX0KCWlmIFBva2VzKCkgIT0gMSB7CgkJdC5GYXRhbGYoInBva2VzPSVkIiwgUG9rZXMoKSkKCX0KCWNvbnNlcnZlZCh0KQp9CgovLyBSZXBsYXk6IHRoZSBkb3duc3RyZWFtIHJlYWxtIGlzIHRoZSByZXBsYXkgZ3VhcmQ7IGEgc2Vjb25kIHBva2Ugb24gdGhlCi8vIHNhbWUgc3Vic2NyaXB0aW9uIGFib3J0cyBUSEVSRSBhbmQgbm8gcmV3YXJkIGlzIHBhaWQgSEVSRS4KZnVuYyBUZXN0UG9rZUV4cGlyZVJlcGxheShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJcG90QmVmb3JlLCBiYWxCZWZvcmUgOj0gUG90KCksIEJhbGFuY2VPZihtYWxsb3J5KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJzdWJzY3JpcHRpb24gaXMgZXhwaXJlZCIsIGZ1bmMoKSB7CgkJUG9rZUV4cGlyZShjcm9zcyhjdXIpLCAwKSAvLyB0aGUgc3ViIGV4cGlyZWQgaW4gVGVzdFBva2VFeHBpcmUKCX0pCglpZiBQb3QoKSAhPSBwb3RCZWZvcmUgfHwgQmFsYW5jZU9mKG1hbGxvcnkpICE9IGJhbEJlZm9yZSB8fCBQb2tlcygpICE9IDEgewoJCXQuRmF0YWwoImFib3J0ZWQgcG9rZSBtdXRhdGVkIHJld2FyZCBzdGF0ZSIpCgl9Cgljb25zZXJ2ZWQodCkKfQoKLy8gQSBwcmVtYXR1cmUgcG9rZSBhYm9ydHMgZG93bnN0cmVhbSAoIm5vdCBleHBpcmFibGUiKSBhbmQgcGF5cyBub3RoaW5nLgpmdW5jIFRlc3RQb2tlRXhwaXJlUHJlbWF0dXJlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzeW5jSGVsZCgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3ZpZGVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3ZpZGVyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXBsYW5JRCA6PSBzdWJzLkNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgImZyZXNoIiwgImQiLCAxLCA1MDAwLCAxMDAwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShzdWJiZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoc3ViYmVyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEpKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKHN1YnMuQWRkcmVzcygpLCB1Z25vdCgxKSkKCWZyZXNoSUQgOj0gc3Vicy5TdWJzY3JpYmUoY3Jvc3MoY3VyKSwgcGxhbklEKQoKCXBvdEJlZm9yZSA6PSBQb3QoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwb2tlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdCBleHBpcmFibGUiLCBmdW5jKCkgewoJCVBva2VFeHBpcmUoY3Jvc3MoY3VyKSwgZnJlc2hJRCkKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInVua25vd24gc3Vic2NyaXB0aW9uIGlkIiwgZnVuYygpIHsKCQlQb2tlRXhwaXJlKGNyb3NzKGN1ciksIDk5OTk5KQoJfSkKCWlmIFBvdCgpICE9IHBvdEJlZm9yZSB7CgkJdC5GYXRhbCgiZmFpbGVkIHBva2VzIHRvdWNoZWQgdGhlIHBvdCIpCgl9Cgljb25zZXJ2ZWQodCkKfQoKLy8gVGhlIHNlY29uZCByZWFsbS10by1yZWFsbSBpbnRlZ3JhdGlvbjogdGhlIFJFQUwgZ3VhcmRpYW4gcmVhbG0uCmZ1bmMgVGVzdFBva2VFeGVjdXRlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzeW5jSGVsZCgpCglpZCA6PSBtYXR1cmVkQWN0aW9uKGN1ciwgdCkKCXBvdEJlZm9yZSwgYmFsQmVmb3JlIDo9IFBvdCgpLCBCYWxhbmNlT2YocG9rZXIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwb2tlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglQb2tlRXhlY3V0ZShjcm9zcyhjdXIpLCBpZCkKCglpZiBQb3QoKSAhPSBwb3RCZWZvcmUtNzAwMCB8fCBCYWxhbmNlT2YocG9rZXIpICE9IGJhbEJlZm9yZSs3MDAwIHsKCQl0LkZhdGFsKCJ0aW1lbG9jayByZXdhcmQgYWNjb3VudGluZyB3cm9uZyIpCgl9CgkvLyBSZXBsYXkgcmVmdXNlZCBkb3duc3RyZWFtLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJhbHJlYWR5IGV4ZWN1dGVkIiwgZnVuYygpIHsKCQlQb2tlRXhlY3V0ZShjcm9zcyhjdXIpLCBpZCkKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImFjdGlvbiBub3QgZm91bmQiLCBmdW5jKCkgewoJCVBva2VFeGVjdXRlKGNyb3NzKGN1ciksICJ0bC1ub3N1Y2giKQoJfSkKCS8vIFByZW1hdHVyZTogc2NoZWR1bGUgYSBuZXcgb25lLCBwb2tlIGJlZm9yZSBtYXR1cml0eS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRvd25lcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglndWFyZGlhbi5SZWdpc3RlclRhcmdldChjcm9zcyhjdXIpLCAidWtlYXJseSIsIGd1YXJkaWFuLk1pbkRlbGF5Rmxvb3IsICIiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0b3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodG93bmVyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCWVhcmx5IDo9IGd1YXJkaWFuLlNjaGVkdWxlKGNyb3NzKGN1ciksICJ1a2Vhcmx5IiwgIngiLCBndWFyZGlhbi5NaW5EZWxheUZsb29yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwb2tlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRvbyBlYXJseSIsIGZ1bmMoKSB7CgkJUG9rZUV4ZWN1dGUoY3Jvc3MoY3VyKSwgZWFybHkpCgl9KQoJY29uc2VydmVkKHQpCn0KCi8vIFBvdCBleGhhdXN0aW9uIHJlZnVzZXMgQkVGT1JFIHRoZSBkb3duc3RyZWFtIGNhbGw6IG5vIHZhbHZlIGZpcmVzCi8vIHVucmV3YXJkZWQgdGhyb3VnaCB0aGlzIHJlYWxtLiBFbnRlcmluZyBoZXJlIHRoZSBwb3QgaXMgZGV0ZXJtaW5pc3RpYzoKLy8gMTAwMDAwIGZ1bmRlZCBtaW51cyB0aGUgNTAwMCBhbmQgNzAwMCBhd2FyZGVkIGFib3ZlID0gODgwMDAsIHNvIGZvdXIKLy8gTWF4UmV3YXJkIHBva2VzIGxlYXZlIDgwMDAgPCBNYXhSZXdhcmQgYW5kIHRoZSBuZXh0IG11c3QgcmVmdXNlLgpmdW5jIFRlc3RQb3RFeGhhdXN0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzeW5jSGVsZCgpCglhZG1pblNldChjdXIsIFRhc2tTdWJFeHBpcmUsIE1heFJld2FyZCkKCgkvLyBEcmFpbiBieSBSRUFMIHBva2VzIHVudGlsIHRoZSBwb3Qgbm8gbG9uZ2VyIGNvdmVycyB0aGUgcmV3YXJkLgoJZm9yIGkgOj0gMDsgUG90KCkgPj0gTWF4UmV3YXJkOyBpKysgewoJCWlmIGkgPj0gMTAgewoJCQl0LkZhdGFsZigiZml4dHVyZSBhcml0aG1ldGljIGJyb2tlbjogcG90PSVkIGFmdGVyICVkIHBva2VzIiwgUG90KCksIGkpCgkJfQoJCWlkIDo9IGV4cGlyYWJsZVN1YihjdXIsIHQpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocG9rZXIpCgkJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCQlQb2tlRXhwaXJlKGNyb3NzKGN1ciksIGlkKQoJfQoKCXNob3J0IDo9IGV4cGlyYWJsZVN1YihjdXIsIHQpCglwb3RCZWZvcmUgOj0gUG90KCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocG9rZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocG9rZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJyZXdhcmQgcG90IGNhbm5vdCBjb3ZlciIsIGZ1bmMoKSB7CgkJUG9rZUV4cGlyZShjcm9zcyhjdXIpLCBzaG9ydCkKCX0pCgkvLyBEb3duc3RyZWFtIE1VU1QgYmUgdW50b3VjaGVkIGJ5IHRoZSByZWZ1c2VkIHBva2UuCglfLCBfLCBfLCBfLCBfLCBfLCBzdGF0dXMgOj0gc3Vicy5TdWJJbmZvKHNob3J0KQoJaWYgc3RhdHVzICE9ICJhY3RpdmUiIHsKCQl0LkZhdGFsKCJyZWZ1c2VkIHBva2UgcmVhY2hlZCB0aGUgZG93bnN0cmVhbSByZWFsbSIpCgl9CglpZiBQb3QoKSAhPSBwb3RCZWZvcmUgewoJCXQuRmF0YWwoInJlZnVzZWQgcG9rZSB0b3VjaGVkIHRoZSBwb3QiKQoJfQoJY29uc2VydmVkKHQpCglhZG1pblNldChjdXIsIFRhc2tTdWJFeHBpcmUsIDUwMDApIC8vIHJlc3RvcmUgZm9yIHRoZSBsYXRlciB0ZXN0cwp9CgovLyBUaGUgcmVmdXNhbCBib3VuZGFyeSwgZGV0ZXJtaW5pc3RpYzogdW5rbm93biB0YXNrLCB6ZXJvIHJld2FyZCwgYW5kCi8vIHBvdC1zaG9ydCBhbGwgcmVmdXNlIGJlZm9yZSBhbnkgZG93bnN0cmVhbSBlZmZlY3QuCmZ1bmMgVGVzdFBva2VSZWZ1c2FscyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYWRtaW5TZXQoY3VyLCBUYXNrU3ViRXhwaXJlLCAwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwb2tlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIHJld2FyZCBjb25maWd1cmVkIiwgZnVuYygpIHsKCQlQb2tlRXhwaXJlKGNyb3NzKGN1ciksIDApCgl9KQoJYWRtaW5TZXQoY3VyLCBUYXNrU3ViRXhwaXJlLCA1MDAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocG9rZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocG9rZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoNSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgZnVuYygpIHsKCQlQb2tlRXhwaXJlKGNyb3NzKGN1ciksIDApCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwb2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwb2tlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg1KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiLCBmdW5jKCkgewoJCVBva2VFeGVjdXRlKGNyb3NzKGN1ciksICJ4IikKCX0pCn0KCmZ1bmMgVGVzdENsYWltcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc3luY0hlbGQoKQoJZWFybmVkIDo9IEJhbGFuY2VPZihwb2tlcikKCWlmIGVhcm5lZCA9PSAwIHsKCQl0LkZhdGFsKCJmaXh0dXJlOiBwb2tlciBzaG91bGQgaGF2ZSBlYXJuaW5ncyIpCgl9CgliZWZvcmUgOj0gY29pbnNPZihwb2tlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocG9rZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocG9rZXIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQ2xhaW1BbGwoY3Jvc3MoY3VyKSkKCWlmIGNvaW5zT2YocG9rZXIpLWJlZm9yZSAhPSBlYXJuZWQgfHwgQmFsYW5jZU9mKHBva2VyKSAhPSAwIHsKCQl0LkZhdGFsKCJjbGFpbSBkaWQgbm90IG1vdmUgdGhlIGVhcm5lZCBiYWxhbmNlIikKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm90aGluZyB0byBjbGFpbSIsIGZ1bmMoKSB7CgkJQ2xhaW1BbGwoY3Jvc3MoY3VyKSkKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImluc3VmZmljaWVudCBiYWxhbmNlIiwgZnVuYygpIHsKCQlDbGFpbShjcm9zcyhjdXIpLCAxKQoJfSkKCWNvbnNlcnZlZCh0KQp9CgpmdW5jIFRlc3RTd2VlcFJlc2VydmUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXN5bmNIZWxkKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIHN1cnBsdXMgdG8gc3dlZXAiLCBmdW5jKCkgewoJCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCgl9KQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoNzcpKQoJcmVzZXJ2ZUJlZm9yZSA6PSBQb3QoKSArIFVzZXJzVG90YWwoKQoJZ290IDo9IGNvaW5zT2YodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCglpZiBjb2luc09mKHRlc3RBZG1pbiktZ290ICE9IDc3IHsKCQl0LkZhdGFsKCJzd2VlcCBhbW91bnQgd3JvbmciKQoJfQoJaWYgUG90KCkrVXNlcnNUb3RhbCgpICE9IHJlc2VydmVCZWZvcmUgewoJCXQuRmF0YWwoInN3ZWVwIHRvdWNoZWQgdGhlIHJlc2VydmUiKQoJfQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzd2VlcGVyIG9ubHkiLCBmdW5jKCkgewoJCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCgl9KQoJY29uc2VydmVkKHQpCn0KCmZ1bmMgVGVzdEFkbWluSGFuZG92ZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIGZ1bmRlcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgc3RhZ2VkIHN1Y2Nlc3NvciBtYXkgYWNjZXB0IiwgZnVuYygpIHsKCQlBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZ1bmRlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJaWYgQWRtaW4oKSAhPSBmdW5kZXIgewoJCXQuRmF0YWwoImF1dGhvcml0eSBkaWQgbm90IG1vdmUiKQoJfQoJLy8gRm9ybWVyIGFkbWluIGxvY2tlZCBvdXQ7IHN3ZWVwZXIgbW92ZWQgd2l0aCBhZG1pbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9ubHkiLCBmdW5jKCkgewoJCVNldFJld2FyZChjcm9zcyhjdXIpLCBUYXNrU3ViRXhwaXJlLCAxKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3dlZXBlciBvbmx5IiwgZnVuYygpIHsKCQlTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKQoJfSkKCS8vIEhhbmQgYmFjay4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnVuZGVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZ1bmRlcikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglBY2NlcHRBZG1pbihjcm9zcyhjdXIpKQp9CgpmdW5jIFRlc3RSZW5kZXIodCAqdGVzdGluZy5UKSB7CglvdXQgOj0gUmVuZGVyKCIiKQoJaWYgIXN0cmluZ3MuQ29udGFpbnMob3V0LCAic3ViX2V4cGlyZSIpIHx8ICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgInRpbWVsb2NrX2V4ZWN1dGUiKSB7CgkJdC5GYXRhbCgicmVuZGVyIG1pc3NpbmcgdGFzayBsaW5lcyIpCgl9CglpZiBSZW5kZXIoIngiKSA9PSBSZW5kZXIoIiIpIHsKCQl0LkZhdGFsKCJ1bmtub3duIHBhdGggZmVsbCB0aHJvdWdoIikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQFaM+jPTUdEHFZUbL/DUK/EIsMNrEdsaURNA0fAPo9fJdG8wAb7D8bl123zR4vlwBGHnNaSMpHgxkWyzAG6XAY8aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data