Transaction executed successfully

Transaction Details

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

Transaction hash
FA1DAC05FE988260AE6B332C71FF659916E549822C5853C341D318B119726331

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
40,000,000
Requested gas limit
GAS USED
32,472,427
Gas consumed
FEE
50000ugnot
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

CqjYAQoML3ZtLm1fYWRkcGtnEpbYAQooZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NBLo1wEKCWRhdGFzdG9yZRI9Z25vLmxhbmQvcC9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L2RhdGFzdG9yZRqZHgoJUkVBRE1FLm1kEoseIyBEYXRhc3RvcmUgUGFja2FnZQoKUGFja2FnZSBwcm92aWRlcyBzdXBwb3J0IHRvIHN0b3JlIG11bHRpcGxlIGNvbGxlY3Rpb25zIG9mIHJlY29yZHMuCgpJdCBzdXBwb3J0cyB0aGUgZGVmaW5pdGlvbiBvZiBtdWx0aXBsZSBzdG9yYWdlcywgd2hlcmUgZWFjaCBvbmUgaXMgYSBjb2xsZWN0aW9uCm9mIHJlY29yZHMuIFJlY29yZHMgY2FuIGhhdmUgYW55IG51bWJlciBvZiB1c2VyIGRlZmluZWQgZmllbGRzIHdoaWNoIGFyZSBhZGRlZApkeW5hbWljYWxseSB3aGVuIHZhbHVlcyBhcmUgc2V0IG9uIGEgcmVjb3JkLiBUaGVzZSBmaWVsZHMgY2FuIGFsc28gYmUgcmVuYW1lZApvciByZW1vdmVkLgoKU3RvcmFnZXMgaGF2ZSBzdXBwb3J0IGZvciBzaW1wbGUgc2NoZW1hcyB0aGF0IGFsbG93IHVzZXJzIHRvIHByZS1kZWZpbmUgZmllbGRzCndoaWNoIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBkZWZhdWx0IHZhbHVlIGFsc28gZGVmaW5lZC4gRGVmYXVsdCB2YWx1ZXMgYXJlCmFzc2lnbmVkIHRvIG5ldyByZWNvcmRzIG9uIGNyZWF0aW9uLgoKVXNlciBkZWZpbmVkIHNjaGVtYXMgY2FuIG9wdGlvbmFsbHkgYmUgc3RyaWN0LCB3aGljaCBtZWFucyB0aGF0IHJlY29yZHMgZnJvbSBhCnN0b3JhZ2UgdXNpbmcgdGhlIHNjaGVtYSBjYW4gb25seSBhc3NpZ24gdmFsdWVzIHRvIHRoZSBwcmUtZGVmaW5lZCBzZXQgb2YgZmllbGRzLgpJbiB3aGljaCBjYXNlLCBhc3NpZ25pbmcgYSB2YWx1ZSB0byBhbiB1bmtub3duIGZpZWxkIHJlc3VsdHMgaW4gYW4gZXJyb3IuCgpQYWNrYWdlIGFsc28gc3VwcG9ydHMgdGhlIGRlZmluaXRpb24gb2YgY3VzdG9tIHJlY29yZCBpbmRleGVzLiBJbmRleGVzIGFyZSB1c2VkCmJ5IHN0b3JhZ2VzIHRvIHNlYXJjaCBhbmQgaXRlcmF0ZSByZWNvcmRzLiBUaGUgZGVmYXVsdCBpbmRleCBpcyB0aGUgSUQgaW5kZXggYnV0CmN1c3RvbSBzaW5nbGUgYW5kIG11bHRpIHZhbHVlIGluZGV4ZXMgY2FuIGJlIGRlZmluZWQuCgo+IFshV0FSTklOR10KPiBVc2luZyB0aGlzIHBhY2thZ2UgdG8gc3RvcmUgeW91ciByZWFsbSBkYXRhIG11c3QgYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQuCj4gVGhlIGZhY3QgdGhhdCByZWNvcmQgZmllbGRzIGFyZSBub3Qgc3RyaWN0bHkgdHlwZWQgYW5kIGNhbiBiZSByZW5hbWVkIG9yIHJlbW92ZWQKPiBjb3VsZCBsZWFkIHRvIGlzc3VlcyBpZiBub3QgY2FyZWZ1bCB3aGVuIGNvZGluZyB5b3VyIHJlYWxtKHMpLiBTbyBpdCdzIHJlY29tbWVuZGVkCj4gdGhhdCB5b3UgY29uc2lkZXIgb3RoZXIgYWx0ZXJuYXRpdmVzIGZpcnN0LCBsaWtlIGFsdGVybmF0aXZlIHBhdHRlcm5zIG9yIHNvbHV0aW9ucwo+IHByb3ZpZGVkIGJ5IHRoZSBibG9ja2NoYWluIHRvIGRlYWwgd2l0aCBkYXRhLCB0eXBlcyBhbmQgZGF0YSBtaWdyYXRpb24gZm9yIGV4YW1wbGUuCgpSZXBvc2l0b3J5IGNhbiBiZSBmb3VuZCBhdCBbamVyb25pbW9hbGJpL2dub21lXShodHRwczovL2dpdGh1Yi5jb20vamVyb25pbW9hbGJpL2dub21lKSwKYXMgcGFydCBvZiBgamVyb25pbW9hbGJpYCdzIEdubyBzbWFydCBjb250cmFjdHMgbW9ub3JlcG8uCgojIyBVc2FnZQoKW2VtYmVkbWRdOiMgKGZpbGV0ZXN0cy9yZWFkbWVfZmlsZXRlc3QuZ25vIGdvKQpgYGBnbwpwYWNrYWdlIG1haW4KCmltcG9ydCAiZ25vLmxhbmQvcC9nMTdraHFwdWtlZXM0MjM3ZHRuM2FzdHphcG1wNDYydmpoc3o2c3Q0L2RhdGFzdG9yZSIKCmZ1bmMgbWFpbigpIHsKCWRiIDo9IGRhdGFzdG9yZS5OZXdEYXRhc3RvcmUoKQoKCS8vIERlZmluZSBhIHVuaXF1ZSBjYXNlIGluc2Vuc2l0aXZlIGluZGV4IGZvciB1c2VyIGVtYWlscwoJZW1haWxJZHggOj0gZGF0YXN0b3JlLk5ld0luZGV4KCJlbWFpbCIsIGZ1bmMociBkYXRhc3RvcmUuUmVjb3JkKSBzdHJpbmcgewoJCXJldHVybiByLk11c3RHZXQoImVtYWlsIikuKHN0cmluZykKCX0pLlVuaXF1ZSgpLkNhc2VJbnNlbnNpdGl2ZSgpCgoJLy8gQ3JlYXRlIGEgbmV3IHN0b3JhZ2UgZm9yIHVzZXIgcmVjb3JkcwoJdXNlcnMgOj0gZGIuQ3JlYXRlU3RvcmFnZSgidXNlcnMiLCBkYXRhc3RvcmUuV2l0aEluZGV4KGVtYWlsSWR4KSkKCgkvLyBBZGQgYSB1c2VyIHdpdGggYSBzaW5nbGUgImVtYWlsIiBmaWVsZAoJdXNlciA6PSB1c2Vycy5OZXdSZWNvcmQoKQoJdXNlci5TZXQoImVtYWlsIiwgImZvb0BiYXIub3JnIikKCgkvLyBTYXZlIHRvIGFzc2lnbiB0aGUgdXNlciBJRCBhbmQgdXBkYXRlIGluZGV4ZXMKCXVzZXIuU2F2ZSgpCgoJLy8gRmluZCB1c2VyIGJ5IGVtYWlsIHVzaW5nIHRoZSBjdXN0b20gaW5kZXgKCXVzZXIsIF8gPSB1c2Vycy5HZXQoZW1haWxJZHguTmFtZSgpLCAiRk9PQGJhci5vcmciKQoJcHJpbnRsbigiRm91bmQgYnkgZW1haWw6IiwgdXNlci5NdXN0R2V0KCJlbWFpbCIpKQoKCS8vIEZpbmQgdXNlciBieSBJRAoJdXNlciwgXyA9IHVzZXJzLkdldEJ5SUQodXNlci5JRCgpKQoJcHJpbnRsbigiRm91bmQgYnkgSUQ6IiwgdXNlci5JRCgpKQoKCS8vIERlbGV0ZSB0aGUgdXNlciBmcm9tIHRoZSBzdG9yYWdlIGFuZCB1cGRhdGUgaW5kZXhlcwoJdXNlcnMuRGVsZXRlKHVzZXIuSUQoKSkKCXByaW50bG4oIlVzZXJzOiIsIHVzZXJzLlNpemUoKSkKfQoKLy8gT3V0cHV0OgovLyBGb3VuZCBieSBlbWFpbDogZm9vQGJhci5vcmcKLy8gRm91bmQgYnkgSUQ6IDEKLy8gVXNlcnM6IDAKYGBgCgojIyMgUXVlcnlpbmcKCltlbWJlZG1kXTojIChmaWxldGVzdHMvcmVhZG1lX3F1ZXJ5X2ZpbGV0ZXN0LmdubyBnbykKYGBgZ28KcGFja2FnZSBtYWluCgppbXBvcnQgImduby5sYW5kL3AvZzE3a2hxcHVrZWVzNDIzN2R0bjNhc3R6YXBtcDQ2MnZqaHN6NnN0NC9kYXRhc3RvcmUiCgpmdW5jIG1haW4oKSB7CglkYiA6PSBkYXRhc3RvcmUuTmV3RGF0YXN0b3JlKCkKCgkvLyBEZWZpbmUgYSBtdWx0aSB2YWx1ZSBpbmRleCB0byBzZWFyY2ggcG9zdHMgYnkgdGFnCgl0YWdzSWR4IDo9IGRhdGFzdG9yZS5OZXdNdWx0aVZhbHVlSW5kZXgoInRhZ3MiLCBmdW5jKHIgZGF0YXN0b3JlLlJlY29yZCkgW11zdHJpbmcgewoJCXJldHVybiByLk11c3RHZXQoInRhZ3MiKS4oW11zdHJpbmcpCgl9KQoKCXBvc3RzIDo9IGRiLkNyZWF0ZVN0b3JhZ2UoInBvc3RzIiwgZGF0YXN0b3JlLldpdGhJbmRleCh0YWdzSWR4KSkKCWZvciBfLCB0aXRsZSA6PSByYW5nZSBbXXN0cmluZ3siUG9zdCAxIiwgIlBvc3QgMiIsICJQb3N0IDMifSB7CgkJcG9zdCA6PSBwb3N0cy5OZXdSZWNvcmQoKQoJCXBvc3QuU2V0KCJ0aXRsZSIsIHRpdGxlKQoJCXBvc3QuU2V0KCJ0YWdzIiwgW11zdHJpbmd7ImdubyIsIHRpdGxlfSkKCQlwb3N0LlNhdmUoKQoJfQoKCS8vIEdldCB0d28gcmVjb3JkcyBzdGFydGluZyBmcm9tIHRoZSBzZWNvbmQgb25lCglyZWNvcmRzZXQsIGVyciA6PSBwb3N0cy5RdWVyeShkYXRhc3RvcmUuV2l0aE9mZnNldCgxKSwgZGF0YXN0b3JlLldpdGhTaXplKDIpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJlY29yZHNldC5JdGVyYXRlKGZ1bmMociBkYXRhc3RvcmUuUmVjb3JkKSBib29sIHsKCQlwcmludGxuKCJQb3N0OiIsIHIuTXVzdEdldCgidGl0bGUiKSkKCQlyZXR1cm4gZmFsc2UgLy8gQ29udGludWUgaXRlcmF0aW5nCgl9KQoKCS8vIEdldCBhbGwgdGhlIHJlY29yZHMgdGhhdCBoYXZlIHRoZSAiZ25vIiB0YWcgdXNpbmcgdGhlIGN1c3RvbSBpbmRleAoJcmVjb3Jkc2V0ID0gcG9zdHMuTXVzdFF1ZXJ5KGRhdGFzdG9yZS5Vc2VJbmRleCgidGFncyIsICJnbm8iKSkKCXByaW50bG4oIlRhZ2dlZCBwb3N0czoiLCByZWNvcmRzZXQuU2l6ZSgpKQp9CgovLyBPdXRwdXQ6Ci8vIFBvc3Q6IFBvc3QgMgovLyBQb3N0OiBQb3N0IDMKLy8gVGFnZ2VkIHBvc3RzOiAzCmBgYAoapwwKDWRhdGFzdG9yZS5nbm8SlQwvLyBQYWNrYWdlIGRhdGFzdG9yZSBwcm92aWRlcyBzdXBwb3J0IHRvIHN0b3JlIG11bHRpcGxlIGNvbGxlY3Rpb25zIG9mIHJlY29yZHMuCnBhY2thZ2UgZGF0YXN0b3JlCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCi8vIEVyclN0b3JhZ2VFeGlzdHMgaW5kaWNhdGVzIHRoYXQgYSBzdG9yYWdlIGV4aXN0cyB3aXRoIHRoZSBzYW1lIG5hbWUuCnZhciBFcnJTdG9yYWdlRXhpc3RzID0gZXJyb3JzLk5ldygiYSBzdG9yYWdlIHdpdGggdGhlIHNhbWUgbmFtZSBleGlzdHMiKQoKLy8gTmV3RGF0YXN0b3JlIGNyZWF0ZXMgYSBuZXcgc3RvcmUuCmZ1bmMgTmV3RGF0YXN0b3JlKCkgKkRhdGFzdG9yZSB7CglyZXR1cm4gJkRhdGFzdG9yZXsKCQlzdG9yYWdlczogYnB0cmVlLk5ld0JQVHJlZTMyKCksCgl9Cn0KCi8vIERhdGFzdG9yZSBpcyBhIHN0b3JlIHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgbmFtZWQgc3RvcmFnZXMuCi8vIEEgc3RvcmFnZSBpcyBhIGNvbGxlY3Rpb24gb2YgcmVjb3Jkcy4KLy8KLy8gRXhhbXBsZSB1c2FnZToKLy8KLy8JLy8gQ3JlYXRlIGFuIGVtcHR5IHN0b3JhZ2UgdG8gc3RvcmUgdXNlciByZWNvcmRzCi8vCXZhciBkYiBEYXRhc3RvcmUKLy8Jc3RvcmFnZSA6PSBkYi5DcmVhdGVTdG9yYWdlKCJ1c2VycyIpCi8vCi8vCS8vIEdldCBhIHN0b3JhZ2UgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIGJlZm9yZQovLwlzdG9yYWdlID0gZGIuR2V0U3RvcmFnZSgicHJvZmlsZXMiKQp0eXBlIERhdGFzdG9yZSBzdHJ1Y3QgewoJc3RvcmFnZXMgKmJwdHJlZS5CUFRyZWUgLy8gc3RyaW5nKG5hbWUpIC0+ICpTdG9yYWdlCn0KCi8vIENyZWF0ZVN0b3JhZ2UgY3JlYXRlcyBhIG5ldyBuYW1lZCBzdG9yYWdlIHdpdGhpbiB0aGUgZGF0YSBzdG9yZS4KZnVuYyAoZHMgKkRhdGFzdG9yZSkgQ3JlYXRlU3RvcmFnZShuYW1lIHN0cmluZywgb3B0aW9ucyAuLi5TdG9yYWdlT3B0aW9uKSAqU3RvcmFnZSB7CglpZiBkcy5zdG9yYWdlcy5IYXMobmFtZSkgewoJCXJldHVybiBuaWwKCX0KCglzIDo9IE5ld1N0b3JhZ2UobmFtZSwgb3B0aW9ucy4uLikKCWRzLnN0b3JhZ2VzLlNldChuYW1lLCAmcykKCXJldHVybiAmcwp9CgovLyBIYXNTdG9yYWdlIGNoZWNrcyBpZiBkYXRhIHN0b3JlIGNvbnRhaW5zIGEgc3RvcmFnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KZnVuYyAoZHMgKkRhdGFzdG9yZSkgSGFzU3RvcmFnZShuYW1lIHN0cmluZykgYm9vbCB7CglyZXR1cm4gZHMuc3RvcmFnZXMuSGFzKG5hbWUpCn0KCi8vIEdldFN0b3JhZ2UgcmV0dXJucyBhIHN0b3JhZ2UgdGhhdCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYSBzcGVjaWZpYyBuYW1lLgovLyBJdCByZXR1cm5zIG5pbCB3aGVuIGEgc3RvcmFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm91bmQuCmZ1bmMgKGRzICpEYXRhc3RvcmUpIEdldFN0b3JhZ2UobmFtZSBzdHJpbmcpICpTdG9yYWdlIHsKCWlmIHMsIG9rIDo9IGRzLnN0b3JhZ2VzLkdldChuYW1lKS4oKlN0b3JhZ2UpOyBvayB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiBuaWwKfQoaZAoLZ25vbW9kLnRvbWwSVW1vZHVsZSA9ICJnbm8ubGFuZC9wL2cxN2tocXB1a2VlczQyMzdkdG4zYXN0emFwbXA0NjJ2amhzejZzdDQvZGF0YXN0b3JlIgpnbm8gPSAiMC45IgoalBYKCWluZGV4LmdubxKGFnBhY2thZ2UgZGF0YXN0b3JlCgppbXBvcnQgKAoJImduby5sYW5kL3AvbW91bC9jb2xsZWN0aW9uL3YwIgopCgovLyBEZWZhdWx0SW5kZXhPcHRpb25zIGRlZmluZXMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgbmV3IGluZGV4ZXMuCmNvbnN0IERlZmF1bHRJbmRleE9wdGlvbnMgPSBjb2xsZWN0aW9uLkRlZmF1bHRJbmRleCB8IGNvbGxlY3Rpb24uU3BhcnNlSW5kZXgKCnR5cGUgKAoJLy8gSW5kZXhGbiBkZWZpbmVzIGEgdHlwZSBmb3Igc2luZ2xlIHZhbHVlIGluZGV4aW5nIGZ1bmN0aW9ucy4KCS8vIFRoaXMgdHlwZSBvZiBmdW5jdGlvbiBleHRyYWN0cyBhIHNpbmdsZSBzdHJpbmcgdmFsdWUgZnJvbQoJLy8gYSByZWNvcmQgdGhhdCBpcyB0aGVuIHVzZWQgdG8gaW5kZXggaXQuCglJbmRleEZuIGZ1bmMoUmVjb3JkKSBzdHJpbmcKCgkvLyBJbmRleE11bHRpVmFsdWVGbiBkZWZpbmVzIGEgdHlwZSBmb3IgbXVsdGkgdmFsdWUgaW5kZXhpbmcgZnVuY3Rpb25zLgoJLy8gVGhpcyB0eXBlIG9mIGZ1bmN0aW9uIGV4dHJhY3RzIG11bHRpcGxlIHN0cmluZyB2YWx1ZXMgZnJvbSBhCgkvLyByZWNvcmQgdGhhdCBhcmUgdGhlbiB1c2VkIHRvIGluZGV4IGl0LgoJSW5kZXhNdWx0aVZhbHVlRm4gZnVuYyhSZWNvcmQpIFtdc3RyaW5nCgoJLy8gSW5kZXggZGVmaW5lcyBhIHR5cGUgZm9yIGN1c3RvbSB1c2VyIGRlZmluZWQgc3RvcmFnZSBpbmRleGVzLgoJLy8gU3RvcmFnZXMgYXJlIGJ5IGRlZmF1bHQgaW5kZXhlZCBieSB0aGUgYXV0byBnZW5lYXRlZCByZWNvcmQgSUQKCS8vIGJ1dCBjYW4gYWRkaXRpb25hbGx5IGJlIGluZGV4ZWQgYnkgb3RoZXIgY3VzdG9tIHJlY29yZCBmaWVsZHMuCglJbmRleCBzdHJ1Y3QgewoJCW5hbWUgICAgc3RyaW5nCgkJb3B0aW9ucyBjb2xsZWN0aW9uLkluZGV4T3B0aW9uCgkJZm4gICAgICBpbnRlcmZhY2V7fQoJfQopCgovLyBOZXdJbmRleCBjcmVhdGVzIGEgbmV3IHNpbmdsZSB2YWx1ZSBpbmRleC4KLy8KLy8gVXNhZ2UgZXhhbXBsZToKLy8KLy8JLy8gSW5kZXggYSBVc2VyIHJlY29yZCBieSBlbWFpbAovLwlpZHggOj0gTmV3SW5kZXgoImVtYWlsIiwgZnVuYyhyIFJlY29yZCkgc3RyaW5nIHsKLy8JICByZXR1cm4gci5NdXN0R2V0KCJlbWFpbCIpLihzdHJpbmcpCi8vCX0pCmZ1bmMgTmV3SW5kZXgobmFtZSBzdHJpbmcsIGZuIEluZGV4Rm4pIEluZGV4IHsKCXJldHVybiBJbmRleHsKCQluYW1lOiAgICBuYW1lLAoJCW9wdGlvbnM6IERlZmF1bHRJbmRleE9wdGlvbnMsCgkJZm46IGZ1bmModiBpbnRlcmZhY2V7fSkgc3RyaW5nIHsKCQkJcmV0dXJuIGZuKHYuKFJlY29yZCkpCgkJfSwKCX0KfQoKLy8gTmV3TXVsdGlWYWx1ZUluZGV4IGNyZWF0ZXMgYSBuZXcgbXVsdGkgdmFsdWUgaW5kZXguCi8vCi8vIFVzYWdlIGV4YW1wbGU6Ci8vCi8vCS8vIEluZGV4IGEgUG9zdCByZWNvcmQgYnkgdGFnCi8vCWlkeCA6PSBOZXdNdWx0aVZhbHVlSW5kZXgoInRhZyIsIGZ1bmMociBSZWNvcmQpIFtdc3RyaW5nIHsKLy8JICByZXR1cm4gci5NdXN0R2V0KCJ0YWdzIikuKFtdc3RyaW5nKQovLwl9KQpmdW5jIE5ld011bHRpVmFsdWVJbmRleChuYW1lIHN0cmluZywgZm4gSW5kZXhNdWx0aVZhbHVlRm4pIEluZGV4IHsKCXJldHVybiBJbmRleHsKCQluYW1lOiAgICBuYW1lLAoJCW9wdGlvbnM6IERlZmF1bHRJbmRleE9wdGlvbnMsCgkJZm46IGZ1bmModiBpbnRlcmZhY2V7fSkgW11zdHJpbmcgewoJCQlyZXR1cm4gZm4odi4oUmVjb3JkKSkKCQl9LAoJfQp9CgovLyBOYW1lIHJldHVybnMgaW5kZXgncyBuYW1lLgpmdW5jIChpZHggSW5kZXgpIE5hbWUoKSBzdHJpbmcgewoJcmV0dXJuIGlkeC5uYW1lCn0KCi8vIE9wdGlvbnMgcmV0dXJucyBjdXJyZW50IGluZGV4IG9wdGlvbnMuCi8vIFRoZXNlIG9wdGlvbnMgZGVmaW5lIHRoZSBpbmRleCBiZWhhdmlvciByZWdhcmRpbmcgY2FzZSBzZW5zaXRpdml0eSBhbmQgdW5pcXVlbmVzLgpmdW5jIChpZHggSW5kZXgpIE9wdGlvbnMoKSBjb2xsZWN0aW9uLkluZGV4T3B0aW9uIHsKCXJldHVybiBpZHgub3B0aW9ucwp9CgovLyBGdW5jIHJldHVybnMgdGhlIGZ1bmN0aW9uIHRoYXQgc3RvcmFnZSBjb2xsZWN0aW9ucyBhcHBseQovLyB0byBlYWNoIHJlY29yZCB0byBnZXQgdGhlIHZhbHVlIHRvIHVzZSBmb3IgaW5kZXhpbmcgaXQuCmZ1bmMgKGlkeCBJbmRleCkgRnVuYygpIGludGVyZmFjZXt9IHsKCXJldHVybiBpZHguZm4KfQoKLy8gVW5pcXVlIHJldHVybnMgYSBjb3B5IG9mIHRoZSBpbmRleCB0aGF0IGluZGV4ZXMgcmVjb3JkIHZhbHVlcyBhcyB1bmlxdWUgdmFsdWVzLgovLyBSZXR1cm5lZCBpbmRleCBjb250YWlucyBwcmV2aW91cyBvcHRpb25zIHBsdXMgdGhlIHVuaXF1ZSBvbmUuCmZ1bmMgKGlkeCBJbmRleCkgVW5pcXVlKCkgSW5kZXggewoJaWYgaWR4Lm9wdGlvbnMmY29sbGVjdGlvbi5VbmlxdWVJbmRleCA9PSAwIHsKCQlpZHgub3B0aW9ucyB8PSBjb2xsZWN0aW9uLlVuaXF1ZUluZGV4Cgl9CglyZXR1cm4gaWR4Cn0KCi8vIENhc2VJbnNlbnNpdGl2ZSByZXR1cm5zIGEgY29weSBvZiB0aGUgaW5kZXggdGhhdCBpbmRleGVzIHJlY29yZCB2YWx1ZXMgaWdub3JpbmcgY2FzaW5nLgovLyBSZXR1cm5lZCBpbmRleCBjb250YWlucyBwcmV2aW91cyBvcHRpb25zIHBsdXMgdGhlIGNhc2UgaW5zZW5zaXRpdml0eSBvbmUuCmZ1bmMgKGlkeCBJbmRleCkgQ2FzZUluc2Vuc2l0aXZlKCkgSW5kZXggewoJaWYgaWR4Lm9wdGlvbnMmY29sbGVjdGlvbi5DYXNlSW5zZW5zaXRpdmVJbmRleCA9PSAwIHsKCQlpZHgub3B0aW9ucyB8PSBjb2xsZWN0aW9uLkNhc2VJbnNlbnNpdGl2ZUluZGV4Cgl9CglyZXR1cm4gaWR4Cn0KGuQHCglxdWVyeS5nbm8S1gdwYWNrYWdlIGRhdGFzdG9yZQoKaW1wb3J0ICgKCSJnbm8ubGFuZC9wL21vdWwvY29sbGVjdGlvbi92MCIKKQoKdmFyIGRlZmF1bHRRdWVyeSA9IFF1ZXJ5e2luZGV4TmFtZTogY29sbGVjdGlvbi5JREluZGV4fQoKLy8gUXVlcnkgY29udGFpbnMgYXJndW1lbnRzIGZvciBxdWVyeWluZyBhIHN0b3JhZ2UuCnR5cGUgUXVlcnkgc3RydWN0IHsKCW9mZnNldCAgICBpbnQKCXNpemUgICAgICBpbnQKCWluZGV4TmFtZSBzdHJpbmcKCWluZGV4S2V5ICBzdHJpbmcKfQoKLy8gT2Zmc2V0IHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCByZWNvcmQgdG8gcmV0dXJuLgovLyBUaGUgbWluaW11bSBvZmZzZXQgdmFsdWUgaXMgMC4KZnVuYyAocSBRdWVyeSkgT2Zmc2V0KCkgaW50IHsKCXJldHVybiBxLm9mZnNldAp9CgovLyBTaXplIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgYSBxdWVyeSByZXR1cm5zLgpmdW5jIChxIFF1ZXJ5KSBTaXplKCkgaW50IHsKCXJldHVybiBxLnNpemUKfQoKLy8gSW5kZXhOYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN0b3JhZ2UgaW5kZXggYmVpbmcgdXNlZCBmb3IgdGhlIHF1ZXJ5LgpmdW5jIChxIFF1ZXJ5KSBJbmRleE5hbWUoKSBzdHJpbmcgewoJcmV0dXJuIHEuaW5kZXhOYW1lCn0KCi8vIEluZGV4S2V5IHJldHVybiB0aGUgaW5kZXgga2V5IHZhbHVlIHRvIGxvY2F0ZSB0aGUgcmVjb3Jkcy4KLy8gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gYWxsIGluZGV4ZWQgcmVjb3JkcyBtYXRjaCB0aGUgcXVlcnkuCmZ1bmMgKHEgUXVlcnkpIEluZGV4S2V5KCkgc3RyaW5nIHsKCXJldHVybiBxLmluZGV4S2V5Cn0KCi8vIElzRW1wdHkgY2hlY2tzIGlmIHRoZSBxdWVyeSBpcyBlbXB0eS4KLy8gRW1wdHkgcXVlcmllcyByZXR1cm4gbm8gcmVjb3Jkcy4KZnVuYyAocSBRdWVyeSkgSXNFbXB0eSgpIGJvb2wgewoJcmV0dXJuIHEuaW5kZXhOYW1lID09ICIiCn0KGosKChFxdWVyeV9vcHRpb25zLmdubxL1CXBhY2thZ2UgZGF0YXN0b3JlCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJpbmdzIgopCgp2YXIgKAoJRXJyRW1wdHlRdWVyeUluZGV4TmFtZSA9IGVycm9ycy5OZXcoInF1ZXJ5IGluZGV4IG5hbWUgaXMgZW1wdHkiKQoJRXJySW52YWxpZFF1ZXJ5T2Zmc2V0ICA9IGVycm9ycy5OZXcoIm1pbmltdW0gYWxsb3dlZCBxdWVyeSBvZmZzZXQgaXMgMCIpCglFcnJJbnZhbGlkUXVlcnlTaXplICAgID0gZXJyb3JzLk5ldygibWluaW11bSBhbGxvd2VkIHF1ZXJ5IHNpemUgaXMgMSIpCikKCi8vIFF1ZXJ5T3B0aW9uIGNvbmZpZ3VyZXMgcXVlcmllcy4KdHlwZSBRdWVyeU9wdGlvbiBmdW5jKCpRdWVyeSkgZXJyb3IKCi8vIFdpdGhPZmZzZXQgYXNzaWducyB0aGUgb2Zmc2V0IG9yIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCByZWNvcmQgdGhhdCBxdWVyeSBtdXN0IHJldHVybi4KLy8gVGhlIG1pbmltdW0gYWxsb3dlZCBvZmZzZXQgaXMgMC4KZnVuYyBXaXRoT2Zmc2V0KG9mZnNldCBpbnQpIFF1ZXJ5T3B0aW9uIHsKCXJldHVybiBmdW5jKHEgKlF1ZXJ5KSBlcnJvciB7CgkJaWYgb2Zmc2V0IDwgMCB7CgkJCXJldHVybiBFcnJJbnZhbGlkUXVlcnlPZmZzZXQKCQl9CgoJCXEub2Zmc2V0ID0gb2Zmc2V0CgkJcmV0dXJuIG5pbAoJfQp9CgovLyBXaXRoU2l6ZSBhc3NpZ25zIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHRoYXQgcXVlcnkgY2FuIHJldHVybi4KLy8gVGhlIG1pbmltdW0gYWxsb3dlZCBzaXplIGlzIDEuCmZ1bmMgV2l0aFNpemUoc2l6ZSBpbnQpIFF1ZXJ5T3B0aW9uIHsKCXJldHVybiBmdW5jKHEgKlF1ZXJ5KSBlcnJvciB7CgkJaWYgc2l6ZSA8IDEgewoJCQlyZXR1cm4gRXJySW52YWxpZFF1ZXJ5U2l6ZQoJCX0KCgkJcS5zaXplID0gc2l6ZQoJCXJldHVybiBuaWwKCX0KfQoKLy8gVXNlSW5kZXggYXNzaWducyB0aGUgaW5kZXggdGhhdCB0aGUgcXVlcnkgbXVzdCB1c2UgdG8gZ2V0IHRoZSByZWNvcmRzLgovLyBVc2luZyBhbiBpbmRleCByZXF1aXJlcyBhIGtleSB2YWx1ZSB0byBsb2NhdGUgdGhlIHJlY29yZHMgd2l0aGluIHRoZSBpbmRleC4KZnVuYyBVc2VJbmRleChuYW1lLCBrZXkgc3RyaW5nKSBRdWVyeU9wdGlvbiB7CglyZXR1cm4gZnVuYyhxICpRdWVyeSkgZXJyb3IgewoJCXEuaW5kZXhOYW1lID0gc3RyaW5ncy5UcmltU3BhY2UobmFtZSkKCQlpZiBxLmluZGV4TmFtZSA9PSAiIiB7CgkJCXJldHVybiBFcnJFbXB0eVF1ZXJ5SW5kZXhOYW1lCgkJfQoKCQlxLmluZGV4S2V5ID0ga2V5CgkJcmV0dXJuIG5pbAoJfQp9ChrKKwoKcmVjb3JkLmdubxK7K3BhY2thZ2UgZGF0YXN0b3JlCgppbXBvcnQgKAoJImVycm9ycyIKCgkiZ25vLmxhbmQvcC9tb3VsL2NvbGxlY3Rpb24vdjAiCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgkiZ25vLmxhbmQvcC9udC9zZXFpZC92MCIKKQoKLy8gRXJyVW5kZWZpbmVkRmllbGQgaW5kaWNhdGVzIHRoYXQgYSBmaWVsZCBpbiBub3QgZGVmaW5lZCBpbiBhIHJlY29yZCdzIHNjaGVtYS4KdmFyIEVyclVuZGVmaW5lZEZpZWxkID0gZXJyb3JzLk5ldygidW5kZWZpbmVkIGZpZWxkIikKCnR5cGUgKAoJLy8gUmVjb3JkIHN0b3JlcyB2YWx1ZXMgZm9yIG9uZSBvciBtb3JlIGZpZWxkcy4KCVJlY29yZCBpbnRlcmZhY2UgewoJCVJlYWRPbmx5UmVjb3JkCgoJCS8vIFNldCBhc3NpbmdzIGEgdmFsdWUgdG8gYSByZWNvcmQgZmllbGQuCgkJLy8gSWYgdGhlIGZpZWxkIGRvZXNuJ3QgZXhpc3QgaXQncyBjcmVhdGVkIGlmIHRoZSB1bmRlcmx5aW5nIHNjaGVtYSBhbGxvd3MgaXQuCgkJLy8gU3RvcmFnZSBzY2hlbWEgY2FuIG9wdGlvbmFsbHkgYmUgc3RyaWN0IGluIHdoaWNoIGNhc2Ugbm8gbmV3IGZpZWxkcyBvdGhlciB0aGFuCgkJLy8gdGhlIG9uZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGVmaW5lZCBhcmUgYWxsb3dlZC4KCQlTZXQoZmllbGQgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgZXJyb3IKCgkJLy8gU2F2ZSBhc3NpZ25zIGFuIElEIHRvIG5ld2x5IGNyZWF0ZWQgcmVjb3JkcyBhbmQgdXBkYXRlIHN0b3JhZ2UgaW5kZXhlcy4KCQlTYXZlKCkgYm9vbAoJfQoKCS8vIFJlYWRPbmx5UmVjb3JkIGRlZmluZXMgYW4gaW50ZXJmYWNlIGZvciByZWFkLW9ubHkgcmVjb3Jkcy4KCVJlYWRPbmx5UmVjb3JkIGludGVyZmFjZSB7CgkJLy8gSUQgcmV0dXJucyByZWNvcmQncyBJRAoJCUlEKCkgdWludDY0CgoJCS8vIEtleSByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNvcmQncyBJRC4KCQkvLyBJdCdzIHVzZWQgdG8gYmUgYWJsZSB0byBzZWFyY2ggcmVjb3JkcyB3aXRoaW4gdGhlIElEIGluZGV4LgoJCUtleSgpIHN0cmluZwoKCQkvLyBUeXBlIHJldHVybnMgdGhlIHJlY29yZCdzIHR5cGUuCgkJVHlwZSgpIHN0cmluZwoKCQkvLyBGaWVsZHMgcmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgcmVjb3JkJ3MgZmllbGQgbmFtZXMuCgkJRmllbGRzKCkgW11zdHJpbmcKCgkJLy8gSXNFbXB0eSBjaGVja3MgaWYgdGhlIHJlY29yZCBoYXMgbm8gdmFsdWVzLgoJCUlzRW1wdHkoKSBib29sCgoJCS8vIEhhc0ZpZWxkIGNoZWNrcyBpZiB0aGUgcmVjb3JkIGhhcyBhIHNwZWNpZmljIGZpZWxkLgoJCUhhc0ZpZWxkKG5hbWUgc3RyaW5nKSBib29sCgoJCS8vIEdldCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlY29yZCdzIGZpZWxkLgoJCUdldChmaWVsZCBzdHJpbmcpICh2YWx1ZSBpbnRlcmZhY2V7fSwgZm91bmQgYm9vbCkKCgkJLy8gTXVzdEdldCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlY29yZCdzIGZpZWxkIG9yIHBhbmljcyB3aGVuIHRoZSBmaWVsZCBpcyBub3QgZm91bmQuCgkJTXVzdEdldChmaWVsZCBzdHJpbmcpIGludGVyZmFjZXt9Cgl9CgoJLy8gUmVjb3JkSXRlckZuIGRlZmluZXMgYSB0eXBlIGZvciByZWNvcmQgaXRlcmF0aW9uIGZ1bmN0aW9ucy4KCVJlY29yZEl0ZXJGbiBmdW5jKFJlY29yZCkgKHN0b3AgYm9vbCkKCgkvLyBSZWNvcmRzZXQgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgaXRlcmF0aW5nIG11bHRpcGxlIHJlY29yZHMuCglSZWNvcmRzZXQgaW50ZXJmYWNlIHsKCQkvLyBJdGVyYXRlIGl0ZXJhdGVzIHJlY29yZHMgaW4gb3JkZXIuCgkJSXRlcmF0ZShmbiBSZWNvcmRJdGVyRm4pIChzdG9wcGVkIGJvb2wpCgoJCS8vIFJldmVyc2VJdGVyYXRlIGl0ZXJhdGVzIHJlY29yZHMgaW4gcmV2ZXJzZSBvcmRlci4KCQlSZXZlcnNlSXRlcmF0ZShmbiBSZWNvcmRJdGVyRm4pIChzdG9wcGVkIGJvb2wpCgoJCS8vIFNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIHJlY29yZHNldC4KCQlTaXplKCkgaW50Cgl9CikKCnR5cGUgcmVjb3JkIHN0cnVjdCB7CglpZCAgICAgICAgIHVpbnQ2NAoJc2NoZW1hICAgICAqU2NoZW1hCgljb2xsZWN0aW9uICpjb2xsZWN0aW9uLkNvbGxlY3Rpb24KCXZhbHVlcyAgICAgKmJwdHJlZS5CUFRyZWUgLy8gc3RyaW5nKGZpZWxkIGluZGV4KSAtPiBpbnRlcmZhY2V7fQp9CgovLyBJRCByZXR1cm5zIHJlY29yZCdzIElECmZ1bmMgKHIgcmVjb3JkKSBJRCgpIHVpbnQ2NCB7CglyZXR1cm4gci5pZAp9CgovLyBLZXkgcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkJ3MgSUQuCi8vIEl0J3MgdXNlZCB0byBiZSBhYmxlIHRvIHNlYXJjaCByZWNvcmRzIHdpdGhpbiB0aGUgSUQgaW5kZXguCmZ1bmMgKHIgcmVjb3JkKSBLZXkoKSBzdHJpbmcgewoJcmV0dXJuIHNlcWlkLklEKHIuaWQpLlN0cmluZygpCn0KCi8vIFR5cGUgcmV0dXJucyB0aGUgcmVjb3JkJ3MgdHlwZS4KZnVuYyAociByZWNvcmQpIFR5cGUoKSBzdHJpbmcgewoJcmV0dXJuIHIuc2NoZW1hLk5hbWUoKQp9CgovLyBGaWVsZHMgcmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgcmVjb3JkJ3MgZmllbGQgbmFtZXMuCmZ1bmMgKHIgcmVjb3JkKSBGaWVsZHMoKSBbXXN0cmluZyB7CglyZXR1cm4gci5zY2hlbWEuRmllbGRzKCkKfQoKLy8gSXNFbXB0eSBjaGVja3MgaWYgdGhlIHJlY29yZCBoYXMgbm8gdmFsdWVzLgpmdW5jIChyIHJlY29yZCkgSXNFbXB0eSgpIGJvb2wgewoJcmV0dXJuIHIudmFsdWVzLlNpemUoKSA9PSAwCn0KCi8vIEhhc0ZpZWxkIGNoZWNrcyBpZiB0aGUgcmVjb3JkIGhhcyBhIHNwZWNpZmljIGZpZWxkLgpmdW5jIChyIHJlY29yZCkgSGFzRmllbGQobmFtZSBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIHIuc2NoZW1hLkhhc0ZpZWxkKG5hbWUpCn0KCi8vIFNldCBhc3NpbmdzIGEgdmFsdWUgdG8gYSByZWNvcmQgZmllbGQuCi8vIElmIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0IGl0J3MgY3JlYXRlZCBpZiB0aGUgdW5kZXJseWluZyBzY2hlbWEgYWxsb3dzIGl0LgovLyBTdG9yYWdlIHNjaGVtYSBjYW4gb3B0aW9uYWxseSBiZSBzdHJpY3QgaW4gd2hpY2ggY2FzZSBubyBuZXcgZmllbGRzIG90aGVyIHRoYW4KLy8gdGhlIG9uZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGVmaW5lZCBhcmUgYWxsb3dlZC4KZnVuYyAociAqcmVjb3JkKSBTZXQoZmllbGQgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgZXJyb3IgewoJaSA6PSByLnNjaGVtYS5HZXRGaWVsZEluZGV4KGZpZWxkKQoJaWYgaSA9PSAtMSB7CgkJaWYgci5zY2hlbWEuSXNTdHJpY3QoKSB7CgkJCXJldHVybiBFcnJVbmRlZmluZWRGaWVsZAoJCX0KCgkJaSwgXyA9IHIuc2NoZW1hLkFkZEZpZWxkKGZpZWxkLCBuaWwpCgl9CgoJa2V5IDo9IGNhc3RJbnRUb0tleShpKQoJci52YWx1ZXMuU2V0KGtleSwgdmFsdWUpCglyZXR1cm4gbmlsCn0KCi8vIEdldCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlY29yZCdzIGZpZWxkLgpmdW5jIChyIHJlY29yZCkgR2V0KGZpZWxkIHN0cmluZykgKHZhbHVlIGludGVyZmFjZXt9LCBmb3VuZCBib29sKSB7CglpIDo9IHIuc2NoZW1hLkdldEZpZWxkSW5kZXgoZmllbGQpCglpZiBpID09IC0xIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoKCWtleSA6PSBjYXN0SW50VG9LZXkoaSkKCWlmIHIudmFsdWVzLkhhcyhrZXkpIHsKCQlyZXR1cm4gci52YWx1ZXMuR2V0KGtleSksIHRydWUKCX0KCXJldHVybiBuaWwsIGZhbHNlCn0KCi8vIE11c3RHZXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZWNvcmQncyBmaWVsZCBvciBwYW5pY3Mgd2hlbiB0aGUgZmllbGQgaXMgbm90IGZvdW5kLgpmdW5jIChyIHJlY29yZCkgTXVzdEdldChmaWVsZCBzdHJpbmcpIGludGVyZmFjZXt9IHsKCXYsIGZvdW5kIDo9IHIuR2V0KGZpZWxkKQoJaWYgIWZvdW5kIHsKCQlwYW5pYygiZmllbGQgbm90IGZvdW5kOiAiICsgZmllbGQpCgl9CglyZXR1cm4gdgp9CgovLyBTYXZlIGFzc2lnbnMgYW4gSUQgdG8gbmV3bHkgY3JlYXRlZCByZWNvcmRzIGFuZCB1cGRhdGUgc3RvcmFnZSBpbmRleGVzLgpmdW5jIChyICpyZWNvcmQpIFNhdmUoKSBib29sIHsKCWlmIHIuaWQgPT0gMCB7CgkJci5pZCA9IHIuY29sbGVjdGlvbi5TZXQocikKCQlyZXR1cm4gci5pZCAhPSAwCgl9CglyZXR1cm4gci5jb2xsZWN0aW9uLlVwZGF0ZShyLmlkLCByKQp9Cgp0eXBlIHJlY29yZHNldCBzdHJ1Y3QgewoJcXVlcnkgICBRdWVyeQoJcmVjb3JkcyBicHRyZWUuSVRyZWUKCWtleXMgICAgW11zdHJpbmcKCXNpemUgICAgaW50Cn0KCi8vIEl0ZXJhdGUgaXRlcmF0ZXMgcmVjb3JkcyBpbiBvcmRlci4KZnVuYyAocnMgcmVjb3Jkc2V0KSBJdGVyYXRlKGZuIFJlY29yZEl0ZXJGbikgKHN0b3BwZWQgYm9vbCkgewoJaWYgcnMuaXNVc2luZ0N1c3RvbUluZGV4KCkgewoJCWZvciBfLCBrIDo9IHJhbmdlIHJzLmtleXMgewoJCQlyLCBvayA6PSBycy5yZWNvcmRzLkdldChrKS4oUmVjb3JkKQoJCQlpZiAhb2sgewoJCQkJY29udGludWUKCQkJfQoKCQkJaWYgZm4ocikgewoJCQkJcmV0dXJuIHRydWUKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlCgl9CgoJb2Zmc2V0IDo9IHJzLnF1ZXJ5Lk9mZnNldCgpCgljb3VudCA6PSBycy5xdWVyeS5TaXplKCkKCWlmIGNvdW50ID09IDAgewoJCWNvdW50ID0gcnMucmVjb3Jkcy5TaXplKCkKCX0KCglyZXR1cm4gcnMucmVjb3Jkcy5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdiBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJcmV0dXJuIGZuKHYuKFJlY29yZCkpCgl9KQp9CgovLyBSZXZlcnNlSXRlcmF0ZSBpdGVyYXRlcyByZWNvcmRzIGluIHJldmVyc2Ugb3JkZXIuCmZ1bmMgKHJzIHJlY29yZHNldCkgUmV2ZXJzZUl0ZXJhdGUoZm4gUmVjb3JkSXRlckZuKSAoc3RvcHBlZCBib29sKSB7CglpZiBycy5pc1VzaW5nQ3VzdG9tSW5kZXgoKSB7CgkJZm9yIGkgOj0gbGVuKHJzLmtleXMpIC0gMTsgaSA+PSAwOyBpLS0gewoJCQlyLCBvayA6PSBycy5yZWNvcmRzLkdldChycy5rZXlzW2ldKS4oUmVjb3JkKQoJCQlpZiAhb2sgewoJCQkJY29udGludWUKCQkJfQoKCQkJaWYgZm4ocikgewoJCQkJcmV0dXJuIHRydWUKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlCgl9CgoJb2Zmc2V0IDo9IHJzLnF1ZXJ5Lk9mZnNldCgpCgljb3VudCA6PSBycy5xdWVyeS5TaXplKCkKCWlmIGNvdW50ID09IDAgewoJCWNvdW50ID0gcnMucmVjb3Jkcy5TaXplKCkKCX0KCglyZXR1cm4gcnMucmVjb3Jkcy5SZXZlcnNlSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmMoXyBzdHJpbmcsIHYgaW50ZXJmYWNle30pIGJvb2wgewoJCXJldHVybiBmbih2LihSZWNvcmQpKQoJfSkKfQoKLy8gU2l6ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgcmVjb3Jkc2V0LgpmdW5jIChycyByZWNvcmRzZXQpIFNpemUoKSBpbnQgewoJcmV0dXJuIHJzLnNpemUKfQoKZnVuYyAocnMgcmVjb3Jkc2V0KSBpc1VzaW5nQ3VzdG9tSW5kZXgoKSBib29sIHsKCXJldHVybiBycy5xdWVyeS5JbmRleE5hbWUoKSAhPSBjb2xsZWN0aW9uLklESW5kZXgKfQoaoxwKCnNjaGVtYS5nbm8SlBxwYWNrYWdlIGRhdGFzdG9yZQoKaW1wb3J0ICgKCSJlbmNvZGluZy9iaW5hcnkiCgoJImduby5sYW5kL3AvbnQvYnB0cmVlL2xpc3QvdjAiCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCi8vIFRPRE86IFN1cHBvcnQgdmVyc2lvbmluZwoKLy8gU2NoZW1hIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGZpZWxkcyBhbmQgZGVmYXVsdCBmaWVsZCB2YWx1ZXMuCi8vIEl0IGFsc28gb2ZmZXJzIHRoZSBwb3NzaWJpbGl0eSB0byBjb25maWd1cmUgaXQgYXMgc3RhdGljIHRvIGluZGljYXRlCi8vIHRoYXQgb25seSBjb25maWd1cmVkIGZpZWxkcyBzaG91bGQgYmUgYWxsb3dlZC4KdHlwZSBTY2hlbWEgc3RydWN0IHsKCW5hbWUgICAgIHN0cmluZwoJc3RyaWN0ICAgYm9vbAoJZmllbGRzICAgbGlzdC5MaXN0ICAgICAgLy8gaW50KGZpZWxkIGluZGV4KSAtPiBzdHJpbmcoZmllbGQgbmFtZSkKCWRlZmF1bHRzICpicHRyZWUuQlBUcmVlIC8vIHN0cmluZyhmaWVsZCBpbmRleCkgLT4gaW50ZXJmYWNle30KfQoKLy8gTmV3U2NoZW1hIGNyZWF0ZXMgYSBuZXcgc2NoZW1hLgpmdW5jIE5ld1NjaGVtYShuYW1lIHN0cmluZywgb3B0aW9ucyAuLi5TY2hlbWFPcHRpb24pICpTY2hlbWEgewoJcyA6PSAmU2NoZW1hewoJCW5hbWU6ICAgICBuYW1lLAoJCWRlZmF1bHRzOiBicHRyZWUuTmV3QlBUcmVlMzIoKSwKCX0KCWZvciBfLCBhcHBseSA6PSByYW5nZSBvcHRpb25zIHsKCQlhcHBseShzKQoJfQoJcmV0dXJuIHMKfQoKLy8gTmFtZSByZXR1cm5zIHNjaGVtYSdzIG5hbWUuCmZ1bmMgKHMgKlNjaGVtYSkgTmFtZSgpIHN0cmluZyB7CglyZXR1cm4gcy5uYW1lCn0KCi8vIEZpZWxkcyByZXR1cm5zIHRoZSBsaXN0IGZpZWxkIG5hbWVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIHNjaGVtYS4KZnVuYyAocyAqU2NoZW1hKSBGaWVsZHMoKSBbXXN0cmluZyB7CglmaWVsZHMgOj0gbWFrZShbXXN0cmluZywgcy5maWVsZHMuTGVuKCkpCglzLmZpZWxkcy5Gb3JFYWNoKGZ1bmMoaSBpbnQsIHYgaW50ZXJmYWNle30pIGJvb2wgewoJCWZpZWxkc1tpXSA9IHYuKHN0cmluZykKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gZmllbGRzCn0KCi8vIFNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyB0aGUgc2NoZW1hIGhhcy4KZnVuYyAocyAqU2NoZW1hKSBTaXplKCkgaW50IHsKCXJldHVybiBzLmZpZWxkcy5MZW4oKQp9CgovLyBJc1N0cmljdCBjaGVjayBpZiB0aGUgc2NoZW1hIGlzIGNvbmZpZ3VyZWQgYXMgYSBzdHJpY3Qgb25lLgpmdW5jIChzICpTY2hlbWEpIElzU3RyaWN0KCkgYm9vbCB7CglyZXR1cm4gcy5zdHJpY3QKfQoKLy8gSGFzRmllbGQgY2hlY2sgaXMgYSBmaWVsZCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZSBzY2hlbWEuCmZ1bmMgKHMgKlNjaGVtYSkgSGFzRmllbGQobmFtZSBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIHMuR2V0RmllbGRJbmRleChuYW1lKSA+PSAwCn0KCi8vIEFkZEZpZWxkIGFkZHMgYSBuZXcgZmllbGQgdG8gdGhlIHNjaGVtYS4KLy8gQSBkZWZhdWx0IGZpZWxkIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQsIG90aGVyd2lzZSBgZGVmYXVsdFZhbHVlYCBtdXN0IGJlIG5pbC4KZnVuYyAocyAqU2NoZW1hKSBBZGRGaWVsZChuYW1lIHN0cmluZywgZGVmYXVsdFZhbHVlIGludGVyZmFjZXt9KSAoaW5kZXggaW50LCBhZGRlZCBib29sKSB7CglpZiBzLkhhc0ZpZWxkKG5hbWUpIHsKCQlyZXR1cm4gLTEsIGZhbHNlCgl9CgoJcy5maWVsZHMuQXBwZW5kKG5hbWUpCglpbmRleCA9IHMuZmllbGRzLkxlbigpIC0gMQoJaWYgZGVmYXVsdFZhbHVlICE9IG5pbCB7CgkJa2V5IDo9IGNhc3RJbnRUb0tleShpbmRleCkKCQlzLmRlZmF1bHRzLlNldChrZXksIGRlZmF1bHRWYWx1ZSkKCX0KCXJldHVybiBpbmRleCwgdHJ1ZQp9CgovLyBHZXRGaWVsZEluZGV4IHJldHVybnMgdGhlIGluZGV4IG51bWJlciBvZiBhIHNjaGVtYSBmaWVsZC4KLy8KLy8gRmllbGQgaW5kZXggaW5kaWNhdGVzIHRoZSBvcmRlciB0aGUgZmllbGQgaGFzIHdpdGhpbiB0aGUgc2NoZW1hLgovLyBXaGVuIGRlZmluZWQgZmllbGRzIGFyZSBhZGRlZCB0aGV5IGdldCBhbiBpbmRleCBzdGFydGluZyBmcm9tCi8vIGZpZWxkIGluZGV4IDAuCi8vCi8vIEZpZWxkcyBhcmUgaW50ZXJuYWxseSByZWZlcmVuY2VkIGJ5IGluZGV4IG51bWJlciBpbnN0ZWFkIG9mIHRoZSBuYW1lCi8vIHRvIGJlIGFibGUgdG8gcmVuYW1lIGZpZWxkcyBlYXNpbHkuCmZ1bmMgKHMgKlNjaGVtYSkgR2V0RmllbGRJbmRleChuYW1lIHN0cmluZykgaW50IHsKCWluZGV4IDo9IC0xCglzLmZpZWxkcy5Gb3JFYWNoKGZ1bmMoaSBpbnQsIHYgaW50ZXJmYWNle30pIGJvb2wgewoJCWlmIG5hbWUgIT0gdi4oc3RyaW5nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCgkJaW5kZXggPSBpCgkJcmV0dXJuIHRydWUKCX0pCglyZXR1cm4gaW5kZXgKfQoKLy8gR2V0RmllbGROYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgYSBmaWVsZCBmb3IgYSBzcGVjaWZpYyBmaWVsZCBpbmRleC4KZnVuYyAocyAqU2NoZW1hKSBHZXRGaWVsZE5hbWUoaW5kZXggaW50KSAobmFtZSBzdHJpbmcsIGZvdW5kIGJvb2wpIHsKCWlmIHYsIG9rIDo9IHMuZmllbGRzLkdldChpbmRleCk7IG9rIHsKCQlyZXR1cm4gdi4oc3RyaW5nKSwgdHJ1ZQoJfQoJcmV0dXJuICIiLCBmYWxzZQp9CgovLyBHZXREZWZhdWx0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmllbGQuCmZ1bmMgKHMgKlNjaGVtYSkgR2V0RGVmYXVsdChuYW1lIHN0cmluZykgKHZhbHVlIGludGVyZmFjZXt9LCBmb3VuZCBib29sKSB7CglpIDo9IHMuR2V0RmllbGRJbmRleChuYW1lKQoJaWYgaSA9PSAtMSB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiBzLkdldERlZmF1bHRCeUluZGV4KGkpCn0KCi8vIEdldERlZmF1bHRCeUluZGV4IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmllbGQgYnkgaXQncyBpbmRleC4KZnVuYyAocyAqU2NoZW1hKSBHZXREZWZhdWx0QnlJbmRleChpbmRleCBpbnQpICh2YWx1ZSBpbnRlcmZhY2V7fSwgZm91bmQgYm9vbCkgewoJa2V5IDo9IGNhc3RJbnRUb0tleShpbmRleCkKCWlmICFzLmRlZmF1bHRzLkhhcyhrZXkpIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoKCXYgOj0gcy5kZWZhdWx0cy5HZXQoa2V5KQoJaWYgZm4sIG9rIDo9IHYuKGZ1bmMoKSBpbnRlcmZhY2V7fSk7IG9rIHsKCQlyZXR1cm4gZm4oKSwgdHJ1ZQoJfQoJcmV0dXJuIHYsIHRydWUKfQoKLy8gUmVuYW1lRmllbGQgcmVuYW1lcyBhIGZpZWxkLgpmdW5jIChzICpTY2hlbWEpIFJlbmFtZUZpZWxkKG5hbWUsIG5ld05hbWUgc3RyaW5nKSAocmVuYW1lZCBib29sKSB7CglpZiBzLkhhc0ZpZWxkKG5ld05hbWUpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCglpIDo9IHMuR2V0RmllbGRJbmRleChuYW1lKQoJaWYgaSA9PSAtMSB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJcy5maWVsZHMuU2V0KGksIG5ld05hbWUpCglyZXR1cm4gdHJ1ZQp9CgpmdW5jIGNhc3RJbnRUb0tleShpIGludCkgc3RyaW5nIHsKCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgOCkKCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDY0KGJ1ZiwgdWludDY0KGkpKQoJcmV0dXJuIHN0cmluZyhidWYpCn0KGogJChJzY2hlbWFfb3B0aW9ucy5nbm8S8QhwYWNrYWdlIGRhdGFzdG9yZQoKaW1wb3J0ICJzdHJpbmdzIgoKLy8gU3RvcmFnZU9wdGlvbiBjb25maWd1cmVzIHNjaGVtYXMuCnR5cGUgU2NoZW1hT3B0aW9uIGZ1bmMoKlNjaGVtYSkKCi8vIFdpdGhGaWVsZCBhc3NpZ24gYSBuZXcgZmllbGQgdG8gdGhlIHNjaGVtYSBkZWZpbml0aW9uLgpmdW5jIFdpdGhGaWVsZChuYW1lIHN0cmluZykgU2NoZW1hT3B0aW9uIHsKCXJldHVybiBmdW5jKHMgKlNjaGVtYSkgewoJCW5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShuYW1lKQoJCWlmIG5hbWUgIT0gIiIgewoJCQlzLmZpZWxkcy5BcHBlbmQobmFtZSkKCQl9Cgl9Cn0KCi8vIFdpdGhEZWZhdWx0RmllbGQgYXNzaWduIGEgbmV3IGZpZWxkIHdpdGggYSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBzY2hlbWEgZGVmaW5pdGlvbi4KLy8gRGVmYXVsdCB2YWx1ZSBpcyBhc3NpZ25lZCB0byBuZXdseSBjcmVhdGVkIHJlY29yZHMgYXNvY2lhdGVkIHRvIHRvIHNjaGVtYS4KZnVuYyBXaXRoRGVmYXVsdEZpZWxkKG5hbWUgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgU2NoZW1hT3B0aW9uIHsKCXJldHVybiBmdW5jKHMgKlNjaGVtYSkgewoJCW5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShuYW1lKQoJCWlmIG5hbWUgIT0gIiIgewoJCQlzLmZpZWxkcy5BcHBlbmQobmFtZSkKCgkJCWtleSA6PSBjYXN0SW50VG9LZXkocy5maWVsZHMuTGVuKCkgLSAxKQoJCQlzLmRlZmF1bHRzLlNldChrZXksIHZhbHVlKQoJCX0KCX0KfQoKLy8gU3RyaWN0IGNvbmZpZ3VyZXMgdGhlIHNjaGVtYSBhcyBhIHN0cmljdCBvbmUuCi8vIEJ5IGRlZmF1bHQgc2NoZW1hcyBzaG91bGQgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGFueSB1c2VyIGRlZmluZWQgZmllbGQsCi8vIG1ha2luZyB0aGVtIHN0cmljdCBsaW1pdHMgdGhlIGFsbG93ZWQgcmVjb3JkIGZpZWxkcyB0byB0aGUgb25lcyBwcmUtZGVmaW5lZAovLyBpbiB0aGUgc2NoZW1hLiBGaWVsZHMgYXJlIHByZS1kZWZpbmVkIHVzaW5nIGBXaXRoRmllbGRgLCBgV2l0aERlZmF1bHRGaWVsZGAKLy8gb3IgYnkgY2FsbGluZyBgU2NoZW1hLkFkZEZpZWxkKClgLgpmdW5jIFN0cmljdCgpIFNjaGVtYU9wdGlvbiB7CglyZXR1cm4gZnVuYyhzICpTY2hlbWEpIHsKCQlzLnN0cmljdCA9IHRydWUKCX0KfQoagC8KC3N0b3JhZ2UuZ25vEvAucGFja2FnZSBkYXRhc3RvcmUKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbW91bC9jb2xsZWN0aW9uL3YwIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiCikKCi8vIE5ld1N0b3JhZ2UgY3JlYXRlcyBhIG5ldyByZWNvcmRzIHN0b3JhZ2UuCmZ1bmMgTmV3U3RvcmFnZShuYW1lIHN0cmluZywgb3B0aW9ucyAuLi5TdG9yYWdlT3B0aW9uKSBTdG9yYWdlIHsKCXMgOj0gU3RvcmFnZXsKCQluYW1lOiAgICAgICBuYW1lLAoJCWNvbGxlY3Rpb246IGNvbGxlY3Rpb24uTmV3KCksCgkJc2NoZW1hOiAgICAgTmV3U2NoZW1hKHN0cmluZ3MuVGl0bGUobmFtZSkpLAoJfQoKCWZvciBfLCBhcHBseSA6PSByYW5nZSBvcHRpb25zIHsKCQlhcHBseSgmcykKCX0KCXJldHVybiBzCn0KCi8vIFN0b3JhZ2Ugc3RvcmVzIGEgY29sbGVjdGlvbiBvZiByZWNvcmRzLgovLwovLyBCeSBkZWZhdWx0IGl0IHNlYXJjaGVzIHJlY29yZHMgYnkgcmVjb3JkIElEIGJ1dCBpdCBhbGxvd3MKLy8gdXNpbmcgY3VzdG9tIHVzZXIgZGVmaW5lZCBpbmRleGVzIGZvciBvdGhlciByZWNvcmQgZmllbGRzLgovLwovLyBXaGVuIGEgc3RvcmFnZSBpcyBjcmVhdGVkIGl0IGRlZmluZXMgYSBkZWZhdWx0IHNjaGVtYSB0aGF0Ci8vIGtlZXBzIHRyYWNrIG9mIHJlY29yZCBmaWVsZHMuIFN0b3JhZ2UgY2FuIGJlIG9wdGlvbmFsbHkKLy8gY3JlYXRlZCB3aXRoIGEgdXNlciBkZWZpbmVkIHNjaGVtYSBpbiBjYXNlcyB3aGVyZSB0aGUgbnVtYmVyCi8vIG9mIGZpZWxkcyBoYXMgdG8gYmUgcHJlLWRlZmluZWQgb3Igd2hlbiBuZXcgcmVjb3JkcyBtdXN0IGhhdmUKLy8gb25lIG9yIG1vcmUgZmllbGRzIGluaXRpYWxpemVkIHRvIGRlZmF1bHQgdmFsdWVzLgp0eXBlIFN0b3JhZ2Ugc3RydWN0IHsKCW5hbWUgICAgICAgc3RyaW5nCgljb2xsZWN0aW9uICpjb2xsZWN0aW9uLkNvbGxlY3Rpb24KCXNjaGVtYSAgICAgKlNjaGVtYQp9CgovLyBOYW1lIHJldHVybnMgc3RvcmFnZSdzIG5hbWUuCmZ1bmMgKHMgU3RvcmFnZSkgTmFtZSgpIHN0cmluZyB7CglyZXR1cm4gcy5uYW1lCn0KCi8vIENvbGxlY3Rpb24gcmV0dXJucyB0aGUgdW5kZWx5aW5nIGNvbGxlY3Rpb24gdXNlZCBieSB0aGUKLy8gc3RvcmFnZSB0byBzdG9yZSBhbGwgcmVjb3Jkcy4KZnVuYyAocyBTdG9yYWdlKSBDb2xsZWN0aW9uKCkgKmNvbGxlY3Rpb24uQ29sbGVjdGlvbiB7CglyZXR1cm4gcy5jb2xsZWN0aW9uCn0KCi8vIFNjaGVtYSByZXR1cm5zIHRoZSBzY2hlbWEgYmVpbmcgdXNlZCB0byB0cmFjayByZWNvcmQgZmllbGRzLgpmdW5jIChzIFN0b3JhZ2UpIFNjaGVtYSgpICpTY2hlbWEgewoJcmV0dXJuIHMuc2NoZW1hCn0KCi8vIFNpemUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgdGhhdCB0aGUgc3RvcmFnZSBoYXZlLgpmdW5jIChzIFN0b3JhZ2UpIFNpemUoKSBpbnQgewoJcmV0dXJuIHMuY29sbGVjdGlvbi5HZXRJbmRleChjb2xsZWN0aW9uLklESW5kZXgpLlNpemUoKQp9CgovLyBOZXdSZWNvcmQgY3JlYXRlcyBhIG5ldyBzdG9yYWdlIHJlY29yZC4KLy8KLy8gSWYgYSBjdXN0b20gc2NoZW1hIHdpdGggZGVmYXVsdCBmaWVsZCB2YWx1ZXMgaXMgYXNzaWduZWQgdG8KLy8gc3RvcmFnZSBpdCdzIHVzZWQgdG8gYXNzaWduIGluaXRpYWwgZGVmYXVsdCB2YWx1ZXMgd2hlbiBuZXcKLy8gcmVjb3JkcyBhcmUgY3JlYXRlZC4KLy8KLy8gQ3JlYXRpbmcgYSBuZXcgcmVjb3JkIGRvZXNuJ3QgYXNzaWduIGFuIElEIHRvIGl0LCBhIG5ldyBJRAovLyBpcyBnZW5lcmF0ZWQgYW5kIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQgd2hlbiBpdCdzIHNhdmVkIGZvcgovLyB0aGUgZmlyc3QgdGltZS4KZnVuYyAocyBTdG9yYWdlKSBOZXdSZWNvcmQoKSBSZWNvcmQgewoJciA6PSAmcmVjb3JkewoJCXNjaGVtYTogICAgIHMuc2NoZW1hLAoJCWNvbGxlY3Rpb246IHMuY29sbGVjdGlvbiwKCQl2YWx1ZXM6ICAgICBicHRyZWUuTmV3QlBUcmVlMzIoKSwKCX0KCgkvLyBBc3NpZ24gZGVmYXVsdCByZWNvcmQgdmFsdWVzIGlmIHRoZSBzY2hlbWEgZGVmaW5lcyB0aGVtCglmb3IgaSwgbmFtZSA6PSByYW5nZSBzLnNjaGVtYS5GaWVsZHMoKSB7CgkJaWYgdiwgZm91bmQgOj0gcy5zY2hlbWEuR2V0RGVmYXVsdEJ5SW5kZXgoaSk7IGZvdW5kIHsKCQkJci5TZXQobmFtZSwgdikKCQl9Cgl9CglyZXR1cm4gcgp9CgovLyBRdWVyeSByZXR1cm5zIGEgcmVjb3Jkc2V0IHRoYXQgbWF0Y2hlcyB0aGUgcXVlcnkgcGFyYW1ldGVycy4KLy8gQnkgZGVmYXVsdCBxdWVyeSBzZWxlY3RzIHJlY29yZHMgdXNpbmcgdGhlIElEIGluZGV4LgovLwovLyBFeGFtcGxlIHVzYWdlOgovLwovLwkvLyBHZXQgNTAgcmVjb3JkcyBzdGFydGluZyBmcm9tIHRoZSBvbmUgYXQgcG9zaXRpb24gMTAwCi8vCXJzLCBfIDo9IHN0b3JhZ2UuUXVlcnkoCi8vCQlXaXRoT2Zmc2V0KDEwMCksCi8vCQlXaXRoU2l6ZSg1MCksCi8vCSkKLy8KLy8JLy8gSXRlcmF0ZSByZWNvcmRzIHRvIGNyZWF0ZSBhIG5ldyBzbGljZQovLwl2YXIgcmVjb3JkcyBbXVJlY29yZAovLwlycy5JdGVyYXRlKGZ1bmMgKHIgUmVjb3JkKSBib29sIHsKLy8JCXJlY29yZHMgPSBhcHBlbmQocmVjb3JkcywgcikKLy8JCXJldHVybiBmYWxzZQovLwl9KQpmdW5jIChzIFN0b3JhZ2UpIFF1ZXJ5KG9wdGlvbnMgLi4uUXVlcnlPcHRpb24pIChSZWNvcmRzZXQsIGVycm9yKSB7CgkvLyBJbml0aWFsaXplIHRoZSByZWNvcmRzZXQgZm9yIHRoZSBxdWVyeQoJcnMgOj0gcmVjb3Jkc2V0ewoJCXF1ZXJ5OiAgIGRlZmF1bHRRdWVyeSwKCQlyZWNvcmRzOiBzLmNvbGxlY3Rpb24uR2V0SW5kZXgoY29sbGVjdGlvbi5JREluZGV4KSwKCX0KCglmb3IgXywgYXBwbHkgOj0gcmFuZ2Ugb3B0aW9ucyB7CgkJaWYgZXJyIDo9IGFwcGx5KCZycy5xdWVyeSk7IGVyciAhPSBuaWwgewoJCQlyZXR1cm4gbmlsLCBlcnIKCQl9Cgl9CgoJaW5kZXhOYW1lIDo9IHJzLnF1ZXJ5LkluZGV4TmFtZSgpCglpZiBpbmRleE5hbWUgIT0gY29sbGVjdGlvbi5JREluZGV4IHsKCQkvLyBXaGVuIHVzaW5nIGEgY3VzdG9tIGluZGV4IGdldCB0aGUga2V5cyB0byBnZXQgcmVjb3JkcyBmcm9tIHRoZSBJRCBpbmRleAoJCWtleXMsIGVyciA6PSBzLmdldEluZGV4UmVjb3Jkc0tleXMoaW5kZXhOYW1lLCBycy5xdWVyeS5JbmRleEtleSgpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gbmlsLCBlcnIKCQl9CgoJCS8vIEFkanVzdCB0aGUgbnVtYmVyIG9mIGtleXMgdG8gbWF0Y2ggYXZhaWxhYmxlIHF1ZXJ5IG9wdGlvbnMKCQlpZiBvZmZzZXQgOj0gcnMucXVlcnkuT2Zmc2V0KCk7IG9mZnNldCA+IDAgewoJCQlpZiBvZmZzZXQgPiBsZW4oa2V5cykgewoJCQkJa2V5cyA9IG5pbAoJCQl9IGVsc2UgewoJCQkJa2V5cyA9IGtleXNbb2Zmc2V0Ol0KCQkJfQoJCX0KCgkJaWYgc2l6ZSA6PSBycy5xdWVyeS5TaXplKCk7IHNpemUgPiAwICYmIHNpemUgPCBsZW4oa2V5cykgewoJCQlrZXlzID0ga2V5c1s6c2l6ZV0KCQl9CgoJCXJzLmtleXMgPSBrZXlzCgkJcnMuc2l6ZSA9IGxlbihrZXlzKQoJfSBlbHNlIHsKCQkvLyBXaGVuIHVzaW5nIHRoZSBkZWZhdWx0IElEIGluZGV4IGluaXQgc2l6ZSB3aXRoIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcwoJCXJzLnNpemUgPSBycy5yZWNvcmRzLlNpemUoKQoKCQkvLyBBZGp1c3QgcmVjb3Jkc2V0IHNpemUgdG8gbWF0Y2ggYXZhaWxhYmxlIHF1ZXJ5IG9wdGlvbnMKCQlpZiBvZmZzZXQgOj0gcnMucXVlcnkuT2Zmc2V0KCk7IG9mZnNldCA+IDAgewoJCQlpZiBvZmZzZXQgPiBycy5zaXplIHsKCQkJCXJzLnNpemUgPSAwCgkJCX0gZWxzZSB7CgkJCQlycy5zaXplIC09IG9mZnNldAoJCQl9CgkJfQoKCQlpZiBzaXplIDo9IHJzLnF1ZXJ5LlNpemUoKTsgc2l6ZSA+IDAgJiYgc2l6ZSA8IHJzLnNpemUgewoJCQlycy5zaXplID0gc2l6ZQoJCX0KCX0KCglyZXR1cm4gcnMsIG5pbAp9CgovLyBNdXN0UXVlcnkgcmV0dXJucyBhIHJlY29yZHNldCB0aGF0IG1hdGNoZXMgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgb3IgcGFuaWNzIG9uIGVycm9yLgovLyBCeSBkZWZhdWx0IHF1ZXJ5IHNlbGVjdHMgcmVjb3JkcyB1c2luZyB0aGUgSUQgaW5kZXguCi8vCi8vIEV4YW1wbGUgdXNhZ2U6Ci8vCi8vCS8vIEdldCA1MCByZWNvcmRzIHN0YXJ0aW5nIGZyb20gdGhlIG9uZSBhdCBwb3NpdGlvbiAxMDAKLy8JdmFyIHJlY29yZHMgW11SZWNvcmQKLy8Jc3RvcmFnZS5NdXN0UXVlcnkoCi8vCQlXaXRoT2Zmc2V0KDEwMCksCi8vCQlXaXRoU2l6ZSg1MCksCi8vCSkuSXRlcmF0ZShmdW5jIChyIFJlY29yZCkgYm9vbCB7Ci8vCQlyZWNvcmRzID0gYXBwZW5kKHJlY29yZHMsIHIpCi8vCQlyZXR1cm4gZmFsc2UKLy8JfSkKZnVuYyAocyBTdG9yYWdlKSBNdXN0UXVlcnkob3B0aW9ucyAuLi5RdWVyeU9wdGlvbikgUmVjb3Jkc2V0IHsKCXJzLCBlcnIgOj0gcy5RdWVyeShvcHRpb25zLi4uKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHJzCn0KCi8vIEdldCByZXR1cm5zIHRoZSBmaXJzdCByZWNvcmQgZm91bmQgZm9yIGEga2V5IHdpdGhpbiBhIHN0b3JhZ2UgaW5kZXguCi8vCi8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgc2luZ2xlIHJlY29yZC4gQSBtdWx0aSBpbmRleCB3aWxsCi8vIGFsd2F5cyByZXR1cm4gdGhlIGZpcnN0IHJlY29yZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBjYXNlLgovLyBUbyBnZXQgbXVsdGlwbGUgcmVjb3JkcyBjcmVhdGUgYSBxdWVyeSB1c2luZyBhIGN1c3RvbSBpbmRleCBhbmQga2V5IHZhbHVlCi8vIG9yIHVzZSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGNvbGxlY3Rpb24uCmZ1bmMgKHMgU3RvcmFnZSkgR2V0KGluZGV4TmFtZSwgaW5kZXhLZXkgc3RyaW5nKSAoXyBSZWNvcmQsIGZvdW5kIGJvb2wpIHsKCWl0ZXIgOj0gcy5jb2xsZWN0aW9uLkdldChpbmRleE5hbWUsIGluZGV4S2V5KQoJaWYgaXRlci5OZXh0KCkgewoJCXJldHVybiBpdGVyLlZhbHVlKCkuT2JqLihSZWNvcmQpLCB0cnVlCgl9CglyZXR1cm4gbmlsLCBmYWxzZQp9CgovLyBHZXRCeUlEIHJldHVybnMgYSByZWNvcmQgd2hvc2UgSUQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIElELgpmdW5jIChzIFN0b3JhZ2UpIEdldEJ5SUQoaWQgdWludDY0KSAoXyBSZWNvcmQsIGZvdW5kIGJvb2wpIHsKCWl0ZXIgOj0gcy5jb2xsZWN0aW9uLkdldChjb2xsZWN0aW9uLklESW5kZXgsIHNlcWlkLklEKGlkKS5TdHJpbmcoKSkKCWlmIGl0ZXIuTmV4dCgpIHsKCQlyZXR1cm4gaXRlci5WYWx1ZSgpLk9iai4oUmVjb3JkKSwgdHJ1ZQoJfQoJcmV0dXJuIG5pbCwgZmFsc2UKfQoKLy8gRGVsZXRlIGRlbGV0ZXMgYSByZWNvcmQgZnJvbSB0aGUgc3RvcmFnZS4KZnVuYyAocyBTdG9yYWdlKSBEZWxldGUoaWQgdWludDY0KSBib29sIHsKCXJldHVybiBzLmNvbGxlY3Rpb24uRGVsZXRlKGlkKQp9CgpmdW5jIChzIFN0b3JhZ2UpIGdldEluZGV4UmVjb3Jkc0tleXMoaW5kZXhOYW1lLCBpbmRleEtleSBzdHJpbmcpIChbXXN0cmluZywgZXJyb3IpIHsKCWlkeCA6PSBzLmNvbGxlY3Rpb24uR2V0SW5kZXgoaW5kZXhOYW1lKQoJaWYgaWR4ID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygic3RvcmFnZSBpbmRleCBmb3IgcXVlcnkgbm90IGZvdW5kOiAiICsgaW5kZXhOYW1lKQoJfQoKCWtleXMgOj0gY2FzdElmYWNlVG9SZWNvcmRLZXlzKGlkeC5HZXQoaW5kZXhLZXkpKQoJaWYga2V5cyA9PSBuaWwgewoJCXJldHVybiBuaWwsIGVycm9ycy5OZXcoInVuZXhwZWN0ZWQgc3RvcmFnZSBpbmRleCBrZXkgZm9ybWF0IikKCX0KCXJldHVybiBrZXlzLCBuaWwKfQoKZnVuYyBjYXN0SWZhY2VUb1JlY29yZEtleXModiBpbnRlcmZhY2V7fSkgW11zdHJpbmcgewoJc3dpdGNoIGsgOj0gdi4odHlwZSkgewoJY2FzZSBbXXN0cmluZzoKCQlyZXR1cm4gawoJY2FzZSBzdHJpbmc6CgkJcmV0dXJuIFtdc3RyaW5ne2t9Cgl9CglyZXR1cm4gbmlsCn0KGr4DChNzdG9yYWdlX29wdGlvbnMuZ25vEqYDcGFja2FnZSBkYXRhc3RvcmUKCi8vIFN0b3JhZ2VPcHRpb24gY29uZmlndXJlcyBzdG9yYWdlcy4KdHlwZSBTdG9yYWdlT3B0aW9uIGZ1bmMoKlN0b3JhZ2UpCgovLyBXaXRoU2NoZW1hIGFzc2lnbnMgYSBzY2hlbWEgdG8gdGhlIHN0b3JhZ2UuCmZ1bmMgV2l0aFNjaGVtYShzICpTY2hlbWEpIFN0b3JhZ2VPcHRpb24gewoJcmV0dXJuIGZ1bmMoc3QgKlN0b3JhZ2UpIHsKCQlpZiBzICE9IG5pbCB7CgkJCXN0LnNjaGVtYSA9IHMKCQl9Cgl9Cn0KCi8vIFdpdGhJbmRleCBhc3NpZ25zIGFuIGluZGV4IHRvIHRoZSBzdG9yYWdlLgpmdW5jIFdpdGhJbmRleChpIEluZGV4KSBTdG9yYWdlT3B0aW9uIHsKCXJldHVybiBmdW5jKHN0ICpTdG9yYWdlKSB7CgkJc3QuY29sbGVjdGlvbi5BZGRJbmRleChpLm5hbWUsIGkuZm4sIGkub3B0aW9ucykKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEQiA6JImEgo1MDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAuD8ci37GIv0ELKrMWzCiH/jt7ujOtagyVba2xDkWF7IEkDC3hBaNYqKGyp5b7mIiSjPzNptcRu3X1//rVZyS/eiDVUAS71UW/MgtTY2Izyq3pL8fPk5M6yozyuU3wV12UUdGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data