Transaction executed successfully

Transaction Details

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

Transaction hash
8D96D6496AE8C8835FC610F103046A087B4D56A1C4F07EBB55E1F7400FA54BA7

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
90,000,000
Requested gas limit
GAS USED
50,818,425
Gas consumed
FEE
180000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf14000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Co+UAgoML3ZtLm1fYWRkcGtnEv2TAgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLAkwIKEW1lbWJhX2FwcHN0b3JlX3YzEiRnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYXBwc3RvcmVfdjMahhwKCWFkbWluLmdubxL4G3BhY2thZ2UgbWVtYmFfYXBwc3RvcmVfdjMKCmltcG9ydCAiY2hhaW4iCgovLyBBZG1pbiBzdXJmYWNlIOKAlCBvd25lci1nYXRlZC4gVGhlIG93bmVyIGlzIHRoZSBzYW1jcmV3IG11bHRpc2lnIGF0IGxhdW5jaCBhbmQgY2FuCi8vIGJlIGhhbmRlZCB0byB0aGUgbWVtYmFfZGFvIGV4ZWN1dG9yIHZpYSB0aGUgMi1zdGVwIFRyYW5zZmVyT3duZXJzaGlwL0FjY2VwdE93bmVyc2hpcAovLyAobmV2ZXIgYSAxLXN0ZXAgdHJhbnNmZXIgdG8gYSBtaXN0eXBlZC9kZWFkIGFkZHJlc3MpLgoKLy8gU2V0UmVnaXN0cmF0aW9uRmVlIHNldHMgdGhlIGZsYXQgbGlzdGluZyBmZWUgaW4gdWdub3QgKDAuLk1heFJlZ2lzdHJhdGlvbkZlZSkuCi8vIFplcm8gaXMgYWxsb3dlZCAoYSBmZWUgd2FpdmVyKS4gT3duZXIgb25seS4KZnVuYyBTZXRSZWdpc3RyYXRpb25GZWUoY3VyIHJlYWxtLCBmZWUgaW50NjQpIHsKCWFzc2VydE93bmVyKCkKCWlmIGZlZSA8IDAgfHwgZmVlID4gTWF4UmVnaXN0cmF0aW9uRmVlIHsKCQlwYW5pYygiZmVlIG91dCBvZiByYW5nZSBbMCwgTWF4UmVnaXN0cmF0aW9uRmVlXSIpCgl9CglyZWdpc3RyYXRpb25GZWUgPSBmZWUKCWNoYWluLkVtaXQoIlJlZ2lzdHJhdGlvbkZlZVNldCIsICJmZWUiLCBpdG9hNjQodWludDY0KGZlZSkpKQp9CgovLyBTZXRUcmVhc3VyeSByZXBvaW50cyB0aGUgZmVlIHJlY2lwaWVudC4gTXVzdCBiZSBub24tZW1wdHkgKGFuIGVtcHR5IHRyZWFzdXJ5IHdvdWxkCi8vIGZhaWwtY2xvc2UgUmVnaXN0ZXJBcHApLiBPd25lciBvbmx5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoCi8vIG1lbWJhX21hcmtldF9jb25maWcuR2V0VHJlYXN1cnkoKS4KZnVuYyBTZXRUcmVhc3VyeShjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoKQoJaWYgYWRkciA9PSAiIiB7CgkJcGFuaWMoInRyZWFzdXJ5IG11c3QgYmUgbm9uLWVtcHR5IikKCX0KCXRyZWFzdXJ5ID0gYWRkcgoJY2hhaW4uRW1pdCgiVHJlYXN1cnlTZXQiLCAidHJlYXN1cnkiLCBhZGRyLlN0cmluZygpKQp9CgovLyBBZGRDdXJhdG9yIGdyYW50cyB0aGUgY3VyYXRlIHJvbGUgKGFwcHJvdmUgcGVuZGluZyBsaXN0aW5ncykuIE93bmVyIG9ubHkuCmZ1bmMgQWRkQ3VyYXRvcihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoKQoJaWYgYWRkciA9PSAiIiB7CgkJcGFuaWMoImN1cmF0b3IgbXVzdCBiZSBub24tZW1wdHkiKQoJfQoJY3VyYXRvcnMuU2V0KGFkZHIuU3RyaW5nKCksIHRydWUpCgljaGFpbi5FbWl0KCJDdXJhdG9yQWRkZWQiLCAiY3VyYXRvciIsIGFkZHIuU3RyaW5nKCkpCn0KCi8vIFJlbW92ZUN1cmF0b3IgcmV2b2tlcyB0aGUgY3VyYXRlIHJvbGUuIE93bmVyIG9ubHkuCmZ1bmMgUmVtb3ZlQ3VyYXRvcihjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgewoJYXNzZXJ0T3duZXIoKQoJY3VyYXRvcnMuUmVtb3ZlKGFkZHIuU3RyaW5nKCkpCgljaGFpbi5FbWl0KCJDdXJhdG9yUmVtb3ZlZCIsICJjdXJhdG9yIiwgYWRkci5TdHJpbmcoKSkKfQoKLy8gUGF1c2UgaXMgdGhlIGtpbGwgc3dpdGNoOiB3aGlsZSBwYXVzZWQsIFJlZ2lzdGVyQXBwIGFib3J0cyAocmVhZHMgc3RheSBhdmFpbGFibGUpLgovLyBPd25lciBvbmx5LgpmdW5jIFBhdXNlKGN1ciByZWFsbSwgc3RhdGUgYm9vbCkgewoJYXNzZXJ0T3duZXIoKQoJcGF1c2VkID0gc3RhdGUKCWNoYWluLkVtaXQoIlBhdXNlU2V0IiwgInBhdXNlZCIsIGJvb2xTdHIoc3RhdGUpKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBzdGFnZXMgYSBuZXcgb3duZXI7IGl0IHRha2VzIGVmZmVjdCBvbmx5IGFmdGVyIEFjY2VwdE93bmVyc2hpcAovLyBpcyBjYWxsZWQgQlkgdGhhdCBhZGRyZXNzICgyLXN0ZXAsIHNvIGEgdHlwbyBjYW4ndCBicmljayBhZG1pbikuIEEgbGF0ZXIgY2FsbAovLyByZXBsYWNlcyB0aGUgc3RhZ2VkIGFkZHJlc3M7IENhbmNlbE93bmVyc2hpcFRyYW5zZmVyIHdpdGhkcmF3cyBpdC4KZnVuYyBUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIG5ld093bmVyIGFkZHJlc3MpIHsKCWFzc2VydE93bmVyKCkKCWlmIG5ld093bmVyID09ICIiIHsKCQlwYW5pYygibmV3T3duZXIgbXVzdCBiZSBub24tZW1wdHkiKQoJfQoJaWYgIW5ld093bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRkcmVzczogIiArIG5ld093bmVyLlN0cmluZygpKQoJfQoJaWYgbmV3T3duZXIgPT0gb3duZXIgewoJCXBhbmljKCJuZXdPd25lciBpcyB0aGUgY3VycmVudCBvd25lciIpCgl9CglwZW5kaW5nT3duZXIgPSBuZXdPd25lcgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJTdGFydGVkIiwgInBlbmRpbmciLCBuZXdPd25lci5TdHJpbmcoKSkKfQoKLy8gQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIgd2l0aGRyYXdzIGEgc3RhZ2VkIGhhbmRvZmYuIE93bmVyIG9ubHkuCmZ1bmMgQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3VyIHJlYWxtKSB7Cglhc3NlcnRPd25lcigpCglpZiBwZW5kaW5nT3duZXIgPT0gIiIgewoJCXBhbmljKCJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciIpCgl9CgljYW5jZWxsZWQgOj0gcGVuZGluZ093bmVyCglwZW5kaW5nT3duZXIgPSAiIgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJDYW5jZWxsZWQiLCAicGVuZGluZyIsIGNhbmNlbGxlZC5TdHJpbmcoKSkKfQoKLy8gR2V0UGVuZGluZ093bmVyIHJldHVybnMgdGhlIHN0YWdlZCBzdWNjZXNzb3IsIG9yIHRoZSBlbXB0eSBhZGRyZXNzLgpmdW5jIEdldFBlbmRpbmdPd25lcigpIGFkZHJlc3MgeyByZXR1cm4gcGVuZGluZ093bmVyIH0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgdGhlIGhhbmRvZmYuIE9ubHkgdGhlIHN0YWdlZCBwZW5kaW5nT3duZXIgbWF5IGNhbGwgaXQuCi8vIFRoZSBmb3JtZXIgb3duZXIncyBjdXJhdG9yIGdyYW50IGlzIHJldm9rZWQgYXRvbWljYWxseTsgdGhlIHN1Y2Nlc3NvciBjYW4KLy8gY3VyYXRlIGltbWVkaWF0ZWx5IGFuZCBtYXkgZXhwbGljaXRseSByZS1hcHBvaW50IHRoZSBmb3JtZXIgb3duZXIgbGF0ZXIuCmZ1bmMgQWNjZXB0T3duZXJzaGlwKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInNwb29mZWQgcmVhbG0iKQoJfQoJaWYgcGVuZGluZ093bmVyID09ICIiIHsKCQlwYW5pYygibm8gcGVuZGluZyBvd25lcnNoaXAgdHJhbnNmZXIiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHBlbmRpbmdPd25lciB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogb25seSB0aGUgcGVuZGluZyBvd25lciBtYXkgYWNjZXB0IikKCX0KCXByZXZpb3VzIDo9IG93bmVyCgljdXJhdG9ycy5TZXQocGVuZGluZ093bmVyLlN0cmluZygpLCB0cnVlKQoJY3VyYXRvcnMuUmVtb3ZlKHByZXZpb3VzLlN0cmluZygpKQoJb3duZXIgPSBwZW5kaW5nT3duZXIKCXBlbmRpbmdPd25lciA9ICIiCgljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlckFjY2VwdGVkIiwgIm93bmVyIiwgb3duZXIuU3RyaW5nKCkpCn0KCmZ1bmMgYm9vbFN0cihiIGJvb2wpIHN0cmluZyB7CglpZiBiIHsKCQlyZXR1cm4gInRydWUiCgl9CglyZXR1cm4gImZhbHNlIgp9ChqZtQEKDGFwcHN0b3JlLmdubxKHtQEvLyBQYWNrYWdlIG1lbWJhX2FwcHN0b3JlX3YzIGlzIGEgY3VyYXRlZCBBcHAgU3RvcmUgZm9yIGduby5sYW5kIGRBcHBzOiBwdWJsaXNoZXJzCi8vIHBheSBhIGZsYXQgbGlzdGluZyBmZWUgdG8gcmVnaXN0ZXIgYW4gYXBwOyBhIGN1cmF0b3IgZmxpcHMgaXQgbGl2ZSAob3IgcmVqZWN0cyBpdCkuCi8vCi8vIE1PTkVZIFBBVEggKHRoZSBvbmx5IG9uZSk6IFJlZ2lzdGVyQXBwIGNvbGxlY3RzIGEgZmxhdCBgcmVnaXN0cmF0aW9uRmVlYCBpbiB1Z25vdAovLyBhbmQgZm9yd2FyZHMgMTAwJSB0byB0aGUgdHJlYXN1cnkgaW4gdGhlIFNBTUUgY2FsbCDigJQgbm90aGluZyBpcyBldmVyIGN1c3RvZGllZC4KLy8gVGhlIHNhZmV0eSBjb250cmFjdCBtaXJyb3JzIG1lbWJhX3Rva2VuX290Y192MSArIHRoZSBPLTEzIGxlc3NvbjoKLy8gICAxLiBJc1VzZXJDYWxsKCkgZ3VhcmQgQkVGT1JFIHJlYWRpbmcgT3JpZ2luU2VuZCDigJQgYW4gZXBoZW1lcmFsIGBtYWtldHggcnVuYAovLyAgICAgIHJlYWxtIGNhbiBuZXZlciBhdHRhY2ggdW5yZWNvdmVyYWJsZSBjb2lucyAodGhlIGd1YXJkIGFnZW50X3JlZ2lzdHJ5IG1pc3NlZCkuCi8vICAgMi4gZXhhY3QtY29pbiB2aWEgdW5zYWZlLk9yaWdpblNlbmQoKSAodGhlIGNvaW5zIG9uIFRISVMgY2FsbCwgbm90IHRoZSB3YWxsZXQKLy8gICAgICBiYWxhbmNlKSDigJQgY2xvc2VzIHRoZSBvdmVycGF5LXRyYXAgYW5kIHRoZSB3YWxsZXQtYmFsYW5jZSBieXBhc3MuCi8vICAgMy4gdHJlYXN1cnktbWlzY29uZmlnIGlzIGZhaWwtY2xvc2VkOiBhbiB1bnNldCB0cmVhc3VyeSBwYW5pY3MgKOKGkiB0eCByZXZlcnRzIOKGkgovLyAgICAgIGNvaW5zIHJlZnVuZGVkKSwgbmV2ZXIgc2lsZW50IGN1c3RvZHkuCi8vICAgNC4gQ0VJOiBzdGF0ZSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmFua2VyIG1vdmVzIGZ1bmRzLiBBbGwgYXR0YWNrZXItY29udHJvbGxlZAovLyAgICAgIGlucHV0IChzY3JlZW5zaG90cywgYXBwVVJMIHNjaGVtZSkgaXMgdmFsaWRhdGVkIEJFRk9SRSBPcmlnaW5TZW5kIGlzIHJlYWQuCi8vICAgNS4gTmV3QmFua2VyKFJlYWxtU2VuZCwgY3VyKSBzZW5kcyB0aGUgZmVlIGZyb20gdGhlIHJlYWxtJ3Mgb3duIGFkZHJlc3MgdG8gdGhlCi8vICAgICAgdHJlYXN1cnkg4oCUIG5vIGN1c3RvZHksIG5vIGVzY3JvdyAod2hpY2ggaXMgd2h5IG5vIGVzY3JvdyBpcyBuZWVkZWQgdG8gYmUgc2FmZSkuCi8vCi8vIHYzIG92ZXIgdjI6IGEgYHJlamVjdGVkYCBzdGF0ZSArIFJlamVjdEFwcC9FZGl0TGlzdGluZyBsaWZlY3ljbGUsIOKJpDYgc2NyZWVuc2hvdHMsCi8vIGFuIG9uLWNoYWluIGFwcFVSTCBzY2hlbWUgYWxsb3dsaXN0LCBGbGFnQXBwIGV4dGVuZGVkIHRvIHBlbmRpbmcgbGlzdGluZ3MgKHRoZQovLyBwdWJsaWMgVW52ZXJpZmllZCB0YWIncyBzYWZldHkgdmFsdmUpLCBjb21wb3NpdGUta2V5IHN0YXR1cy9wdWJsaXNoZXIgaW5kZXhlcyB3aXRoCi8vIE8oMSkgcGVyLXN0YXR1cyBjb3VudGVycyAoc28gc3RhdHVzL3B1Ymxpc2hlciByZWFkcyBhcmUgYm91bmRlZCwgbm90IGZ1bGwgc2NhbnMpLAovLyBhbmQgYSBzZWFsZWQgU2VlZExpc3RpbmcgbWlncmF0aW9uIHByaW1pdGl2ZSAoRmluYWxpemVTZWVkIGNsb3NlcyB0aGUgYmFja2Rvb3IpLgovLwovLyBUUkVBU1VSWTogc3RvcmVkIExPQ0FMTFkgKGFkbWluLXNldHRhYmxlLCAyLXN0ZXAgaGFuZG9mZiwgZGVmYXVsdHMgdG8gdGhlIHNhbWNyZXcKLy8gbXVsdGlzaWcpIHJhdGhlciB0aGFuIHJlYWQgZnJvbSBtZW1iYV9tYXJrZXRfY29uZmlnIOKAlCBrZWVwcyB0aGUgbW9uZXkgcGF0aCBsb2NhbGx5Ci8vIHVuaXQtdGVzdGFibGUuIEtlZXAgaXQgaW4gc3luYyB3aXRoIG1lbWJhX21hcmtldF9jb25maWcuR2V0VHJlYXN1cnkoKS4KcGFja2FnZSBtZW1iYV9hcHBzdG9yZV92MwoKaW1wb3J0ICgKCSJzdHJpbmdzIgoKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2F2bCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIE5vIGF1dGhvcml0eSBpcyBjb21waWxlZCBpbi4gVGhlIHB1Ymxpc2hpbmcgdHJhbnNhY3Rpb24ncyBzaWduZXIgKG9uCi8vIGdub2xhbmQtMSB0aGUgc2FtY3JldyBuYW1lc3BhY2UgbXVsdGlzaWcsIHRoZSBzdGFtcGVkIGNyZWF0b3IgYXQgZW5hYmxlIHRpbWUpCi8vIGlzIHNlZWRlZCBhcyBvd25lciwgdHJlYXN1cnkgYW5kIGZpcnN0IGN1cmF0b3IgYXQgcGFja2FnZSBsb2FkLCBhbmQgZXZlcnkKLy8gbGF0ZXIgY2hhbmdlIGdvZXMgdGhyb3VnaCB0aGUgb3duZXItZ2F0ZWQgYWRtaW4gc3VyZmFjZTogU2V0VHJlYXN1cnkgcmVwb2ludHMKLy8gdGhlIGZlZSByZWNpcGllbnQsIGFuZCBUcmFuc2Zlck93bmVyc2hpcC9BY2NlcHRPd25lcnNoaXAgaGFuZCBhZG1pbiB0byB0aGUKLy8gbWVtYmFfZGFvIGV4ZWN1dG9yIGluIHR3byBzdGVwcy4KCmNvbnN0ICgKCS8vIERlZmF1bHRSZWdpc3RyYXRpb25GZWUgaXMgdGhlIGxhdW5jaCBsaXN0aW5nIGZlZTogMSBHTk9UICgxXzAwMF8wMDAgdWdub3QpLgoJRGVmYXVsdFJlZ2lzdHJhdGlvbkZlZSA9IGludDY0KDFfMDAwXzAwMCkKCS8vIE1heFJlZ2lzdHJhdGlvbkZlZSBjYXBzIGEgZmF0LWZpbmdlciAvIGNvbXByb21pc2VkLXByb3Bvc2FsIGZlZSBhdCAxMDAgR05PVC4KCU1heFJlZ2lzdHJhdGlvbkZlZSA9IGludDY0KDEwMF8wMDBfMDAwKQoKCU1heE5hbWVMZW4gICAgID0gODAKCU1heFRhZ2xpbmVMZW4gID0gMTQwCglNYXhEZXNjckxlbiAgICA9IDIwMDAKCU1heENhdGVnb3J5TGVuID0gNDAKCU1heFVSTExlbiAgICAgID0gNDAwCglNYXhQa2dQYXRoTGVuICA9IDIwMAoJTWF4Q0lETGVuICAgICAgPSAxMDAKCU1heFJlYXNvbkxlbiAgID0gNTAwCgkvLyBNYXhTY3JlZW5zaG90cyBib3VuZHMgdGhlIHBlci1saXN0aW5nIHNjcmVlbnNob3QgZ2FsbGVyeS4KCU1heFNjcmVlbnNob3RzID0gNgoJLy8gTWF4UmVzdWJtaXRzIGJvdW5kcyBob3cgbWFueSB0aW1lcyBhIHB1Ymxpc2hlciBjYW4gZWRpdC9yZXN1Ym1pdCBhIGxpc3RpbmcsIHNvIGEKCS8vIHJlamVjdOKGkmVkaXTihpJwZW5kaW5nIGxvb3AgY2FuJ3QgZ3JpZWYgdGhlIGN1cmF0b3IgcXVldWUgaW5kZWZpbml0ZWx5LgoJTWF4UmVzdWJtaXRzID0gNQoJLy8gRmxhZ0hpZGVUaHJlc2hvbGQgYXV0by1oaWRlcyBhIGxpc3RpbmcgKGxpdmUgT1IgcGVuZGluZykgZnJvbSB0aGUgcHVibGljIGxpc3RzIG9uY2UKCS8vIHRoaXMgbWFueSBkaXN0aW5jdCBhZGRyZXNzZXMgaGF2ZSBmbGFnZ2VkIGl0LgoJRmxhZ0hpZGVUaHJlc2hvbGQgPSA1CikKCi8vIExpc3RpbmcgbGlmZWN5Y2xlIHN0YXRlcy4KY29uc3QgKAoJU3RhdHVzUGVuZGluZyAgPSAicGVuZGluZyIKCVN0YXR1c0xpdmUgICAgID0gImxpdmUiCglTdGF0dXNSZWplY3RlZCA9ICJyZWplY3RlZCIKCVN0YXR1c0RlbGlzdGVkID0gImRlbGlzdGVkIgopCgovLyBMaXN0aW5nIGlzIG9uZSBhcHAuIFBrZ1BhdGggKHRoZSByZWFsbS9wYWNrYWdlIHBhdGgpIGlzIHRoZSB1bmlxdWUga2V5Lgp0eXBlIExpc3Rpbmcgc3RydWN0IHsKCUlkICAgICAgICAgICAgICAgICB1aW50NjQKCVBrZ1BhdGggICAgICAgICAgICBzdHJpbmcKCU5hbWUgICAgICAgICAgICAgICBzdHJpbmcKCVRhZ2xpbmUgICAgICAgICAgICBzdHJpbmcKCURlc2NyICAgICAgICAgICAgICBzdHJpbmcKCUNhdGVnb3J5ICAgICAgICAgICBzdHJpbmcKCUljb25DSUQgICAgICAgICAgICBzdHJpbmcKCVNjcmVlbnNob3RDSURzICAgICBbXXN0cmluZwoJQXBwVVJMICAgICAgICAgICAgIHN0cmluZwoJUHVibGlzaGVyICAgICAgICAgIGFkZHJlc3MKCVN0YXR1cyAgICAgICAgICAgICBzdHJpbmcKCVJlamVjdFJlYXNvbiAgICAgICBzdHJpbmcKCVBhaWRSZXN1Ym1pdENyZWRpdCBib29sCglSZXN1Ym1pdENvdW50ICAgICAgaW50CglGbGFnQ291bnQgICAgICAgICAgaW50CglDcmVhdGVkQXQgICAgICAgICAgaW50NjQKfQoKdmFyICgKCW93bmVyICAgICAgICAgIGFkZHJlc3MKCXBlbmRpbmdPd25lciAgIGFkZHJlc3MKCXRyZWFzdXJ5ICAgICAgIGFkZHJlc3MKCXJlZ2lzdHJhdGlvbkZlZSBpbnQ2NAoJcGF1c2VkICAgICAgICAgYm9vbAoJc2VlZGluZ1NlYWxlZCAgYm9vbAoJY3VyYXRvcnMgICAgICAgPSBhdmwuTmV3VHJlZSgpIC8vIGFkZHJlc3Mgc3RyaW5nIC0+IGJvb2wKCWxpc3RpbmdzICAgICAgID0gYXZsLk5ld1RyZWUoKSAvLyBwa2dQYXRoIC0+ICpMaXN0aW5nCglmbGFnZ2VkQnkgICAgICA9IGF2bC5OZXdUcmVlKCkgLy8gcGtnUGF0aCArICJceDAwIiArIGFkZHIgLT4gYm9vbCAob25lIGZsYWcgcGVyIGFkZHIpCgkvLyBzdGF0dXNJbmRleC9wdWJsaXNoZXJJbmRleDogY29tcG9zaXRlLWtleSBpbmRleGVzIGZvciBib3VuZGVkIHN0YXR1cy9wdWJsaXNoZXIgcmVhZHMuCgkvLyBrZXkgPSBzdGF0dXN8cHViICsgIlx4MDAiICsgemVyb1BhZChpZCkgLT4gcGtnUGF0aCwgc28gYSBwcmVmaXggcmFuZ2UtaXRlcmF0ZSB5aWVsZHMgYQoJLy8gdHJ1ZSBPKG9mZnNldCtsaW1pdCkgd2luZG93IG9yZGVyZWQgYnkgc3VibWlzc2lvbiBpZCwgbmV2ZXIgYSBmdWxsLWNhdGFsb2cgc2Nhbi4KCXN0YXR1c0luZGV4ICAgID0gYXZsLk5ld1RyZWUoKQoJcHVibGlzaGVySW5kZXggPSBhdmwuTmV3VHJlZSgpCgkvLyBPKDEpIHBlci1zdGF0dXMgY291bnRlcnMsIG1haW50YWluZWQgb24gZXZlcnkgc3RhdHVzIHRyYW5zaXRpb24uCglsaXZlQ291bnQgICAgIGludAoJcGVuZGluZ0NvdW50ICBpbnQKCXJlamVjdGVkQ291bnQgaW50CglkZWxpc3RlZENvdW50IGludAoJbmV4dElkIHVpbnQ2NCA9IDEKKQoKZnVuYyBpbml0KCkgewoJcmVnaXN0cmF0aW9uRmVlID0gRGVmYXVsdFJlZ2lzdHJhdGlvbkZlZQoJc2VlZEF1dGhvcml0eSh1bnNhZmUuT3JpZ2luQ2FsbGVyKCkpCn0KCi8vIHNlZWRBdXRob3JpdHkgbWFrZXMgdGhlIHB1Ymxpc2hlciB0aGUgb3duZXIsIHRoZSBmZWUgcmVjaXBpZW50IGFuZCB0aGUgZmlyc3QKLy8gY3VyYXRvci4gSXQgcnVucyBvbmNlIGF0IHBhY2thZ2UgbG9hZDsgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIG9idGFpbiBvd25lci4KZnVuYyBzZWVkQXV0aG9yaXR5KHB1Ymxpc2hlciBhZGRyZXNzKSB7Cglvd25lciA9IHB1Ymxpc2hlcgoJcGVuZGluZ093bmVyID0gIiIKCXRyZWFzdXJ5ID0gcHVibGlzaGVyCgljdXJhdG9ycy5TZXQocHVibGlzaGVyLlN0cmluZygpLCB0cnVlKQp9CgpmdW5jIGNhbGxlcigpIGFkZHJlc3MgeyByZXR1cm4gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkgfQoKZnVuYyBhc3NlcnRPd25lcigpIHsKCWlmIGNhbGxlcigpICE9IG93bmVyIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBvd25lciBvbmx5IikKCX0KfQoKZnVuYyBhc3NlcnROb3RQYXVzZWQoKSB7CglpZiBwYXVzZWQgewoJCXBhbmljKCJhcHBzdG9yZSBpcyBwYXVzZWQiKQoJfQp9CgovLyDilIDilIAgTW9uZXkgcGF0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFJlZ2lzdGVyQXBwIGxpc3RzIGEgbmV3IGFwcC4gVGhlIGNhbGxlciBwYXlzIEVYQUNUTFkgcmVnaXN0cmF0aW9uRmVlIHVnbm90IHdpdGggdGhlIGNhbGw7Ci8vIHRoZSB3aG9sZSBmZWUgaXMgZm9yd2FyZGVkIHRvIHRoZSB0cmVhc3VyeSAobm8gY3VzdG9keSkuIFRoZSBsaXN0aW5nIHN0YXJ0cyBgcGVuZGluZ2AuCmZ1bmMgUmVnaXN0ZXJBcHAoCgljdXIgcmVhbG0sCglwa2dQYXRoLCBuYW1lLCB0YWdsaW5lLCBkZXNjciwgY2F0ZWdvcnksIGljb25DSUQsIHNjcmVlbnNob3RzQ1NWLCBhcHBVUkwgc3RyaW5nLAopIHVpbnQ2NCB7Cglhc3NlcnROb3RQYXVzZWQoKQoKCS8vIE8tMTMgZ3VhcmQ6IGEgcGF5YWJsZSBlbnRyeXBvaW50IE1VU1QgYmUgYSBkaXJlY3QgdXNlciBjYWxsLgoJaWYgIXVuc2FmZS5QcmV2aW91c1JlYWxtKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygiUmVnaXN0ZXJBcHAgbXVzdCBiZSBhIGRpcmVjdCB1c2VyIGNhbGwiKQoJfQoKCS8vIFZhbGlkYXRlIEFMTCBhdHRhY2tlci1jb250cm9sbGVkIGlucHV0IEJFRk9SRSByZWFkaW5nIHRoZSBhdHRhY2hlZCBjb2lucy4KCXBrZ1BhdGggPSB2YWxpZGF0ZVBrZ1BhdGgocGtnUGF0aCkKCWlmIF8sIGR1cCA6PSBsaXN0aW5ncy5HZXQocGtnUGF0aCk7IGR1cCB7CgkJcGFuaWMoImFwcCBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgcGFja2FnZSBwYXRoIikKCX0KCXZhbGlkYXRlTGlzdGluZ0ZpZWxkcyhuYW1lLCB0YWdsaW5lLCBkZXNjciwgY2F0ZWdvcnksIGljb25DSUQsIGFwcFVSTCkKCXNob3RzIDo9IHBhcnNlU2NyZWVuc2hvdHMoc2NyZWVuc2hvdHNDU1YpCgoJLy8gRXhhY3QtY29pbjogcmVhZCB0aGUgY29pbnMgYXR0YWNoZWQgdG8gVEhJUyBjYWxsIChub3QgdGhlIHdhbGxldCBiYWxhbmNlKS4KCXNlbnQgOj0gdW5zYWZlLk9yaWdpblNlbmQoKQoJaWYgc2VudC5BbW91bnRPZigidWdub3QiKSAhPSByZWdpc3RyYXRpb25GZWUgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibXVzdCBzZW5kIGV4YWN0bHkgJWQgdWdub3QgKHNlbnQgJWQpIiwgcmVnaXN0cmF0aW9uRmVlLCBzZW50LkFtb3VudE9mKCJ1Z25vdCIpKSkKCX0KCS8vIEZhaWwtY2xvc2VkIG9uIGEgbWlzY29uZmlndXJlZCB0cmVhc3VyeSDigJQgcmV2ZXJ0aW5nIHJlZnVuZHMgdGhlIGNvaW5zLgoJaWYgdHJlYXN1cnkgPT0gIiIgewoJCXBhbmljKCJ0cmVhc3VyeSB1bnNldCDigJQgcmVnaXN0cmF0aW9uIGRpc2FibGVkIikKCX0KCgkvLyBDRUk6IHdyaXRlIHN0YXRlIGJlZm9yZSBtb3ZpbmcgZnVuZHMuCglpZCA6PSBuZXh0SWQKCW5leHRJZCsrCglsIDo9ICZMaXN0aW5newoJCUlkOiAgICAgICAgICAgICBpZCwKCQlQa2dQYXRoOiAgICAgICAgcGtnUGF0aCwKCQlOYW1lOiAgICAgICAgICAgbmFtZSwKCQlUYWdsaW5lOiAgICAgICAgdGFnbGluZSwKCQlEZXNjcjogICAgICAgICAgZGVzY3IsCgkJQ2F0ZWdvcnk6ICAgICAgIGNhdGVnb3J5LAoJCUljb25DSUQ6ICAgICAgICBpY29uQ0lELAoJCVNjcmVlbnNob3RDSURzOiBzaG90cywKCQlBcHBVUkw6ICAgICAgICAgYXBwVVJMLAoJCVB1Ymxpc2hlcjogICAgICBjYWxsZXIoKSwKCQlTdGF0dXM6ICAgICAgICAgU3RhdHVzUGVuZGluZywKCQlDcmVhdGVkQXQ6ICAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpLAoJfQoJbGlzdGluZ3MuU2V0KHBrZ1BhdGgsIGwpCglpbmRleEluc2VydChsKQoKCS8vIEZvcndhcmQgdGhlIHdob2xlIGZlZSB0byB0aGUgdHJlYXN1cnkgZnJvbSB0aGUgcmVhbG0ncyBvd24gYWNjb3VudC4KCWlmIHJlZ2lzdHJhdGlvbkZlZSA+IDAgewoJCWJuayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCgkJYm5rLlNlbmRDb2lucygKCQkJdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKSwKCQkJdHJlYXN1cnksCgkJCWNoYWluLkNvaW5ze2NoYWluLk5ld0NvaW4oInVnbm90IiwgcmVnaXN0cmF0aW9uRmVlKX0sCgkJKQoJfQoKCWNoYWluLkVtaXQoIkFwcFJlZ2lzdGVyZWQiLCAicGtnUGF0aCIsIHBrZ1BhdGgsICJpZCIsIGl0b2E2NChpZCksICJwdWJsaXNoZXIiLCBjYWxsZXIoKS5TdHJpbmcoKSkKCXJldHVybiBpZAp9CgovLyDilIDilIAgQ3VyYXRpb24gJiBtb2RlcmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gQXBwcm92ZUFwcCBmbGlwcyBhIHBlbmRpbmcgKG9yIHByZXZpb3VzbHktbGl2ZSkgbGlzdGluZyBsaXZlLiBDdXJhdG9yLW9ubHkuCmZ1bmMgQXBwcm92ZUFwcChjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CglpZiAhaXNDdXJhdG9yKGNhbGxlcigpKSB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY3VyYXRvciBvbmx5IikKCX0KCWwgOj0gbXVzdEdldChwa2dQYXRoKQoJaWYgbC5TdGF0dXMgPT0gU3RhdHVzRGVsaXN0ZWQgewoJCXBhbmljKCJjYW5ub3QgYXBwcm92ZSBhIGRlbGlzdGVkIGFwcCIpCgl9CglpZiBsLlN0YXR1cyAhPSBTdGF0dXNMaXZlIHsKCQljaGFuZ2VTdGF0dXMobCwgU3RhdHVzTGl2ZSkKCX0KCWNoYWluLkVtaXQoIkFwcEFwcHJvdmVkIiwgInBrZ1BhdGgiLCBwa2dQYXRoKQp9CgovLyBSZWplY3RBcHAgZGVjbGluZXMgYSBwZW5kaW5nIHN1Ym1pc3Npb24sIHJlY29yZGluZyBhIHJlYXNvbiBhbmQgZ3JhbnRpbmcgYSBvbmUtdGltZSBmcmVlCi8vIHJlc3VibWl0IGNyZWRpdC4gQ3VyYXRvci1vbmx5OyBvbmx5IGEgcGVuZGluZyBhcHAgY2FuIGJlIHJlamVjdGVkLgpmdW5jIFJlamVjdEFwcChjdXIgcmVhbG0sIHBrZ1BhdGgsIHJlYXNvbiBzdHJpbmcpIHsKCWlmICFpc0N1cmF0b3IoY2FsbGVyKCkpIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBjdXJhdG9yIG9ubHkiKQoJfQoJaWYgbGVuKHJlYXNvbikgPiBNYXhSZWFzb25MZW4gewoJCXBhbmljKCJyZWFzb24gdG9vIGxvbmciKQoJfQoJbCA6PSBtdXN0R2V0KHBrZ1BhdGgpCglpZiBsLlN0YXR1cyAhPSBTdGF0dXNQZW5kaW5nIHsKCQlwYW5pYygib25seSBhIHBlbmRpbmcgYXBwIGNhbiBiZSByZWplY3RlZCIpCgl9CgljaGFuZ2VTdGF0dXMobCwgU3RhdHVzUmVqZWN0ZWQpCglsLlJlamVjdFJlYXNvbiA9IHJlYXNvbgoJbC5QYWlkUmVzdWJtaXRDcmVkaXQgPSB0cnVlCglsaXN0aW5ncy5TZXQocGtnUGF0aCwgbCkKCWNoYWluLkVtaXQoIkFwcFJlamVjdGVkIiwgInBrZ1BhdGgiLCBwa2dQYXRoKQp9CgovLyBFZGl0TGlzdGluZyBsZXRzIHRoZSBwdWJsaXNoZXIgdXBkYXRlIGEgbGlzdGluZyB0aGF0IGlzIE5PVCBsaXZlL2RlbGlzdGVkIOKAlCBpLmUuIGEgcGVuZGluZwovLyBvciByZWplY3RlZCBvbmUg4oCUIGFuZCByZXNldHMgaXQgdG8gYHBlbmRpbmdgIGZvciAocmUtKXJldmlldy4gRWRpdGluZyBhIGxpdmUgbGlzdGluZyBpcwovLyBzdHJ1Y3R1cmFsbHkgZm9yYmlkZGVuIHNvIGEgVmVyaWZpZWQgYmFkZ2UgY2FuIG5ldmVyIGJlIGJhaXQtYW5kLXN3aXRjaGVkLiBCb3VuZGVkIGJ5Ci8vIE1heFJlc3VibWl0cyBzbyBhIHJlamVjdOKGkmVkaXQgbG9vcCBjYW4ndCBncmllZiB0aGUgcXVldWUuCmZ1bmMgRWRpdExpc3RpbmcoCgljdXIgcmVhbG0sCglwa2dQYXRoLCBuYW1lLCB0YWdsaW5lLCBkZXNjciwgY2F0ZWdvcnksIGljb25DSUQsIHNjcmVlbnNob3RzQ1NWLCBhcHBVUkwgc3RyaW5nLAopIHsKCWwgOj0gbXVzdEdldChwa2dQYXRoKQoJaWYgY2FsbGVyKCkgIT0gbC5QdWJsaXNoZXIgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IHB1Ymxpc2hlciBvbmx5IikKCX0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c1BlbmRpbmcgJiYgbC5TdGF0dXMgIT0gU3RhdHVzUmVqZWN0ZWQgewoJCXBhbmljKCJjYW5ub3QgZWRpdCBhIGxpdmUgb3IgZGVsaXN0ZWQgbGlzdGluZyIpCgl9CglpZiBsLlJlc3VibWl0Q291bnQgPj0gTWF4UmVzdWJtaXRzIHsKCQlwYW5pYygicmVzdWJtaXQgbGltaXQgcmVhY2hlZCIpCgl9Cgl2YWxpZGF0ZUxpc3RpbmdGaWVsZHMobmFtZSwgdGFnbGluZSwgZGVzY3IsIGNhdGVnb3J5LCBpY29uQ0lELCBhcHBVUkwpCglzaG90cyA6PSBwYXJzZVNjcmVlbnNob3RzKHNjcmVlbnNob3RzQ1NWKQoKCWwuTmFtZSA9IG5hbWUKCWwuVGFnbGluZSA9IHRhZ2xpbmUKCWwuRGVzY3IgPSBkZXNjcgoJbC5DYXRlZ29yeSA9IGNhdGVnb3J5CglsLkljb25DSUQgPSBpY29uQ0lECglsLlNjcmVlbnNob3RDSURzID0gc2hvdHMKCWwuQXBwVVJMID0gYXBwVVJMCglsLlJlamVjdFJlYXNvbiA9ICIiCglsLlJlc3VibWl0Q291bnQrKwoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzUGVuZGluZyB7CgkJY2hhbmdlU3RhdHVzKGwsIFN0YXR1c1BlbmRpbmcpIC8vIHJlamVjdGVkIOKGkiBwZW5kaW5nIChyZS1yZXZpZXcpOyBwZXJzaXN0cyB2aWEgU2V0Cgl9IGVsc2UgewoJCWxpc3RpbmdzLlNldChwa2dQYXRoLCBsKQoJfQoJY2hhaW4uRW1pdCgiQXBwRWRpdGVkIiwgInBrZ1BhdGgiLCBwa2dQYXRoKQp9CgovLyBEZWxpc3RBcHAgcmVtb3ZlcyBhIGxpc3RpbmcgZnJvbSBwdWJsaWMgdmlldy4gVGhlIHB1Ymxpc2hlciBvciBhIGN1cmF0b3IgbWF5IGRvIGl0LgpmdW5jIERlbGlzdEFwcChjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CglsIDo9IG11c3RHZXQocGtnUGF0aCkKCWlmIGNhbGxlcigpICE9IGwuUHVibGlzaGVyICYmICFpc0N1cmF0b3IoY2FsbGVyKCkpIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBwdWJsaXNoZXIgb3IgY3VyYXRvciBvbmx5IikKCX0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0RlbGlzdGVkIHsKCQljaGFuZ2VTdGF0dXMobCwgU3RhdHVzRGVsaXN0ZWQpCgl9CgljaGFpbi5FbWl0KCJBcHBEZWxpc3RlZCIsICJwa2dQYXRoIiwgcGtnUGF0aCkKfQoKLy8gUmVzdG9yZUFwcCBicmluZ3MgYSBkZWxpc3RlZCBhcHAgYmFjayB0byBgcGVuZGluZ2AgKHJlLWN1cmF0aW9uIHJlcXVpcmVkKS4gQ3VyYXRvci1vbmx5LgpmdW5jIFJlc3RvcmVBcHAoY3VyIHJlYWxtLCBwa2dQYXRoIHN0cmluZykgewoJaWYgIWlzQ3VyYXRvcihjYWxsZXIoKSkgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IGN1cmF0b3Igb25seSIpCgl9CglsIDo9IG11c3RHZXQocGtnUGF0aCkKCWlmIGwuU3RhdHVzICE9IFN0YXR1c0RlbGlzdGVkIHsKCQlwYW5pYygib25seSBhIGRlbGlzdGVkIGFwcCBjYW4gYmUgcmVzdG9yZWQiKQoJfQoJY2hhbmdlU3RhdHVzKGwsIFN0YXR1c1BlbmRpbmcpCgljaGFpbi5FbWl0KCJBcHBSZXN0b3JlZCIsICJwa2dQYXRoIiwgcGtnUGF0aCkKfQoKLy8gRmxhZ0FwcCBsZXRzIGFueSB1c2VyIGZsYWcgYSBwdWJsaWNseS1saXN0ZWQgKGxpdmUgT1IgcGVuZGluZykgbGlzdGluZyBvbmNlLiBBdAovLyBGbGFnSGlkZVRocmVzaG9sZCBkaXN0aW5jdCBmbGFncyB0aGUgbGlzdGluZyBkcm9wcyBmcm9tIHRoZSBwdWJsaWMgbGlzdHMgKGlzVmlzaWJsZSksIGdpdmluZwovLyB0aGUgcHVibGljIFVudmVyaWZpZWQvcGVuZGluZyB0YWIgYSBjb21tdW5pdHkgc2FmZXR5IHZhbHZlOyBhIGN1cmF0b3IgY2FuIHRoZW4gRGVsaXN0L1JlamVjdC4KZnVuYyBGbGFnQXBwKGN1ciByZWFsbSwgcGtnUGF0aCBzdHJpbmcpIHsKCWwgOj0gbXVzdEdldChwa2dQYXRoKQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzTGl2ZSAmJiBsLlN0YXR1cyAhPSBTdGF0dXNQZW5kaW5nIHsKCQlwYW5pYygiY2FuIG9ubHkgZmxhZyBhIGxpdmUgb3IgcGVuZGluZyBhcHAiKQoJfQoJa2V5IDo9IHBrZ1BhdGggKyAiXHgwMCIgKyBjYWxsZXIoKS5TdHJpbmcoKQoJaWYgXywgZG9uZSA6PSBmbGFnZ2VkQnkuR2V0KGtleSk7IGRvbmUgewoJCXBhbmljKCJhbHJlYWR5IGZsYWdnZWQiKQoJfQoJZmxhZ2dlZEJ5LlNldChrZXksIHRydWUpCglsLkZsYWdDb3VudCsrCglsaXN0aW5ncy5TZXQocGtnUGF0aCwgbCkKCWNoYWluLkVtaXQoIkFwcEZsYWdnZWQiLCAicGtnUGF0aCIsIHBrZ1BhdGgsICJjb3VudCIsIGl0b2EobC5GbGFnQ291bnQpKQp9CgovLyBNYXhDbGVhckJhdGNoIGJvdW5kcyBob3cgbWFueSBwZXItYWRkcmVzcyBmbGFnIG1hcmtzIG9uZSBDbGVhckZsYWdzIGNhbGwgcmVtb3ZlcywKLy8gc28gYSBtZWdhLWJyaWdhZGUgKHRob3VzYW5kcyBvZiBzeWJpbCBmbGFncykgY2Fubm90IGdhcy1sb2NrIHRoZSByZXNldCDigJQgdGhlCi8vIGN1cmF0b3IganVzdCBjYWxscyBDbGVhckZsYWdzIHJlcGVhdGVkbHkgdW50aWwgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KY29uc3QgTWF4Q2xlYXJCYXRjaCA9IDIwMAoKLy8gQ2xlYXJGbGFncyByZXNldHMgYSBsaXN0aW5nJ3MgY29tbXVuaXR5LWZsYWcgc3RhdGUgYWZ0ZXIgY3VyYXRvciByZXZpZXcuIEN1cmF0b3Itb25seS4KLy8gV2l0aG91dCBpdCBhIGZsYWctaGlkZGVuIGxpc3Rpbmcgc3RheXMgaGlkZGVuIEZPUkVWRVI6IEZsYWdDb3VudCBuZXZlciBkZWNyZW1lbnRzIGFuZAovLyBzdXJ2aXZlcyBldmVyeSBzdGF0dXMgdHJhbnNpdGlvbiwgc28gRmxhZ0hpZGVUaHJlc2hvbGQgKDUpIHN5YmlsIGFkZHJlc3NlcyBjb3VsZAovLyBwZXJtYW5lbnRseSBkaXNhcHBlYXIgYW55IGxpdmUgYXBwLiBDbGVhcmluZyBhbHNvIGRlbGV0ZXMgdGhlIHBlci1hZGRyZXNzIGRlZHVwZSBtYXJrcyDigJQKLy8gdGhlIGNvbW11bml0eSBjYW4gcmUtZmxhZyBpZiB0aGUgY29uY2VybiBpcyByZWFsLCBhbmQgZXZlcnkgY2xlYXIgaXMgYW4gZW1pdHRlZCBldmVudCwKLy8gc28gYSBjdXJhdG9yIHdoaXRld2FzaGluZyBhIGJhZCBsaXN0aW5nIGlzIHB1YmxpY2x5IHZpc2libGUgb24tY2hhaW4uCmZ1bmMgQ2xlYXJGbGFncyhjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CglpZiAhaXNDdXJhdG9yKGNhbGxlcigpKSB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogY3VyYXRvciBvbmx5IikKCX0KCWwgOj0gbXVzdEdldChwa2dQYXRoKQoJaWYgbC5GbGFnQ291bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGZsYWdzIHRvIGNsZWFyIikKCX0KCS8vIENvbGxlY3QgdXAgdG8gTWF4Q2xlYXJCYXRjaCBtYXJrcyBvdmVyIHRoZSBsaXN0aW5nJ3MgcHJlZml4IHJhbmdlICh0aGUgc2FtZQoJLy8gW3ByZWZpeCsiXHgwMCIsIHByZWZpeCsiXHgwMSIpIHdpbmRvdyBpZGlvbSBhcyByZWFkcy5nbm8pLCB0aGVuIHJlbW92ZSB0aGVtLgoJLy8gS2V5cyBhcmUgY29sbGVjdGVkIEJFRk9SRSByZW1vdmFsIOKAlCBuZXZlciBtdXRhdGUgYSB0cmVlIG1pZC1JdGVyYXRlLgoJdmFyIGtleXMgW11zdHJpbmcKCWZsYWdnZWRCeS5JdGVyYXRlKHBrZ1BhdGgrIlx4MDAiLCBwa2dQYXRoKyJceDAxIiwgZnVuYyhrIHN0cmluZywgXyBhbnkpIGJvb2wgewoJCWtleXMgPSBhcHBlbmQoa2V5cywgaykKCQlyZXR1cm4gbGVuKGtleXMpID49IE1heENsZWFyQmF0Y2gKCX0pCglmb3IgXywgayA6PSByYW5nZSBrZXlzIHsKCQlmbGFnZ2VkQnkuUmVtb3ZlKGspCgl9CglsLkZsYWdDb3VudCAtPSBsZW4oa2V5cykKCWlmIGwuRmxhZ0NvdW50IDwgMCB7CgkJbC5GbGFnQ291bnQgPSAwCgl9CglsaXN0aW5ncy5TZXQocGtnUGF0aCwgbCkKCWNoYWluLkVtaXQoIkFwcEZsYWdzQ2xlYXJlZCIsICJwa2dQYXRoIiwgcGtnUGF0aCwKCQkiY2xlYXJlZCIsIGl0b2EobGVuKGtleXMpKSwgInJlbWFpbmluZyIsIGl0b2EobC5GbGFnQ291bnQpKQp9CgovLyDilIDilIAgTWlncmF0aW9uIChvd25lci1vbmx5LCBzZWFsYWJsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBTZWVkTGlzdGluZyBpbXBvcnRzIGEgbGlzdGluZyB2ZXJiYXRpbSAoSWQsIENyZWF0ZWRBdCwgRmxhZ0NvdW50LCBTdGF0dXMsIFB1Ymxpc2hlcikgZHVyaW5nIGEKLy8gdjLihpJ2MyBtaWdyYXRpb24uIE93bmVyLW9ubHksIE5PTi1wYXlhYmxlIChuZXZlciByZWFkcyBPcmlnaW5TZW5kIC8gbW92ZXMgZnVuZHMpLCBkZWR1cGUtZ3VhcmRlZC4KLy8gQWZ0ZXIgdGhlIG1pZ3JhdGlvbiB0aGUgb3duZXIgY2FsbHMgRmluYWxpemVTZWVkLCBwZXJtYW5lbnRseSBzZWFsaW5nIHRoaXMgZW50cnlwb2ludCDigJQgd2l0aG91dAovLyB0aGF0IGxhdGNoIGl0IHdvdWxkIGJlIGEgc3RhbmRpbmcgYmFja2Rvb3IgdG8gZm9yZ2UgZmVlLWZyZWUgbGlzdGluZ3Mgd2l0aCBhcmJpdHJhcnkgcHVibGlzaGVyLgpmdW5jIFNlZWRMaXN0aW5nKAoJY3VyIHJlYWxtLAoJaWQgdWludDY0LAoJcGtnUGF0aCwgbmFtZSwgdGFnbGluZSwgZGVzY3IsIGNhdGVnb3J5LCBpY29uQ0lELCBzY3JlZW5zaG90c0NTViwgYXBwVVJMLCBwdWJsaXNoZXJTdHIsIHN0YXR1cyBzdHJpbmcsCglmbGFnQ291bnQgaW50LAoJY3JlYXRlZEF0IGludDY0LAopIHsKCWFzc2VydE93bmVyKCkKCWlmIHNlZWRpbmdTZWFsZWQgewoJCXBhbmljKCJzZWVkaW5nIHNlYWxlZCDigJQgbWlncmF0aW9uIGlzIGZpbmFsaXplZCIpCgl9Cglwa2dQYXRoID0gdmFsaWRhdGVQa2dQYXRoKHBrZ1BhdGgpCglpZiBfLCBkdXAgOj0gbGlzdGluZ3MuR2V0KHBrZ1BhdGgpOyBkdXAgewoJCXBhbmljKCJhcHAgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIHBhY2thZ2UgcGF0aCIpCgl9CglpZiAhdmFsaWRTdGF0dXMoc3RhdHVzKSB7CgkJcGFuaWMoImludmFsaWQgc3RhdHVzIikKCX0KCS8vIEEgZHVwbGljYXRlIGlkIHdvdWxkIGNvbGxpZGUgb24gdGhlIGNvbXBvc2l0ZSBpbmRleCBrZXkgKHN0YXR1c0tleS9wdWJLZXkpLCBzaWxlbnRseQoJLy8gb3ZlcndyaXRpbmcgb25lIGVudHJ5IHdoaWxlIGRvdWJsZS1jb3VudGluZyDigJQgc28gcmVqZWN0IGFuIGlkIGFscmVhZHkgcHJlc2VudCBpbiBBTlkgc3RhdHVzCgkvLyAoY292ZXJzIGJvdGggYSByZXBlYXQgc2VlZCBhbmQgYSBzZWVkZWQgaWQgdGhhdCBhIHByaW9yIFJlZ2lzdGVyQXBwIGFscmVhZHkgdXNlZCkuCglpZiBpZEluVXNlKGlkKSB7CgkJcGFuaWMoImlkIGFscmVhZHkgaW4gdXNlIikKCX0KCS8vIFNlZWRlZCBkYXRhIGlzIGhpc3RvcmljYWwgdXNlciBpbnB1dCDigJQgdmFsaWRhdGUgaXQgYWdhaW5zdCB0aGUgU0FNRSBmaWVsZCArIGFwcFVSTC1zY2hlbWUKCS8vIHJ1bGVzIGFzIGEgZnJlc2ggcmVnaXN0cmF0aW9uLCBzbyBhbiB1bnNhZmUgdjIgYXBwVVJMIGNhbid0IGJlIGltcG9ydGVkIHBhc3QgdGhlIGFsbG93bGlzdC4KCXZhbGlkYXRlTGlzdGluZ0ZpZWxkcyhuYW1lLCB0YWdsaW5lLCBkZXNjciwgY2F0ZWdvcnksIGljb25DSUQsIGFwcFVSTCkKCXNob3RzIDo9IHBhcnNlU2NyZWVuc2hvdHMoc2NyZWVuc2hvdHNDU1YpCglsIDo9ICZMaXN0aW5newoJCUlkOiAgICAgICAgICAgICBpZCwKCQlQa2dQYXRoOiAgICAgICAgcGtnUGF0aCwKCQlOYW1lOiAgICAgICAgICAgbmFtZSwKCQlUYWdsaW5lOiAgICAgICAgdGFnbGluZSwKCQlEZXNjcjogICAgICAgICAgZGVzY3IsCgkJQ2F0ZWdvcnk6ICAgICAgIGNhdGVnb3J5LAoJCUljb25DSUQ6ICAgICAgICBpY29uQ0lELAoJCVNjcmVlbnNob3RDSURzOiBzaG90cywKCQlBcHBVUkw6ICAgICAgICAgYXBwVVJMLAoJCVB1Ymxpc2hlcjogICAgICBhZGRyZXNzKHB1Ymxpc2hlclN0ciksCgkJU3RhdHVzOiAgICAgICAgIHN0YXR1cywKCQlGbGFnQ291bnQ6ICAgICAgZmxhZ0NvdW50LAoJCUNyZWF0ZWRBdDogICAgICBjcmVhdGVkQXQsCgl9CglsaXN0aW5ncy5TZXQocGtnUGF0aCwgbCkKCWluZGV4SW5zZXJ0KGwpCglpZiBpZCA+PSBuZXh0SWQgewoJCW5leHRJZCA9IGlkICsgMQoJfQoJY2hhaW4uRW1pdCgiQXBwU2VlZGVkIiwgInBrZ1BhdGgiLCBwa2dQYXRoLCAiaWQiLCBpdG9hNjQoaWQpKQp9CgovLyBGaW5hbGl6ZVNlZWQgcGVybWFuZW50bHkgc2VhbHMgU2VlZExpc3RpbmcgKG9uZS13YXkgbGF0Y2gpLiBPd25lci1vbmx5LgpmdW5jIEZpbmFsaXplU2VlZChjdXIgcmVhbG0pIHsKCWFzc2VydE93bmVyKCkKCXNlZWRpbmdTZWFsZWQgPSB0cnVlCgljaGFpbi5FbWl0KCJTZWVkaW5nRmluYWxpemVkIikKfQoKLy8g4pSA4pSAIFJlYWQgZ2V0dGVycyAocHVyZSwgbm9uLWZhaWxpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gR2V0UmVnaXN0cmF0aW9uRmVlIHJldHVybnMgdGhlIGN1cnJlbnQgZmxhdCBsaXN0aW5nIGZlZSBpbiB1Z25vdC4KZnVuYyBHZXRSZWdpc3RyYXRpb25GZWUoKSBpbnQ2NCB7IHJldHVybiByZWdpc3RyYXRpb25GZWUgfQoKLy8gR2V0VHJlYXN1cnkgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IHJlY2VpdmVzIGxpc3RpbmcgZmVlcy4KZnVuYyBHZXRUcmVhc3VyeSgpIGFkZHJlc3MgeyByZXR1cm4gdHJlYXN1cnkgfQoKLy8gR2V0T3duZXIgcmV0dXJucyB0aGUgY3VycmVudCBvd25lciAobXVsdGlzaWcsIG9yIGEgREFPIGV4ZWN1dG9yIGFmdGVyIGhhbmRvZmYpLgpmdW5jIEdldE93bmVyKCkgYWRkcmVzcyB7IHJldHVybiBvd25lciB9CgovLyBBcHBDb3VudCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVnaXN0ZXJlZCBsaXN0aW5ncyAoYW55IHN0YXR1cykuCmZ1bmMgQXBwQ291bnQoKSBpbnQgeyByZXR1cm4gbGlzdGluZ3MuU2l6ZSgpIH0KCi8vIElzQ3VyYXRvciByZXBvcnRzIHdoZXRoZXIgYW4gYWRkcmVzcyBtYXkgYXBwcm92ZS9yZWplY3QgbGlzdGluZ3MgKHRoZSBjdXJhdG9yLWRhc2hib2FyZCBnYXRlKS4KZnVuYyBJc0N1cmF0b3IoYSBzdHJpbmcpIGJvb2wgewoJXywgb2sgOj0gY3VyYXRvcnMuR2V0KGEpCglyZXR1cm4gb2sKfQoKLy8gR2V0Q3VyYXRvcnNKU09OIHJldHVybnMgYSBKU09OIGFycmF5IG9mIGN1cmF0b3IgYWRkcmVzc2VzIChzbWFsbCwgYm91bmRlZCkuCmZ1bmMgR2V0Q3VyYXRvcnNKU09OKCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCJbIikKCWZpcnN0IDo9IHRydWUKCWN1cmF0b3JzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGsgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJaWYgIWZpcnN0IHsKCQkJc2IuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQlmaXJzdCA9IGZhbHNlCgkJc2IuV3JpdGVTdHJpbmcoYCJgKQoJCXNiLldyaXRlU3RyaW5nKGspIC8vIGEgYmVjaDMyIGFkZHJlc3Mg4oCUIG5vIEpTT04gbWV0YWNoYXJzCgkJc2IuV3JpdGVTdHJpbmcoYCJgKQoJCXJldHVybiBmYWxzZQoJfSkKCXNiLldyaXRlU3RyaW5nKCJdIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBHZXRTdGF0c0pTT04gcmV0dXJucyBwZXItc3RhdHVzIGNvdW50cyAoc2VydmVkIGZyb20gTygxKSBjb3VudGVycykgZm9yIHRoZSBzdG9yZSBoZWFkZXIuCmZ1bmMgR2V0U3RhdHNKU09OKCkgc3RyaW5nIHsKCXJldHVybiB1Zm10LlNwcmludGYoCgkJYHsidG90YWwiOiVkLCJsaXZlIjolZCwicGVuZGluZyI6JWQsInJlamVjdGVkIjolZCwiZGVsaXN0ZWQiOiVkLCJyZWdpc3RyYXRpb25GZWUiOiVkLCJwYXVzZWQiOiV0fWAsCgkJbGlzdGluZ3MuU2l6ZSgpLCBsaXZlQ291bnQsIHBlbmRpbmdDb3VudCwgcmVqZWN0ZWRDb3VudCwgZGVsaXN0ZWRDb3VudCwgcmVnaXN0cmF0aW9uRmVlLCBwYXVzZWQpCn0KCi8vIOKUgOKUgCBpbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuYyBpc0N1cmF0b3IoYSBhZGRyZXNzKSBib29sIHsKCV8sIG9rIDo9IGN1cmF0b3JzLkdldChhLlN0cmluZygpKQoJcmV0dXJuIG9rCn0KCmZ1bmMgbXVzdEdldChwa2dQYXRoIHN0cmluZykgKkxpc3RpbmcgewoJdiwgb2sgOj0gbGlzdGluZ3MuR2V0KHBrZ1BhdGgpCglpZiAhb2sgewoJCXBhbmljKCJhcHAgbm90IGZvdW5kOiAiICsgcGtnUGF0aCkKCX0KCXJldHVybiB2LigqTGlzdGluZykKfQoKZnVuYyB2YWxpZFN0YXR1cyhzIHN0cmluZykgYm9vbCB7CglyZXR1cm4gcyA9PSBTdGF0dXNQZW5kaW5nIHx8IHMgPT0gU3RhdHVzTGl2ZSB8fCBzID09IFN0YXR1c1JlamVjdGVkIHx8IHMgPT0gU3RhdHVzRGVsaXN0ZWQKfQoKLy8gdmFsaWRhdGVMaXN0aW5nRmllbGRzIGNoZWNrcyB0aGUgbGVuZ3RoICsgYXBwVVJMLXNjaGVtZSBpbnZhcmlhbnRzIHNoYXJlZCBieSBSZWdpc3RlckFwcCBhbmQKLy8gRWRpdExpc3RpbmcuIFRoZSBhcHBVUkwgc2NoZW1lIGFsbG93bGlzdCAoaHR0cC9odHRwcy9sZWFkaW5nLXNsYXNoL2VtcHR5KSBpcyB0aGUgb24tY2hhaW4KLy8gZGVmZW5zZSBiZWhpbmQgdGhlIGZyb250ZW5kIEFwcExpbmsg4oCUIGl0IGJsb2NrcyBqYXZhc2NyaXB0Oi9kYXRhOi9vdGhlci1zY2hlbWUgcGhpc2hpbmcgVVJMcy4KZnVuYyB2YWxpZGF0ZUxpc3RpbmdGaWVsZHMobmFtZSwgdGFnbGluZSwgZGVzY3IsIGNhdGVnb3J5LCBpY29uQ0lELCBhcHBVUkwgc3RyaW5nKSB7CglpZiBsZW4obmFtZSkgPT0gMCB8fCBsZW4obmFtZSkgPiBNYXhOYW1lTGVuIHsKCQlwYW5pYygibmFtZSBtdXN0IGJlIDEuLiIgKyBpdG9hKE1heE5hbWVMZW4pICsgIiBjaGFycyIpCgl9CglpZiBsZW4odGFnbGluZSkgPiBNYXhUYWdsaW5lTGVuIHsKCQlwYW5pYygidGFnbGluZSB0b28gbG9uZyIpCgl9CglpZiBsZW4oZGVzY3IpID4gTWF4RGVzY3JMZW4gewoJCXBhbmljKCJkZXNjcmlwdGlvbiB0b28gbG9uZyIpCgl9CglpZiBsZW4oY2F0ZWdvcnkpID4gTWF4Q2F0ZWdvcnlMZW4gewoJCXBhbmljKCJjYXRlZ29yeSB0b28gbG9uZyIpCgl9CglpZiBsZW4oaWNvbkNJRCkgPiBNYXhDSURMZW4gewoJCXBhbmljKCJpY29uQ0lEIHRvbyBsb25nIikKCX0KCWlmIGxlbihhcHBVUkwpID4gTWF4VVJMTGVuIHsKCQlwYW5pYygiYXBwVVJMIHRvbyBsb25nIikKCX0KCXZhbGlkYXRlQXBwVVJMKGFwcFVSTCkKfQoKLy8gdmFsaWRhdGVBcHBVUkwgZW5mb3JjZXMgdGhlIHNjaGVtZSBhbGxvd2xpc3Q6IGVtcHR5LCBodHRwOi8vLCBodHRwczovLywgb3IgYSBsZWFkaW5nLXNsYXNoCi8vIGluLWFwcCBwYXRoLiBBbnl0aGluZyBlbHNlIChqYXZhc2NyaXB0OiwgZGF0YTosIGZ0cDosIG1haWx0bzosIOKApikgYWJvcnRzLiBBIGxlYWRpbmctc2xhc2ggcGF0aAovLyBtdXN0IE5PVCBiZSBwcm90b2NvbC1yZWxhdGl2ZSAoYC8vaG9zdGAgb3IgYC9caG9zdGApIOKAlCBicm93c2VycyBuYXZpZ2F0ZSB0aG9zZSBvZmYtc2l0ZSwgd2hpY2gKLy8gd291bGQgZGVmZWF0IHRoZSBhbGxvd2xpc3QuCmZ1bmMgdmFsaWRhdGVBcHBVUkwodSBzdHJpbmcpIHsKCWlmIHUgPT0gIiIgewoJCXJldHVybgoJfQoJaWYgaGFzUHJlZml4KHUsICJodHRwOi8vIikgfHwgaGFzUHJlZml4KHUsICJodHRwczovLyIpIHsKCQlyZXR1cm4KCX0KCWlmIHVbMF0gPT0gJy8nIHsKCQlpZiBsZW4odSkgPiAxICYmICh1WzFdID09ICcvJyB8fCB1WzFdID09ICdcXCcpIHsKCQkJcGFuaWMoImFwcFVSTCBzY2hlbWU6IHByb3RvY29sLXJlbGF0aXZlIC8vaG9zdCBpcyBub3QgYW4gaW4tYXBwIHBhdGgiKQoJCX0KCQlyZXR1cm4KCX0KCXBhbmljKCJhcHBVUkwgc2NoZW1lIG11c3QgYmUgaHR0cChzKTovLyBvciBhIGxlYWRpbmctc2xhc2ggcGF0aCIpCn0KCi8vIHBhcnNlU2NyZWVuc2hvdHMgc3BsaXRzIGEgY29tbWEtc2VwYXJhdGVkIENJRCBsaXN0LCBlbmZvcmNpbmcg4omkTWF4U2NyZWVuc2hvdHMgYW5kIHBlci1DSUQKLy8gbGVuZ3RoLiBCbGFuayBlbnRyaWVzIGFyZSBkcm9wcGVkLiBFbXB0eSBpbnB1dCDihpIgbmlsLgpmdW5jIHBhcnNlU2NyZWVuc2hvdHMoY3N2IHN0cmluZykgW11zdHJpbmcgewoJaWYgY3N2ID09ICIiIHsKCQlyZXR1cm4gbmlsCgl9CglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KGNzdiwgIiwiKQoJaWYgbGVuKHBhcnRzKSA+IE1heFNjcmVlbnNob3RzIHsKCQlwYW5pYygidG9vIG1hbnkgc2NyZWVuc2hvdHMgKG1heCAiICsgaXRvYShNYXhTY3JlZW5zaG90cykgKyAiKSIpCgl9CglvdXQgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHBhcnRzKSkKCWZvciBfLCBwIDo9IHJhbmdlIHBhcnRzIHsKCQlwID0gc3RyaW5ncy5UcmltU3BhY2UocCkKCQlpZiBwID09ICIiIHsKCQkJY29udGludWUKCQl9CgkJaWYgbGVuKHApID4gTWF4Q0lETGVuIHsKCQkJcGFuaWMoInNjcmVlbnNob3QgQ0lEIHRvbyBsb25nIikKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgcCkKCX0KCXJldHVybiBvdXQKfQoKLy8g4pSA4pSAIGluZGV4ICsgY291bnRlciBtYWludGVuYW5jZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmZ1bmMgc3RhdHVzS2V5KHN0YXR1cyBzdHJpbmcsIGlkIHVpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0YXR1cyArICJceDAwIiArIHplcm9QYWQoaWQpIH0KCmZ1bmMgcHViS2V5KHB1YiBhZGRyZXNzLCBpZCB1aW50NjQpIHN0cmluZyB7IHJldHVybiBwdWIuU3RyaW5nKCkgKyAiXHgwMCIgKyB6ZXJvUGFkKGlkKSB9CgovLyBpZEluVXNlIHJlcG9ydHMgd2hldGhlciBgaWRgIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3RhdHVzIGluZGV4IHVuZGVyIEFOWSBzdGF0dXMgKGV2ZXJ5Ci8vIGxpc3Rpbmcg4oCUIHJlZ2lzdGVyZWQgb3Igc2VlZGVkIOKAlCBpcyBpbiBleGFjdGx5IG9uZSBzdGF0dXNJbmRleCBlbnRyeSkuIFVzZWQgdG8gcmVqZWN0IGEKLy8gZHVwbGljYXRlIFNlZWRMaXN0aW5nIGlkIGJlZm9yZSBpdCBzaWxlbnRseSBjb2xsaWRlcyBvbiB0aGUgY29tcG9zaXRlIGtleS4KZnVuYyBpZEluVXNlKGlkIHVpbnQ2NCkgYm9vbCB7Cglmb3IgXywgcyA6PSByYW5nZSBbXXN0cmluZ3tTdGF0dXNQZW5kaW5nLCBTdGF0dXNMaXZlLCBTdGF0dXNSZWplY3RlZCwgU3RhdHVzRGVsaXN0ZWR9IHsKCQlpZiBfLCBvayA6PSBzdGF0dXNJbmRleC5HZXQoc3RhdHVzS2V5KHMsIGlkKSk7IG9rIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gemVyb1BhZCByZW5kZXJzIGlkIGFzIGEgZml4ZWQtd2lkdGggMjAtZGlnaXQgc3RyaW5nIHNvIGxleGljYWwgYXZsIG9yZGVyID09IG51bWVyaWMgb3JkZXIuCmZ1bmMgemVyb1BhZChpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IGl0b2E2NChpZCkKCWZvciBsZW4ocykgPCAyMCB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgYWRqdXN0Q291bnRlcihzdGF0dXMgc3RyaW5nLCBkIGludCkgewoJc3dpdGNoIHN0YXR1cyB7CgljYXNlIFN0YXR1c0xpdmU6CgkJbGl2ZUNvdW50ICs9IGQKCWNhc2UgU3RhdHVzUGVuZGluZzoKCQlwZW5kaW5nQ291bnQgKz0gZAoJY2FzZSBTdGF0dXNSZWplY3RlZDoKCQlyZWplY3RlZENvdW50ICs9IGQKCWNhc2UgU3RhdHVzRGVsaXN0ZWQ6CgkJZGVsaXN0ZWRDb3VudCArPSBkCgl9Cn0KCi8vIGluZGV4SW5zZXJ0IGFkZHMgYSBicmFuZC1uZXcgbGlzdGluZyB0byB0aGUgc3RhdHVzICsgcHVibGlzaGVyIGluZGV4ZXMgYW5kIGJ1bXBzIGl0cyBzdGF0dXMKLy8gY291bnRlci4gKHB1Ymxpc2hlckluZGV4IG5ldmVyIGNoYW5nZXMgYWZ0ZXJ3YXJkIOKAlCBQdWJsaXNoZXIgKyBJZCBhcmUgaW1tdXRhYmxlLikKZnVuYyBpbmRleEluc2VydChsICpMaXN0aW5nKSB7CglzdGF0dXNJbmRleC5TZXQoc3RhdHVzS2V5KGwuU3RhdHVzLCBsLklkKSwgbC5Qa2dQYXRoKQoJcHVibGlzaGVySW5kZXguU2V0KHB1YktleShsLlB1Ymxpc2hlciwgbC5JZCksIGwuUGtnUGF0aCkKCWFkanVzdENvdW50ZXIobC5TdGF0dXMsIDEpCn0KCi8vIGNoYW5nZVN0YXR1cyBtb3ZlcyBhIGxpc3RpbmcgYmV0d2VlbiBzdGF0dXNlcywga2VlcGluZyBzdGF0dXNJbmRleCArIGNvdW50ZXJzIGV4YWN0LCBhbmQKLy8gcGVyc2lzdHMgdGhlIGxpc3RpbmcuIEV2ZXJ5IHN0YXR1cyB0cmFuc2l0aW9uIE1VU1QgZ28gdGhyb3VnaCBoZXJlLgpmdW5jIGNoYW5nZVN0YXR1cyhsICpMaXN0aW5nLCBuZXdTdGF0dXMgc3RyaW5nKSB7CglzdGF0dXNJbmRleC5SZW1vdmUoc3RhdHVzS2V5KGwuU3RhdHVzLCBsLklkKSkKCWFkanVzdENvdW50ZXIobC5TdGF0dXMsIC0xKQoJbC5TdGF0dXMgPSBuZXdTdGF0dXMKCXN0YXR1c0luZGV4LlNldChzdGF0dXNLZXkobmV3U3RhdHVzLCBsLklkKSwgbC5Qa2dQYXRoKQoJYWRqdXN0Q291bnRlcihuZXdTdGF0dXMsIDEpCglsaXN0aW5ncy5TZXQobC5Qa2dQYXRoLCBsKQp9CgovLyB2YWxpZGF0ZVBrZ1BhdGggbm9ybWFsaXplcyArIHNhbml0eS1jaGVja3MgYSByZWFsbS9wYWNrYWdlIHBhdGguCmZ1bmMgdmFsaWRhdGVQa2dQYXRoKHAgc3RyaW5nKSBzdHJpbmcgewoJaWYgbGVuKHApID09IDAgfHwgbGVuKHApID4gTWF4UGtnUGF0aExlbiB7CgkJcGFuaWMoInBrZ1BhdGggbXVzdCBiZSAxLi4iICsgaXRvYShNYXhQa2dQYXRoTGVuKSArICIgY2hhcnMiKQoJfQoJLy8gUmVqZWN0IGNvbnRyb2wgYW5kIHNwYWNlIGJ5dGVzOiBjb21wb3NpdGUgYXZsIGtleXMgc2VwYXJhdGUgb24gIlx4MDAiIGFuZAoJLy8gQ2xlYXJGbGFncyByYW5nZS1pdGVyYXRlcyB0aGUgcGtnUGF0aCBwcmVmaXggKFtwKyJceDAwIiwgcCsiXHgwMSIpKSwgc28gYW4KCS8vIGVtYmVkZGVkIGNvbnRyb2wgYnl0ZSBjb3VsZCBibGVlZCBvbmUgbGlzdGluZydzIGtleSByYW5nZSBpbnRvIGFub3RoZXIncy4KCS8vIEFwcGxpZXMgdG8gUmVnaXN0ZXJBcHAsIEVkaXRMaXN0aW5nICh2aWEgbXVzdEdldCBrZXkgdXNlKSBBTkQgU2VlZExpc3Rpbmcg4oCUCgkvLyBhIG1pZ3JhdGlvbiBtdXN0IG5vdCBpbXBvcnQgc3VjaCBhIHBhdGggZWl0aGVyLgoJZm9yIGkgOj0gMDsgaSA8IGxlbihwKTsgaSsrIHsKCQlpZiBwW2ldIDw9IDB4MjAgfHwgcFtpXSA9PSAweDdmIHsKCQkJcGFuaWMoInBrZ1BhdGggY29udGFpbnMgY29udHJvbCBvciBzcGFjZSBjaGFyYWN0ZXJzIikKCQl9Cgl9CglpZiAhaGFzUHJlZml4KHAsICJnbm8ubGFuZC9yLyIpICYmICFoYXNQcmVmaXgocCwgImduby5sYW5kL3AvIikgewoJCXBhbmljKCJwa2dQYXRoIG11c3QgYmUgYSBnbm8ubGFuZC9yLy4uLiBvciBnbm8ubGFuZC9wLy4uLiBwYXRoIikKCX0KCXJldHVybiBwCn0KCmZ1bmMgaGFzUHJlZml4KHMsIHByZSBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIGxlbihzKSA+PSBsZW4ocHJlKSAmJiBzWzpsZW4ocHJlKV0gPT0gcHJlCn0KCmZ1bmMgaXRvYShuIGludCkgc3RyaW5nICAgICAgeyByZXR1cm4gdWZtdC5TcHJpbnRmKCIlZCIsIG4pIH0KZnVuYyBpdG9hNjQobiB1aW50NjQpIHN0cmluZyB7IHJldHVybiB1Zm10LlNwcmludGYoIiVkIiwgbikgfQoaSwoLZ25vbW9kLnRvbWwSPG1vZHVsZSA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYXBwc3RvcmVfdjMiCmdubyA9ICIwLjkiChqKCwoUZ292ZXJuYW5jZV9yZWFkcy5nbm8S8QpwYWNrYWdlIG1lbWJhX2FwcHN0b3JlX3YzCgppbXBvcnQgKAoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmluZ3MiCikKCmZ1bmMgSXNQYXVzZWQoKSBib29sICAgICAgICB7IHJldHVybiBwYXVzZWQgfQpmdW5jIElzU2VlZGluZ1NlYWxlZCgpIGJvb2wgeyByZXR1cm4gc2VlZGluZ1NlYWxlZCB9CgovLyBTY2FsYXJzIG9ubHk6IG5vIHBlcnNpc3RlbnQgTGlzdGluZyBwb2ludGVyIG9yIHNjcmVlbnNob3Qgc2xpY2UgZXNjYXBlcy4KdHlwZSBHb3Zlcm5hbmNlTGlzdGluZyBzdHJ1Y3QgewoJRXhpc3RzICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCUNvbnRlbnRIYXNoLCBTdGF0dXMsIFJlYXNvbiBzdHJpbmcKCUNyZWRpdCAgICAgICAgICAgICAgICAgICAgICBib29sCglGbGFncyAgICAgICAgICAgICAgICAgICAgICAgaW50CglDbGVhcktleXMgICAgICAgICAgICAgICAgICAgc3RyaW5nCn0KCmZ1bmMgR2V0R292ZXJuYW5jZUxpc3RpbmcocGtnUGF0aCBzdHJpbmcsIGNsZWFyQmF0Y2ggYm9vbCkgR292ZXJuYW5jZUxpc3RpbmcgewoJdiwgb2sgOj0gbGlzdGluZ3MuR2V0KHBrZ1BhdGgpCglpZiAhb2sgewoJCXJldHVybiBHb3Zlcm5hbmNlTGlzdGluZ3t9Cgl9CglsIDo9IHYuKCpMaXN0aW5nKQoJc25hcHNob3QgOj0gKmwKCXNuYXBzaG90LlN0YXR1cyA9ICIiCglzbmFwc2hvdC5SZWplY3RSZWFzb24gPSAiIgoJc25hcHNob3QuUGFpZFJlc3VibWl0Q3JlZGl0ID0gZmFsc2UKCXNuYXBzaG90LkZsYWdDb3VudCA9IDAKCWRpZ2VzdCA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShsaXN0aW5nSlNPTigmc25hcHNob3QsIHRydWUpKSkKCXMgOj0gR292ZXJuYW5jZUxpc3Rpbmd7RXhpc3RzOiB0cnVlLCBDb250ZW50SGFzaDogaGV4LkVuY29kZVRvU3RyaW5nKGRpZ2VzdFs6XSksIFN0YXR1czogbC5TdGF0dXMsIFJlYXNvbjogbC5SZWplY3RSZWFzb24sIENyZWRpdDogbC5QYWlkUmVzdWJtaXRDcmVkaXQsIEZsYWdzOiBsLkZsYWdDb3VudH0KCWlmIGNsZWFyQmF0Y2ggewoJCWtleXMgOj0gW11zdHJpbmd7fQoJCWZsYWdnZWRCeS5JdGVyYXRlKHBrZ1BhdGgrIlx4MDAiLCBwa2dQYXRoKyJceDAxIiwgZnVuYyhrIHN0cmluZywgXyBhbnkpIGJvb2wgewoJCQlrZXlzID0gYXBwZW5kKGtleXMsIHN0cmluZ3MuVHJpbVByZWZpeChrLCBwa2dQYXRoKyJceDAwIikpCgkJCXJldHVybiBsZW4oa2V5cykgPj0gTWF4Q2xlYXJCYXRjaAoJCX0pCgkJcy5DbGVhcktleXMgPSBzdHJpbmdzLkpvaW4oa2V5cywgIiwiKQoJfQoJcmV0dXJuIHMKfQpmdW5jIEhhc0dvdmVybmFuY2VGbGFnKHBrZ1BhdGgsIHdobyBzdHJpbmcpIGJvb2wgewoJXywgb2sgOj0gZmxhZ2dlZEJ5LkdldChwa2dQYXRoICsgIlx4MDAiICsgd2hvKQoJcmV0dXJuIG9rCn0KGukmCglyZWFkcy5nbm8S2yZwYWNrYWdlIG1lbWJhX2FwcHN0b3JlX3YzCgppbXBvcnQgKAoJInN0cmluZ3MiCgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCAoCglEZWZhdWx0UGFnZVNpemUgPSAyMCAgLy8gZGVmYXVsdCBKU09OIHdpbmRvdwoJTWF4UGFnZUxpbWl0ICAgID0gMTAwIC8vIGhhcmQgY2FwIG9uIGFueSBKU09OIHJlYWQgd2luZG93IChyZWFkLURvUyBndWFyZCkKKQoKZnVuYyBjbGFtcExpbWl0KGxpbWl0IGludCkgaW50IHsKCWlmIGxpbWl0IDw9IDAgewoJCXJldHVybiBEZWZhdWx0UGFnZVNpemUKCX0KCWlmIGxpbWl0ID4gTWF4UGFnZUxpbWl0IHsKCQlyZXR1cm4gTWF4UGFnZUxpbWl0Cgl9CglyZXR1cm4gbGltaXQKfQoKLy8ganNvbkVzY2FwZSBlc2NhcGVzIGEgc3RyaW5nIGZvciBlbWJlZGRpbmcgaW4gYSBKU09OIHN0cmluZyBsaXRlcmFsIOKAlCBldmVyeSBsaXN0aW5nIHRleHQgZmllbGQKLy8gaXMgYXR0YWNrZXItc3VwcGxpZWQsIHNvIHRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgYmV0d2VlbiBhIG1hbGljaW91cyBuYW1lL3RhZ2xpbmUvcmVhc29uL0NJRCBhbmQKLy8gYSBicm9rZW4vaW5qZWN0ZWQgSlNPTiBwYXlsb2FkIG9uIHRoZSByZWFkIHBhdGguCmZ1bmMganNvbkVzY2FwZShzIHN0cmluZykgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBfLCByIDo9IHJhbmdlIHMgewoJCXN3aXRjaCByIHsKCQljYXNlICciJzoKCQkJc2IuV3JpdGVTdHJpbmcoIlxcXCIiKQoJCWNhc2UgJ1xcJzoKCQkJc2IuV3JpdGVTdHJpbmcoIlxcXFwiKQoJCWNhc2UgJ1xuJzoKCQkJc2IuV3JpdGVTdHJpbmcoIlxcbiIpCgkJY2FzZSAnXHInOgoJCQlzYi5Xcml0ZVN0cmluZygiXFxyIikKCQljYXNlICdcdCc6CgkJCXNiLldyaXRlU3RyaW5nKCJcXHQiKQoJCWRlZmF1bHQ6CgkJCWlmIHIgPCAweDIwIHsKCQkJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiXFx1JTA0eCIsIHIpKQoJCQl9IGVsc2UgewoJCQkJc2IuV3JpdGVTdHJpbmcoc3RyaW5nKHIpKQoJCQl9CgkJfQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIHNjcmVlbnNob3RzSlNPTiByZW5kZXJzIGEgQ0lEIHNsaWNlIGFzIGEgSlNPTiBzdHJpbmcgYXJyYXkgYm9keSAoZWFjaCBlbGVtZW50IGVzY2FwZWQpLgpmdW5jIHNjcmVlbnNob3RzSlNPTihjaWRzIFtdc3RyaW5nKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIGksIGMgOj0gcmFuZ2UgY2lkcyB7CgkJaWYgaSA+IDAgewoJCQlzYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCXNiLldyaXRlU3RyaW5nKGAiYCkKCQlzYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKGMpKQoJCXNiLldyaXRlU3RyaW5nKGAiYCkKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBsaXN0aW5nSlNPTiByZW5kZXJzIG9uZSBsaXN0aW5nLiBgZnVsbGAgYWRkcyB0aGUgKGxhcmdlKSBkZXNjcmlwdGlvbiArIHRoZSBzY3JlZW5zaG90IGdhbGxlcnkg4oCUCi8vIG9taXR0ZWQgZnJvbSBsaXN0IHdpbmRvd3Mgc28gYSBib3VuZGVkIHBhZ2Ugc3RheXMgc21hbGwuIHJlamVjdFJlYXNvbiBpcyBzaG9ydCBhbmQgYWx3YXlzCi8vIGluY2x1ZGVkICh0aGUgTXktU3VibWlzc2lvbnMgdmlldyBuZWVkcyBpdCBpbiBsaXN0IHdpbmRvd3MpLgpmdW5jIGxpc3RpbmdKU09OKGwgKkxpc3RpbmcsIGZ1bGwgYm9vbCkgc3RyaW5nIHsKCWV4dHJhIDo9ICIiCglpZiBmdWxsIHsKCQlleHRyYSA9IHVmbXQuU3ByaW50ZihgLCJkZXNjciI6IiVzIiwic2NyZWVuc2hvdENJRHMiOlslc11gLAoJCQlqc29uRXNjYXBlKGwuRGVzY3IpLCBzY3JlZW5zaG90c0pTT04obC5TY3JlZW5zaG90Q0lEcykpCgl9CglyZXR1cm4gdWZtdC5TcHJpbnRmKAoJCWB7ImlkIjolZCwicGtnUGF0aCI6IiVzIiwibmFtZSI6IiVzIiwidGFnbGluZSI6IiVzIiwiY2F0ZWdvcnkiOiIlcyIsImljb25DSUQiOiIlcyIsImFwcFVSTCI6IiVzIiwicHVibGlzaGVyIjoiJXMiLCJzdGF0dXMiOiIlcyIsInJlamVjdFJlYXNvbiI6IiVzIiwicGFpZFJlc3VibWl0Q3JlZGl0IjoldCwicmVzdWJtaXRDb3VudCI6JWQsImZsYWdDb3VudCI6JWQsImNyZWF0ZWRBdCI6JWQlc31gLAoJCWwuSWQsCgkJanNvbkVzY2FwZShsLlBrZ1BhdGgpLAoJCWpzb25Fc2NhcGUobC5OYW1lKSwKCQlqc29uRXNjYXBlKGwuVGFnbGluZSksCgkJanNvbkVzY2FwZShsLkNhdGVnb3J5KSwKCQlqc29uRXNjYXBlKGwuSWNvbkNJRCksCgkJanNvbkVzY2FwZShsLkFwcFVSTCksCgkJbC5QdWJsaXNoZXIuU3RyaW5nKCksCgkJbC5TdGF0dXMsCgkJanNvbkVzY2FwZShsLlJlamVjdFJlYXNvbiksCgkJbC5QYWlkUmVzdWJtaXRDcmVkaXQsCgkJbC5SZXN1Ym1pdENvdW50LAoJCWwuRmxhZ0NvdW50LAoJCWwuQ3JlYXRlZEF0LAoJCWV4dHJhLAoJKQp9CgovLyB3aW5kb3dCeVByZWZpeCBpdGVyYXRlcyBhIGNvbXBvc2l0ZS1rZXkgaW5kZXggKHN0YXR1c0luZGV4IG9yIHB1Ymxpc2hlckluZGV4KSBvdmVyIHRoZSBwcmVmaXgKLy8gcmFuZ2UgW3ByZWZpeCsiXHgwMCIsIHByZWZpeCsiXHgwMSIpIOKAlCBhIHRydWUgTyhvZmZzZXQrbGltaXQpIHdpbmRvdyBvcmRlcmVkIGJ5IHplcm8tcGFkZGVkIGlkLgovLyBXaGVuIGZsYWdGaWx0ZXIgaXMgc2V0LCBmbGFnLWhpZGRlbiBsaXN0aW5ncyBhcmUgZXhjbHVkZWQgKHRoZSBwdWJsaWMgbGl2ZS9wZW5kaW5nIGxpc3RzKS4KZnVuYyB3aW5kb3dCeVByZWZpeChpbmRleCAqYXZsLlRyZWUsIHByZWZpeCBzdHJpbmcsIG9mZnNldCwgbGltaXQgaW50LCBmbGFnRmlsdGVyIGJvb2wpIHN0cmluZyB7CglsaW1pdCA9IGNsYW1wTGltaXQobGltaXQpCglpZiBvZmZzZXQgPCAwIHsKCQlvZmZzZXQgPSAwCgl9Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiWyIpCglza2lwcGVkLCB0YWtlbiA6PSAwLCAwCglmaXJzdCA6PSB0cnVlCglpbmRleC5JdGVyYXRlKHByZWZpeCsiXHgwMCIsIHByZWZpeCsiXHgwMSIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlsdiwgb2sgOj0gbGlzdGluZ3MuR2V0KHYuKHN0cmluZykpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWwgOj0gbHYuKCpMaXN0aW5nKQoJCWlmIGZsYWdGaWx0ZXIgJiYgbC5GbGFnQ291bnQgPj0gRmxhZ0hpZGVUaHJlc2hvbGQgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJaWYgc2tpcHBlZCA8IG9mZnNldCB7CgkJCXNraXBwZWQrKwoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJaWYgdGFrZW4gPj0gbGltaXQgewoJCQlyZXR1cm4gdHJ1ZSAvLyB3aW5kb3cgZnVsbCDigJQgc3RvcAoJCX0KCQlpZiAhZmlyc3QgewoJCQlzYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWZpcnN0ID0gZmFsc2UKCQlzYi5Xcml0ZVN0cmluZyhsaXN0aW5nSlNPTihsLCBmYWxzZSkpCgkJdGFrZW4rKwoJCXJldHVybiBmYWxzZQoJfSkKCXNiLldyaXRlU3RyaW5nKCJdIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBMaXN0TGl2ZUpTT04gcmV0dXJucyBhIGJvdW5kZWQgSlNPTiBhcnJheSBvZiB0aGUgdmlzaWJsZSAobGl2ZSwgdW4tZmxhZy1oaWRkZW4pIGxpc3RpbmdzIOKAlAovLyB0aGUgVmVyaWZpZWQgdGFiLiBCb3VuZGVkIGJ5IHNjYW5uaW5nIG9ubHkgdGhlICJsaXZlIiBpbmRleCBzbGljZS4KZnVuYyBMaXN0TGl2ZUpTT04ob2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglyZXR1cm4gd2luZG93QnlQcmVmaXgoc3RhdHVzSW5kZXgsIFN0YXR1c0xpdmUsIG9mZnNldCwgbGltaXQsIHRydWUpCn0KCi8vIExpc3RCeVN0YXR1c0pTT04gcmV0dXJucyBhIGJvdW5kZWQgd2luZG93IG9mIGxpc3RpbmdzIGluIGBzdGF0dXNgLiBQdWJsaWMgdGFicyAobGl2ZSwgcGVuZGluZykKLy8gZXhjbHVkZSBmbGFnLWhpZGRlbiBsaXN0aW5nczsgcmVqZWN0ZWQvZGVsaXN0ZWQgYXJlIHJldHVybmVkIHJhdyAodXNlZCBieSBjdXJhdG9yL293bmVyIHZpZXdzKS4KLy8gQW4gdW5rbm93biBzdGF0dXMgcmV0dXJucyBhbiBlbXB0eSBhcnJheSDigJQgdGhlIGNsaWVudCBwYXNzZXMgYSBmaXhlZCBlbnVtLCBuZXZlciBmcmVlIHRleHQuCmZ1bmMgTGlzdEJ5U3RhdHVzSlNPTihzdGF0dXMgc3RyaW5nLCBvZmZzZXQsIGxpbWl0IGludCkgc3RyaW5nIHsKCWlmICF2YWxpZFN0YXR1cyhzdGF0dXMpIHsKCQlyZXR1cm4gIltdIgoJfQoJZmxhZ0ZpbHRlciA6PSBzdGF0dXMgPT0gU3RhdHVzTGl2ZSB8fCBzdGF0dXMgPT0gU3RhdHVzUGVuZGluZwoJcmV0dXJuIHdpbmRvd0J5UHJlZml4KHN0YXR1c0luZGV4LCBzdGF0dXMsIG9mZnNldCwgbGltaXQsIGZsYWdGaWx0ZXIpCn0KCi8vIExpc3RCeVB1Ymxpc2hlckpTT04gcmV0dXJucyBhIGJvdW5kZWQgd2luZG93IG9mIGEgcHVibGlzaGVyJ3MgbGlzdGluZ3MgYWNyb3NzIEFMTCBzdGF0dXNlcwovLyAodGhlIE15LVN1Ym1pc3Npb25zIHZpZXcpIOKAlCBubyBmbGFnIGZpbHRlciwgc2luY2UgYSBwdWJsaXNoZXIgc2VlcyB0aGVpciBvd24gZmxhZ2dlZC9yZWplY3RlZC4KZnVuYyBMaXN0QnlQdWJsaXNoZXJKU09OKHB1Ymxpc2hlciBzdHJpbmcsIG9mZnNldCwgbGltaXQgaW50KSBzdHJpbmcgewoJcmV0dXJuIHdpbmRvd0J5UHJlZml4KHB1Ymxpc2hlckluZGV4LCBwdWJsaXNoZXIsIG9mZnNldCwgbGltaXQsIGZhbHNlKQp9CgovLyBHZXRMaXN0aW5nSlNPTiByZXR1cm5zIGEgc2luZ2xlIGxpc3RpbmcgKGFueSBzdGF0dXMpIHdpdGggaXRzIGZ1bGwgZGV0YWlsIChkZXNjciArIHNjcmVlbnNob3RzKSwKLy8gb3IgdGhlIEpTT04gbGl0ZXJhbCBgbnVsbGAgaWYgdGhlIHBhY2thZ2UgcGF0aCBpcyBub3QgcmVnaXN0ZXJlZC4KZnVuYyBHZXRMaXN0aW5nSlNPTihwa2dQYXRoIHN0cmluZykgc3RyaW5nIHsKCXYsIG9rIDo9IGxpc3RpbmdzLkdldChwa2dQYXRoKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gbGlzdGluZ0pTT04odi4oKkxpc3RpbmcpLCB0cnVlKQp9Chr0DgoKcmVuZGVyLmdubxLlDnBhY2thZ2UgbWVtYmFfYXBwc3RvcmVfdjMKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBSZW5kZXJNYXhSb3dzIGJvdW5kcyB0aGUgUmVuZGVyKCkgb3V0cHV0IHNvIGEgbGFyZ2UgY2F0YWxvZyBjYW4gbmV2ZXIgbWFrZSB0aGUKLy8gcmVhbG0gcmVuZGVyLURvUyAobWlycm9ycyB0aGUgZmVlZCdzIGxpdmUtb25seSBib3VuZGVkIHJlbmRlcikuCmNvbnN0IFJlbmRlck1heFJvd3MgPSAxMDAKCi8vIFJlbmRlciBzaG93cyB0aGUgbGl2ZSBjYXRhbG9nIChib3VuZGVkKSDigJQgYSByZWFkLW9ubHkgdHJ1c3Qgc3VyZmFjZSBmb3IgZ25vd2ViLgovLyBUaGUgZnJvbnRlbmQgcmVhZHMgc3RydWN0dXJlZCBkYXRhIHZpYSB0aGUgZ2V0dGVycywgbm90IHRoaXMgbWFya2Rvd24uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJc2IgOj0gIiIKCXNiICs9ICIjIE1lbWJhIEFwcCBTdG9yZVxuXG4iCglzYiArPSB1Zm10LlNwcmludGYoIkN1cmF0ZWQgZ25vLmxhbmQgZEFwcHMuICoqTGlzdGluZyBmZWU6KiogJWQgdWdub3Qg4oaSIHRyZWFzdXJ5LlxuXG4iLCByZWdpc3RyYXRpb25GZWUpCglpZiBwYXVzZWQgewoJCXNiICs9ICI+IOKPuO+4jyBSZWdpc3RyYXRpb24gaXMgcGF1c2VkLlxuXG4iCgl9CgoJcm93cyA6PSAwCglsaXZlIDo9IDAKCXNiICs9ICJ8IEFwcCB8IFBhY2thZ2UgfCBDYXRlZ29yeSB8XG58LS0tfC0tLXwtLS18XG4iCglsaXN0aW5ncy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWwgOj0gdi4oKkxpc3RpbmcpCgkJLy8gQ3VyYXRlZCBnbm93ZWIgdmlldzogbGl2ZSAoVmVyaWZpZWQpICsgdW4tZmxhZy1oaWRkZW4gb25seSDigJQgbmV2ZXIgcGVuZGluZy9yZWplY3RlZC4KCQlpZiBsLlN0YXR1cyAhPSBTdGF0dXNMaXZlIHx8IGwuRmxhZ0NvdW50ID49IEZsYWdIaWRlVGhyZXNob2xkIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWxpdmUrKwoJCWlmIHJvd3MgPj0gUmVuZGVyTWF4Um93cyB7CgkJCXJldHVybiBmYWxzZSAvLyBzdG9wIGFwcGVuZGluZywga2VlcCBjb3VudGluZyB2aWEgdGhlIGhlYWRlciBiZWxvdwoJCX0KCQlyb3dzKysKCQlzYiArPSB1Zm10LlNwcmludGYoInwgJXMgfCBgJXNgIHwgJXMgfFxuIiwgZXNjKGwuTmFtZSksIGVzYyhsLlBrZ1BhdGgpLCBlc2MobC5DYXRlZ29yeSkpCgkJcmV0dXJuIGZhbHNlCgl9KQoKCWlmIGxpdmUgPT0gMCB7CgkJc2IgKz0gIlxuKk5vIGxpdmUgYXBwcyB5ZXQuKlxuIgoJfSBlbHNlIHsKCQlzYiArPSB1Zm10LlNwcmludGYoIlxuKiVkIGxpdmUgYXBwKHMpJXMuIEJsb2NrICVkLipcbiIsIGxpdmUsIG1vcmVOb3RlKGxpdmUpLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCgl9CglyZXR1cm4gc2IKfQoKZnVuYyBtb3JlTm90ZShsaXZlIGludCkgc3RyaW5nIHsKCWlmIGxpdmUgPiBSZW5kZXJNYXhSb3dzIHsKCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCIgKHNob3dpbmcgZmlyc3QgJWQpIiwgUmVuZGVyTWF4Um93cykKCX0KCXJldHVybiAiIgp9CgovLyBlc2MgbmV1dHJhbGl6ZXMgdGhlIG1hcmtkb3duL3RhYmxlIG1ldGFjaGFycyB0aGF0IGNvdWxkIGJyZWFrIHRoZSB0YWJsZSBvciBpbmplY3QKLy8gbGF5b3V0IGZyb20gYW4gYXR0YWNrZXItc3VwcGxpZWQgbGlzdGluZyBmaWVsZC4KZnVuYyBlc2MocyBzdHJpbmcpIHN0cmluZyB7CglvdXQgOj0gIiIKCWZvciBfLCByIDo9IHJhbmdlIHMgewoJCXN3aXRjaCByIHsKCQljYXNlICd8JzoKCQkJb3V0ICs9ICJcXHwiCgkJY2FzZSAnXG4nLCAnXHInOgoJCQlvdXQgKz0gIiAiCgkJY2FzZSAnYCc6CgkJCW91dCArPSAiJyIKCQlkZWZhdWx0OgoJCQlvdXQgKz0gc3RyaW5nKHIpCgkJfQoJfQoJcmV0dXJuIG91dAp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTQwMDAwMDB1Z25vdBISCICq6lUSCzE4MDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQEcAaEGpLxkgTQBmeOWHrzU43+mevo2F6imTc/mbfHS0Eh4f1UOdylWRSAZ7kWuWDj05j/IP2oUH77OP7bG7Wn0SQBixgaVbqEMUCvviNGxU9Z7CBU1IlserNc9hS2Iku26kfZmFW5fkS9O7wcDh0hTM0ToHUcN6Yp9lDwSrq/QvVkkaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data