Transaction executed successfully

Transaction Details

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

Transaction hash
2BB82403FCBA75A2EDD9A48CC11A3F105FDD23E5FF5F055F5E1097F55EB2D54E

Transaction overview

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

Execution summary

TX INDEX
1
Position in block
GAS WANTED
100,000,000
Requested gas limit
GAS USED
61,700,703
Gas consumed
FEE
200000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf24000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cp/WAgoML3ZtLm1fYWRkcGtnEo3WAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLQ1QIKFW1lbWJhX2Rhb19jaGFubmVsc192MhIoZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2Rhb19jaGFubmVsc192MhpPCgtnbm9tb2QudG9tbBJAbW9kdWxlID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW9fY2hhbm5lbHNfdjIiCmdubyA9ICIwLjkiChqW1AIKGW1lbWJhX2Rhb19jaGFubmVsc192Mi5nbm8S99MCcGFja2FnZSBtZW1iYV9kYW9fY2hhbm5lbHNfdjIKCi8vIG1lbWJhX2Rhb19jaGFubmVscyDigJQgU29jaWFsIGZlZWQgcmVhbG0gZm9yIE1lbWJhREFPLgovLwovLyBQcm92aWRlcyBEaXNjb3JkLWxpa2UgY2hhbm5lbHMgd2l0aCB0aHJlYWRzLCByZXBsaWVzLCBhbmQgbW9kZXJhdGlvbi4KLy8gVGhlIFJlbmRlcigpIG91dHB1dCBNVVNUIG1hdGNoIHRoZSByZWdleCBwYXR0ZXJucyBpbiBwYXJzZXIudHMgKGZyb250ZW5kKS4KLy8KLy8gUmVuZGVyKCkgY29udHJhY3QgKGZyb20gcGFyc2VyLnRzKToKLy8KLy8gICBIb21lIOKAlCBSZW5kZXIoIiIpOgovLyAgICAgIyBCb2FyZE5hbWUKLy8gICAgIGRlc2NyaXB0aW9uCi8vICAgICAjIyBDaGFubmVscwovLyAgICAgLSBbI25hbWVdKDpfY2hhbm5lbC9uYW1lKSDwn5OiIChOIHRocmVhZHMpCi8vCi8vICAgQ2hhbm5lbCDigJQgUmVuZGVyKCJjaGFubmVsTmFtZSIpOgovLyAgICAgIyAjY2hhbm5lbE5hbWUKLy8gICAgICMjIyBbVGl0bGVdKDpjaGFubmVsL2lkKQovLyAgICAgYnkgZzFhZGRyLi4uIHwgTiByZXBsaWVzIHwgYmxvY2sgSAovLwovLyAgIFRocmVhZCDigJQgUmVuZGVyKCJjaGFubmVsL2lkIik6Ci8vICAgICAjIFRpdGxlCi8vICAgICBib2R5Ci8vICAgICAtLS0KLy8gICAgICpQb3N0ZWQgYnkgZzFhZGRyIGF0IGJsb2NrIEgqCi8vICAgICAjIyBSZXBsaWVzCi8vICAgICAqKmcxYWRkci4uLioqIChibG9jayBIKQovLyAgICAgcmVwbHkgYm9keQovLyAgICAgLS0tCi8vCi8vICAgQUNMIOKAlCBSZW5kZXIoIl9fYWNsL2NoYW5uZWwiKToKLy8gICAgIHJlYWQ6cm9sZTEscm9sZTIKLy8gICAgIHdyaXRlOnJvbGUxLHJvbGUyLHJvbGUzCi8vICAgICB0eXBlOnRleHQKLy8KLy8gU2VjdXJpdHk6Ci8vICAgLSBPd25lcnNoaXAgc3RhcnRzIHdpdGggdGhlIHB1Ymxpc2hlciBhbmQgbW92ZXMgb25seSBpbiB0d28gc3RlcHM6IHRoZSBvd25lcgovLyAgICAgcHJvcG9zZXMgYSB2YWxpZCBhZGRyZXNzLCB0aGF0IGFkZHJlc3MgYWNjZXB0cywgYW5kIGFjY2VwdGluZyByZW1vdmVzIGV2ZXJ5Ci8vICAgICBncmFudCB0aGUgcHJldmlvdXMgb3duZXIgaGVsZAovLyAgIC0gQWxsIHdyaXRlIG9wZXJhdGlvbnMgcmVxdWlyZSBtZW1iZXJzaGlwIChBZGRNZW1iZXIgYnkgb3duZXIpCi8vICAgLSBQb3N0VGhyZWFkL1Bvc3RSZXBseSBjaGVjayBjYWxsZXIncyByb2xlcyBhZ2FpbnN0IGNoYW5uZWwgV3JpdGVSb2xlcwovLyAgIC0gQ3JlYXRlQ2hhbm5lbC9SZW1vdmVUaHJlYWQgcmVzdHJpY3RlZCB0byBvd25lciBvbmx5Ci8vICAgLSBGbGFnVGhyZWFkIHJlcXVpcmVzIG1lbWJlcnNoaXAgKHByZXZlbnRzIHN5YmlsIGZsYWdnaW5nIGJ5IG5vbi1tZW1iZXJzKQovLyAgIC0gRWRpdFRocmVhZC9EZWxldGVUaHJlYWQgcmVxdWlyZSBtZW1iZXJzaGlwICsgb3JpZ2luYWwgYXV0aG9yIGNoZWNrCi8vCi8vIE1vZGVyYXRpb246IGZsYWcg4oaSIHRocmVzaG9sZCAoMykg4oaSIGF1dG8taGlkZSDihpIgREFPIHZvdGUg4oaSIHJlbW92ZQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2F2bCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIOKUgOKUgCBDb25zdGFudHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpjb25zdCAoCglNYXhQb3N0TGVuICAgICAgICA9IDUwMDAKCU1heFRpdGxlTGVuICAgICAgID0gMjAwCglNYXhDaGFubmVscyAgICAgICA9IDIwCglNYXhUaHJlYWRzUGVyQ2hhbiA9IDUwMAoJRmxhZ1RocmVzaG9sZCAgICAgPSAzIC8vIGZsYWdzIGJlZm9yZSBhdXRvLWhpZGUKCgkvLyBBQUEtMSBCMSDigJQgcmVuZGVyLURvUyBib3VuZHMgZm9yIHJlcGxpZXMgKG1pcnJvcnMgTWF4VGhyZWFkc1BlckNoYW4pLgoJLy8gcmVuZGVyVGhyZWFkIG11c3QgbmV2ZXIgaXRlcmF0ZSB0aGUgbW9ub3RvbmljIHJlcGx5IGNvdW50ZXIgKHBvc3QrZGVsZXRlCgkvLyByZXBseSBzcGFtIHdvdWxkIGluZmxhdGUgaXQgd2l0aG91dCBib3VuZCDihpIgdW5ib3VuZGVkIHJlbmRlciBzY2FuIOKGkgoJLy8gdGhyZWFkIHBlcm1hbmVudGx5IHVucmVuZGVyYWJsZSBwYXN0IG1heEdhc1F1ZXJ5KS4gVGhlIGxpdmUtcmVwbHkgaW5kZXgKCS8vIChyZXBseUxpdmUvcmVwbHlMaXZlSURzKSBjYXBzIHRoZSBsaXZlIHNldCwgYW5kIHJlbmRlclRocmVhZCBwYWdpbmF0ZXMgYQoJLy8gZml4ZWQgd2luZG93IG92ZXIgaXQsIHNvIHJlbmRlciBjb3N0IGlzIGJvdW5kZWQgcmVnYXJkbGVzcyBvZiBjaHVybi4KCU1heFJlcGxpZXNQZXJUaHJlYWQgPSA1MDAgLy8gbGl2ZSAobm9uLWRlbGV0ZWQpIHJlcGxpZXMgcGVyIHRocmVhZAoJUmVwbHlQYWdlU2l6ZSAgICAgICA9IDUwICAvLyByZXBsaWVzIHJlbmRlcmVkIHBlciBwYWdlCikKCi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCnR5cGUgQ2hhbm5lbFR5cGUgc3RyaW5nCgpjb25zdCAoCglDaGFubmVsVGV4dCAgICAgICAgICBDaGFubmVsVHlwZSA9ICJ0ZXh0IgoJQ2hhbm5lbEFubm91bmNlbWVudHMgQ2hhbm5lbFR5cGUgPSAiYW5ub3VuY2VtZW50cyIKCUNoYW5uZWxSZWFkb25seSAgICAgIENoYW5uZWxUeXBlID0gInJlYWRvbmx5IgopCgp0eXBlIENoYW5uZWwgc3RydWN0IHsKCU5hbWUgICAgICAgIHN0cmluZwoJRGVzY3JpcHRpb24gc3RyaW5nCglUeXBlICAgICAgICBDaGFubmVsVHlwZQoJQXJjaGl2ZWQgICAgYm9vbAoJUmVhZFJvbGVzICAgW11zdHJpbmcgLy8gcm9sZXMgdGhhdCBjYW4gcmVhZAoJV3JpdGVSb2xlcyAgW11zdHJpbmcgLy8gcm9sZXMgdGhhdCBjYW4gd3JpdGUKfQoKdHlwZSBUaHJlYWQgc3RydWN0IHsKCUlEICAgICAgICB1aW50NjQKCUNoYW5uZWwgICBzdHJpbmcKCVRpdGxlICAgICBzdHJpbmcKCUJvZHkgICAgICBzdHJpbmcKCUF1dGhvciAgICBhZGRyZXNzCglCbG9ja0ggICAgaW50NjQKCUVkaXRlZCAgICBib29sCglFZGl0ZWRBdCAgaW50NjQKCURlbGV0ZWQgICBib29sCglGbGFnQ291bnQgaW50CglIaWRkZW4gICAgYm9vbAp9Cgp0eXBlIFJlcGx5IHN0cnVjdCB7CglJRCAgICAgICB1aW50NjQKCVRocmVhZElEIHVpbnQ2NAoJQ2hhbm5lbCAgc3RyaW5nCglCb2R5ICAgICBzdHJpbmcKCUF1dGhvciAgIGFkZHJlc3MKCUJsb2NrSCAgIGludDY0CglFZGl0ZWQgICBib29sCn0KCi8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCnZhciAoCgljaGFubmVscyAgICAgICphdmwuVHJlZSAvLyBuYW1lIC0+ICpDaGFubmVsCgl0aHJlYWRzICAgICAgICphdmwuVHJlZSAvLyAiY2hhbm5lbC9pZCIgLT4gKlRocmVhZAoJcmVwbGllcyAgICAgICAqYXZsLlRyZWUgLy8gImNoYW5uZWwvdGhyZWFkSWQvcmVwbHlJZCIgLT4gKlJlcGx5Cgl0aHJlYWRDb3VudCAgICphdmwuVHJlZSAvLyBjaGFubmVsIC0+IHVpbnQ2NCAobmV4dCB0aHJlYWQgSUQsIG1vbm90b25pYykKCXRocmVhZExpdmUgICAgKmF2bC5UcmVlIC8vIGNoYW5uZWwgLT4gdWludDY0IChjdXJyZW50bHkgbGl2ZSAobm9uLWRlbGV0ZWQpIHRocmVhZHMpCgl0aHJlYWRMaXZlSURzICphdmwuVHJlZSAvLyBjaGFubmVsIC0+IFtddWludDY0IChsaXZlIHRocmVhZCBJRHMsIGFzY2VuZGluZykg4oCUIGJvdW5kcyByZW5kZXJDaGFubmVsCglyZXBseUNvdW50ICAgICphdmwuVHJlZSAvLyAiY2hhbm5lbC90aHJlYWRJZCIgLT4gdWludDY0IChuZXh0IHJlcGx5IElELCBtb25vdG9uaWMpCglyZXBseUxpdmUgICAgICphdmwuVHJlZSAvLyAiY2hhbm5lbC90aHJlYWRJZCIgLT4gdWludDY0IChjdXJyZW50bHkgbGl2ZSAobm9uLWRlbGV0ZWQpIHJlcGxpZXMpCglyZXBseUxpdmVJRHMgICphdmwuVHJlZSAvLyAiY2hhbm5lbC90aHJlYWRJZCIgLT4gW111aW50NjQgKGxpdmUgcmVwbHkgSURzLCBhc2NlbmRpbmcpIOKAlCBib3VuZHMgcmVuZGVyVGhyZWFkCgl0aHJlYWRUb21iICAgICphdmwuVHJlZSAvLyBjaGFubmVsIC0+IFtddWludDY0IChzb2Z0LWRlbGV0ZWQgdGhyZWFkIElEcyBhd2FpdGluZyBoYXJkLUdDIHZpYSBTd2VlcFRvbWJzdG9uZXMpIOKAlCBCMgoJZmxhZ3MgICAgICAgICAqYXZsLlRyZWUgLy8gImNoYW5uZWwvdGhyZWFkSWQiIC0+ICphdmwuVHJlZSAoZmxhZ2dlciBhZGRyIC0+IGJvb2wpCgljaGFubmVsT3JkZXIgIFtdc3RyaW5nICAvLyBvcmRlcmVkIGNoYW5uZWwgbmFtZXMKCgkvLyBNZW1iZXJzaGlwOiBhZGRyZXNzIC0+IGNvbW1hLXNlcGFyYXRlZCByb2xlcyAoZS5nLiwgImFkbWluLGRldiIpCgltZW1iZXJzICphdmwuVHJlZQoJbWVtYmVyc2hpcFJldmlzaW9uIHVpbnQ2NAoJcGF1c2VkICBib29sCgkvLyBvd25lciBpcyBzZWVkZWQgYXQgcGFja2FnZSBsb2FkIHdpdGggdGhlIHB1Ymxpc2hpbmcgdHJhbnNhY3Rpb24ncyBzaWduZXIKCS8vIChvbiBnbm9sYW5kLTEgdGhlIHNhbWNyZXcgbmFtZXNwYWNlIG11bHRpc2lnKS4gcGVuZGluZ093bmVyIGlzIGVtcHR5IHVubGVzcwoJLy8gdGhlIG93bmVyIGhhcyBwcm9wb3NlZCBhIHN1Y2Nlc3NvciB0aGF0IGhhcyBub3QgYWNjZXB0ZWQgeWV0LgoJb3duZXIgICAgICAgIGFkZHJlc3MKCXBlbmRpbmdPd25lciBhZGRyZXNzCikKCmZ1bmMgaW5pdCgpIHsKCWNoYW5uZWxzID0gYXZsLk5ld1RyZWUoKQoJdGhyZWFkcyA9IGF2bC5OZXdUcmVlKCkKCXJlcGxpZXMgPSBhdmwuTmV3VHJlZSgpCgl0aHJlYWRDb3VudCA9IGF2bC5OZXdUcmVlKCkKCXRocmVhZExpdmUgPSBhdmwuTmV3VHJlZSgpCgl0aHJlYWRMaXZlSURzID0gYXZsLk5ld1RyZWUoKQoJcmVwbHlDb3VudCA9IGF2bC5OZXdUcmVlKCkKCXJlcGx5TGl2ZSA9IGF2bC5OZXdUcmVlKCkKCXJlcGx5TGl2ZUlEcyA9IGF2bC5OZXdUcmVlKCkKCXRocmVhZFRvbWIgPSBhdmwuTmV3VHJlZSgpCglmbGFncyA9IGF2bC5OZXdUcmVlKCkKCWNoYW5uZWxPcmRlciA9IFtdc3RyaW5ne30KCW1lbWJlcnMgPSBhdmwuTmV3VHJlZSgpCglzZWVkQXV0aG9yaXR5KHVuc2FmZS5PcmlnaW5DYWxsZXIoKSkKCgkvLyBEZWZhdWx0IGNoYW5uZWxzIG1hdGNoaW5nIE1FTUJBX0RBT19DSEFOTkVMUyBpbiBjb25maWcudHMKCWFkZENoYW5uZWwoImdlbmVyYWwiLCAiR2VuZXJhbCBkaXNjdXNzaW9uIGZvciBhbGwgbWVtYmVycyIsIENoYW5uZWxUZXh0LAoJCVtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9LCBbXXN0cmluZ3siYWRtaW4iLCAiZGV2IiwgIm9wcyIsICJtZW1iZXIifSkKCWFkZENoYW5uZWwoImFubm91bmNlbWVudHMiLCAiT2ZmaWNpYWwgTWVtYmFEQU8gYW5ub3VuY2VtZW50cyDigJQgYWRtaW4td3JpdGUtb25seSIsIENoYW5uZWxBbm5vdW5jZW1lbnRzLAoJCVtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9LCBbXXN0cmluZ3siYWRtaW4ifSkKCWFkZENoYW5uZWwoImZlYXR1cmUtcmVxdWVzdHMiLCAiUHJvcG9zZSBhbmQgZGlzY3VzcyBuZXcgZmVhdHVyZXMiLCBDaGFubmVsVGV4dCwKCQlbXXN0cmluZ3siYWRtaW4iLCAiZGV2IiwgIm9wcyIsICJtZW1iZXIifSwgW11zdHJpbmd7ImFkbWluIiwgImRldiIsICJvcHMiLCAibWVtYmVyIn0pCglhZGRDaGFubmVsKCJzdXBwb3J0IiwgIkhlbHAgYW5kIHRyb3VibGVzaG9vdGluZyIsIENoYW5uZWxUZXh0LAoJCVtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9LCBbXXN0cmluZ3siYWRtaW4iLCAiZGV2IiwgIm9wcyIsICJtZW1iZXIifSkKCWFkZENoYW5uZWwoImV4dGVuc2lvbnMiLCAiUGx1Z2luIGFuZCBleHRlbnNpb24gZGV2ZWxvcG1lbnQiLCBDaGFubmVsVGV4dCwKCQlbXXN0cmluZ3siYWRtaW4iLCAiZGV2IiwgIm9wcyIsICJtZW1iZXIifSwgW11zdHJpbmd7ImFkbWluIiwgImRldiIsICJtZW1iZXIifSkKCWFkZENoYW5uZWwoInBhcnRuZXJzaGlwcyIsICJDb2xsYWJvcmF0aW9uIGFuZCBwYXJ0bmVyc2hpcCBwcm9wb3NhbHMiLCBDaGFubmVsVGV4dCwKCQlbXXN0cmluZ3siYWRtaW4iLCAiZGV2IiwgIm9wcyIsICJtZW1iZXIifSwgW11zdHJpbmd7ImFkbWluIiwgImRldiIsICJvcHMiLCAibWVtYmVyIn0pCn0KCi8vIOKUgOKUgCBDaGFubmVsIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jIGFkZENoYW5uZWwobmFtZSwgZGVzY3JpcHRpb24gc3RyaW5nLCBjdHlwZSBDaGFubmVsVHlwZSwgcmVhZFJvbGVzLCB3cml0ZVJvbGVzIFtdc3RyaW5nKSB7CgljaCA6PSAmQ2hhbm5lbHsKCQlOYW1lOiAgICAgICAgbmFtZSwKCQlEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sCgkJVHlwZTogICAgICAgIGN0eXBlLAoJCUFyY2hpdmVkOiAgICBmYWxzZSwKCQlSZWFkUm9sZXM6ICAgcmVhZFJvbGVzLAoJCVdyaXRlUm9sZXM6ICB3cml0ZVJvbGVzLAoJfQoJY2hhbm5lbHMuU2V0KG5hbWUsIGNoKQoJdGhyZWFkQ291bnQuU2V0KG5hbWUsIHVpbnQ2NCgwKSkKCXRocmVhZExpdmUuU2V0KG5hbWUsIHVpbnQ2NCgwKSkKCWNoYW5uZWxPcmRlciA9IGFwcGVuZChjaGFubmVsT3JkZXIsIG5hbWUpCn0KCi8vIHNlZWRBdXRob3JpdHkgZ3JhbnRzIHRoZSBwdWJsaXNoZXIgb3duZXJzaGlwIGFuZCB0aGUgb25seSBpbml0aWFsIGFkbWluIHJvbGUuCmZ1bmMgc2VlZEF1dGhvcml0eShwdWJsaXNoZXIgYWRkcmVzcykgewoJb3duZXIgPSBwdWJsaXNoZXIKCXBlbmRpbmdPd25lciA9ICIiCgltZW1iZXJzLlNldChwdWJsaXNoZXIuU3RyaW5nKCksICJhZG1pbiIpCn0KCi8vIOKUgOKUgCBNZW1iZXJzaGlwIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBBZGRNZW1iZXIgYWRkcyBhbiBhZGRyZXNzIHdpdGggc3BlY2lmaWVkIHJvbGVzLiBPbmx5IHRoZSBvd25lciBjYW4gY2FsbCB0aGlzLgovLyByb2xlcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IChlLmcuLCAiYWRtaW4sZGV2IiBvciAibWVtYmVyIikuCmZ1bmMgQWRkTWVtYmVyKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzLCByb2xlcyBzdHJpbmcpIHsKCWFzc2VydENhbGxlcklzT3duZXIoKQoJaWYgYWRkciA9PSAiIiB7CgkJcGFuaWMoImFkZHJlc3MgY2Fubm90IGJlIGVtcHR5IikKCX0KCWlmIGxlbihyb2xlcykgPT0gMCB7CgkJcGFuaWMoInJvbGVzIGNhbm5vdCBiZSBlbXB0eSIpCgl9CglpZiAhaXNWYWxpZFJvbGVzKHJvbGVzKSB7CgkJcGFuaWMoImludmFsaWQgcm9sZXM6IG11c3QgYmUgY29tbWEtc2VwYXJhdGVkIGFscGhhbnVtZXJpYyBvbmx5IikKCX0KCW1lbWJlcnMuU2V0KGFkZHIuU3RyaW5nKCksIHJvbGVzKQoJbWVtYmVyc2hpcFJldmlzaW9uKysKCgljaGFpbi5FbWl0KCJNZW1iZXJBZGRlZCIsCgkJImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLAoJCSJyb2xlcyIsIHJvbGVzLAoJKQp9CgovLyBSZW1vdmVNZW1iZXIgcmVtb3ZlcyBhbiBhZGRyZXNzIGZyb20gdGhlIG1lbWJlcnNoaXAuIE9ubHkgdGhlIG93bmVyIGNhbiBjYWxsIHRoaXMuCmZ1bmMgUmVtb3ZlTWVtYmVyKGN1ciByZWFsbSwgYWRkciBhZGRyZXNzKSB7Cglhc3NlcnRDYWxsZXJJc093bmVyKCkKCWlmIGFkZHIgPT0gb3duZXIgewoJCXBhbmljKCJjYW5ub3QgcmVtb3ZlIG93bmVyIikKCX0KCWlmIF8sIGV4aXN0cyA6PSBtZW1iZXJzLkdldChhZGRyLlN0cmluZygpKTsgIWV4aXN0cyB7CgkJcGFuaWMoImFkZHJlc3MgaXMgbm90IGEgbWVtYmVyOiAiICsgYWRkci5TdHJpbmcoKSkKCX0KCW1lbWJlcnMuUmVtb3ZlKGFkZHIuU3RyaW5nKCkpCgltZW1iZXJzaGlwUmV2aXNpb24rKwoKCWNoYWluLkVtaXQoIk1lbWJlclJlbW92ZWQiLCAiYWRkcmVzcyIsIGFkZHIuU3RyaW5nKCkpCn0KCi8vIFVwZGF0ZU1lbWJlclJvbGVzIHVwZGF0ZXMgdGhlIHJvbGVzIGZvciBhbiBleGlzdGluZyBtZW1iZXIuIE9ubHkgdGhlIG93bmVyIGNhbiBjYWxsIHRoaXMuCmZ1bmMgVXBkYXRlTWVtYmVyUm9sZXMoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MsIG5ld1JvbGVzIHN0cmluZykgewoJYXNzZXJ0Q2FsbGVySXNPd25lcigpCglpZiBfLCBleGlzdHMgOj0gbWVtYmVycy5HZXQoYWRkci5TdHJpbmcoKSk7ICFleGlzdHMgewoJCXBhbmljKCJhZGRyZXNzIGlzIG5vdCBhIG1lbWJlcjogIiArIGFkZHIuU3RyaW5nKCkpCgl9CglpZiBsZW4obmV3Um9sZXMpID09IDAgewoJCXBhbmljKCJyb2xlcyBjYW5ub3QgYmUgZW1wdHkiKQoJfQoJaWYgIWlzVmFsaWRSb2xlcyhuZXdSb2xlcykgewoJCXBhbmljKCJpbnZhbGlkIHJvbGVzOiBtdXN0IGJlIGNvbW1hLXNlcGFyYXRlZCBhbHBoYW51bWVyaWMgb25seSIpCgl9CgltZW1iZXJzLlNldChhZGRyLlN0cmluZygpLCBuZXdSb2xlcykKCW1lbWJlcnNoaXBSZXZpc2lvbisrCgoJY2hhaW4uRW1pdCgiTWVtYmVyUm9sZXNVcGRhdGVkIiwgImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLCAicm9sZXMiLCBuZXdSb2xlcykKfQoKLy8gUHJvcG9zZU93bmVyIG5hbWVzIGEgc3VjY2Vzc29yIG93bmVyLiBPbmx5IHRoZSBvd25lciBjYW4gY2FsbCB0aGlzLiBOb3RoaW5nIGlzCi8vIGdyYW50ZWQgdW50aWwgdGhlIHN1Y2Nlc3NvciBjYWxscyBBY2NlcHRPd25lcnNoaXA7IGEgbGF0ZXIgcHJvcG9zYWwgcmVwbGFjZXMKLy8gYW4gZWFybGllciBvbmUuCmZ1bmMgUHJvcG9zZU93bmVyKGN1ciByZWFsbSwgbmV3T3duZXIgYWRkcmVzcykgewoJYXNzZXJ0Q2FsbGVySXNPd25lcigpCglpZiAhbmV3T3duZXIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBhZGRyZXNzOiAiICsgbmV3T3duZXIuU3RyaW5nKCkpCgl9CglpZiBuZXdPd25lciA9PSBvd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IG93bmVyIikKCX0KCXBlbmRpbmdPd25lciA9IG5ld093bmVyCgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwUHJvcG9zZWQiLAoJCSJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJwZW5kaW5nT3duZXIiLCBuZXdPd25lci5TdHJpbmcoKSwKCSkKfQoKLy8gQ2FuY2VsUGVuZGluZ093bmVyIHdpdGhkcmF3cyB0aGUgcGVuZGluZyBwcm9wb3NhbC4gT25seSB0aGUgb3duZXIgY2FuIGNhbGwgdGhpcy4KZnVuYyBDYW5jZWxQZW5kaW5nT3duZXIoY3VyIHJlYWxtKSB7Cglhc3NlcnRDYWxsZXJJc093bmVyKCkKCWlmIHBlbmRpbmdPd25lciA9PSAiIiB7CgkJcGFuaWMoIm5vIHBlbmRpbmcgb3duZXIiKQoJfQoJY2FuY2VsbGVkIDo9IHBlbmRpbmdPd25lcgoJcGVuZGluZ093bmVyID0gIiIKCgljaGFpbi5FbWl0KCJPd25lcnNoaXBQcm9wb3NhbENhbmNlbGxlZCIsICJwZW5kaW5nT3duZXIiLCBjYW5jZWxsZWQuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgdGhlIGhhbmRvZmYuIE9ubHkgdGhlIHBlbmRpbmcgb3duZXIgY2FuIGNhbGwgdGhpcywKLy8gc28gYW4gYWRkcmVzcyB0aGF0IGNhbm5vdCBhY3QgaGVyZSBjYW4gbmV2ZXIgYmVjb21lIG93bmVyLiBUaGUgcHJldmlvdXMKLy8gb3duZXIgbG9zZXMgbWVtYmVyc2hpcCBhbmQgZXZlcnkgcm9sZTsgdGhlIG5ldyBvd25lciBrZWVwcyBpdHMgZXhpc3Rpbmcgcm9sZXMKLy8gYW5kIGdhaW5zICJhZG1pbiIuIEl0IGlzIG5vdCBwYXVzZS1nYXRlZCwgbGlrZSB0aGUgb3RoZXIgb3duZXIgb3BlcmF0aW9ucy4KZnVuYyBBY2NlcHRPd25lcnNoaXAoY3VyIHJlYWxtKSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWlmIHBlbmRpbmdPd25lciA9PSAiIiB8fCBjYWxsZXIgIT0gcGVuZGluZ093bmVyIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBjYWxsZXIgIiArIGNhbGxlci5TdHJpbmcoKSArICIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIikKCX0KCXByZXZPd25lciA6PSBvd25lcgoJZXhpc3RpbmdSb2xlcyA6PSBHZXRNZW1iZXJSb2xlcyhjYWxsZXIpCgluZWVkc0FkbWluIDo9ICFoYXNSb2xlKGNhbGxlciwgImFkbWluIikKCgltZW1iZXJzLlJlbW92ZShwcmV2T3duZXIuU3RyaW5nKCkpCglpZiBleGlzdGluZ1JvbGVzID09ICIiIHsKCQltZW1iZXJzLlNldChjYWxsZXIuU3RyaW5nKCksICJhZG1pbiIpCgl9IGVsc2UgaWYgbmVlZHNBZG1pbiB7CgkJbWVtYmVycy5TZXQoY2FsbGVyLlN0cmluZygpLCBleGlzdGluZ1JvbGVzKyIsYWRtaW4iKQoJfQoJb3duZXIgPSBjYWxsZXIKCXBlbmRpbmdPd25lciA9ICIiCgltZW1iZXJzaGlwUmV2aXNpb24rKwoKCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVycmVkIiwKCQkicHJldmlvdXNPd25lciIsIHByZXZPd25lci5TdHJpbmcoKSwKCQkibmV3T3duZXIiLCBjYWxsZXIuU3RyaW5nKCksCgkpCn0KCi8vIFN5bmNNZW1iZXJzIGFsbG93cyB0aGUgb3duZXIgdG8gYmF0Y2gtc3luYyBtZW1iZXJzaGlwIGZyb20gdGhlIERBTy4KLy8gYWRkcmVzc2VzIGFuZCByb2xlc0xpc3QgYXJlIGNvbW1hLXNlcGFyYXRlZCwgd2l0aCByb2xlcyBwaXBlLWRlbGltaXRlZCBwZXIgYWRkcmVzcy4KLy8gRXhhbXBsZTogU3luY01lbWJlcnMoImcxYSxnMWIiLCAiYWRtaW4sZGV2fG1lbWJlciIpCmZ1bmMgU3luY01lbWJlcnMoY3VyIHJlYWxtLCBhZGRyZXNzZXMgc3RyaW5nLCByb2xlc0xpc3Qgc3RyaW5nKSB7Cglhc3NlcnRDYWxsZXJJc093bmVyKCkKCWFkZHJzIDo9IHN0cmluZ3MuU3BsaXQoYWRkcmVzc2VzLCAiLCIpCglyb2xlcyA6PSBzdHJpbmdzLlNwbGl0KHJvbGVzTGlzdCwgInwiKQoJaWYgbGVuKGFkZHJzKSAhPSBsZW4ocm9sZXMpIHsKCQlwYW5pYygiYWRkcmVzc2VzIGFuZCByb2xlcyBjb3VudCBtaXNtYXRjaCIpCgl9CglzeW5jZWQgOj0gMAoJZm9yIGksIGFkZHIgOj0gcmFuZ2UgYWRkcnMgewoJCWFkZHIgPSBzdHJpbmdzLlRyaW1TcGFjZShhZGRyKQoJCWlmIGFkZHIgPT0gIiIgewoJCQljb250aW51ZQoJCX0KCQlyb2xlIDo9IHN0cmluZ3MuVHJpbVNwYWNlKHJvbGVzW2ldKQoJCWlmICFpc1ZhbGlkUm9sZXMocm9sZSkgewoJCQlwYW5pYygiaW52YWxpZCByb2xlcyBpbiBlbnRyeSAiICsgc3RyY29udi5JdG9hKGkpKQoJCX0KCQltZW1iZXJzLlNldChhZGRyLCByb2xlKQoJCXN5bmNlZCsrCgl9CgltZW1iZXJzaGlwUmV2aXNpb24rKwoKCWNoYWluLkVtaXQoIk1lbWJlcnNTeW5jZWQiLCAiY291bnQiLCBzdHJjb252Lkl0b2Eoc3luY2VkKSkKfQoKLy8gUHVyZ2VOb25NZW1iZXJzIHJlbW92ZXMgYWxsIG1lbWJlcnMgbm90IGluIHRoZSBwcm92aWRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KLy8gVGhlIG93bmVyIGlzIG5ldmVyIHB1cmdlZC4KZnVuYyBQdXJnZU5vbk1lbWJlcnMoY3VyIHJlYWxtLCBrZWVwQWRkcmVzc2VzIHN0cmluZykgewoJYXNzZXJ0Q2FsbGVySXNPd25lcigpCglrZWVwIDo9IG1ha2UobWFwW3N0cmluZ11ib29sKQoJZm9yIF8sIGFkZHIgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChrZWVwQWRkcmVzc2VzLCAiLCIpIHsKCQlrZWVwW3N0cmluZ3MuVHJpbVNwYWNlKGFkZHIpXSA9IHRydWUKCX0KCWtlZXBbb3duZXIuU3RyaW5nKCldID0gdHJ1ZSAvLyBvd25lciBpcyBuZXZlciBwdXJnZWQKCXZhciB0b1JlbW92ZSBbXXN0cmluZwoJbWVtYmVycy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBfIGludGVyZmFjZXt9KSBib29sIHsKCQlpZiAha2VlcFtrZXldIHsKCQkJdG9SZW1vdmUgPSBhcHBlbmQodG9SZW1vdmUsIGtleSkKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJZm9yIF8sIGFkZHIgOj0gcmFuZ2UgdG9SZW1vdmUgewoJCW1lbWJlcnMuUmVtb3ZlKGFkZHIpCgl9CgltZW1iZXJzaGlwUmV2aXNpb24rKwoKCWNoYWluLkVtaXQoIk1lbWJlcnNQdXJnZWQiLCAiY291bnQiLCBzdHJjb252Lkl0b2EobGVuKHRvUmVtb3ZlKSkpCn0KCi8vIElzTWVtYmVyIHJldHVybnMgd2hldGhlciBhbiBhZGRyZXNzIGlzIGEgbWVtYmVyLgpmdW5jIElzTWVtYmVyKGFkZHIgYWRkcmVzcykgYm9vbCB7CglfLCBleGlzdHMgOj0gbWVtYmVycy5HZXQoYWRkci5TdHJpbmcoKSkKCXJldHVybiBleGlzdHMKfQoKLy8gR2V0TWVtYmVyUm9sZXMgcmV0dXJucyB0aGUgcm9sZXMgZm9yIGEgbWVtYmVyIChjb21tYS1zZXBhcmF0ZWQpIG9yIGVtcHR5IHN0cmluZy4KZnVuYyBHZXRNZW1iZXJSb2xlcyhhZGRyIGFkZHJlc3MpIHN0cmluZyB7Cgl2YWwsIGV4aXN0cyA6PSBtZW1iZXJzLkdldChhZGRyLlN0cmluZygpKQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gdmFsLihzdHJpbmcpCn0KCi8vIEdldE1lbWJlckNvdW50IGxldHMgdGhlIGdvdmVybmFuY2UgYWRhcHRlciBkZXRlY3QgdW5yZWxhdGVkIG1lbWJlcnNoaXAKLy8gY2hhbmdlcyBiZWZvcmUgY29uc3VtaW5nIGEgdm90ZWQgYWN0aW9uLgpmdW5jIEdldE1lbWJlckNvdW50KCkgaW50IHsgcmV0dXJuIG1lbWJlcnMuU2l6ZSgpIH0KCi8vIEdldE1lbWJlcnNoaXBSZXZpc2lvbiBjaGFuZ2VzIGZvciBldmVyeSBvd25lci1jb250cm9sbGVkIG1lbWJlcnNoaXAgd3JpdGUsCi8vIGluY2x1ZGluZyByb2xlIHVwZGF0ZXMgYW5kIGJhdGNoIHN5bmNzIHRoYXQgbGVhdmUgdGhlIGNvdW50IHVuY2hhbmdlZC4KZnVuYyBHZXRNZW1iZXJzaGlwUmV2aXNpb24oKSB1aW50NjQgeyByZXR1cm4gbWVtYmVyc2hpcFJldmlzaW9uIH0KCi8vIEdldE93bmVyIHJldHVybnMgdGhlIGN1cnJlbnQgcmVhbG0gb3duZXIgYWRkcmVzcy4KZnVuYyBHZXRPd25lcigpIGFkZHJlc3MgewoJcmV0dXJuIG93bmVyCn0KCi8vIEdldFBlbmRpbmdPd25lciByZXR1cm5zIHRoZSBwcm9wb3NlZCBzdWNjZXNzb3Igb3duZXIsIG9yIGFuIGVtcHR5IGFkZHJlc3MuCmZ1bmMgR2V0UGVuZGluZ093bmVyKCkgYWRkcmVzcyB7CglyZXR1cm4gcGVuZGluZ093bmVyCn0KCi8vIOKUgOKUgCBFbWVyZ2VuY3kgUGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vCi8vIFBhdXNlIHBvbGljeSAoQUFBLTEgQjMg4oCUIG9uZSBwb2xpY3ksIGVuZm9yY2VkIGV2ZXJ5d2hlcmUpOgovLyAgIFdoaWxlIHBhdXNlZCwgZXZlcnkgbWVtYmVyLWZhY2luZyBjb250ZW50IHdyaXRlIGlzIGJsb2NrZWQgdmlhCi8vICAgYXNzZXJ0Tm90UGF1c2VkKCkg4oCUIFBvc3RUaHJlYWQsIFBvc3RSZXBseSwgRWRpdFRocmVhZCwgRGVsZXRlVGhyZWFkL1JlcGx5LAovLyAgIEZsYWdUaHJlYWQsIFJlbW92ZVRocmVhZC9SZXBseSwgYW5kIFN3ZWVwVG9tYnN0b25lcy4KLy8KLy8gICBPd25lci1vbmx5IGdvdmVybmFuY2UgKEFkZE1lbWJlci9SZW1vdmVNZW1iZXIvVXBkYXRlTWVtYmVyUm9sZXMvU3luY01lbWJlcnMvCi8vICAgUHVyZ2VOb25NZW1iZXJzL1Byb3Bvc2VPd25lci9DYW5jZWxQZW5kaW5nT3duZXIvQWNjZXB0T3duZXJzaGlwL0NyZWF0ZUNoYW5uZWwpCi8vICAgaXMgaW50ZW50aW9uYWxseSBOT1QgZ2F0ZWQ6Ci8vICAgcGF1c2UgaGFsdHMgdXNlciBhY3Rpdml0eSBkdXJpbmcgYW4gaW5jaWRlbnQsIGJ1dCB0aGUgb3duZXIgbXVzdCBzdGF5IGFibGUgdG8KLy8gICBmaXggbWVtYmVyc2hpcC9vd25lcnNoaXAgd2hpbGUgcGF1c2VkLiBUaGlzIHJlYWxtIGhvbGRzIG5vIGZ1bmRzLCBzbyB0aGVyZSBpcwovLyAgIG5vIHZhbHVlLWV4aXQgZXhlbXB0aW9uIHRvIGNhcnZlIG91dC4KCmZ1bmMgYXNzZXJ0Tm90UGF1c2VkKCkgewoJaWYgcGF1c2VkIHsKCQlwYW5pYygicmVhbG0gaXMgcGF1c2VkIOKAlCBlbWVyZ2VuY3kgbWFpbnRlbmFuY2UiKQoJfQp9CgpmdW5jIFBhdXNlUmVhbG0oY3VyIHJlYWxtKSB7Cglhc3NlcnRDYWxsZXJJc093bmVyKCkKCXBhdXNlZCA9IHRydWUKCWNoYWluLkVtaXQoIlJlYWxtUGF1c2VkIiwgImJ5Iiwgb3duZXIuU3RyaW5nKCkpCn0KCmZ1bmMgVW5wYXVzZVJlYWxtKGN1ciByZWFsbSkgewoJYXNzZXJ0Q2FsbGVySXNPd25lcigpCglwYXVzZWQgPSBmYWxzZQoJY2hhaW4uRW1pdCgiUmVhbG1VbnBhdXNlZCIsICJieSIsIG93bmVyLlN0cmluZygpKQp9CgpmdW5jIElzUGF1c2VkKCkgYm9vbCB7IHJldHVybiBwYXVzZWQgfQoKLy8g4pSA4pSAIENoYW5uZWwgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFZhbHVlLW9ubHkgcmVhZHMgbGV0IGEgZml4ZWQgZ292ZXJuYW5jZSBhZGFwdGVyIHZlcmlmeSBhIHZvdGVkIGNoYW5uZWwKLy8gY3JlYXRpb24gd2l0aG91dCBleHBvc2luZyB0aGUgbXV0YWJsZSBjaGFubmVsIHJlY29yZC4KZnVuYyBHZXRDaGFubmVsU3RhdGUobmFtZSBzdHJpbmcpIChpbnQsIGJvb2wsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZykgewoJdmFsdWUsIGV4aXN0cyA6PSBjaGFubmVscy5HZXQobmFtZSkKCWlmICFleGlzdHMgeyByZXR1cm4gbGVuKGNoYW5uZWxPcmRlciksIGZhbHNlLCAiIiwgIiIsICIiLCAiIiB9CgljaGFubmVsIDo9IHZhbHVlLigqQ2hhbm5lbCkKCXJldHVybiBsZW4oY2hhbm5lbE9yZGVyKSwgdHJ1ZSwgY2hhbm5lbC5EZXNjcmlwdGlvbiwgc3RyaW5nKGNoYW5uZWwuVHlwZSksIHN0cmluZ3MuSm9pbihjaGFubmVsLlJlYWRSb2xlcywgIiwiKSwgc3RyaW5ncy5Kb2luKGNoYW5uZWwuV3JpdGVSb2xlcywgIiwiKQp9CgovLyBDcmVhdGVDaGFubmVsIGFkZHMgYSBuZXcgY2hhbm5lbC4gT25seSB0aGUgb3duZXIgKGFkbWluKSBjYW4gY3JlYXRlIGNoYW5uZWxzLgpmdW5jIENyZWF0ZUNoYW5uZWwoY3VyIHJlYWxtLCBuYW1lLCBkZXNjcmlwdGlvbiBzdHJpbmcsIGN0eXBlIHN0cmluZykgewoJYXNzZXJ0Q2FsbGVySXNPd25lcigpCgoJaWYgbGVuKGNoYW5uZWxPcmRlcikgPj0gTWF4Q2hhbm5lbHMgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibWF4IGNoYW5uZWxzIHJlYWNoZWQ6ICVkIiwgTWF4Q2hhbm5lbHMpKQoJfQoJaWYgXywgZXhpc3RzIDo9IGNoYW5uZWxzLkdldChuYW1lKTsgZXhpc3RzIHsKCQlwYW5pYygiY2hhbm5lbCBhbHJlYWR5IGV4aXN0czogIiArIG5hbWUpCgl9CglpZiAhaXNWYWxpZENoYW5uZWxOYW1lKG5hbWUpIHsKCQlwYW5pYygiaW52YWxpZCBjaGFubmVsIG5hbWU6IG11c3QgYmUgMS01MCBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb3IgaHlwaGVucywgbm8gbGVhZGluZyB1bmRlcnNjb3JlIikKCX0KCgljdCA6PSBDaGFubmVsVGV4dAoJc3dpdGNoIGN0eXBlIHsKCWNhc2UgImFubm91bmNlbWVudHMiOgoJCWN0ID0gQ2hhbm5lbEFubm91bmNlbWVudHMKCWNhc2UgInJlYWRvbmx5IjoKCQljdCA9IENoYW5uZWxSZWFkb25seQoJfQoKCWFkZENoYW5uZWwobmFtZSwgZGVzY3JpcHRpb24sIGN0LAoJCVtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9LAoJCVtdc3RyaW5neyJhZG1pbiIsICJkZXYiLCAib3BzIiwgIm1lbWJlciJ9KQoKCWNoYWluLkVtaXQoIkNoYW5uZWxDcmVhdGVkIiwgIm5hbWUiLCBuYW1lLCAidHlwZSIsIHN0cmluZyhjdCkpCn0KCi8vIOKUgOKUgCBQb3N0IE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBQb3N0VGhyZWFkIGNyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgY2hhbm5lbC4KLy8gQ2FsbGVyIG11c3QgYmUgYSBtZW1iZXIgd2l0aCBhIHJvbGUgbGlzdGVkIGluIHRoZSBjaGFubmVsJ3MgV3JpdGVSb2xlcy4KZnVuYyBQb3N0VGhyZWFkKGN1ciByZWFsbSwgY2hhbm5lbCwgdGl0bGUsIGJvZHkgc3RyaW5nKSB1aW50NjQgewoJYXNzZXJ0Tm90UGF1c2VkKCkKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoKCS8vIFZhbGlkYXRlIG1lbWJlcnNoaXAgYW5kIGNoYW5uZWwgd3JpdGUgYWNjZXNzCgljaCA6PSBnZXRDaGFubmVsKGNoYW5uZWwpCglhc3NlcnRDYWxsZXJIYXNXcml0ZUFjY2VzcyhjYWxsZXIsIGNoKQoJaWYgY2guQXJjaGl2ZWQgewoJCXBhbmljKCJjaGFubmVsIGlzIGFyY2hpdmVkIikKCX0KCS8vIENhcCBvbiBMSVZFIChub24tZGVsZXRlZCkgdGhyZWFkcyBzbyBkZWxldGVkIHRocmVhZHMgZnJlZSB1cCBzbG90cy4KCWlmIGdldExpdmVUaHJlYWRDb3VudChjaGFubmVsKSA+PSBNYXhUaHJlYWRzUGVyQ2hhbiB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJjaGFubmVsIGxpdmUgdGhyZWFkIGxpbWl0IHJlYWNoZWQ6ICVkIOKAlCBkZWxldGUgb2xkIHRocmVhZHMgdG8gbWFrZSByb29tIiwgTWF4VGhyZWFkc1BlckNoYW4pKQoJfQoJaWYgbGVuKHRpdGxlKSA9PSAwIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJ0aXRsZSBtdXN0IGJlIDEtJWQgY2hhcmFjdGVycyIsIE1heFRpdGxlTGVuKSkKCX0KCWlmIGxlbihib2R5KSA+IE1heFBvc3RMZW4gewoJCXBhbmljKHVmbXQuU3ByaW50ZigiYm9keSB0b28gbG9uZzogJWQvJWQgY2hhcnMiLCBsZW4oYm9keSksIE1heFBvc3RMZW4pKQoJfQoKCS8vIEdldCBuZXh0IElECgluZXh0SUQgOj0gZ2V0VGhyZWFkQ291bnQoY2hhbm5lbCkKCWtleSA6PSBjaGFubmVsICsgIi8iICsgc3RyY29udi5Gb3JtYXRVaW50KG5leHRJRCwgMTApCgoJdCA6PSAmVGhyZWFkewoJCUlEOiAgICAgIG5leHRJRCwKCQlDaGFubmVsOiBjaGFubmVsLAoJCVRpdGxlOiAgIHRpdGxlLAoJCUJvZHk6ICAgIGJvZHksCgkJQXV0aG9yOiAgY2FsbGVyLAoJCUJsb2NrSDogIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCX0KCXRocmVhZHMuU2V0KGtleSwgdCkKCXRocmVhZENvdW50LlNldChjaGFubmVsLCBuZXh0SUQrMSkKCXRocmVhZExpdmUuU2V0KGNoYW5uZWwsIGdldExpdmVUaHJlYWRDb3VudChjaGFubmVsKSsxKQoJYWRkTGl2ZVRocmVhZElEKGNoYW5uZWwsIG5leHRJRCkKCXJlcGx5Q291bnQuU2V0KGtleSwgdWludDY0KDApKQoKCWNoYWluLkVtaXQoIlRocmVhZFBvc3RlZCIsCgkJImNoYW5uZWwiLCBjaGFubmVsLAoJCSJ0aHJlYWRJZCIsIHN0cmNvbnYuRm9ybWF0VWludChuZXh0SUQsIDEwKSwKCQkiYXV0aG9yIiwgY2FsbGVyLlN0cmluZygpLAoJKQoKCXJldHVybiBuZXh0SUQKfQoKLy8gUG9zdFJlcGx5IGFkZHMgYSByZXBseSB0byBhIHRocmVhZC4KLy8gQ2FsbGVyIG11c3QgYmUgYSBtZW1iZXIgd2l0aCBhIHJvbGUgbGlzdGVkIGluIHRoZSBjaGFubmVsJ3MgV3JpdGVSb2xlcy4KZnVuYyBQb3N0UmVwbHkoY3VyIHJlYWxtLCBjaGFubmVsIHN0cmluZywgdGhyZWFkSUQgdWludDY0LCBib2R5IHN0cmluZykgewoJYXNzZXJ0Tm90UGF1c2VkKCkKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoKCS8vIFZhbGlkYXRlIG1lbWJlcnNoaXAgYW5kIGNoYW5uZWwgd3JpdGUgYWNjZXNzCgljaCA6PSBnZXRDaGFubmVsKGNoYW5uZWwpCglhc3NlcnRDYWxsZXJIYXNXcml0ZUFjY2VzcyhjYWxsZXIsIGNoKQoKCXRocmVhZEtleSA6PSBjaGFubmVsICsgIi8iICsgc3RyY29udi5Gb3JtYXRVaW50KHRocmVhZElELCAxMCkKCXR2YWwsIHRleGlzdHMgOj0gdGhyZWFkcy5HZXQodGhyZWFkS2V5KQoJaWYgIXRleGlzdHMgewoJCXBhbmljKCJ0aHJlYWQgbm90IGZvdW5kIikKCX0KCXRocmVhZCA6PSB0dmFsLigqVGhyZWFkKQoJaWYgdGhyZWFkLkRlbGV0ZWQgewoJCXBhbmljKCJjYW5ub3QgcmVwbHkgdG8gYSBkZWxldGVkIHRocmVhZCIpCgl9CglpZiB0aHJlYWQuSGlkZGVuIHsKCQlwYW5pYygiY2Fubm90IHJlcGx5IHRvIGEgaGlkZGVuIHRocmVhZCIpCgl9CgoJaWYgbGVuKGJvZHkpID09IDAgfHwgbGVuKGJvZHkpID4gTWF4UG9zdExlbiB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJyZXBseSBtdXN0IGJlIDEtJWQgY2hhcmFjdGVycyIsIE1heFBvc3RMZW4pKQoJfQoKCS8vIEIxOiBib3VuZCB0aGUgTElWRSByZXBseSBzZXQgc28gcmVuZGVyVGhyZWFkIHN0YXlzIHVuZGVyIHRoZSBnYXMgYnVkZ2V0LgoJLy8gRGVsZXRpbmcgcmVwbGllcyBmcmVlcyBzbG90cyAobWlycm9ycyBNYXhUaHJlYWRzUGVyQ2hhbiAvIGdldExpdmVUaHJlYWRDb3VudCkuCglpZiBnZXRMaXZlUmVwbHlDb3VudCh0aHJlYWRLZXkpID49IE1heFJlcGxpZXNQZXJUaHJlYWQgewoJCXBhbmljKHVmbXQuU3ByaW50ZigidGhyZWFkIHJlcGx5IGxpbWl0IHJlYWNoZWQ6ICVkIOKAlCBvbGRlciByZXBsaWVzIG11c3QgYmUgcmVtb3ZlZCIsIE1heFJlcGxpZXNQZXJUaHJlYWQpKQoJfQoKCW5leHRSZXBseUlEIDo9IGdldFJlcGx5Q291bnQodGhyZWFkS2V5KQoJcmVwbHlLZXkgOj0gdGhyZWFkS2V5ICsgIi8iICsgc3RyY29udi5Gb3JtYXRVaW50KG5leHRSZXBseUlELCAxMCkKCglyIDo9ICZSZXBseXsKCQlJRDogICAgICAgbmV4dFJlcGx5SUQsCgkJVGhyZWFkSUQ6IHRocmVhZElELAoJCUNoYW5uZWw6ICBjaGFubmVsLAoJCUJvZHk6ICAgICBib2R5LAoJCUF1dGhvcjogICBjYWxsZXIsCgkJQmxvY2tIOiAgIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCX0KCXJlcGxpZXMuU2V0KHJlcGx5S2V5LCByKQoJcmVwbHlDb3VudC5TZXQodGhyZWFkS2V5LCBuZXh0UmVwbHlJRCsxKQoJLy8gVHJhY2sgdGhlIGxpdmUgcmVwbHkgc28gcmVuZGVyVGhyZWFkIGl0ZXJhdGVzIG9ubHkgbGl2ZSBJRHMgKGJvdW5kZWQgc2V0KSwKCS8vIG5ldmVyIHRoZSBtb25vdG9uaWMgY291bnRlci4KCWFkZExpdmVSZXBseUlEKHRocmVhZEtleSwgbmV4dFJlcGx5SUQpCglyZXBseUxpdmUuU2V0KHRocmVhZEtleSwgZ2V0TGl2ZVJlcGx5Q291bnQodGhyZWFkS2V5KSsxKQoKCWNoYWluLkVtaXQoIlJlcGx5UG9zdGVkIiwKCQkiY2hhbm5lbCIsIGNoYW5uZWwsCgkJInRocmVhZElkIiwgc3RyY29udi5Gb3JtYXRVaW50KHRocmVhZElELCAxMCksCgkJInJlcGx5SWQiLCBzdHJjb252LkZvcm1hdFVpbnQobmV4dFJlcGx5SUQsIDEwKSwKCQkiYXV0aG9yIiwgY2FsbGVyLlN0cmluZygpLAoJKQp9CgovLyBkcm9wUmVwbHkgaGFyZC1yZW1vdmVzIGEgcmVwbHk6IGRlbGV0ZXMgdGhlIG5vZGUgKHN0b3JhZ2UgcmVjbGFpbWVkIOKAlCBCMiksCi8vIGRyb3BzIGl0IGZyb20gdGhlIGxpdmUgaW5kZXgsIGFuZCBkZWNyZW1lbnRzIHRoZSBsaXZlIGNvdW50LiBTaGFyZWQgYnkKLy8gRGVsZXRlUmVwbHkgYW5kIFJlbW92ZVJlcGx5LiByZW5kZXJUaHJlYWQgb25seSB3YWxrcyB0aGUgbGl2ZSBpbmRleCwgc28gYQovLyByZW1vdmVkIHJlcGx5IGlzIG5ldmVyIGxvb2tlZCB1cCDigJQgbm8gdG9tYnN0b25lIGlzIG5lZWRlZC4KZnVuYyBkcm9wUmVwbHkodGhyZWFkS2V5LCByZXBseUtleSBzdHJpbmcsIHJlcGx5SUQgdWludDY0KSB7CglyZXBsaWVzLlJlbW92ZShyZXBseUtleSkKCXJlbW92ZUxpdmVSZXBseUlEKHRocmVhZEtleSwgcmVwbHlJRCkKCWlmIGxpdmUgOj0gZ2V0TGl2ZVJlcGx5Q291bnQodGhyZWFkS2V5KTsgbGl2ZSA+IDAgewoJCXJlcGx5TGl2ZS5TZXQodGhyZWFkS2V5LCBsaXZlLTEpCgl9Cn0KCi8vIERlbGV0ZVJlcGx5IGxldHMgdGhlIHJlcGx5J3MgYXV0aG9yIGRlbGV0ZSBpdC4gQ2FsbGVyIG11c3QgYmUgYSBtZW1iZXIgYW5kIHRoZQovLyBvcmlnaW5hbCBhdXRob3IuIFRoZSByZXBseSBub2RlIGlzIGhhcmQtcmVtb3ZlZCAoQjIgc3RhdGUtc2hyaW5rKSBhbmQgYSBzbG90IGlzCi8vIGZyZWVkIHVuZGVyIE1heFJlcGxpZXNQZXJUaHJlYWQgKEIxKS4KZnVuYyBEZWxldGVSZXBseShjdXIgcmVhbG0sIGNoYW5uZWwgc3RyaW5nLCB0aHJlYWRJRCwgcmVwbHlJRCB1aW50NjQpIHsKCWFzc2VydE5vdFBhdXNlZCgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWFzc2VydENhbGxlcklzTWVtYmVyKGNhbGxlcikKCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCglyZXBseUtleSA6PSB0aHJlYWRLZXkgKyAiLyIgKyBzdHJjb252LkZvcm1hdFVpbnQocmVwbHlJRCwgMTApCglydmFsLCBleGlzdHMgOj0gcmVwbGllcy5HZXQocmVwbHlLZXkpCglpZiAhZXhpc3RzIHsKCQlwYW5pYygicmVwbHkgbm90IGZvdW5kIikKCX0KCWlmIHJ2YWwuKCpSZXBseSkuQXV0aG9yICE9IGNhbGxlciB7CgkJcGFuaWMoIm9ubHkgdGhlIGF1dGhvciBjYW4gZGVsZXRlIikKCX0KCglkcm9wUmVwbHkodGhyZWFkS2V5LCByZXBseUtleSwgcmVwbHlJRCkKCgljaGFpbi5FbWl0KCJSZXBseURlbGV0ZWQiLAoJCSJjaGFubmVsIiwgY2hhbm5lbCwKCQkidGhyZWFkSWQiLCBzdHJjb252LkZvcm1hdFVpbnQodGhyZWFkSUQsIDEwKSwKCQkicmVwbHlJZCIsIHN0cmNvbnYuRm9ybWF0VWludChyZXBseUlELCAxMCksCgkJImF1dGhvciIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gUmVtb3ZlUmVwbHkgcGVybWFuZW50bHkgcmVtb3ZlcyBhIHJlcGx5IChtb2RlcmF0aW9uIOKAlCBhZG1pbiByb2xlIG9ubHkpLiBIYXJkLQovLyByZW1vdmVzIHRoZSBub2RlIGxpa2UgRGVsZXRlUmVwbHksIGJvdW5kaW5nIHJlbmRlclRocmVhZCAoQjEpICsgcmVjbGFpbWluZwovLyBzdG9yYWdlIChCMikuCmZ1bmMgUmVtb3ZlUmVwbHkoY3VyIHJlYWxtLCBjaGFubmVsIHN0cmluZywgdGhyZWFkSUQsIHJlcGx5SUQgdWludDY0KSB7Cglhc3NlcnRDYWxsZXJJc0FkbWluUm9sZSgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCglyZXBseUtleSA6PSB0aHJlYWRLZXkgKyAiLyIgKyBzdHJjb252LkZvcm1hdFVpbnQocmVwbHlJRCwgMTApCglpZiBfLCBleGlzdHMgOj0gcmVwbGllcy5HZXQocmVwbHlLZXkpOyAhZXhpc3RzIHsKCQlwYW5pYygicmVwbHkgbm90IGZvdW5kIikKCX0KCglkcm9wUmVwbHkodGhyZWFkS2V5LCByZXBseUtleSwgcmVwbHlJRCkKCgljaGFpbi5FbWl0KCJSZXBseVJlbW92ZWQiLAoJCSJjaGFubmVsIiwgY2hhbm5lbCwKCQkidGhyZWFkSWQiLCBzdHJjb252LkZvcm1hdFVpbnQodGhyZWFkSUQsIDEwKSwKCQkicmVwbHlJZCIsIHN0cmNvbnYuRm9ybWF0VWludChyZXBseUlELCAxMCksCgkJImFkbWluIiwgY2FsbGVyLlN0cmluZygpLAoJKQp9CgovLyBFZGl0VGhyZWFkIGFsbG93cyB0aGUgb3JpZ2luYWwgYXV0aG9yIHRvIGVkaXQgdGhlaXIgdGhyZWFkLiBDYWxsZXIgbXVzdCBiZSBhIG1lbWJlci4KZnVuYyBFZGl0VGhyZWFkKGN1ciByZWFsbSwgY2hhbm5lbCBzdHJpbmcsIHRocmVhZElEIHVpbnQ2NCwgbmV3Qm9keSBzdHJpbmcpIHsKCWFzc2VydE5vdFBhdXNlZCgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWFzc2VydENhbGxlcklzTWVtYmVyKGNhbGxlcikKCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCgl2YWwsIGV4aXN0cyA6PSB0aHJlYWRzLkdldCh0aHJlYWRLZXkpCglpZiAhZXhpc3RzIHsKCQlwYW5pYygidGhyZWFkIG5vdCBmb3VuZCIpCgl9CgoJdCA6PSB2YWwuKCpUaHJlYWQpCglpZiB0LkF1dGhvciAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IHRoZSBhdXRob3IgY2FuIGVkaXQiKQoJfQoJaWYgdC5EZWxldGVkIHsKCQlwYW5pYygiY2Fubm90IGVkaXQgYSBkZWxldGVkIHRocmVhZCIpCgl9CglpZiB0LkhpZGRlbiB7CgkJcGFuaWMoImNhbm5vdCBlZGl0IGEgaGlkZGVuIHRocmVhZCIpCgl9CglpZiBsZW4obmV3Qm9keSkgPiBNYXhQb3N0TGVuIHsKCQlwYW5pYygiYm9keSB0b28gbG9uZyIpCgl9CgoJdC5Cb2R5ID0gbmV3Qm9keQoJdC5FZGl0ZWQgPSB0cnVlCgl0LkVkaXRlZEF0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCgl0aHJlYWRzLlNldCh0aHJlYWRLZXksIHQpCgoJY2hhaW4uRW1pdCgiVGhyZWFkRWRpdGVkIiwKCQkiY2hhbm5lbCIsIGNoYW5uZWwsCgkJInRocmVhZElkIiwgc3RyY29udi5Gb3JtYXRVaW50KHRocmVhZElELCAxMCksCgkJImF1dGhvciIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gRGVsZXRlVGhyZWFkIHNvZnQtZGVsZXRlcyBhIHRocmVhZCAobWFya3MgYXMgZGVsZXRlZCkuIENhbGxlciBtdXN0IGJlIGEgbWVtYmVyIGFuZCB0aGUgb3JpZ2luYWwgYXV0aG9yLgpmdW5jIERlbGV0ZVRocmVhZChjdXIgcmVhbG0sIGNoYW5uZWwgc3RyaW5nLCB0aHJlYWRJRCB1aW50NjQpIHsKCWFzc2VydE5vdFBhdXNlZCgpCgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWFzc2VydENhbGxlcklzTWVtYmVyKGNhbGxlcikKCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCgl2YWwsIGV4aXN0cyA6PSB0aHJlYWRzLkdldCh0aHJlYWRLZXkpCglpZiAhZXhpc3RzIHsKCQlwYW5pYygidGhyZWFkIG5vdCBmb3VuZCIpCgl9CgoJdCA6PSB2YWwuKCpUaHJlYWQpCglpZiB0LkF1dGhvciAhPSBjYWxsZXIgewoJCXBhbmljKCJvbmx5IHRoZSBhdXRob3IgY2FuIGRlbGV0ZSIpCgl9CglpZiB0LkRlbGV0ZWQgewoJCXBhbmljKCJ0aHJlYWQgYWxyZWFkeSBkZWxldGVkIikKCX0KCgl0LkRlbGV0ZWQgPSB0cnVlCgl0LlRpdGxlID0gIltEZWxldGVkXSIKCXQuQm9keSA9ICIiCgl0aHJlYWRzLlNldCh0aHJlYWRLZXksIHQpCgkvLyBGcmVlIGEgc2xvdCBmb3IgbmV3IHRocmVhZHMKCWxpdmUgOj0gZ2V0TGl2ZVRocmVhZENvdW50KGNoYW5uZWwpCglpZiBsaXZlID4gMCB7CgkJdGhyZWFkTGl2ZS5TZXQoY2hhbm5lbCwgbGl2ZS0xKQoJfQoJcmVtb3ZlTGl2ZVRocmVhZElEKGNoYW5uZWwsIHRocmVhZElEKQoJZW5xdWV1ZVRocmVhZFRvbWIoY2hhbm5lbCwgdGhyZWFkSUQpIC8vIEIyOiBxdWV1ZSBmb3IgaGFyZC1HQyB2aWEgU3dlZXBUb21ic3RvbmVzCgoJY2hhaW4uRW1pdCgiVGhyZWFkRGVsZXRlZCIsCgkJImNoYW5uZWwiLCBjaGFubmVsLAoJCSJ0aHJlYWRJZCIsIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApLAoJCSJhdXRob3IiLCBjYWxsZXIuU3RyaW5nKCksCgkpCn0KCi8vIOKUgOKUgCBNb2RlcmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gRmxhZ1RocmVhZCBmbGFncyBhIHRocmVhZCBmb3IgbW9kZXJhdGlvbiByZXZpZXcuCi8vIEFmdGVyIEZsYWdUaHJlc2hvbGQgZmxhZ3MsIHRoZSB0aHJlYWQgaXMgYXV0by1oaWRkZW4uCi8vIENhbGxlciBtdXN0IGJlIGEgbWVtYmVyIChhbnkgcm9sZSkgdG8gZmxhZyBjb250ZW50LgpmdW5jIEZsYWdUaHJlYWQoY3VyIHJlYWxtLCBjaGFubmVsIHN0cmluZywgdGhyZWFkSUQgdWludDY0KSB7Cglhc3NlcnROb3RQYXVzZWQoKQoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglhc3NlcnRDYWxsZXJJc01lbWJlcihjYWxsZXIpCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCgoJdmFsLCBleGlzdHMgOj0gdGhyZWFkcy5HZXQodGhyZWFkS2V5KQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoInRocmVhZCBub3QgZm91bmQiKQoJfQoKCXQgOj0gdmFsLigqVGhyZWFkKQoJaWYgdC5EZWxldGVkIHsKCQlwYW5pYygiY2Fubm90IGZsYWcgYSBkZWxldGVkIHRocmVhZCIpCgl9CglpZiB0LkhpZGRlbiB7CgkJcGFuaWMoInRocmVhZCBpcyBhbHJlYWR5IGhpZGRlbiIpCgl9CgoJLy8gVHJhY2sgdW5pcXVlIGZsYWdnZXJzCgl2YXIgZmxhZ1RyZWUgKmF2bC5UcmVlCglpZiBmdmFsLCBmZXhpc3RzIDo9IGZsYWdzLkdldCh0aHJlYWRLZXkpOyBmZXhpc3RzIHsKCQlmbGFnVHJlZSA9IGZ2YWwuKCphdmwuVHJlZSkKCX0gZWxzZSB7CgkJZmxhZ1RyZWUgPSBhdmwuTmV3VHJlZSgpCgl9CgoJaWYgXywgYWxyZWFkeSA6PSBmbGFnVHJlZS5HZXQoY2FsbGVyLlN0cmluZygpKTsgYWxyZWFkeSB7CgkJcGFuaWMoImFscmVhZHkgZmxhZ2dlZCIpCgl9CglmbGFnVHJlZS5TZXQoY2FsbGVyLlN0cmluZygpLCB0cnVlKQoJZmxhZ3MuU2V0KHRocmVhZEtleSwgZmxhZ1RyZWUpCgoJLy8gVXBkYXRlIHRocmVhZCBmbGFnIGNvdW50IGFuZCBhdXRvLWhpZGUuCgkvLyBEeW5hbWljIHRocmVzaG9sZDogbWF4KEZsYWdUaHJlc2hvbGQsIDUlIG9mIG1lbWJlcnMpLCBzY2FsZXMgd2l0aCBEQU8gc2l6ZS4KCXQuRmxhZ0NvdW50ID0gZmxhZ1RyZWUuU2l6ZSgpCglkeW5hbWljVGhyZXNob2xkIDo9IEZsYWdUaHJlc2hvbGQKCWZpdmVQY3QgOj0gbWVtYmVycy5TaXplKCkgLyAyMAoJaWYgZml2ZVBjdCA+IGR5bmFtaWNUaHJlc2hvbGQgewoJCWR5bmFtaWNUaHJlc2hvbGQgPSBmaXZlUGN0Cgl9Cgl3YXNIaWRkZW4gOj0gdC5IaWRkZW4KCWlmIHQuRmxhZ0NvdW50ID49IGR5bmFtaWNUaHJlc2hvbGQgewoJCXQuSGlkZGVuID0gdHJ1ZQoJfQoJdGhyZWFkcy5TZXQodGhyZWFkS2V5LCB0KQoKCWNoYWluLkVtaXQoIlRocmVhZEZsYWdnZWQiLAoJCSJjaGFubmVsIiwgY2hhbm5lbCwKCQkidGhyZWFkSWQiLCBzdHJjb252LkZvcm1hdFVpbnQodGhyZWFkSUQsIDEwKSwKCQkiZmxhZ2dlciIsIGNhbGxlci5TdHJpbmcoKSwKCQkiZmxhZ0NvdW50Iiwgc3RyY29udi5JdG9hKHQuRmxhZ0NvdW50KSwKCSkKCWlmICF3YXNIaWRkZW4gJiYgdC5IaWRkZW4gewoJCWNoYWluLkVtaXQoIlRocmVhZEF1dG9IaWRkZW4iLAoJCQkiY2hhbm5lbCIsIGNoYW5uZWwsCgkJCSJ0aHJlYWRJZCIsIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApLAoJCSkKCX0KfQoKLy8gVW5oaWRlVGhyZWFkIGFsbG93cyB0aGUgb3duZXIgb3IgYW4gYWRtaW4gdG8gY2xlYXIgZmxhZ3MgYW5kIHVuLWhpZGUgYSB0aHJlYWQuCmZ1bmMgVW5oaWRlVGhyZWFkKGN1ciByZWFsbSwgY2hhbm5lbCBzdHJpbmcsIHRocmVhZElEIHVpbnQ2NCkgewoJYXNzZXJ0Q2FsbGVySXNBZG1pblJvbGUoKQoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCgl0aHJlYWRLZXkgOj0gY2hhbm5lbCArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCgoJdmFsLCBleGlzdHMgOj0gdGhyZWFkcy5HZXQodGhyZWFkS2V5KQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoInRocmVhZCBub3QgZm91bmQiKQoJfQoJdCA6PSB2YWwuKCpUaHJlYWQpCgl0LkhpZGRlbiA9IGZhbHNlCgl0LkZsYWdDb3VudCA9IDAKCXRocmVhZHMuU2V0KHRocmVhZEtleSwgdCkKCS8vIENsZWFyIGZsYWcgdHJlZQoJZmxhZ3MuUmVtb3ZlKHRocmVhZEtleSkKCgljaGFpbi5FbWl0KCJUaHJlYWRVbmhpZGRlbiIsCgkJImNoYW5uZWwiLCBjaGFubmVsLAoJCSJ0aHJlYWRJZCIsIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApLAoJCSJhZG1pbiIsIGNhbGxlci5TdHJpbmcoKSwKCSkKfQoKLy8gUmVtb3ZlVGhyZWFkIHBlcm1hbmVudGx5IHJlbW92ZXMgYSB0aHJlYWQgKG1vZGVyYXRpb24gYWN0aW9uIOKAlCBhZG1pbiByb2xlIG9ubHkpLgpmdW5jIFJlbW92ZVRocmVhZChjdXIgcmVhbG0sIGNoYW5uZWwgc3RyaW5nLCB0aHJlYWRJRCB1aW50NjQpIHsKCWFzc2VydENhbGxlcklzQWRtaW5Sb2xlKCkKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJdGhyZWFkS2V5IDo9IGNoYW5uZWwgKyAiLyIgKyBzdHJjb252LkZvcm1hdFVpbnQodGhyZWFkSUQsIDEwKQoJdmFsLCBleGlzdHMgOj0gdGhyZWFkcy5HZXQodGhyZWFkS2V5KQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoInRocmVhZCBub3QgZm91bmQiKQoJfQoKCXQgOj0gdmFsLigqVGhyZWFkKQoJaWYgIXQuRGVsZXRlZCB7CgkJbGl2ZSA6PSBnZXRMaXZlVGhyZWFkQ291bnQoY2hhbm5lbCkKCQlpZiBsaXZlID4gMCB7CgkJCXRocmVhZExpdmUuU2V0KGNoYW5uZWwsIGxpdmUtMSkKCQl9CgkJcmVtb3ZlTGl2ZVRocmVhZElEKGNoYW5uZWwsIHRocmVhZElEKQoJCWVucXVldWVUaHJlYWRUb21iKGNoYW5uZWwsIHRocmVhZElEKSAvLyBCMjogcXVldWUgZm9yIGhhcmQtR0MgKHNraXAgaWYgYWxyZWFkeSB0b21ic3RvbmVkKQoJfQoJdC5EZWxldGVkID0gdHJ1ZQoJdC5IaWRkZW4gPSB0cnVlCgl0LlRpdGxlID0gIltSZW1vdmVkIGJ5IG1vZGVyYXRpb25dIgoJdC5Cb2R5ID0gIiIKCXRocmVhZHMuU2V0KHRocmVhZEtleSwgdCkKCgljaGFpbi5FbWl0KCJUaHJlYWRSZW1vdmVkIiwKCQkiY2hhbm5lbCIsIGNoYW5uZWwsCgkJInRocmVhZElkIiwgc3RyY29udi5Gb3JtYXRVaW50KHRocmVhZElELCAxMCksCgkJImFkbWluIiwgY2FsbGVyLlN0cmluZygpLAoJKQp9CgovLyBTd2VlcFRvbWJzdG9uZXMgaGFyZC1yZW1vdmVzIHVwIHRvIGBsaW1pdGAgc29mdC1kZWxldGVkIHRocmVhZHMgaW4gYSBjaGFubmVsCi8vIChhbmQgYWxsIG9mIHRoZWlyIHJlbWFpbmluZyByZXBseSBzdGF0ZSksIHJlY2xhaW1pbmcgQVZMIHN0b3JhZ2Ugc28gdGhhdAovLyBwb3N0K2RlbGV0ZSBzcGFtIGNhbiBubyBsb25nZXIgYWNjcmV0ZSBwZXJtYW5lbnQgc3RhdGUgKEIyKS4KLy8KLy8gQWRtaW4gcm9sZSBvbmx5LiBUaGUgY2hhaW4gcmVmdW5kcyB0aGUgc3RvcmFnZSBkZXBvc2l0IG9mIGZyZWVkIGJ5dGVzIHRvIHRoZQovLyB0cmFuc2FjdGlvbiB0aGF0IGZyZWVzIHRoZW0gKGdub2xhbmQtMSByZXN0cmljdHMgbm8gZGVub20pLCBhbmQgYSB0aHJlYWQncwovLyByZW1haW5pbmcgcmVwbGllcyB3ZXJlIHBhaWQgZm9yIGJ5IHRoZWlyIGF1dGhvcnMuIFJlc3RyaWN0aW5nIHRoZSBzd2VlcCBrZWVwcwovLyB0aHJlYWQgYXV0aG9ycyBhbmQgb3V0c2lkZXJzIGZyb20gY29sbGVjdGluZyBvdGhlciBtZW1iZXJzJyBkZXBvc2l0cy4KLy8KLy8gQm91bmRlZCArIGlkZW1wb3RlbnQ6IGVhY2ggc29mdC1kZWxldGVkIHRocmVhZCBob2xkcyBhdCBtb3N0Ci8vIE1heFJlcGxpZXNQZXJUaHJlYWQgcmVwbHkgbm9kZXMsIHNvIGtlZXAgYGxpbWl0YCBzbWFsbCAoMeKAkzUpIHRvIHN0YXkgd2VsbAovLyB3aXRoaW4gYmxvY2sgZ2FzOyByZS1ydW5uaW5nIGRyYWlucyB0aGUgbmV4dCBiYXRjaCBhbmQgc3RvcHMgYXQgMC4KLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgc3dlcHQuCmZ1bmMgU3dlZXBUb21ic3RvbmVzKGN1ciByZWFsbSwgY2hhbm5lbCBzdHJpbmcsIGxpbWl0IGludCkgaW50IHsKCWFzc2VydE5vdFBhdXNlZCgpCglhc3NlcnRDYWxsZXJJc0FkbWluUm9sZSgpCglpZiBsaW1pdCA8PSAwIHsKCQlyZXR1cm4gMAoJfQoKCXRvbWIgOj0gZ2V0VGhyZWFkVG9tYihjaGFubmVsKQoJbiA6PSBsaW1pdAoJaWYgbiA+IGxlbih0b21iKSB7CgkJbiA9IGxlbih0b21iKQoJfQoKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXRocmVhZEtleSA6PSBjaGFubmVsICsgIi8iICsgc3RyY29udi5Gb3JtYXRVaW50KHRvbWJbaV0sIDEwKQoJCS8vIENvbGxlY3QtdGhlbi1yZW1vdmU6IHJlYWQgdGhlIGxpdmUgcmVwbHkgSURzIChhIHN0b3JlZCBzbGljZSkgYW5kIHJlbW92ZQoJCS8vIGVhY2ggcmVwbHkgbm9kZSDigJQgd2UgbmV2ZXIgaXRlcmF0ZSB0aGUgdHJlZSB3ZSBtdXRhdGUgKEFWTCBmb290Z3VuKS4KCQlmb3IgXywgcmlkIDo9IHJhbmdlIGdldExpdmVSZXBseUlEcyh0aHJlYWRLZXkpIHsKCQkJcmVwbGllcy5SZW1vdmUodGhyZWFkS2V5ICsgIi8iICsgc3RyY29udi5Gb3JtYXRVaW50KHJpZCwgMTApKQoJCX0KCQlyZXBseUxpdmVJRHMuUmVtb3ZlKHRocmVhZEtleSkKCQlyZXBseUxpdmUuUmVtb3ZlKHRocmVhZEtleSkKCQlyZXBseUNvdW50LlJlbW92ZSh0aHJlYWRLZXkpCgkJZmxhZ3MuUmVtb3ZlKHRocmVhZEtleSkKCQl0aHJlYWRzLlJlbW92ZSh0aHJlYWRLZXkpCgl9CgoJLy8gRHJvcCB0aGUgcHJvY2Vzc2VkIHByZWZpeDsgY29weSB0aGUgdGFpbCBpbnRvIGEgZnJlc2ggc2xpY2UgdG8gYXZvaWQgYWxpYXNpbmcuCglyZW1haW5pbmcgOj0gYXBwZW5kKFtddWludDY0e30sIHRvbWJbbjpdLi4uKQoJaWYgbGVuKHJlbWFpbmluZykgPT0gMCB7CgkJdGhyZWFkVG9tYi5SZW1vdmUoY2hhbm5lbCkKCX0gZWxzZSB7CgkJdGhyZWFkVG9tYi5TZXQoY2hhbm5lbCwgcmVtYWluaW5nKQoJfQoKCWlmIG4gPiAwIHsKCQljaGFpbi5FbWl0KCJUb21ic3RvbmVzU3dlcHQiLAoJCQkiY2hhbm5lbCIsIGNoYW5uZWwsCgkJCSJjb3VudCIsIHN0cmNvbnYuSXRvYShuKSwKCQkpCgl9CglyZXR1cm4gbgp9CgovLyBHZXRUb21ic3RvbmVDb3VudCByZXR1cm5zIGhvdyBtYW55IHNvZnQtZGVsZXRlZCB0aHJlYWRzIGluIGEgY2hhbm5lbCBhcmUgc3RpbGwKLy8gYXdhaXRpbmcgaGFyZC1HQyAocmVhZC1vbmx5OyBsZXRzIG9wcy9pbmRleGVycyBkZWNpZGUgd2hlbiB0byBjYWxsIFN3ZWVwVG9tYnN0b25lcykuCmZ1bmMgR2V0VG9tYnN0b25lQ291bnQoY2hhbm5lbCBzdHJpbmcpIGludCB7CglyZXR1cm4gbGVuKGdldFRocmVhZFRvbWIoY2hhbm5lbCkpCn0KCi8vIOKUgOKUgCBSZW5kZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8vIENSSVRJQ0FMOiBPdXRwdXQgZm9ybWF0IE1VU1QgbWF0Y2ggcGFyc2VyLnRzIHJlZ2V4IHBhdHRlcm5zLgoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gcmVuZGVySG9tZSgpCgl9CglpZiBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAiX19hY2wvIikgewoJCWNoYW5uZWxOYW1lIDo9IHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAiX19hY2wvIikKCQlyZXR1cm4gcmVuZGVyQUNMKGNoYW5uZWxOYW1lKQoJfQoJaWYgc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgIl9fbWVtYmVyLyIpIHsKCQlhZGRyIDo9IHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAiX19tZW1iZXIvIikKCQlyb2xlcyA6PSBHZXRNZW1iZXJSb2xlcyhhZGRyZXNzKGFkZHIpKQoJCWlmIHJvbGVzID09ICIiIHsKCQkJcmV0dXJuICJub3QgZm91bmQiCgkJfQoJCXJldHVybiAicm9sZXM6IiArIHJvbGVzCgl9CglpZiBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAiX2NoYW5uZWwvIikgewoJCWNoYW5uZWxOYW1lIDo9IHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAiX2NoYW5uZWwvIikKCQlyZXR1cm4gcmVuZGVyQ2hhbm5lbChjaGFubmVsTmFtZSkKCX0KCgkvLyBDaGVjayBmb3IgImNoYW5uZWwvdGhyZWFkSWQiIHBhdHRlcm4sIG9wdGlvbmFsbHkgd2l0aCBhICI/cGFnZT1OIiBzdWZmaXgKCS8vIGZvciByZXBseSBwYWdpbmF0aW9uIChCMSkuCglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0TihwYXRoLCAiLyIsIDIpCglpZiBsZW4ocGFydHMpID09IDIgewoJCWlkUGFydCA6PSBwYXJ0c1sxXQoJCXBhZ2UgOj0gdWludDY0KDApCgkJaWYgcWkgOj0gc3RyaW5ncy5JbmRleEJ5dGUoaWRQYXJ0LCAnPycpOyBxaSA+PSAwIHsKCQkJcGFnZSA9IHBhcnNlUGFnZVF1ZXJ5KGlkUGFydFtxaSsxOl0pCgkJCWlkUGFydCA9IGlkUGFydFs6cWldCgkJfQoJCXRocmVhZElELCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoaWRQYXJ0LCAxMCwgNjQpCgkJaWYgZXJyID09IG5pbCB7CgkJCXJldHVybiByZW5kZXJUaHJlYWQocGFydHNbMF0sIHRocmVhZElELCBwYWdlKQoJCX0KCX0KCgkvLyBUcnkgYXMgY2hhbm5lbCBuYW1lIGRpcmVjdGx5CglpZiBfLCBleGlzdHMgOj0gY2hhbm5lbHMuR2V0KHBhdGgpOyBleGlzdHMgewoJCXJldHVybiByZW5kZXJDaGFubmVsKHBhdGgpCgl9CgoJcmV0dXJuICIjIDQwNFxuUGFnZSBub3QgZm91bmQ6ICIgKyBwYXRoCn0KCi8vIHJlbmRlckhvbWUgcHJvZHVjZXMgdGhlIGJvYXJkIGhvbWUgcGFnZS4KLy8gRm9ybWF0OiBwYXJzZXIudHMgcGFyc2VCb2FyZEhvbWUoKSBleHBlY3RzOgovLyAgIC0gWyNuYW1lXSg6X2NoYW5uZWwvbmFtZSkg8J+ToiAoTiB0aHJlYWRzKQpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgTWVtYmFEQU8gQ2hhbm5lbHNcblxuIikKCXNiLldyaXRlU3RyaW5nKCJDb21tdW5pdHkgZGlzY3Vzc2lvbiBjaGFubmVscyBmb3IgdGhlIE1lbWJhIGVjb3N5c3RlbS5cblxuIikKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKipPd25lcjoqKiAlcyB8ICoqTWVtYmVyczoqKiAlZFxuXG4iLCBvd25lciwgbWVtYmVycy5TaXplKCkpKQoJc2IuV3JpdGVTdHJpbmcoIiMjIENoYW5uZWxzXG5cbiIpCgoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgY2hhbm5lbE9yZGVyIHsKCQl2YWwsIGV4aXN0cyA6PSBjaGFubmVscy5HZXQobmFtZSkKCQlpZiAhZXhpc3RzIHsKCQkJY29udGludWUKCQl9CgkJY2ggOj0gdmFsLigqQ2hhbm5lbCkKCQlpZiBjaC5BcmNoaXZlZCB7CgkJCWNvbnRpbnVlCgkJfQoKCQljb3VudCA6PSBnZXRUaHJlYWRDb3VudChuYW1lKQoJCXR5cGVJY29uIDo9ICIiCgkJc3dpdGNoIGNoLlR5cGUgewoJCWNhc2UgQ2hhbm5lbEFubm91bmNlbWVudHM6CgkJCXR5cGVJY29uID0gIiDwn5OiIgoJCWNhc2UgQ2hhbm5lbFJlYWRvbmx5OgoJCQl0eXBlSWNvbiA9ICIg8J+UkiIKCQl9CgoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiLSBbIyVzXSg6X2NoYW5uZWwvJXMpJXMgKCVkIHRocmVhZHMpXG4iLAoJCQluYW1lLCBuYW1lLCB0eXBlSWNvbiwgY291bnQpKQoJfQoKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyByZW5kZXJDaGFubmVsIHByb2R1Y2VzIGEgY2hhbm5lbCdzIHRocmVhZCBsaXN0LgovLyBGb3JtYXQ6IHBhcnNlci50cyBwYXJzZVRocmVhZExpc3QoKSBleHBlY3RzOgovLyAgICMjIyBbVGl0bGVdKDpjaGFubmVsL2lkKQovLyAgIGJ5IGcxYWRkci4uLiB8IE4gcmVwbGllcyB8IGJsb2NrIEgKZnVuYyByZW5kZXJDaGFubmVsKGNoYW5uZWxOYW1lIHN0cmluZykgc3RyaW5nIHsKCWlmIF8sIGV4aXN0cyA6PSBjaGFubmVscy5HZXQoY2hhbm5lbE5hbWUpOyAhZXhpc3RzIHsKCQlyZXR1cm4gIiMgNDA0XG5DaGFubmVsIG5vdCBmb3VuZDogIiArIGNoYW5uZWxOYW1lCgl9CgoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjICMlc1xuXG4iLCBjaGFubmVsTmFtZSkpCgoJLy8gSXRlcmF0ZSB0aGUgTElWRSB0aHJlYWQtSUQgaW5kZXggKGJvdW5kZWQgYnkgZ2V0TGl2ZVRocmVhZENvdW50KSwgbmV3ZXN0CgkvLyBmaXJzdC4gTmV2ZXIgbG9vcCBvdmVyIHRoZSBtb25vdG9uaWMgdGhyZWFkQ291bnQg4oCUIGEgcG9zdCtkZWxldGUgc3BhbQoJLy8gbG9vcCBpbmZsYXRlcyBpdCB3aXRob3V0IGJvdW5kIChnYXMgRG9TKTsgZGVsZXRlZCBJRHMgYXJlIG5vdCBpbiB0aGlzIGluZGV4LgoJaWRzIDo9IGdldExpdmVUaHJlYWRJRHMoY2hhbm5lbE5hbWUpCglpZiBsZW4oaWRzKSA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiKk5vIHRocmVhZHMgeWV0LiBCZSB0aGUgZmlyc3QgdG8gcG9zdCEqXG4iKQoJCXJldHVybiBzYi5TdHJpbmcoKQoJfQoKCWZvciBpIDo9IGxlbihpZHMpIC0gMTsgaSA+PSAwOyBpLS0gewoJCXRocmVhZEtleSA6PSBjaGFubmVsTmFtZSArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludChpZHNbaV0sIDEwKQoJCXZhbCwgZXhpc3RzIDo9IHRocmVhZHMuR2V0KHRocmVhZEtleSkKCQlpZiAhZXhpc3RzIHsKCQkJY29udGludWUKCQl9CgkJdCA6PSB2YWwuKCpUaHJlYWQpCgkJaWYgdC5IaWRkZW4gfHwgdC5EZWxldGVkIHsKCQkJY29udGludWUKCQl9CgoJCS8vIENvdW50IGxpdmUgKG5vbi1kZWxldGVkKSByZXBsaWVzIOKAlCBtYXRjaGVzIHdoYXQgcmVuZGVyVGhyZWFkIHNob3dzLgoJCXJDb3VudCA6PSBnZXRMaXZlUmVwbHlDb3VudCh0aHJlYWRLZXkpCgkJYXV0aG9yU3RyIDo9IHRydW5jQWRkcih0LkF1dGhvcikKCgkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjIyMgWyVzXSg6JXMvJWQpXG4iLCBzYW5pdGl6ZUZvclJlbmRlcih0LlRpdGxlKSwgY2hhbm5lbE5hbWUsIHQuSUQpKQoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiYnkgJXMgfCAlZCByZXBsaWVzIHwgYmxvY2sgJWRcblxuIiwgYXV0aG9yU3RyLCByQ291bnQsIHQuQmxvY2tIKSkKCX0KCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gcmVuZGVyVGhyZWFkIHByb2R1Y2VzIGEgc2luZ2xlIHRocmVhZCB3aXRoIHJlcGxpZXMuCi8vIEZvcm1hdDogcGFyc2VyLnRzIHBhcnNlVGhyZWFkRGV0YWlsKCkgZXhwZWN0czoKLy8gICAjIFRpdGxlCi8vICAgYm9keQovLyAgIC0tLQovLyAgICpQb3N0ZWQgYnkgZzFhZGRyIGF0IGJsb2NrIEgqICooZWRpdGVkIGF0IGJsb2NrIE0pKgovLyAgICMjIFJlcGxpZXMKLy8gICAqKmcxYWRkci4uLioqIChibG9jayBIKSAqKGVkaXRlZCkqCi8vICAgcmVwbHkgYm9keQovLyAgIC0tLQpmdW5jIHJlbmRlclRocmVhZChjaGFubmVsTmFtZSBzdHJpbmcsIHRocmVhZElELCBwYWdlIHVpbnQ2NCkgc3RyaW5nIHsKCXRocmVhZEtleSA6PSBjaGFubmVsTmFtZSArICIvIiArIHN0cmNvbnYuRm9ybWF0VWludCh0aHJlYWRJRCwgMTApCgl2YWwsIGV4aXN0cyA6PSB0aHJlYWRzLkdldCh0aHJlYWRLZXkpCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gIiMgNDA0XG5UaHJlYWQgbm90IGZvdW5kIgoJfQoKCXQgOj0gdmFsLigqVGhyZWFkKQoKCS8vIFN1cHByZXNzIGNvbnRlbnQgZm9yIGhpZGRlbiAoZmxhZy1hdXRvLWhpZGRlbiBvciBhZG1pbi1oaWRkZW4pIGFuZAoJLy8gc29mdC1kZWxldGVkIHRocmVhZHMuIHJlbmRlckNoYW5uZWwgb21pdHMgdGhlc2UgZnJvbSB0aGUgbGlzdCwgYnV0IHRoZQoJLy8gZGlyZWN0IHBhdGggUmVuZGVyKCJjaGFubmVsL2lkIikgbXVzdCBub3QgbGVhayB0aGUgb3JpZ2luYWwgdGl0bGUvYm9keS4KCWlmIHQuSGlkZGVuIHx8IHQuRGVsZXRlZCB7CgkJcmV0dXJuICIjIFRocmVhZCB1bmF2YWlsYWJsZVxuXG4qVGhpcyB0aHJlYWQgaGFzIGJlZW4gaGlkZGVuIG9yIHJlbW92ZWQuKlxuIgoJfQoKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIyAlc1xuXG4iLCBzYW5pdGl6ZUZvclJlbmRlcih0LlRpdGxlKSkpCglzYi5Xcml0ZVN0cmluZyhzYW5pdGl6ZUZvclJlbmRlcih0LkJvZHkpICsgIlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0tLVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqUG9zdGVkIGJ5ICVzIGF0IGJsb2NrICVkKiIsIHN0cmluZyh0LkF1dGhvciksIHQuQmxvY2tIKSkKCWlmIHQuRWRpdGVkIHsKCQlzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiAqKGVkaXRlZCBhdCBibG9jayAlZCkqIiwgdC5FZGl0ZWRBdCkpCgl9CglzYi5Xcml0ZVN0cmluZygiXG5cbiIpCgoJLy8gQjE6IHJlbmRlciBvbmx5IExJVkUgcmVwbGllcyAoYm91bmRlZCBieSBNYXhSZXBsaWVzUGVyVGhyZWFkKSwgcGFnaW5hdGVkIHRvCgkvLyBhIGZpeGVkIHdpbmRvdyBzbyByZW5kZXIgY29zdCBpcyBPKFJlcGx5UGFnZVNpemUpIHJlZ2FyZGxlc3Mgb2YgdG90YWwgY2h1cm4uCgkvLyBOZXZlciBpdGVyYXRlIHRoZSBtb25vdG9uaWMgcmVwbHlDb3VudCDigJQgdGhhdCBpcyB0aGUgcmVuZGVyLURvUyBzdXJmYWNlLgoJbGl2ZUlEcyA6PSBnZXRMaXZlUmVwbHlJRHModGhyZWFkS2V5KSAvLyBhc2NlbmRpbmcgKG9sZGVzdOKGkm5ld2VzdCksIDw9IE1heFJlcGxpZXNQZXJUaHJlYWQKCXRvdGFsIDo9IHVpbnQ2NChsZW4obGl2ZUlEcykpCglpZiB0b3RhbCA+IDAgewoJCXRvdGFsUGFnZXMgOj0gKHRvdGFsICsgUmVwbHlQYWdlU2l6ZSAtIDEpIC8gUmVwbHlQYWdlU2l6ZQoJCS8vIHBhZ2UgMSA9IG9sZGVzdCB3aW5kb3cg4oCmIHRvdGFsUGFnZXMgPSBuZXdlc3QuIERlZmF1bHQgKDApIGFuZCBhbnkKCQkvLyBvdXQtb2YtcmFuZ2UgdmFsdWUgc25hcCB0byB0aGUgbmV3ZXN0IHBhZ2UgKG1vc3QtcmVjZW50IHJlcGxpZXMpLgoJCWlmIHBhZ2UgPT0gMCB8fCBwYWdlID4gdG90YWxQYWdlcyB7CgkJCXBhZ2UgPSB0b3RhbFBhZ2VzCgkJfQoJCXN0YXJ0IDo9IChwYWdlIC0gMSkgKiBSZXBseVBhZ2VTaXplCgkJZW5kIDo9IHN0YXJ0ICsgUmVwbHlQYWdlU2l6ZQoJCWlmIGVuZCA+IHRvdGFsIHsKCQkJZW5kID0gdG90YWwKCQl9CgoJCXNiLldyaXRlU3RyaW5nKCIjIyBSZXBsaWVzXG5cbiIpCgkJaWYgdG90YWxQYWdlcyA+IDEgewoJCQlzYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoCgkJCQkiKlNob3dpbmcgJWTigJMlZCBvZiAlZCDigKIgcGFnZSAlZC8lZCDigJQgb2xkZXI6IGA/cGFnZT0lZGAsIG5ld2VyOiBgP3BhZ2U9JWRgKlxuXG4iLAoJCQkJc3RhcnQrMSwgZW5kLCB0b3RhbCwgcGFnZSwgdG90YWxQYWdlcywgcGFnZUNsYW1wKHBhZ2UtMSwgdG90YWxQYWdlcyksIHBhZ2VDbGFtcChwYWdlKzEsIHRvdGFsUGFnZXMpKSkKCQl9CgoJCWZvciBpIDo9IHN0YXJ0OyBpIDwgZW5kOyBpKysgewoJCQlyZXBseUtleSA6PSB0aHJlYWRLZXkgKyAiLyIgKyBzdHJjb252LkZvcm1hdFVpbnQobGl2ZUlEc1tpXSwgMTApCgkJCXJ2YWwsIHJleGlzdHMgOj0gcmVwbGllcy5HZXQocmVwbHlLZXkpCgkJCWlmICFyZXhpc3RzIHsKCQkJCWNvbnRpbnVlIC8vIGxpdmUgaW5kZXggbmV2ZXIgcG9pbnRzIGF0IGEgcmVtb3ZlZCByZXBseSwgYnV0IHN0YXkgc2FmZQoJCQl9CgkJCXIgOj0gcnZhbC4oKlJlcGx5KQoJCQlhdXRob3JTdHIgOj0gdHJ1bmNBZGRyKHIuQXV0aG9yKQoJCQllZGl0U3RyIDo9ICIiCgkJCWlmIHIuRWRpdGVkIHsKCQkJCWVkaXRTdHIgPSAiICooZWRpdGVkKSoiCgkJCX0KCQkJc2IuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqKiVzKiogKGJsb2NrICVkKSVzXG5cbiIsIGF1dGhvclN0ciwgci5CbG9ja0gsIGVkaXRTdHIpKQoJCQlzYi5Xcml0ZVN0cmluZyhzYW5pdGl6ZUZvclJlbmRlcihyLkJvZHkpICsgIlxuXG4iKQoJCQlzYi5Xcml0ZVN0cmluZygiLS0tXG5cbiIpCgkJfQoJfQoKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBwYXJzZVBhZ2VRdWVyeSBleHRyYWN0cyB0aGUgcGFnZSBudW1iZXIgZnJvbSBhICI/cGFnZT1OIiBxdWVyeSBzdHJpbmcgKGFsc28KLy8gdG9sZXJhdGVzIGV4dHJhICYtc2VwYXJhdGVkIHBhcmFtcykuIFJldHVybnMgMCAoPSBkZWZhdWx0L25ld2VzdCkgb24gYWJzZW5jZQovLyBvciBwYXJzZSBlcnJvci4KZnVuYyBwYXJzZVBhZ2VRdWVyeShxIHN0cmluZykgdWludDY0IHsKCWZvciBfLCBrdiA6PSByYW5nZSBzdHJpbmdzLlNwbGl0KHEsICImIikgewoJCWlmIHN0cmluZ3MuSGFzUHJlZml4KGt2LCAicGFnZT0iKSB7CgkJCWlmIG4sIGVyciA6PSBzdHJjb252LlBhcnNlVWludChzdHJpbmdzLlRyaW1QcmVmaXgoa3YsICJwYWdlPSIpLCAxMCwgNjQpOyBlcnIgPT0gbmlsIHsKCQkJCXJldHVybiBuCgkJCX0KCQl9Cgl9CglyZXR1cm4gMAp9CgovLyBwYWdlQ2xhbXAga2VlcHMgYSBwYWdlIGxpbmsgd2l0aGluIFsxLCB0b3RhbFBhZ2VzXS4KZnVuYyBwYWdlQ2xhbXAocCwgdG90YWxQYWdlcyB1aW50NjQpIHVpbnQ2NCB7CglpZiBwIDwgMSB7CgkJcmV0dXJuIDEKCX0KCWlmIHAgPiB0b3RhbFBhZ2VzIHsKCQlyZXR1cm4gdG90YWxQYWdlcwoJfQoJcmV0dXJuIHAKfQoKLy8gcmVuZGVyQUNMIHByb2R1Y2VzIHRoZSBBQ0wgcmVzcG9uc2UgZm9yIGEgY2hhbm5lbC4KLy8gRm9ybWF0OiBwYXJzZXIudHMgcGFyc2VBQ0woKSBleHBlY3RzOgovLyAgIHJlYWQ6cm9sZTEscm9sZTIKLy8gICB3cml0ZTpyb2xlMSxyb2xlMixyb2xlMwovLyAgIHR5cGU6dGV4dApmdW5jIHJlbmRlckFDTChjaGFubmVsTmFtZSBzdHJpbmcpIHN0cmluZyB7Cgl2YWwsIGV4aXN0cyA6PSBjaGFubmVscy5HZXQoY2hhbm5lbE5hbWUpCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gIm5vdCBmb3VuZCIKCX0KCWNoIDo9IHZhbC4oKkNoYW5uZWwpCgoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoInJlYWQ6IiArIHN0cmluZ3MuSm9pbihjaC5SZWFkUm9sZXMsICIsIikgKyAiXG4iKQoJc2IuV3JpdGVTdHJpbmcoIndyaXRlOiIgKyBzdHJpbmdzLkpvaW4oY2guV3JpdGVSb2xlcywgIiwiKSArICJcbiIpCglzYi5Xcml0ZVN0cmluZygidHlwZToiICsgc3RyaW5nKGNoLlR5cGUpICsgIlxuIikKCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpmdW5jIGdldENoYW5uZWwobmFtZSBzdHJpbmcpICpDaGFubmVsIHsKCXZhbCwgZXhpc3RzIDo9IGNoYW5uZWxzLkdldChuYW1lKQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoImNoYW5uZWwgbm90IGZvdW5kOiAiICsgbmFtZSkKCX0KCXJldHVybiB2YWwuKCpDaGFubmVsKQp9CgpmdW5jIGdldFRocmVhZENvdW50KGNoYW5uZWwgc3RyaW5nKSB1aW50NjQgewoJdmFsLCBleGlzdHMgOj0gdGhyZWFkQ291bnQuR2V0KGNoYW5uZWwpCglpZiAhZXhpc3RzIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHZhbC4odWludDY0KQp9CgovLyBnZXRMaXZlVGhyZWFkQ291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vbi1kZWxldGVkIHRocmVhZHMgaW4gYSBjaGFubmVsLgovLyBVbmxpa2UgZ2V0VGhyZWFkQ291bnQgKG1vbm90b25pYyBJRCBjb3VudGVyKSwgdGhpcyBkZWNyZWFzZXMgd2hlbiB0aHJlYWRzCi8vIGFyZSBkZWxldGVkLCBzbyBkZWxldGVkIHRocmVhZHMgZnJlZSB1cCBzbG90cyB1bmRlciBNYXhUaHJlYWRzUGVyQ2hhbi4KZnVuYyBnZXRMaXZlVGhyZWFkQ291bnQoY2hhbm5lbCBzdHJpbmcpIHVpbnQ2NCB7Cgl2YWwsIGV4aXN0cyA6PSB0aHJlYWRMaXZlLkdldChjaGFubmVsKQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2YWwuKHVpbnQ2NCkKfQoKLy8g4pSA4pSAIExpdmUgdGhyZWFkLUlEIGluZGV4IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyByZW5kZXJDaGFubmVsIG11c3QgaXRlcmF0ZSBvbmx5IGxpdmUgKG5vbi1kZWxldGVkKSB0aHJlYWQgSURzLCBuZXZlciB0aGUKLy8gbW9ub3RvbmljIHRocmVhZENvdW50OiBhIG1lbWJlciBjYW4gcG9zdCtkZWxldGUgaW4gYSBsb29wIHRvIGluZmxhdGUKLy8gdGhyZWFkQ291bnQgd2l0aG91dCBib3VuZCAodGhlIGxpdmUgY2FwIG9ubHkgbGltaXRzIGxpdmUgdGhyZWFkcyksIHR1cm5pbmcKLy8gcmVuZGVyQ2hhbm5lbCBpbnRvIGFuIHVuYm91bmRlZCBPKHRocmVhZENvdW50KSBzY2FuIChnYXMgRG9TKS4gVGhpcyBpbmRleAovLyBzdGF5cyBib3VuZGVkIGJ5IGdldExpdmVUaHJlYWRDb3VudCAoPD0gTWF4VGhyZWFkc1BlckNoYW4pLgoKZnVuYyBnZXRMaXZlVGhyZWFkSURzKGNoYW5uZWwgc3RyaW5nKSBbXXVpbnQ2NCB7CglpZiB2YWwsIGV4aXN0cyA6PSB0aHJlYWRMaXZlSURzLkdldChjaGFubmVsKTsgZXhpc3RzIHsKCQlyZXR1cm4gdmFsLihbXXVpbnQ2NCkKCX0KCXJldHVybiBuaWwKfQoKZnVuYyBhZGRMaXZlVGhyZWFkSUQoY2hhbm5lbCBzdHJpbmcsIGlkIHVpbnQ2NCkgewoJdGhyZWFkTGl2ZUlEcy5TZXQoY2hhbm5lbCwgYXBwZW5kKGdldExpdmVUaHJlYWRJRHMoY2hhbm5lbCksIGlkKSkKfQoKZnVuYyByZW1vdmVMaXZlVGhyZWFkSUQoY2hhbm5lbCBzdHJpbmcsIGlkIHVpbnQ2NCkgewoJaWRzIDo9IGdldExpdmVUaHJlYWRJRHMoY2hhbm5lbCkKCWZvciBpLCB4IDo9IHJhbmdlIGlkcyB7CgkJaWYgeCA9PSBpZCB7CgkJCXRocmVhZExpdmVJRHMuU2V0KGNoYW5uZWwsIGFwcGVuZChpZHNbOmldLCBpZHNbaSsxOl0uLi4pKQoJCQlyZXR1cm4KCQl9Cgl9Cn0KCi8vIOKUgOKUgCBMaXZlIHJlcGx5LUlEIGluZGV4IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBTYW1lIHJhdGlvbmFsZSBhcyB0aGUgdGhyZWFkIGluZGV4LCBvbmUgbGV2ZWwgZG93bjogcmVuZGVyVGhyZWFkIG11c3QgaXRlcmF0ZQovLyBvbmx5IGxpdmUgcmVwbHkgSURzIChib3VuZGVkIGJ5IE1heFJlcGxpZXNQZXJUaHJlYWQpLCBuZXZlciB0aGUgbW9ub3RvbmljCi8vIHJlcGx5Q291bnQsIG9yIGEgbWVtYmVyIGNhbiBwb3N0K2RlbGV0ZSByZXBsaWVzIGluIGEgbG9vcCB0byBtYWtlIGEgdGhyZWFkCi8vIHVucmVuZGVyYWJsZS4gS2V5ZWQgYnkgImNoYW5uZWwvdGhyZWFkSWQiLgoKZnVuYyBnZXRMaXZlUmVwbHlDb3VudCh0aHJlYWRLZXkgc3RyaW5nKSB1aW50NjQgewoJaWYgdmFsLCBleGlzdHMgOj0gcmVwbHlMaXZlLkdldCh0aHJlYWRLZXkpOyBleGlzdHMgewoJCXJldHVybiB2YWwuKHVpbnQ2NCkKCX0KCXJldHVybiAwCn0KCmZ1bmMgZ2V0TGl2ZVJlcGx5SURzKHRocmVhZEtleSBzdHJpbmcpIFtddWludDY0IHsKCWlmIHZhbCwgZXhpc3RzIDo9IHJlcGx5TGl2ZUlEcy5HZXQodGhyZWFkS2V5KTsgZXhpc3RzIHsKCQlyZXR1cm4gdmFsLihbXXVpbnQ2NCkKCX0KCXJldHVybiBuaWwKfQoKZnVuYyBhZGRMaXZlUmVwbHlJRCh0aHJlYWRLZXkgc3RyaW5nLCBpZCB1aW50NjQpIHsKCXJlcGx5TGl2ZUlEcy5TZXQodGhyZWFkS2V5LCBhcHBlbmQoZ2V0TGl2ZVJlcGx5SURzKHRocmVhZEtleSksIGlkKSkKfQoKZnVuYyByZW1vdmVMaXZlUmVwbHlJRCh0aHJlYWRLZXkgc3RyaW5nLCBpZCB1aW50NjQpIHsKCWlkcyA6PSBnZXRMaXZlUmVwbHlJRHModGhyZWFkS2V5KQoJZm9yIGksIHggOj0gcmFuZ2UgaWRzIHsKCQlpZiB4ID09IGlkIHsKCQkJcmVwbHlMaXZlSURzLlNldCh0aHJlYWRLZXksIGFwcGVuZChpZHNbOmldLCBpZHNbaSsxOl0uLi4pKQoJCQlyZXR1cm4KCQl9Cgl9Cn0KCi8vIOKUgOKUgCBUaHJlYWQgdG9tYnN0b25lIHF1ZXVlIChCMiBoYXJkLUdDKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLy8gU29mdC1kZWxldGVkIHRocmVhZCBJRHMgYXdhaXRpbmcgcGVybWFuZW50IHJlbW92YWwgYnkgU3dlZXBUb21ic3RvbmVzLiBBIHF1ZXVlCi8vIChub3QgYSBzY2FuIG9mIHRoZSB0aHJlYWRzIHRyZWUpIGtlZXBzIHRoZSBzd2VlcCBPKGxpbWl0KSDigJQgaXQgbmV2ZXIgd2Fsa3MgdGhlCi8vIHVuYm91bmRlZCBzZXQgb2YgcGFzdCB0b21ic3RvbmVzLgoKZnVuYyBnZXRUaHJlYWRUb21iKGNoYW5uZWwgc3RyaW5nKSBbXXVpbnQ2NCB7CglpZiB2YWwsIGV4aXN0cyA6PSB0aHJlYWRUb21iLkdldChjaGFubmVsKTsgZXhpc3RzIHsKCQlyZXR1cm4gdmFsLihbXXVpbnQ2NCkKCX0KCXJldHVybiBuaWwKfQoKZnVuYyBlbnF1ZXVlVGhyZWFkVG9tYihjaGFubmVsIHN0cmluZywgaWQgdWludDY0KSB7Cgl0aHJlYWRUb21iLlNldChjaGFubmVsLCBhcHBlbmQoZ2V0VGhyZWFkVG9tYihjaGFubmVsKSwgaWQpKQp9CgpmdW5jIGdldFJlcGx5Q291bnQodGhyZWFkS2V5IHN0cmluZykgdWludDY0IHsKCXZhbCwgZXhpc3RzIDo9IHJlcGx5Q291bnQuR2V0KHRocmVhZEtleSkKCWlmICFleGlzdHMgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdmFsLih1aW50NjQpCn0KCmZ1bmMgdHJ1bmNBZGRyKGFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCXMgOj0gc3RyaW5nKGFkZHIpCglpZiBsZW4ocykgPiAxMyB7CgkJcmV0dXJuIHNbOjEwXSArICIuLi4iCgl9CglyZXR1cm4gcwp9CgovLyBpc1ZhbGlkUm9sZXMgdmFsaWRhdGVzIGEgY29tbWEtc2VwYXJhdGVkIHJvbGUgbGlzdCBjb250YWlucyBvbmx5IHNhZmUgY2hhcmFjdGVycy4KLy8gQWxsb3dlZDogYS16LCBBLVosIDAtOSwgaHlwaGVuLCBjb21tYS4gTm8gc3BhY2VzLCBubyBtYXJrZG93biBjaGFycywgbm8gbnVsbCBieXRlcy4KZnVuYyBpc1ZhbGlkUm9sZXMocyBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKHMpID4gMjAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIHMgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnLScgfHwgYyA9PSAnLCcpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKLy8gc2FuaXRpemVGb3JSZW5kZXIgc3RyaXBzIG1hcmtkb3duLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgaW5qZWN0aW9uLgpmdW5jIHNhbml0aXplRm9yUmVuZGVyKHMgc3RyaW5nKSBzdHJpbmcgewoJdmFyIG91dCBzdHJpbmdzLkJ1aWxkZXIKCWZvciBfLCBjIDo9IHJhbmdlIHMgewoJCXN3aXRjaCBjIHsKCQljYXNlICdbJywgJ10nLCAnKCcsICcpJywgJyMnLCAnKicsICdgJywgJyEnLCAnPCcsICc+JywgJ3wnLCAnXFwnLCAnXycsICd+JywgJ1xuJywgJ1xyJywgJ1x0JzoKCQkJY29udGludWUKCQlkZWZhdWx0OgoJCQlvdXQuV3JpdGVSdW5lKGMpCgkJfQoJfQoJcmV0dXJuIG91dC5TdHJpbmcoKQp9CgovLyDilIDilIAgQUNMIEVuZm9yY2VtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuYyBhc3NlcnRDYWxsZXJJc093bmVyKCkgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gb3duZXIgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciAiICsgY2FsbGVyLlN0cmluZygpICsgIiBpcyBub3QgdGhlIG93bmVyIikKCX0KfQoKZnVuYyBhc3NlcnRDYWxsZXJJc01lbWJlcihjYWxsZXIgYWRkcmVzcykgewoJaWYgXywgZXhpc3RzIDo9IG1lbWJlcnMuR2V0KGNhbGxlci5TdHJpbmcoKSk7ICFleGlzdHMgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciAiICsgY2FsbGVyLlN0cmluZygpICsgIiBpcyBub3QgYSBtZW1iZXIiKQoJfQp9CgovLyBhc3NlcnRDYWxsZXJIYXNXcml0ZUFjY2VzcyBjaGVja3MgdGhhdCB0aGUgY2FsbGVyIGlzIGEgbWVtYmVyIEFORCBoYXMgYXQgbGVhc3QKLy8gb25lIHJvbGUgdGhhdCBtYXRjaGVzIHRoZSBjaGFubmVsJ3MgV3JpdGVSb2xlcy4KZnVuYyBhc3NlcnRDYWxsZXJIYXNXcml0ZUFjY2VzcyhjYWxsZXIgYWRkcmVzcywgY2ggKkNoYW5uZWwpIHsKCXJvbGVzU3RyLCBleGlzdHMgOj0gbWVtYmVycy5HZXQoY2FsbGVyLlN0cmluZygpKQoJaWYgIWV4aXN0cyB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY2FsbGVyICIgKyBjYWxsZXIuU3RyaW5nKCkgKyAiIGlzIG5vdCBhIG1lbWJlciIpCgl9CgoJY2FsbGVyUm9sZXMgOj0gc3RyaW5ncy5TcGxpdChyb2xlc1N0ci4oc3RyaW5nKSwgIiwiKQoJZm9yIF8sIGNyIDo9IHJhbmdlIGNhbGxlclJvbGVzIHsKCQljciA9IHN0cmluZ3MuVHJpbVNwYWNlKGNyKQoJCWZvciBfLCB3ciA6PSByYW5nZSBjaC5Xcml0ZVJvbGVzIHsKCQkJaWYgY3IgPT0gd3IgewoJCQkJcmV0dXJuIC8vIEFjY2VzcyBncmFudGVkCgkJCX0KCQl9Cgl9CgoJcGFuaWMoInVuYXV0aG9yaXplZDogY2FsbGVyICIgKyBjYWxsZXIuU3RyaW5nKCkgKyAiIGxhY2tzIHdyaXRlIGFjY2VzcyB0byBjaGFubmVsICIgKyBjaC5OYW1lKQp9CgpmdW5jIGhhc1JvbGUoY2FsbGVyIGFkZHJlc3MsIHJvbGUgc3RyaW5nKSBib29sIHsKCXJvbGVzU3RyLCBleGlzdHMgOj0gbWVtYmVycy5HZXQoY2FsbGVyLlN0cmluZygpKQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIGZhbHNlCgl9CgljYWxsZXJSb2xlcyA6PSBzdHJpbmdzLlNwbGl0KHJvbGVzU3RyLihzdHJpbmcpLCAiLCIpCglmb3IgXywgY3IgOj0gcmFuZ2UgY2FsbGVyUm9sZXMgewoJCWlmIHN0cmluZ3MuVHJpbVNwYWNlKGNyKSA9PSByb2xlIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gYXNzZXJ0Q2FsbGVySXNBZG1pblJvbGUgY2hlY2tzIHRoYXQgdGhlIGNhbGxlciBpcyBhIG1lbWJlciB3aXRoIHRoZSAiYWRtaW4iIHJvbGUuCi8vIFVzZWQgZm9yIG1vZGVyYXRpb24gYWN0aW9ucyAoUmVtb3ZlVGhyZWFkLCBVbmhpZGVUaHJlYWQpIHNvIGFueSBhZG1pbiBjYW4gbW9kZXJhdGUsCi8vIG5vdCBqdXN0IHRoZSBzaW5nbGUgb3duZXIuCmZ1bmMgYXNzZXJ0Q2FsbGVySXNBZG1pblJvbGUoKSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWlmICFoYXNSb2xlKGNhbGxlciwgImFkbWluIikgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGNhbGxlciAiICsgY2FsbGVyLlN0cmluZygpICsgIiBkb2VzIG5vdCBoYXZlIGFkbWluIHJvbGUiKQoJfQp9CgovLyBpc1ZhbGlkQ2hhbm5lbE5hbWUgdmFsaWRhdGVzIHRoYXQgYSBjaGFubmVsIG5hbWUgY29udGFpbnMgb25seQovLyBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnMsIGFuZCBkb2VzIG5vdCBzdGFydCB3aXRoIHVuZGVyc2NvcmUuCmZ1bmMgaXNWYWxpZENoYW5uZWxOYW1lKG5hbWUgc3RyaW5nKSBib29sIHsKCWlmIGxlbihuYW1lKSA9PSAwIHx8IGxlbihuYW1lKSA+IDUwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIG5hbWVbMF0gPT0gJ18nIHsKCQlyZXR1cm4gZmFsc2UgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCBfX2FjbC8sIF9fbWVtYmVyLyBwYXRocwoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgbmFtZSB7CgkJaWYgISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnLScpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTI0MDAwMDAwdWdub3QSEgiAhK9fEgsyMDAwMDB1Z25vdBqIAwrNAQoSL3RtLlB1YktleU11bHRpc2lnErYBCAISOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXU7K848tqANWyscQogEgTFVEXmW3vBUKP59RlEEvX+0SOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDKOOJ3rhkJhDgSaVn8LeWBXf9fD3IHUtT4nWr6t2RpngSOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDIOV/XirsLZoGpqv9CvKHp1VH1UALFVlXp85ozdflgQASiwEKBQgDEgGgEkB28k7vx0iQLcdlXkRZizqS/HatEqXBoDQjwzEo8yfwRmo+9Qzu4vhonjNAxEyfdw5u9KUDTb9kxMRDpLaRJOzNEkBn6vGZbc42uGSViYl/SDuVmXvtWgs383v2O9N3h5o76wuhWJmu8NZjHhKcxTnUmdXUG8QFkW9ASwJi3A8wQHFUGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data