Transaction executed successfully

Transaction Details

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

Transaction hash
BD83A5558C3494F8273F0B37F764F7197D3DB2C02902F9502A7A2345038118F6

Transaction overview

Status
Success
Execution completed
Block
#336712
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
61,268,850
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

CpjqAgoML3ZtLm1fYWRkcGtnEobqAgooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLJ6QIKEHNlcnZpY2VfcmVnaXN0cnkSRGduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zZXJ2aWNlX3JlZ2lzdHJ5GmsKC2dub21vZC50b21sElxtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NlcnZpY2VfcmVnaXN0cnkiCmdubyA9ICIwLjkiChrfmgEKFHNlcnZpY2VfcmVnaXN0cnkuZ25vEsWaAXBhY2thZ2Ugc2VydmljZV9yZWdpc3RyeQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gU2VydmljZSByZXByZXNlbnRzIGEgcmVnaXN0ZXJlZCBvbi1jaGFpbiBzZXJ2aWNlLgp0eXBlIFNlcnZpY2Ugc3RydWN0IHsKCU5hbWUgICAgICAgIHN0cmluZwoJT3duZXIgICAgICAgYWRkcmVzcwoJUmVnaXN0cmFudCAgYWRkcmVzcyAvLyBPUklHSU5BTCByZWdpc3RyYW50OyBpbW11dGFibGUgdGhyb3VnaCB0cmFuc2ZlcnMKCVBrZ1BhdGggICAgIHN0cmluZyAgLy8gdGhlIHJlYWxtIHRoZSBzZXJ2aWNlIGxpdmVzIGF0IOKAlCB3aGF0IGludGVncmF0b3JzIHJlc29sdmUKCURlc2NyaXB0aW9uIHN0cmluZwoJU2VydmljZVR5cGUgc3RyaW5nIC8vIGUuZy4gInRva2VuIiwgImRleCIsICJvcmFjbGUiLCAiZGFvIiwgIm5mdCIsICJicmlkZ2UiCglNZXRhZGF0YSAgICBzdHJpbmcgLy8gZnJlZWZvcm0ga2V5PXZhbHVlIHBhaXJzIG9yIEpTT04gYmxvYgp9CgovLyBSZXNlcnZhdGlvbiBob2xkcyBhIGRlcmVnaXN0ZXJlZCBuYW1lIGZvciBpdHMgZm9ybWVyIG93bmVyIEFORCBpdHMKLy8gb3JpZ2luYWwgcmVnaXN0cmFudCwgYW5kIEVYUElSRVMgKHJlLWF1ZGl0IDIwMjYtMDktMDIpOiBhbiBldGVybmFsCi8vIHJlc2VydmF0aW9uIGxldCBhbiBhdHRhY2tlciBjeWNsZSByZWdpc3Rlci9kZXJlZ2lzdGVyIHRvIGxvY2sgdGhlCi8vIHdob2xlIG5hbWVzcGFjZSBmb3JldmVyLCBhbmQgYSBob3N0aWxlIHRyYW5zZmVyZWUgY291bGQgc3RyYW5kIGEKLy8gbmFtZSBhZ2FpbnN0IGl0cyBvcmlnaW5hbCByZWdpc3RyYW50IHBlcm1hbmVudGx5Lgp0eXBlIFJlc2VydmF0aW9uIHN0cnVjdCB7CglPd25lciAgICAgIGFkZHJlc3MKCVJlZ2lzdHJhbnQgYWRkcmVzcwoJRXhwaXJlcyAgICB0aW1lLlRpbWUKfQoKY29uc3QgKAoJLy8gTWF4U2VydmljZXMgaXMgYSBwdXJlIHN0YXRlIGJvdW5kLCBub3QgYW4gYW50aS1zcXVhdCBkZWZlbnNlIOKAlAoJLy8gTWF4U2VydmljZXNQZXJPd25lciBpcyB3aGF0IG1ha2VzIG1vbm9wb2xpemF0aW9uIGV4cGVuc2l2ZQoJLy8gKHBlYXJsIGF1ZGl0IFIxKS4gS2VwdCBhdCAxMDAwIHJhdGhlciB0aGFuIHJhaXNlZCBmdXJ0aGVyIHNvIHRoZQoJLy8gbGluZWFyIHNjYW5zIG92ZXIgYG5hbWVzYCAoRGVyZWdpc3RlciwgTGlzdFNlcnZpY2VzLCBMaXN0QnlUeXBlKQoJLy8gc3RheSBib3VuZGVkIGF0IGEgc2l6ZSBvbmUgdHJhbnNhY3Rpb24gY2FuIGNvbWZvcnRhYmx5IHBheSBmb3IuCglNYXhTZXJ2aWNlcyA9IDEwMDAKCgkvLyBNYXhTZXJ2aWNlc1Blck93bmVyIGNhcHMgaG93IG1hbnkgbmFtZXMgb25lIGFkZHJlc3MgbWF5IGhvbGQgYXQKCS8vIG9uY2UuIEVuZm9yY2VkIGF0IHJlZ2lzdHJhdGlvbiBhbmQsIGZvciBhIGhhbmRvZmYsIGF0IHRoZSBtb21lbnQKCS8vIHRoZSByZWNpcGllbnQgQ09OU0VOVFMgKHNlZSBBY2NlcHRPd25lcnNoaXApLgoJTWF4U2VydmljZXNQZXJPd25lciA9IDIwCgoJTWF4TmFtZUxlbiAgICAgICAgPSA2NAoJTWF4VHlwZUxlbiAgICAgICAgPSAzMgoJTWF4UGtnUGF0aExlbiAgICAgPSAxMjgKCU1heERlc2NyaXB0aW9uTGVuID0gNTAwCglNYXhNZXRhZGF0YUxlbiAgICA9IDIwMDAKCglwa2dQYXRoUHJlZml4ID0gImduby5sYW5kLyIKCgkvLyBSZXNlcnZhdGlvblBlcmlvZCBpcyBob3cgbG9uZyBhIGRlcmVnaXN0ZXJlZCBuYW1lIHN0YXlzIHJlc2VydmVkLgoJLy8gTG9uZyBlbm91Z2ggZm9yIGludGVncmF0b3JzIHRvIG5vdGljZSB0aGUgZGVyZWdpc3RyYXRpb247IGZpbml0ZQoJLy8gc28gdG9tYnN0b25lcyBjYW5ub3QgbG9jayB0aGUgbmFtZXNwYWNlIGZvcmV2ZXIuCglSZXNlcnZhdGlvblBlcmlvZCA9IGludDY0KDkwICogMjQgKiAzNjAwKSAvLyA5MCBkYXlzCgoJLy8gTWF4UmVuZGVyU2VydmljZXMgYm91bmRzIHRoZSBnbm93ZWIgdGFibGUuIFJlbmRlciBpcyByZWFjaGFibGUgYnkKCS8vIGFueSB2aWV3ZXIsIHNvIGl0cyBjb3N0IGxhbmRzIG9uIHRoaXJkIHBhcnRpZXMgcmF0aGVyIHRoYW4gb24KCS8vIHdob2V2ZXIgZ3JldyB0aGUgc3RhdGUgKHBlYXJsIGF1ZGl0IFkzKS4gQ29tcGxldGUgZGF0YSBjb21lcyBmcm9tCgkvLyB0aGUgYm91bmRlZCBxdWVyaWVzIG5hbWVkIGluIHRoZSB0cnVuY2F0aW9uIG5vdGljZS4KCU1heFJlbmRlclNlcnZpY2VzID0gMjUKCgkvLyByZW5kZXJEZXNjTGVuIGlzIHRoZSBwZXItcm93IGRlc2NyaXB0aW9uIGJ1ZGdldCwgYXBwbGllZCB0byB0aGUKCS8vIFJBVyB0ZXh0IGJlZm9yZSBlc2NhcGluZyBzbyBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbmV2ZXIgc3BsaXQuCglyZW5kZXJEZXNjTGVuID0gNjAKKQoKdmFyICgKCXNlcnZpY2VzIG1hcFtzdHJpbmddKlNlcnZpY2UKCW5hbWVzICAgIFtdc3RyaW5nIC8vIGluc2VydGlvbi1vcmRlcmVkIGxpc3QgZm9yIGRldGVybWluaXN0aWMgaXRlcmF0aW9uCgkvLyByZXRpcmVkIG1hcHMgYSBkZXJlZ2lzdGVyZWQgbmFtZSB0byBpdHMgdGltZS1ib3VuZGVkIHJlc2VydmF0aW9uLgoJcmV0aXJlZCBtYXBbc3RyaW5nXSpSZXNlcnZhdGlvbgoJLy8gb3duZXJTZXJ2aWNlcyBpcyB0aGUgTygxKSBpbmRleCBiYWNraW5nIE1heFNlcnZpY2VzUGVyT3duZXIuIEl0IGlzCgkvLyBrZXB0IHplcm8tZnJlZTogYW4gb3duZXIgdGhhdCBkcm9wcyB0byB6ZXJvIGlzIGRlbGV0ZWQgb3V0cmlnaHQgc28KCS8vIHRoZSBtYXAgY2Fubm90IGFjY3VtdWxhdGUgZGVhZCBrZXlzLgoJb3duZXJTZXJ2aWNlcyBtYXBbYWRkcmVzc11pbnQKCS8vIHBlbmRpbmdPd25lcnMgaG9sZHMgbm9taW5hdGVkLWJ1dC1ub3QteWV0LWFjY2VwdGVkIG93bmVycwoJLy8gKHBlYXJsIGF1ZGl0IFk0KS4gQSBuYW1lIGFwcGVhcnMgaGVyZSBvbmx5IHdoaWxlIGEgaGFuZG9mZiBpcyBvcGVuLgoJcGVuZGluZ093bmVycyBtYXBbc3RyaW5nXWFkZHJlc3MKKQoKZnVuYyBpbml0KCkgewoJc2VydmljZXMgPSBtYWtlKG1hcFtzdHJpbmddKlNlcnZpY2UpCgluYW1lcyA9IFtdc3RyaW5ne30KCXJldGlyZWQgPSBtYWtlKG1hcFtzdHJpbmddKlJlc2VydmF0aW9uKQoJb3duZXJTZXJ2aWNlcyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJcGVuZGluZ093bmVycyA9IG1ha2UobWFwW3N0cmluZ11hZGRyZXNzKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCAocGVhcmwgYXVkaXQKLy8gWTIpOiB0aGlzIHJlYWxtIGhhbmRsZXMgbm8gZnVuZHMsIGhvbGRzIG5vIGJhbmtlciBhbmQgZXhwb3NlcyBubwovLyB3aXRoZHJhd2FsLCBzbyBhbiBhdHRhY2hlZCBzZW5kIHdvdWxkIHN0cmFuZCBvbiB0aGUgcmVhbG0gYWRkcmVzcwovLyBmb3JldmVyLiBBYm9ydGluZyByZXZlcnRzIHRoZSB0cmFuc2ZlciBiYWNrIHRvIHRoZSBzZW5kZXIuIEZhaWxzIG9wZW4KLy8gZm9yIHJlYWxtLXJvdXRlZCBjYWxscywgd2hvc2UgYXR0YWNoZWQgc2VuZCBsYW5kcyBvbiB0aGUgaW50ZXJtZWRpYXJ5Ci8vIHJlYWxtLCBuZXZlciBoZXJlLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygidGhpcyByZWFsbSBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyAtLS0tLS0tLS0tIHF1b3RhIGluZGV4IC0tLS0tLS0tLS0KCmZ1bmMgcXVvdGFBZGQob3duZXIgYWRkcmVzcykgewoJb3duZXJTZXJ2aWNlc1tvd25lcl0gPSBvd25lclNlcnZpY2VzW293bmVyXSArIDEKfQoKZnVuYyBxdW90YURyb3Aob3duZXIgYWRkcmVzcykgewoJbiA6PSBvd25lclNlcnZpY2VzW293bmVyXSAtIDEKCWlmIG4gPD0gMCB7CgkJZGVsZXRlKG93bmVyU2VydmljZXMsIG93bmVyKQoJCXJldHVybgoJfQoJb3duZXJTZXJ2aWNlc1tvd25lcl0gPSBuCn0KCmZ1bmMgYXNzZXJ0UXVvdGEob3duZXIgYWRkcmVzcykgewoJaWYgb3duZXJTZXJ2aWNlc1tvd25lcl0gPj0gTWF4U2VydmljZXNQZXJPd25lciB7CgkJcGFuaWMoImFkZHJlc3MgYWxyZWFkeSBob2xkcyB0aGUgbWF4aW11bSBvZiAiICsKCQkJc3RyY29udi5JdG9hKE1heFNlcnZpY2VzUGVyT3duZXIpICsgIiBzZXJ2aWNlcyIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0gdmFsaWRhdGlvbiBoZWxwZXJzIC0tLS0tLS0tLS0KCmZ1bmMgaXNWYWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBNYXhOYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgdmFsaWRhdGVQa2dQYXRoKHBrZ1BhdGggc3RyaW5nKSB7CglpZiBwa2dQYXRoID09ICIiIHsKCQlwYW5pYygicGtncGF0aCBtdXN0IG5vdCBiZSBlbXB0eSIpCgl9CglpZiBsZW4ocGtnUGF0aCkgPiBNYXhQa2dQYXRoTGVuIHsKCQlwYW5pYygicGtncGF0aCBleGNlZWRzICIgKyBzdHJjb252Lkl0b2EoTWF4UGtnUGF0aExlbikgKyAiIGNoYXJzIikKCX0KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChwa2dQYXRoLCBwa2dQYXRoUHJlZml4KSB7CgkJcGFuaWMoInBrZ3BhdGggbXVzdCBzdGFydCB3aXRoICIgKyBwa2dQYXRoUHJlZml4ICsgIiBhbmQgbmFtZSBhIHBhY2thZ2UiKQoJfQoJLy8gc3RydWN0dXJhbCwgcGVyLWVsZW1lbnQgdmFsaWRhdGlvbiAocmUtYXVkaXQ6IHRoZSBvbGQgY2hhcnNldCBjaGVjawoJLy8gYWNjZXB0ZWQgIi4uIiwgIi8vIiwgdHJhaWxpbmcgc2xhc2hlcywgaHlwaGVucywgYW5kIG5vbi1yL3Agcm9vdHMg4oCUCgkvLyBhbGwgbG9va2FsaWtlLXNxdWF0IG9yIGFsbG93bGlzdC1ieXBhc3MgbWF0ZXJpYWwpCgllbGVtcyA6PSBzdHJpbmdzLlNwbGl0KHBrZ1BhdGhbbGVuKHBrZ1BhdGhQcmVmaXgpOl0sICIvIikKCWlmIGxlbihlbGVtcykgPCAyIHx8IChlbGVtc1swXSAhPSAiciIgJiYgZWxlbXNbMF0gIT0gInAiKSB7CgkJcGFuaWMoInBrZ3BhdGggbXVzdCBiZSBnbm8ubGFuZC9yLy4uLiBvciBnbm8ubGFuZC9wLy4uLiIpCgl9Cglmb3IgXywgZSA6PSByYW5nZSBlbGVtc1sxOl0gewoJCWlmIGUgPT0gIiIgewoJCQlwYW5pYygicGtncGF0aCBjb250YWlucyBhbiBlbXB0eSBlbGVtZW50IikKCQl9CgkJaWYgIShlWzBdID49ICdhJyAmJiBlWzBdIDw9ICd6JykgewoJCQlwYW5pYygiaW52YWxpZCBwa2dwYXRoIGVsZW1lbnQ6ICIgKyBlKQoJCX0KCQlmb3IgXywgYyA6PSByYW5nZSBlIHsKCQkJaWYgISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnXycpIHsKCQkJCXBhbmljKCJpbnZhbGlkIHBrZ3BhdGggZWxlbWVudDogIiArIGUpCgkJCX0KCQl9Cgl9Cn0KCmZ1bmMgdmFsaWRhdGVGaWVsZHMoZGVzY3JpcHRpb24sIHNlcnZpY2VUeXBlLCBtZXRhZGF0YSBzdHJpbmcpIHsKCWlmIGRlc2NyaXB0aW9uID09ICIiIHsKCQlwYW5pYygiZGVzY3JpcHRpb24gbXVzdCBub3QgYmUgZW1wdHkiKQoJfQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NyaXB0aW9uTGVuIHsKCQlwYW5pYygiZGVzY3JpcHRpb24gZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heERlc2NyaXB0aW9uTGVuKSArICIgY2hhcnMiKQoJfQoJaWYgc2VydmljZVR5cGUgPT0gIiIgewoJCXBhbmljKCJzZXJ2aWNlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHkiKQoJfQoJaWYgbGVuKHNlcnZpY2VUeXBlKSA+IE1heFR5cGVMZW4gfHwgIWlzVmFsaWROYW1lKHNlcnZpY2VUeXBlKSB7CgkJcGFuaWMoInNlcnZpY2UgdHlwZSBtdXN0IGJlIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcywgbWF4ICIgKwoJCQlzdHJjb252Lkl0b2EoTWF4VHlwZUxlbikgKyAiIGNoYXJzIikKCX0KCWlmIGxlbihtZXRhZGF0YSkgPiBNYXhNZXRhZGF0YUxlbiB7CgkJcGFuaWMoIm1ldGFkYXRhIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhNZXRhZGF0YUxlbikgKyAiIGNoYXJzIikKCX0KfQoKLy8gdHJ1bmNhdGUgc2hvcnRlbnMgcyB0byBhdCBtb3N0IG4gcnVuZXMgd2l0aG91dCBzcGxpdHRpbmcgYSBtdWx0aWJ5dGUKLy8gY2hhcmFjdGVyLiBBcHBsaWVkIHRvIFJBVyB0ZXh0LCBuZXZlciB0byBlc2NhcGVkIG91dHB1dCDigJQgdHJ1bmNhdGluZwovLyBhZnRlciBlc2NhcGluZyBjb3VsZCBzZXZlciBhIGBceGAgcGFpciBhbmQgbGVhdmUgYSBkYW5nbGluZyBiYWNrc2xhc2guCmZ1bmMgdHJ1bmNhdGUocyBzdHJpbmcsIG4gaW50KSBzdHJpbmcgewoJaWYgbiA8IDQgewoJCXBhbmljKCJ0cnVuY2F0ZTogYnVkZ2V0IHRvbyBzbWFsbCIpCgl9CglydW5lcyA6PSBbXXJ1bmUocykKCWlmIGxlbihydW5lcykgPD0gbiB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiBzdHJpbmcocnVuZXNbOm4tM10pICsgIi4uLiIKfQoKZnVuYyBtdXN0R2V0KG5hbWUgc3RyaW5nKSAqU2VydmljZSB7CglzdmMsIG9rIDo9IHNlcnZpY2VzW25hbWVdCglpZiAhb2sgewoJCXBhbmljKCJzZXJ2aWNlIG5vdCBmb3VuZDogIiArIG5hbWUpCgl9CglyZXR1cm4gc3ZjCn0KCi8vIC0tLS0tLS0tLS0gd3JpdGUgb3BlcmF0aW9ucyAtLS0tLS0tLS0tCgovLyBSZWdpc3RlclNlcnZpY2UgYWRkcyBhIG5ldyBzZXJ2aWNlIHRvIHRoZSByZWdpc3RyeS4gVGhlIGNhbGxlciBiZWNvbWVzCi8vIHRoZSBvd25lci4gTmFtZSBtdXN0IGJlIHVuaXF1ZSwgbG93ZXJjYXNlIGFscGhhbnVtZXJpYy91bmRlcnNjb3Jlcy4KLy8gcGtnUGF0aCBpcyB0aGUgcmVhbG0gdGhlIHNlcnZpY2UgbGl2ZXMgYXQg4oCUIHRoZSBmaWVsZCBpbnRlZ3JhdG9ycwovLyByZXNvbHZlIOKAlCBhbmQgbXVzdCBsb29rIGxpa2UgYSBnbm8ubGFuZCBwYWNrYWdlIHBhdGguIEEgbmFtZSB0aGF0IHdhcwovLyBkZXJlZ2lzdGVyZWQgc3RheXMgcmVzZXJ2ZWQgZm9yIGl0cyBmb3JtZXIgb3duZXIgYW5kIGl0cyBvcmlnaW5hbAovLyByZWdpc3RyYW50IGZvciBSZXNlcnZhdGlvblBlcmlvZC4KLy8KLy8gTk9URTogdGhpcyByZWFsbSBkb2VzIE5PVCBhbmQgY2Fubm90IHZlcmlmeSB0aGF0IHBrZ1BhdGggZXhpc3RzIG9yCi8vIHRoYXQgdGhlIGNhbGxlciBjb250cm9scyBpdC4gU2VlIHRoZSBJTlRFR1JBVE9SIENPTlRSQUNUIG9uIFJlc29sdmUuCmZ1bmMgUmVnaXN0ZXJTZXJ2aWNlKGN1ciByZWFsbSwgbmFtZSwgcGtnUGF0aCwgZGVzY3JpcHRpb24sIHNlcnZpY2VUeXBlLCBtZXRhZGF0YSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmICFpc1ZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoIm5hbWUgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4TmFtZUxlbikgKwoJCQkiIGNoYXJzLCBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMgb25seSIpCgl9Cgl2YWxpZGF0ZVBrZ1BhdGgocGtnUGF0aCkKCXZhbGlkYXRlRmllbGRzKGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEpCglpZiBfLCBleGlzdHMgOj0gc2VydmljZXNbbmFtZV07IGV4aXN0cyB7CgkJcGFuaWMoInNlcnZpY2UgYWxyZWFkeSByZWdpc3RlcmVkOiAiICsgbmFtZSkKCX0KCglyZWdpc3RyYW50IDo9IGMKCWlmIHJlcywgd2FzUmV0aXJlZCA6PSByZXRpcmVkW25hbWVdOyB3YXNSZXRpcmVkIHsKCQlpZiB0aW1lLk5vdygpLkFmdGVyKHJlcy5FeHBpcmVzKSB7CgkJCS8vIE8oMSkgbGF6eSByZWNsYWltOiBhIGxhcHNlZCB0b21ic3RvbmUgaXMgZHJvcHBlZCB0aGUgbW9tZW50CgkJCS8vIGl0IGlzIGNvbnN1bHRlZCwgc28gdGhlIG1hcCBkb2VzIG5vdCBwYXkgdG8ga2VlcCBlbnRyaWVzCgkJCS8vIG5vYm9keSB3aWxsIGV2ZXIgcmVhZCBhZ2Fpbi4KCQkJZGVsZXRlKHJldGlyZWQsIG5hbWUpCgkJfSBlbHNlIHsKCQkJaWYgYyAhPSByZXMuT3duZXIgJiYgYyAhPSByZXMuUmVnaXN0cmFudCB7CgkJCQlwYW5pYygibmFtZSBpcyByZXNlcnZlZCBmb3IgaXRzIGZvcm1lciBvd25lcjogIiArIG5hbWUpCgkJCX0KCQkJLy8gcm91bmQtMyBhdWRpdDogYW4gaW4td2luZG93IHJlLXJlZ2lzdGVyIG11c3QgUFJFU0VSVkUgdGhlCgkJCS8vIG9yaWdpbmFsIHJlZ2lzdHJhbnQg4oCUIG90aGVyd2lzZSBhIGhvc3RpbGUgdHJhbnNmZXJlZSBjb3VsZAoJCQkvLyBkZXJlZ2lzdGVyIGFuZCBpbnN0YW50bHkgcmUtcmVnaXN0ZXIsIHN0YW1waW5nIHRoZW1zZWx2ZXMgYXMKCQkJLy8gcmVnaXN0cmFudCBhbmQgZXJhc2luZyB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIHJlY2xhaW0gcmlnaHQKCQkJaWYgcmVzLlJlZ2lzdHJhbnQgIT0gIiIgewoJCQkJcmVnaXN0cmFudCA9IHJlcy5SZWdpc3RyYW50CgkJCX0KCQl9Cgl9CgoJaWYgbGVuKHNlcnZpY2VzKSA+PSBNYXhTZXJ2aWNlcyB7CgkJcGFuaWMoImdsb2JhbCBzZXJ2aWNlIGxpbWl0IHJlYWNoZWQiKQoJfQoJYXNzZXJ0UXVvdGEoYykKCglzZXJ2aWNlc1tuYW1lXSA9ICZTZXJ2aWNlewoJCU5hbWU6ICAgICAgICBuYW1lLAoJCU93bmVyOiAgICAgICBjLAoJCVJlZ2lzdHJhbnQ6ICByZWdpc3RyYW50LAoJCVBrZ1BhdGg6ICAgICBwa2dQYXRoLAoJCURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwKCQlTZXJ2aWNlVHlwZTogc2VydmljZVR5cGUsCgkJTWV0YWRhdGE6ICAgIG1ldGFkYXRhLAoJfQoJbmFtZXMgPSBhcHBlbmQobmFtZXMsIG5hbWUpCglxdW90YUFkZChjKQoJZGVsZXRlKHJldGlyZWQsIG5hbWUpCgoJY2hhaW4uRW1pdCgiU2VydmljZVJlZ2lzdGVyZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkicGtncGF0aCIsIHBrZ1BhdGgsCgkJInR5cGUiLCBzZXJ2aWNlVHlwZSwKCQkib3duZXIiLCBjLlN0cmluZygpLAoJCSJyZWdpc3RyYW50IiwgcmVnaXN0cmFudC5TdHJpbmcoKSwKCSkKfQoKLy8gVXBkYXRlU2VydmljZSBtb2RpZmllcyBhIHNlcnZpY2UncyBwa2dwYXRoLCBkZXNjcmlwdGlvbiwgdHlwZSwgYW5kCi8vIG1ldGFkYXRhLiBPbmx5IHRoZSByZWdpc3RlcmVkIG93bmVyIGNhbiB1cGRhdGUuIE5hbWUgY2Fubm90IGNoYW5nZS4KLy8KLy8gQW4gdXBkYXRlIE1BWSBSRVBPSU5UIHRoZSBuYW1lIGF0IGEgZGlmZmVyZW50IHBhY2thZ2UgcGF0aC4gVGhhdCBpcyBhCi8vIGRlbGliZXJhdGUgY2FwYWJpbGl0eSAoc2VydmljZXMgbW92ZSwgYW5kIHZlcnNpb25zIHN1cGVyc2VkZSksIGJ1dCBpdAovLyBhbHNvIG1lYW5zIGEgbmFtZSBhbiBpbnRlZ3JhdG9yIHRydXN0cyB0b2RheSBjYW4gcG9pbnQgZWxzZXdoZXJlCi8vIHRvbW9ycm93LiBUaGUgU2VydmljZVVwZGF0ZWQgZXZlbnQgY2FycmllcyBib3RoIHRoZSBvbGQgYW5kIHRoZSBuZXcKLy8gcGF0aCBzcGVjaWZpY2FsbHkgc28gYSByZXBvaW50IGlzIG9ic2VydmFibGUgaW4gdGhlIHRyYW5zYWN0aW9uIGxvZwovLyByYXRoZXIgdGhhbiBzb21ldGhpbmcgYSBjb25zdW1lciBoYXMgdG8gcG9sbCBmb3IuCmZ1bmMgVXBkYXRlU2VydmljZShjdXIgcmVhbG0sIG5hbWUsIHBrZ1BhdGgsIGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBzdmMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdXBkYXRlIHRoaXMgc2VydmljZSIpCgl9Cgl2YWxpZGF0ZVBrZ1BhdGgocGtnUGF0aCkKCXZhbGlkYXRlRmllbGRzKGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEpCgoJb2xkUGF0aCA6PSBzdmMuUGtnUGF0aAoJc3ZjLlBrZ1BhdGggPSBwa2dQYXRoCglzdmMuRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgoJc3ZjLlNlcnZpY2VUeXBlID0gc2VydmljZVR5cGUKCXN2Yy5NZXRhZGF0YSA9IG1ldGFkYXRhCgoJY2hhaW4uRW1pdCgiU2VydmljZVVwZGF0ZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkib2xkcGtncGF0aCIsIG9sZFBhdGgsCgkJInBrZ3BhdGgiLCBwa2dQYXRoLAoJCSJ0eXBlIiwgc2VydmljZVR5cGUsCgkJIm93bmVyIiwgc3ZjLk93bmVyLlN0cmluZygpLAoJKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBOT01JTkFURVMgYSBuZXcgb3duZXIgZm9yIGEgc2VydmljZSBlbnRyeTsgdGhlCi8vIG5vbWluZWUgbXVzdCBjYWxsIEFjY2VwdE93bmVyc2hpcCB0byB0YWtlIGNvbnRyb2wgKHBlYXJsIGF1ZGl0IFk0KS4KLy8KLy8gVGhlIG9uZS1zdGVwIGZvcm0gdGhpcyByZXBsYWNlcyB3YXMgYSBwZXJtYW5lbnQtYnJpY2sgaGF6YXJkOgovLyBhZGRyZXNzLklzVmFsaWQoKSBvbmx5IGNoZWNrcyBiZWNoMzIgZm9ybSwgc28gYSB3ZWxsLWZvcm1lZCBidXQKLy8gdW5vd25lZCBkZXN0aW5hdGlvbiBwYXNzZWQgdGhlIGNoZWNrIGFuZCBjb21taXR0ZWQgaW1tZWRpYXRlbHksIGFmdGVyCi8vIHdoaWNoIHRoZSBlbnRyeSBjb3VsZCBuZXZlciBhZ2FpbiBiZSB1cGRhdGVkLCB0cmFuc2ZlcnJlZCBvcgovLyBkZXJlZ2lzdGVyZWQg4oCUIGFuZCBiZWNhdXNlIGl0IGNvdWxkIG5ldmVyIGJlIGRlcmVnaXN0ZXJlZCBpdCBjb3VsZAovLyBuZXZlciBlbnRlciB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGVpdGhlciwgc28gdGhlIE5BTUUgYmVjYW1lIGEKLy8gcGVybWFuZW50IGhvbGUgaW4gYSBzaGFyZWQgZ2xvYmFsIG5hbWVzcGFjZS4KLy8KLy8gTm9taW5hdGlvbiBjaGFuZ2VzIG5vdGhpbmc6IHRoZSBzaXR0aW5nIG93bmVyIGtlZXBzIGZ1bGwgY29udHJvbAovLyB1bnRpbCB0aGUgbm9taW5lZSBjb25zZW50cy4gUGFzc2luZyAiIiBjbGVhcnMgYSBwZW5kaW5nIG5vbWluYXRpb24uCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBuYW1lIHN0cmluZywgbmV3T3duZXIgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXN2YyA6PSBtdXN0R2V0KG5hbWUpCgljIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgYyAhPSBzdmMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdHJhbnNmZXIgb3duZXJzaGlwIikKCX0KCWlmIG5ld093bmVyID09ICIiIHsKCQlkZWxldGUocGVuZGluZ093bmVycywgbmFtZSkKCQljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlckNhbmNlbGxlZCIsICJuYW1lIiwgbmFtZSwgIm93bmVyIiwgYy5TdHJpbmcoKSkKCQlyZXR1cm4KCX0KCWlmICFuZXdPd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiAiICsgc3RyaW5nKG5ld093bmVyKSkKCX0KCWlmIG5ld093bmVyID09IHN2Yy5Pd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyBhbHJlYWR5IHRoZSBvd25lciIpCgl9CglwZW5kaW5nT3duZXJzW25hbWVdID0gbmV3T3duZXIKCgljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlclByb3Bvc2VkIiwKCQkibmFtZSIsIG5hbWUsCgkJIm93bmVyIiwgYy5TdHJpbmcoKSwKCQkicGVuZGluZyIsIG5ld093bmVyLlN0cmluZygpLAoJKQp9CgovLyBBY2NlcHRPd25lcnNoaXAgY29tcGxldGVzIGEgbm9taW5hdGVkIGhhbmRvZmYuIE9ubHkgdGhlIG5vbWluZWUgY2FuCi8vIGFjY2VwdCwgYW5kIHRoZSBub21pbmVlJ3Mgb3duIHF1b3RhIGlzIGNoZWNrZWQgSEVSRSDigJQgYXQgY29uc2VudCDigJQKLy8gc28gYSBub21pbmF0aW9uIGNhbiBuZXZlciBwdXNoIGFuIGFjY291bnQgcGFzdCBNYXhTZXJ2aWNlc1Blck93bmVyCi8vIHdpdGhvdXQgdGhhdCBhY2NvdW50IGFncmVlaW5nIHRvIGl0LgpmdW5jIEFjY2VwdE93bmVyc2hpcChjdXIgcmVhbG0sIG5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWMgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJcGVuZGluZywgb2sgOj0gcGVuZGluZ093bmVyc1tuYW1lXQoJaWYgIW9rIHsKCQlwYW5pYygibm8gcGVuZGluZyBvd25lcnNoaXAgdHJhbnNmZXIgZm9yOiAiICsgbmFtZSkKCX0KCWlmIGMgIT0gcGVuZGluZyB7CgkJcGFuaWMoIm9ubHkgdGhlIG5vbWluYXRlZCBvd25lciBjYW4gYWNjZXB0IikKCX0KCWFzc2VydFF1b3RhKGMpCgoJcHJldiA6PSBzdmMuT3duZXIKCXN2Yy5Pd25lciA9IGMKCXF1b3RhRHJvcChwcmV2KQoJcXVvdGFBZGQoYykKCWRlbGV0ZShwZW5kaW5nT3duZXJzLCBuYW1lKQoKCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVycmVkIiwKCQkibmFtZSIsIG5hbWUsCgkJImZyb20iLCBwcmV2LlN0cmluZygpLAoJCSJ0byIsIGMuU3RyaW5nKCksCgkpCn0KCi8vIENhbmNlbE93bmVyc2hpcFRyYW5zZmVyIHdpdGhkcmF3cyBhIHBlbmRpbmcgbm9taW5hdGlvbi4gT3duZXItb25seS4KZnVuYyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlcihjdXIgcmVhbG0sIG5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWMgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjICE9IHN2Yy5Pd25lciB7CgkJcGFuaWMoIm9ubHkgdGhlIG93bmVyIGNhbiBjYW5jZWwgYSB0cmFuc2ZlciIpCgl9CglpZiBfLCBvayA6PSBwZW5kaW5nT3duZXJzW25hbWVdOyAhb2sgewoJCXBhbmljKCJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciBmb3I6ICIgKyBuYW1lKQoJfQoJZGVsZXRlKHBlbmRpbmdPd25lcnMsIG5hbWUpCgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJDYW5jZWxsZWQiLCAibmFtZSIsIG5hbWUsICJvd25lciIsIGMuU3RyaW5nKCkpCn0KCi8vIERlcmVnaXN0ZXIgcmVtb3ZlcyBhIHNlcnZpY2UgZnJvbSB0aGUgcmVnaXN0cnkuIE9ubHkgdGhlIG93bmVyIGNhbgovLyBkZXJlZ2lzdGVyLiBUaGUgbmFtZSBzdGF5cyByZXNlcnZlZCBmb3IgdGhlIGZvcm1lciBvd25lciBhbmQgdGhlCi8vIG9yaWdpbmFsIHJlZ2lzdHJhbnQgZm9yIFJlc2VydmF0aW9uUGVyaW9kIOKAlCBpdCBjYW5ub3QgYmUKLy8gcmUtcmVnaXN0ZXJlZCBieSBhbnlvbmUgZWxzZSBpbiB0aGF0IHdpbmRvdywgc28gaW50ZWdyYXRvcnMgd2hvIHN0aWxsCi8vIHJlc29sdmUgaXQgY2FuIG5ldmVyIGJlIHNpbGVudGx5IHJlZGlyZWN0ZWQgYnkgYSBzcXVhdHRlci4KZnVuYyBEZXJlZ2lzdGVyKGN1ciByZWFsbSwgbmFtZSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzdmMgOj0gbXVzdEdldChuYW1lKQoJYyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGMgIT0gc3ZjLk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgb3duZXIgY2FuIGRlcmVnaXN0ZXIiKQoJfQoJcmV0aXJlZFtuYW1lXSA9ICZSZXNlcnZhdGlvbnsKCQlPd25lcjogICAgICBzdmMuT3duZXIsCgkJUmVnaXN0cmFudDogc3ZjLlJlZ2lzdHJhbnQsCgkJRXhwaXJlczogICAgdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihSZXNlcnZhdGlvblBlcmlvZCkgKiB0aW1lLlNlY29uZCksCgl9CglkZWxldGUoc2VydmljZXMsIG5hbWUpCglxdW90YURyb3Aoc3ZjLk93bmVyKQoJLy8gYSBub21pbmF0aW9uIG11c3Qgbm90IG91dGxpdmUgdGhlIGVudHJ5IGl0IHdhcyBtYWRlIGFnYWluc3QKCWRlbGV0ZShwZW5kaW5nT3duZXJzLCBuYW1lKQoKCS8vIFJlbW92ZSBmcm9tIG9yZGVyZWQgbGlzdAoJZm9yIGksIG4gOj0gcmFuZ2UgbmFtZXMgewoJCWlmIG4gPT0gbmFtZSB7CgkJCW5hbWVzID0gYXBwZW5kKG5hbWVzWzppXSwgbmFtZXNbaSsxOl0uLi4pCgkJCWJyZWFrCgkJfQoJfQoKCWNoYWluLkVtaXQoIlNlcnZpY2VEZXJlZ2lzdGVyZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkib3duZXIiLCBzdmMuT3duZXIuU3RyaW5nKCksCgkJInJlZ2lzdHJhbnQiLCBzdmMuUmVnaXN0cmFudC5TdHJpbmcoKSwKCSkKfQoKLy8gLS0tLS0tLS0tLSByZWFkLW9ubHkgcXVlcmllcyAtLS0tLS0tLS0tCgovLyBSZXNvbHZlIHJldHVybnMgdGhlIHBrZ3BhdGggYSBzZXJ2aWNlIG5hbWUgcG9pbnRzIHRvIOKAlCB0aGUgcHJpbWFyeQovLyBpbnRlZ3JhdGlvbiBxdWVyeS4gUGFuaWNzIG9uIHVua25vd24gbmFtZXMgc28gYSBjb25zdW1lciBjYW4gbmV2ZXIKLy8gc2lsZW50bHkgaW50ZWdyYXRlIGFnYWluc3QgYSBtaXNzaW5nIGVudHJ5LgovLwovLyBJTlRFR1JBVE9SIENPTlRSQUNUIOKAlCByZWFkIHRoaXMgYmVmb3JlIHRydXN0aW5nIGEgcmVzb2x1dGlvbjoKLy8KLy8gIDEuIEEgcmVzb2x1dGlvbiBpcyBhbiBBVFRFU1RBVElPTiwgTk9UIEEgUFJPT0YuIFRoaXMgcmVhbG0gcmVjb3JkcwovLyAgICAgdGhhdCBzb21lIGFkZHJlc3MgY2xhaW1lZCBhIG5hbWUgZm9yIHNvbWUgcGFja2FnZSBwYXRoLiBJdCBkb2VzCi8vICAgICBOT1QgdmVyaWZ5IHRoYXQgdGhlIHBhdGggZXhpc3RzLCB0aGF0IGl0IGlzIGRlcGxveWVkLCBvciB0aGF0IHRoZQovLyAgICAgcmVnaXN0cmFudCBjb250cm9scyBpdC4gQ29udHJhc3Qgci9kZW1vL2RlZmkvZ3JjMjByZWcsIHdoaWNoCi8vICAgICBwcm92ZXMgY29udHJvbCBieSByZXF1aXJpbmcgdGhlIHJlZ2lzdGVyZWQgdG9rZW4gb2JqZWN0IHRvCi8vICAgICBvcmlnaW5hdGUgZnJvbSB0aGUgY2FsbGluZyByZWFsbTsgbm8gZXF1aXZhbGVudCBwcm9vZiBleGlzdHMgZm9yCi8vICAgICBhIGJhcmUgcGF0aCBzdHJpbmcsIGFuZCByZXF1aXJpbmcgb25lIHdvdWxkIG1lYW4gb25seSByZWFsbXMg4oCUCi8vICAgICBuZXZlciB0aGVpciBvcGVyYXRvcnMg4oCUIGNvdWxkIGV2ZXIgcmVnaXN0ZXIgYSBuYW1lLCB3aGljaCBpcyBub3QKLy8gICAgIHRoaXMgcmVnaXN0cnkncyBtb2RlbC4KLy8KLy8gIDIuIEEgTkFNRSBJUyBOT1QgQU4gQVVUSE9SSVpBVElPTi4gTmV2ZXIgZ3JhbnQgYSBwcml2aWxlZ2UsIHJvdXRlIGEKLy8gICAgIHBheW1lbnQsIG9yIGFkbWl0IGEgY2FsbGVyIGJlY2F1c2UgUmVzb2x2ZSByZXR1cm5lZCBpdHMgcGF0aC4KLy8gICAgIFJlc29sdXRpb24gYW5zd2VycyAid2hlcmUgZG9lcyB0aGlzIG5hbWUgcG9pbnQiLCBuZXZlciAibWF5IHRoaXMKLy8gICAgIGNhbGxlciBhY3QiLiBEZXJpdmUgYXV0aG9yaXR5IGZyb20geW91ciBvd24gY3Jvc3NpbmcgZW50cnlwb2ludCdzCi8vICAgICBjdXIuUHJldmlvdXMoKSwgb3IgZnJvbSBhbiBleHBsaWNpdCBhY2Nlc3MtY29udHJvbCByZWFsbS4KLy8KLy8gIDMuIFRIRSBUQVJHRVQgQ0FOIENIQU5HRS4gVGhlIG93bmVyIG1heSByZXBvaW50IGEgbmFtZSBhdCBhbnkgdGltZQovLyAgICAgdmlhIFVwZGF0ZVNlcnZpY2UsIGFuZCBvd25lcnNoaXAgaXRzZWxmIGlzIHRyYW5zZmVyYWJsZS4gVHJlYXQgYQovLyAgICAgcmVzb2x1dGlvbiBhcyB2YWxpZCBvbmx5IGZvciB0aGUgdHJhbnNhY3Rpb24gdGhhdCByZWFkIGl0OyBjYWNoZQovLyAgICAgaXQgYW5kIHlvdSBpbmhlcml0IHdoYXRldmVyIHRoZSBuYW1lIHBvaW50cyBhdCBsYXRlci4gVGhlCi8vICAgICBTZXJ2aWNlVXBkYXRlZCBhbmQgT3duZXJzaGlwVHJhbnNmZXJyZWQgZXZlbnRzIGV4aXN0IHNvIG1vdmVtZW50Ci8vICAgICBpcyBkZXRlY3RhYmxlLgpmdW5jIFJlc29sdmUobmFtZSBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gbXVzdEdldChuYW1lKS5Qa2dQYXRoCn0KCi8vIFRyeVJlc29sdmUgaXMgdGhlIG5vbi1wYW5pY2tpbmcgdmFyaWFudCBmb3IgY29uc3VtZXJzIHRoYXQgbmVlZCB0bwovLyBkZWdyYWRlIGdyYWNlZnVsbHkgd2hlbiBhIG5hbWUgZGlzYXBwZWFycyAocmUtYXVkaXQ6IGEgcGFuaWNraW5nLW9ubHkKLy8gcmVhZCBwYXRoIGJyaWNrcyBhbnkgY29uc3VtZXIgcmVhbG0gdGhhdCBjYWxscyBpdCBpbmxpbmUpLiBUaGUKLy8gSU5URUdSQVRPUiBDT05UUkFDVCBkb2N1bWVudGVkIG9uIFJlc29sdmUgYXBwbGllcyBoZXJlIGlkZW50aWNhbGx5LgpmdW5jIFRyeVJlc29sdmUobmFtZSBzdHJpbmcpIChzdHJpbmcsIGJvb2wpIHsKCXN2Yywgb2sgOj0gc2VydmljZXNbbmFtZV0KCWlmICFvayB7CgkJcmV0dXJuICIiLCBmYWxzZQoJfQoJcmV0dXJuIHN2Yy5Qa2dQYXRoLCB0cnVlCn0KCi8vIEdldE93bmVyIHJldHVybnMgdGhlIG93bmVyIGFkZHJlc3Mgb2YgYSBzZXJ2aWNlLgpmdW5jIEdldE93bmVyKG5hbWUgc3RyaW5nKSBhZGRyZXNzIHsKCXJldHVybiBtdXN0R2V0KG5hbWUpLk93bmVyCn0KCi8vIEdldFBlbmRpbmdPd25lciByZXR1cm5zIHRoZSBub21pbmF0ZWQtYnV0LW5vdC15ZXQtYWNjZXB0ZWQgb3duZXIgb2YgYQovLyBzZXJ2aWNlLCBvciAibm9uZSIgd2hlbiBubyBoYW5kb2ZmIGlzIG9wZW4uCmZ1bmMgR2V0UGVuZGluZ093bmVyKG5hbWUgc3RyaW5nKSBzdHJpbmcgewoJbXVzdEdldChuYW1lKQoJaWYgcCwgb2sgOj0gcGVuZGluZ093bmVyc1tuYW1lXTsgb2sgewoJCXJldHVybiBwLlN0cmluZygpCgl9CglyZXR1cm4gIm5vbmUiCn0KCi8vIFNlcnZpY2VDb3VudCByZXR1cm5zIGhvdyBtYW55IHNlcnZpY2VzIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgZ2xvYmFsCi8vIGNhcCwgc28gYSBjYWxsZXIgY2FuIGNoZWNrIGhlYWRyb29tIHdpdGhvdXQgcHVsbGluZyB0aGUgd2hvbGUgbGlzdC4KZnVuYyBTZXJ2aWNlQ291bnQoKSAoY291bnQsIGxpbWl0IGludCkgewoJcmV0dXJuIGxlbihzZXJ2aWNlcyksIE1heFNlcnZpY2VzCn0KCi8vIE93bmVyU2VydmljZUNvdW50IHJldHVybnMgaG93IG1hbnkgc2VydmljZXMgYW4gYWRkcmVzcyBjdXJyZW50bHkgaG9sZHMKLy8gYW5kIHRoZSBwZXItb3duZXIgY2FwLgpmdW5jIE93bmVyU2VydmljZUNvdW50KG93bmVyIGFkZHJlc3MpIChjb3VudCwgbGltaXQgaW50KSB7CglyZXR1cm4gb3duZXJTZXJ2aWNlc1tvd25lcl0sIE1heFNlcnZpY2VzUGVyT3duZXIKfQoKLy8gR2V0U2VydmljZSByZXR1cm5zIGEgZm9ybWF0dGVkIHN1bW1hcnkgb2YgYSByZWdpc3RlcmVkIHNlcnZpY2UuIEZyZWUKLy8gdGV4dCBpcyBlc2NhcGVkIGZvciBhIHNpbmdsZS1saW5lIG1hcmtkb3duIHNsb3QuCmZ1bmMgR2V0U2VydmljZShuYW1lIHN0cmluZykgc3RyaW5nIHsKCXN2YyA6PSBtdXN0R2V0KG5hbWUpCgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJOYW1lOiAiICsgc3ZjLk5hbWUgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiT3duZXI6ICIgKyBzdHJpbmcoc3ZjLk93bmVyKSArICJcbiIpCgliLldyaXRlU3RyaW5nKCJQa2dQYXRoOiAiICsgc3ZjLlBrZ1BhdGggKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiVHlwZTogIiArIHN2Yy5TZXJ2aWNlVHlwZSArICJcbiIpCgliLldyaXRlU3RyaW5nKCJEZXNjcmlwdGlvbjogIiArIHNhbml0aXplLklubGluZVRleHQoc3ZjLkRlc2NyaXB0aW9uKSArICJcbiIpCglpZiBzdmMuTWV0YWRhdGEgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoIk1ldGFkYXRhOiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChzdmMuTWV0YWRhdGEpICsgIlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIExpc3RTZXJ2aWNlcyByZXR1cm5zIGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQKLy8gc3RyaW5nIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4KLy8KLy8gQ09TVCBOT1RFOiB0aGlzIGlzIE8oTWF4U2VydmljZXMpIGFuZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHRydW5jYXRlZCDigJQKLy8gYW4gaW50ZWdyYXRvciBlbnVtZXJhdGluZyB0aGUgcmVnaXN0cnkgbmVlZHMgdGhlIGNvbXBsZXRlIHNldCwgYW5kIHRoZQovLyBjYWxsZXIgcGF5cyBmb3IgaXRzIG93biByZWFkLiBSZW5kZXIsIHdob3NlIGNvc3QgbGFuZHMgb24gdGhpcmQtcGFydHkKLy8gdmlld2VycyBpbnN0ZWFkLCBJUyBib3VuZGVkLgpmdW5jIExpc3RTZXJ2aWNlcygpIHN0cmluZyB7CglpZiBsZW4obmFtZXMpID09IDAgewoJCXJldHVybiAibm9uZSIKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4obmFtZXMsICIsICIpCn0KCi8vIExpc3RCeVR5cGUgcmV0dXJucyBhbGwgc2VydmljZSBuYW1lcyBtYXRjaGluZyBhIGdpdmVuIHR5cGUuIFNhbWUgY29zdAovLyBub3RlIGFzIExpc3RTZXJ2aWNlcy4KZnVuYyBMaXN0QnlUeXBlKHNlcnZpY2VUeXBlIHN0cmluZykgc3RyaW5nIHsKCXZhciByZXN1bHQgW11zdHJpbmcKCWZvciBfLCBuYW1lIDo9IHJhbmdlIG5hbWVzIHsKCQlzdmMgOj0gc2VydmljZXNbbmFtZV0KCQlpZiBzdmMgIT0gbmlsICYmIHN2Yy5TZXJ2aWNlVHlwZSA9PSBzZXJ2aWNlVHlwZSB7CgkJCXJlc3VsdCA9IGFwcGVuZChyZXN1bHQsIG5hbWUpCgkJfQoJfQoJaWYgbGVuKHJlc3VsdCkgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXN1bHQsICIsICIpCn0KCi8vIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0KCi8vIFJlbmRlciByZXR1cm5zIGEgbWFya2Rvd24gb3ZlcnZpZXcsIGJvdW5kZWQgdG8gTWF4UmVuZGVyU2VydmljZXMgcm93cwovLyAocGVhcmwgYXVkaXQgWTMpLiBOZXZlciBwYW5pY3MuIEFsbCBmcmVlIHRleHQgZ29lcyB0aHJvdWdoIHRoZQovLyBlY29zeXN0ZW0gc2FuaXRpemVyIHJhdGhlciB0aGFuIGEgYmVzcG9rZSBlc2NhcGVyOiB0aGUgaGFuZC1yb2xsZWQKLy8gcmVwbGFjZW1lbnQgb2YgYmFja3RpY2tzIGFuZCBwaXBlcyBpdCByZXBsYWNlcyBsZWZ0IGBbYCwgYF1gLCBgKGAsCi8vIGApYCBhbmQgYCFgIGxpdmUsIHNvIGFueSByZWdpc3RyYW50IGNvdWxkIGluamVjdCBhIHdvcmtpbmcgbWFya2Rvd24KLy8gbGluayBvciBpbWFnZSBpbnRvIGEgdGFibGUgY2VsbCBhbmQgcGhpc2ggZXZlcnkgdmlld2VyIG9mIHRoaXMgcGFnZS4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cgl0b3RhbCA6PSBsZW4oc2VydmljZXMpCglpZiB0b3RhbCA9PSAwIHsKCQlyZXR1cm4gIiMgU2VydmljZSBSZWdpc3RyeVxuXG5ObyBzZXJ2aWNlcyByZWdpc3RlcmVkLlxuIgoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBTZXJ2aWNlIFJlZ2lzdHJ5XG5cbiIpCgliLldyaXRlU3RyaW5nKCIqKlRvdGFsIHNlcnZpY2VzOioqICIgKyBzdHJjb252Lkl0b2EodG90YWwpICsgIlxuXG4iKQoKCWIuV3JpdGVTdHJpbmcoInwgTmFtZSB8IFR5cGUgfCBQa2dQYXRoIHwgT3duZXIgfCBEZXNjcmlwdGlvbiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiIpCgoJc2hvd24gOj0gMAoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgbmFtZXMgewoJCWlmIHNob3duID49IE1heFJlbmRlclNlcnZpY2VzIHsKCQkJYnJlYWsKCQl9CgkJc3ZjIDo9IHNlcnZpY2VzW25hbWVdCgkJaWYgc3ZjID09IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWRlc2MgOj0gc2FuaXRpemUuVGFibGVDZWxsKHRydW5jYXRlKHN2Yy5EZXNjcmlwdGlvbiwgcmVuZGVyRGVzY0xlbikpCgkJYi5Xcml0ZVN0cmluZygifCAiICsgc3ZjLk5hbWUgKyAiIHwgIiArIHN2Yy5TZXJ2aWNlVHlwZSArICIgfCBgIiArCgkJCXN2Yy5Qa2dQYXRoICsgImAgfCBgIiArIHN0cmluZyhzdmMuT3duZXIpICsgImAgfCAiICsgZGVzYyArICIgfFxuIikKCQlzaG93bisrCgl9CgoJaWYgc2hvd24gPCB0b3RhbCB7CgkJYi5Xcml0ZVN0cmluZygiXG5fU2hvd2luZyAiICsgc3RyY29udi5JdG9hKHNob3duKSArICIgb2YgIiArCgkJCXN0cmNvbnYuSXRvYSh0b3RhbCkgKyAiIHNlcnZpY2VzLiBVc2UgTGlzdFNlcnZpY2VzLCBMaXN0QnlUeXBlICIgKwoJCQkib3IgR2V0U2VydmljZSBmb3IgY29tcGxldGUgZGF0YS5fXG4iKQoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIikKCXJldHVybiBiLlN0cmluZygpCn0KGvnMAQoZc2VydmljZV9yZWdpc3RyeV90ZXN0LmdubxLazAFwYWNrYWdlIHNlcnZpY2VfcmVnaXN0cnkKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKdmFyICgKCW93bmVyICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJvd25lciIpCglhdHRhY2tlciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYXR0YWNrZXIiKQoJbmV3T3duZXIgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoIm5ld293bmVyIikKCXRoaXJkICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJ0aGlyZCIpCikKCmNvbnN0IGdvb2RQYXRoID0gImduby5sYW5kL3IvZGVtby9vcmFjbGUiCgovLyByZXNldFN0YXRlIHJlc2V0cyBhbGwgcGFja2FnZS1sZXZlbCBzdGF0ZSBiZXR3ZWVuIHRlc3RzLgpmdW5jIHJlc2V0U3RhdGUoKSB7CglzZXJ2aWNlcyA9IG1ha2UobWFwW3N0cmluZ10qU2VydmljZSkKCW5hbWVzID0gW11zdHJpbmd7fQoJcmV0aXJlZCA9IG1ha2UobWFwW3N0cmluZ10qUmVzZXJ2YXRpb24pCglvd25lclNlcnZpY2VzID0gbWFrZShtYXBbYWRkcmVzc11pbnQpCglwZW5kaW5nT3duZXJzID0gbWFrZShtYXBbc3RyaW5nXWFkZHJlc3MpCn0KCmZ1bmMgcmVnaXN0ZXIoY3VyIHJlYWxtLCBuYW1lIHN0cmluZykgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgbmFtZSwgZ29vZFBhdGgsICJhIHByaWNlIG9yYWNsZSIsICJvcmFjbGUiLCAiIikKfQoKLy8gZmlsbEZvciByZWdpc3RlcnMgbiBzZXJ2aWNlcyBmb3Igb25lIGFkZHJlc3MgdW5kZXIgYSBuYW1lIHByZWZpeC4KLy8KLy8gTk9URTogdGVzdGluZy5TZXRSZWFsbSBpcyBGUkFNRS1zY29wZWQg4oCUIHRoZSBjYWxsZXIgcmVhbG0gc2V0IGhlcmUgZG9lcwovLyBub3Qgc3Vydml2ZSB0aGUgcmV0dXJuLCBzbyBhIGNhbGxlciB0aGF0IG5lZWRzIGEgc3BlY2lmaWMgaWRlbnRpdHkKLy8gYWZ0ZXJ3YXJkcyBtdXN0IHNldCBpdCBhZ2FpbiBpdHNlbGYuCmZ1bmMgZmlsbEZvcihjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBwcmVmaXggc3RyaW5nLCBuIGludCkgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh3aG8pKQoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksIHByZWZpeCtzdHJjb252Lkl0b2EoaSksIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikKCX0KfQoKLy8gaGFuZE9mZiBydW5zIGEgQ09NUExFVEUgdHdvLXN0ZXAgb3duZXJzaGlwIHRyYW5zZmVyOiB0aGUgc2l0dGluZyBvd25lcgovLyBub21pbmF0ZXMsIHRoZSBub21pbmVlIGNvbnNlbnRzLiBPd25lcnNoaXAgZG9lcyBub3QgbW92ZSB1bnRpbCB0aGUKLy8gc2Vjb25kIGNhbGwgKHBlYXJsIGF1ZGl0IFk0KS4KZnVuYyBoYW5kT2ZmKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgbmFtZSBzdHJpbmcpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBuYW1lLCB0bykKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odG8pKQoJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIG5hbWUpCn0KCmZ1bmMgcXVvdGFNc2coKSBzdHJpbmcgewoJcmV0dXJuICJhZGRyZXNzIGFscmVhZHkgaG9sZHMgdGhlIG1heGltdW0gb2YgIiArCgkJc3RyY29udi5JdG9hKE1heFNlcnZpY2VzUGVyT3duZXIpICsgIiBzZXJ2aWNlcyIKfQoKLy8gLS0tLS0tLS0tLSBSZWdpc3RlclNlcnZpY2UgLS0tLS0tLS0tLQoKZnVuYyBUZXN0UmVnaXN0ZXJfQmFzaWMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCAicHJpY2Vfb3JhY2xlIikKCglzdmMgOj0gc2VydmljZXNbInByaWNlX29yYWNsZSJdCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhvd25lciksIHN0cmluZyhzdmMuT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBnb29kUGF0aCwgc3ZjLlBrZ1BhdGgpCgl1YXNzZXJ0LkVxdWFsKHQsICJvcmFjbGUiLCBzdmMuU2VydmljZVR5cGUpCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyX0R1cGxpY2F0ZVJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic2VydmljZSBhbHJlYWR5IHJlZ2lzdGVyZWQ6IHByaWNlX29yYWNsZSIsCgkJZnVuYygpIHsgUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBnb29kUGF0aCwgIm1pbmUgbm93IiwgIm9yYWNsZSIsICIiKSB9LAoJKQp9CgpmdW5jIFRlc3RSZWdpc3Rlcl9OYW1lVmFsaWRhdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCglmb3IgXywgYmFkIDo9IHJhbmdlIFtdc3RyaW5neyIiLCAiVXBwZXIiLCAiaGFzIHNwYWNlIiwgInNlbWk7Y29sb24iLCBzdHJpbmdzLlJlcGVhdCgiYSIsIE1heE5hbWVMZW4rMSl9IHsKCQl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwKCQkJIm5hbWUgbXVzdCBiZSIsCgkJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCBiYWQsIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikgfSwKCQkpCgl9Cn0KCmZ1bmMgVGVzdFJlZ2lzdGVyX1BrZ1BhdGhWYWxpZGF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGtncGF0aCBtdXN0IG5vdCBiZSBlbXB0eSIsCgkJZnVuYygpIHsgUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJzdmMiLCAiIiwgImQiLCAib3JhY2xlIiwgIiIpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInBrZ3BhdGggbXVzdCBzdGFydCB3aXRoIiwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2YyIsICJleGFtcGxlLmNvbS9yL3giLCAiZCIsICJvcmFjbGUiLCAiIikgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicGtncGF0aCBtdXN0IGJlIGduby5sYW5kL3IvIiwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2YyIsICJnbm8ubGFuZC8iLCAiZCIsICJvcmFjbGUiLCAiIikgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiaW52YWxpZCBwa2dwYXRoIGVsZW1lbnQiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAic3ZjIiwgImduby5sYW5kL3IveHx5IiwgImQiLCAib3JhY2xlIiwgIiIpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgInBrZ3BhdGggZXhjZWVkcyIsCgkJZnVuYygpIHsKCQkJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJzdmMiLCAiZ25vLmxhbmQvci8iK3N0cmluZ3MuUmVwZWF0KCJhIiwgTWF4UGtnUGF0aExlbiksICJkIiwgIm9yYWNsZSIsICIiKQoJCX0pCn0KCmZ1bmMgVGVzdFJlZ2lzdGVyX0ZpZWxkVmFsaWRhdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImRlc2NyaXB0aW9uIG11c3Qgbm90IGJlIGVtcHR5IiwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2YyIsIGdvb2RQYXRoLCAiIiwgIm9yYWNsZSIsICIiKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJkZXNjcmlwdGlvbiBleGNlZWRzIiwKCQlmdW5jKCkgewoJCQlSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2YyIsIGdvb2RQYXRoLCBzdHJpbmdzLlJlcGVhdCgiZCIsIE1heERlc2NyaXB0aW9uTGVuKzEpLCAib3JhY2xlIiwgIiIpCgkJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic2VydmljZSB0eXBlIG11c3Qgbm90IGJlIGVtcHR5IiwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2YyIsIGdvb2RQYXRoLCAiZCIsICIiLCAiIikgfSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAic2VydmljZSB0eXBlIG11c3QgYmUiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAic3ZjIiwgZ29vZFBhdGgsICJkIiwgIkJhZHxUeXBlIiwgIiIpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgIm1ldGFkYXRhIGV4Y2VlZHMiLAoJCWZ1bmMoKSB7CgkJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAic3ZjIiwgZ29vZFBhdGgsICJkIiwgIm9yYWNsZSIsIHN0cmluZ3MuUmVwZWF0KCJtIiwgTWF4TWV0YWRhdGFMZW4rMSkpCgkJfSkKfQoKLy8gLS0tLS0tLS0tLSBEZXJlZ2lzdGVyICsgc3F1YXQgcHJvdGVjdGlvbiAtLS0tLS0tLS0tCgpmdW5jIFRlc3REZXJlZ2lzdGVyX05hbWVTdGF5c1Jlc2VydmVkRm9yT3duZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCAicHJpY2Vfb3JhY2xlIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCURlcmVnaXN0ZXIoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic2VydmljZSBub3QgZm91bmQ6IHByaWNlX29yYWNsZSIsCgkJZnVuYygpIHsgUmVzb2x2ZSgicHJpY2Vfb3JhY2xlIikgfSwKCSkKCgkvLyB0aGUgc3F1YXQgdGhlIGF1ZGl0IGZvdW5kOiBhdHRhY2tlciByZS1yZWdpc3RlcnMgdGhlIGZyZWVkIG5hbWUKCS8vIGFuZCBpbmhlcml0cyBldmVyeSBpbnRlZ3JhdG9yIHN0aWxsIHJlc29sdmluZyBpdCDigJQgbXVzdCBiZSBibG9ja2VkCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJuYW1lIGlzIHJlc2VydmVkIGZvciBpdHMgZm9ybWVyIG93bmVyOiBwcmljZV9vcmFjbGUiLAoJCWZ1bmMoKSB7CgkJCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgImduby5sYW5kL3IvZXZpbC9vcmFjbGUiLCAidHJ1c3QgbWUiLCAib3JhY2xlIiwgIiIpCgkJfSwKCSkKCgkvLyB0aGUgZm9ybWVyIG93bmVyIGNhbiByZS1yZWdpc3RlciBpdAoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsIGdvb2RQYXRoLCAiYmFjayBhZ2FpbiIsICJvcmFjbGUiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgZ29vZFBhdGgsIFJlc29sdmUoInByaWNlX29yYWNsZSIpKQp9CgpmdW5jIFRlc3REZXJlZ2lzdGVyX093bmVyT25seShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsICJwcmljZV9vcmFjbGUiKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm9ubHkgdGhlIG93bmVyIGNhbiBkZXJlZ2lzdGVyIiwKCQlmdW5jKCkgeyBEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9LAoJKQp9CgovLyAtLS0tLS0tLS0tIFVwZGF0ZVNlcnZpY2UgLyBUcmFuc2Zlck93bmVyc2hpcCAtLS0tLS0tLS0tCgpmdW5jIFRlc3RVcGRhdGVfT3duZXJPbmx5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgb3duZXIgY2FuIHVwZGF0ZSB0aGlzIHNlcnZpY2UiLAoJCWZ1bmMoKSB7IFVwZGF0ZVNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsICJnbm8ubGFuZC9yL2V2aWwvb3JhY2xlIiwgImhpamFja2VkIiwgIm9yYWNsZSIsICIiKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJVXBkYXRlU2VydmljZShjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgImduby5sYW5kL3IvZGVtby9vcmFjbGVfdjIiLCAidjIiLCAib3JhY2xlIiwgIms9diIpCgl1YXNzZXJ0LkVxdWFsKHQsICJnbm8ubGFuZC9yL2RlbW8vb3JhY2xlX3YyIiwgUmVzb2x2ZSgicHJpY2Vfb3JhY2xlIikpCn0KCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgb3duZXIgY2FuIHRyYW5zZmVyIG93bmVyc2hpcCIsCgkJZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsIGF0dGFja2VyKSB9LAoJKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImludmFsaWQgbmV3IG93bmVyIGFkZHJlc3M6IGp1bmsiLAoJCWZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBhZGRyZXNzKCJqdW5rIikpIH0sCgkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkibmV3IG93bmVyIGlzIGFscmVhZHkgdGhlIG93bmVyIiwKCQlmdW5jKCkgeyBUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgb3duZXIpIH0sCgkpCgoJaGFuZE9mZihjdXIsIG93bmVyLCBuZXdPd25lciwgInByaWNlX29yYWNsZSIpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhuZXdPd25lciksIHN0cmluZyhHZXRPd25lcigicHJpY2Vfb3JhY2xlIikpKQoKCS8vIHRoZSBuZXcgb3duZXIgY29udHJvbHMgdGhlIGVudHJ5IG5vdwoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShuZXdPd25lcikpCglVcGRhdGVTZXJ2aWNlKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBnb29kUGF0aCwgInVuZGVyIG5ldyBtYW5hZ2VtZW50IiwgIm9yYWNsZSIsICIiKQp9CgovLyAtLS0tLS0tLS0tIHF1ZXJpZXMgLS0tLS0tLS0tLQoKZnVuYyBUZXN0UmVzb2x2ZV9Vbmtub3duUGFuaWNzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic2VydmljZSBub3QgZm91bmQ6IGdob3N0IiwKCQlmdW5jKCkgeyBSZXNvbHZlKCJnaG9zdCIpIH0sCgkpCn0KCmZ1bmMgVGVzdExpc3RTZXJ2aWNlc19BbmRfQnlUeXBlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJhbHBoYSIsIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAiYmV0YSIsIGdvb2RQYXRoLCAiZCIsICJkZXgiLCAiIikKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAiZ2FtbWEiLCBnb29kUGF0aCwgImQiLCAib3JhY2xlIiwgIiIpCgoJdWFzc2VydC5FcXVhbCh0LCAiYWxwaGEsIGJldGEsIGdhbW1hIiwgTGlzdFNlcnZpY2VzKCkpCgl1YXNzZXJ0LkVxdWFsKHQsICJhbHBoYSwgZ2FtbWEiLCBMaXN0QnlUeXBlKCJvcmFjbGUiKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBMaXN0QnlUeXBlKCJicmlkZ2UiKSkKfQoKZnVuYyBUZXN0R2V0U2VydmljZV9TdW1tYXJ5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJb3V0IDo9IEdldFNlcnZpY2UoInByaWNlX29yYWNsZSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJQa2dQYXRoOiAiK2dvb2RQYXRoKSwgInN1bW1hcnkgbXVzdCBpbmNsdWRlIHBrZ3BhdGgiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBzdHJpbmcob3duZXIpKSwgInN1bW1hcnkgbXVzdCBpbmNsdWRlIG93bmVyIikKfQoKLy8gLS0tLS0tLS0tLSByZW5kZXIgLS0tLS0tLS0tLQoKZnVuYyBUZXN0UmVuZGVyX0VtcHR5U3RhdGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdWFzc2VydC5FcXVhbCh0LCAiIyBTZXJ2aWNlIFJlZ2lzdHJ5XG5cbk5vIHNlcnZpY2VzIHJlZ2lzdGVyZWQuXG4iLCBSZW5kZXIoIiIpKQp9CgpmdW5jIFRlc3RSZW5kZXJfU2FuaXRpemVzSW5qZWN0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJzbmVha3kiLCBnb29kUGF0aCwKCQkiZGVzY2AgfCBmYWtlIHwgcm93XG5pbmplY3RlZCIsICJvcmFjbGUiLCAiIikKCglvdXQgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgImRlc2NgIiksICJiYWNrdGlja3MgbXVzdCBiZSBzYW5pdGl6ZWQiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInwgZmFrZSB8IiksICJwaXBlcyBtdXN0IGJlIHNhbml0aXplZCIpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCAiXG5pbmplY3RlZCIpLCAibmV3bGluZXMgbXVzdCBiZSBzYW5pdGl6ZWQiKQp9CgpmdW5jIFRlc3RSZW5kZXJfTGlzdHNFbnRyaWVzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgInByaWNlX29yYWNsZSIpLCAicmVuZGVyIG11c3QgbGlzdCB0aGUgc2VydmljZSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsIGdvb2RQYXRoKSwgInJlbmRlciBtdXN0IHNob3cgdGhlIHBrZ3BhdGgiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIlNob3dpbmciKSwKCQkiYSBzaG9ydCByZWdpc3RyeSBtdXN0IG5vdCBjYXJyeSBhIHRydW5jYXRpb24gbm90aWNlIikKfQoKLy8gLS0tLS0tLS0tLSByZS1hdWRpdCByZWdyZXNzaW9ucyAoMjAyNi0wOS0wMikgLS0tLS0tLS0tLQoKLy8gc2tpcFNlY29uZHMgYWR2YW5jZXMgY2hhaW4gdGltZSAoNXMgcGVyIGhlaWdodCkuCmZ1bmMgc2tpcFNlY29uZHMoc2VjIGludDY0KSB7Cgl0ZXN0aW5nLlNraXBIZWlnaHRzKChzZWMgKyA0KSAvIDUpCn0KCmZ1bmMgVGVzdFJlc2VydmF0aW9uX0V4cGlyZXNBbmRGcmVlc1RoZU5hbWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCAicHJpY2Vfb3JhY2xlIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJRGVyZWdpc3Rlcihjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIikKCgkvLyByZS1hdWRpdCBQMTogZXRlcm5hbCB0b21ic3RvbmVzIGxldCBhbiBhdHRhY2tlciBsb2NrIHRoZSBuYW1lc3BhY2UKCS8vIGZvcmV2ZXI7IHdpdGhpbiB0aGUgd2luZG93IHRoZSBuYW1lIHN0YXlzIHJlc2VydmVkLi4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJuYW1lIGlzIHJlc2VydmVkIGZvciBpdHMgZm9ybWVyIG93bmVyOiBwcmljZV9vcmFjbGUiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgImduby5sYW5kL3IvZXZpbC9vcmFjbGUiLCAiZCIsICJvcmFjbGUiLCAiIikgfSwKCSkKCgkvLyAuLi5idXQgYWZ0ZXIgUmVzZXJ2YXRpb25QZXJpb2QgaXQgZnJlZXMgZm9yIGFueW9uZS4KCS8vIFNraXBIZWlnaHRzIHJlc2V0cyB0aGUgd2hvbGUgdGVzdCBjb250ZXh0LCBzbyB0aGUgY2FsbGVyIHJlYWxtIGhhcwoJLy8gdG8gYmUgcmUtYXJtZWQgYWZ0ZXIgdGhlIGp1bXAuCglza2lwU2Vjb25kcyhSZXNlcnZhdGlvblBlcmlvZCArIDEwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsICJnbm8ubGFuZC9yL290aGVyL29yYWNsZSIsICJkIiwgIm9yYWNsZSIsICIiKQoJdWFzc2VydC5FcXVhbCh0LCAiZ25vLmxhbmQvci9vdGhlci9vcmFjbGUiLCBSZXNvbHZlKCJwcmljZV9vcmFjbGUiKSkKCgkvLyBhIExBUFNFRCByZXNlcnZhdGlvbiBjb25mZXJzIG5vdGhpbmc6IHRoZSBuZXcgcmVnaXN0cmFudCBpcyBzdGFtcGVkCgkvLyBhcyByZWdpc3RyYW50LCBhbmQgdGhlIGRlYWQgdG9tYnN0b25lIGlzIHJlY2xhaW1lZAoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcoYXR0YWNrZXIpLCBzdHJpbmcoc2VydmljZXNbInByaWNlX29yYWNsZSJdLlJlZ2lzdHJhbnQpLAoJCSJhIGxhcHNlZCByZXNlcnZhdGlvbiBtdXN0IG5vdCBwcmVzZXJ2ZSB0aGUgb2xkIHJlZ2lzdHJhbnQiKQoJXywgc3RpbGxSZXRpcmVkIDo9IHJldGlyZWRbInByaWNlX29yYWNsZSJdCgl1YXNzZXJ0LkZhbHNlKHQsIHN0aWxsUmV0aXJlZCwgImEgbGFwc2VkIHRvbWJzdG9uZSBtdXN0IGJlIHJlY2xhaW1lZCIpCn0KCmZ1bmMgVGVzdFJlc2VydmF0aW9uX09yaWdpbmFsUmVnaXN0cmFudENhblJlY2xhaW0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJcmVnaXN0ZXIoY3VyLCAicHJpY2Vfb3JhY2xlIikKCgkvLyByZS1hdWRpdCBQMjogaG9zdGlsZSB0cmFuc2ZlcmVlIGRlcmVnaXN0ZXJzIOKAlCB0aGUgT1JJR0lOQUwKCS8vIHJlZ2lzdHJhbnQgY2FuIHN0aWxsIHJlY2xhaW0gZHVyaW5nIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cKCWhhbmRPZmYoY3VyLCBvd25lciwgYXR0YWNrZXIsICJwcmljZV9vcmFjbGUiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCglEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBnb29kUGF0aCwgInJlY2xhaW1lZCIsICJvcmFjbGUiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG93bmVyKSwgc3RyaW5nKHNlcnZpY2VzWyJwcmljZV9vcmFjbGUiXS5Pd25lcikpCn0KCmZ1bmMgVGVzdFBrZ1BhdGhfU3RydWN0dXJhbFZhbGlkYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJLy8gcmUtYXVkaXQgUDM6IHRyYXZlcnNhbCwgZG91YmxlZCBzbGFzaGVzLCB0cmFpbGluZyBzbGFzaCwgaHlwaGVucywKCS8vIGFuZCBub24tci9wIHJvb3RzIG11c3QgYWxsIGJlIHJlZnVzZWQKCWJhZCA6PSBbXXN0cmluZ3sKCQkiZ25vLmxhbmQvci8uLi8uLi9ldGMvcGFzc3dkIiwKCQkiZ25vLmxhbmQvL3IvL2RlbW8vL29yYWNsZSIsCgkJImduby5sYW5kL3IvZGVtby9vcmFjbGUvIiwKCQkiZ25vLmxhbmQvci9kZS1tby9vcmFjbGUiLAoJCSJnbm8ubGFuZC94L2RlbW8vb3JhY2xlIiwKCQkiZ25vLmxhbmQvLiIsCgl9Cglmb3IgXywgcCA6PSByYW5nZSBiYWQgewoJCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAicGtncGF0aCIsCgkJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAic3ZjIiwgcCwgImQiLCAib3JhY2xlIiwgIiIpIH0pCgl9CgkvLyBsZWdpdGltYXRlIHIvIGFuZCBwLyBwYXRocyBzdGlsbCBwYXNzCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInN2Y19yIiwgImduby5sYW5kL3IvZGVtby9vcmFjbGVfdjIiLCAiZCIsICJvcmFjbGUiLCAiIikKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAic3ZjX3AiLCAiZ25vLmxhbmQvcC9udC9hdmwiLCAiZCIsICJvcmFjbGUiLCAiIikKfQoKZnVuYyBUZXN0VHJ5UmVzb2x2ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsICJwcmljZV9vcmFjbGUiKQoKCWdvdCwgb2sgOj0gVHJ5UmVzb2x2ZSgicHJpY2Vfb3JhY2xlIikKCXVhc3NlcnQuVHJ1ZSh0LCBvaywgImtub3duIG5hbWUgbXVzdCByZXNvbHZlIikKCXVhc3NlcnQuRXF1YWwodCwgZ29vZFBhdGgsIGdvdCkKCglfLCBvayA9IFRyeVJlc29sdmUoImdob3N0IikKCXVhc3NlcnQuRmFsc2UodCwgb2ssICJ1bmtub3duIG5hbWUgbXVzdCByZXR1cm4gb2s9ZmFsc2UsIG5ldmVyIHBhbmljIikKfQoKLy8gLS0tLS0tLS0tLSByb3VuZC0zIGF1ZGl0IHJlZ3Jlc3Npb25zICgyMDI2LTA5LTAyKSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RSZXNlcnZhdGlvbl9SZWdpc3RyYW50U3Vydml2ZXNIb3N0aWxlUmVjeWNsZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsICJwcmljZV9vcmFjbGUiKQoKCS8vIHJvdW5kLTMgUDI6IGhvc3RpbGUgdHJhbnNmZXJlZSBkZXJlZ2lzdGVycyBhbmQgSU5TVEFOVExZCgkvLyByZS1yZWdpc3RlcnMg4oCUIHRoZSBvcmlnaW5hbCByZWdpc3RyYW50IG11c3Qgc3Vydml2ZSB0aGUgcmVjeWNsZQoJaGFuZE9mZihjdXIsIG93bmVyLCBhdHRhY2tlciwgInByaWNlX29yYWNsZSIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCURlcmVnaXN0ZXIoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIpCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsICJnbm8ubGFuZC9yL2V2aWwvb3JhY2xlIiwgIm1pbmUiLCAib3JhY2xlIiwgIiIpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhvd25lciksIHN0cmluZyhzZXJ2aWNlc1sicHJpY2Vfb3JhY2xlIl0uUmVnaXN0cmFudCksCgkJImluLXdpbmRvdyByZS1yZWdpc3RlciBtdXN0IHByZXNlcnZlIHRoZSBvcmlnaW5hbCByZWdpc3RyYW50IikKCgkvLyBzbyB3aGVuIHRoZSBhdHRhY2tlciBhYmFuZG9ucyBhZ2FpbiwgdGhlIG9yaWdpbmFsIGNhbiBzdGlsbCByZWNsYWltCglEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsIGdvb2RQYXRoLCAicmVjbGFpbWVkIiwgIm9yYWNsZSIsICIiKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcob3duZXIpLCBzdHJpbmcoc2VydmljZXNbInByaWNlX29yYWNsZSJdLk93bmVyKSkKfQoKZnVuYyBUZXN0UGtnUGF0aF9QaW5uZWRCZWhhdmlvcnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJLy8gcm91bmQtMyBwaW5zOiB0b3AtbGV2ZWwgcmVhbG0gcGF0aCBhY2NlcHRlZDsgZGlnaXQtbGVhZGluZyBlbGVtZW50CgkvLyBhbmQgdXBwZXJjYXNlIHByZWZpeCByZWplY3RlZAoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJ0b3BsZXZlbCIsICJnbm8ubGFuZC9yL3giLCAiZCIsICJvcmFjbGUiLCAiIikKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiaW52YWxpZCBwa2dwYXRoIGVsZW1lbnQiLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAiZGlnaXRzIiwgImduby5sYW5kL3IvOWFiYyIsICJkIiwgIm9yYWNsZSIsICIiKSB9KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJwa2dwYXRoIG11c3Qgc3RhcnQgd2l0aCIsCgkJZnVuYygpIHsgUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJ1cHBlciIsICJHTk8uTEFORC9yL2RlbW8veCIsICJkIiwgIm9yYWNsZSIsICIiKSB9KQp9CgovLyAtLS0tLS0tLS0tIHBlYXJsIGF1ZGl0IHJlZ3Jlc3Npb25zICgyMDI2LTA5LTIxKSAtLS0tLS0tLS0tCgovLyBSMTogb25lIGZ1bmRlZCBrZXkgY291bGQgcHJldmlvdXNseSBjbGFpbSB0aGUgRU5USVJFIG5hbWVzcGFjZSwgc2luY2UKLy8gdGhlIG9ubHkgYm91bmQgd2FzIHRoZSBnbG9iYWwgTWF4U2VydmljZXMuIFRoZSBwZXItb3duZXIgY2FwIG1ha2VzIGEKLy8gbmFtZXNwYWNlIHN3ZWVwIGNvc3QgTWF4U2VydmljZXMvTWF4U2VydmljZXNQZXJPd25lciBkaXN0aW5jdCBmdW5kZWQKLy8gYWRkcmVzc2VzIGluc3RlYWQgb2Ygb25lLgpmdW5jIFRlc3RSZWdpc3Rlcl9QZXJPd25lclF1b3RhKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCWZpbGxGb3IoY3VyLCBvd25lciwgInN2YyIsIE1heFNlcnZpY2VzUGVyT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkgLy8gZmlsbEZvcidzIHJlYWxtIGlzIGZyYW1lLXNjb3BlZAoKCW4sIGxpbWl0IDo9IE93bmVyU2VydmljZUNvdW50KG93bmVyKQoJdWFzc2VydC5FcXVhbCh0LCBNYXhTZXJ2aWNlc1Blck93bmVyLCBuKQoJdWFzc2VydC5FcXVhbCh0LCBNYXhTZXJ2aWNlc1Blck93bmVyLCBsaW1pdCkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgcXVvdGFNc2coKSwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgIm9uZV9tb3JlIiwgZ29vZFBhdGgsICJkIiwgIm9yYWNsZSIsICIiKSB9KQoKCS8vIGEgRElGRkVSRU5UIGFkZHJlc3MgaXMgY29tcGxldGVseSB1bmFmZmVjdGVkIOKAlCB0aGUgY2FwIGlzIHBlci1vd25lciwKCS8vIG5vdCBhIGdsb2JhbCBmcmVlemUKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJvbmVfbW9yZSIsIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgZ29vZFBhdGgsIFJlc29sdmUoIm9uZV9tb3JlIikpCgoJLy8gZnJlZWluZyBhIHNsb3QgcmVzdG9yZXMgaGVhZHJvb20KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJRGVyZWdpc3Rlcihjcm9zcyhjdXIpLCAic3ZjMCIpCgluLCBfID0gT3duZXJTZXJ2aWNlQ291bnQob3duZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIE1heFNlcnZpY2VzUGVyT3duZXItMSwgbikKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAiZnJlc2hfbmFtZSIsIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikKCW4sIF8gPSBPd25lclNlcnZpY2VDb3VudChvd25lcikKCXVhc3NlcnQuRXF1YWwodCwgTWF4U2VydmljZXNQZXJPd25lciwgbikKfQoKLy8gVGhlIHF1b3RhIGluZGV4IG11c3Qgbm90IGFjY3VtdWxhdGUgZGVhZCBrZXlzOiBhbiBvd25lciB0aGF0IGRyb3BzIHRvCi8vIHplcm8gaXMgZGVsZXRlZCBvdXRyaWdodC4KZnVuYyBUZXN0UXVvdGFfSW5kZXhTdGF5c1plcm9GcmVlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInNvbG8iKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBsZW4ob3duZXJTZXJ2aWNlcykpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJzb2xvIikKCW4sIF8gOj0gT3duZXJTZXJ2aWNlQ291bnQob3duZXIpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIG4pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihvd25lclNlcnZpY2VzKSwgImEgemVyb2VkIG93bmVyIG11c3QgbGVhdmUgbm8ga2V5IGJlaGluZCIpCn0KCi8vIFRoZSBnbG9iYWwgY2FwIHN0aWxsIGJhY2tzdG9wcyB0aGUgcGVyLW93bmVyIGNhcC4gUmVhY2hpbmcgaXQgdGhyb3VnaAovLyB0aGUgcHVibGljIEFQSSB3b3VsZCB0YWtlIE1heFNlcnZpY2VzL01heFNlcnZpY2VzUGVyT3duZXIgZGlzdGluY3QKLy8gZnVuZGVkIGFkZHJlc3Nlcywgc28gdGhlIHN0YXRlIGlzIHN0YWdlZCBkaXJlY3RseSAodGhpcyB0ZXN0IGlzCi8vIGluLXBhY2thZ2UpIGFuZCBvbmx5IHRoZSBndWFyZCBpcyBleGVyY2lzZWQuCmZ1bmMgVGVzdFJlZ2lzdGVyX0dsb2JhbENhcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglmb3IgaSA6PSAwOyBpIDwgTWF4U2VydmljZXM7IGkrKyB7CgkJbiA6PSAicGFkIiArIHN0cmNvbnYuSXRvYShpKQoJCXNlcnZpY2VzW25dID0gJlNlcnZpY2V7CgkJCU5hbWU6IG4sIE93bmVyOiBhdHRhY2tlciwgUmVnaXN0cmFudDogYXR0YWNrZXIsCgkJCVBrZ1BhdGg6IGdvb2RQYXRoLCBEZXNjcmlwdGlvbjogImQiLCBTZXJ2aWNlVHlwZTogIm9yYWNsZSIsCgkJfQoJCW5hbWVzID0gYXBwZW5kKG5hbWVzLCBuKQoJfQoJY291bnQsIGxpbWl0IDo9IFNlcnZpY2VDb3VudCgpCgl1YXNzZXJ0LkVxdWFsKHQsIE1heFNlcnZpY2VzLCBjb3VudCkKCXVhc3NlcnQuRXF1YWwodCwgTWF4U2VydmljZXMsIGxpbWl0KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJnbG9iYWwgc2VydmljZSBsaW1pdCByZWFjaGVkIiwKCQlmdW5jKCkgeyBSZWdpc3RlclNlcnZpY2UoY3Jvc3MoY3VyKSwgIm9uZV9tb3JlIiwgZ29vZFBhdGgsICJkIiwgIm9yYWNsZSIsICIiKSB9KQp9CgovLyBZMjogdGhpcyByZWFsbSBob2xkcyBubyBiYW5rZXIgYW5kIGV4cG9zZXMgbm8gd2l0aGRyYXdhbCBwYXRoLCBzbyBjb2lucwovLyBhdHRhY2hlZCB0byBhbnkgZW50cnlwb2ludCB3b3VsZCBzdHJhbmQgYXQgdGhlIHJlYWxtIGFkZHJlc3MgZm9yZXZlci4KLy8gRXZlcnkgY3Jvc3NpbmcgZnVuY3Rpb24gbXVzdCBhYm9ydCwgd2hpY2ggcmV2ZXJ0cyB0aGUgdHJhbnNmZXIuCmZ1bmMgVGVzdFN0cmF5U2VuZFJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBuZXdPd25lcikKCgltc2cgOj0gInRoaXMgcmVhbG0gZG9lcyBub3QgYWNjZXB0IGNvaW5zIgoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogInVnbm90IiwgQW1vdW50OiA1fX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLAoJCWZ1bmMoKSB7IFJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAicGFpZCIsIGdvb2RQYXRoLCAiZCIsICJvcmFjbGUiLCAiIikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csCgkJZnVuYygpIHsgVXBkYXRlU2VydmljZShjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgZ29vZFBhdGgsICJwYWlkIiwgIm9yYWNsZSIsICIiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywKCQlmdW5jKCkgeyBUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgdGhpcmQpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLAoJCWZ1bmMoKSB7IENhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIG1zZywKCQlmdW5jKCkgeyBEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogInVnbm90IiwgQW1vdW50OiA1fX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLAoJCWZ1bmMoKSB7IEFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIikgfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgoJLy8gbm90aGluZyB3YXMgbXV0YXRlZCBieSBhbnkgb2YgdGhlIHJlamVjdGVkIGNhbGxzCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhvd25lciksIHN0cmluZyhHZXRPd25lcigicHJpY2Vfb3JhY2xlIikpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcobmV3T3duZXIpLCBHZXRQZW5kaW5nT3duZXIoInByaWNlX29yYWNsZSIpKQoJdWFzc2VydC5FcXVhbCh0LCAiYSBwcmljZSBvcmFjbGUiLCBzZXJ2aWNlc1sicHJpY2Vfb3JhY2xlIl0uRGVzY3JpcHRpb24pCglfLCBvayA6PSBUcnlSZXNvbHZlKCJwYWlkIikKCXVhc3NlcnQuRmFsc2UodCwgb2ssICJhIHJlamVjdGVkIHJlZ2lzdHJhdGlvbiBtdXN0IG5vdCBzdGljayIpCn0KCi8vIFkzOiBSZW5kZXIgaXMgcmVhY2hhYmxlIGJ5IGFueSB2aWV3ZXIsIHNvIGl0cyBjb3N0IGxhbmRzIG9uIHRoaXJkCi8vIHBhcnRpZXMgcmF0aGVyIHRoYW4gb24gd2hvZXZlciBncmV3IHRoZSBzdGF0ZS4gSXQgbXVzdCBiZSBib3VuZGVkIGFuZAovLyBtdXN0IHNheSBzby4KZnVuYyBUZXN0UmVuZGVyX0JvdW5kZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJZmlsbEZvcihjdXIsIG93bmVyLCAiYSIsIE1heFNlcnZpY2VzUGVyT3duZXIpCglleHRyYSA6PSBNYXhSZW5kZXJTZXJ2aWNlcyAtIE1heFNlcnZpY2VzUGVyT3duZXIgKyAxCglmaWxsRm9yKGN1ciwgYXR0YWNrZXIsICJiIiwgZXh0cmEpCgoJdG90YWwgOj0gTWF4U2VydmljZXNQZXJPd25lciArIGV4dHJhCgljb3VudCwgXyA6PSBTZXJ2aWNlQ291bnQoKQoJdWFzc2VydC5FcXVhbCh0LCB0b3RhbCwgY291bnQpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgIioqVG90YWwgc2VydmljZXM6KiogIitzdHJjb252Lkl0b2EodG90YWwpKSwKCQkidGhlIGhlYWRlciBtdXN0IHJlcG9ydCB0aGUgVFJVRSB0b3RhbCwgbm90IHRoZSByZW5kZXJlZCBjb3VudCIpCgl1YXNzZXJ0LkVxdWFsKHQsIE1heFJlbmRlclNlcnZpY2VzLCBzdHJpbmdzLkNvdW50KG91dCwgImAiK2dvb2RQYXRoKyJgIiksCgkJImV4YWN0bHkgTWF4UmVuZGVyU2VydmljZXMgcm93cyBtYXkgYmUgZW1pdHRlZCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsCgkJIl9TaG93aW5nICIrc3RyY29udi5JdG9hKE1heFJlbmRlclNlcnZpY2VzKSsiIG9mICIrc3RyY29udi5JdG9hKHRvdGFsKSsiIHNlcnZpY2VzLiIpLAoJCSJhIHRydW5jYXRlZCByZW5kZXIgbXVzdCBkaXNjbG9zZSB0aGUgdHJ1bmNhdGlvbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJVc2UgTGlzdFNlcnZpY2VzLCBMaXN0QnlUeXBlIG9yIEdldFNlcnZpY2UiKSwKCQkidGhlIG5vdGljZSBtdXN0IG5hbWUgdGhlIHVuYm91bmRlZCBxdWVyaWVzIikKfQoKLy8gWTU6IHRoZSBoYW5kLXJvbGxlZCBzYW5pdGl6ZXIgcmVwbGFjZWQgb25seSBiYWNrdGlja3MgYW5kIHBpcGVzLCBsZWF2aW5nCi8vIGBbYCwgYF1gLCBgKGAsIGApYCBhbmQgYCFgIGxpdmUg4oCUIHNvIGFueSByZWdpc3RyYW50IGNvdWxkIGluamVjdCBhCi8vIHdvcmtpbmcgbWFya2Rvd24gbGluayBvciBpbWFnZSBpbnRvIGEgdGFibGUgY2VsbCBhbmQgcGhpc2ggZXZlcnkgdmlld2VyLgpmdW5jIFRlc3RSZW5kZXJfUmVqZWN0c01hcmtkb3duTGlua0luamVjdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAicGhpc2giLCBnb29kUGF0aCwKCQkiY2xhaW0gW2hlcmVdKGh0dHBzOi8vZXZpbC5leGFtcGxlL2RyYWluKSIsICJvcmFjbGUiLCAiIikKCVJlZ2lzdGVyU2VydmljZShjcm9zcyhjdXIpLCAidHJhY2tlciIsIGdvb2RQYXRoLAoJCSIhW3hdKGh0dHBzOi8vZXZpbC5leGFtcGxlL3BpeGVsLnBuZykiLCAib3JhY2xlIiwgIiIpCgoJb3V0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJdKCIpLAoJCSJubyBsaXZlIG1hcmtkb3duIGxpbmsvaW1hZ2Ugc3ludGF4IG1heSBzdXJ2aXZlIGludG8gYSB0YWJsZSBjZWxsIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICIhWyIpLAoJCSJubyBsaXZlIG1hcmtkb3duIGltYWdlIG9wZW5lciBtYXkgc3Vydml2ZSBpbnRvIGEgdGFibGUgY2VsbCIpCgkvLyB0aGUgdGV4dCBpdHNlbGYgaXMgc3RpbGwgc2hvd24g4oCUIGl0IGlzIG5ldXRlcmVkLCBub3QgY2Vuc29yZWQuIFRoZQoJLy8gc2FuaXRpemVyIGVzY2FwZXMgYC5gIHRvbywgc28gdGhlIHJhdyBob3N0IG5ldmVyIGFwcGVhcnMgdmVyYmF0aW0uCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJldmlsIiksCgkJInRoZSBwYXlsb2FkIHRleHQgbXVzdCBzdGlsbCBiZSB2aXNpYmxlIHRvIHRoZSByZWFkZXIiKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKG91dCwgImV2aWwuZXhhbXBsZSIpLAoJCSJldmVuIHRoZSBkb3QgaXMgZXNjYXBlZCDigJQgbm8gYXV0b2xpbmthYmxlIGhvc3Qgc3Vydml2ZXMiKQoKCS8vIHRoZSBzYW1lIGNsYXNzIG9mIHBheWxvYWQgbXVzdCBub3Qgc3Vydml2ZSB0aGUgc2luZ2xlLWxpbmUgc3VtbWFyeQoJc3VtIDo9IEdldFNlcnZpY2UoInBoaXNoIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhzdW0sICJdKCIpLAoJCSJHZXRTZXJ2aWNlIG11c3QgZXNjYXBlIG1hcmtkb3duIGxpbmsgc3ludGF4IHRvbyIpCn0KCi8vIFk0OiB0aGUgb25lLXN0ZXAgdHJhbnNmZXIgdGhpcyByZXBsYWNlcyB3YXMgYSBwZXJtYW5lbnQtYnJpY2sgaGF6YXJkLgovLyBhZGRyZXNzLklzVmFsaWQoKSBvbmx5IGNoZWNrcyBiZWNoMzIgZm9ybSwgc28gYSB3ZWxsLWZvcm1lZCBidXQgdW5vd25lZAovLyBkZXN0aW5hdGlvbiBjb21taXR0ZWQgaW1tZWRpYXRlbHksIGFmdGVyIHdoaWNoIHRoZSBlbnRyeSBjb3VsZCBuZXZlciBiZQovLyB1cGRhdGVkLCB0cmFuc2ZlcnJlZCBvciBkZXJlZ2lzdGVyZWQg4oCUIGFuZCBiZWNhdXNlIGl0IGNvdWxkIG5ldmVyIGJlCi8vIGRlcmVnaXN0ZXJlZCBpdCBjb3VsZCBuZXZlciBlbnRlciB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGVpdGhlciwgc28gdGhlCi8vIE5BTUUgYmVjYW1lIGEgcGVybWFuZW50IGhvbGUgaW4gYSBzaGFyZWQgZ2xvYmFsIG5hbWVzcGFjZS4KZnVuYyBUZXN0VHJhbnNmZXJPd25lcnNoaXBfVHdvU3RlcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsICJwcmljZV9vcmFjbGUiKQoKCS8vIG5vbWluYXRpb24gYWxvbmUgY2hhbmdlcyBOT1RISU5HCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBuZXdPd25lcikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG93bmVyKSwgc3RyaW5nKEdldE93bmVyKCJwcmljZV9vcmFjbGUiKSkpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhuZXdPd25lciksIEdldFBlbmRpbmdPd25lcigicHJpY2Vfb3JhY2xlIikpCgoJLy8gdGhlIHNpdHRpbmcgb3duZXIga2VlcHMgZnVsbCBjb250cm9sIHdoaWxlIHRoZSBoYW5kb2ZmIGlzIG9wZW4KCVVwZGF0ZVNlcnZpY2UoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsIGdvb2RQYXRoLCAic3RpbGwgbWluZSIsICJvcmFjbGUiLCAiIikKCgkvLyBvbmx5IHRoZSBub21pbmVlIG1heSBhY2NlcHQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBub21pbmF0ZWQgb3duZXIgY2FuIGFjY2VwdCIsCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXIpKQoJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcobmV3T3duZXIpLCBzdHJpbmcoR2V0T3duZXIoInByaWNlX29yYWNsZSIpKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRQZW5kaW5nT3duZXIoInByaWNlX29yYWNsZSIpKQoKCS8vIHRoZSBxdW90YSBtb3ZlZCB3aXRoIHRoZSBlbnRyeQoJbiwgXyA6PSBPd25lclNlcnZpY2VDb3VudChvd25lcikKCXVhc3NlcnQuRXF1YWwodCwgMCwgbikKCW4sIF8gPSBPd25lclNlcnZpY2VDb3VudChuZXdPd25lcikKCXVhc3NlcnQuRXF1YWwodCwgMSwgbikKCgkvLyB0aGUgZm9ybWVyIG93bmVyIGlzIG5vdyBhbiBvdXRzaWRlcgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIG93bmVyIGNhbiB1cGRhdGUgdGhpcyBzZXJ2aWNlIiwKCQlmdW5jKCkgeyBVcGRhdGVTZXJ2aWNlKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBnb29kUGF0aCwgImJhY2siLCAib3JhY2xlIiwgIiIpIH0pCn0KCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwX0NhbmNlbChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCglyZWdpc3RlcihjdXIsICJwcmljZV9vcmFjbGUiKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciBmb3I6IHByaWNlX29yYWNsZSIsCgkJZnVuYygpIHsgQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIpIH0pCgoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIsIG5ld093bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm9ubHkgdGhlIG93bmVyIGNhbiBjYW5jZWwgYSB0cmFuc2ZlciIsCgkJZnVuYygpIHsgQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSwgInByaWNlX29yYWNsZSIpIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglDYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIikKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRQZW5kaW5nT3duZXIoInByaWNlX29yYWNsZSIpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3T3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciBmb3I6IHByaWNlX29yYWNsZSIsCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9KQoKCS8vIHJlLW5vbWluYXRpbmcgYW5kIHRoZW4gY2xlYXJpbmcgd2l0aCB0aGUgZW1wdHkgYWRkcmVzcyBpcyBlcXVpdmFsZW50Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBuZXdPd25lcikKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBhZGRyZXNzKCIiKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRQZW5kaW5nT3duZXIoInByaWNlX29yYWNsZSIpKQp9CgovLyBUaGUgcXVvdGEgaXMgY2hlY2tlZCBhdCBDT05TRU5ULCBub3QgYXQgbm9taW5hdGlvbiwgc28gYSBub21pbmF0aW9uIGNhbgovLyBuZXZlciBwdXNoIGFuIGFjY291bnQgcGFzdCBpdHMgY2FwIHdpdGhvdXQgdGhhdCBhY2NvdW50IGFncmVlaW5nLgpmdW5jIFRlc3RUcmFuc2Zlck93bmVyc2hpcF9RdW90YUNoZWNrZWRBdENvbnNlbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJZmlsbEZvcihjdXIsIG5ld093bmVyLCAiYiIsIE1heFNlcnZpY2VzUGVyT3duZXIpCglyZWdpc3RlcihjdXIsICJleHRyYSIpCgoJLy8gbm9taW5hdGlvbiBzdWNjZWVkcyBldmVuIHRob3VnaCB0aGUgbm9taW5lZSBpcyBmdWxsLi4uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksICJleHRyYSIsIG5ld093bmVyKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcobmV3T3duZXIpLCBHZXRQZW5kaW5nT3duZXIoImV4dHJhIikpCgoJLy8gLi4uYnV0IGNvbnNlbnQgaXMgcmVmdXNlZCwgYW5kIHRoZSBlbnRyeSBzdGF5cyB3aXRoIGl0cyBvd25lcgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShuZXdPd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgcXVvdGFNc2coKSwKCQlmdW5jKCkgeyBBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgImV4dHJhIikgfSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG93bmVyKSwgc3RyaW5nKEdldE93bmVyKCJleHRyYSIpKSkKCgkvLyBmcmVlaW5nIG9uZSBzbG90IGxldHMgdGhlIHNhbWUgaGFuZG9mZiBjb21wbGV0ZQoJRGVyZWdpc3Rlcihjcm9zcyhjdXIpLCAiYjAiKQoJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksICJleHRyYSIpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhuZXdPd25lciksIHN0cmluZyhHZXRPd25lcigiZXh0cmEiKSkpCgluLCBfIDo9IE93bmVyU2VydmljZUNvdW50KG5ld093bmVyKQoJdWFzc2VydC5FcXVhbCh0LCBNYXhTZXJ2aWNlc1Blck93bmVyLCBuKQp9CgovLyBBIG5vbWluYXRpb24gbXVzdCBub3Qgb3V0bGl2ZSB0aGUgZW50cnkgaXQgd2FzIG1hZGUgYWdhaW5zdCDigJQgb3RoZXJ3aXNlCi8vIGEgc3RhbGUgbm9taW5lZSBjb3VsZCBzZWl6ZSBhIG5hbWUgdGhhdCB3YXMgZGVyZWdpc3RlcmVkIGFuZCByZWNsYWltZWQuCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwX05vbWluYXRpb25EaWVzV2l0aEVudHJ5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXJlZ2lzdGVyKGN1ciwgInByaWNlX29yYWNsZSIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCAicHJpY2Vfb3JhY2xlIiwgYXR0YWNrZXIpCglEZXJlZ2lzdGVyKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKQoJUmVnaXN0ZXJTZXJ2aWNlKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiLCBnb29kUGF0aCwgInJlY2xhaW1lZCIsICJvcmFjbGUiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCBHZXRQZW5kaW5nT3duZXIoInByaWNlX29yYWNsZSIpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciBmb3I6IHByaWNlX29yYWNsZSIsCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksICJwcmljZV9vcmFjbGUiKSB9KQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcob3duZXIpLCBzdHJpbmcoR2V0T3duZXIoInByaWNlX29yYWNsZSIpKSkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEwiAyrXuARILMjUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQF59krBhkLLGnesO5y3YAhfiO3+5XKcFuaVYROJXBgN/AX1JKO8qMSLsaB9ZgIT8ftXwRY/x9K9GTllBKFUfbzkaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data