Transaction executed successfully

Transaction Details

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

Transaction hash
B3DE99584D731F8F2C6DB28350B26CD8A88D72CA3C215E531EE4CE4B58E653C2

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
137,876,400
Requested gas limit
GAS USED
62,084,359
Gas consumed
FEE
413629ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf520000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cs/7AgoML3ZtLm1fYWRkcGtnEr37AgooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRKA+wIKBWNyZXdzEiFnbm8ubGFuZC9yL21vdWwveC9zb2NpYWwvY3Jld3MvdjAakSwKCVJFQURNRS5tZBKDLCMgY3Jld3MKCkEgY3JldyBpcyB0aHJlZSB0byBmaWZ0ZWVuIHBlb3BsZSB3aXRoIGEgc2hhcmVkIHBvdCwgYSB3YXkgdG8gZGVjaWRlLCBhbmQgYSB3YXkKdG8gbGVhdmUgd2l0aCB0aGVpciBzaGFyZS4gT25lIHRyYW5zYWN0aW9uIHRvIHN0YXJ0IG9uZS4KClRoZSBjaGFpbiB3aXJpbmcgZm9yIFtgcC9tb3VsL3gvc29jaWFsL2NyZXdgXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzL3RyZWUvbWFpbi9wL21vdWwveC9zb2NpYWwvY3JldyksIHdoaWNoCmhvbGRzIHRoZSBzaGFyZSBtYXRoIGFuZCB0aGUgcHJvcG9zYWwgc3RhdGUuIFRoaXMgcmVhbG0gcmVhZHMgdGhlIGNhbGxlciwgcmVhZHMKdGhlIGNvaW5zIGF0dGFjaGVkIHRvIHRoZSBjYWxsLCBhc2tzIHRoZSBlbmdpbmUsIGFuZCByZW5kZXJzIHRoZSByZXN1bHQuCgojIyBUaGUgQVBJCgp8IGNhbGwgfCB8CnwtLS18LS0tfAp8IGBDcmVhdGUobmFtZSlgIHwgcGF5YWJsZS4gWW91IGJlY29tZSB0aGUgY3JldydzIGZpcnN0IG1lbWJlciwgeW91ciBzaGFyZXMgYm91Z2h0IG91dCBvZiB3aGF0IHlvdSBzZW50IGF0IGBJbml0aWFsUHJpY2VQZXJTaGFyZWAuIHwKfCBgSm9pbihjcmV3SUQpYCB8IHBheWFibGUuIE1pbnRzIHNoYXJlcyBhdCB3aGF0IGEgc2hhcmUgaXMgd29ydGggKipub3cqKjogYGFtb3VudCAqIHRvdGFsU2hhcmVzIC8gdHJlYXN1cnlgLCByb3VuZGVkIGRvd24uIFNlbmQgYXQgbGVhc3QgdGhlIGNyZXcgcGFnZSdzICp0byBqb2luKiBmaWd1cmUsIGB0cmVhc3VyeSAvIHRvdGFsU2hhcmVzYCByb3VuZGVkIHVwLCBvciBubyB3aG9sZSBzaGFyZSBpcyBtaW50ZWQuIHwKfCBgRnVuZChjcmV3SUQpYCB8IHBheWFibGUuIEFkZHMgdG8gdGhlIHRyZWFzdXJ5IGFuZCBtaW50cyBub3RoaW5nLCBzbyBldmVyeSBleGlzdGluZyBzaGFyZSBpcyB3b3J0aCBtb3JlLiB8CnwgYFByb3Bvc2UoY3Jld0lELCB0ZXh0KWAgfCBhbnkgbWVtYmVyLiBPcGVuIGZvciBgVm90ZUJsb2Nrc2AgYmxvY2tzLiB8CnwgYFZvdGUocHJvcG9zYWxJRCwgeWVzKWAgfCB3ZWlnaHRlZCBieSB0aGUgc2hhcmVzIHlvdSBob2xkIHJpZ2h0IG5vdywgY2hhbmdlYWJsZSB3aGlsZSBpdCBpcyBvcGVuLiB8CnwgYENsb3NlKHByb3Bvc2FsSUQpYCB8IGFueW9uZSwgYWZ0ZXIgdGhlIGRlYWRsaW5lLiBSZWNvcmRzIHBhc3NlZCBvciBmYWlsZWQgYnkgc2hhcmUgd2VpZ2h0LiB8CnwgYFJhZ2VxdWl0KGNyZXdJRClgIHwgYnVybiBldmVyeSBzaGFyZSB5b3UgaG9sZCwgYmUgY3JlZGl0ZWQgeW91ciBwcm8tcmF0YSBvZiB0aGUgdHJlYXN1cnksIGxlYXZlLiB8CnwgYFdpdGhkcmF3KClgIHwgY29sbGVjdCB3aGF0IHlvdSB3ZXJlIGNyZWRpdGVkLiB8CgpSZWFkczogYEdldGAsIGBDb3VudGAsIGBTaGFyZXNPZmAsIGBNZW1iZXJDb3VudGAsIGBUcmVhc3VyeWAsIGBWYWx1ZVBlclNoYXJlYCwKYFByb3Bvc2FsT2ZgLCBgVGFsbHlgLCBgQ3JlZGl0T2ZgLCBgVG90YWxPd2VkYC4KCmBSZW5kZXJgIHNlcnZlcyB0aHJlZSB2aWV3czogdGhlIGluZGV4LCBgOmNyZXcvPGlkPmAsIGFuZCBgOnByb3Bvc2FsLzxpZD5gLgoKIyMgU2hhcmVzIGFyZSB0aGUgdG9rZW4sIGFuZCB0aGF0IGlzIHRoZSBhbnN3ZXIKClRoZSBzaGFyZXMgKiphcmUqKiB0aGUgdG9rZW4uIFRoZXkgYXJlIHRoZSB2b3RlIHdlaWdodCBhbmQgdGhlIGNsYWltIG9uIHRoZQp0cmVhc3VyeSBhdCBvbmNlLCBtaW50ZWQgYnkgam9pbmluZyBhbmQgYnVybmVkIGJ5IGxlYXZpbmcsIHNvIG5vdGhpbmcgYWJvdXQKdGhlbSBpcyBkZWNvcmF0aXZlIGFuZCBub2JvZHkgaGFzIHRvIGJlIHBlcnN1YWRlZCB0aGV5IGFyZSB3b3J0aCBzb21ldGhpbmcuCgp2MCBrZWVwcyB0aGVtIGFzIGFuIGludGVybmFsIGxlZGdlciByYXRoZXIgdGhhbiBvbmUgR1JDMjAgcGVyIGNyZXcsIGJlY2F1c2UgYQpHUkMyMCBwZXIgY3JldyBtZWFucyBhIHJlYWxtIHBlciBjcmV3LiBBIHRyYW5zZmVyYWJsZSBzaGFyZSBiZWxvbmdzIGluCltgcC9tb3VsL3gvc29jaWFsL2NvaW5gXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzL3RyZWUvbWFpbi9wL21vdWwveC9zb2NpYWwvY29pbiksIHRoZSBzaWJsaW5nIHRoYXQgcmVmdXNlcyB0bwpleGlzdCB1bnRpbCBpdHMgbWludCBydWxlLCBzaW5rIGFuZCBidXllciBhcmUgZGVjbGFyZWQuIFRoaXMgcmVhbG0gZG9lcyBub3QKaW1wb3J0IGl0LgoKIyMgVGhlIGN1c3RvZHkgY2F2ZWF0LCB3aGljaCBpcyByZWFsCgoqKk9uZSByZWFsbSBhZGRyZXNzIGhvbGRzIGV2ZXJ5IGNyZXcncyB0cmVhc3VyeSoqLCB3aXRoIHBlci1jcmV3IGFjY291bnRpbmcKaW5zaWRlIGl0LiBUaGUgY2hhaW4gc2VlcyBvbmUgYmFsYW5jZTsgd2hpY2ggY3JldyBvd25zIHdoaWNoIHBhcnQgb2YgaXQgaXMgYQpudW1iZXIgaW4gdGhpcyByZWFsbSdzIHN0YXRlLgoKU28gYSBidWcgaW4gdGhhdCBhY2NvdW50aW5nIGlzIGEgYnVnICoqYWNyb3NzKiogY3Jld3MsIG5vdCBpbnNpZGUgb25lLiBBbgphcml0aG1ldGljIGVycm9yIHRoYXQgb3Zlci1jcmVkaXRzIG9uZSBjcmV3J3MgcmFnZXF1aXQgcGF5cyBpdCBvdXQgb2YgYW5vdGhlcgpjcmV3J3MgbW9uZXksIGFuZCBub3RoaW5nIGF0IHRoZSBiYW5rIGxheWVyIHdvdWxkIHJlZnVzZSB0aGF0IHRyYW5zZmVyOiBhcyBmYXIKYXMgdGhlIGNoYWluIGlzIGNvbmNlcm5lZCBpdCBpcyBhbGwgdGhlIHNhbWUgYWRkcmVzcyBwYXlpbmcgaXRzZWxmIG91dC4KClRoZSBmaXggaXMgdGhlIGluc3RhbmNlLXBlci1yZWFsbSBwYXR0ZXJuCihgRUZGRUNUSVZFX0dOTy5tZGAgc2VjdGlvbiAxLjQsIGluIHRoaXMgcmVwb3NpdG9yeSk6IG9uZSByZWFsbQpwZXIgY3JldywgZWFjaCBob2xkaW5nIGl0cyBvd24gY29pbnMgYXQgaXRzIG93biBhZGRyZXNzLCB3aXRoCmBwL21vdWwveC9zb2NpYWwvY3Jld2AgYXMgdGhlIHNoYXJlZCBlbmdpbmUuIFRoYXQgaXMgdjEuIEl0IGlzIG5vdCB2MCBiZWNhdXNlCmRlcGxveWluZyBhIHJlYWxtIHBlciBjcmV3IGlzIGEgcHVibGlzaCBwZXIgY3Jldywgd2hpY2ggaXMgdGhlIG9wcG9zaXRlIG9mCiJjcmVhdGUgaXQgaW4gb25lIHRyYW5zYWN0aW9uIiwgYW5kIHRoZSBvbmUgdHJhbnNhY3Rpb24gaXMgdGhlIHdob2xlIHByb2R1Y3QKY2xhaW0uCgojIyBQYXlvdXRzIGFyZSBwdWxsZWQsIG5ldmVyIHB1c2hlZAoKQSByYWdlcXVpdCBjcmVkaXRzIGFuIGludGVybmFsIGxlZGdlciBhbmQgdGhlIGxlYXZlciBjYWxscyBgV2l0aGRyYXdgCnRoZW1zZWx2ZXMuIE9uZSBhZGRyZXNzIHRoYXQgY2Fubm90IGJlIHBhaWQgY2Fubm90IHdlZGdlIGFueWJvZHkgZWxzZSwgYW5kIHRoZQpjcmVkaXQgaXMgemVyb2VkIGJlZm9yZSB0aGUgY29pbnMgbW92ZSwgc28gYSByZWVudHJhbnQgY2FsbCBmaW5kcyBub3RoaW5nIGxlZnQKdG8gdGFrZS4KCiMjIFdoYXQgYSBwcm9wb3NhbCBkb2VzIG5vdCBkbwoKTm90aGluZy4gQSB2MCBwcm9wb3NhbCBpcyBhZHZpc29yeSB0ZXh0OiBwYXNzaW5nIG9uZSByZWNvcmRzIHRoYXQgdGhlIGNyZXcKYWdyZWVkIGJ5IHNoYXJlIHdlaWdodCBhdCBhIHBvaW50IGluIHRpbWUsIGFuZCBtb3ZlcyBubyBjb2lucywgY2hhbmdlcyBubwptZW1iZXJzaGlwIGFuZCBiaW5kcyBubyBjb2RlLiBFeGVjdXRpbmcgYSBwYXlvdXQgaXMgdGhlIG5leHQgc3RlcCwgYW5kIGl0IGlzCndoYXQgd291bGQgdHVybiB0aGlzIGludG8gYSB0cmVhc3VyeSBjb250cmFjdCByYXRoZXIgdGhhbiBhIG5vdGljZSBib2FyZC4KCiMjIFdoeSB0aGlzIHJlYWxtIGlzIHByaXZhdGUKCmBwcml2YXRlID0gdHJ1ZWAsIHNvIGl0IGNhbiBiZSByZWRlcGxveWVkIGF0IHRoaXMgcGF0aCBieSBpdHMgY3JlYXRvciwgYW5kIG5vCm90aGVyIHJlYWxtIG1heSBpbXBvcnQgaXQuIFRoZSB0cmFkZSBpcyB0aGUgdXN1YWwgb25lOiBhIHJlZGVwbG95IHdpcGVzIGV2ZXJ5CnBhY2thZ2UtbGV2ZWwgdmFyaWFibGUsIHNvIGV2ZXJ5IGNyZXcsIGV2ZXJ5IHNoYXJlIGFuZCBldmVyeSBjcmVkaXQgd291bGQgZ28Kd2l0aCBpdCB3aGlsZSB0aGUgY29pbnMgc3RheWVkIGF0IHRoZSBhZGRyZXNzLiBOb3RoaW5nIGltcG9ydHMgdGhpcyByZWFsbSBhbmQKbm90aGluZyBpcyBtZWFudCB0bywgc28gdGhlIHJlZGVwbG95IGRvb3IgaXMgd29ydGggbW9yZSB0aGFuIHRoZSBpbXBvcnQgb25lCndoaWxlIHRoZSBkZXNpZ24gaXMgc3RpbGwgbW92aW5nLiBUaGUgdjEgYWJvdmUgaXMgdGhlIG1vdmUgdGhhdCBjbG9zZXMgaXQuCgo8IS0tIEJFR0lOIEdOT0NPTlRSQUNUUyBGT09URVIgKGdlbmVyYXRlZCBieSBgbWFrZSByZWFkbWVzYDsgZG8gbm90IGVkaXQgYmVsb3cpIC0tPgoKLS0tCgpQYXJ0IG9mICoqW21vdWwvZ25vLWNvbnRyYWN0c10oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cykqKiDigJQgbW91bCdzIHZlcnNpb25lZCBnbm8ubGFuZCBjb250cmFjdHMuIFNlZSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGZ1bGwgY2F0YWxvZywgYnVpbGQvdGVzdCB0b29saW5nLCBhbmQgdXNhZ2UuCgoqKk9uIG1haW5uZXQ6KiogWyFbZGVwbG95bWVudCBzdGF0dXNdKGh0dHBzOi8vZ25vc2NvcGUuY29tL19iYWRnZXMvc2hpZWxkL3N0YXR1cy9yL21vdWwveC9zb2NpYWwvY3Jld3MvdjA/bmV0d29yaz1tYWlubmV0KV0oaHR0cHM6Ly9nbm9zY29wZS5jb20vcmVhbG0vci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwKSBbIVt0cmFuc2FjdGlvbnNdKGh0dHBzOi8vZ25vc2NvcGUuY29tL19iYWRnZXMvc2hpZWxkL3R4cy9yL21vdWwveC9zb2NpYWwvY3Jld3MvdjA/bmV0d29yaz1tYWlubmV0KV0oaHR0cHM6Ly9nbm9zY29wZS5jb20vcmVhbG0vci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwKSBbIVt1bmlxdWUgY2FsbGVyc10oaHR0cHM6Ly9nbm9zY29wZS5jb20vX2JhZGdlcy9zaGllbGQvdXNlcnMvci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwP25ldHdvcms9bWFpbm5ldCldKGh0dHBzOi8vZ25vc2NvcGUuY29tL3JlYWxtL3IvbW91bC94L3NvY2lhbC9jcmV3cy92MCkgWyFbZGVwbG95ZWQgcmV2aXNpb25dKGh0dHBzOi8vZ25vc2NvcGUuY29tL19iYWRnZXMvc2hpZWxkL3ZlcnNpb24vci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwP25ldHdvcms9bWFpbm5ldCldKGh0dHBzOi8vZ25vc2NvcGUuY29tL3JlYWxtL3IvbW91bC94L3NvY2lhbC9jcmV3cy92MCkKCioqRGVwZW5kZW5jeSBncmFwaDoqKgoKIVtnbm8ubGFuZC9yL21vdWwveC9zb2NpYWwvY3Jld3MvdjAgZGVwZW5kZW5jeSBncmFwaF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9tYWluL19hc3NldHMvZ25vLmxhbmQvci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwL2RlcHMucG5nKQoKPiDwn6eqICoqSGlnaGx5IGV4cGVyaW1lbnRhbCDigJQgcG90ZW50aWFsbHkgdmliZS1jb2RlZC4qKiBOb3QgYXVkaXRlZDsgbWF5IGJyZWFrLCBjaGFuZ2UsIG9yIGJlIHJlbW92ZWQgYXQgYW55IHRpbWUuIERvIG5vdCB1c2Ugd2l0aCBhbnl0aGluZyBvZiB2YWx1ZS4gRnVsbCBkaXNjbGFpbWVyOiBbRElTQ0xBSU1FUl0oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9ibG9iL21haW4vRElTQ0xBSU1FUi5tZCkuCgo8IS0tIEVORCBHTk9DT05UUkFDVFMgRk9PVEVSIC0tPgoa7AoKEGJvdW5kZWRfdGVzdC5nbm8S1wpwYWNrYWdlIGNyZXdzCgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgopCgovLyBGaW5kaW5nIDMyNS1jb3N0LWF0LWNhcHMtMS4gQSBjcmV3J3MgcGFnZSByZW5kZXJlZCBldmVyeSBwcm9wb3NhbCB0aGUgY3JldwovLyBoYWQgZXZlciBoYWQuIFByb3Bvc2luZyBpcyBvcGVuIHRvIGV2ZXJ5IG1lbWJlciBhbmQgbm90aGluZyBkZWxldGVzIG9uZSwgc28KLy8gdGhlIGNvc3QgZXZlcnkgcmVhZGVyIG9mIHRoYXQgcGFnZSBwYWlkIGdyZXcgd2l0aG91dCBhIGJvdW5kIGFueWJvZHkKLy8gY29udHJvbHMuCi8vCi8vIEJvdGggY29tcGFyaXNvbiBwb2ludHMgYXJlIGFib3ZlIHRoZSBjYXAgb24gcHVycG9zZTogY29tcGFyaW5nIGEgY291bnQgYmVsb3cKLy8gaXQgd2l0aCBvbmUgYWJvdmUgbWVhc3VyZXMgdGhlIGNhcCBhcnJpdmluZywgbm90IHRoZSBwYWdlIGJlaW5nIGJvdW5kZWQuCmZ1bmMgVGVzdEFDcmV3UGFnZUlzQm91bmRlZEJ5V2hhdEl0U2hvd3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCAxMDAwMDAwLCAidGhlIGNyZXciKQoKCWZvciBpIDo9IDA7IGkgPCA0MDsgaSsrIHsKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCQlQcm9wb3NlKGNyb3NzKGN1ciksIGlkLCAicHJvcG9zYWwgbnVtYmVyICIrc3RyY29udi5JdG9hKGkpKQoJfQoJc21hbGwgOj0gUmVuZGVyKCJjcmV3LyIgKyBzdHJjb252LkZvcm1hdEludChpZCwgMTApKQoKCWZvciBpIDo9IDQwOyBpIDwgMjAwOyBpKysgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJCVByb3Bvc2UoY3Jvc3MoY3VyKSwgaWQsICJwcm9wb3NhbCBudW1iZXIgIitzdHJjb252Lkl0b2EoaSkpCgl9CgliaWcgOj0gUmVuZGVyKCJjcmV3LyIgKyBzdHJjb252LkZvcm1hdEludChpZCwgMTApKQoKCXJvd3NTbWFsbCA6PSBzdHJpbmdzLkNvdW50KHNtYWxsLCAiXG58IikKCXJvd3NCaWcgOj0gc3RyaW5ncy5Db3VudChiaWcsICJcbnwiKQoJaWYgcm93c1NtYWxsID09IDAgewoJCXQuRmF0YWwoIm5vIHRhYmxlIHJvd3MgcmVuZGVyZWQgYXQgYWxsLCBzbyB0aGlzIHRlc3QgaXMgbWVhc3VyaW5nIG5vdGhpbmciKQoJfQoJaWYgcm93c0JpZyA+IHJvd3NTbWFsbCB7CgkJdC5FcnJvcmYoInRoZSBjcmV3IHBhZ2UgZ3JldyBmcm9tICVkIHJvd3MgdG8gJWQgd2hlbiB0aGUgcHJvcG9zYWxzIHdlbnQgZnJvbSA0MCB0byAyMDA6ICIrCgkJCSJldmVyeSByZWFkZXIgcGF5cyBmb3IgZXZlcnkgcHJvcG9zYWwgdGhlIGNyZXcgaGFzIGV2ZXIgaGFkIiwgcm93c1NtYWxsLCByb3dzQmlnKQoJfQp9Chq9bAoJY3Jld3MuZ25vEq9sLy8gUGFja2FnZSBjcmV3cyBpcyBzbWFsbC1ncm91cCBjb29yZGluYXRpb24geW91IGNhbiBjcmVhdGUgaW4gb25lCi8vIHRyYW5zYWN0aW9uOiB0aHJlZSB0byBmaWZ0ZWVuIHBlb3BsZSB3aXRoIGEgc2hhcmVkIHBvdCwgYSB3YXkgdG8gZGVjaWRlLCBhbmQKLy8gYSB3YXkgdG8gbGVhdmUgd2l0aCB0aGVpciBzaGFyZS4KLy8KLy8gSXQgaXMgdGhlIGNoYWluIHdpcmluZyBmb3IgW2duby5sYW5kL3AvbW91bC94L3NvY2lhbC9jcmV3XSwgd2hpY2ggaG9sZHMgdGhlCi8vIHNoYXJlIG1hdGggYW5kIHRoZSBwcm9wb3NhbCBzdGF0ZS4gVGhpcyByZWFsbSByZWFkcyB0aGUgY2FsbGVyLCByZWFkcyB0aGUKLy8gY29pbnMgYXR0YWNoZWQgdG8gdGhlIGNhbGwsIGFza3MgdGhlIGVuZ2luZSwgYW5kIHJlbmRlcnMgdGhlIHJlc3VsdC4KLy8KLy8JQ3JlYXRlICAgIHBheSBpbiwgYW5kIHlvdSBhcmUgdGhlIGNyZXcncyBmaXJzdCBtZW1iZXIKLy8JSm9pbiAgICAgIHBheSBpbiBhdCB3aGF0IGEgc2hhcmUgaXMgd29ydGggTk9XLCBub3QgYXQgd2hhdCBpdCBjb3N0IHRoZW0KLy8JRnVuZCAgICAgIHBheSBpbiBhbmQgbWludCBub3RoaW5nLCBzbyBldmVyeSBleGlzdGluZyBzaGFyZSBpcyB3b3J0aCBtb3JlCi8vCVByb3Bvc2UgICBhbnkgbWVtYmVyIG9wZW5zIGFuIGFkdmlzb3J5IHF1ZXN0aW9uCi8vCVZvdGUgICAgICB3ZWlnaHRlZCBieSB0aGUgc2hhcmVzIHlvdSBob2xkLCBjaGFuZ2VhYmxlIHdoaWxlIGl0IGlzIG9wZW4KLy8JQ2xvc2UgICAgIGFueW9uZSwgb25jZSB0aGUgZGVhZGxpbmUgaGFzIGdvbmUgYnkKLy8JUmFnZXF1aXQgIGJ1cm4geW91ciBzaGFyZXMsIGJlIGNyZWRpdGVkIHlvdXIgc2xpY2UsIGxlYXZlCi8vCVdpdGhkcmF3ICBjb2xsZWN0IHdoYXQgeW91IHdlcmUgY3JlZGl0ZWQKLy8KLy8gIyBUaGUgc2hhcmVzIGFyZSB0aGUgdG9rZW4KLy8KLy8gVGhlcmUgaXMgbm8gc2Vjb25kIGFzc2V0IHRvIGlzc3VlLiBBIHNoYXJlIGlzIHRoZSB2b3RlIHdlaWdodCBhbmQgdGhlIGNsYWltCi8vIG9uIHRoZSB0cmVhc3VyeSBhdCB0aGUgc2FtZSBtb21lbnQsIG1pbnRlZCBieSBwYXlpbmcgaW4gYW5kIGJ1cm5lZCBieQovLyBsZWF2aW5nLCBzbyBub3RoaW5nIGFib3V0IGl0IGlzIGRlY29yYXRpdmUgYW5kIG5vYm9keSBoYXMgdG8gYmUgcGVyc3VhZGVkIGl0Ci8vIGlzIHdvcnRoIHNvbWV0aGluZy4gdjAga2VlcHMgdGhlIHNoYXJlcyBhcyBhbiBpbnRlcm5hbCBsZWRnZXIgcmF0aGVyIHRoYW4gb25lCi8vIEdSQzIwIHBlciBjcmV3LCBiZWNhdXNlIGEgR1JDMjAgcGVyIGNyZXcgbWVhbnMgYSByZWFsbSBwZXIgY3Jldy4gQQovLyB0cmFuc2ZlcmFibGUgc2hhcmUgYmVsb25ncyBpbiBbZ25vLmxhbmQvcC9tb3VsL3gvc29jaWFsL2NvaW5dLCB0aGUgc2libGluZwovLyB0aGF0IHJlZnVzZXMgdG8gZXhpc3QgdW50aWwgaXRzIG1pbnQgcnVsZSwgc2luayBhbmQgYnV5ZXIgYXJlIGRlY2xhcmVkOyB0aGlzCi8vIHJlYWxtIGRvZXMgbm90IGltcG9ydCBpdC4KLy8KLy8gIyBUaGUgY3VzdG9keSBjYXZlYXQsIHdoaWNoIGlzIHJlYWwKLy8KLy8gT05FIHJlYWxtIGFkZHJlc3MgaG9sZHMgRVZFUlkgY3JldydzIHRyZWFzdXJ5LCB3aXRoIHBlci1jcmV3IGFjY291bnRpbmcKLy8gaW5zaWRlIGl0LiBUaGUgY2hhaW4gc2VlcyBvbmUgYmFsYW5jZTsgd2hpY2ggY3JldyBvd25zIHdoaWNoIHBhcnQgb2YgaXQgaXMgYQovLyBudW1iZXIgaW4gdGhpcyByZWFsbSdzIHN0YXRlLiBTbyBhIGJ1ZyBpbiB0aGUgYWNjb3VudGluZyBpcyBhIGJ1ZyBhY3Jvc3MKLy8gY3Jld3MsIG5vdCBpbnNpZGUgb25lOiBhbiBhcml0aG1ldGljIGVycm9yIHRoYXQgb3Zlci1jcmVkaXRzIG9uZSBjcmV3J3MKLy8gcmFnZXF1aXQgcGF5cyBpdCBvdXQgb2YgYW5vdGhlciBjcmV3J3MgbW9uZXksIGFuZCBub3RoaW5nIGF0IHRoZSBiYW5rIGxheWVyCi8vIHdvdWxkIHJlZnVzZSB0aGF0IHRyYW5zZmVyLgovLwovLyBUaGUgZml4IGlzIHRoZSBpbnN0YW5jZS1wZXItcmVhbG0gcGF0dGVybiAoRUZGRUNUSVZFX0dOTy5tZCBzZWN0aW9uIDEuNCk6IG9uZQovLyByZWFsbSBwZXIgY3JldywgZWFjaCBob2xkaW5nIGl0cyBvd24gY29pbnMgYXQgaXRzIG93biBhZGRyZXNzLCB3aXRoIHRoaXMKLy8gcGFja2FnZSBhcyB0aGUgc2hhcmVkIGVuZ2luZS4gVGhhdCBpcyB2MS4gSXQgaXMgbm90IHYwIGJlY2F1c2UgZGVwbG95aW5nIGEKLy8gcmVhbG0gcGVyIGNyZXcgaXMgYSBwdWJsaXNoIHBlciBjcmV3LCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgImNyZWF0ZSBpdCBpbgovLyBvbmUgdHJhbnNhY3Rpb24iLCBhbmQgdGhlIHdob2xlIHByb2R1Y3QgY2xhaW0gaGVyZSBpcyB0aGUgb25lIHRyYW5zYWN0aW9uLgovLwovLyAjIFBheW91dHMgYXJlIHB1bGxlZAovLwovLyBOb3RoaW5nIGlzIGV2ZXIgcHVzaGVkLiBBIHJhZ2VxdWl0IGNyZWRpdHMgYW4gaW50ZXJuYWwgbGVkZ2VyIGFuZCB0aGUgbGVhdmVyCi8vIGNhbGxzIFtXaXRoZHJhd10gdGhlbXNlbHZlcywgc28gb25lIGFkZHJlc3MgdGhhdCBjYW5ub3QgYmUgcGFpZCBjYW5ub3Qgd2VkZ2UKLy8gYW55Ym9keSBlbHNlLCBhbmQgdGhlIGNyZWRpdCBpcyB6ZXJvZWQgYmVmb3JlIHRoZSBjb2lucyBtb3ZlLgpwYWNrYWdlIGNyZXdzCgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjaGFpbi9ydW50aW1lIgoKCSJnbm8ubGFuZC9wL21vdWwva2l0L3N0b3JlL3YwIgoJImduby5sYW5kL3AvbW91bC94L2VudmVsb3BlL3YwIgoJImduby5sYW5kL3AvbW91bC94L3NvY2lhbC9jcmV3L3YwIgoJImduby5sYW5kL3AvbW91bC94bWF0aC92MSIKKQoKLy8gcmVhbG1QYXRoIGlzIHRoaXMgcmVhbG0ncyBvd24gcGF0aCwgdGhlIG9uZSBpdHMgZ25vbW9kLnRvbWwgbW9kdWxlIGxpbmUKLy8gZGVjbGFyZXMuIEl0IGlzIHdyaXR0ZW4gb3V0IHJhdGhlciB0aGFuIHJlYWQgZnJvbSB0aGUgcnVudGltZSwgYmVjYXVzZSBldmVyeQovLyBwbGFpbiByZWFkIHRoaXMgcmVhbG0gZXhwb3J0cyByZXBvcnRzIGl0cyBDQUxMRVIgYW5kIHdvdWxkIGJ1aWxkIGV2ZXJ5IGxpbmsKLy8gYWdhaW5zdCB0aGUgd3JvbmcgcmVhbG0uCmNvbnN0IHJlYWxtUGF0aCA9ICJnbm8ubGFuZC9yL21vdWwveC9zb2NpYWwvY3Jld3MvdjAiCgovLyBkZW5vbSBpcyB0aGUgb25seSBjb2luIGEgY3JldyBob2xkcy4gdWdub3QgYW5kIG5vdGhpbmcgZWxzZTogYSB0cmVhc3VyeSB0aGF0Ci8vIGNhbiBob2xkIHNldmVyYWwgZGVub21pbmF0aW9ucyBuZWVkcyBhIHBlci1kZW5vbWluYXRpb24gc2hhcmUgcHJpY2UsIHdoaWNoIGlzCi8vIGEgZGlmZmVyZW50IHByb2R1Y3QuCmNvbnN0IGRlbm9tID0gInVnbm90IgoKLy8gSW5kZXhDcmV3cyBpcyBob3cgbWFueSBjcmV3cyB0aGUgaW5kZXggcGFnZSBsaXN0cy4KY29uc3QgSW5kZXhDcmV3cyA9IDIwCgovLyBJbmRleFByb3Bvc2FscyBpcyBob3cgbWFueSBvZiBhIGNyZXcncyBwcm9wb3NhbHMgaXRzIHBhZ2UgbGlzdHMuCi8vCi8vIEZpbmRpbmcgMzI1LWNvc3QtYXQtY2Fwcy0xOiB0aGUgcGFnZSByZW5kZXJlZCBldmVyeSBwcm9wb3NhbCBhIGNyZXcgaGFkIGV2ZXIKLy8gaGFkLiBQcm9wb3NpbmcgaXMgb3BlbiB0byBldmVyeSBtZW1iZXIgYW5kIG5vdGhpbmcgZGVsZXRlcyBvbmUsIHNvIHRoZSBjb3N0Ci8vIGV2ZXJ5IHJlYWRlciBwYXlzIGdyZXcgd2l0aG91dCBhIGJvdW5kIGFueWJvZHkgY29udHJvbHMuCmNvbnN0IEluZGV4UHJvcG9zYWxzID0gMjAKCi8vIGNyZXdzIGhvbGRzIGV2ZXJ5IGNyZXcsIGV2ZXJ5IHByb3Bvc2FsIGFuZCB0aGUgY3JlZGl0IGxlZGdlci4gQSByZWRlcGxveQovLyB3aXBlcyBpdCwgd2hpY2ggaXMgdGhlIHRyYWRlIGdub21vZC50b21sJ3MgcHJpdmF0ZSA9IHRydWUgbWFrZXM6IHNlZSB0aGUKLy8gY29tbWVudCB0aGVyZS4KdmFyIGNyZXdzID0gY3Jldy5OZXcoKQoKLy8gQ3JlYXRlIG9wZW5zIGEgY3JldyBhbmQgbWFrZXMgdGhlIGNhbGxlciBpdHMgZmlyc3QgbWVtYmVyLgovLwovLyBTZW5kIHVnbm90IHdpdGggdGhlIGNhbGw6IHRoZSBmb3VuZGVyJ3Mgc2hhcmVzIGFyZSBib3VnaHQgb3V0IG9mIGl0IGF0Ci8vIGNyZXcuSW5pdGlhbFByaWNlUGVyU2hhcmUsIGFuZCB0aGUgd2hvbGUgYW1vdW50LCByZW1haW5kZXIgaW5jbHVkZWQsIGJlY29tZXMKLy8gdGhlIHRyZWFzdXJ5LiBSZXR1cm5zIHRoZSBuZXcgY3JldydzIGlkLgpmdW5jIENyZWF0ZShjdXIgcmVhbG0sIG5hbWUgc3RyaW5nKSBpbnQ2NCB7CgkvLyBCb3RoIGNoZWNrcyBoYXZlIHRvIGJlIGhlcmUgYW5kIG5vdCBiZWhpbmQgYSBoZWxwZXIuIGN1ci5Jc0N1cnJlbnQoKQoJLy8gYmVmb3JlIGN1ci5QcmV2aW91cygpIGlzIHRoZSByZWFsbS10b2tlbiBydWxlOyBJc1VzZXJDYWxsIGJlZm9yZSB0aGUKCS8vIGVudmVsb3BlIHJlYWQgaXMgdGhlIHBheW1lbnQgb25lLCBiZWNhdXNlIHRoZSBlbnZlbG9wZSByZXBvcnRzIHdoYXQKCS8vIHRoZSBTSUdORVIgYXR0YWNoZWQgdG8gdGhlIHRyYW5zYWN0aW9uIGFuZCBub3Qgd2hhdCByZWFjaGVkIHRoaXMKCS8vIHJlYWxtLiBXaXRob3V0IGl0IGEgcmVhbG0gdGhlIHVzZXIgY2FsbGVkIGtlZXBzIHRoZSBjb2lucyBhbmQgY2FsbHMKCS8vIGluIGhlcmUgYXMgbWFueSB0aW1lcyBhcyBpdCBsaWtlcywgZXZlcnkgY2FsbCByZWFkaW5nIHRoZSBzYW1lIHNlbmQuCglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygic3Bvb2ZlZCByZWFsbTogY3VyIGlzIG5vdCB0aGUgbGl2ZSBjcm9zc2luZyBmcmFtZSIpCgl9CglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygiY3Jld3M6IHBheWluZyBpbiBtdXN0IGJlIGEgZGlyZWN0IHVzZXIgdHJhbnNhY3Rpb24iKQoJfQoJd2hvIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50IDo9IGVudmVsb3BlLlJlcXVpcmVBdExlYXN0KGRlbm9tLCBjcmV3LkluaXRpYWxQcmljZVBlclNoYXJlKQoKCWlkLCBlcnIgOj0gY3Jld3MuQ3JlYXRlKG5hbWUsIHdobywgYW1vdW50LCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCWNoYWluLkVtaXQoIkNyZWF0ZSIsCgkJImNyZXciLCBpZC5TdHJpbmcoKSwKCQkiZm91bmRlciIsIHdoby5TdHJpbmcoKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCksCgkpCglyZXR1cm4gaW50NjQoaWQpCn0KCi8vIEpvaW4gbWludHMgdGhlIGNhbGxlciBzaGFyZXMgYXQgd2hhdCBhIHNoYXJlIGlzIHdvcnRoIHJpZ2h0IG5vdyBhbmQgYWRkcyB3aGF0Ci8vIHRoZXkgc2VudCB0byB0aGUgdHJlYXN1cnkuIFJldHVybnMgdGhlIHNoYXJlcyBtaW50ZWQuCi8vCi8vIFRoZSBwcmljZSBpcyBhbW91bnQgKiB0b3RhbFNoYXJlcyAvIHRyZWFzdXJ5LCByb3VuZGVkIGRvd24sIHNvIHNvbWVib2R5Ci8vIGpvaW5pbmcgYSBjcmV3IHRoYXQgaGFzIHRyaXBsZWQgaXRzIG1vbmV5IHBheXMgdGhyZWUgdGltZXMgd2hhdCB0aGUgZm91bmRlcnMKLy8gZGlkLiBTZW5kIGF0IGxlYXN0IHRoZSBjcmV3IHBhZ2UncyBqb2luIHByaWNlLCB0cmVhc3VyeSAvIHRvdGFsU2hhcmVzIHJvdW5kZWQKLy8gdXAsIG9yIHRoZXJlIGlzIG5vIHdob2xlIHNoYXJlIHRvIG1pbnQuCmZ1bmMgSm9pbihjdXIgcmVhbG0sIGNyZXdJRCBpbnQ2NCkgaW50NjQgewoJLy8gVGhlIHR3byBndWFyZHMgZXZlcnkgcGF5YWJsZSBjYWxsIG5lZWRzOyBzZWUgQ3JlYXRlLgoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG06IGN1ciBpcyBub3QgdGhlIGxpdmUgY3Jvc3NpbmcgZnJhbWUiKQoJfQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImNyZXdzOiBwYXlpbmcgaW4gbXVzdCBiZSBhIGRpcmVjdCB1c2VyIHRyYW5zYWN0aW9uIikKCX0KCXdobyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlkIDo9IHN0b3JlLklEKGNyZXdJRCkKCWMsIG9rIDo9IGNyZXdzLkdldChpZCkKCWlmICFvayB7CgkJcGFuaWMoY3Jldy5FcnJOb0NyZXcuRXJyb3IoKSkKCX0KCWFtb3VudCA6PSBlbnZlbG9wZS5SZXF1aXJlQXRMZWFzdChkZW5vbSwgam9pblByaWNlKGMpKQoKCXNoYXJlcywgZXJyIDo9IGNyZXdzLkpvaW4oaWQsIHdobywgYW1vdW50KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CgljaGFpbi5FbWl0KCJKb2luIiwKCQkiY3JldyIsIGlkLlN0cmluZygpLAoJCSJtZW1iZXIiLCB3aG8uU3RyaW5nKCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApLAoJCSJzaGFyZXMiLCBzdHJjb252LkZvcm1hdEludChzaGFyZXMsIDEwKSwKCSkKCXJldHVybiBzaGFyZXMKfQoKLy8gam9pblByaWNlIGlzIHRoZSBsZWFzdCBhIGpvaW5lciBjYW4gc2VuZCBhbmQgc3RpbGwgYmUgbWludGVkIGEgc2hhcmU6IHRoZQovLyBmbG9vciBKb2luJ3MgZW52ZWxvcGUgZ3VhcmQgZW5mb3JjZXMsIGFuZCB0aGUgcHJpY2UgYSBjcmV3IHBhZ2UgcXVvdGVzLgovLwovLyBUaGUgZW5naW5lIG1pbnRzIGFtb3VudCAqIHRvdGFsU2hhcmVzIC8gdHJlYXN1cnksIHJvdW5kZWQgZG93biwgc28gb25lIHdob2xlCi8vIHNoYXJlIG5lZWRzIHRyZWFzdXJ5IC8gdG90YWxTaGFyZXMgcm91bmRlZCBVUC4gY3Jldy5DcmV3LlByaWNlUGVyU2hhcmUgcm91bmRzCi8vIGRvd24sIHdoaWNoIGlzIG9uZSB1Z25vdCBzaG9ydCB3aGVuZXZlciB0aGUgdHJlYXN1cnkgaXMgbm90IGFuIGV4YWN0IG11bHRpcGxlCi8vIG9mIHRoZSBzaGFyZSBjb3VudCwgdGhlIG9yZGluYXJ5IHN0YXRlIGFmdGVyIGFueSBGdW5kOiBhIGpvaW5lciBwYXlpbmcgdGhlCi8vIHF1b3RlZCBwcmljZSBwYXNzZWQgdGhlIGd1YXJkIGFuZCB0aGVuIHJldmVydGVkIG9uICJidXlzIG5vIHdob2xlIHNoYXJlIi4KLy8gVGhhdCBtZXRob2QgbGl2ZXMgaW4gYSBwdWJsaXNoZWQgcGFja2FnZSBhbmQgY2Fubm90IGNoYW5nZSBpbiBwbGFjZSwgc28gdGhlCi8vIHJ1bGUgaXMgaGVyZSwgbmV4dCB0byB0aGUgb25seSBndWFyZCB0aGF0IHVzZXMgaXQuIEEgY3JldyBub2JvZHkgaG9sZHMgYQovLyBzaGFyZSBpbiBpcyBiYWNrIGF0IHRoZSBvcGVuaW5nIHByaWNlLCB0aGUgc2FtZSBicmFuY2ggSm9pbiB0YWtlcy4KZnVuYyBqb2luUHJpY2UoYyAqY3Jldy5DcmV3KSBpbnQ2NCB7CglpZiBjLlRvdGFsU2hhcmVzID09IDAgfHwgYy5UcmVhc3VyeSA9PSAwIHsKCQlyZXR1cm4gY3Jldy5Jbml0aWFsUHJpY2VQZXJTaGFyZQoJfQoJcmV0dXJuIHhtYXRoLk11bERpdlVwKDEsIGMuVHJlYXN1cnksIGMuVG90YWxTaGFyZXMpCn0KCi8vIEZ1bmQgYWRkcyB3aGF0IHRoZSBjYWxsZXIgc2VudCB0byBhIGNyZXcncyB0cmVhc3VyeSBhbmQgbWludHMgbm90aGluZywgc28KLy8gZXZlcnkgZXhpc3Rpbmcgc2hhcmUgaXMgd29ydGggbW9yZSBhZnRlcndhcmRzLgovLwovLyBJdCBpcyBob3cgcmV2ZW51ZSwgYSBncmFudCBvciBhIG1lbWJlciB0b3BwaW5nIHRoZSBwb3QgdXAgYXJyaXZlcy4gQW55b25lIG1heQovLyBmdW5kIGFueSBjcmV3LCBtZW1iZXIgb3Igbm90OiB0aGVyZSBpcyBubyB3YXkgdG8gcmVmdXNlIGEgdHJhbnNmZXIgb24gdGhpcwovLyBjaGFpbiBhbnl3YXksIGFuZCBwcmV0ZW5kaW5nIG90aGVyd2lzZSB3b3VsZCBvbmx5IG1vdmUgdGhlIGRvbmF0aW9uIHRvIGEgYmFuawovLyBzZW5kIHRoZSByZWFsbSBjYW5ub3QgYWNjb3VudCBmb3IuCmZ1bmMgRnVuZChjdXIgcmVhbG0sIGNyZXdJRCBpbnQ2NCkgaW50NjQgewoJLy8gVGhlIHR3byBndWFyZHMgZXZlcnkgcGF5YWJsZSBjYWxsIG5lZWRzOyBzZWUgQ3JlYXRlLgoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG06IGN1ciBpcyBub3QgdGhlIGxpdmUgY3Jvc3NpbmcgZnJhbWUiKQoJfQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImNyZXdzOiBwYXlpbmcgaW4gbXVzdCBiZSBhIGRpcmVjdCB1c2VyIHRyYW5zYWN0aW9uIikKCX0KCXdobyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCA6PSBlbnZlbG9wZS5SZXF1aXJlQXRMZWFzdChkZW5vbSwgMSkKCglpZiBlcnIgOj0gY3Jld3MuRnVuZChzdG9yZS5JRChjcmV3SUQpLCBhbW91bnQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCWNoYWluLkVtaXQoIkZ1bmQiLAoJCSJjcmV3Iiwgc3RvcmUuSUQoY3Jld0lEKS5TdHJpbmcoKSwKCQkiZnJvbSIsIHdoby5TdHJpbmcoKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCksCgkpCglyZXR1cm4gYW1vdW50Cn0KCi8vIFByb3Bvc2Ugb3BlbnMgYW4gYWR2aXNvcnkgcXVlc3Rpb24gb24gYSBjcmV3LiBBbnkgbWVtYmVyIG1heSBwcm9wb3NlLCBhbmQgaXQKLy8gc3RheXMgb3BlbiBmb3IgY3Jldy5Wb3RlQmxvY2tzIGJsb2Nrcy4gUmV0dXJucyB0aGUgcHJvcG9zYWwncyBpZC4KLy8KLy8gQSBwcm9wb3NhbCBFWEVDVVRFUyBOT1RISU5HLiBQYXNzaW5nIG9uZSByZWNvcmRzIHRoYXQgdGhlIGNyZXcgYWdyZWVkIGJ5Ci8vIHNoYXJlIHdlaWdodCwgYW5kIG1vdmVzIG5vIGNvaW5zLCBjaGFuZ2VzIG5vIG1lbWJlcnNoaXAgYW5kIGJpbmRzIG5vIGNvZGUuCi8vIEV4ZWN1dGluZyBhIHBheW91dCBpcyB0aGUgbmV4dCBzdGVwIGFuZCBpdCBpcyBub3QgaW4gdjAuCmZ1bmMgUHJvcG9zZShjdXIgcmVhbG0sIGNyZXdJRCBpbnQ2NCwgdGV4dCBzdHJpbmcpIGludDY0IHsKCXdobyA6PSBjYWxsZXIoY3VyKQoJcGlkLCBlcnIgOj0gY3Jld3MuUHJvcG9zZShzdG9yZS5JRChjcmV3SUQpLCB3aG8sIHRleHQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoJY2hhaW4uRW1pdCgiUHJvcG9zZSIsCgkJImNyZXciLCBzdG9yZS5JRChjcmV3SUQpLlN0cmluZygpLAoJCSJwcm9wb3NhbCIsIHBpZC5TdHJpbmcoKSwKCQkiYXV0aG9yIiwgd2hvLlN0cmluZygpLAoJKQoJcmV0dXJuIGludDY0KHBpZCkKfQoKLy8gVm90ZSByZWNvcmRzIHRoZSBjYWxsZXIncyBiYWxsb3QsIHdlaWdodGVkIGJ5IHRoZSBzaGFyZXMgdGhleSBob2xkIGF0IHRoaXMKLy8gbW9tZW50LiBPbmUgYmFsbG90IHBlciBtZW1iZXIsIGNoYW5nZWFibGUgd2hpbGUgdGhlIHByb3Bvc2FsIGlzIG9wZW4uCmZ1bmMgVm90ZShjdXIgcmVhbG0sIHByb3Bvc2FsSUQgaW50NjQsIHllcyBib29sKSB7Cgl3aG8gOj0gY2FsbGVyKGN1cikKCXBpZCA6PSBzdG9yZS5JRChwcm9wb3NhbElEKQoJaWYgZXJyIDo9IGNyZXdzLlZvdGUocGlkLCB3aG8sIHllcywgcnVudGltZS5DaGFpbkhlaWdodCgpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CgljaGFpbi5FbWl0KCJWb3RlIiwKCQkicHJvcG9zYWwiLCBwaWQuU3RyaW5nKCksCgkJInZvdGVyIiwgd2hvLlN0cmluZygpLAoJCSJ5ZXMiLCBzdHJjb252LkZvcm1hdEJvb2woeWVzKSwKCSkKfQoKLy8gQ2xvc2UgcmVjb3JkcyBhIHByb3Bvc2FsIGFzIHBhc3NlZCBvciBmYWlsZWQgb25jZSBpdHMgZGVhZGxpbmUgaGFzIGdvbmUgYnksCi8vIGFuZCByZXR1cm5zIHdoaWNoLiBBbnlvbmUgbWF5IGNhbGwgaXQ6IGNsb3NpbmcgaXMgYm9va2tlZXBpbmcsIG5vdCBhdXRob3JpdHkuCmZ1bmMgQ2xvc2UoY3VyIHJlYWxtLCBwcm9wb3NhbElEIGludDY0KSBib29sIHsKCXBpZCA6PSBzdG9yZS5JRChwcm9wb3NhbElEKQoJcGFzc2VkLCBlcnIgOj0gY3Jld3MuQ2xvc2UocGlkLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KCWNoYWluLkVtaXQoIkNsb3NlIiwgInByb3Bvc2FsIiwgcGlkLlN0cmluZygpLCAicGFzc2VkIiwgc3RyY29udi5Gb3JtYXRCb29sKHBhc3NlZCkpCglyZXR1cm4gcGFzc2VkCn0KCi8vIFJhZ2VxdWl0IGJ1cm5zIGV2ZXJ5IHNoYXJlIHRoZSBjYWxsZXIgaG9sZHMsIGNyZWRpdHMgdGhlbSB0aGVpciBwcm8tcmF0YQovLyBzbGljZSBvZiB0aGUgdHJlYXN1cnkgYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBjcmV3LiBSZXR1cm5zIHRoZSBhbW91bnQKLy8gY3JlZGl0ZWQsIHdoaWNoIFtXaXRoZHJhd10gY29sbGVjdHMuCi8vCi8vIE5vYm9keSBoYXMgdG8gYWdyZWUuIFRoYXQgaXMgd2hhdCBtYWtlcyBhIHNoYXJlIG1lYW4gc29tZXRoaW5nOiB0aGUgZXhpdCBpcwovLyBwcmljZWQgYnkgdGhlIHNhbWUgbnVtYmVyIHRoYXQgdm90ZXMsIGFuZCBhIG1lbWJlciBvdXR2b3RlZCBvbiBldmVyeXRoaW5nIGNhbgovLyBzdGlsbCBsZWF2ZSB3aXRoIHdoYXQgdGhleSBwdXQgaW4gcGx1cyB0aGVpciBwYXJ0IG9mIHdoYXQgdGhlIGNyZXcgYnVpbHQuCmZ1bmMgUmFnZXF1aXQoY3VyIHJlYWxtLCBjcmV3SUQgaW50NjQpIGludDY0IHsKCXdobyA6PSBjYWxsZXIoY3VyKQoJaWQgOj0gc3RvcmUuSUQoY3Jld0lEKQoJc2hhcmVzLCBhbW91bnQsIGVyciA6PSBjcmV3cy5SYWdlcXVpdChpZCwgd2hvKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CgljaGFpbi5FbWl0KCJSYWdlcXVpdCIsCgkJImNyZXciLCBpZC5TdHJpbmcoKSwKCQkibWVtYmVyIiwgd2hvLlN0cmluZygpLAoJCSJzaGFyZXMiLCBzdHJjb252LkZvcm1hdEludChzaGFyZXMsIDEwKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCksCgkpCglyZXR1cm4gYW1vdW50Cn0KCi8vIFdpdGhkcmF3IHNlbmRzIHRoZSBjYWxsZXIgZXZlcnl0aGluZyB0aGV5IGhhdmUgYmVlbiBjcmVkaXRlZCwgYW5kIHJldHVybnMgaXQuCi8vCi8vIFRoZSBjcmVkaXQgaXMgemVyb2VkIGJlZm9yZSB0aGUgY29pbnMgbW92ZSwgc28gYSByZWVudHJhbnQgY2FsbCBmaW5kcyBub3RoaW5nCi8vIGxlZnQgdG8gdGFrZS4gTm90aGluZyBpbiB0aGlzIHJlYWxtIGV2ZXIgcHVzaGVzIHZhbHVlOiBvbmUgYWRkcmVzcyB0aGF0Ci8vIGNhbm5vdCBiZSBwYWlkIG11c3Qgbm90IGJlIGFibGUgdG8gd2VkZ2UgZXZlcnlib2R5IGVsc2UuCmZ1bmMgV2l0aGRyYXcoY3VyIHJlYWxtKSBpbnQ2NCB7Cgl3aG8gOj0gY2FsbGVyKGN1cikKCWFtb3VudCwgZXJyIDo9IGNyZXdzLldpdGhkcmF3KHdobykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoKCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCglibmsuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHdobywgY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihkZW5vbSwgYW1vdW50KSkpCgoJY2hhaW4uRW1pdCgiV2l0aGRyYXciLCAicGF5ZWUiLCB3aG8uU3RyaW5nKCksICJhbW91bnQiLCBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKSkKCXJldHVybiBhbW91bnQKfQoKLy8gR2V0IHJldHVybnMgYSBjcmV3J3MgbmFtZSwgdGhlIGhlaWdodCBpdCB3YXMgY3JlYXRlZCBhdCwgaG93IG1hbnkgbWVtYmVycyBpdAovLyBoYXMsIGl0cyB0b3RhbCBzaGFyZXMgYW5kIGl0cyB0cmVhc3VyeSBpbiB1Z25vdC4KLy8KLy8gRmxhdCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhlIGNyZXcgaXRzZWxmOiBoYW5kaW5nIG91dCBhIHBvaW50ZXIgdG8gbGl2ZSBzdGF0ZQovLyBpcyBhIG11dGF0aW9uIGhhbmRsZSBub3RoaW5nIGNoZWNrcywgYW5kIGEgc3RydWN0IGlzIG5vdCBzb21ldGhpbmcgYSB3YWxsZXQKLy8gY2FuIGRlY29kZSBhbnl3YXkuCmZ1bmMgR2V0KGNyZXdJRCBpbnQ2NCkgKHN0cmluZywgaW50NjQsIGludCwgaW50NjQsIGludDY0KSB7CgljLCBvayA6PSBjcmV3cy5HZXQoc3RvcmUuSUQoY3Jld0lEKSkKCWlmICFvayB7CgkJcmV0dXJuICIiLCAwLCAwLCAwLCAwCgl9CglyZXR1cm4gYy5OYW1lLCBjLkNyZWF0ZWRBdCwgYy5NZW1iZXJDb3VudCgpLCBjLlRvdGFsU2hhcmVzLCBjLlRyZWFzdXJ5Cn0KCi8vIENvdW50IGlzIGhvdyBtYW55IGNyZXdzIGV4aXN0LgpmdW5jIENvdW50KCkgaW50IHsgcmV0dXJuIGNyZXdzLkxlbigpIH0KCi8vIFNoYXJlc09mIGlzIGhvdyBtYW55IHNoYXJlcyB3aG8gaG9sZHMgaW4gYSBjcmV3LgpmdW5jIFNoYXJlc09mKGNyZXdJRCBpbnQ2NCwgd2hvIGFkZHJlc3MpIGludDY0IHsKCWMsIF8gOj0gY3Jld3MuR2V0KHN0b3JlLklEKGNyZXdJRCkpCglyZXR1cm4gYy5TaGFyZXNPZih3aG8pCn0KCi8vIE1lbWJlckNvdW50IGlzIGhvdyBtYW55IHBlb3BsZSBhcmUgaW4gYSBjcmV3LgpmdW5jIE1lbWJlckNvdW50KGNyZXdJRCBpbnQ2NCkgaW50IHsKCWMsIF8gOj0gY3Jld3MuR2V0KHN0b3JlLklEKGNyZXdJRCkpCglyZXR1cm4gYy5NZW1iZXJDb3VudCgpCn0KCi8vIFRyZWFzdXJ5IGlzIHdoYXQgYSBjcmV3IGhvbGRzLCBpbiB1Z25vdC4gVGhlIGNvaW5zIHRoZW1zZWx2ZXMgc2l0IGF0IHRoaXMKLy8gcmVhbG0ncyBzaW5nbGUgYWRkcmVzczogc2VlIHRoZSBwYWNrYWdlIGRvYyBvbiBjdXN0b2R5LgpmdW5jIFRyZWFzdXJ5KGNyZXdJRCBpbnQ2NCkgaW50NjQgewoJYywgXyA6PSBjcmV3cy5HZXQoc3RvcmUuSUQoY3Jld0lEKSkKCWlmIGMgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGMuVHJlYXN1cnkKfQoKLy8gVmFsdWVQZXJTaGFyZSBpcyB3aGF0IG9uZSBvZiBhIGNyZXcncyBzaGFyZXMgaXMgd29ydGggaW4gdWdub3QsIHJvdW5kZWQgZG93bi4KZnVuYyBWYWx1ZVBlclNoYXJlKGNyZXdJRCBpbnQ2NCkgaW50NjQgewoJYywgXyA6PSBjcmV3cy5HZXQoc3RvcmUuSUQoY3Jld0lEKSkKCXJldHVybiBjLlZhbHVlUGVyU2hhcmUoKQp9CgovLyBQcm9wb3NhbE9mIHJldHVybnMgYSBwcm9wb3NhbCdzIGNyZXcsIGF1dGhvciwgdGV4dCwgZGVhZGxpbmUgYW5kIHdoZXRoZXIgaXQKLy8gaGFzIGJlZW4gY2xvc2VkIGFuZCBwYXNzZWQuCmZ1bmMgUHJvcG9zYWxPZihwcm9wb3NhbElEIGludDY0KSAoaW50NjQsIGFkZHJlc3MsIHN0cmluZywgaW50NjQsIGJvb2wsIGJvb2wpIHsKCXAsIG9rIDo9IGNyZXdzLlByb3Bvc2FsKHN0b3JlLklEKHByb3Bvc2FsSUQpKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgIiIsICIiLCAwLCBmYWxzZSwgZmFsc2UKCX0KCXJldHVybiBpbnQ2NChwLkNyZXdJRCksIHAuQXV0aG9yLCBwLlRleHQsIHAuRGVhZGxpbmUsIHAuQ2xvc2VkLCBwLlBhc3NlZAp9CgovLyBUYWxseSBpcyBhIHByb3Bvc2FsJ3Mgc2hhcmUtd2VpZ2h0ZWQgeWVzIGFuZCBuby4KZnVuYyBUYWxseShwcm9wb3NhbElEIGludDY0KSAoaW50NjQsIGludDY0KSB7CglwLCBvayA6PSBjcmV3cy5Qcm9wb3NhbChzdG9yZS5JRChwcm9wb3NhbElEKSkKCWlmICFvayB7CgkJcmV0dXJuIDAsIDAKCX0KCXJldHVybiBwLlllcywgcC5Obwp9CgovLyBDcmVkaXRPZiBpcyB3aGF0IGFuIGFkZHJlc3MgY2FuIHdpdGhkcmF3IHJpZ2h0IG5vdywgaW4gdWdub3QuCmZ1bmMgQ3JlZGl0T2Yod2hvIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGNyZXdzLkNyZWRpdE9mKHdobykgfQoKLy8gVG90YWxPd2VkIGlzIGV2ZXJ5IG91dHN0YW5kaW5nIGNyZWRpdCwgd2hpY2ggaXMgdGhlIHBhcnQgb2YgdGhpcyByZWFsbSdzCi8vIGJhbGFuY2UgdGhhdCBiZWxvbmdzIHRvIHBlb3BsZSB3aG8gaGF2ZSBhbHJlYWR5IGxlZnQuCmZ1bmMgVG90YWxPd2VkKCkgaW50NjQgeyByZXR1cm4gY3Jld3MuVG90YWxPd2VkKCkgfQoKLy8gY2FsbGVyIGlzIHRoZSBhZGRyZXNzIHRoYXQgY2FsbGVkIHVzLCBjaGVja2VkIHRoZSBvbmUgd2F5IHRoYXQgaXMgc2FmZS4KZnVuYyBjYWxsZXIoY3VyIHJlYWxtKSBhZGRyZXNzIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJzcG9vZmVkIHJlYWxtOiBjdXIgaXMgbm90IHRoZSBsaXZlIGNyb3NzaW5nIGZyYW1lIikKCX0KCXJldHVybiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoap28KDmNyZXdzX3Rlc3QuZ25vEpRvcGFja2FnZSBjcmV3cwoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoKCSJnbm8ubGFuZC9wL21vdWwveC9zb2NpYWwvY3Jldy92MCIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvcC9udC91cmVxdWlyZS92MCIKKQoKdmFyIHJlYWxtQWRkciA9IGNoYWluLlBhY2thZ2VBZGRyZXNzKHJlYWxtUGF0aCkKCnZhciAoCglhbGljZSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYWxpY2UiKQoJYm9iICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJvYiIpCgljYXJvbCA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiY2Fyb2wiKQopCgovLyB0ZW5HTk9UIGlzIHdoYXQgZXZlcnkgZm91bmRlciBoZXJlIHB1dHMgaW46IDEwLDAwMCBzaGFyZXMgYXQgdGhlIG9wZW5pbmcKLy8gcHJpY2UsIHNvIGhhbHZpbmcgYW5kIGRvdWJsaW5nIHN0YXkgZXhhY3QgYW5kIHRoZSByb3VuZGluZyB0ZXN0cyBjYW4gdXNlCi8vIGRlbGliZXJhdGVseSBhd2t3YXJkIG51bWJlcnMgaW5zdGVhZC4KY29uc3QgdGVuR05PVCA9IGludDY0KDEwMDAwMDAwKQoKLy8gcmVzZXQgY2xlYXJzIHJlYWxtIHN0YXRlLiBSZWFsbSBnbG9iYWxzIGxpdmUgZm9yIHRoZSB3aG9sZSB0ZXN0IGJpbmFyeSwgc28KLy8gZXZlcnl0aGluZyBhIGxhdGVyIHRlc3QgcmVhZHMgc3RhcnRzIGhlcmUuCmZ1bmMgcmVzZXQoKSB7CgljcmV3cyA9IGNyZXcuTmV3KCkKfQoKLy8gY3JlYXRlIGNhbGxzIENyZWF0ZSB0aGUgd2F5IGEgcmVhbCB0cmFuc2FjdGlvbiB3b3VsZDogdGhlIHJ1bnRpbWUgY3JlZGl0cwovLyB0aGUgcmVhbG0ncyBhZGRyZXNzLCB0aGVuIHRoZSBlbnZlbG9wZSByZXBvcnRzIHRoZSBzZW5kIHRvIHRoZSBjcm9zc2luZwovLyBmdW5jdGlvbi4gVGhlIGFjY291bnQgc3dpdGNoIGFuZCB0aGUgY3Jvc3MgYXJlIGluIHRoZSBzYW1lIGZyYW1lIG9uIHB1cnBvc2UsCi8vIHNpbmNlIHRlc3RpbmcuU2V0UmVhbG0gZ292ZXJucyBub3RoaW5nIGVsc2UuCmZ1bmMgY3JlYXRlKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCwgbmFtZSBzdHJpbmcpIGludDY0IHsKCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIGNoYWluLkNvaW5ze3tkZW5vbSwgYW1vdW50fX0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e2Rlbm9tLCBhbW91bnR9fSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0od2hvKSkKCXJldHVybiBDcmVhdGUoY3Jvc3MoY3VyKSwgbmFtZSkKfQoKLy8gam9pbiBpcyBbY3JlYXRlXSBmb3IgSm9pbi4KZnVuYyBqb2luKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGFtb3VudCwgY3Jld0lEIGludDY0KSBpbnQ2NCB7Cgl0ZXN0aW5nLklzc3VlQ29pbnMocmVhbG1BZGRyLCBjaGFpbi5Db2luc3t7ZGVub20sIGFtb3VudH19KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tkZW5vbSwgYW1vdW50fX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHdobykpCglyZXR1cm4gSm9pbihjcm9zcyhjdXIpLCBjcmV3SUQpCn0KCi8vIGZ1bmQgaXMgW2NyZWF0ZV0gZm9yIEZ1bmQuCmZ1bmMgZnVuZChjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBhbW91bnQsIGNyZXdJRCBpbnQ2NCkgaW50NjQgewoJdGVzdGluZy5Jc3N1ZUNvaW5zKHJlYWxtQWRkciwgY2hhaW4uQ29pbnN7e2Rlbm9tLCBhbW91bnR9fSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7ZGVub20sIGFtb3VudH19KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh3aG8pKQoJcmV0dXJuIEZ1bmQoY3Jvc3MoY3VyKSwgY3Jld0lEKQp9CgpmdW5jIFRlc3RDcmVhdGVNYWtlc1RoZUZvdW5kZXJUaGVPbmx5TWVtYmVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldCgpCglpZCA6PSBjcmVhdGUoY3VyLCBhbGljZSwgdGVuR05PVCwgInZhbGlkYXRvcnMiKQoKCW5hbWUsIGF0LCBtZW1iZXJzLCBzaGFyZXMsIHRyZWFzdXJ5IDo9IEdldChpZCkKCXVhc3NlcnQuRXF1YWwodCwgInZhbGlkYXRvcnMiLCBuYW1lKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMjMpLCBhdCwgInRlc3RzIHN0YXJ0IGF0IGhlaWdodCAxMjMiKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBtZW1iZXJzKQoJdWFzc2VydC5FcXVhbCh0LCB0ZW5HTk9UL2NyZXcuSW5pdGlhbFByaWNlUGVyU2hhcmUsIHNoYXJlcykKCXVhc3NlcnQuRXF1YWwodCwgdGVuR05PVCwgdHJlYXN1cnkpCgoJdWFzc2VydC5FcXVhbCh0LCBzaGFyZXMsIFNoYXJlc09mKGlkLCBhbGljZSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBTaGFyZXNPZihpZCwgYm9iKSkKCXVhc3NlcnQuRXF1YWwodCwgY3Jldy5Jbml0aWFsUHJpY2VQZXJTaGFyZSwgVmFsdWVQZXJTaGFyZShpZCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIENvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIHRlbkdOT1QsIFRyZWFzdXJ5KGlkKSkKfQoKLy8gQSBzZWNvbmQgam9pbmVyIGF0IHRoZSBzYW1lIHBlci1zaGFyZSB2YWx1ZSBnZXRzIHRoZSBzYW1lIHNoYXJlcywgd2hpY2ggaXMKLy8gdGhlIGJhc2VsaW5lIHRoZSBhbnRpLWRpbHV0aW9uIHJ1bGUgaXMgbWVhc3VyZWQgYWdhaW5zdC4KZnVuYyBUZXN0QVNlY29uZEpvaW5lckF0VGhlU2FtZVByaWNlR2V0c1RoZVNhbWVTaGFyZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCB0ZW5HTk9ULCAiY3JldyIpCglnb3QgOj0gam9pbihjdXIsIGJvYiwgdGVuR05PVCwgaWQpCgoJdWFzc2VydC5FcXVhbCh0LCBTaGFyZXNPZihpZCwgYWxpY2UpLCBnb3QsICJzYW1lIG1vbmV5LCBzYW1lIHNoYXJlcyIpCgl1YXNzZXJ0LkVxdWFsKHQsIGNyZXcuSW5pdGlhbFByaWNlUGVyU2hhcmUsIFZhbHVlUGVyU2hhcmUoaWQpLCAidGhlIHByaWNlIGRpZCBub3QgbW92ZSIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIE1lbWJlckNvdW50KGlkKSkKCXVhc3NlcnQuRXF1YWwodCwgMip0ZW5HTk9ULCBUcmVhc3VyeShpZCkpCn0KCi8vIEEgam9pbmVyIGFycml2aW5nIGFmdGVyIHRoZSB0cmVhc3VyeSBncmV3IGdldHMgRkVXRVIgc2hhcmVzIGZvciB0aGUgc2FtZQovLyBtb25leTogdGhleSBidXkgYXQgd2hhdCBhIHNoYXJlIGlzIHdvcnRoIG5vdywgbm90IGF0IHdoYXQgdGhlIGZvdW5kZXJzIHBhaWQuCmZ1bmMgVGVzdEFKb2luZXJBZnRlclRoZVRyZWFzdXJ5R3Jld0dldHNGZXdlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoJaWQgOj0gY3JlYXRlKGN1ciwgYWxpY2UsIHRlbkdOT1QsICJjcmV3IikKCWZ1bmQoY3VyLCBjYXJvbCwgdGVuR05PVCwgaWQpIC8vIHRoZSBjcmV3IGRvdWJsZWQgaXRzIG1vbmV5Cgl1cmVxdWlyZS5FcXVhbCh0LCAyKmNyZXcuSW5pdGlhbFByaWNlUGVyU2hhcmUsIFZhbHVlUGVyU2hhcmUoaWQpKQoKCWdvdCA6PSBqb2luKGN1ciwgYm9iLCB0ZW5HTk9ULCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgU2hhcmVzT2YoaWQsIGFsaWNlKS8yLCBnb3QsICJ0aGUgc2FtZSBtb25leSBidXlzIGhhbGYgYXMgbXVjaCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIqY3Jldy5Jbml0aWFsUHJpY2VQZXJTaGFyZSwgVmFsdWVQZXJTaGFyZShpZCksCgkJImFuZCBqb2luaW5nIG1vdmVkIHRoZSB2YWx1ZSBmb3Igbm9ib2R5IikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFNoYXJlc09mKGlkLCBjYXJvbCksICJmdW5kaW5nIG1pbnRzIG5vdGhpbmciKQp9CgovLyBSYWdlcXVpdCBjcmVkaXRzLCBXaXRoZHJhdyBwYXlzLCBhbmQgdGhlIGNvaW5zIGFjdHVhbGx5IG1vdmUuCmZ1bmMgVGVzdFJhZ2VxdWl0Q3JlZGl0c0FuZFdpdGhkcmF3UGF5cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXQoKQoJaWQgOj0gY3JlYXRlKGN1ciwgYWxpY2UsIHRlbkdOT1QsICJjcmV3IikKCWpvaW4oY3VyLCBib2IsIHRlbkdOT1QsIGlkKQoJZnVuZChjdXIsIGNhcm9sLCAyKnRlbkdOT1QsIGlkKSAvLyB0cmVhc3VyeSA0eCwgc3RpbGwgMnggdGhlIHNoYXJlcwoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCW93ZWQgOj0gUmFnZXF1aXQoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIqdGVuR05PVCwgb3dlZCwgImhhbGYgdGhlIHNoYXJlcyBvZiBhIHRyZWFzdXJ5IHdvcnRoIGZvdXIiKQoJdWFzc2VydC5FcXVhbCh0LCBvd2VkLCBDcmVkaXRPZihib2IpLCAiY3JlZGl0ZWQsIG5ldmVyIHNlbnQiKQoJdWFzc2VydC5FcXVhbCh0LCBvd2VkLCBUb3RhbE93ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgTWVtYmVyQ291bnQoaWQpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgU2hhcmVzT2YoaWQsIGJvYikpCgl1YXNzZXJ0LkVxdWFsKHQsIDIqdGVuR05PVCwgVHJlYXN1cnkoaWQpKQoKCWJlZm9yZSA6PSBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2lucyhib2IpLkFtb3VudE9mKGRlbm9tKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCWdvdCA6PSBXaXRoZHJhdyhjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCBvd2VkLCBnb3QpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBDcmVkaXRPZihib2IpLCAiemVyb2VkIGJlZm9yZSB0aGUgY29pbnMgbW92ZWQiKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgVG90YWxPd2VkKCkpCgoJYWZ0ZXIgOj0gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbnMoYm9iKS5BbW91bnRPZihkZW5vbSkKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlK293ZWQsIGFmdGVyLCAidGhlIGNvaW5zIGFjdHVhbGx5IGFycml2ZWQiKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm90aGluZyB0byB3aXRoZHJhdyIsIGZ1bmMoKSB7IFdpdGhkcmF3KGNyb3NzKGN1cikpIH0pCn0KCi8vIEV2ZXJ5b25lIHJhZ2VxdWl0dGluZyBlbXB0aWVzIHRoZSB0cmVhc3VyeSB0byB0aGUgbGFzdCB1Z25vdCwgZXZlbiB3aGVuIG5vCi8vIHNpbmdsZSBkaXZpc2lvbiBpcyBleGFjdDogdGhlIGR1c3QgYSBsZWF2ZXIgcm91bmRzIGF3YXkgYmVsb25ncyB0byB3aG9ldmVyIGlzCi8vIHN0aWxsIGluLCBhbmQgdGhlIGxhc3Qgb25lIG91dCBob2xkcyBldmVyeSBzaGFyZS4KZnVuYyBUZXN0RXZlcnlvbmVSYWdlcXVpdHRpbmdFbXB0aWVzVGhlVHJlYXN1cnkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCAxMDAwLCAiY3JldyIpCglqb2luKGN1ciwgYm9iLCAxMDAwLCBpZCkKCWpvaW4oY3VyLCBjYXJvbCwgMTAwMCwgaWQpCglmdW5kKGN1ciwgYWxpY2UsIDIsIGlkKSAvLyAzMDAyIHVnbm90IG92ZXIgMyBzaGFyZXMsIGRpdmlkZXMgYnkgbm90aGluZwoKCXVyZXF1aXJlLkVxdWFsKHQsIGludDY0KDMwMDIpLCBUcmVhc3VyeShpZCkpCgoJdmFyIHBhaWQgaW50NjQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJcGFpZCArPSBSYWdlcXVpdChjcm9zcyhjdXIpLCBpZCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXBhaWQgKz0gUmFnZXF1aXQoY3Jvc3MoY3VyKSwgaWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhcm9sKSkKCXBhaWQgKz0gUmFnZXF1aXQoY3Jvc3MoY3VyKSwgaWQpCgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzMDAyKSwgcGFpZCwgImV2ZXJ5IHVnbm90IGxlZnQgd2l0aCBzb21lYm9keSIpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBUcmVhc3VyeShpZCksICJ0byB0aGUgbGFzdCBvbmUiKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBNZW1iZXJDb3VudChpZCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMwMDIpLCBUb3RhbE93ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwMCksIENyZWRpdE9mKGFsaWNlKSwgImZpcnN0IG91dCwgcm91bmRlZCBkb3duIGhhcmRlc3QiKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDAxKSwgQ3JlZGl0T2YoY2Fyb2wpLCAibGFzdCBvdXQgdGFrZXMgdGhlIGR1c3QiKQp9CgovLyBBIG9uZS1tZW1iZXIgY3JldyByYWdlcXVpdHRpbmcgdGFrZXMgZXZlcnl0aGluZywgaW5jbHVkaW5nIHRoZSB1Z25vdCB0aGF0Ci8vIGJvdWdodCBubyB3aG9sZSBzaGFyZTogdGhlaXIgc2hhcmVzIEFSRSB0aGUgdG90YWwsIHNvIHRoZSBkaXZpc2lvbiBpcyBleGFjdC4KZnVuYyBUZXN0QU9uZU1lbWJlckNyZXdUYWtlc0V2ZXJ5dGhpbmcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCA1MDAxLCAic29sbyIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglnb3QgOj0gUmFnZXF1aXQoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUwMDEpLCBnb3QpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBUcmVhc3VyeShpZCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIE1lbWJlckNvdW50KGlkKSkKCgkvLyBBbiBlbXB0aWVkIGNyZXcgaXMgbm90IGEgZGVhZCBvbmU6IHdpdGggbm90aGluZyBvdXRzdGFuZGluZyB0aGVyZSBpcwoJLy8gbm8gdmFsdWUgdG8gcHJpY2UgYWdhaW5zdCwgc28gaXQgcmVvcGVucyBhdCB0aGUgb3BlbmluZyBwcmljZS4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFZhbHVlUGVyU2hhcmUoaWQpKQoJZ290ID0gam9pbihjdXIsIGJvYiwgdGVuR05PVCwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHRlbkdOT1QvY3Jldy5Jbml0aWFsUHJpY2VQZXJTaGFyZSwgZ290KQp9CgpmdW5jIFRlc3RQcm9wb3NhbHNBcmVBZHZpc29yeUFuZFNoYXJlV2VpZ2h0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCB0ZW5HTk9ULCAiY3JldyIpIC8vIGFsaWNlOiAxMDAwMCBzaGFyZXMKCWpvaW4oY3VyLCBib2IsIHRlbkdOT1QvMiwgaWQpICAgICAgICAgICAgIC8vIGJvYjogICAgNTAwMCBzaGFyZXMKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCglwaWQgOj0gUHJvcG9zZShjcm9zcyhjdXIpLCBpZCwgInNoaXAgdjEgYmVmb3JlIHRoZSBjb25mZXJlbmNlIikKCglfLCBhdXRob3IsIHRleHQsIGRlYWRsaW5lLCBjbG9zZWQsIHBhc3NlZCA6PSBQcm9wb3NhbE9mKHBpZCkKCXVhc3NlcnQuRXF1YWwodCwgYm9iLlN0cmluZygpLCBhdXRob3IuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICJzaGlwIHYxIGJlZm9yZSB0aGUgY29uZmVyZW5jZSIsIHRleHQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEyMytjcmV3LlZvdGVCbG9ja3MpLCBkZWFkbGluZSkKCXVhc3NlcnQuRmFsc2UodCwgY2xvc2VkKQoJdWFzc2VydC5GYWxzZSh0LCBwYXNzZWQpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJVm90ZShjcm9zcyhjdXIpLCBwaWQsIHRydWUpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCVZvdGUoY3Jvc3MoY3VyKSwgcGlkLCBmYWxzZSkKCgl5ZXMsIG5vIDo9IFRhbGx5KHBpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwMCksIHllcykKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwMDApLCBubywgImEgYmlnZ2VyIGhvbGRlciBvdXR2b3RlcyBhIHNtYWxsZXIgb25lIikKCgkvLyBDaGFuZ2luZyB5b3VyIG1pbmQgd2hpbGUgaXQgaXMgb3BlbiByZXBsYWNlcyB0aGUgYmFsbG90LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglWb3RlKGNyb3NzKGN1ciksIHBpZCwgdHJ1ZSkKCXllcywgbm8gPSBUYWxseShwaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDE1MDAwKSwgeWVzKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgbm8sICJ0aGUgb2xkIGJhbGxvdCBpcyByZW1vdmVkLCBub3QgYWRkZWQgdG8iKQoKCXRlc3RpbmcuU2tpcEhlaWdodHMoY3Jldy5Wb3RlQmxvY2tzKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjYXJvbCkpCgl1YXNzZXJ0LlRydWUodCwgQ2xvc2UoY3Jvc3MoY3VyKSwgcGlkKSwgImFueW9uZSBtYXkgY2xvc2UgaXQiKQoKCV8sIF8sIF8sIF8sIGNsb3NlZCwgcGFzc2VkID0gUHJvcG9zYWxPZihwaWQpCgl1YXNzZXJ0LlRydWUodCwgY2xvc2VkKQoJdWFzc2VydC5UcnVlKHQsIHBhc3NlZCkKCgkvLyBQYXNzaW5nIGl0IG1vdmVkIG5vdGhpbmcuIFRoYXQgaXMgdGhlIHdob2xlIHYwIGNsYWltLgoJdWFzc2VydC5FcXVhbCh0LCB0ZW5HTk9UK3RlbkdOT1QvMiwgVHJlYXN1cnkoaWQpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgVG90YWxPd2VkKCkpCn0KCmZ1bmMgVGVzdFJlZnVzYWxzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldCgpCglpZCA6PSBjcmVhdGUoY3VyLCBhbGljZSwgdGVuR05PVCwgImNyZXciKQoKCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIGNoYWluLkNvaW5ze3tkZW5vbSwgdGVuR05PVH19KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tkZW5vbSwgdGVuR05PVH19KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImFscmVhZHkgYSBtZW1iZXIiLCBmdW5jKCkgeyBKb2luKGNyb3NzKGN1ciksIGlkKSB9KQoKCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIGNoYWluLkNvaW5ze3tkZW5vbSwgdGVuR05PVH19KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tkZW5vbSwgdGVuR05PVH19KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJubyBzdWNoIGNyZXciLCBmdW5jKCkgeyBKb2luKGNyb3NzKGN1ciksIDQyNDIpIH0pCgoJLy8gQ3JlYXRlIHdpdGggbm90aGluZyBhdHRhY2hlZCBpcyByZWZ1c2VkIGJ5IHRoZSBlbnZlbG9wZSwgd2hpY2ggbmFtZXMKCS8vIHRoZSBmbGFnIHRoZSBjYWxsZXIgaGFzIHRvIGZpeC4KCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJzZW5kIiwgZnVuYygpIHsgQ3JlYXRlKGNyb3NzKGN1ciksICJicm9rZSIpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJub3QgYSBtZW1iZXIiLCBmdW5jKCkgewoJCVByb3Bvc2UoY3Jvc3MoY3VyKSwgaWQsICJsZXQgbWUgaW4iKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm90IGEgbWVtYmVyIiwgZnVuYygpIHsgUmFnZXF1aXQoY3Jvc3MoY3VyKSwgaWQpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglwaWQgOj0gUHJvcG9zZShjcm9zcyhjdXIpLCBpZCwgImEgcXVlc3Rpb24iKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJub3QgYSBtZW1iZXIiLCBmdW5jKCkgeyBWb3RlKGNyb3NzKGN1ciksIHBpZCwgdHJ1ZSkgfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJzdGlsbCBvcGVuIiwgZnVuYygpIHsgQ2xvc2UoY3Jvc3MoY3VyKSwgcGlkKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJuYW1lIGlzIGVtcHR5IiwgZnVuYygpIHsKCQljcmVhdGUoY3VyLCBhbGljZSwgdGVuR05PVCwgIiAgIikKCX0pCgkvLyBBIHBpcGUgaW4gYSBuYW1lIHdvdWxkIG9wZW4gYSBjb2x1bW4gd2hlcmUgdGhlIG5hbWUgaXMgYSBsaW5rIHRpdGxlCgkvLyBpbiBhIHRhYmxlIGNlbGwsIHdoaWNoIG1kLkxpbmsncyBlc2NhcGVyIGRvZXMgbm90IGNvdmVyLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5hbWUgaXMgZW1wdHkiLCBmdW5jKCkgewoJCWNyZWF0ZShjdXIsIGFsaWNlLCB0ZW5HTk9ULCAiYSB8IHBpcGUiKQoJfSkKCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIENvdW50KCksICJubyByZWZ1c2FsIGNyZWF0ZWQgYW55dGhpbmciKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBNZW1iZXJDb3VudChpZCkpCn0KCi8vIFRlc3RSZW5kZXIgdXNlcyB1YXNzZXJ0IHJhdGhlciB0aGFuIGFuIEV4YW1wbGUgYmVjYXVzZSBldmVyeSB2aWV3IGNvbnRhaW5zCi8vIGNvbnNlY3V0aXZlIGJsYW5rIGxpbmVzLCB3aGljaCBnbm8gY29sbGFwc2VzIGluc2lkZSBhbiAvLyBPdXRwdXQ6IGJsb2NrLgpmdW5jIFRlc3RSZW5kZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0KCkKCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCB0ZW5HTk9ULCAiYSBjcmV3IFt3aXRoXShtYXJrZG93bikiKQoJam9pbihjdXIsIGJvYiwgdGVuR05PVCwgaWQpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglwaWQgOj0gUHJvcG9zZShjcm9zcyhjdXIpLCBpZCwgInNoaXAgdjEgfCBiZWZvcmUgdGhlIGNvbmZlcmVuY2UiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglWb3RlKGNyb3NzKGN1ciksIHBpZCwgdHJ1ZSkKCglpbmRleCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIiMgQ3Jld3MiKSwgaW5kZXgpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgInwgMSB8IDEgfCAwIEdOT1QgfCIpLCAiY3Jld3MsIHByb3Bvc2Fscywgb3dlZCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgImZ1bmM9Q3JlYXRlIiksIGluZGV4KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5kZXgsICJPbmUgcmVhbG0gYWRkcmVzcyBob2xkcyBldmVyeSBjcmV3J3MgdHJlYXN1cnkiKSwKCQkidGhlIGluZGV4IHN0YXRlcyB0aGUgY3VzdG9keSBjYXZlYXQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5kZXgsCgkJIlthIGNyZXcgXFxbd2l0aFxcXVxcKG1hcmtkb3duXFwpXSgvci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwOmNyZXcvMSkiKSwKCQkibWQuTGluayBlc2NhcGVzIHRoZSB0aXRsZSBleGFjdGx5IG9uY2U6ICIraW5kZXgpCgoJc2lkIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCXBhZ2UgOj0gUmVuZGVyKCJjcmV3LyIgKyBzaWQpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiIyBhIGNyZXcgXFxbd2l0aFxcXVxcKG1hcmtkb3duXFwpIiksCgkJInRoZSBuYW1lIGlzIGVzY2FwZWQgd2hlcmUgaXQgaXMgc2hvd24gYXMgcHJvc2U6ICIrcGFnZSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJ8IDIgb2YgMTUgfCAyMDAwMCB8IDIwIEdOT1QgfCAwLjAwMSBHTk9UIHwiKSwgcGFnZSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJ8IDEwMDAwIHwgNTAlIHwgMTAgR05PVCB8IiksCgkJImVhY2ggbWVtYmVyIGhvbGRzIGhhbGYgdGhlIHNoYXJlcyBhbmQgaGFsZiB0aGUgbW9uZXkiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgImZ1bmM9UmFnZXF1aXQiKSwgcGFnZSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJleGVjdXRlcyBub3RoaW5nIiksIHBhZ2UpCgoJLy8gQSBwaXBlIGluIGEgcHJvcG9zYWwncyB0ZXh0IG11c3Qgbm90IG9wZW4gYSBjb2x1bW4gaW4gdGhlIGNyZXcncwoJLy8gcHJvcG9zYWwgdGFibGUuIEl0IGdvZXMgdGhyb3VnaCB1aS5DZWxsIGZvciBleGFjdGx5IHRoaXMuCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAic2hpcCB2MSBcXHwgYmVmb3JlIHRoZSBjb25mZXJlbmNlIiksCgkJInRoZSBjZWxsIGlzIGVzY2FwZWQ6ICIrcGFnZSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAifCBzaGlwIHYxIHwgYmVmb3JlIiksCgkJImEgcmF3IHBpcGUgd291bGQgb3BlbiBhIGNvbHVtbjogIitwYWdlKQoKCXNwaWQgOj0gc3RyY29udi5Gb3JtYXRJbnQocGlkLCAxMCkKCXByb3AgOj0gUmVuZGVyKCJwcm9wb3NhbC8iICsgc3BpZCkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHByb3AsICIjIFByb3Bvc2FsICMiK3NwaWQpLCBwcm9wKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocHJvcCwgIj4gc2hpcCB2MSB8IGJlZm9yZSB0aGUgY29uZmVyZW5jZSIpLAoJCSJhIGJsb2NrcXVvdGUgaXMgcHJvc2UsIHdoZXJlIGEgcGlwZSBpcyBpbmVydCBhbmQgbXVzdCBub3QgZ3JvdyBhIGJhY2tzbGFzaCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwcm9wLCAifCBvcGVuIHVudGlsIDExMjMgfCAxMDAwMCB8IDAgfCAxIHwiKSwgcHJvcCkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHByb3AsICJmdW5jPVZvdGUiKSwgcHJvcCkKCgkvLyBQYXN0IHRoZSBkZWFkbGluZSB0aGUgcGFnZSBvZmZlcnMgdGhlIGNsb3NlIGluc3RlYWQgb2YgdGhlIHZvdGUuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKGNyZXcuVm90ZUJsb2NrcykKCXByb3AgPSBSZW5kZXIoInByb3Bvc2FsLyIgKyBzcGlkKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocHJvcCwgImF3YWl0aW5nIGEgY2xvc2UiKSwgcHJvcCkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHByb3AsICJmdW5jPUNsb3NlIiksIHByb3ApCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocHJvcCwgImZ1bmM9Vm90ZSIpLCBwcm9wKQoKCXVhc3NlcnQuRXF1YWwodCwgIiMgQ3Jld3Ncbk5vIGNyZXcgIzQyNDIiLCBSZW5kZXIoImNyZXcvNDI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCAiIyBDcmV3c1xuTm90IGEgY3JldyBpZDogbm9wZSIsIFJlbmRlcigiY3Jldy9ub3BlIikpCgl1YXNzZXJ0LkVxdWFsKHQsICIjIENyZXdzXG5ObyBwcm9wb3NhbCAjNDI0MiIsIFJlbmRlcigicHJvcG9zYWwvNDI0MiIpKQoJdWFzc2VydC5FcXVhbCh0LCAiIyBDcmV3c1xuTm90IGEgcHJvcG9zYWwgaWQ6IG5vcGUiLCBSZW5kZXIoInByb3Bvc2FsL25vcGUiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkhhc1ByZWZpeChSZW5kZXIoImVsc2V3aGVyZSIpLCAiIyBOb3QgZm91bmQiKSkKfQoKLy8gQW4gZW1wdHkgcmVhbG0gc3RpbGwgcmVuZGVycyBzb21ldGhpbmcgYSByZWFkZXIgY2FuIGFjdCBvbi4KZnVuYyBUZXN0UmVuZGVyV2l0aE5vdGhpbmdJbkl0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldCgpCglpbmRleCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIk5vIGNyZXdzIHlldC4iKSwgaW5kZXgpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgImZ1bmM9Q3JlYXRlIiksIGluZGV4KQp9CgovLyBMaW5rcyBhcmUgcm9vdGVkIGF0IHRoZSByZWFsbSdzIG93biBwYXRoLCBzbyB0aGV5IHJlc29sdmUgZnJvbSBhbnkgcGFnZQovLyBnbm93ZWIgc2VydmVzIHRoZW0gb24uCmZ1bmMgVGVzdExpbmtzQXJlUm9vdFJlbGF0aXZlKHQgKnRlc3RpbmcuVCkgewoJdWFzc2VydC5FcXVhbCh0LCAiL3IvbW91bC94L3NvY2lhbC9jcmV3cy92MCIsIHJlYWxtVVJMKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICIvci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwOmNyZXcvNyIsIGNyZXdVUkwoNykpCgl1YXNzZXJ0LkVxdWFsKHQsICIvci9tb3VsL3gvc29jaWFsL2NyZXdzL3YwOnByb3Bvc2FsLzciLCBwcm9wb3NhbFVSTCg3KSkKfQoaqwQKC2dub21vZC50b21sEpsEbW9kdWxlID0gImduby5sYW5kL3IvbW91bC94L3NvY2lhbC9jcmV3cy92MCIKZ25vID0gIjAuOSIKcHJpdmF0ZSA9IHRydWUKCiMgcHJpdmF0ZTogbm90aGluZyBpbXBvcnRzIHRoaXMgcmVhbG0gYW5kIG5vdGhpbmcgaXMgbWVhbnQgdG8uIFRoZSB0cmFkZSBpcyB0aGUKIyB1c3VhbCBvbmUsIGEgcmVkZXBsb3kgd2lwZXMgZXZlcnkgY3Jldywgc2hhcmUgYW5kIGNyZWRpdCB3aGlsZSB0aGUgY29pbnMgc3RheQojIGF0IHRoZSBhZGRyZXNzLCBhbmQgaXQgaXMgd29ydGggdGFraW5nIHdoaWxlIHRoZSBkZXNpZ24gaXMgc3RpbGwgbW92aW5nLiBUaGUKIyB2MSBpbiBSRUFETUUubWQsIG9uZSByZWFsbSBwZXIgY3JldywgaXMgdGhlIG1vdmUgdGhhdCBjbG9zZXMgdGhlIGRvb3IuCgpbc291cmNlXQogIHJlcG9zaXRvcnkgPSAiaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cyIKICBwYXRoID0gInIvbW91bC94L3NvY2lhbC9jcmV3cyIKICByZXZpc2lvbiA9ICI1MDcwNTZkODEyYjUwNWFkMTZhMDA5ZjBkNjA3ODY2NDRjZWViMTlkIgoakSQKEmpvaW5wcmljZV90ZXN0LmdubxL6I3BhY2thZ2UgY3Jld3MKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImNoYWluIgoKCSJnbm8ubGFuZC9wL21vdWwveC9zb2NpYWwvY3Jldy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvcC9udC91cmVxdWlyZS92MCIKKQoKLy8gVGhlIHByaWNlIGEgY3JldyBwYWdlIHNob3dzIGEgam9pbmVyLCBhbmQgdGhlIGZsb29yIEpvaW4ncyBlbnZlbG9wZSBndWFyZAovLyBlbmZvcmNlcywgbXVzdCBib3RoIGJlIGV4YWN0bHkgdGhlIGxlYXN0IGFtb3VudCB0aGF0IG1pbnRzIGEgd2hvbGUgc2hhcmUuCi8vCi8vIEpvaW4gbWludHMgYW1vdW50ICogdG90YWxTaGFyZXMgLyB0cmVhc3VyeSwgcm91bmRlZCBkb3duLCBzbyB0aGF0IGFtb3VudCBpcwovLyB0cmVhc3VyeSAvIHRvdGFsU2hhcmVzIHJvdW5kZWQgVVAuIFJvdW5kZWQgZG93biBpbnN0ZWFkLCBpdCBpcyBvbmUgdWdub3QKLy8gc2hvcnQgd2hlbmV2ZXIgdGhlIHRyZWFzdXJ5IGlzIG5vdCBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUgc2hhcmUgY291bnQsCi8vIHdoaWNoIGlzIHRoZSBvcmRpbmFyeSBzdGF0ZSBhZnRlciBhbnkgRnVuZDogdGhlIHBhZ2UgcXVvdGVzIGEgcHJpY2UsIHRoZQovLyBndWFyZCBhY2NlcHRzIGl0LCBhbmQgdGhlIGpvaW4gcmV2ZXJ0cyBvbiAiYnV5cyBubyB3aG9sZSBzaGFyZSIuCi8vCi8vIFRoZSB0YWJsZSBpcyBvdmVyIHRoYXQgcnVsZSwgbm90IG92ZXIgb25lIGlucHV0OiBhd2t3YXJkIHJlbWFpbmRlcnMgd2hlcmUKLy8gZmxvb3IgYW5kIGNlaWxpbmcgZGlmZmVyLCBleGFjdCBtdWx0aXBsZXMgd2hlcmUgdGhleSBtdXN0IG5vdCwgYW5kIGEgY3JldwovLyBldmVyeWJvZHkgbGVmdCwgd2hlcmUgdGhlIG9wZW5pbmcgcHJpY2UgYXBwbGllcy4KZnVuYyBUZXN0VGhlU2hvd25QcmljZUJ1eXNBU2hhcmVBbmRPbmVMZXNzSXNSZWZ1c2VkQnlUaGVHdWFyZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgICBzdHJpbmcKCQljcmVhdGUgaW50NjQgLy8gd2hhdCB0aGUgZm91bmRlciBwYXlzIGluLCBhdCB0aGUgb3BlbmluZyBwcmljZQoJCWZ1bmQgICBpbnQ2NCAvLyB0aGVuIGZ1bmRlZCB3aXRoIHRoaXMsIHdoaWNoIG1pbnRzIG5vdGhpbmcKCQlsZWF2ZSAgYm9vbCAgLy8gdGhlbiB0aGUgZm91bmRlciByYWdlcXVpdHMsIGxlYXZpbmcgYW4gZW1wdHkgY3JldwoJCXdhbnQgICBpbnQ2NCAvLyB0aGUgbGVhc3QgYW1vdW50IHRoYXQgbWludHMgb25lIHNoYXJlCgl9ewoJCXsidHJlYXN1cnkgMzAwMSBvdmVyIDIgc2hhcmVzIiwgMjAwMCwgMTAwMSwgZmFsc2UsIDE1MDF9LAoJCXsidHJlYXN1cnkgMzAwMSBvdmVyIDMgc2hhcmVzIiwgMzAwMCwgMSwgZmFsc2UsIDEwMDF9LAoJCXsidGVuIEdOT1QgYW5kIHNldmVuIHVnbm90IG92ZXIgMTAwMDAgc2hhcmVzIiwgdGVuR05PVCwgNywgZmFsc2UsIDEwMDF9LAoJCXsidGVuIEdOT1QgYW5kIDk5OSB1Z25vdCBvdmVyIDEwMDAwIHNoYXJlcyIsIHRlbkdOT1QsIDk5OSwgZmFsc2UsIDEwMDF9LAoJCXsiZXhhY3QgbXVsdGlwbGUgYXQgdGhlIG9wZW5pbmcgcHJpY2UiLCB0ZW5HTk9ULCAwLCBmYWxzZSwgMTAwMH0sCgkJeyJleGFjdCBtdWx0aXBsZSBhZnRlciBkb3VibGluZyIsIHRlbkdOT1QsIHRlbkdOT1QsIGZhbHNlLCAyMDAwfSwKCQl7ImEgc2luZ2xlIHNoYXJlIiwgMTAwMCwgMCwgZmFsc2UsIDEwMDB9LAoJCXsiZXZlcnlib2R5IGxlZnQiLCAxMDAwLCAwLCB0cnVlLCBjcmV3LkluaXRpYWxQcmljZVBlclNoYXJlfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJcmVzZXQoKQoJCWlkIDo9IGNyZWF0ZShjdXIsIGFsaWNlLCB0Yy5jcmVhdGUsICJjcmV3IikKCQlpZiB0Yy5mdW5kID4gMCB7CgkJCWZ1bmQoY3VyLCBjYXJvbCwgdGMuZnVuZCwgaWQpCgkJfQoJCWlmIHRjLmxlYXZlIHsKCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgkJCVJhZ2VxdWl0KGNyb3NzKGN1ciksIGlkKQoJCX0KCgkJLy8gVGhlIG9yYWNsZSwgaW5kZXBlbmRlbnQgb2YgdGhlIGNvZGUgdW5kZXIgdGVzdDogdGhlIGxlYXN0IGEgd2l0aAoJCS8vIGEgKiBzaGFyZXMgPj0gdHJlYXN1cnksIG9yIHRoZSBvcGVuaW5nIHByaWNlIHdoZW4gbm9ib2R5IGhvbGRzIG9uZS4KCQlfLCBfLCBfLCBzaGFyZXMsIHRyZWFzdXJ5IDo9IEdldChpZCkKCQlvcmFjbGUgOj0gY3Jldy5Jbml0aWFsUHJpY2VQZXJTaGFyZQoJCWlmIHNoYXJlcyA+IDAgJiYgdHJlYXN1cnkgPiAwIHsKCQkJb3JhY2xlID0gdHJlYXN1cnkgLyBzaGFyZXMKCQkJaWYgdHJlYXN1cnklc2hhcmVzICE9IDAgewoJCQkJb3JhY2xlKysKCQkJfQoJCX0KCQl1cmVxdWlyZS5FcXVhbCh0LCB0Yy53YW50LCBvcmFjbGUsIHRjLm5hbWUrIjogdGhlIHRhYmxlIGFncmVlcyB3aXRoIHRoZSBydWxlIikKCgkJcGFnZSA6PSBSZW5kZXIoImNyZXcvIiArIHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkpCgkJdWFzc2VydC5FcXVhbCh0LCB0Yy53YW50LCBzaG93blByaWNlKHQsIHBhZ2UpLAoJCQl0Yy5uYW1lKyI6IHRoZSBwYWdlIHF1b3RlcyB3aGF0IGJ1eXMgYSBzaGFyZTogIitwYWdlKQoKCQkvLyBPbmUgdWdub3QgdW5kZXIgaXQgaXMgcmVmdXNlZCBieSB0aGUgZW52ZWxvcGUgZ3VhcmQsIHdoaWNoIG5hbWVzIHRoZQoJCS8vIHJlYWwgcHJpY2UsIHJhdGhlciB0aGFuIGJ5IEpvaW4gYWZ0ZXIgdGhlIGd1YXJkIGxldCBpdCB0aHJvdWdoLgoJCXRlc3RpbmcuSXNzdWVDb2lucyhyZWFsbUFkZHIsIGNoYWluLkNvaW5ze3tkZW5vbSwgdGMud2FudCAtIDF9fSkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e2Rlbm9tLCB0Yy53YW50IC0gMX19KQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCQl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImNvc3RzIGF0IGxlYXN0ICIrc3RyY29udi5Gb3JtYXRJbnQodGMud2FudCwgMTApK2Rlbm9tLAoJCQlmdW5jKCkgeyBKb2luKGNyb3NzKGN1ciksIGlkKSB9LCB0Yy5uYW1lKyI6IHRoZSBndWFyZCByZWZ1c2VzIG9uZSB1Z25vdCBzaG9ydCIpCgoJCS8vIEV4YWN0bHkgdGhlIHF1b3RlZCBwcmljZSBidXlzIGV4YWN0bHkgb25lIHNoYXJlLgoJCWdvdCA6PSBqb2luKGN1ciwgYm9iLCB0Yy53YW50LCBpZCkKCQl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBnb3QsIHRjLm5hbWUrIjogdGhlIHF1b3RlZCBwcmljZSBtaW50cyBvbmUgc2hhcmUiKQoJfQp9CgovLyBzaG93blByaWNlIHJlYWRzIHRoZSBwcmljZSBjZWxsIG9mIGEgY3JldyBwYWdlJ3Mgc3VtbWFyeSB0YWJsZSwgdGhlIGZpcnN0Ci8vIHJvdyBhZnRlciB0aGUgaGVhZGVyIHRoYXQgc3RhcnRzIHdpdGggInwgbWVtYmVycyIsIGluIHVnbm90LiBJdCBpcyBrZXllZCBvbgovLyB0aGUgcm93J3MgcG9zaXRpb24sIG5vdCB0aGUgY29sdW1uJ3MgdGl0bGUsIHNvIGl0IHJlYWRzIHRoZSBzYW1lIGNlbGwKLy8gd2hhdGV2ZXIgdGhhdCBjb2x1bW4gaXMgY2FsbGVkLgpmdW5jIHNob3duUHJpY2UodCAqdGVzdGluZy5ULCBwYWdlIHN0cmluZykgaW50NjQgewoJbGluZXMgOj0gc3RyaW5ncy5TcGxpdChwYWdlLCAiXG4iKQoJZm9yIGksIGwgOj0gcmFuZ2UgbGluZXMgewoJCWlmICFzdHJpbmdzLkhhc1ByZWZpeChsLCAifCBtZW1iZXJzIikgewoJCQljb250aW51ZQoJCX0KCQl1cmVxdWlyZS5UcnVlKHQsIGkrMiA8IGxlbihsaW5lcyksICJ0aGUgc3VtbWFyeSB0YWJsZSBoYXMgYSByb3c6ICIrcGFnZSkKCQljZWxscyA6PSBzdHJpbmdzLlNwbGl0KGxpbmVzW2krMl0sICJ8IikKCQl1cmVxdWlyZS5FcXVhbCh0LCA2LCBsZW4oY2VsbHMpLCAiZm91ciBjZWxsczogIitsaW5lc1tpKzJdKQoJCXJldHVybiBwYXJzZUdOT1QodCwgc3RyaW5ncy5UcmltU3BhY2UoY2VsbHNbNF0pKQoJfQoJdC5GYXRhbGYoIm5vIHN1bW1hcnkgdGFibGUgb24gdGhlIGNyZXcgcGFnZTogJXMiLCBwYWdlKQoJcmV0dXJuIDAKfQoKLy8gcGFyc2VHTk9UIHR1cm5zIG51bS5HTk9UZidzICIxLjAwMTUgR05PVCIgYmFjayBpbnRvIHVnbm90LgpmdW5jIHBhcnNlR05PVCh0ICp0ZXN0aW5nLlQsIHMgc3RyaW5nKSBpbnQ2NCB7Cgl1cmVxdWlyZS5UcnVlKHQsIHN0cmluZ3MuSGFzU3VmZml4KHMsICIgR05PVCIpLCAiYSBHTk9UIGFtb3VudDogIitzKQoJcyA9IHN0cmluZ3MuVHJpbVN1ZmZpeChzLCAiIEdOT1QiKQoJd2hvbGUsIGZyYWMgOj0gcywgIiIKCWlmIGkgOj0gc3RyaW5ncy5JbmRleChzLCAiLiIpOyBpID49IDAgewoJCXdob2xlLCBmcmFjID0gc1s6aV0sIHNbaSsxOl0KCX0KCXVyZXF1aXJlLlRydWUodCwgbGVuKGZyYWMpIDw9IDYsICJhdCBtb3N0IHNpeCBkZWNpbWFsczogIitzKQoJZnJhYyArPSBzdHJpbmdzLlJlcGVhdCgiMCIsIDYtbGVuKGZyYWMpKQoJdywgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQod2hvbGUsIDEwLCA2NCkKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyLCBzKQoJZiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoZnJhYywgMTAsIDY0KQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIsIHMpCglyZXR1cm4gdyoxMDAwMDAwICsgZgp9ChqkPwoKcmVuZGVyLmdubxKVP3BhY2thZ2UgY3Jld3MKCmltcG9ydCAoCgkic3RyY29udiIKCgkiY2hhaW4vcnVudGltZSIKCgkiZ25vLmxhbmQvcC9tb3VsL2tpdC9udW0vdjAiCgkiZ25vLmxhbmQvcC9tb3VsL2tpdC9zdG9yZS92MCIKCSJnbm8ubGFuZC9wL21vdWwva2l0L3VpL3YwIgoJImduby5sYW5kL3AvbW91bC9tZC92MCIKCSJnbm8ubGFuZC9wL21vdWwvcmVhbG1wYXRoL3YwIgoJImduby5sYW5kL3AvbW91bC94L3NvY2lhbC9jcmV3L3YwIgoJImduby5sYW5kL3AvbW91bC94bWF0aC92MSIKKQoKLy8gUmVuZGVyIHJvdXRlcyB0aHJlZSB2aWV3czogdGhlIGluZGV4LCBvbmUgY3JldywgYW5kIG9uZSBwcm9wb3NhbC4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglyZXEgOj0gcmVhbG1wYXRoLlBhcnNlKHBhdGgpCgoJc3dpdGNoIHJlcS5QYXRoUGFydCgwKSB7CgljYXNlICIiOgoJCXJldHVybiByZW5kZXJJbmRleCgpCgljYXNlICJjcmV3IjoKCQlyZXR1cm4gcmVuZGVyQ3JldyhyZXEuUGF0aFBhcnQoMSkpCgljYXNlICJwcm9wb3NhbCI6CgkJcmV0dXJuIHJlbmRlclByb3Bvc2FsKHJlcS5QYXRoUGFydCgxKSkKCWRlZmF1bHQ6CgkJcmV0dXJuIG1kLkgxKCJOb3QgZm91bmQiKSArICJObyBzdWNoIHZpZXc6ICIgKyB1aS5JbmxpbmUocmVxLlBhdGgpCgl9Cn0KCmZ1bmMgcmVuZGVySW5kZXgoKSBzdHJpbmcgewoJb3V0IDo9IG1kLkgxKCJDcmV3cyIpCglvdXQgKz0gIlRocmVlIHRvIGZpZnRlZW4gcGVvcGxlIHdpdGggYSBzaGFyZWQgcG90LCBhIHdheSB0byBkZWNpZGUsIGFuZCBhIHdheSB0byAiICsKCQkibGVhdmUgd2l0aCB0aGVpciBzaGFyZS4gT25lIHRyYW5zYWN0aW9uIHRvIHN0YXJ0IG9uZS5cblxuIgoKCXQgOj0gdWkuTmV3VGFibGUoImNyZXdzIiwgInByb3Bvc2FscyIsICJvd2VkIHRvIHBlb3BsZSB3aG8gbGVmdCIpCgl0LlJvdygKCQlzdHJjb252Lkl0b2EoY3Jld3MuTGVuKCkpLAoJCXN0cmNvbnYuSXRvYShjcmV3cy5Qcm9wb3NhbENvdW50KCkpLAoJCW51bS5HTk9UZihjcmV3cy5Ub3RhbE93ZWQoKSksCgkpCglvdXQgKz0gdC5TdHJpbmcoKQoKCW91dCArPSBtZC5IMigiVGhlIGNyZXdzIikKCW91dCArPSBjcmV3VGFibGUoY3Jld3MuTGlzdChJbmRleENyZXdzKSkKCglvdXQgKz0gIlxuIiArIHVpLkFjdGlvbigiU3RhcnQgYSBjcmV3IiwgIkNyZWF0ZSIsICJuYW1lIiwgIiIpICsgIlxuIgoKCW91dCArPSBtZC5IMigiSG93IGEgc2hhcmUgd29ya3MiKQoJb3V0ICs9IG1kLkJ1bGxldExpc3QoW11zdHJpbmd7CgkJIkEgc2hhcmUgaXMgdGhlIHZvdGUgd2VpZ2h0IGFuZCB0aGUgY2xhaW0gb24gdGhlIHRyZWFzdXJ5IGF0IG9uY2UuIFRoZXJlIGlzIG5vIHNlY29uZCB0b2tlbi4iLAoJCSJKb2luaW5nIG1pbnRzIHNoYXJlcyBhdCB3aGF0IGEgc2hhcmUgaXMgd29ydGggTk9XOiAiICsKCQkJbWQuSW5saW5lQ29kZSgiYW1vdW50ICogdG90YWxTaGFyZXMgLyB0cmVhc3VyeSIpICsKCQkJIiwgcm91bmRlZCBkb3duLCBzbyBhIGxhdGUgam9pbmVyIGNhbm5vdCBidXkgaW50byB2YWx1ZSB0aGUgb3RoZXJzIGJ1aWx0LiIsCgkJIlJhZ2VxdWl0dGluZyBidXJucyBldmVyeSBzaGFyZSB5b3UgaG9sZCBhbmQgY3JlZGl0cyB5b3UgIiArCgkJCW1kLklubGluZUNvZGUoInNoYXJlcyAqIHRyZWFzdXJ5IC8gdG90YWxTaGFyZXMiKSArCgkJCSIsIHJvdW5kZWQgZG93bi4gTm9ib2R5IGhhcyB0byBhZ3JlZS4iLAoJCSJCb3RoIHJvdW5kIGluIHRoZSBjcmV3J3MgZmF2b3VyLiBUaGUgbGFzdCBtZW1iZXIgb3V0IGhvbGRzIGV2ZXJ5IHNoYXJlLCAiICsKCQkJInNvIHRoZSB0cmVhc3VyeSBzdGlsbCBlbXB0aWVzIHRvIHRoZSBsYXN0IHVnbm90LiIsCgkJIkEgcHJvcG9zYWwgaXMgYWR2aXNvcnkgdGV4dC4gUGFzc2luZyBvbmUgcmVjb3JkcyBhZ3JlZW1lbnQgYW5kIGV4ZWN1dGVzIG5vdGhpbmcuIiwKCX0pCgoJb3V0ICs9IG1kLkgyKCJDdXN0b2R5IikKCW91dCArPSAiT25lIHJlYWxtIGFkZHJlc3MgaG9sZHMgZXZlcnkgY3JldydzIHRyZWFzdXJ5LCB3aXRoIHBlci1jcmV3IGFjY291bnRpbmcgIiArCgkJImluc2lkZS4gQSBidWcgaW4gdGhhdCBhY2NvdW50aW5nIGlzIGEgYnVnIGFjcm9zcyBjcmV3cywgbm90IGluc2lkZSBvbmUuICIgKwoJCSJUaGUgZml4IGlzIG9uZSByZWFsbSBwZXIgY3JldywgYW5kIGl0IGlzIHYxLlxuIgoKCXJldHVybiBvdXQKfQoKZnVuYyByZW5kZXJDcmV3KHJhdyBzdHJpbmcpIHN0cmluZyB7CglpZCwgb2sgOj0gc3RvcmUuUGFyc2VJRChyYXcpCglpZiAhb2sgewoJCXJldHVybiBtZC5IMSgiQ3Jld3MiKSArICJOb3QgYSBjcmV3IGlkOiAiICsgdWkuSW5saW5lKHJhdykKCX0KCWMsIGZvdW5kIDo9IGNyZXdzLkdldChpZCkKCWlmICFmb3VuZCB7CgkJcmV0dXJuIG1kLkgxKCJDcmV3cyIpICsgIk5vIGNyZXcgIyIgKyBpZC5TdHJpbmcoKQoJfQoKCW91dCA6PSBtZC5IMSh1aS5JbmxpbmUoYy5OYW1lKSkKCW91dCArPSBtZC5JdGFsaWMoImNyZXcgIyIraWQuU3RyaW5nKCkrIiDCtyBvcGVuZWQgYXQgYmxvY2sgIisKCQlzdHJjb252LkZvcm1hdEludChjLkNyZWF0ZWRBdCwgMTApKSArICJcblxuIgoKCXQgOj0gdWkuTmV3VGFibGUoIm1lbWJlcnMiLCAic2hhcmVzIiwgInRyZWFzdXJ5IiwgInRvIGpvaW4iKQoJdC5Sb3coCgkJc3RyY29udi5JdG9hKGMuTWVtYmVyQ291bnQoKSkrIiBvZiAiK3N0cmNvbnYuSXRvYShjcmV3Lk1heE1lbWJlcnMpLAoJCXN0cmNvbnYuRm9ybWF0SW50KGMuVG90YWxTaGFyZXMsIDEwKSwKCQludW0uR05PVGYoYy5UcmVhc3VyeSksCgkJbnVtLkdOT1RmKGpvaW5QcmljZShjKSksCgkpCglvdXQgKz0gdC5TdHJpbmcoKQoKCW91dCArPSBtZC5IMigiTWVtYmVycyIpCglpZiBjLk1lbWJlckNvdW50KCkgPT0gMCB7CgkJb3V0ICs9IHVpLkVtcHR5KCJFdmVyeWJvZHkgaGFzIGxlZnQuIFRoZSBuZXh0IG1lbWJlciBpbiBwYXlzIHRoZSBvcGVuaW5nIHByaWNlIGFnYWluLiIpCgl9IGVsc2UgewoJCW0gOj0gdWkuTmV3VGFibGUoIm1lbWJlciIsICJzaGFyZXMiLCAid2VpZ2h0IiwgIndvcnRoIikKCQlmb3IgXywgd2hvIDo9IHJhbmdlIGMuTWVtYmVycygpIHsKCQkJc2hhcmVzIDo9IGMuU2hhcmVzT2Yod2hvKQoJCQltLlJvdygKCQkJCXVpLkFkZHIod2hvKSwKCQkJCXN0cmNvbnYuRm9ybWF0SW50KHNoYXJlcywgMTApLAoJCQkJbnVtLlBjdCh4bWF0aC5NdWxEaXYoc2hhcmVzLCAxMDAwMCwgYy5Ub3RhbFNoYXJlcykpLAoJCQkJbnVtLkdOT1RmKHhtYXRoLk11bERpdihzaGFyZXMsIGMuVHJlYXN1cnksIGMuVG90YWxTaGFyZXMpKSwKCQkJKQoJCX0KCQlvdXQgKz0gbS5TdHJpbmcoKQoJfQoKCW91dCArPSBtZC5IMigiUHJvcG9zYWxzIikKCW91dCArPSBwcm9wb3NhbFRhYmxlKGMuUHJvcG9zYWxzKCkpCglvdXQgKz0gIlxuQSBwcm9wb3NhbCBpcyBhZHZpc29yeSB0ZXh0LiBQYXNzaW5nIG9uZSByZWNvcmRzIHRoYXQgdGhlIGNyZXcgYWdyZWVkICIgKwoJCSJieSBzaGFyZSB3ZWlnaHQsIGFuZCBleGVjdXRlcyBub3RoaW5nLlxuIgoKCW91dCArPSAiXG4iICsgdWkuSm9pbigiIMK3ICIsCgkJdWkuQWN0aW9uKCJKb2luIiwgIkpvaW4iLCAiY3Jld0lEIiwgaWQuU3RyaW5nKCkpLAoJCXVpLkFjdGlvbigiRnVuZCIsICJGdW5kIiwgImNyZXdJRCIsIGlkLlN0cmluZygpKSwKCQl1aS5BY3Rpb24oIlByb3Bvc2UiLCAiUHJvcG9zZSIsICJjcmV3SUQiLCBpZC5TdHJpbmcoKSwgInRleHQiLCAiIiksCgkJdWkuQWN0aW9uKCJSYWdlcXVpdCIsICJSYWdlcXVpdCIsICJjcmV3SUQiLCBpZC5TdHJpbmcoKSksCgkpICsgIlxuIgoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlclByb3Bvc2FsKHJhdyBzdHJpbmcpIHN0cmluZyB7CglwaWQsIG9rIDo9IHN0b3JlLlBhcnNlSUQocmF3KQoJaWYgIW9rIHsKCQlyZXR1cm4gbWQuSDEoIkNyZXdzIikgKyAiTm90IGEgcHJvcG9zYWwgaWQ6ICIgKyB1aS5JbmxpbmUocmF3KQoJfQoJcCwgZm91bmQgOj0gY3Jld3MuUHJvcG9zYWwocGlkKQoJaWYgIWZvdW5kIHsKCQlyZXR1cm4gbWQuSDEoIkNyZXdzIikgKyAiTm8gcHJvcG9zYWwgIyIgKyBwaWQuU3RyaW5nKCkKCX0KCglvdXQgOj0gbWQuSDEoIlByb3Bvc2FsICMiICsgcGlkLlN0cmluZygpKQoJb3V0ICs9IG1kLkJsb2NrcXVvdGUodWkuSW5saW5lKHAuVGV4dCkpICsgIlxuIgoKCWNyZXdOYW1lIDo9ICJjcmV3ICMiICsgcC5DcmV3SUQuU3RyaW5nKCkKCWlmIGMsIG9rIDo9IGNyZXdzLkdldChwLkNyZXdJRCk7IG9rIHsKCQljcmV3TmFtZSA9IGMuTmFtZQoJfQoJb3V0ICs9IG1kLkl0YWxpYygiYnkgIit1aS5BZGRyKHAuQXV0aG9yKSsiIMK3IGluICIrCgkJbWQuTGluayh1aS5TaG9ydE4oY3Jld05hbWUsIGNyZXcuRXhjZXJwdExlbiwgMCksIGNyZXdVUkwocC5DcmV3SUQpKSkgKyAiXG5cbiIKCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgl0IDo9IHVpLk5ld1RhYmxlKCJzdGF0ZSIsICJ5ZXMiLCAibm8iLCAidm90ZXJzIikKCXQuUm93KAoJCXN0YXRlKHAsIG5vdyksCgkJc3RyY29udi5Gb3JtYXRJbnQocC5ZZXMsIDEwKSwKCQlzdHJjb252LkZvcm1hdEludChwLk5vLCAxMCksCgkJc3RyY29udi5JdG9hKHAuVm90ZXJzKCkpLAoJKQoJb3V0ICs9IHQuU3RyaW5nKCkKCglpZiBwLk9wZW4obm93KSB7CgkJb3V0ICs9ICJcbiIgKyB1aS5Kb2luKCIgwrcgIiwKCQkJdWkuQWN0aW9uKCJWb3RlIHllcyIsICJWb3RlIiwgInByb3Bvc2FsSUQiLCBwaWQuU3RyaW5nKCksICJ5ZXMiLCAidHJ1ZSIpLAoJCQl1aS5BY3Rpb24oIlZvdGUgbm8iLCAiVm90ZSIsICJwcm9wb3NhbElEIiwgcGlkLlN0cmluZygpLCAieWVzIiwgImZhbHNlIiksCgkJKSArICJcbiIKCX0gZWxzZSBpZiAhcC5DbG9zZWQgewoJCW91dCArPSAiXG4iICsgdWkuQWN0aW9uKCJDbG9zZSBpdCIsICJDbG9zZSIsICJwcm9wb3NhbElEIiwgcGlkLlN0cmluZygpKSArICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gY3Jld1RhYmxlIGxpc3RzIGNyZXdzLCBuZXdlc3QgZmlyc3QuCmZ1bmMgY3Jld1RhYmxlKGl0ZW1zIFtdY3Jldy5MaXN0aW5nKSBzdHJpbmcgewoJdCA6PSB1aS5OZXdUYWJsZSgiY3JldyIsICJtZW1iZXJzIiwgInNoYXJlcyIsICJ0cmVhc3VyeSIpCglmb3IgXywgaXQgOj0gcmFuZ2UgaXRlbXMgewoJCXQuUm93KAoJCQkvLyBTaG9ydE4gdHJ1bmNhdGVzIHdpdGhvdXQgZXNjYXBpbmcgYW5kIG1kLkxpbmsgZXNjYXBlcyB3aGF0IGl0CgkJCS8vIGlzIGdpdmVuOiB1aS5JbmxpbmUgaGVyZSB3b3VsZCBlc2NhcGUgdHdpY2UgYW5kIHJlbmRlciB0aGUKCQkJLy8gYmFja3NsYXNoZXMuIEEgcGlwZSBpcyB3aGF0IG1kLkxpbmsncyBlc2NhcGVyIGRvZXMgTk9UIGNvdmVyLAoJCQkvLyB3aGljaCBpcyB3aHkgY3Jldy5WYWxpZE5hbWUgcmVmdXNlcyBvbmUgYXQgd3JpdGUgdGltZS4KCQkJbWQuTGluayh1aS5TaG9ydE4oaXQuQ3Jldy5OYW1lLCBjcmV3LkV4Y2VycHRMZW4sIDApLCBjcmV3VVJMKGl0LklEKSksCgkJCXN0cmNvbnYuSXRvYShpdC5DcmV3Lk1lbWJlckNvdW50KCkpLAoJCQlzdHJjb252LkZvcm1hdEludChpdC5DcmV3LlRvdGFsU2hhcmVzLCAxMCksCgkJCW51bS5HTk9UZihpdC5DcmV3LlRyZWFzdXJ5KSwKCQkpCgl9CglyZXR1cm4gdC5PckVtcHR5KCJObyBjcmV3cyB5ZXQuIikKfQoKLy8gcHJvcG9zYWxUYWJsZSBsaXN0cyBhIGNyZXcncyBwcm9wb3NhbHMsIG5ld2VzdCBmaXJzdC4KLy8KLy8gVGhlIGxpbmsgdGl0bGUgaXMgdGhlIGlkIGFuZCBub3QgdGhlIHRleHQsIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZgovLyBjcmV3VGFibGUgYW5kIGRlbGliZXJhdGU6IGEgcHJvcG9zYWwncyB0ZXh0IGlzIGZyZWUgcHJvc2UgYW5kIG1heSBjb250YWluIGEKLy8gcGlwZSwgbWQuTGluaydzIGVzY2FwZXIgbGVhdmVzIHBpcGVzIGFsb25lLCBhbmQgYSBwaXBlIGluIGEgbGluayB0aXRsZSBpbnNpZGUKLy8gYSB0YWJsZSBjZWxsIG9wZW5zIGEgY29sdW1uLiBTbyB0aGUgY2hyb21lIGNhcnJpZXMgdGhlIGxpbmsgYW5kIHRoZSBwcm9zZQovLyBnb2VzIHRocm91Z2ggdWkuQ2VsbCwgd2hpY2ggaXMgdGhlIGVzY2FwZXIgdGhhdCBrbm93cyBpdCBpcyBpbiBhIHRhYmxlLgpmdW5jIHByb3Bvc2FsVGFibGUoaWRzIFtdc3RvcmUuSUQpIHN0cmluZyB7Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgkvLyBGaW5kaW5nIDMyNS1jb3N0LWF0LWNhcHMtMTogdGhpcyByZW5kZXJlZCBldmVyeSBwcm9wb3NhbCBhIGNyZXcgaGFzCgkvLyBldmVyIGhhZCwgYW5kIHByb3Bvc2luZyBpcyBvcGVuIHRvIGV2ZXJ5IG1lbWJlciB3aXRoIG5vIGRlbGV0ZSBwYXRoLgoJLy8gTmV3ZXN0IGZpcnN0IGFscmVhZHksIHNvIHRoZSBib3VuZCBpcyBvbiB3aGVyZSB0aGUgd2FsayBzdG9wcy4KCXRvdGFsIDo9IGxlbihpZHMpCglzdG9wIDo9IDAKCWlmIHRvdGFsID4gSW5kZXhQcm9wb3NhbHMgewoJCXN0b3AgPSB0b3RhbCAtIEluZGV4UHJvcG9zYWxzCgl9Cgl0IDo9IHVpLk5ld1RhYmxlKCIjIiwgInByb3Bvc2FsIiwgInN0YXRlIiwgInllcyIsICJubyIpCglmb3IgaSA6PSB0b3RhbCAtIDE7IGkgPj0gc3RvcDsgaS0tIHsKCQlwLCBvayA6PSBjcmV3cy5Qcm9wb3NhbChpZHNbaV0pCgkJaWYgIW9rIHsKCQkJY29udGludWUKCQl9CgkJdC5Sb3coCgkJCW1kLkxpbmsoIiMiK2lkc1tpXS5TdHJpbmcoKSwgcHJvcG9zYWxVUkwoaWRzW2ldKSksCgkJCS8vIEN1dCBvbiBhIHJ1bmUgYm91bmRhcnkgZmlyc3QsIGVzY2FwZSBvbmNlIGFmdGVyOiBlc2NhcGluZwoJCQkvLyBmaXJzdCBhbmQgY3V0dGluZyBhZnRlciBjYW4gc3RyYW5kIGEgbG9uZSBiYWNrc2xhc2guCgkJCXVpLkNlbGwodWkuU2hvcnROKHAuVGV4dCwgY3Jldy5FeGNlcnB0TGVuLCAwKSksCgkJCXN0YXRlKHAsIG5vdyksCgkJCXN0cmNvbnYuRm9ybWF0SW50KHAuWWVzLCAxMCksCgkJCXN0cmNvbnYuRm9ybWF0SW50KHAuTm8sIDEwKSwKCQkpCgl9CglvdXQgOj0gdC5PckVtcHR5KCJOb3RoaW5nIGhhcyBiZWVuIHByb3Bvc2VkIHlldC4iKQoJaWYgdG90YWwgPiBJbmRleFByb3Bvc2FscyB7CgkJb3V0ICs9IG1kLkl0YWxpYygiU2hvd2luZyB0aGUgbmV3ZXN0ICIrc3RyY29udi5JdG9hKEluZGV4UHJvcG9zYWxzKSsiIG9mICIrCgkJCXN0cmNvbnYuSXRvYSh0b3RhbCkrIiBwcm9wb3NhbHMuIikgKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KCi8vIHN0YXRlIGlzIHRoZSBvbmUgd29yZCBhIHByb3Bvc2FsIGlzIGluIGF0IGhlaWdodCBub3cuCmZ1bmMgc3RhdGUocCAqY3Jldy5Qcm9wb3NhbCwgbm93IGludDY0KSBzdHJpbmcgewoJc3dpdGNoIHsKCWNhc2UgcC5PcGVuKG5vdyk6CgkJcmV0dXJuICJvcGVuIHVudGlsICIgKyBzdHJjb252LkZvcm1hdEludChwLkRlYWRsaW5lLCAxMCkKCWNhc2UgIXAuQ2xvc2VkOgoJCXJldHVybiAiYXdhaXRpbmcgYSBjbG9zZSIKCWNhc2UgcC5QYXNzZWQ6CgkJcmV0dXJuICJwYXNzZWQiCglkZWZhdWx0OgoJCXJldHVybiAiZmFpbGVkIgoJfQp9CgovLyBjcmV3VVJMIGlzIHRoZSBnbm93ZWIgcGF0aCBvZiBvbmUgY3Jldy4KZnVuYyBjcmV3VVJMKGlkIHN0b3JlLklEKSBzdHJpbmcgeyByZXR1cm4gcmVhbG1VUkwoKSArICI6Y3Jldy8iICsgaWQuU3RyaW5nKCkgfQoKLy8gcHJvcG9zYWxVUkwgaXMgdGhlIGdub3dlYiBwYXRoIG9mIG9uZSBwcm9wb3NhbC4KZnVuYyBwcm9wb3NhbFVSTChpZCBzdG9yZS5JRCkgc3RyaW5nIHsgcmV0dXJuIHJlYWxtVVJMKCkgKyAiOnByb3Bvc2FsLyIgKyBpZC5TdHJpbmcoKSB9CgovLyByZWFsbVVSTCBpcyB0aGlzIHJlYWxtJ3MgZ25vd2ViIHBhdGguIFRoZSBjaGFpbiBkb21haW4gaXMgdGhlIGZpcnN0IGVsZW1lbnQKLy8gb2YgYSBwYWNrYWdlIHBhdGggYW5kIGEgZ25vd2ViIHBhdGggaXMgdGhlIHJlc3Qgb2YgaXQsIHNvIHRoaXMgaXMgYSBwcmVmaXgKLy8gc3RyaXAgYW5kIG5vdCBhIGhvc3RuYW1lIHRoZSByZWFsbSBoYXMgdG8ga25vdy4KZnVuYyByZWFsbVVSTCgpIHN0cmluZyB7Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHJlYWxtUGF0aCk7IGkrKyB7CgkJaWYgcmVhbG1QYXRoW2ldID09ICcvJyB7CgkJCXJldHVybiByZWFsbVBhdGhbaTpdCgkJfQoJfQoJcmV0dXJuICIvIiArIHJlYWxtUGF0aAp9CiINMjAwMDAwMDB1Z25vdBITCODOvoMBEgs0MTM2Mjl1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIAUko/jSwAOonEP0X+r2647UW246Nfe75rO0n/ni2DyBJACDrb1gFjEekG38tyQUFTfS3S3yBg49LobNanwzIuiDJazarBS+o1YtxVKhpm+LKCnW/PA5p7eFssfWUjVBcRyhooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data