Transaction executed successfully

Transaction Details

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

Transaction hash
B4292A90F6D00C756679F2069BD07C070B4610AE281790904E59CFC20429B994

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
250,000,000
Requested gas limit
GAS USED
75,577,311
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1qp5pt8cdq2f6kfdamn3yuxwg6quqnfpyewzz3912000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CtHBAwoML3ZtLm1fYWRkcGtnEr/BAwooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKCwQMKDXN1YnNjcmlwdGlvbnMSQWduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zdWJzY3JpcHRpb25zGmgKC2dub21vZC50b21sElltb2R1bGUgPSAiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3N1YnNjcmlwdGlvbnMiCmdubyA9ICIwLjkiChqs4gEKEXN1YnNjcmlwdGlvbnMuZ25vEpXiAS8vIFBhY2thZ2Ugc3Vic2NyaXB0aW9ucyBpcyBhIG11bHRpLXByb3ZpZGVyIHN1YnNjcmlwdGlvbiBodWI6IHByb3ZpZGVycwovLyBwdWJsaXNoIHBsYW5zIHByaWNlZCBwZXIgYmlsbGluZyBwZXJpb2Q7IHN1YnNjcmliZXJzIHBheSBwZXIgcGVyaW9kLAovLyB3aXRoIGRldGVybWluaXN0aWMgcmVuZXdhbCwgZ3JhY2UsIGV4cGlyYXRpb24gYW5kIGNhbmNlbGxhdGlvbiBydWxlczsKLy8gb3RoZXIgcmVhbG1zIGFuZCBvZmYtY2hhaW4gc2VydmljZXMgZ2F0ZSBhY2Nlc3Mgb24gRW50aXRsZWQgLwovLyBFbnRpdGxlZEZvciwgd2hpY2ggaXMgdGhlIGludGVncmF0aW9uIHN1cmZhY2UgdGhpcyByZWFsbSBleGlzdHMgdG8KLy8gcHJvdmlkZS4KLy8KLy8gVEhFIEJJTExJTkcgTU9ERUwsIENPTVBMRVRFTFk6Ci8vCi8vCVN1YnNjcmliZSAocGF5YWJsZSwgZXhhY3QgcHJpY2UpICA6IGNyZWF0ZXMgdGhlIHN1YnNjcmlwdGlvbiwgcGF5cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgMS4gcGFpZFRocm91Z2ggPSBoZWlnaHQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwZXJpb2RCbG9ja3MuCi8vCVJlbmV3IChwYXlhYmxlLCBleGFjdCBwcmljZSkgICAgICA6IGV4dGVuZHMgcGFpZFRocm91Z2ggYnkgZXhhY3RseQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgcGVyaW9kQmxvY2tzLCBGUk9NCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaWRUaHJvdWdoIOKAlCBuZXZlciBmcm9tIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGhlaWdodCDigJQgc28gcGVyaW9kCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJpZXMgYXJlIGZpeGVkIGF0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmliZSB0aW1lIGFuZCBuZXZlciBkcmlmdC4KLy8JRW50aXRsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIDogaGVpZ2h0IDwgcGFpZFRocm91Z2guIE5vdGhpbmcKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZS4gU3RhdHVzIGRvZXMgbm90IGVudGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gaXQ6IGEgY2FuY2VsbGVkCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiBzdGF5cyBlbnRpdGxlZCB0bwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IGl0IGFscmVhZHkgcGFpZCBmb3IuCi8vCVJlbmV3YWwgd2luZG93ICAgICAgICAgICAgICAgICAgICA6IGEgcmVuZXdhbCBpcyBhY2NlcHRlZCBpZmYgQk9USAovLwkgICAgICAgICAgICAgICAgICAgIHBhaWRUaHJvdWdoIC0gaGVpZ2h0IDw9IHBlcmlvZEJsb2NrcyAgIChlYXJseSBib3VuZCkKLy8JICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPCBwYWlkVGhyb3VnaCArIHBlcmlvZEJsb2NrcyAgICAobGF0ZSBib3VuZCkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVhcmx5IGJvdW5kIGNhcHMgcHJlcGF5bWVudAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBvbmUgZnVsbCB1bnN0YXJ0ZWQgcGVyaW9kIOKAlAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNlY29uZCBSZW5ldyBzdHJhaWdodCBhZnRlciBhCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGlzIHJlZnVzZWQsIHdoaWNoIGlzIHdoYXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXMgYW4gYWNjaWRlbnRhbCBkdXBsaWNhdGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bWVudCBzdHJ1Y3R1cmFsbHkgaW1wb3NzaWJsZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBtZXJlbHkgdW5saWtlbHkuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsYXRlIGJvdW5kIGlzIHRoZSBncmFjZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IHJlbmV3aW5nIGFmdGVyIGxhcHNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHMgZnJvbSBwYWlkVGhyb3VnaCwgc28gaXQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjay1wYXlzIHRoZSBsYXBzZWQgc3BhbiB0bwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwIHRoZSBvcmlnaW5hbCBzY2hlZHVsZSBhbmQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV5cyBwYWlkVGhyb3VnaCArIHBlcmlvZEJsb2NrcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGhlaWdodCBmdXJ0aGVyIGJsb2NrcyDigJQgYWx3YXlzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSwgYmVjYXVzZSB0aGUgYm91bmQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZXhjbHVzaXZlIChhdWRpdCBmaW5kaW5nIFkyKS4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBsYXBzZWQgc3Vic2NyaWJlciB3aG8gcHJlZmVycwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZyZXNoIGZ1bGwgcGVyaW9kIG1heSBDYW5jZWwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFN1YnNjcmliZSBhZ2FpbiBhdCB0aGUgc2FtZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCBwcmljZTsgU3Vic2NyaWJlJ3MgcmVmdXNhbAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIHN0YXRlcyBib3RoIG9wdGlvbnMuCi8vCUV4cGlyZSAocGVybWlzc2lvbmxlc3MgdmFsdmUpICAgICA6IG9uY2UgaGVpZ2h0ID49IHBhaWRUaHJvdWdoICsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kQmxvY2tzLCBhbnlvbmUgbWF5IG1hcmsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN1YnNjcmlwdGlvbiBFeHBpcmVkLiBObwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5kcyBtb3ZlIOKAlCBldmVyeSBwYXltZW50Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRsZWQgd2hlbiBpdCB3YXMgbWFkZS4gVGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHZlIGV4aXN0cyBzbyB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbnxzdWJzY3JpYmVyIHNsb3QgZnJlZXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBkZXBlbmRpbmcgb24gZWl0aGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnR5LCBhbmQgU3Vic2NyaWJlIGl0c2VsZgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZXMgYW4gZXhwaXJlZCBpbmN1bWJlbnQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGEgZnJlc2ggc3RhcnQgbmV2ZXIgZGVwZW5kcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBob3VzZWtlZXBpbmcgaGF2aW5nIHJ1bi4gVGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmV3YWJsZSBhbmQgZXhwaXJhYmxlIGhlaWdodAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRzIHBhcnRpdGlvbiBleGFjdGx5OiBubwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgaXMgaW4gYm90aCBvciBuZWl0aGVyLgovLwlDYW5jZWwgKHN1YnNjcmliZXIgb25seSkgICAgICAgICAgOiBBY3RpdmUgLT4gQ2FuY2VsbGVkLiBUZXJtaW5hbC4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVmdW5kIOKAlCBwYXltZW50cyBzZXR0bGUgdG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3ZpZGVyIGF0IHBheW1lbnQgdGltZSwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdoYXQgd2FzIGJvdWdodCAoZW50aXRsZW1lbnQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBwYWlkVGhyb3VnaCkgc3RheXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91Z2h0LiBXaGF0IGNhbmNlbGxhdGlvbiBlbmRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBPQkxJR0FUSU9OOiBhIENhbmNlbGxlZAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gY2FuIG5ldmVyIGJlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmV3ZWQsIGJ5IHRoZSBzdWJzY3JpYmVyIG9yCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueW9uZSBlbHNlLgovLwlSZXRpcmVQbGFuIChwcm92aWRlciBvbmx5KSAgICAgICAgOiBubyBuZXcgU3Vic2NyaWJlcywgbm8gcmVuZXdhbHMuCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nIGVudGl0bGVtZW50cyBydW4gdG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpZFRocm91Z2ggdW50b3VjaGVkLiBSZWZ1c2luZwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5ld2FscyBvbiBhIHJldGlyZWQgcGxhbiBpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyIHByb3RlY3Rpb246IG5vYm9keQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ga2VlcCBwYXlpbmcgZm9yIGEgc2VydmljZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBwcm92aWRlciBhbm5vdW5jZWQgaXRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC4KLy8KLy8gVGhlIG9ibGlnYXRpb24gaXMgdGhlcmVmb3JlIGV4cGxpY2l0IG9uIGNoYWluIGF0IGV2ZXJ5IG1vbWVudDogYQovLyBzdWJzY3JpcHRpb24gb3dlcyBub3RoaW5nICh0aGVyZSBpcyBubyBwdWxsIHBheW1lbnQgYW5kIG5vIGRlYnQg4oCUIGEKLy8gbGFwc2Ugc2ltcGx5IGVuZHMgZW50aXRsZW1lbnQpLCBhbmQgdGhlIHJlYWxtIG93ZXMgdGhlIHN1YnNjcmliZXIKLy8gZXhhY3RseSBgcGFpZFRocm91Z2ggLSBoZWlnaHRgIGJsb2NrcyBvZiBlbnRpdGxlbWVudCwgcXVlcnlhYmxlIGJ5Ci8vIGFueW9uZSB2aWEgUGFpZFRocm91Z2ggLyBFbnRpdGxlZCAvIEVudGl0bGVkRm9yLgovLwovLyBXSE8gUEFZUyBXSE9NLiBQYXltZW50cyBzZXR0bGUgaW1tZWRpYXRlbHk6IHByaWNlIC0gZmVlIGlzIGNyZWRpdGVkCi8vIHRvIHRoZSBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlLCBmZWUgdG8gdGhlIHByb3RvY29sIHBvdCwgYm90aAovLyBpbnNpZGUgdGhlIHNhbWUgZmVlbGVkZ2VyIHRoZSBzaWJsaW5nIHJlYWxtcyB1c2UuIFRoZXJlIGlzIG5vIGVzY3JvdzoKLy8gSCA9PSBVICsgRiBhdCBhbGwgdGltZXMgKHBsdXMgb3V0LW9mLWJhbmQgc3VycGx1cywgcmVjb3ZlcmFibGUgYnkKLy8gU3dlZXBEZW5vbSBhYm92ZSB0aGUgTGlhYmlsaXRpZXMgcmVzZXJ2ZSkuIFRoZSByZW5ld2FsIGNhbGxlciBtdXN0IGJlCi8vIHRoZSBzdWJzY3JpYmVyIOKAlCBhIHRoaXJkIHBhcnR5IGNhbm5vdCBleHRlbmQgc29tZW9uZSBlbHNlJ3MKLy8gc3Vic2NyaXB0aW9uLCB3aGljaCBjbG9zZXMgYm90aCBhIGNvbnNlbnQgcHJvYmxlbSAoYW4gdW53YW50ZWQgZ2lmdAovLyByZS1hcm1zIGEgbGFwc2luZyBvYmxpZ2F0aW9uKSBhbmQgYSBncmllZmluZyBlZGdlIChzcGVuZGluZyBwZW5uaWVzCi8vIHRvIGtlZXAgYSB2aWN0aW0ncyBzbG90IG9jY3VwaWVkKS4KLy8KLy8gRkVFUyBmb2xsb3cgdGhlIGhvdXNlIHBhdHRlcm4gZXhhY3RseTogYSBjb21waWxlLXRpbWUgTWF4RmVlQnBzCi8vIGNlaWxpbmcsIHRoZSBjdXJyZW50IGZlZSBzbmFwc2hvdHRlZCBpbnRvIHRoZSBQTEFOIGF0IENyZWF0ZVBsYW4KLy8gKHByb3ZpZGVyIGNvbnNlbnRzIHZpYSBpdHMgb3duIG1heEZlZUJwcyBhcmd1bWVudCksIGNvcGllZCBpbnRvIHRoZQovLyBzdWJzY3JpcHRpb24gYXQgU3Vic2NyaWJlLCBhbmQgY2hhcmdlZCBhdCBldmVyeSBwYXltZW50IGZyb20gdGhlCi8vIFBST1ZJREVSJ3Mgc2lkZS4gQSBsYXRlciBTZXRGZWVCcHMgdG91Y2hlcyBvbmx5IHBsYW5zIGNyZWF0ZWQKLy8gYWZ0ZXJ3YXJkczsgbm8gZXhpc3RpbmcgcGxhbiBvciBzdWJzY3JpcHRpb24gY2FuIGhhdmUgaXRzIGZlZSBtb3ZlZAovLyBieSBhbnlvbmUuCi8vCi8vIFJFQUxNLUNBTExFUiBDQVZFQVQsIGluaGVyaXRlZCBmcm9tIHRoZSBzaWJsaW5ncyB2ZXJiYXRpbTogY29pbmlvJ3MKLy8gcmVjZWlwdCBndWFyZCBhZG1pdHMgb25seSBFT0EgcGF5ZXJzLCBzbyBzdWJzY3JpYmVycyBhcmUgRU9BczsKLy8gYXNzZXJ0Tm9TZW5kIHJlYWRzIHRoZSBPUklHSU4gZW52ZWxvcGUsIHNvIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uCi8vIHJlZnVzZXMgYW55IHRyYW5zYWN0aW9uIHRoYXQgYXR0YWNoZWQgY29pbnMgYW55d2hlcmUuIFByb3ZpZGVycyBtYXkKLy8gYmUgRU9BcyBvciByZWFsbXMsIGJ1dCBhIHJlYWxtIHByb3ZpZGVyIG11c3QgZXhwb3NlIGl0cyBvd24gY3Jvc3NpbmcKLy8gcGF0aCB0byBDbGFpbSwgb3Igd2hhdCBpdCBlYXJucyBpcyBzdHJhbmRlZCAoc2VlIFJlZ2lzdGVyU2VydmljZSdzCi8vIGNhdmVhdCBpbiBzZXJ2aWNlX21hcmtldCDigJQgdGhlIHNhbWUgdGhyZWUgb2JsaWdhdGlvbnMgYXBwbHkpLgpwYWNrYWdlIHN1YnNjcmlwdGlvbnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvY29pbmlvIgoJImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIFBsYW4gc3RhdHVzIHZhbHVlcy4KY29uc3QgKAoJUGxhbkFjdGl2ZSAgPSAiYWN0aXZlIgoJUGxhblJldGlyZWQgPSAicmV0aXJlZCIKKQoKLy8gU3Vic2NyaXB0aW9uIHN0YXR1cyB2YWx1ZXMuIENhbmNlbGxlZCBhbmQgRXhwaXJlZCBhcmUgdGVybWluYWwuCmNvbnN0ICgKCVN1YkFjdGl2ZSAgICA9ICJhY3RpdmUiCglTdWJDYW5jZWxsZWQgPSAiY2FuY2VsbGVkIgoJU3ViRXhwaXJlZCAgID0gImV4cGlyZWQiCikKCi8vIElucHV0IGJvdW5kcy4KY29uc3QgKAoJTWF4VGl0bGVMZW4gPSA4MAoJTWF4RGVzY0xlbiAgPSAyMDAwCglNaW5QcmljZSAgICA9IGludDY0KDEpCgoJLy8gTWluUGVyaW9kQmxvY2tzL01heFBlcmlvZEJsb2NrcyBib3VuZCBhIHBsYW4ncyBiaWxsaW5nIHBlcmlvZDoKCS8vIH40MCBzZWNvbmRzIHRvIH4xIHllYXIgYXQgcGVhcmwncyBvYnNlcnZlZCB+NC4ycyBibG9ja3MuIFRoZQoJLy8gZmxvb3Iga2VlcHMgYSBob3N0aWxlIHBsYW4gZnJvbSB0dXJuaW5nIHJlbmV3YWwgaW50byBhCgkvLyBwZXItYmxvY2sgdHJlYWRtaWxsOyB0aGUgY2VpbGluZyBrZWVwcyBwYWlkVGhyb3VnaCBhcml0aG1ldGljCgkvLyBmYXIgZnJvbSBvdmVyZmxvdyBldmVuIGF0IG1heGltdW0gcHJlcGF5bWVudC4KCU1pblBlcmlvZEJsb2NrcyA9IGludDY0KDEwKQoJTWF4UGVyaW9kQmxvY2tzID0gaW50NjQoNzUwMDAwMCkKCgkvLyBNYXhQbGFuc1BlclByb3ZpZGVyIGJvdW5kcyBjYXRhbG9nIG1vbm9wb2xpemF0aW9uIGJ5IGEgc2luZ2xlCgkvLyBhZGRyZXNzIOKAlCB0aGUgZmluZGluZyB0aGF0IHdhcyBSRUQgaW4gcGVybWlzc2lvbl9yZWdpc3RyeSBhbmQKCS8vIHNlcnZpY2VfcmVnaXN0cnksIGNhcnJpZWQgZnJvbSB0aGUgc3RhcnQgaGVyZS4KCU1heFBsYW5zUGVyUHJvdmlkZXIgPSAyMAoKCS8vIE1heFN1YnNQZXJTdWJzY3JpYmVyIGJvdW5kcyBvbmUgYWNjb3VudCdzIG9wZW4tc3Vic2NyaXB0aW9uCgkvLyBzdGF0ZS4gVGVybWluYWwgc3Vic2NyaXB0aW9ucyBmcmVlIHRoZWlyIHNsb3QuCglNYXhTdWJzUGVyU3Vic2NyaWJlciA9IDEwMAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyBldmVyeSByZW5kZXJlZCBsaXN0IOKAlCBhbiB1bmJvdW5kZWQgUmVuZGVyCgkvLyB3YXMgWUVMTE9XIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKdHlwZSBwbGFuIHN0cnVjdCB7CglpZCAgICAgICAgICAgaW50NjQKCXByb3ZpZGVyICAgICBhZGRyZXNzCgl0aXRsZSAgICAgICAgc3RyaW5nCglkZXNjcmlwdGlvbiAgc3RyaW5nCglwcmljZSAgICAgICAgaW50NjQKCXBlcmlvZEJsb2NrcyBpbnQ2NAoJZmVlQnBzICAgICAgIGludDY0IC8vIHNuYXBzaG90dGVkIGF0IGNyZWF0aW9uLCBjaGFyZ2VkIGF0IGV2ZXJ5IHBheW1lbnQKCXN0YXR1cyAgICAgICBzdHJpbmcKCXN1YnMgICAgICAgICBpbnQ2NCAvLyBsaWZldGltZSBjb3VudCwgbmV2ZXIgZGVjcmVtZW50ZWQKfQoKdHlwZSBzdWIgc3RydWN0IHsKCWlkICAgICAgICAgICBpbnQ2NAoJcGxhbklEICAgICAgIGludDY0CglzdWJzY3JpYmVyICAgYWRkcmVzcwoJcHJvdmlkZXIgICAgIGFkZHJlc3MgLy8gY29waWVkIGF0IFN1YnNjcmliZTsgbmV2ZXIgcmUtcmVhZCBmcm9tIHRoZSBwbGFuCglwcmljZSAgICAgICAgaW50NjQgICAvLyBjb3BpZWQgYXQgU3Vic2NyaWJlOyBhIHBsYW4gaXMgaW1tdXRhYmxlIGFueXdheQoJcGVyaW9kQmxvY2tzIGludDY0ICAgLy8gY29waWVkIGF0IFN1YnNjcmliZQoJZmVlQnBzICAgICAgIGludDY0ICAgLy8gY29waWVkIGF0IFN1YnNjcmliZSBmcm9tIHRoZSBwbGFuJ3Mgc25hcHNob3QKCXN0YXR1cyAgICAgICBzdHJpbmcKCXBhaWRUaHJvdWdoICBpbnQ2NCAvLyBhYnNvbHV0ZSBoZWlnaHQ7IGVudGl0bGVtZW50ID0gaGVpZ2h0IDwgcGFpZFRocm91Z2gKCXBlcmlvZHMgICAgICBpbnQ2NCAvLyBsaWZldGltZSBwYWlkLXBlcmlvZCBjb3VudAp9Cgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MgLy8gbWF5IHNldCBmZWUsIGZlZSByZWNpcGllbnQsIHN0YWdlIHN1Y2Nlc3NvcgoJcGVuZGluZ0FkbWluIGFkZHJlc3MgLy8gc3RhZ2VkIGJ5IFRyYW5zZmVyQWRtaW4sIGNvbXBsZXRlcyB2aWEgQWNjZXB0QWRtaW4KCWZlZVJlY2lwaWVudCBhZGRyZXNzIC8vIG1heSB3aXRoZHJhdyBmZWVzIGFuZCBzd2VlcCBzdXJwbHVzCglmZWVCcHMgICAgICAgaW50NjQgICAvLyBmZWUgc25hcHNob3R0ZWQgaW50byBORVcgcGxhbnMKCglzZWxmICAgICBhZGRyZXNzIC8vIHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBjYXB0dXJlZCBhdCBkZXBsb3kKCW5leHRQbGFuIGludDY0CgluZXh0U3ViICBpbnQ2NAoKCXBsYW5zICAgICAgID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAgICAgICAgICAgICAgIC0+ICpwbGFuCglzdWJzICAgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpICAgICAgICAgICAgICAgICAtPiAqc3ViCglhY3RpdmVCeUtleSA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQocGxhbklEKXxzdWJzY3JpYmVyICAtPiBpbnQ2NCBzdWIgaWQsIHdoaWxlIEFjdGl2ZQoJbGF0ZXN0QnlLZXkgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKHBsYW5JRCl8c3Vic2NyaWJlciAgLT4gbW9zdCByZWNlbnQgc3ViIGlkLCBuZXZlciByZW1vdmVkCglwcm92aWRlck51bSA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyAtPiAqaW50NjQsIGxpdmUgcGxhbnMgcGVyIHByb3ZpZGVyCglzdWJOdW0gICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gYWRkcmVzcyAtPiAqaW50NjQsIEFjdGl2ZSBzdWJzIHBlciBzdWJzY3JpYmVyCglsZWRnZXIgICAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gcHJvdmlkZXIgc2lkZSAtLS0KCi8vIENyZWF0ZVBsYW4gcHVibGlzaGVzIGEgc3Vic2NyaXB0aW9uIHBsYW4gYW5kIHJldHVybnMgaXRzIGlkLiBObyBjb2lucwovLyBhcmUgYWNjZXB0ZWQ7IHRoZSBzdG9yYWdlIGRlcG9zaXQgdGhlIGNhbGxlciBwYXlzIGlzIHRoZSBhbnRpLXNwYW0uCi8vIFRoZSBjdXJyZW50IHByb3RvY29sIGZlZSBpcyBzbmFwc2hvdHRlZCBpbnRvIHRoZSBwbGFuIGFuZCBtdXN0IG5vdAovLyBleGNlZWQgbWF4RmVlQnBzLCB0aGUgY2VpbGluZyB0aGUgcHJvdmlkZXIgc2lnbmVkIGZvciDigJQgcGFzcwovLyBNYXhGZWVCcHMgdG8gYWNjZXB0IGFueSBsZWdhbCBmZWUuIFBsYW5zIGFyZSBpbW11dGFibGUgb25jZSBjcmVhdGVkOgovLyBwcmljZSBhbmQgcGVyaW9kIGNoYW5nZXMgYXJlIGEgbmV3IHBsYW4sIHNvIG5vdGhpbmcgYSBzdWJzY3JpYmVyCi8vIGFncmVlZCB0byBjYW4gbW92ZSB1bmRlcm5lYXRoIHRoZW0uCmZ1bmMgQ3JlYXRlUGxhbihjdXIgcmVhbG0sIHRpdGxlLCBkZXNjcmlwdGlvbiBzdHJpbmcsIHByaWNlLCBwZXJpb2RCbG9ja3MsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJYXNzZXJ0Tm9TZW5kKCkKCXByb3ZpZGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmIHRpdGxlID09ICIiIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWMoInRpdGxlIG11c3QgYmUgMS4uIiArIGl0b2EoaW50NjQoTWF4VGl0bGVMZW4pKSArICIgYnl0ZXMiKQoJfQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NMZW4gewoJCXBhbmljKCJkZXNjcmlwdGlvbiB0b28gbG9uZyIpCgl9CglpZiBwcmljZSA8IE1pblByaWNlIHsKCQlwYW5pYygicHJpY2UgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QcmljZSkgKyBEZW5vbSkKCX0KCWlmIHBlcmlvZEJsb2NrcyA8IE1pblBlcmlvZEJsb2NrcyB8fCBwZXJpb2RCbG9ja3MgPiBNYXhQZXJpb2RCbG9ja3MgewoJCXBhbmljKCJwZXJpb2RCbG9ja3MgbXVzdCBiZSBpbiBbIiArIGl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIsICIgKwoJCQlpdG9hKE1heFBlcmlvZEJsb2NrcykgKyAiXSIpCgl9CglpZiBmZWVCcHMgPiBtYXhGZWVCcHMgewoJCXBhbmljKCJjdXJyZW50IGZlZSAiICsgaXRvYShmZWVCcHMpICsgIiBicHMgZXhjZWVkcyB0aGUgY2FsbGVyJ3MgbWF4aW11bSAiICsKCQkJaXRvYShtYXhGZWVCcHMpKQoJfQoJbiA6PSBjb3VudGVyKHByb3ZpZGVyTnVtLCBwcm92aWRlcikKCWlmICpuID49IE1heFBsYW5zUGVyUHJvdmlkZXIgewoJCXBhbmljKCJwZXItcHJvdmlkZXIgcGxhbiBsaW1pdCByZWFjaGVkIikKCX0KCglpZCA6PSBuZXh0UGxhbgoJbmV4dFBsYW4rKwoJcGxhbnMuU2V0KHBhZElEKGlkKSwgJnBsYW57CgkJaWQ6ICAgICAgICAgICBpZCwKCQlwcm92aWRlcjogICAgIHByb3ZpZGVyLAoJCXRpdGxlOiAgICAgICAgdGl0bGUsCgkJZGVzY3JpcHRpb246ICBkZXNjcmlwdGlvbiwKCQlwcmljZTogICAgICAgIHByaWNlLAoJCXBlcmlvZEJsb2NrczogcGVyaW9kQmxvY2tzLAoJCWZlZUJwczogICAgICAgZmVlQnBzLAoJCXN0YXR1czogICAgICAgUGxhbkFjdGl2ZSwKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiUGxhbkNyZWF0ZWQiLAoJCSJwbGFuSWQiLCBpdG9hKGlkKSwKCQkicHJvdmlkZXIiLCBwcm92aWRlci5TdHJpbmcoKSwKCQkicHJpY2UiLCBpdG9hKHByaWNlKSwKCQkicGVyaW9kQmxvY2tzIiwgaXRvYShwZXJpb2RCbG9ja3MpLAoJCSJmZWVCcHMiLCBpdG9hKGZlZUJwcyksCgkpCglyZXR1cm4gaWQKfQoKLy8gUmV0aXJlUGxhbiB0YWtlcyBhIHBsYW4gb2ZmIHRoZSBtYXJrZXQ6IG5vIG5ldyBzdWJzY3JpcHRpb25zIGFuZCBubwovLyByZW5ld2Fscy4gUHJvdmlkZXIgb25seS4gRXhpc3RpbmcgZW50aXRsZW1lbnRzIHJ1biB0byB0aGVpcgovLyBwYWlkVGhyb3VnaCB1bnRvdWNoZWQ7IHJlZnVzaW5nIHJlbmV3YWxzIGlzIHN1YnNjcmliZXIgcHJvdGVjdGlvbiDigJQKLy8gbm9ib2R5IGtlZXBzIHBheWluZyBmb3IgYSBzZXJ2aWNlIHdob3NlIHByb3ZpZGVyIGFubm91bmNlZCBpdHMgZW5kLgovLyBUaGUgcHJvdmlkZXIncyBwbGFuLXF1b3RhIHNsb3QgZnJlZXMuCmZ1bmMgUmV0aXJlUGxhbihjdXIgcmVhbG0sIHBsYW5JRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXAgOj0gbXVzdEdldFBsYW4ocGxhbklEKQoJaWYgY2FsbGVyICE9IHAucHJvdmlkZXIgewoJCXBhbmljKCJvbmx5IHRoZSBwcm92aWRlciBtYXkgcmV0aXJlIGEgcGxhbiIpCgl9CglpZiBwLnN0YXR1cyAhPSBQbGFuQWN0aXZlIHsKCQlwYW5pYygicGxhbiBpcyBub3QgYWN0aXZlIikKCX0KCXAuc3RhdHVzID0gUGxhblJldGlyZWQKCSpjb3VudGVyKHByb3ZpZGVyTnVtLCBwLnByb3ZpZGVyKS0tCgljaGFpbi5FbWl0KCJQbGFuUmV0aXJlZCIsICJwbGFuSWQiLCBpdG9hKHBsYW5JRCksICJwcm92aWRlciIsIHAucHJvdmlkZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSBzdWJzY3JpYmVyIHNpZGUgLS0tCgovLyBTdWJzY3JpYmUgcGF5cyBmb3IgdGhlIGZpcnN0IGJpbGxpbmcgcGVyaW9kIG9mIGEgcGxhbiBhbmQgcmV0dXJucyB0aGUKLy8gbmV3IHN1YnNjcmlwdGlvbiBpZC4gVGhlIHRyYW5zYWN0aW9uIG11c3QgYXR0YWNoIEVYQUNUTFkgdGhlIHBsYW4ncwovLyBwcmljZSBpbiB1Z25vdCDigJQgb3Zlci0gYW5kIHVuZGVycGF5bWVudCBhcmUgYm90aCByZWZ1c2VkLCBzbyBhCi8vIG1pc3Rha2VuIGRvdWJsZS1hdHRhY2ggY2Fubm90IHNpbGVudGx5IGJlY29tZSBhIGRvbmF0aW9uLiBPbmUKLy8gc3Vic2NyaWJlciBob2xkcyBhdCBtb3N0IG9uZSBsaXZlIHN1YnNjcmlwdGlvbiBwZXIgcGxhbjogaWYgYW4gQWN0aXZlCi8vIG9uZSBleGlzdHMgdGhlIGNhbGwgaXMgcmVmdXNlZCAodGhlIHJlbmV3YWwgcGF0aCBpcyBSZW5ldywgbmV2ZXIgYQovLyBzZWNvbmQgU3Vic2NyaWJlIOKAlCB0aGF0IGlzIHRoZSBkdXBsaWNhdGUtcGF5bWVudCBndWFyZCBhdCB0aGUKLy8gaWRlbnRpdHkgbGV2ZWwpOyBhbiBpbmN1bWJlbnQgcGFzdCBpdHMgZ3JhY2Ugd2luZG93IGlzIGNvbGxhcHNlZCB0bwovLyBFeHBpcmVkIGluIHBsYWNlLCBzbyBhIGZyZXNoIHN0YXJ0IG5ldmVyIHdhaXRzIG9uIGhvdXNla2VlcGluZy4KLy8KLy8gVGhlIHBheW1lbnQgc2V0dGxlcyBpbW1lZGlhdGVseTogcHJpY2UgbWludXMgdGhlIHBsYW4ncyBzbmFwc2hvdHRlZAovLyBmZWUgdG8gdGhlIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UsIGZlZSB0byB0aGUgcHJvdG9jb2wgcG90LgovLyBFbnRpdGxlbWVudCBydW5zIGZyb20gdGhpcyBibG9jazogcGFpZFRocm91Z2ggPSBoZWlnaHQgKyBwZXJpb2RCbG9ja3MuCmZ1bmMgU3Vic2NyaWJlKGN1ciByZWFsbSwgcGxhbklEIGludDY0KSBpbnQ2NCB7CglzdWJzY3JpYmVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCXAgOj0gbXVzdEdldFBsYW4ocGxhbklEKQoJaWYgcC5zdGF0dXMgIT0gUGxhbkFjdGl2ZSB7CgkJcGFuaWMoInBsYW4gaXMgbm90IGFjdGl2ZSIpCgl9CglpZiBhbW91bnQgIT0gcC5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgcGxhbiBwcmljZTogIiArIGl0b2EocC5wcmljZSkgKyBEZW5vbSkKCX0KCglrZXkgOj0gcGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkKCWlmIHYgOj0gYWN0aXZlQnlLZXkuR2V0KGtleSk7IHYgIT0gbmlsIHsKCQlpbmMgOj0gbXVzdEdldFN1Yih2LihpbnQ2NCkpCgkJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpID49IGluYy5wYWlkVGhyb3VnaCtpbmMucGVyaW9kQmxvY2tzIHsKCQkJZXhwaXJlSW5QbGFjZShpbmMpCgkJfSBlbHNlIGlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+PSBpbmMucGFpZFRocm91Z2ggewoJCQlwYW5pYygic3Vic2NyaXB0aW9uICIgKyBpdG9hKGluYy5pZCkgKyAiIHRvIHRoaXMgcGxhbiBpcyBsYXBzZWQgYnV0IHJlbmV3YWJsZTogIiArCgkJCQkiUmVuZXcgYmFjay1wYXlzIHRoZSBsYXBzZWQgc3BhbiBhbmQga2VlcHMgdGhlIHNjaGVkdWxlOyAiICsKCQkJCSJDYW5jZWwgdGhlbiBTdWJzY3JpYmUgcmVzdGFydHMgZnJlc2ggYXQgdGhlIHNhbWUgcHJpY2UiKQoJCX0gZWxzZSB7CgkJCXBhbmljKCJhbiBhY3RpdmUgc3Vic2NyaXB0aW9uIHRvIHRoaXMgcGxhbiBhbHJlYWR5IGV4aXN0czogcmVuZXcgaXQgaW5zdGVhZCIpCgkJfQoJfQoJbiA6PSBjb3VudGVyKHN1Yk51bSwgc3Vic2NyaWJlcikKCWlmICpuID49IE1heFN1YnNQZXJTdWJzY3JpYmVyIHsKCQlwYW5pYygicGVyLXN1YnNjcmliZXIgc3Vic2NyaXB0aW9uIGxpbWl0IHJlYWNoZWQiKQoJfQoKCWxlZGdlci5NdXN0RGVwb3NpdChwLnByb3ZpZGVyLlN0cmluZygpLCBhbW91bnQsIHAuZmVlQnBzKQoKCWlkIDo9IG5leHRTdWIKCW5leHRTdWIrKwoJc3Vicy5TZXQocGFkSUQoaWQpLCAmc3ViewoJCWlkOiAgICAgICAgICAgaWQsCgkJcGxhbklEOiAgICAgICBwbGFuSUQsCgkJc3Vic2NyaWJlcjogICBzdWJzY3JpYmVyLAoJCXByb3ZpZGVyOiAgICAgcC5wcm92aWRlciwKCQlwcmljZTogICAgICAgIHAucHJpY2UsCgkJcGVyaW9kQmxvY2tzOiBwLnBlcmlvZEJsb2NrcywKCQlmZWVCcHM6ICAgICAgIHAuZmVlQnBzLAoJCXN0YXR1czogICAgICAgU3ViQWN0aXZlLAoJCXBhaWRUaHJvdWdoOiAgcnVudGltZS5DaGFpbkhlaWdodCgpICsgcC5wZXJpb2RCbG9ja3MsCgkJcGVyaW9kczogICAgICAxLAoJfSkKCWFjdGl2ZUJ5S2V5LlNldChrZXksIGlkKQoJbGF0ZXN0QnlLZXkuU2V0KGtleSwgaWQpCgkqbisrCglwLnN1YnMrKwoKCWNoYWluLkVtaXQoIlN1YnNjcmliZWQiLAoJCSJzdWJJZCIsIGl0b2EoaWQpLAoJCSJwbGFuSWQiLCBpdG9hKHBsYW5JRCksCgkJInN1YnNjcmliZXIiLCBzdWJzY3JpYmVyLlN0cmluZygpLAoJCSJwcm92aWRlciIsIHAucHJvdmlkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicGFpZFRocm91Z2giLCBpdG9hKHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKStwLnBlcmlvZEJsb2NrcyksCgkpCglyZXR1cm4gaWQKfQoKLy8gUmVuZXcgcGF5cyBmb3IgdGhlIG5leHQgYmlsbGluZyBwZXJpb2Qgb2YgdGhlIGNhbGxlcidzIG93bgovLyBzdWJzY3JpcHRpb24uIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGF0dGFjaCBleGFjdGx5IHRoZSBzdWJzY3JpcHRpb24ncwovLyBwcmljZS4gVGhlIHJlbmV3YWwgd2luZG93IGlzIGRldGVybWluaXN0aWMgYW5kIHN0YXRlZCBpbiB0aGUgaGVhZGVyOgovLyBhY2NlcHRlZCBpZmYgcGFpZFRocm91Z2ggLSBoZWlnaHQgPD0gcGVyaW9kQmxvY2tzIChhdCBtb3N0IG9uZSBmdWxsCi8vIHVuc3RhcnRlZCBwZXJpb2QgcHJlcGFpZCDigJQgdGhlIGR1cGxpY2F0ZS1wYXltZW50IGJvdW5kKSBhbmQgaGVpZ2h0IDwKLy8gcGFpZFRocm91Z2ggKyBwZXJpb2RCbG9ja3MgKHRoZSBncmFjZSBib3VuZCwgZXhjbHVzaXZlIOKAlCBhIHJlbmV3YWwKLy8gYWx3YXlzIGJ1eXMgYXQgbGVhc3Qgb25lIGJsb2NrKS4gRXh0ZW5zaW9uIGlzIGFsd2F5cwovLyBGUk9NIHBhaWRUaHJvdWdoLCBzbyBwZXJpb2QgYm91bmRhcmllcyBuZXZlciBkcmlmdCwgYW5kIGEgcmVuZXdhbAovLyBpbnNpZGUgZ3JhY2UgY292ZXJzIHRoZSBsYXBzZWQgc3BhbiDigJQgdGhhdCBpcyB0aGUgcHJpY2Ugb2Yga2VlcGluZwovLyB0aGUgb3JpZ2luYWwgc2NoZWR1bGUsIGFuZCBpdCBpcyB0aGUgZG9jdW1lbnRlZCwgZGV0ZXJtaW5pc3RpYwovLyBjaG9pY2UuCmZ1bmMgUmVuZXcoY3VyIHJlYWxtLCBzdWJJRCBpbnQ2NCkgewoJcGF5ZXIsIGFtb3VudCA6PSBjb2luaW8uUmVjZWl2ZSgwLCBjdXIsIERlbm9tKQoJcyA6PSBtdXN0R2V0U3ViKHN1YklEKQoJaWYgcGF5ZXIgIT0gcy5zdWJzY3JpYmVyIHsKCQlwYW5pYygib25seSB0aGUgc3Vic2NyaWJlciBtYXkgcmVuZXciKQoJfQoJaWYgcy5zdGF0dXMgIT0gU3ViQWN0aXZlIHsKCQlwYW5pYygic3Vic2NyaXB0aW9uIGlzICIgKyBzLnN0YXR1cykKCX0KCXAgOj0gbXVzdEdldFBsYW4ocy5wbGFuSUQpCglpZiBwLnN0YXR1cyAhPSBQbGFuQWN0aXZlIHsKCQlwYW5pYygicGxhbiBpcyByZXRpcmVkOyB0aGUgcGFpZCBwZXJpb2QgcnVucyB0byBpdHMgZW5kIGJ1dCBjYW5ub3QgYmUgcmVuZXdlZCIpCgl9CglpZiBhbW91bnQgIT0gcy5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgc3Vic2NyaXB0aW9uIHByaWNlOiAiICsgaXRvYShzLnByaWNlKSArIERlbm9tKQoJfQoJaCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIHMucGFpZFRocm91Z2gtaCA+IHMucGVyaW9kQmxvY2tzIHsKCQlwYW5pYygidG9vIGVhcmx5OiBhdCBtb3N0IG9uZSB1bnN0YXJ0ZWQgcGVyaW9kIG1heSBiZSBwcmVwYWlkOyByZW5ld2FibGUgZnJvbSBoZWlnaHQgIiArCgkJCWl0b2Eocy5wYWlkVGhyb3VnaC1zLnBlcmlvZEJsb2NrcykpCgl9CglpZiBoID49IHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MgewoJCXBhbmljKCJncmFjZSB3aW5kb3cgb3ZlcjsgdGhlIHN1YnNjcmlwdGlvbiBpcyBleHBpcmFibGUsIHN1YnNjcmliZSBhZnJlc2giKQoJfQoKCWxlZGdlci5NdXN0RGVwb3NpdChzLnByb3ZpZGVyLlN0cmluZygpLCBhbW91bnQsIHMuZmVlQnBzKQoJcy5wYWlkVGhyb3VnaCArPSBzLnBlcmlvZEJsb2NrcwoJcy5wZXJpb2RzKysKCgljaGFpbi5FbWl0KCJSZW5ld2VkIiwKCQkic3ViSWQiLCBpdG9hKHN1YklEKSwKCQkic3Vic2NyaWJlciIsIHMuc3Vic2NyaWJlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJwYWlkVGhyb3VnaCIsIGl0b2Eocy5wYWlkVGhyb3VnaCksCgkpCn0KCi8vIENhbmNlbCBlbmRzIHRoZSBjYWxsZXIncyBvd24gc3Vic2NyaXB0aW9uLiBUZXJtaW5hbDogaXQgY2FuIG5ldmVyIGJlCi8vIHJlbmV3ZWQgYWZ0ZXJ3YXJkcywgYnkgYW55b25lLiBObyByZWZ1bmQgYW5kIG5vIGZ1bmRzIG1vdmUg4oCUIGV2ZXJ5Ci8vIHBheW1lbnQgc2V0dGxlZCB3aGVuIGl0IHdhcyBtYWRlLCBhbmQgdGhlIGVudGl0bGVtZW50IGFscmVhZHkgYm91Z2h0Ci8vIChoZWlnaHQgPCBwYWlkVGhyb3VnaCkgcmVtYWlucyB1bnRpbCBpdCBydW5zIG91dC4gVGhlIHBsYW4gc2xvdCBhbmQKLy8gdGhlIHN1YnNjcmliZXIncyBxdW90YSBzbG90IGZyZWUgaW1tZWRpYXRlbHkuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgc3ViSUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglpZiBjYWxsZXIgIT0gcy5zdWJzY3JpYmVyIHsKCQlwYW5pYygib25seSB0aGUgc3Vic2NyaWJlciBtYXkgY2FuY2VsIikKCX0KCWlmIHMuc3RhdHVzICE9IFN1YkFjdGl2ZSB7CgkJcGFuaWMoInN1YnNjcmlwdGlvbiBpcyAiICsgcy5zdGF0dXMpCgl9CglzLnN0YXR1cyA9IFN1YkNhbmNlbGxlZAoJcmVsZWFzZVNsb3RzKHMpCgljaGFpbi5FbWl0KCJDYW5jZWxsZWQiLAoJCSJzdWJJZCIsIGl0b2Eoc3ViSUQpLAoJCSJzdWJzY3JpYmVyIiwgcy5zdWJzY3JpYmVyLlN0cmluZygpLAoJCSJwYWlkVGhyb3VnaCIsIGl0b2Eocy5wYWlkVGhyb3VnaCksCgkpCn0KCi8vIEV4cGlyZSBtYXJrcyBhIGxhcHNlZCBzdWJzY3JpcHRpb24gRXhwaXJlZCBvbmNlIGl0cyBncmFjZSB3aW5kb3cgaXMKLy8gb3ZlcjogaGVpZ2h0ID49IHBhaWRUaHJvdWdoICsgcGVyaW9kQmxvY2tzLiBQZXJtaXNzaW9ubGVzcyBieSBkZXNpZ24g4oCUCi8vIGxpa2UgdGhlIHNpYmxpbmcgcmVhbG1zJyB2YWx2ZXMsIG5vIHNsb3QncyBsaXZlbmVzcyBtYXkgZGVwZW5kIG9uCi8vIGVpdGhlciBwYXJ0eSBzaG93aW5nIHVwLiBObyBmdW5kcyBtb3ZlLgpmdW5jIEV4cGlyZShjdXIgcmVhbG0sIHN1YklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJcyA6PSBtdXN0R2V0U3ViKHN1YklEKQoJaWYgcy5zdGF0dXMgIT0gU3ViQWN0aXZlIHsKCQlwYW5pYygic3Vic2NyaXB0aW9uIGlzICIgKyBzLnN0YXR1cykKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MgewoJCXBhbmljKCJub3QgZXhwaXJhYmxlOiBncmFjZSBydW5zIHRocm91Z2ggaGVpZ2h0ICIgKwoJCQlpdG9hKHMucGFpZFRocm91Z2grcy5wZXJpb2RCbG9ja3MtMSkpCgl9CglleHBpcmVJblBsYWNlKHMpCn0KCi8vIC0tLSBwYXlvdXRzIC0tLQoKLy8gQ2xhaW0gc2VuZHMgYW1vdW50IHVnbm90IG9mIHRoZSBjYWxsZXIncyBjbGFpbWFibGUgYmFsYW5jZSBiYWNrIHRvCi8vIHRoZSBjYWxsZXIuIFByb3ZpZGVycyBlYXJuIGludG8gdGhpcyBiYWxhbmNlIGF0IGV2ZXJ5IHBheW1lbnQuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGNsYWltYWJsZSBiYWxhbmNlIGJhY2sgdG8gdGhlCi8vIGNhbGxlci4gRmFpbHMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBjbGFpbS4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlIGZlZSByZWNpcGllbnQuIE9ubHkgdGhlCi8vIGZlZSByZWNpcGllbnQgbWF5IGNhbGwgaXQsIGFuZCBvbmx5IHRoZSBwb3QgbW92ZXMuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJYW1vdW50IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFN3ZWVwRGVub20gcmVjb3ZlcnMgb3V0LW9mLWJhbmQgY29pbnMgKHNlbnQgYnkgcmF3IGJhbmsgdHJhbnNmZXIsCi8vIG91dHNpZGUgYW55IGVudHJ5cG9pbnQpIHRvIHRoZSBmZWUgcmVjaXBpZW50LiBGb3IgdGhlIGxlZGdlciBkZW5vbQovLyB0aGUgcmVzZXJ2ZSBpcyBMaWFiaWxpdGllcygpIOKAlCB1c2VyIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCBhcmUKLy8gc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlLiBGZWUgcmVjaXBpZW50IG9ubHkuCmZ1bmMgU3dlZXBEZW5vbShjdXIgcmVhbG0sIGRlbm9tIHN0cmluZykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJmZWUgcmVjaXBpZW50IG9ubHkiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBsZWRnZXIuTGlhYmlsaXRpZXMoKQoJfQoJLy8gY29pbmlvLlN3ZWVwIGl0c2VsZiBhYm9ydHMgd2hlbiBub3RoaW5nIHNpdHMgYWJvdmUgdGhlIHJlc2VydmUuCglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uIC0tLQoKLy8gU2V0RmVlQnBzIHNldHMgdGhlIHByb3RvY29sIGZlZSBzbmFwc2hvdHRlZCBpbnRvIEZVVFVSRSBwbGFucy4KLy8gQm91bmRlZCBieSBNYXhGZWVCcHM7IGV4aXN0aW5nIHBsYW5zIGFuZCBzdWJzY3JpcHRpb25zIGFyZSB1bnRvdWNoZWQKLy8g4oCUIHRoZWlyIGZlZSB3YXMgZml4ZWQgdGhlIG1vbWVudCB0aGUgcHJvdmlkZXIgY29uc2VudGVkIHRvIGl0LgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCWlmIGJwcyA8IDAgfHwgYnBzID4gTWF4RmVlQnBzIHsKCQlwYW5pYygiZmVlIG11c3QgYmUgaW4gWzAsICIgKyBpdG9hKE1heEZlZUJwcykgKyAiXSBicHMiKQoJfQoJb2xkIDo9IGZlZUJwcwoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVDaGFuZ2VkIiwgIm9sZEJwcyIsIGl0b2Eob2xkKSwgIm5ld0JwcyIsIGl0b2EoYnBzKSkKfQoKLy8gU2V0RmVlUmVjaXBpZW50IHBvaW50cyBmdXR1cmUgZmVlIHdpdGhkcmF3YWxzIGFuZCBzd2VlcHMgYXQgYSBuZXcKLy8gYWRkcmVzcy4gQWRtaW4gb25seS4gVGhlIHplcm8gYWRkcmVzcyBpcyByZWZ1c2VkIOKAlCBpdCB3b3VsZCBzdHJhbmQKLy8gdGhlIHBvdC4KZnVuYyBTZXRGZWVSZWNpcGllbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCXZhciB6ZXJvIGFkZHJlc3MKCWlmIHJlY2lwaWVudCA9PSB6ZXJvIHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBtdXN0IG5vdCBiZSB0aGUgemVybyBhZGRyZXNzIikKCX0KCW9sZCA6PSBmZWVSZWNpcGllbnQKCWZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50Q2hhbmdlZCIsICJvbGQiLCBvbGQuU3RyaW5nKCksICJuZXciLCByZWNpcGllbnQuU3RyaW5nKCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIGEgdHdvLXN0ZXAgYWRtaW4gaGFuZG92ZXIuIFRoZSBzdWNjZXNzb3IgaG9sZHMKLy8gbm90aGluZyB1bnRpbCBBY2NlcHRBZG1pbi4KZnVuYyBUcmFuc2ZlckFkbWluKGN1ciByZWFsbSwgc3VjY2Vzc29yIGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgl2YXIgemVybyBhZGRyZXNzCglpZiBzdWNjZXNzb3IgPT0gemVybyB7CgkJcGFuaWMoInN1Y2Nlc3NvciBtdXN0IG5vdCBiZSB0aGUgemVybyBhZGRyZXNzIikKCX0KCXBlbmRpbmdBZG1pbiA9IHN1Y2Nlc3NvcgoJY2hhaW4uRW1pdCgiQWRtaW5UcmFuc2ZlclN0YWdlZCIsICJmcm9tIiwgYWRtaW4uU3RyaW5nKCksICJ0byIsIHN1Y2Nlc3Nvci5TdHJpbmcoKSkKfQoKLy8gQWNjZXB0QWRtaW4gY29tcGxldGVzIHRoZSBoYW5kb3Zlcjsgb25seSB0aGUgc3RhZ2VkIHN1Y2Nlc3NvciBtYXkuCmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IHBlbmRpbmdBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIHN0YWdlZCBzdWNjZXNzb3IgbWF5IGFjY2VwdCIpCgl9CglvbGQgOj0gYWRtaW4KCWFkbWluID0gY2FsbGVyCgl2YXIgemVybyBhZGRyZXNzCglwZW5kaW5nQWRtaW4gPSB6ZXJvCgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgImZyb20iLCBvbGQuU3RyaW5nKCksICJ0byIsIGFkbWluLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgLS0tCgovLyBFbnRpdGxlZCByZXBvcnRzIHdoZXRoZXIgdGhlIHN1YnNjcmlwdGlvbidzIHBhaWQgZW50aXRsZW1lbnQgY292ZXJzCi8vIHRoZSBjdXJyZW50IGJsb2NrOiBoZWlnaHQgPCBwYWlkVGhyb3VnaC4gU3RhdHVzIGRlbGliZXJhdGVseSBkb2VzIG5vdAovLyBlbnRlciBpbnRvIGl0IOKAlCBhIGNhbmNlbGxlZCBzdWJzY3JpYmVyIGtlZXBzIHdoYXQgdGhleSBwYWlkIGZvciwgYW5kCi8vIGFuIGV4cGlyYWJsZS1idXQtdW5leHBpcmVkIG9uZSBoYXMgYWxyZWFkeSBsYXBzZWQgaGVyZS4KZnVuYyBFbnRpdGxlZChzdWJJRCBpbnQ2NCkgYm9vbCB7CglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglyZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIDwgcy5wYWlkVGhyb3VnaAp9CgovLyBFbnRpdGxlZEZvciByZXBvcnRzIHdoZXRoZXIgc3Vic2NyaWJlciBjdXJyZW50bHkgaG9sZHMgcGFpZAovLyBlbnRpdGxlbWVudCB0byBwbGFuSUQsIHRocm91Z2ggdGhlaXIgTU9TVCBSRUNFTlQgc3Vic2NyaXB0aW9uIHRvIGl0LgovLyBUaGlzIGlzIHRoZSBvbmUtY2FsbCBpbnRlZ3JhdGlvbiBzdXJmYWNlIGZvciBvdGhlciByZWFsbXMgYW5kCi8vIHNlcnZpY2VzLCBhbmQgaXQgaG9ub3JzIHRoZSBlbnRpdGxlbWVudCBjb250cmFjdCBhY3Jvc3Mgc3RhdHVzOiBhCi8vIGNhbmNlbGxlZCBzdWJzY3JpcHRpb24ga2VlcHMgYW5zd2VyaW5nIHRydWUgdW50aWwgaXRzIHBhaWRUaHJvdWdoIOKAlAovLyB3aGF0IHdhcyBib3VnaHQgc3RheXMgYm91Z2h0IChhdWRpdCBmaW5kaW5nIFkxKS4gT25lIHNlbGYtaW5mbGljdGVkCi8vIGVkZ2UgaXMgZmFpbC1jbG9zZWQ6IGNhbmNlbGxpbmcgYSBwcmVwYWlkIHN1YnNjcmlwdGlvbiBhbmQKLy8gcmUtc3Vic2NyaWJpbmcgYXQgb25jZSBwb2ludHMgdGhpcyBzdXJmYWNlIGF0IHRoZSBORVcsIGVhcmxpZXIKLy8gcGFpZFRocm91Z2g7IHRoZSBvbGQgc3Vic2NyaXB0aW9uJ3MgcmVtYWluaW5nIHNwYW4gc3RheXMgcXVlcnlhYmxlCi8vIHBlci1pZCB2aWEgRW50aXRsZWQuCmZ1bmMgRW50aXRsZWRGb3IocGxhbklEIGludDY0LCBzdWJzY3JpYmVyIGFkZHJlc3MpIGJvb2wgewoJdiA6PSBsYXRlc3RCeUtleS5HZXQocGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gRW50aXRsZWQodi4oaW50NjQpKQp9CgovLyBBY3RpdmVTdWJJRCByZXR1cm5zIHRoZSBjYWxsZXItZmFjaW5nIGlkIG9mIHN1YnNjcmliZXIncyBsaXZlCi8vIHN1YnNjcmlwdGlvbiB0byBwbGFuSUQsIG9yICgwLCBmYWxzZSkgaWYgbm9uZSBpcyBBY3RpdmUuCmZ1bmMgQWN0aXZlU3ViSUQocGxhbklEIGludDY0LCBzdWJzY3JpYmVyIGFkZHJlc3MpIChpbnQ2NCwgYm9vbCkgewoJdiA6PSBhY3RpdmVCeUtleS5HZXQocGFkSUQocGxhbklEKSArICJ8IiArIHN1YnNjcmliZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gdi4oaW50NjQpLCB0cnVlCn0KCi8vIFBsYW5JbmZvIHJldHVybnMgYSBwbGFuJ3MgcHVibGljIGZpZWxkcy4KZnVuYyBQbGFuSW5mbyhwbGFuSUQgaW50NjQpIChwcm92aWRlciBhZGRyZXNzLCB0aXRsZSBzdHJpbmcsIHByaWNlLCBwZXJpb2RCbG9ja3MsIHBsYW5GZWVCcHMgaW50NjQsIHN0YXR1cyBzdHJpbmcsIGxpZmV0aW1lU3VicyBpbnQ2NCkgewoJcCA6PSBtdXN0R2V0UGxhbihwbGFuSUQpCglyZXR1cm4gcC5wcm92aWRlciwgcC50aXRsZSwgcC5wcmljZSwgcC5wZXJpb2RCbG9ja3MsIHAuZmVlQnBzLCBwLnN0YXR1cywgcC5zdWJzCn0KCi8vIFN1YkluZm8gcmV0dXJucyBhIHN1YnNjcmlwdGlvbidzIHB1YmxpYyBmaWVsZHMuCmZ1bmMgU3ViSW5mbyhzdWJJRCBpbnQ2NCkgKHBsYW5JRCBpbnQ2NCwgc3Vic2NyaWJlciwgcHJvdmlkZXIgYWRkcmVzcywgcHJpY2UsIHBhaWRUaHJvdWdoLCBwZXJpb2RzIGludDY0LCBzdGF0dXMgc3RyaW5nKSB7CglzIDo9IG11c3RHZXRTdWIoc3ViSUQpCglyZXR1cm4gcy5wbGFuSUQsIHMuc3Vic2NyaWJlciwgcy5wcm92aWRlciwgcy5wcmljZSwgcy5wYWlkVGhyb3VnaCwgcy5wZXJpb2RzLCBzLnN0YXR1cwp9CgovLyBQYWlkVGhyb3VnaCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBoZWlnaHQgYSBzdWJzY3JpcHRpb24gaXMgcGFpZCB0by4KZnVuYyBQYWlkVGhyb3VnaChzdWJJRCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gbXVzdEdldFN1YihzdWJJRCkucGFpZFRocm91Z2ggfQoKLy8gUmVuZXdhYmxlRnJvbSByZXR1cm5zIHRoZSBlYXJsaWVzdCBoZWlnaHQgYXQgd2hpY2ggUmVuZXcgd2lsbCBhY2NlcHQKLy8gYSBwYXltZW50IGZvciB0aGlzIHN1YnNjcmlwdGlvbiwgYW5kIHRoZSBsYXN0IGhlaWdodCBhdCB3aGljaCBpdAovLyBzdGlsbCB3aWxsIChpbmNsdXNpdmUpIOKAlCB0aGUgZGV0ZXJtaW5pc3RpYyB3aW5kb3csIHByZWNvbXB1dGVkIGZvcgovLyBpbnRlZ3JhdG9ycy4gRnJvbSB1bnRpbCsxIHRoZSBzdWJzY3JpcHRpb24gaXMgZXhwaXJhYmxlIGluc3RlYWQ7IHRoZQovLyB0d28gc2V0cyBwYXJ0aXRpb24gZXhhY3RseS4KZnVuYyBSZW5ld2FibGVGcm9tKHN1YklEIGludDY0KSAoZnJvbSwgdW50aWwgaW50NjQpIHsKCXMgOj0gbXVzdEdldFN1YihzdWJJRCkKCXJldHVybiBzLnBhaWRUaHJvdWdoIC0gcy5wZXJpb2RCbG9ja3MsIHMucGFpZFRocm91Z2ggKyBzLnBlcmlvZEJsb2NrcyAtIDEKfQoKZnVuYyBBZG1pbigpIGFkZHJlc3MgICAgICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICB7IHJldHVybiBmZWVSZWNpcGllbnQgfQpmdW5jIEZlZUJwcygpIGludDY0ICAgICAgICAgICAgIHsgcmV0dXJuIGZlZUJwcyB9CmZ1bmMgTnVtUGxhbnMoKSBpbnQ2NCAgICAgICAgICAgeyByZXR1cm4gbmV4dFBsYW4gfQpmdW5jIE51bVN1YnMoKSBpbnQ2NCAgICAgICAgICAgIHsgcmV0dXJuIG5leHRTdWIgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgIHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KZnVuYyBMaWFiaWxpdGllcygpIGludDY0ICAgICAgICB7IHJldHVybiBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CmZ1bmMgQmFsYW5jZU9mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhLlN0cmluZygpKSB9CmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVsZCgpIGludDY0ICAgICAgICAgICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCA9PSAiIiB7CgkJcmV0dXJuIHJlbmRlckhvbWUoKQoJfQoJcmV0dXJuICJ1bmtub3duIHBhZ2U7IHRyeSB0aGUgcmVhbG0gcm9vdCIKfQoKZnVuYyByZW5kZXJIb21lKCkgc3RyaW5nIHsKCW91dCA6PSAiIyBzdWJzY3JpcHRpb25zXG5cbiIKCW91dCArPSAiUHJvdmlkZXItcHVibGlzaGVkIHBsYW5zLCBwZXItcGVyaW9kIHBheW1lbnQsIGRldGVybWluaXN0aWMgIiArCgkJInJlbmV3YWwsIGdyYWNlLCBleHBpcmF0aW9uIGFuZCBjYW5jZWxsYXRpb24uIEVudGl0bGVtZW50IGlzICIgKwoJCSJgaGVpZ2h0IDwgcGFpZFRocm91Z2hgLCBxdWVyeWFibGUgYnkgYW55b25lLlxuXG4iCglvdXQgKz0gIi0gcGxhbnM6ICIgKyBpdG9hKG5leHRQbGFuKSArICJcbiIKCW91dCArPSAiLSBzdWJzY3JpcHRpb25zOiAiICsgaXRvYShuZXh0U3ViKSArICJcbiIKCW91dCArPSAiLSBwcm92aWRlciBiYWxhbmNlczogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWVzIGFjY3J1ZWQ6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGN1cnJlbnQgZmVlIGZvciBuZXcgcGxhbnM6ICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyAoY2FwICIgKwoJCWl0b2EoTWF4RmVlQnBzKSArICIpXG5cbiIKCglpZiBuZXh0UGxhbiA9PSAwIHsKCQlyZXR1cm4gb3V0ICsgIk5vIHBsYW5zIHlldC5cbiIKCX0KCW91dCArPSAiIyMgbmV3ZXN0IHBsYW5zXG5cbiIKCXNob3duIDo9IGludDY0KDApCglmb3IgaWQgOj0gbmV4dFBsYW4gLSAxOyBpZCA+PSAwICYmIHNob3duIDwgUmVuZGVyTGltaXQ7IGlkLS0gewoJCXAgOj0gbXVzdEdldFBsYW4oaWQpCgkJb3V0ICs9ICItICMiICsgaXRvYShwLmlkKSArICIgKioiICsgc2FuaXRpemUuSW5saW5lVGV4dChwLnRpdGxlKSArCgkJCSIqKiDigJQgIiArIGl0b2EocC5wcmljZSkgKyBEZW5vbSArICIgLyAiICsgaXRvYShwLnBlcmlvZEJsb2NrcykgKwoJCQkiIGJsb2NrcywgIiArIHAuc3RhdHVzICsgIiwgcHJvdmlkZXIgYCIgKyBwLnByb3ZpZGVyLlN0cmluZygpICsKCQkJImAsICIgKyBpdG9hKHAuc3VicykgKyAiIGxpZmV0aW1lIHN1YnNcbiIKCQlzaG93bisrCgl9CglpZiBuZXh0UGxhbiA+IHNob3duIHsKCQlvdXQgKz0gIlxuKCIgKyBpdG9hKG5leHRQbGFuLXNob3duKSArICIgb2xkZXIgcGxhbnMgbm90IHNob3duKVxuIgoJfQoJcmV0dXJuIG91dAp9CgovLyAtLS0gaW50ZXJuYWxzIC0tLQoKLy8gZXhwaXJlSW5QbGFjZSBmbGlwcyBhbiBBY3RpdmUgc3Vic2NyaXB0aW9uIHRvIEV4cGlyZWQgYW5kIGZyZWVzIGl0cwovLyBzbG90cy4gQ2FsbGVycyBoYXZlIGFscmVhZHkgZXN0YWJsaXNoZWQgZXhwaXJhYmlsaXR5LgpmdW5jIGV4cGlyZUluUGxhY2UocyAqc3ViKSB7CglzLnN0YXR1cyA9IFN1YkV4cGlyZWQKCXJlbGVhc2VTbG90cyhzKQoJY2hhaW4uRW1pdCgiU3Vic2NyaXB0aW9uRXhwaXJlZCIsCgkJInN1YklkIiwgaXRvYShzLmlkKSwKCQkic3Vic2NyaWJlciIsIHMuc3Vic2NyaWJlci5TdHJpbmcoKSwKCQkicGFpZFRocm91Z2giLCBpdG9hKHMucGFpZFRocm91Z2gpLAoJKQp9CgovLyByZWxlYXNlU2xvdHMgcmVtb3ZlcyB0aGUgcGxhbnxzdWJzY3JpYmVyIGFjdGl2aXR5IGluZGV4IGVudHJ5IGFuZAovLyBkZWNyZW1lbnRzIHRoZSBzdWJzY3JpYmVyJ3MgcXVvdGEgY291bnRlci4gRXhhY3RseSBvbmNlIHBlciB0ZXJtaW5hbAovLyB0cmFuc2l0aW9uLCB3aGljaCBib3RoIHRlcm1pbmFsIHBhdGhzIGd1YXJhbnRlZSBieSByZXF1aXJpbmcKLy8gU3ViQWN0aXZlIGZpcnN0LgpmdW5jIHJlbGVhc2VTbG90cyhzICpzdWIpIHsKCWFjdGl2ZUJ5S2V5LlJlbW92ZShwYWRJRChzLnBsYW5JRCkgKyAifCIgKyBzLnN1YnNjcmliZXIuU3RyaW5nKCkpCgkqY291bnRlcihzdWJOdW0sIHMuc3Vic2NyaWJlciktLQp9CgpmdW5jIGFzc2VydE5vU2VuZCgpIHsKCWlmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSAhPSAwIHsKCQlwYW5pYygidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgpmdW5jIGFzc2VydEFkbWluKGNhbGxlciBhZGRyZXNzKSB7CglpZiBjYWxsZXIgIT0gYWRtaW4gewoJCXBhbmljKCJhZG1pbiBvbmx5IikKCX0KfQoKZnVuYyBtdXN0R2V0UGxhbihpZCBpbnQ2NCkgKnBsYW4gewoJdiA6PSBwbGFucy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIHBsYW4gaWQiKQoJfQoJcmV0dXJuIHYuKCpwbGFuKQp9CgpmdW5jIG11c3RHZXRTdWIoaWQgaW50NjQpICpzdWIgewoJdiA6PSBzdWJzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gc3Vic2NyaXB0aW9uIGlkIikKCX0KCXJldHVybiB2Ligqc3ViKQp9CgovLyBjb3VudGVyIHJldHVybnMgdGhlIHBlcnNpc3RlbnQgcGVyLWFkZHJlc3MgY291bnRlciBpbiB0cmVlLAovLyBhbGxvY2F0aW5nIGEgemVybyBvbiBmaXJzdCB1c2UuCmZ1bmMgY291bnRlcih0cmVlICphdmwuVHJlZSwgYSBhZGRyZXNzKSAqaW50NjQgewoJayA6PSBhLlN0cmluZygpCglpZiB2IDo9IHRyZWUuR2V0KGspOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCppbnQ2NCkKCX0KCW4gOj0gbmV3KGludDY0KQoJdHJlZS5TZXQoaywgbikKCXJldHVybiBuCn0KCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KGu7cAQoWc3Vic2NyaXB0aW9uc190ZXN0LmdubxLS3AFwYWNrYWdlIHN1YnNjcmlwdGlvbnMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUiCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCgl0ZXN0QWRtaW4gPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInN1YmFkbWluIikKCXByb3YxICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic3VicHJvdjEiKQoJcHJvdjIgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJzdWJwcm92MiIpCglhbGljZSAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInN1YmFsaWNlIikKCWJvYiAgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic3ViYm9iIikKCW1hbGxvcnkgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic3VibWFsbG9yeSIpCikKCi8vIEVzdGFibGlzaGVkIGhhcm5lc3MgZmFjdHMsIGNhcnJpZWQgZnJvbSB0aGUgc2libGluZyByZWFsbXMnIHN1aXRlczoKLy8gaW5pdCBydW5zIHdpdGggYW4gZW1wdHkgb3JpZ2luIGNvbnRleHQgKHRoZSByZWFsIGRlcGxveSBjYXB0dXJlcyB0aGUKLy8gb3JpZ2luIGNhbGxlcik7IHRoZSBiYW5rZXIgcmVzZXRzIGJldHdlZW4gdGVzdHMgd2hpbGUgcmVhbG0gZ2xvYmFscwovLyBwZXJzaXN0LCBzbyBjb25zZXJ2YXRpb24gaXMgYXNzZXJ0ZWQgaW4gREVMVEEgZm9ybSBhZnRlciByZS1zZWVkaW5nCi8vIGNhcnJpZWQgbGlhYmlsaXRpZXM7IHRlc3RpbmcuU2V0UmVhbG0gYWZmZWN0cyBvbmx5IHRoZSBmcmFtZSB0aGF0Ci8vIGNhbGxzIGl0OyBhbmQgdGVzdGluZy5Ta2lwSGVpZ2h0cyBXSVBFUyB0aGUgb3JpZ2luL3JlYWxtIGNvbnRleHQsIHNvCi8vIGV2ZXJ5IGNhbGxlciBpcyByZS1hcm1lZCBhZnRlciBhIHNraXAuCmZ1bmMgaW5pdCgpIHsKCWFkbWluID0gdGVzdEFkbWluCglmZWVSZWNpcGllbnQgPSB0ZXN0QWRtaW4KCXNlbGYgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3N1YnNjcmlwdGlvbnMiKQp9Cgp0eXBlIGJhc2VsaW5lIHN0cnVjdHsgaGVsZCwgdXNlcnMsIGZlZXMgaW50NjQgfQoKZnVuYyBiZWdpbigpIGJhc2VsaW5lIHsKCWlmIGwgOj0gTGlhYmlsaXRpZXMoKTsgbCA+IDAgewoJCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KGwpKQoJfQoJcmV0dXJuIHNuYXAoKQp9CgpmdW5jIHNuYXAoKSBiYXNlbGluZSB7CglyZXR1cm4gYmFzZWxpbmV7aGVsZDogSGVsZCgpLCB1c2VyczogVXNlcnNUb3RhbCgpLCBmZWVzOiBGZWVzQWNjcnVlZCgpfQp9CgovLyBjb25zZXJ2ZWQgYXNzZXJ0cyDOlEggPT0gzpRVICsgzpRGICsgZXh0cmFTdXJwbHVzIOKAlCB0aGUgcmVhbG0ncyBtb25ldGFyeQovLyBpbnZhcmlhbnQgaW4gZGVsdGEgZm9ybS4gVGhlcmUgaXMgbm8gZXNjcm93IHBvb2wgaW4gdGhpcyByZWFsbS4KZnVuYyAoYiBiYXNlbGluZSkgY29uc2VydmVkKHQgKnRlc3RpbmcuVCwgZXh0cmFTdXJwbHVzIGludDY0KSB7Cgl0LkhlbHBlcigpCglkSCA6PSBIZWxkKCkgLSBiLmhlbGQKCWRVIDo9IFVzZXJzVG90YWwoKSAtIGIudXNlcnMKCWRGIDo9IEZlZXNBY2NydWVkKCkgLSBiLmZlZXMKCWlmIGRIICE9IGRVK2RGK2V4dHJhU3VycGx1cyB7CgkJdC5GYXRhbGYoImNvbnNlcnZhdGlvbiB2aW9sYXRlZDogzpRIPSVkIM6UVT0lZCDOlEY9JWQgzpRTPSVkIiwgZEgsIGRVLCBkRiwgZXh0cmFTdXJwbHVzKQoJfQoJaWYgTGlhYmlsaXRpZXMoKSAhPSBVc2Vyc1RvdGFsKCkrRmVlc0FjY3J1ZWQoKSB7CgkJdC5GYXRhbGYoIkxpYWJpbGl0aWVzKCkgPSAlZCwgd2FudCBVK0YiLCBMaWFiaWxpdGllcygpKQoJfQp9CgpmdW5jIGNvaW5zT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbihhZGRyLCBEZW5vbSkKfQoKZnVuYyB1Z25vdChuIGludDY0KSBjaGFpbi5Db2lucyB7CglyZXR1cm4gY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbihEZW5vbSwgbikpCn0KCi8vIE5PVEUgT04gVEhFIEhBUk5FU1MuIHRlc3RpbmcuU2V0UmVhbG0gYXBwbGllcyB0byB0aGUgZnJhbWUgdGhhdCBDQUxMUwovLyBpdCwgc28gdGhlIGNhbGxlciBpZGVudGl0eSBtdXN0IGJlIGFybWVkIGluIHRoZSBTQU1FIGZyYW1lIGFzIHRoZQovLyBlbnRyeXBvaW50IGludm9jYXRpb24g4oCUIHRoZSB0aHJlZSBsaW5lcyBhcmUgaW5saW5lZCBhdCBldmVyeSBzaXRlLAovLyBtYXRjaGluZyB0aGUgc2libGluZyBzdWl0ZXMuCgovLyBwbGFuQXMgcHVibGlzaGVzIGEgcGxhbiAobm9uLXBheWFibGU6IGVudmVsb3BlIGV4cGxpY2l0bHkgY2xlYXJlZCkuCmZ1bmMgcGxhbkFzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCB0aXRsZSBzdHJpbmcsIHByaWNlLCBwZXJpb2QgaW50NjQpIGludDY0IHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihmcm9tKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXJldHVybiBDcmVhdGVQbGFuKGNyb3NzKGN1ciksIHRpdGxlLCAiZCIsIHByaWNlLCBwZXJpb2QsIE1heEZlZUJwcykKfQoKLy8gc3Vic2NyaWJlQXMgcGVyZm9ybXMgYSBjaGFpbi1mYWl0aGZ1bCBzdWJzY3JpYmU6IGVudmVsb3BlIHN0YWdlZCBBTkQgbGFuZGVkLgpmdW5jIHN1YnNjcmliZUFzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCBwbGFuSUQsIHBheSBpbnQ2NCkgaW50NjQgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmcm9tKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZyb20pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocGF5KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KHBheSkpCglyZXR1cm4gU3Vic2NyaWJlKGNyb3NzKGN1ciksIHBsYW5JRCkKfQoKLy8gcmVuZXdBcyBwZXJmb3JtcyBhIGNoYWluLWZhaXRoZnVsIHJlbmV3YWwuCmZ1bmMgcmVuZXdBcyhjdXIgcmVhbG0sIGZyb20gYWRkcmVzcywgc3ViSUQsIHBheSBpbnQ2NCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmcm9tKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGZyb20pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QocGF5KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KHBheSkpCglSZW5ldyhjcm9zcyhjdXIpLCBzdWJJRCkKfQoKZnVuYyBUZXN0SW5pdGlhbENvbmZpZyh0ICp0ZXN0aW5nLlQpIHsKCWlmIEFkbWluKCkgIT0gdGVzdEFkbWluIHx8IEZlZVJlY2lwaWVudCgpICE9IHRlc3RBZG1pbiB7CgkJdC5GYXRhbCgic2VlZGVkIHJvbGVzIG1pc21hdGNoIikKCX0KCXZhciB6ZXJvIGFkZHJlc3MKCWlmIFBlbmRpbmdBZG1pbigpICE9IHplcm8gewoJCXQuRmF0YWwoInBlbmRpbmcgYWRtaW4gbm90IHplcm8iKQoJfQoJaWYgRmVlQnBzKCkgIT0gMCB8fCBOdW1QbGFucygpICE9IDAgfHwgTnVtU3VicygpICE9IDAgewoJCXQuRmF0YWwoImluaXRpYWwgY291bnRlcnMgbm90IHplcm8iKQoJfQp9CgpmdW5jIFRlc3RDcmVhdGVQbGFuVmFsaWRhdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCg1KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiLCBmdW5jKCkgewoJCUNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgIngiLCAiZCIsIDEsIE1pblBlcmlvZEJsb2NrcywgTWF4RmVlQnBzKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidGl0bGUgbXVzdCBiZSIsIGZ1bmMoKSB7CgkJQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCAiIiwgImQiLCAxLCBNaW5QZXJpb2RCbG9ja3MsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInRpdGxlIG11c3QgYmUiLCBmdW5jKCkgewoJCUNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgc3RyaW5ncy5SZXBlYXQoInQiLCBNYXhUaXRsZUxlbisxKSwgImQiLCAxLCBNaW5QZXJpb2RCbG9ja3MsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImRlc2NyaXB0aW9uIHRvbyBsb25nIiwgZnVuYygpIHsKCQlDcmVhdGVQbGFuKGNyb3NzKGN1ciksICJ4Iiwgc3RyaW5ncy5SZXBlYXQoImQiLCBNYXhEZXNjTGVuKzEpLCAxLCBNaW5QZXJpb2RCbG9ja3MsIE1heEZlZUJwcykKCX0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInByaWNlIG11c3QgYmUgYXQgbGVhc3QiLCBmdW5jKCkgewoJCUNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgIngiLCAiZCIsIDAsIE1pblBlcmlvZEJsb2NrcywgTWF4RmVlQnBzKQoJfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicGVyaW9kQmxvY2tzIG11c3QgYmUgaW4iLCBmdW5jKCkgewoJCUNyZWF0ZVBsYW4oY3Jvc3MoY3VyKSwgIngiLCAiZCIsIDEsIE1pblBlcmlvZEJsb2Nrcy0xLCBNYXhGZWVCcHMpCgl9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJwZXJpb2RCbG9ja3MgbXVzdCBiZSBpbiIsIGZ1bmMoKSB7CgkJQ3JlYXRlUGxhbihjcm9zcyhjdXIpLCAieCIsICJkIiwgMSwgTWF4UGVyaW9kQmxvY2tzKzEsIE1heEZlZUJwcykKCX0pCn0KCmZ1bmMgVGVzdEZlZUNvbnNlbnRDZWlsaW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDI1MCkKCgkvLyBBIHByb3ZpZGVyIHdobyBzaWduZWQgZm9yIGF0IG1vc3QgMTAwIGJwcyBpcyByZWZ1c2VkIHdoaWxlIHRoZQoJLy8gZmVlIGlzIDI1MC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJleGNlZWRzIHRoZSBjYWxsZXIncyBtYXhpbXVtIiwgZnVuYygpIHsKCQlDcmVhdGVQbGFuKGNyb3NzKGN1ciksICJjYXBwZWQiLCAiZCIsIDEwMCwgTWluUGVyaW9kQmxvY2tzLCAxMDApCgl9KQoKCS8vIEEgY29uc2VudGluZyBwcm92aWRlciBzbmFwc2hvdHMgMjUwIGludG8gdGhlIHBsYW47IGEgbGF0ZXIgZmVlCgkvLyBjaGFuZ2UgZG9lcyBub3QgdG91Y2ggaXQuCglpZCA6PSBwbGFuQXMoY3VyLCBwcm92MSwgInNuYXAiLCAxMDAwLCBNaW5QZXJpb2RCbG9ja3MpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDApCglfLCBfLCBfLCBfLCBwbGFuRmVlLCBfLCBfIDo9IFBsYW5JbmZvKGlkKQoJaWYgcGxhbkZlZSAhPSAyNTAgewoJCXQuRmF0YWxmKCJwbGFuIGZlZUJwcyA9ICVkLCB3YW50IHRoZSAyNTAgc25hcHNob3QiLCBwbGFuRmVlKQoJfQoKCS8vIFRoZSBzdWJzY3JpcHRpb24gY2hhcmdlcyB0aGUgU05BUFNIT1QsIG5vdCB0aGUgY3VycmVudCBmZWUuCgliIDo9IGJlZ2luKCkKCXN1YnNjcmliZUFzKGN1ciwgYWxpY2UsIGlkLCAxMDAwKQoJaWYgZ290IDo9IEZlZXNBY2NydWVkKCkgLSBiLmZlZXM7IGdvdCAhPSAyNSB7CgkJdC5GYXRhbGYoImZlZSBjaGFyZ2VkID0gJWQsIHdhbnQgMjUgKDI1MCBicHMgb2YgMTAwMCkiLCBnb3QpCgl9CglpZiBnb3QgOj0gQmFsYW5jZU9mKHByb3YxKTsgZ290ID09IDAgewoJCXQuRmF0YWwoInByb3ZpZGVyIG5vdCBjcmVkaXRlZCIpCgl9CgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RQbGFuUXVvdGEoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWZvciBpIDo9IDA7IGkgPCBNYXhQbGFuc1BlclByb3ZpZGVyOyBpKysgewoJCXBsYW5BcyhjdXIsIHByb3YyLCAicSIsIDEsIE1pblBlcmlvZEJsb2NrcykKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwZXItcHJvdmlkZXIgcGxhbiBsaW1pdCByZWFjaGVkIiwgZnVuYygpIHsKCQlDcmVhdGVQbGFuKGNyb3NzKGN1ciksICJxIiwgImQiLCAxLCBNaW5QZXJpb2RCbG9ja3MsIE1heEZlZUJwcykKCX0pCgkvLyBSZXRpcmluZyBvbmUgZnJlZXMgdGhlIHNsb3QuCglSZXRpcmVQbGFuKGNyb3NzKGN1ciksIE51bVBsYW5zKCktMSkKCXBsYW5BcyhjdXIsIHByb3YyLCAicTIiLCAxLCBNaW5QZXJpb2RCbG9ja3MpCn0KCmZ1bmMgVGVzdFJldGlyZVBsYW5BdXRob3JpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAibWluZSIsIDUsIE1pblBlcmlvZEJsb2NrcykKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib25seSB0aGUgcHJvdmlkZXIgbWF5IHJldGlyZSBhIHBsYW4iLCBmdW5jKCkgewoJCVJldGlyZVBsYW4oY3Jvc3MoY3VyKSwgaWQpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92MSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihwcm92MSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglSZXRpcmVQbGFuKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwbGFuIGlzIG5vdCBhY3RpdmUiLCBmdW5jKCkgewoJCVJldGlyZVBsYW4oY3Jvc3MoY3VyKSwgaWQpCgl9KQoJLy8gTm8gbmV3IHN1YnNjcmlwdGlvbnMgb24gYSByZXRpcmVkIHBsYW4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFsaWNlKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDUpKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoNSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInBsYW4gaXMgbm90IGFjdGl2ZSIsIGZ1bmMoKSB7CgkJU3Vic2NyaWJlKGNyb3NzKGN1ciksIGlkKQoJfSkKfQoKZnVuYyBUZXN0U3Vic2NyaWJlTGlmZWN5Y2xlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglpZCA6PSBwbGFuQXMoY3VyLCBwcm92MSwgImJhc2ljIiwgMTAwLCA1MCkKCWIgOj0gYmVnaW4oKQoJaDAgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglzdWJJRCA6PSBzdWJzY3JpYmVBcyhjdXIsIGFsaWNlLCBpZCwgMTAwKQoKCXBsYW5JRCwgc3Vic2NyaWJlciwgcHJvdmlkZXIsIHByaWNlLCBwYWlkVGhyb3VnaCwgcGVyaW9kcywgc3RhdHVzIDo9IFN1YkluZm8oc3ViSUQpCglpZiBwbGFuSUQgIT0gaWQgfHwgc3Vic2NyaWJlciAhPSBhbGljZSB8fCBwcm92aWRlciAhPSBwcm92MSB8fCBwcmljZSAhPSAxMDAgfHwKCQlwZXJpb2RzICE9IDEgfHwgc3RhdHVzICE9IFN1YkFjdGl2ZSB7CgkJdC5GYXRhbCgic3Vic2NyaXB0aW9uIGZpZWxkcyB3cm9uZyIpCgl9CglpZiBwYWlkVGhyb3VnaCAhPSBoMCs1MCB7CgkJdC5GYXRhbGYoInBhaWRUaHJvdWdoID0gJWQsIHdhbnQgJWQiLCBwYWlkVGhyb3VnaCwgaDArNTApCgl9CglpZiAhRW50aXRsZWQoc3ViSUQpIHx8ICFFbnRpdGxlZEZvcihpZCwgYWxpY2UpIHsKCQl0LkZhdGFsKCJmcmVzaCBzdWJzY3JpcHRpb24gbm90IGVudGl0bGVkIikKCX0KCWlmIGdvdCwgb2sgOj0gQWN0aXZlU3ViSUQoaWQsIGFsaWNlKTsgIW9rIHx8IGdvdCAhPSBzdWJJRCB7CgkJdC5GYXRhbCgiYWN0aXZlIGluZGV4IHdyb25nIikKCX0KCWIuY29uc2VydmVkKHQsIDApCgoJLy8gRXhhY3QgZW52ZWxvcGU6IHVuZGVyLSBhbmQgb3ZlcnBheW1lbnQgcmVmdXNlZC4KCWZvciBfLCBiYWQgOj0gcmFuZ2UgW11pbnQ2NHs5OSwgMTAxfSB7CgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoYmFkKSkKCQl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdChiYWQpKQoJCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic2VuZCBleGFjdGx5IHRoZSBwbGFuIHByaWNlIiwgZnVuYygpIHsKCQkJU3Vic2NyaWJlKGNyb3NzKGN1ciksIGlkKQoJCX0pCgl9CgoJLy8gQSBzZWNvbmQgbGl2ZSBzdWJzY3JpcHRpb24gdG8gdGhlIHNhbWUgcGxhbiBpcyByZWZ1c2VkIOKAlCB0aGUKCS8vIGlkZW50aXR5LWxldmVsIGR1cGxpY2F0ZS1wYXltZW50IGd1YXJkLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhbGljZSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDApKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMTAwKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicmVuZXcgaXQgaW5zdGVhZCIsIGZ1bmMoKSB7CgkJU3Vic2NyaWJlKGNyb3NzKGN1ciksIGlkKQoJfSkKfQoKZnVuYyBUZXN0UmVuZXdhbFdpbmRvdyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaWQgOj0gcGxhbkFzKGN1ciwgcHJvdjEsICJ3aW5kb3ciLCAxMDAsIDUwKQoJc3ViSUQgOj0gc3Vic2NyaWJlQXMoY3VyLCBib2IsIGlkLCAxMDApCglfLCBfLCBfLCBfLCBwdDAsIF8sIF8gOj0gU3ViSW5mbyhzdWJJRCkKCglmcm9tLCB1bnRpbCA6PSBSZW5ld2FibGVGcm9tKHN1YklEKQoJaWYgZnJvbSAhPSBwdDAtNTAgfHwgdW50aWwgIT0gcHQwKzQ5IHsKCQl0LkZhdGFsZigid2luZG93IFslZCwlZF0sIHdhbnQgWyVkLCVkXSIsIGZyb20sIHVudGlsLCBwdDAtNTAsIHB0MCs0OSkKCX0KCgkvLyBTdHJhaWdodCBhZnRlciBTdWJzY3JpYmUsIHJlbWFpbmluZyBlbnRpdGxlbWVudCBlcXVhbHMgZXhhY3RseQoJLy8gb25lIHBlcmlvZCAodGhlIHJ1bm5pbmcgb25lKSwgc28gT05FIHByZXBheSByZW5ld2FsIGlzIGluc2lkZQoJLy8gdGhlIGVhcmx5IGJvdW5kIOKAlCBhbmQgZXh0ZW5zaW9uIGlzIEZST00gcGFpZFRocm91Z2guCgliIDo9IGJlZ2luKCkKCXJlbmV3QXMoY3VyLCBib2IsIHN1YklELCAxMDApCglfLCBfLCBfLCBfLCBwdDEsIHBlcmlvZHMsIF8gOj0gU3ViSW5mbyhzdWJJRCkKCWlmIHB0MSAhPSBwdDArNTAgfHwgcGVyaW9kcyAhPSAyIHsKCQl0LkZhdGFsZigicGFpZFRocm91Z2ggPSAlZCBwZXJpb2RzID0gJWQsIHdhbnQgJWQgYW5kIDIiLCBwdDEsIHBlcmlvZHMsIHB0MCs1MCkKCX0KCWIuY29uc2VydmVkKHQsIDApCgoJLy8gQSBTRUNPTkQgcmVuZXdhbCBpbiB0aGUgc2FtZSBibG9jayBpcyB0aGUgYWNjaWRlbnRhbCBkdXBsaWNhdGUsCgkvLyBhbmQgdGhlIGVhcmx5IGJvdW5kIHJlZnVzZXMgaXQ6IG1vcmUgdGhhbiBvbmUgdW5zdGFydGVkIHBlcmlvZAoJLy8gd291bGQgYmUgcHJlcGFpZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDApKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMTAwKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAidG9vIGVhcmx5IiwgZnVuYygpIHsKCQlSZW5ldyhjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCgoJLy8gV3JvbmcgcGF5ZXI6IGEgdGhpcmQgcGFydHkgY2Fubm90IGV4dGVuZCBzb21lb25lIGVsc2UncwoJLy8gc3Vic2NyaXB0aW9uIGV2ZW4gaW5zaWRlIHRoZSB3aW5kb3cuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDUwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMTAwKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDEwMCkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIHN1YnNjcmliZXIgbWF5IHJlbmV3IiwgZnVuYygpIHsKCQlSZW5ldyhjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCgoJLy8gV3JvbmcgYW1vdW50IGluc2lkZSB0aGUgd2luZG93LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYm9iKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDk5KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDk5KSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic2VuZCBleGFjdGx5IHRoZSBzdWJzY3JpcHRpb24gcHJpY2UiLCBmdW5jKCkgewoJCVJlbmV3KGNyb3NzKGN1ciksIHN1YklEKQoJfSkKfQoKZnVuYyBUZXN0R3JhY2VCb3VuZGFyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaWQgOj0gcGxhbkFzKGN1ciwgcHJvdjEsICJncmFjZSIsIDEwMCwgNTApCglzdWJJRCA6PSBzdWJzY3JpYmVBcyhjdXIsIGFsaWNlLCBpZCwgMTAwKQoJXywgXywgXywgXywgcHQsIF8sIF8gOj0gU3ViSW5mbyhzdWJJRCkKCgkvLyBNb3ZlIHRvIHRoZSBMQVNUIHJlbmV3YWJsZSBoZWlnaHQ6IGggPT0gcGFpZFRocm91Z2ggKwoJLy8gcGVyaW9kQmxvY2tzIC0gMSAodGhlIGxhdGUgYm91bmQgaXMgZXhjbHVzaXZlIOKAlCBhdWRpdCBZMikuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKHB0ICsgNDkgLSBydW50aW1lLkNoYWluSGVpZ2h0KCkpCglpZiBFbnRpdGxlZChzdWJJRCkgewoJCXQuRmF0YWwoImVudGl0bGVtZW50IG11c3QgaGF2ZSBsYXBzZWQgcGFzdCBwYWlkVGhyb3VnaCIpCgl9CgkvLyBSZW5ld2FsIGF0IHRoZSBib3VuZGFyeSBpcyBhY2NlcHRlZCwgZXh0ZW5kcyBGUk9NIHBhaWRUaHJvdWdoIOKAlAoJLy8gYW5kIGJ1eXMgYXQgbGVhc3Qgb25lIGJsb2NrOiB0aGUgWTIgcmVncmVzc2lvbi4KCXJlbmV3QXMoY3VyLCBhbGljZSwgc3ViSUQsIDEwMCkKCV8sIF8sIF8sIF8sIHB0MSwgXywgXyA6PSBTdWJJbmZvKHN1YklEKQoJaWYgcHQxICE9IHB0KzUwIHsKCQl0LkZhdGFsZigicGFpZFRocm91Z2ggPSAlZCwgd2FudCAlZCAoZXh0ZW5zaW9uIGZyb20gcGFpZFRocm91Z2gpIiwgcHQxLCBwdCs1MCkKCX0KCWlmICFFbnRpdGxlZChzdWJJRCkgewoJCXQuRmF0YWwoImEgYm91bmRhcnkgcmVuZXdhbCBtdXN0IGJ1eSBhdCBsZWFzdCBvbmUgYmxvY2sgb2YgZW50aXRsZW1lbnQiKQoJfQoKCS8vIEF0IHRoZSBncmFjZSBlbmQgaXRzZWxmIHJlbmV3YWwgaXMgcmVmdXNlZCwgRXhwaXJlIG9wZW5zOiB0aGUKCS8vIHR3byBzZXRzIHBhcnRpdGlvbiBleGFjdGx5LgoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhwdDEgKyA1MCAtIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYWxpY2UpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMTAwKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDEwMCkpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImdyYWNlIHdpbmRvdyBvdmVyIiwgZnVuYygpIHsKCQlSZW5ldyhjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCgoJLy8gRXhwaXJlIGlzIHBlcm1pc3Npb25sZXNzOiBtYWxsb3J5IG1heS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCV8sIF8sIF8sIF8sIF8sIF8sIHN0YXR1cyA6PSBTdWJJbmZvKHN1YklEKQoJaWYgc3RhdHVzICE9IFN1YkV4cGlyZWQgewoJCXQuRmF0YWwoIm5vdCBleHBpcmVkIikKCX0KCWlmIEVudGl0bGVkRm9yKGlkLCBhbGljZSkgewoJCXQuRmF0YWwoImV4cGlyZWQgc3Vic2NyaXB0aW9uIHN0aWxsIGluZGV4ZWQiKQoJfQoJLy8gVGVybWluYWw6IHJlbmV3YWwgcmVmdXNlZCBieSBzdGF0dXMuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFsaWNlKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMCkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgxMDApKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJzdWJzY3JpcHRpb24gaXMgZXhwaXJlZCIsIGZ1bmMoKSB7CgkJUmVuZXcoY3Jvc3MoY3VyKSwgc3ViSUQpCgl9KQoJLy8gVGhlIHNsb3QgaXMgZnJlZTogYSBmcmVzaCBTdWJzY3JpYmUgd29ya3MuCglzdWJzY3JpYmVBcyhjdXIsIGFsaWNlLCBpZCwgMTAwKQp9CgpmdW5jIFRlc3RFeHBpcmVHdWFyZHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAiZXhwZ3VhcmQiLCAxMDAsIDUwKQoJc3ViSUQgOj0gc3Vic2NyaWJlQXMoY3VyLCBib2IsIGlkLCAxMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vdCBleHBpcmFibGUiLCBmdW5jKCkgewoJCUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCgkvLyBPbmUgYmxvY2sgYmVmb3JlIHRoZSBncmFjZSBlbmQgaXQgaXMgc3RpbGwgbm90IGV4cGlyYWJsZS4uLgoJXywgXywgXywgXywgcHQsIF8sIF8gOj0gU3ViSW5mbyhzdWJJRCkKCXRlc3RpbmcuU2tpcEhlaWdodHMocHQgKyA0OSAtIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibm90IGV4cGlyYWJsZSIsIGZ1bmMoKSB7CgkJRXhwaXJlKGNyb3NzKGN1ciksIHN1YklEKQoJfSkKCS8vIC4uLmFuZCBBVCB0aGUgZ3JhY2UgZW5kIGl0IGlzOiB0aGUgc2V0cyBwYXJ0aXRpb24gZXhhY3RseS4KCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic3Vic2NyaXB0aW9uIGlzIGV4cGlyZWQiLCBmdW5jKCkgewoJCUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCn0KCmZ1bmMgVGVzdFN1YnNjcmliZUNvbGxhcHNlc0V4cGlyZWRJbmN1bWJlbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAiY29sbGFwc2UiLCAxMDAsIDUwKQoJb2xkSUQgOj0gc3Vic2NyaWJlQXMoY3VyLCBhbGljZSwgaWQsIDEwMCkKCV8sIF8sIF8sIF8sIHB0LCBfLCBfIDo9IFN1YkluZm8ob2xkSUQpCgl0ZXN0aW5nLlNraXBIZWlnaHRzKHB0ICsgNTAgLSBydW50aW1lLkNoYWluSGVpZ2h0KCkpCgoJLy8gTm8gRXhwaXJlIGNhbGwgaGFwcGVuZWQ7IFN1YnNjcmliZSBjb2xsYXBzZXMgdGhlIGluY3VtYmVudAoJLy8gaXRzZWxmLCBhdCB0aGUgZmlyc3QgZXhwaXJhYmxlIGhlaWdodC4KCW5ld0lEIDo9IHN1YnNjcmliZUFzKGN1ciwgYWxpY2UsIGlkLCAxMDApCglpZiBuZXdJRCA9PSBvbGRJRCB7CgkJdC5GYXRhbCgiZXhwZWN0ZWQgYSBmcmVzaCBzdWJzY3JpcHRpb24gaWQiKQoJfQoJXywgXywgXywgXywgXywgXywgb2xkU3RhdHVzIDo9IFN1YkluZm8ob2xkSUQpCglpZiBvbGRTdGF0dXMgIT0gU3ViRXhwaXJlZCB7CgkJdC5GYXRhbGYoImluY3VtYmVudCBzdGF0dXMgPSAlcSwgd2FudCBleHBpcmVkIiwgb2xkU3RhdHVzKQoJfQoJaWYgZ290LCBvayA6PSBBY3RpdmVTdWJJRChpZCwgYWxpY2UpOyAhb2sgfHwgZ290ICE9IG5ld0lEIHsKCQl0LkZhdGFsKCJpbmRleCBkb2VzIG5vdCBwb2ludCBhdCB0aGUgZnJlc2ggc3Vic2NyaXB0aW9uIikKCX0KfQoKZnVuYyBUZXN0Q2FuY2VsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglpZCA6PSBwbGFuQXMoY3VyLCBwcm92MSwgImNhbmNlbCIsIDEwMCwgNTApCglzdWJJRCA6PSBzdWJzY3JpYmVBcyhjdXIsIGJvYiwgaWQsIDEwMCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIHN1YnNjcmliZXIgbWF5IGNhbmNlbCIsIGZ1bmMoKSB7CgkJQ2FuY2VsKGNyb3NzKGN1ciksIHN1YklEKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihib2IpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQ2FuY2VsKGNyb3NzKGN1ciksIHN1YklEKQoJXywgXywgXywgXywgXywgXywgc3RhdHVzIDo9IFN1YkluZm8oc3ViSUQpCglpZiBzdGF0dXMgIT0gU3ViQ2FuY2VsbGVkIHsKCQl0LkZhdGFsKCJub3QgY2FuY2VsbGVkIikKCX0KCS8vIFBhaWQgZW50aXRsZW1lbnQgc3Vydml2ZXMgY2FuY2VsbGF0aW9uIHVudGlsIHBhaWRUaHJvdWdoIOKAlCBvbgoJLy8gYm90aCBzdXJmYWNlcyAoYXVkaXQgWTEpLi4uCglpZiAhRW50aXRsZWQoc3ViSUQpIHx8ICFFbnRpdGxlZEZvcihpZCwgYm9iKSB7CgkJdC5GYXRhbCgiY2FuY2VsbGVkIHN1YnNjcmlwdGlvbiBsb3N0IGl0cyBwYWlkIGVudGl0bGVtZW50IikKCX0KCS8vIC4uLmJ1dCB0aGUgQUNUSVZFIHNsb3QgaXMgZ29uZSBhbmQgcmVuZXdhbCBpcyByZWZ1c2VkIGZvcmV2ZXIuCglpZiBfLCBvayA6PSBBY3RpdmVTdWJJRChpZCwgYm9iKTsgb2sgewoJCXQuRmF0YWwoImNhbmNlbGxlZCBzdWJzY3JpcHRpb24gc3RpbGwgaG9sZHMgdGhlIGFjdGl2ZSBzbG90IikKCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDApKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMTAwKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic3Vic2NyaXB0aW9uIGlzIGNhbmNlbGxlZCIsIGZ1bmMoKSB7CgkJUmVuZXcoY3Jvc3MoY3VyKSwgc3ViSUQpCgl9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoYm9iKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic3Vic2NyaXB0aW9uIGlzIGNhbmNlbGxlZCIsIGZ1bmMoKSB7CgkJQ2FuY2VsKGNyb3NzKGN1ciksIHN1YklEKQoJfSkKCS8vIFRoZSBzbG90IGZyZWVkOiBib2IgbWF5IHN0YXJ0IGEgZnJlc2ggc3Vic2NyaXB0aW9uIGF0IG9uY2UuCglzdWJzY3JpYmVBcyhjdXIsIGJvYiwgaWQsIDEwMCkKfQoKZnVuYyBUZXN0UmVuZXdSZWZ1c2VkT25SZXRpcmVkUGxhbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaWQgOj0gcGxhbkFzKGN1ciwgcHJvdjEsICJyZXRpcmUtbWlkIiwgMTAwLCA1MCkKCXN1YklEIDo9IHN1YnNjcmliZUFzKGN1ciwgYWxpY2UsIGlkLCAxMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YxKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YxKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVJldGlyZVBsYW4oY3Jvc3MoY3VyKSwgaWQpCgkvLyBFbnRpdGxlbWVudCBjb250aW51ZXMuLi4KCWlmICFFbnRpdGxlZChzdWJJRCkgewoJCXQuRmF0YWwoImVudGl0bGVtZW50IG11c3Qgc3Vydml2ZSBwbGFuIHJldGlyZW1lbnQiKQoJfQoJLy8gLi4uYnV0IHJlbmV3YWwgaXMgcmVmdXNlZCBldmVuIGluc2lkZSB0aGUgd2luZG93LgoJXywgXywgXywgXywgcHQsIF8sIF8gOj0gU3ViSW5mbyhzdWJJRCkKCXRlc3RpbmcuU2tpcEhlaWdodHMocHQgLSBydW50aW1lLkNoYWluSGVpZ2h0KCkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFsaWNlKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKHVnbm90KDEwMCkpCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCgxMDApKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJwbGFuIGlzIHJldGlyZWQiLCBmdW5jKCkgewoJCVJlbmV3KGNyb3NzKGN1ciksIHN1YklEKQoJfSkKfQoKZnVuYyBUZXN0U3Vic2NyaWJlclF1b3RhKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgkvLyBGaWxsIGNhcm9sJ3MgcXVvdGEgd2l0aCBvbmUtcGxhbi1lYWNoIHN1YnNjcmlwdGlvbnMsIHRoZW4gcmVmdXNlLgoJLy8gQSBkZWRpY2F0ZWQgcHJvdmlkZXI6IHByb3YyJ3MgcGxhbiBxdW90YSBpcyBhbHJlYWR5IHNhdHVyYXRlZCBieQoJLy8gVGVzdFBsYW5RdW90YSwgYW5kIHJlYWxtIGdsb2JhbHMgcGVyc2lzdCBhY3Jvc3MgdGVzdHMuCgljYXJvbCA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInN1YmNhcm9sIikKCXByb3ZRIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygic3VicHJvdnEiKQoJdmFyIGxhc3RQbGFuIGludDY0Cglmb3IgaSA6PSAwOyBpIDwgTWF4U3Vic1BlclN1YnNjcmliZXI7IGkrKyB7CgkJbGFzdFBsYW4gPSBwbGFuQXMoY3VyLCBwcm92USwgInF1b3RhIiwgMSwgTWluUGVyaW9kQmxvY2tzKQoJCXN1YnNjcmliZUFzKGN1ciwgY2Fyb2wsIGxhc3RQbGFuLCAxKQoJCS8vIEZyZWUgdGhlIHByb3ZpZGVyIHF1b3RhIHNsb3QgZm9yIHRoZSBuZXh0IHBsYW4uCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShwcm92USkpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdlEpCgkJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCQlSZXRpcmVQbGFuKGNyb3NzKGN1ciksIGxhc3RQbGFuKQoJfQoJZXh0cmEgOj0gcGxhbkFzKGN1ciwgcHJvdlEsICJxdW90YS14IiwgMSwgTWluUGVyaW9kQmxvY2tzKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjYXJvbCkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYXJvbCkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxKSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KDEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwZXItc3Vic2NyaWJlciBzdWJzY3JpcHRpb24gbGltaXQgcmVhY2hlZCIsIGZ1bmMoKSB7CgkJU3Vic2NyaWJlKGNyb3NzKGN1ciksIGV4dHJhKQoJfSkKCS8vIENhbmNlbGxpbmcgb25lIGZyZWVzIGEgc2xvdC4KCXNpZCwgb2sgOj0gQWN0aXZlU3ViSUQobGFzdFBsYW4sIGNhcm9sKQoJaWYgIW9rIHsKCQl0LkZhdGFsKCJleHBlY3RlZCBhbiBhY3RpdmUgc3ViIHRvIGZyZWUiKQoJfQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShjYXJvbCkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYXJvbCkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglDYW5jZWwoY3Jvc3MoY3VyKSwgc2lkKQoJc3Vic2NyaWJlQXMoY3VyLCBjYXJvbCwgZXh0cmEsIDEpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3ZRKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3ZRKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCVJldGlyZVBsYW4oY3Jvc3MoY3VyKSwgZXh0cmEpCn0KCmZ1bmMgVGVzdENsYWltc0FuZEZlZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgNTAwKSAvLyA1JSBpbnRvIHRoZSBuZXh0IHBsYW4KCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAibW9uZXkiLCAxMDAwLCA1MCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgMCkKCgliIDo9IGJlZ2luKCkKCXN1YnNjcmliZUFzKGN1ciwgYWxpY2UsIGlkLCAxMDAwKQoJaWYgRmVlc0FjY3J1ZWQoKS1iLmZlZXMgIT0gNTAgewoJCXQuRmF0YWxmKCJmZWUgPSAlZCwgd2FudCA1MCIsIEZlZXNBY2NydWVkKCktYi5mZWVzKQoJfQoJY3JlZGl0ZWQgOj0gQmFsYW5jZU9mKHByb3YxKQoKCS8vIE1hbGxvcnkgaGFzIG5vIGJhbGFuY2U6IGNsYWltcyBmYWlsLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJpbnN1ZmZpY2llbnQgYmFsYW5jZSIsIGZ1bmMoKSB7IENsYWltKGNyb3NzKGN1ciksIDEpIH0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vdGhpbmcgdG8gY2xhaW0iLCBmdW5jKCkgeyBDbGFpbUFsbChjcm9zcyhjdXIpKSB9KQoKCS8vIFByb3ZpZGVyIGNsYWltcyBhbGw7IGNvaW5zIGFjdHVhbGx5IG1vdmUuCgliZWZvcmUgOj0gY29pbnNPZihwcm92MSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjEpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjEpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQ2xhaW1BbGwoY3Jvc3MoY3VyKSkKCWlmIGNvaW5zT2YocHJvdjEpLWJlZm9yZSAhPSBjcmVkaXRlZCB7CgkJdC5GYXRhbGYoInByb3ZpZGVyIHJlY2VpdmVkICVkLCB3YW50ICVkIiwgY29pbnNPZihwcm92MSktYmVmb3JlLCBjcmVkaXRlZCkKCX0KCWlmIEJhbGFuY2VPZihwcm92MSkgIT0gMCB7CgkJdC5GYXRhbCgiYmFsYW5jZSBub3QgZHJhaW5lZCIpCgl9CgoJLy8gRmVlczogb25seSB0aGUgcmVjaXBpZW50LCBhbmQgb25seSB0aGUgcG90LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJmZWUgcmVjaXBpZW50IG9ubHkiLCBmdW5jKCkgeyBXaXRoZHJhd0ZlZXMoY3Jvc3MoY3VyKSkgfSkKCXBvdEJlZm9yZSA6PSBjb2luc09mKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglXaXRoZHJhd0ZlZXMoY3Jvc3MoY3VyKSkKCWlmIGNvaW5zT2YodGVzdEFkbWluKS1wb3RCZWZvcmUgPT0gMCB7CgkJdC5GYXRhbCgiZmVlIHBvdCBkaWQgbm90IG1vdmUiKQoJfQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm8gZmVlcyBhY2NydWVkIiwgZnVuYygpIHsgV2l0aGRyYXdGZWVzKGNyb3NzKGN1cikpIH0pCgliLmNvbnNlcnZlZCh0LCAwKQp9CgpmdW5jIFRlc3RTd2VlcFJlc2VydmUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAic3dlZXAiLCA1MDAsIDUwKQoJYmVnaW4oKQoJc3Vic2NyaWJlQXMoY3VyLCBib2IsIGlkLCA1MDApCgoJLy8gTm90aGluZyBhYm92ZSB0aGUgcmVzZXJ2ZTogc3dlZXAgcmVmdXNlcy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm5vIHN1cnBsdXMgdG8gc3dlZXAiLCBmdW5jKCkgewoJCVN3ZWVwRGVub20oY3Jvc3MoY3VyKSwgRGVub20pCgl9KQoJLy8gT3V0LW9mLWJhbmQgc3VycGx1cyBsYW5kczsgb25seSB0aGUgc3VycGx1cyBpcyBzd2VlcGFibGUuCgl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdCg3NykpCglsaWFiQmVmb3JlIDo9IExpYWJpbGl0aWVzKCkKCWdvdCA6PSBjb2luc09mKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglTd2VlcERlbm9tKGNyb3NzKGN1ciksIERlbm9tKQoJaWYgY29pbnNPZih0ZXN0QWRtaW4pLWdvdCAhPSA3NyB7CgkJdC5GYXRhbGYoInN3ZXB0ICVkLCB3YW50IDc3IiwgY29pbnNPZih0ZXN0QWRtaW4pLWdvdCkKCX0KCWlmIExpYWJpbGl0aWVzKCkgIT0gbGlhYkJlZm9yZSB7CgkJdC5GYXRhbCgic3dlZXAgdG91Y2hlZCB0aGUgcmVzZXJ2ZSIpCgl9Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIobWFsbG9yeSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImZlZSByZWNpcGllbnQgb25seSIsIGZ1bmMoKSB7CgkJU3dlZXBEZW5vbShjcm9zcyhjdXIpLCBEZW5vbSkKCX0pCn0KCmZ1bmMgVGVzdEFkbWluSGFuZG92ZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihtYWxsb3J5KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb25seSIsIGZ1bmMoKSB7CgkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBtYWxsb3J5KQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglUcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIHByb3YyKQoJLy8gV3JvbmcgYWNjZXB0b3IgcmVmdXNlZDsgYXV0aG9yaXR5IGhhcyBub3QgbW92ZWQgeWV0LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG1hbGxvcnkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBzdGFnZWQgc3VjY2Vzc29yIG1heSBhY2NlcHQiLCBmdW5jKCkgewoJCUFjY2VwdEFkbWluKGNyb3NzKGN1cikpCgl9KQoJaWYgQWRtaW4oKSAhPSB0ZXN0QWRtaW4gewoJCXQuRmF0YWwoImF1dGhvcml0eSBtb3ZlZCBiZWZvcmUgYWNjZXB0YW5jZSIpCgl9Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHByb3YyKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHByb3YyKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUFjY2VwdEFkbWluKGNyb3NzKGN1cikpCglpZiBBZG1pbigpICE9IHByb3YyIHsKCQl0LkZhdGFsKCJhdXRob3JpdHkgZGlkIG5vdCBtb3ZlIikKCX0KCS8vIFRoZSBmb3JtZXIgYWRtaW4gaXMgbG9ja2VkIG91dC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9ubHkiLCBmdW5jKCkgewoJCVNldEZlZUJwcyhjcm9zcyhjdXIpLCAxKQoJfSkKCS8vIEhhbmQgaXQgYmFjayBmb3IgdGhlIHJlbWFpbmluZyB0ZXN0cy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ocHJvdjIpKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIocHJvdjIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKfQoKZnVuYyBUZXN0RmVlQm91bmRzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJmZWUgbXVzdCBiZSBpbiIsIGZ1bmMoKSB7CgkJU2V0RmVlQnBzKGNyb3NzKGN1ciksIE1heEZlZUJwcysxKQoJfSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdEFkbWluKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RBZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImZlZSBtdXN0IGJlIGluIiwgZnVuYygpIHsKCQlTZXRGZWVCcHMoY3Jvc3MoY3VyKSwgLTEpCgl9KQoJdmFyIHplcm8gYWRkcmVzcwoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZmVlIHJlY2lwaWVudCBtdXN0IG5vdCBiZSB0aGUgemVybyBhZGRyZXNzIiwgZnVuYygpIHsKCQlTZXRGZWVSZWNpcGllbnQoY3Jvc3MoY3VyKSwgemVybykKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RBZG1pbikpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0QWRtaW4pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzdWNjZXNzb3IgbXVzdCBub3QgYmUgdGhlIHplcm8gYWRkcmVzcyIsIGZ1bmMoKSB7CgkJVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB6ZXJvKQoJfSkKfQoKZnVuYyBUZXN0U3RyYXlTZW5kUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWlkIDo9IHBsYW5BcyhjdXIsIHByb3YxLCAic3RyYXkiLCAxMDAsIDUwKQoJc3ViSUQgOj0gc3Vic2NyaWJlQXMoY3VyLCBhbGljZSwgaWQsIDEwMCkKCWFybSA6PSBmdW5jKGZyb20gYWRkcmVzcykgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZnJvbSkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMykpCgl9Cglhcm0ocHJvdjEpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgZnVuYygpIHsKCQlSZXRpcmVQbGFuKGNyb3NzKGN1ciksIGlkKQoJfSkKCWFybShhbGljZSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiLCBmdW5jKCkgewoJCUNhbmNlbChjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCglhcm0obWFsbG9yeSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnMiLCBmdW5jKCkgewoJCUV4cGlyZShjcm9zcyhjdXIpLCBzdWJJRCkKCX0pCglhcm0ocHJvdjEpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgZnVuYygpIHsKCQlDbGFpbUFsbChjcm9zcyhjdXIpKQoJfSkKCWFybSh0ZXN0QWRtaW4pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgZnVuYygpIHsKCQlXaXRoZHJhd0ZlZXMoY3Jvc3MoY3VyKSkKCX0pCglhcm0odGVzdEFkbWluKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2lucyIsIGZ1bmMoKSB7CgkJU2V0RmVlQnBzKGNyb3NzKGN1ciksIDApCgl9KQp9CgpmdW5jIFRlc3RSZW5kZXJTYW5pdGl6ZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXBsYW5BcyhjdXIsIHByb3YxLCAiW2V2aWxdKGh0dHBzOi8veCkgPHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0PiIsIDEsIE1pblBlcmlvZEJsb2NrcykKCW91dCA6PSBSZW5kZXIoIiIpCglpZiBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIjxzY3JpcHQ+IikgewoJCXQuRmF0YWwoInVuc2FuaXRpemVkIHRpdGxlIHJlYWNoZWQgUmVuZGVyIikKCX0KCWlmICFzdHJpbmdzLkNvbnRhaW5zKG91dCwgInBsYW5zOiIpIHsKCQl0LkZhdGFsKCJyZW5kZXIgbWlzc2luZyBjb3VudGVycyIpCgl9CglpZiBSZW5kZXIoIm5vcGUiKSA9PSByZW5kZXJIb21lKCkgewoJCXQuRmF0YWwoInVua25vd24gcGF0aCBmZWxsIHRocm91Z2ggdG8gaG9tZSIpCgl9Cn0KCmZ1bmMgVGVzdFVua25vd25JRHModCAqdGVzdGluZy5UKSB7CglkZWZlciBmdW5jKCkgewoJCWlmIHJlY292ZXIoKSA9PSBuaWwgewoJCQl0LkZhdGFsKCJleHBlY3RlZCBwYW5pYyIpCgkJfQoJfSgpCglQbGFuSW5mbyg5OTk5OSkKfQoKLy8gWTEgcmVncmVzc2lvbjogRW50aXRsZWRGb3IgZm9sbG93cyB0aGUgbW9zdCByZWNlbnQgc3Vic2NyaXB0aW9uIGFuZAovLyBob25vcnMgcGFpZCBlbnRpdGxlbWVudCBhY3Jvc3MgY2FuY2VsbGF0aW9uLgpmdW5jIFRlc3RFbnRpdGxlZEZvclN1cnZpdmVzQ2FuY2VsKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglpZCA6PSBwbGFuQXMoY3VyLCBwcm92MSwgInkxIiwgMTAwLCA1MCkKCXN1YklEIDo9IHN1YnNjcmliZUFzKGN1ciwgYWxpY2UsIGlkLCAxMDApCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFsaWNlKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCUNhbmNlbChjcm9zcyhjdXIpLCBzdWJJRCkKCWlmICFFbnRpdGxlZEZvcihpZCwgYWxpY2UpIHsKCQl0LkZhdGFsKCJjYW5jZWxsZWQtYnV0LXBhaWQgc3Vic2NyaWJlciBsb3N0IEVudGl0bGVkRm9yIikKCX0KCS8vIEEgZnJlc2ggU3Vic2NyaWJlIHJlcG9pbnRzIHRoZSBzdXJmYWNlIGF0IHRoZSBuZXcgc3Vic2NyaXB0aW9uLgoJLy8gU2tpcCBhIGZldyBibG9ja3MgZmlyc3Qgc28gcHROZXcgPiBwdE9sZDogYXQgYSBoZWlnaHQgaW4KCS8vIFtwdE9sZCwgcHROZXcpIGEgU1RBTEUgcG9pbnRlciB3b3VsZCBhbnN3ZXIgZmFsc2Ugd2hpbGUgdGhlCgkvLyByZXBvaW50ZWQgb25lIGFuc3dlcnMgdHJ1ZSDigJQgdGhlIGRpc3Rpbmd1aXNoaW5nIGFzc2VydGlvbi4KCV8sIF8sIF8sIF8sIHB0T2xkLCBfLCBfIDo9IFN1YkluZm8oc3ViSUQpCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDUpCgluZXdJRCA6PSBzdWJzY3JpYmVBcyhjdXIsIGFsaWNlLCBpZCwgMTAwKQoJXywgXywgXywgXywgcHROZXcsIF8sIF8gOj0gU3ViSW5mbyhuZXdJRCkKCWlmIHB0TmV3IDw9IHB0T2xkIHsKCQl0LkZhdGFsKCJmaXh0dXJlIGJyb2tlbjogcHROZXcgbXVzdCBleGNlZWQgcHRPbGQiKQoJfQoJaWYgIUVudGl0bGVkRm9yKGlkLCBhbGljZSkgfHwgIUVudGl0bGVkKG5ld0lEKSB8fCAhRW50aXRsZWQoc3ViSUQpIHsKCQl0LkZhdGFsKCJib3RoIHBhaWQgZW50aXRsZW1lbnRzIHNob3VsZCBiZSBsaXZlIHJpZ2h0IGFmdGVyIHJlLXN1YnNjcmliZSIpCgl9Cgl0ZXN0aW5nLlNraXBIZWlnaHRzKHB0T2xkIC0gcnVudGltZS5DaGFpbkhlaWdodCgpKQoJaWYgRW50aXRsZWQoc3ViSUQpIHsKCQl0LkZhdGFsKCJvbGQgc3BhbiBzaG91bGQgaGF2ZSBydW4gb3V0IikKCX0KCWlmICFFbnRpdGxlZEZvcihpZCwgYWxpY2UpIHsKCQl0LkZhdGFsKCJFbnRpdGxlZEZvciBhbnN3ZXJlZCB0aGUgc3RhbGUgaWQsIG5vdCB0aGUgcmVwb2ludGVkIG9uZSIpCgl9CgkvLyBBZnRlciB0aGUgbmV3IHBhaWQgc3BhbiBydW5zIG91dCB0b28sIEVudGl0bGVkRm9yIGdvZXMgZmFsc2UuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKHB0TmV3IC0gcnVudGltZS5DaGFpbkhlaWdodCgpKQoJaWYgRW50aXRsZWRGb3IoaWQsIGFsaWNlKSB7CgkJdC5GYXRhbCgiRW50aXRsZWRGb3IgdHJ1ZSBwYXN0IHBhaWRUaHJvdWdoIikKCX0KfQoKLy8gWTIgY29tcGFuaW9uOiBhIGxhcHNlZC1pbi1ncmFjZSBpbmN1bWJlbnQgYmxvY2tzIFN1YnNjcmliZSB3aXRoIGEKLy8gbWVzc2FnZSB0aGF0IHN0YXRlcyBib3RoIG9wdGlvbnMuCmZ1bmMgVGVzdFN1YnNjcmliZU1lc3NhZ2VJbkdyYWNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglpZCA6PSBwbGFuQXMoY3VyLCBwcm92MSwgInkybXNnIiwgMTAwLCA1MCkKCXN1YklEIDo9IHN1YnNjcmliZUFzKGN1ciwgYm9iLCBpZCwgMTAwKQoJXywgXywgXywgXywgcHQsIF8sIF8gOj0gU3ViSW5mbyhzdWJJRCkKCXRlc3RpbmcuU2tpcEhlaWdodHMocHQgKyAxMCAtIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdCgxMDApKQoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoMTAwKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAibGFwc2VkIGJ1dCByZW5ld2FibGUiLCBmdW5jKCkgewoJCVN1YnNjcmliZShjcm9zcyhjdXIpLCBpZCkKCX0pCgkvLyBDYW5jZWwgKyBTdWJzY3JpYmUgaXMgdGhlIGRvY3VtZW50ZWQgZnJlc2gtc3RhcnQgcGF0aC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGJvYikKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglDYW5jZWwoY3Jvc3MoY3VyKSwgc3ViSUQpCglzdWJzY3JpYmVBcyhjdXIsIGJvYiwgaWQsIDEwMCkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQF+4bWyAPk36RffQYg3cYSRAA1A005lPCofMj4YDW8iFIXvalB35zQ2oBlhjHVZ/rZle0vZxztTqks76a/mDTDgaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data