Transaction executed successfully

Transaction Details

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

Transaction hash
E8AB38860E74E35ABF7F0EF2B02BBA5E3B84744B61C53AF113FE15DFC9DC0E4F

Transaction overview

Status
Success
Execution completed
Block
#351422
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
79,913,652
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

CojcAwoML3ZtLm1fYWRkcGtnEvbbAwooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORK52wMKCWZlZV9zcGxpdBJAZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2ZlZV9zcGxpdC92MhrppAEKDWZlZV9zcGxpdC5nbm8S1qQBcGFja2FnZSBmZWVfc3BsaXQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInNvcnQiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgovLyBTcGxpdCBob2xkcyBhIGZlZS1zcGxpdHRpbmcgY29uZmlndXJhdGlvbiB3aXRoIHBlcmNlbnRhZ2UtYmFzZWQgc2hhcmVzCi8vIGRlbm9taW5hdGVkIGluIGJhc2lzIHBvaW50cyAoMSBicCA9IDAuMDElLCAxMDAwMCBicCA9IDEwMCUpLgp0eXBlIFNwbGl0IHN0cnVjdCB7CglPd25lciAgICAgICAgICBhZGRyZXNzCglQZW5kaW5nT3duZXIgICBhZGRyZXNzIC8vIHR3by1zdGVwIGhhbmRvdmVyLCBtdXN0IEFjY2VwdE93bmVyc2hpcAoJUmVjaXBpZW50cyAgICAgW11hZGRyZXNzCglTaGFyZXMgICAgICAgICBbXWludDY0IC8vIGJhc2lzIHBvaW50cywgbXVzdCBzdW0gdG8gMTAwMDAKCUJhbGFuY2VzICAgICAgIG1hcFthZGRyZXNzXWludDY0CglUb3RhbERlcG9zaXRlZCBpbnQ2NAoJVG90YWxDbGFpbWVkICAgaW50NjQKCUZyb3plbiAgICAgICAgIGJvb2wKCUFyY2hpdmVkICAgICAgIGJvb2wKfQoKY29uc3QgKAoJTWF4UmVjaXBpZW50cyAgICAgPSAyMAoJTWF4U3BsaXRzUGVyT3duZXIgPSAxMAoJLy8gUXVvdGFzIGFyZSBQRVItT1dORVIgb25seSAocm91bmQtNCBhdWRpdCk6IGEgZ2xvYmFsIGNhcCBpcyBhIHNoYXJlZAoJLy8gcmVzb3VyY2UgNTAgc3liaWwgYWNjb3VudHMgY291bGQgZmlsbCBmb3JldmVyIOKAlCBhbmQgc2VlZGluZyBncmllZgoJLy8gc3BsaXRzIHdpdGggYmFsYW5jZXMgdG8ga2V5bGVzcyByZWNpcGllbnRzIG1hZGUgdGhlIGZpbGwKCS8vIHVucmVjb3ZlcmFibGUgZXZlbiBieSB0aGUgc3liaWxzLiBQZXItb3duZXIgcXVvdGFzIG1lYW4gYW4gYXR0YWNrZXIKCS8vIGNvbnN1bWVzIG9ubHkgdGhlaXIgb3duIGJ1ZGdldDsgc3RhdGUgZ3Jvd3RoIGlzIGdhcy1wcmljZWQuCgkvLyBSZW5kZXIgaXMgYm91bmRlZCBzZXBhcmF0ZWx5IChNYXhSZW5kZXJTcGxpdHMpLgoJTWF4UmVuZGVyU3BsaXRzID0gMTAwCgkvLyBNYXhGZWVCcHMgaXMgYW4gSU1NVVRBQkxFIGNlaWxpbmcgb24gdGhlIHByb3RvY29sIGZlZSAoMSUpLiBUaGUKCS8vIGFkbWluIGNhbiBzZXQgYW55IGZlZSBmcm9tIDAgdXAgdG8gdGhpcyBjYXAsIG5ldmVyIGFib3ZlIGl0IOKAlCB0aGUKCS8vIGNhcCwgbm90IHRoZSBjdXJyZW50IHNldHRpbmcsIGlzIHdoYXQgdXNlcnMgbXVzdCB0cnVzdC4KCU1heEZlZUJwcyA9IGludDY0KDEwMCkKCgkvLyBQcmUtcGFyc2UgaW5wdXQgYm91bmRzIChyb3VuZC00IGF1ZGl0KTogY2FwcyB3ZXJlIGVuZm9yY2VkIG9ubHkKCS8vIEFGVEVSIGZ1bGwgcGFyc2luZywgc28gYSAxTUIgcmVjaXBpZW50IGxpc3QgYnVybmVkIH4xMUIgZ2FzIGJlZm9yZQoJLy8gcmVmdXNhbC4gMjAgYmVjaDMyIGFkZHJlc3NlcyArIHNlcGFyYXRvcnMgZml0IHdlbGwgd2l0aGluIHRoZXNlLgoJTWF4UmVjaXBpZW50TGlzdExlbiA9IDEwMjQKCU1heFNoYXJlTGlzdExlbiAgICAgPSAxMjgKCgkvLyBEZW5vbWluYXRpb24gaGFuZGxlZCBieSB0aGlzIHJlYWxtLiBEZXBvc2l0cyBtdXN0IGJlIGV4YWN0bHkgb25lCgkvLyBjb2luIG9mIHRoaXMgZGVub207IGNsYWltcyBwYXkgb3V0IGluIGl0LgoJRGVub20gPSAidWdub3QiCgoJLy8gTGFyZ2VzdCBzaW5nbGUgZGVwb3NpdCBmb3Igd2hpY2ggc2hhcmUgbWF0aCAoYW1vdW50ICogc2hhcmUsCgkvLyBzaGFyZSA8PSAxMDAwMCkgY2Fubm90IG92ZXJmbG93IGludDY0LgoJTWF4RGVwb3NpdEFtb3VudCA9IGludDY0KDkyMjMzNzIwMzY4NTQ3NzU4MDcpIC8gMTAwMDAKKQoKdmFyICgKCXNwbGl0cyAgICAgIG1hcFtzdHJpbmddKlNwbGl0CglzcGxpdElEcyAgICBbXXN0cmluZyAvLyBpbnNlcnRpb24tb3JkZXJlZCBmb3IgZGV0ZXJtaW5pc3RpYyBSZW5kZXIKCW93bmVyU3BsaXRzIG1hcFthZGRyZXNzXWludAoJbmV4dElEICAgICAgaW50CgoJLy8gUHJvdG9jb2wgZmVlOiB0YWtlbiBmcm9tIGVhY2ggZGVwb3NpdCBCRUZPUkUgZGlzdHJpYnV0aW9uLCBhdCB0aGUKCS8vIHJhdGUgaW4gZm9yY2UgYXQgZGVwb3NpdCB0aW1lIChuZXZlciByZXRyb2FjdGl2ZSDigJQgY3JlZGl0ZWQKCS8vIGJhbGFuY2VzIGFyZSBuZXZlciB0b3VjaGVkKS4gRGVmYXVsdHMgdG8gemVyby4KCWZlZUJwcyAgICAgICAgICBpbnQ2NAoJZmVlQWRtaW4gICAgICAgIGFkZHJlc3MgLy8gZGVwbG95ZXI7IGNhbiBzZXQgdGhlIGZlZSBhbmQgY2xhaW0gYWNjcnVlZCBmZWVzCglwZW5kaW5nRmVlQWRtaW4gYWRkcmVzcyAvLyB0d28tc3RlcCBoYW5kb3ZlciwgbXVzdCBBY2NlcHRGZWVBZG1pbgoJZmVlc0FjY3J1ZWQgICAgIGludDY0CglmZWVzQ2xhaW1lZCAgICAgaW50NjQKKQoKZnVuYyBpbml0KCkgewoJc3BsaXRzID0gbWFrZShtYXBbc3RyaW5nXSpTcGxpdCkKCXNwbGl0SURzID0gW11zdHJpbmd7fQoJb3duZXJTcGxpdHMgPSBtYWtlKG1hcFthZGRyZXNzXWludCkKCW5leHRJRCA9IDEKCS8vIFRoZSBwYWNrYWdlIGRlcGxveWVyIGJlY29tZXMgdGhlIGZlZSBhZG1pbjogb24tY2hhaW4sIEFkZFBhY2thZ2UKCS8vIHJ1bnMgaW5pdCB3aXRoIHRoZSBtZXNzYWdlIGNyZWF0b3IgYXMgb3JpZ2luIGNhbGxlciAodmVyaWZpZWQKCS8vIGFnYWluc3QgdGhlIFZNIGtlZXBlciDigJQgYSBNc2dBZGRQYWNrYWdlJ3MgY3JlYXRvciBpcyBuZXZlciB6ZXJvKS4KCS8vIElmIE9yaWdpbkNhbGxlcigpIHdlcmUgZXZlciBlbXB0eSAoZS5nLiB0aGUgZ25vIHRlc3QgVk0sIHdoaWNoIGhhcwoJLy8gbm8gTXNnQWRkUGFja2FnZSksIHRoZSBmZWUgZmVhdHVyZSBkZWdyYWRlcyBTQUZFTFkgdG8gZGlzYWJsZWQ6CgkvLyBTZXRGZWUgcmVxdWlyZXMgdGhlIHJ1bnRpbWUtZGVyaXZlZCBjYWxsZXIgdG8gZXF1YWwgZmVlQWRtaW4gYW5kCgkvLyB0aGF0IGNhbGxlciBpcyBuZXZlciBlbXB0eSwgc28KCS8vIGZlZUJwcyBjYW4gbmV2ZXIgbGVhdmUgMCBhbmQgbm8gZmVlIGV2ZXIgYWNjcnVlcyDigJQgemVybyBmdW5kcyBhdAoJLy8gcmlzay4gRG8gbm90ICJoYXJkZW4iIHRoaXMgaW50byBhIHBhbmljOyB0aGUgc29mdC1kaXNhYmxlIGlzIHRoZQoJLy8gc2FmZSBiZWhhdmlvci4gRmVlIHN0YXJ0cyBhdCBaRVJPIHJlZ2FyZGxlc3MuCglmZWVBZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJZmVlQnBzID0gMAp9CgovLyAtLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLQoKZnVuYyBmb3JtYXRQY3QoYnAgaW50NjQpIHN0cmluZyB7Cgl3aG9sZSA6PSBzdHJjb252LkZvcm1hdEludChicC8xMDAsIDEwKQoJZnJhYyA6PSBzdHJjb252LkZvcm1hdEludChicCUxMDAsIDEwKQoJaWYgbGVuKGZyYWMpID09IDEgewoJCWZyYWMgPSAiMCIgKyBmcmFjCgl9CglyZXR1cm4gd2hvbGUgKyAiLiIgKyBmcmFjICsgIiUiCn0KCmZ1bmMgbXVzdEdldFNwbGl0KGlkIHN0cmluZykgKlNwbGl0IHsKCXMsIG9rIDo9IHNwbGl0c1tpZF0KCWlmICFvayB7CgkJcGFuaWMoInNwbGl0IG5vdCBmb3VuZDogIiArIGlkKQoJfQoJcmV0dXJuIHMKfQoKZnVuYyBtdXN0R2V0QWN0aXZlKGlkIHN0cmluZykgKlNwbGl0IHsKCXMgOj0gbXVzdEdldFNwbGl0KGlkKQoJaWYgcy5BcmNoaXZlZCB7CgkJcGFuaWMoInNwbGl0IGlzIGFyY2hpdmVkOiAiICsgaWQpCgl9CglyZXR1cm4gcwp9CgpmdW5jIGJvb2xTdHIodiBib29sKSBzdHJpbmcgewoJaWYgdiB7CgkJcmV0dXJuICJ5ZXMiCgl9CglyZXR1cm4gIm5vIgp9CgpmdW5jIHBhcnNlQmFzaXNQb2ludHMocmF3IHN0cmluZykgW11pbnQ2NCB7CglpZiBsZW4ocmF3KSA+IE1heFNoYXJlTGlzdExlbiB7CgkJcGFuaWMoInNoYXJlIGxpc3QgdG9vIGxvbmciKQoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChyYXcsICIsIikKCW91dCA6PSBtYWtlKFtdaW50NjQsIGxlbihwYXJ0cykpCgl2YXIgdG90YWwgaW50NjQKCWZvciBpLCBzIDo9IHJhbmdlIHBhcnRzIHsKCQl2LCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmluZ3MuVHJpbVNwYWNlKHMpKQoJCWlmIGVyciAhPSBuaWwgfHwgdiA8PSAwIHx8IHYgPiAxMDAwMCB7CgkJCS8vIHRoZSB1cHBlciBib3VuZCBpcyBhIHNlY3VyaXR5IGludmFyaWFudCwgbm90IGh5Z2llbmU6IHVuYm91bmRlZAoJCQkvLyBzaGFyZXMgbGV0IHRoZSBpbnQ2NCB0b3RhbCB3cmFwIGJhY2sgdG8gZXhhY3RseSAxMDAwMCwgbWludGluZwoJCQkvLyB1bmJhY2tlZCBiYWxhbmNlcyBwYWlkIGZyb20gdGhlIHNoYXJlZCBwb29sIChyZS1hdWRpdCBQMSkKCQkJcGFuaWMoImludmFsaWQgc2hhcmUgdmFsdWU6ICIgKyBzdHJpbmdzLlRyaW1TcGFjZShzKSkKCQl9CgkJb3V0W2ldID0gaW50NjQodikKCQl0b3RhbCArPSBpbnQ2NCh2KQoJfQoJaWYgdG90YWwgIT0gMTAwMDAgewoJCXBhbmljKCJzaGFyZXMgbXVzdCBzdW0gdG8gMTAwMDAgYmFzaXMgcG9pbnRzLCBnb3QgIiArIHN0cmNvbnYuRm9ybWF0SW50KHRvdGFsLCAxMCkpCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcGFyc2VBZGRyZXNzZXMocmF3IHN0cmluZykgW11hZGRyZXNzIHsKCWlmIGxlbihyYXcpID4gTWF4UmVjaXBpZW50TGlzdExlbiB7CgkJcGFuaWMoInJlY2lwaWVudCBsaXN0IHRvbyBsb25nIikKCX0KCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocmF3LCAiLCIpCglvdXQgOj0gbWFrZShbXWFkZHJlc3MsIGxlbihwYXJ0cykpCglmb3IgaSwgciA6PSByYW5nZSBwYXJ0cyB7CgkJYSA6PSBhZGRyZXNzKHN0cmluZ3MuVHJpbVNwYWNlKHIpKQoJCWlmIGEgPT0gIiIgewoJCQlwYW5pYygiZW1wdHkgcmVjaXBpZW50IGFkZHJlc3MgYXQgcG9zaXRpb24gIiArIHN0cmNvbnYuSXRvYShpKSkKCQl9CgkJaWYgIWEuSXNWYWxpZCgpIHx8IHN0cmluZyhhKSAhPSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5nKGEpKSB7CgkJCS8vIGxvd2VyY2FzZSBpcyByZXF1aXJlZCwgbm90IGNvc21ldGljIChyb3VuZC0zIGF1ZGl0KTogYmVjaDMyCgkJCS8vIGFjY2VwdHMgQUxMLVVQUEVSQ0FTRSBhcyB2YWxpZCwgYnV0IHRoZSBydW50aW1lIGFsd2F5cyByZXR1cm5zCgkJCS8vIHRoZSBsb3dlcmNhc2UgY2Fub25pY2FsIGZvcm0g4oCUIGFuIHVwcGVyY2FzZS1rZXllZCBiYWxhbmNlCgkJCS8vIGNvdWxkIG5ldmVyIGJlIGNsYWltZWQgYW5kIHdvdWxkIGJsb2NrIEFyY2hpdmUgZm9yZXZlciwgYW5kCgkJCS8vIHVwcGVyL2xvd2VyIGR1cGxpY2F0ZXMgd291bGQgYnlwYXNzIHRoZSBkdXBsaWNhdGUgY2hlY2sKCQkJcGFuaWMoImludmFsaWQgcmVjaXBpZW50IGFkZHJlc3M6ICIgKyBzdHJpbmcoYSkpCgkJfQoJCS8vIE5PVEU6IElzVmFsaWQgaXMgYSBmb3JtYXQgY2hlY2sgb25seSDigJQgYSB3ZWxsLWZvcm1lZCBhZGRyZXNzIHdpdGgKCQkvLyBubyBrZXkgaG9sZGVyIChlLmcuIGFub3RoZXIgcGFja2FnZSdzIGRlcml2ZWQgYWRkcmVzcykgd2lsbAoJCS8vIGFjY3VtdWxhdGUgYSBiYWxhbmNlIG5vYm9keSBjYW4gY2xhaW0sIHdoaWNoIGFsc28gYmxvY2tzIEFyY2hpdmUKCQkvLyBmb3JldmVyLiBPd25lcnMgbXVzdCBsaXN0IGFkZHJlc3NlcyB0aGV5IGtub3cgY2FuIGNhbGwgQ2xhaW0uCgkJb3V0W2ldID0gYQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHZhbGlkYXRlUmVjaXBpZW50cyhyZWNpcGllbnRzIFtdYWRkcmVzcywgc2hhcmVzIFtdaW50NjQpIHsKCWlmIGxlbihyZWNpcGllbnRzKSAhPSBsZW4oc2hhcmVzKSB7CgkJcGFuaWMoInJlY2lwaWVudHMgYW5kIHNoYXJlcyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIikKCX0KCWlmIGxlbihyZWNpcGllbnRzKSA9PSAwIHsKCQlwYW5pYygiYXQgbGVhc3Qgb25lIHJlY2lwaWVudCBpcyByZXF1aXJlZCIpCgl9CglpZiBsZW4ocmVjaXBpZW50cykgPiBNYXhSZWNpcGllbnRzIHsKCQlwYW5pYygidG9vIG1hbnkgcmVjaXBpZW50cyAobWF4ICIgKyBzdHJjb252Lkl0b2EoTWF4UmVjaXBpZW50cykgKyAiKSIpCgl9CglzZWVuIDo9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCWZvciBfLCByIDo9IHJhbmdlIHJlY2lwaWVudHMgewoJCWlmIHNlZW5bcl0gewoJCQlwYW5pYygiZHVwbGljYXRlIHJlY2lwaWVudDogIiArIHN0cmluZyhyKSkKCQl9CgkJc2VlbltyXSA9IHRydWUKCX0KfQoKLy8gc29ydGVkQmFsYW5jZUFkZHJzIHJldHVybnMgdGhlIGJhbGFuY2UtbWFwIGtleXMgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlciwKLy8gc28gcGFuaWNzIGFuZCByZW5kZXJzIG5ldmVyIGRlcGVuZCBvbiBtYXAgaXRlcmF0aW9uIG9yZGVyLgpmdW5jIHNvcnRlZEJhbGFuY2VBZGRycyhzICpTcGxpdCkgW11zdHJpbmcgewoJYWRkcnMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHMuQmFsYW5jZXMpKQoJZm9yIGEgOj0gcmFuZ2Ugcy5CYWxhbmNlcyB7CgkJYWRkcnMgPSBhcHBlbmQoYWRkcnMsIHN0cmluZyhhKSkKCX0KCXNvcnQuU3RyaW5ncyhhZGRycykKCXJldHVybiBhZGRycwp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCB0aGF0IGRvZXMgbm90Ci8vIGFjY2VwdCB0aGVtIOKAlCB0aGUgYWJvcnQgcmV2ZXJ0cyB0aGUgdHJhbnNmZXIgYmFjayB0byB0aGUgc2VuZGVyIGluc3RlYWQKLy8gb2Ygc3RyYW5kaW5nIHRoZSBjb2lucyBvbiB0aGUgcmVhbG0gYWRkcmVzcyAocmUtYXVkaXQgUDMpLiBEaXJlY3QgYmFuawovLyB0cmFuc2ZlcnMgdG8gdGhlIHJlYWxtIGFkZHJlc3MgcmVtYWluIHVucmVjb3ZlcmFibGUgYnkgZGVzaWduLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCS8vIGV2ZXJ5IGNhbGwgc2l0ZSBwYXNzZXMgdGhlIGVudHJ5cG9pbnQncyBvd24gZmlyc3QgY3VyOyB0aGlzCgkJLy8gcGlucyB0aGF0IGRpc2NpcGxpbmUgYWdhaW5zdCBmdXR1cmUgY2FsbC1zaXRlIGRyaWZ0ICh2MgoJCS8vIGF1ZGl0IEczIGhhcmRlbmluZykKCQlwYW5pYygicmVhbG0gY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zOyBhdHRhY2ggY29pbnMgdG8gRGVwb3NpdCBvbmx5IikKCX0KfQoKLy8gLS0tLS0tLS0tLSB3cml0ZSBvcGVyYXRpb25zIC0tLS0tLS0tLS0KCi8vIENyZWF0ZVNwbGl0IHJlZ2lzdGVycyBhIG5ldyBzcGxpdC4gVGhlIGNhbGxlciBiZWNvbWVzIHRoZSBvd25lci4KLy8gUmVjaXBpZW50cyBhbmQgc2hhcmVzIGFyZSBjb21tYS1zZXBhcmF0ZWQ7IHNoYXJlcyBhcmUgaW4gYmFzaXMgcG9pbnRzCi8vIHN1bW1pbmcgdG8gMTAwMDAuCmZ1bmMgQ3JlYXRlU3BsaXQoY3VyIHJlYWxtLCByZWNpcGllbnRMaXN0LCBzaGFyZUxpc3Qgc3RyaW5nKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgb3duZXJTcGxpdHNbb3duZXJdID49IE1heFNwbGl0c1Blck93bmVyIHsKCQlwYW5pYygicGVyLW93bmVyIHNwbGl0IGxpbWl0IHJlYWNoZWQiKQoJfQoKCXJlY2lwaWVudHMgOj0gcGFyc2VBZGRyZXNzZXMocmVjaXBpZW50TGlzdCkKCXNoYXJlcyA6PSBwYXJzZUJhc2lzUG9pbnRzKHNoYXJlTGlzdCkKCXZhbGlkYXRlUmVjaXBpZW50cyhyZWNpcGllbnRzLCBzaGFyZXMpCgoJaWQgOj0gInNwbGl0XyIgKyBzdHJjb252Lkl0b2EobmV4dElEKQoJbmV4dElEKysKCgliYWxhbmNlcyA6PSBtYWtlKG1hcFthZGRyZXNzXWludDY0KQoJZm9yIF8sIHIgOj0gcmFuZ2UgcmVjaXBpZW50cyB7CgkJYmFsYW5jZXNbcl0gPSAwCgl9CgoJc3BsaXRzW2lkXSA9ICZTcGxpdHsKCQlPd25lcjogICAgICBvd25lciwKCQlSZWNpcGllbnRzOiByZWNpcGllbnRzLAoJCVNoYXJlczogICAgIHNoYXJlcywKCQlCYWxhbmNlczogICBiYWxhbmNlcywKCX0KCXNwbGl0SURzID0gYXBwZW5kKHNwbGl0SURzLCBpZCkKCW93bmVyU3BsaXRzW293bmVyXSsrCglyZXR1cm4gaWQKfQoKLy8gRGVwb3NpdCBkaXN0cmlidXRlcyB0aGUgY29pbnMgc2VudCB3aXRoIHRoZSBjYWxsIGFjcm9zcyByZWNpcGllbnRzCi8vIHByb3BvcnRpb25hbGx5LgovLwovLyBERVBMT1lNRU5UIFBSRUNPTkRJVElPTiAocm91bmQtNCBhdWRpdCk6IG9uIGEgbmV0d29yayB3aXRoCi8vIHJlc3RyaWN0ZWQvdG9rZW4tbG9ja2VkIHVnbm90IHRyYW5zZmVycywgdGhlIGJhbmsgZ2F0ZSBpcwovLyBTRU5ERVItd2hpdGVsaXN0LWJhc2VkIOKAlCBhIHdoaXRlbGlzdGVkIHVzZXIncyBEZXBvc2l0IHN1Y2NlZWRzIGJ1dAovLyBDbGFpbSBzZW5kcyBGUk9NIHRoaXMgcmVhbG0ncyAobm9uLXdoaXRlbGlzdGVkKSBhZGRyZXNzIGFuZCByZXZlcnRzLgovLyBGdW5kcyB3b3VsZCBmbG93IGluIGFuZCBub3Qgb3V0IHVudGlsIHRoZSByZXN0cmljdGlvbiBsaWZ0cy4gRGVwbG95Ci8vIG9ubHkgdG8gbmV0d29ya3Mgd2l0aCB1bnJlc3RyaWN0ZWQgdWdub3QsIG9yIGhhdmUgZ292ZXJuYW5jZQovLyB3aGl0ZWxpc3QgdGhpcyByZWFsbSdzIGFkZHJlc3MgZmlyc3QuCi8vCi8vIExJTUlUQVRJT04gKHJvdW5kLTMgYXVkaXQsIGRvY3VtZW50ZWQpOiBvbmx5IGRpcmVjdCB1c2VyIGNhbGxzIGNhbgovLyBkZXBvc2l0LiBBIERBTy9yZWFsbSB0cmVhc3VyeSBoYXMgTk8gZGVwb3NpdCBwYXRoIOKAlCBhIHJlYWxtLXJvdXRlZAovLyBjYWxsIGlzIHJlZnVzZWQsIGFuZCBhIGJhcmUgYmFua2VyIHNlbmQgdG8gdGhpcyByZWFsbSdzIGFkZHJlc3MgaXMKLy8gYW4gdW5yZWNvdmVyYWJsZSBkb25hdGlvbi4gUmVhbG0gdHJlYXN1cmllcyBtdXN0IHJvdXRlIGRlcG9zaXRzCi8vIHRocm91Z2ggYSB1c2VyIGFjY291bnQuIFRoZSBkZXBvc2l0IGlzIHRoZSBBQ1RVQUwgYXR0YWNoZWQgc2VuZCDigJQgZXhhY3RseSBvbmUKLy8gY29pbiBvZiBEZW5vbSDigJQgc28gYmFsYW5jZXMgYXJlIGFsd2F5cyBiYWNrZWQgYnkgZnVuZHMgdGhpcyByZWFsbQovLyBob2xkcy4gRGlyZWN0IHVzZXIgY2FsbHMgb25seTogYSBkZXBvc2l0IHJvdXRlZCB0aHJvdWdoIGFuCi8vIGludGVybWVkaWFyeSByZWFsbSB3b3VsZCBkZWxpdmVyIGl0cyBjb2lucyB0byB0aGF0IHJlYWxtLCBub3QgaGVyZSwKLy8gYW5kIG11c3QgYmUgcmVqZWN0ZWQuIFJvdW5kaW5nIGR1c3QgZ29lcyB0byB0aGUgaGlnaGVzdC1zaGFyZQovLyByZWNpcGllbnQgKGRldGVybWluaXN0aWMsIG5vdCBvcmRlci1kZXBlbmRlbnQpLgpmdW5jIERlcG9zaXQoY3VyIHJlYWxtLCBzcGxpdElEIHN0cmluZykgewoJcyA6PSBtdXN0R2V0QWN0aXZlKHNwbGl0SUQpCglpZiBzLkZyb3plbiB7CgkJcGFuaWMoInNwbGl0IGlzIGZyb3plbiIpCgl9CgoJLy8gSXNVc2VyQ2FsbCwgbm90IElzVXNlcjogTXNnUnVuIHBhc3NlcyBJc1VzZXIgYnV0IGl0cyBhdHRhY2hlZCBzZW5kCgkvLyBnb2VzIGNhbGxlci0+Y2FsbGVyIOKAlCB0aGUgY29pbnMgbmV2ZXIgcmVhY2ggdGhpcyByZWFsbSwgYW5kIE9yaWdpblNlbmQKCS8vIGNvdWxkIGJlIHJlLXJlYWQgYWNyb3NzIGsgY2FsbHMgaW4gb25lIHJ1biBzY3JpcHQgKHJlLWF1ZGl0IFAxKS4gQQoJLy8gZGlyZWN0IE1zZ0NhbGwncyBzZW5kIHByb3ZhYmx5IGxhbmRzIG9uIHRoZSBjYWxsZWQgcGFja2FnZSBhZGRyZXNzLgoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImRlcG9zaXRzIG11c3QgYmUgc2VudCBieSBkaXJlY3QgY2FsbCwgbm90IHRocm91Z2ggYW5vdGhlciByZWFsbSBvciBhIHJ1biBzY3JpcHQiKQoJfQoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiBsZW4oc2VudCkgIT0gMSB8fCBzZW50WzBdLkRlbm9tICE9IERlbm9tIHsKCQlwYW5pYygiZGVwb3NpdCBtdXN0IHNlbmQgZXhhY3RseSBvbmUgY29pbiBvZiAiICsgRGVub20pCgl9CglhbW91bnQgOj0gc2VudFswXS5BbW91bnQKCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKQoJfQoJaWYgYW1vdW50ID4gTWF4RGVwb3NpdEFtb3VudCB7CgkJcGFuaWMoImRlcG9zaXQgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBhbW91bnQiKQoJfQoJaWYgcy5Ub3RhbERlcG9zaXRlZCA+IGludDY0KDkyMjMzNzIwMzY4NTQ3NzU4MDcpLWFtb3VudCB7CgkJcGFuaWMoImRlcG9zaXQgd291bGQgb3ZlcmZsb3cgc3BsaXQgYWNjb3VudGluZyIpCgl9CgoJLy8gUHJvdG9jb2wgZmVlIGNvbWVzIG9mZiB0aGUgdG9wOyBldmVyeXRoaW5nIGJlbG93IGRpc3RyaWJ1dGVzIHRoZQoJLy8gTkVUIGFtb3VudCwgc28gdGhlIHBlci1zcGxpdCBjb25zZXJ2YXRpb24gaW52YXJpYW50CgkvLyAoc3VtKGJhbGFuY2VzKStUb3RhbENsYWltZWQgPT0gVG90YWxEZXBvc2l0ZWQpIGlzIHVudG91Y2hlZC4KCS8vIGFtb3VudCA8PSBNYXhEZXBvc2l0QW1vdW50IGFuZCBmZWVCcHMgPD0gMTAwLCBzbyB0aGUgcHJvZHVjdCBpcwoJLy8gZmFyIGJlbG93IG92ZXJmbG93LgoJZmVlIDo9IChhbW91bnQgKiBmZWVCcHMpIC8gMTAwMDAKCWlmIGZlZSA+IDAgewoJCWlmIGZlZXNBY2NydWVkID4gaW50NjQoOTIyMzM3MjAzNjg1NDc3NTgwNyktZmVlIHsKCQkJcGFuaWMoImZlZSBhY2NydWFsIHdvdWxkIG92ZXJmbG93IikKCQl9CgkJZmVlc0FjY3J1ZWQgKz0gZmVlCgkJYW1vdW50IC09IGZlZQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJkZXBvc2l0IHRvbyBzbWFsbDogZnVsbHkgY29uc3VtZWQgYnkgdGhlIHByb3RvY29sIGZlZSIpCgl9CgoJcy5Ub3RhbERlcG9zaXRlZCArPSBhbW91bnQKCgkvLyBGaW5kIHRoZSBoaWdoZXN0LXNoYXJlIHJlY2lwaWVudCBmb3IgZHVzdCBhc3NpZ25tZW50CglkdXN0SWR4IDo9IDAKCWZvciBpIDo9IDE7IGkgPCBsZW4ocy5TaGFyZXMpOyBpKysgewoJCWlmIHMuU2hhcmVzW2ldID4gcy5TaGFyZXNbZHVzdElkeF0gewoJCQlkdXN0SWR4ID0gaQoJCX0KCX0KCgl2YXIgZGlzdHJpYnV0ZWQgaW50NjQKCWZvciBpLCByIDo9IHJhbmdlIHMuUmVjaXBpZW50cyB7CgkJc2hhcmUgOj0gKGFtb3VudCAqIHMuU2hhcmVzW2ldKSAvIDEwMDAwCgkJcy5CYWxhbmNlc1tyXSArPSBzaGFyZQoJCWRpc3RyaWJ1dGVkICs9IHNoYXJlCgl9CgoJLy8gQXNzaWduIGR1c3QgdG8gaGlnaGVzdC1zaGFyZSByZWNpcGllbnQKCWR1c3QgOj0gYW1vdW50IC0gZGlzdHJpYnV0ZWQKCWlmIGR1c3QgPiAwIHsKCQlzLkJhbGFuY2VzW3MuUmVjaXBpZW50c1tkdXN0SWR4XV0gKz0gZHVzdAoJfQp9CgovLyBDbGFpbSB3aXRoZHJhd3MgdGhlIGNhbGxlcidzIGFjY3VtdWxhdGVkIGJhbGFuY2UgYW5kIFNFTkRTIHRoZSBjb2lucwovLyB0byB0aGUgY2FsbGVyJ3MgYWRkcmVzcy4gQmFsYW5jZSBpcyB6ZXJvZWQgYmVmb3JlIHRoZSB0cmFuc2Zlci4KLy8gQ2xhaW1zIHJlbWFpbiBwb3NzaWJsZSBvbiBmcm96ZW4gc3BsaXRzLCBhbmQgYnkgZXgtcmVjaXBpZW50cyB3aG9zZQovLyBhY2NydWVkIGJhbGFuY2UgcHJlZGF0ZXMgYSBzaGFyZSB1cGRhdGUuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBzcGxpdElEIHN0cmluZykgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdEdldEFjdGl2ZShzcGxpdElEKQoJYWRkciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCgliYWwsIGV4aXN0cyA6PSBzLkJhbGFuY2VzW2FkZHJdCglpZiAhZXhpc3RzIHsKCQlwYW5pYygibm90IGEgcmVjaXBpZW50IG9mIHRoaXMgc3BsaXQiKQoJfQoJaWYgYmFsID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCglzLkJhbGFuY2VzW2FkZHJdID0gMAoJcy5Ub3RhbENsYWltZWQgKz0gYmFsCgoJYiA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCgliLlNlbmRDb2lucyhjdXIuQWRkcmVzcygpLCBhZGRyLAoJCWNoYWluLkNvaW5ze3tEZW5vbTogRGVub20sIEFtb3VudDogYmFsfX0pCglyZXR1cm4gYmFsCn0KCi8vIFVwZGF0ZVNoYXJlcyByZXBsYWNlcyByZWNpcGllbnRzIGFuZCBzaGFyZXMuIE93bmVyIG9ubHkuIE5vdCBpZiBmcm96ZW4uCi8vIFJlbW92ZWQgcmVjaXBpZW50cyBrZWVwIGFueSBhY2NydWVkIGJhbGFuY2UgYW5kIGNhbiBzdGlsbCBDbGFpbSBpdC4KZnVuYyBVcGRhdGVTaGFyZXMoY3VyIHJlYWxtLCBzcGxpdElELCByZWNpcGllbnRMaXN0LCBzaGFyZUxpc3Qgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJcyA6PSBtdXN0R2V0QWN0aXZlKHNwbGl0SUQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcy5Pd25lciB7CgkJcGFuaWMoIm9ubHkgdGhlIG93bmVyIGNhbiB1cGRhdGUgc2hhcmVzIikKCX0KCWlmIHMuRnJvemVuIHsKCQlwYW5pYygic3BsaXQgaXMgZnJvemVuIikKCX0KCglyZWNpcGllbnRzIDo9IHBhcnNlQWRkcmVzc2VzKHJlY2lwaWVudExpc3QpCglzaGFyZXMgOj0gcGFyc2VCYXNpc1BvaW50cyhzaGFyZUxpc3QpCgl2YWxpZGF0ZVJlY2lwaWVudHMocmVjaXBpZW50cywgc2hhcmVzKQoKCWZvciBfLCByIDo9IHJhbmdlIHJlY2lwaWVudHMgewoJCWlmIF8sIG9rIDo9IHMuQmFsYW5jZXNbcl07ICFvayB7CgkJCXMuQmFsYW5jZXNbcl0gPSAwCgkJfQoJfQoKCXMuUmVjaXBpZW50cyA9IHJlY2lwaWVudHMKCXMuU2hhcmVzID0gc2hhcmVzCn0KCi8vIFRyYW5zZmVyT3duZXJzaGlwIHN0YWdlcyBhIHR3by1zdGVwIG93bmVyc2hpcCBoYW5kb3Zlcjsgbm90aGluZwovLyBtb3ZlcyB1bnRpbCB0aGUgbm9taW5lZSBjYWxscyBBY2NlcHRPd25lcnNoaXAuIFR3by1zdGVwIGZvciB0aGUgc2FtZQovLyByZWFzb24gYXMgdGhlIGZlZSBhZG1pbiwgcGx1cyBvbmUgbW9yZSAodjIgYXVkaXQgWTEpOiBhIG9uZS1zdGVwCi8vIHRyYW5zZmVyIGNvbnN1bWVkIHRoZSBSRUNJUElFTlQncyBwZXItb3duZXIgcXVvdGEgd2l0aG91dCBjb25zZW50LAovLyBzbyBwb2lzb25lZCBzcGxpdHMgY291bGQgYnVybiBhIHZpY3RpbSdzIHNsb3RzIHVuYXJjaGl2YWJseS4gU3RhZ2luZwovLyBjb25zdW1lcyBub3RoaW5nIG9mIHRoZSBub21pbmVlJ3MuIFBhc3MgIiIgdG8gY2xlYXIgYSBwZW5kaW5nCi8vIG5vbWluYXRpb24uCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBzcGxpdElEIHN0cmluZywgbmV3T3duZXIgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdEdldEFjdGl2ZShzcGxpdElEKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdHJhbnNmZXIgb3duZXJzaGlwIikKCX0KCWlmIG5ld093bmVyID09ICIiIHsKCQlzLlBlbmRpbmdPd25lciA9ICIiCgkJcmV0dXJuCgl9CglpZiAhbmV3T3duZXIuSXNWYWxpZCgpIHx8IHN0cmluZyhuZXdPd25lcikgIT0gc3RyaW5ncy5Ub0xvd2VyKHN0cmluZyhuZXdPd25lcikpIHsKCQkvLyBzZWUgcGFyc2VBZGRyZXNzZXM6IGFuIHVwcGVyY2FzZSBvd25lciBjb3VsZCBuZXZlciBtYXRjaCB0aGUKCQkvLyBydW50aW1lLWRlcml2ZWQgY2FsbGVyIGFnYWluIOKAlCB0aGUgc3BsaXQgd291bGQgYmUgb3duZXItbGVzcwoJCXBhbmljKCJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiAiICsgc3RyaW5nKG5ld093bmVyKSkKCX0KCWlmIG5ld093bmVyID09IHMuT3duZXIgewoJCXBhbmljKCJuZXcgb3duZXIgaXMgYWxyZWFkeSB0aGUgb3duZXIiKQoJfQoJcy5QZW5kaW5nT3duZXIgPSBuZXdPd25lcgp9CgovLyBBY2NlcHRPd25lcnNoaXAgY29tcGxldGVzIHRoZSBoYW5kb3Zlcjsgb25seSB0aGUgbm9taW5lZSBjYW4gYWNjZXB0LgovLyBUaGUgbm9taW5lZSdzIHF1b3RhIGlzIGNoZWNrZWQgSEVSRSwgYXQgY29uc2VudCB0aW1lIOKAlCB0aGUgc3BsaXQKLy8gc2xvdCBtb3ZlcyBvbmx5IHdpdGggdGhlIGFjY2VwdG9yJ3Mgb3duIHNpZ25hdHVyZSAodjIgYXVkaXQgWTE6IGEKLy8gcmVjaXBpZW50J3MgcXVvdGEgaXMgbmV2ZXIgY29uc3VtZWQgd2l0aG91dCBjb25zZW50KS4gQSBub21pbmF0aW9uCi8vIG9uIGEgc3BsaXQgdGhhdCBpcyBsYXRlciBhcmNoaXZlZCBpcyBpbmVydCAobXVzdEdldEFjdGl2ZSkuCmZ1bmMgQWNjZXB0T3duZXJzaGlwKGN1ciByZWFsbSwgc3BsaXRJRCBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzIDo9IG11c3RHZXRBY3RpdmUoc3BsaXRJRCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIHMuUGVuZGluZ093bmVyID09ICIiIHx8IGNhbGxlciAhPSBzLlBlbmRpbmdPd25lciB7CgkJcGFuaWMoImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIiKQoJfQoJaWYgb3duZXJTcGxpdHNbY2FsbGVyXSA+PSBNYXhTcGxpdHNQZXJPd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyBhdCB0aGUgcGVyLW93bmVyIHNwbGl0IGxpbWl0IikKCX0KCglvd25lclNwbGl0c1tzLk93bmVyXS0tCglpZiBvd25lclNwbGl0c1tzLk93bmVyXSA8PSAwIHsKCQlkZWxldGUob3duZXJTcGxpdHMsIHMuT3duZXIpCgl9Cglvd25lclNwbGl0c1tjYWxsZXJdKysKCXMuT3duZXIgPSBjYWxsZXIKCXMuUGVuZGluZ093bmVyID0gIiIKfQoKLy8gRnJlZXplIHBlcm1hbmVudGx5IGxvY2tzIHNoYXJlcyBhbmQgc3RvcHMgZnVydGhlciBkZXBvc2l0cy4gT25lLXdheSwKLy8gY2Fubm90IGJlIHVuZG9uZS4gQ2xhaW1zIHJlbWFpbiBwb3NzaWJsZS4KZnVuYyBGcmVlemUoY3VyIHJlYWxtLCBzcGxpdElEIHN0cmluZykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXMgOj0gbXVzdEdldEFjdGl2ZShzcGxpdElEKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gZnJlZXplIikKCX0KCXMuRnJvemVuID0gdHJ1ZQp9CgovLyBBcmNoaXZlIG1hcmtzIGEgZnVsbHktY2xhaW1lZCBzcGxpdCBhcyBhcmNoaXZlZC4gT25seSB0aGUgb3duZXIgY2FuCi8vIGFyY2hpdmUsIGFuZCBvbmx5IGlmIEVWRVJZIGJhbGFuY2Ug4oCUIGluY2x1ZGluZyBiYWxhbmNlcyBoZWxkIGJ5Ci8vIGV4LXJlY2lwaWVudHMgcmVtb3ZlZCBpbiBhIHNoYXJlIHVwZGF0ZSDigJQgaXMgemVybywgc2luY2UgYXJjaGl2aW5nCi8vIGJsb2NrcyBhbGwgZnVydGhlciBjbGFpbXMuIENhbm5vdCBiZSB1bmRvbmUuCmZ1bmMgQXJjaGl2ZShjdXIgcmVhbG0sIHNwbGl0SUQgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJcyA6PSBtdXN0R2V0QWN0aXZlKHNwbGl0SUQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcy5Pd25lciB7CgkJcGFuaWMoIm9ubHkgdGhlIG93bmVyIGNhbiBhcmNoaXZlIikKCX0KCglmb3IgXywgYSA6PSByYW5nZSBzb3J0ZWRCYWxhbmNlQWRkcnMocykgewoJCWlmIHMuQmFsYW5jZXNbYWRkcmVzcyhhKV0gPiAwIHsKCQkJcGFuaWMoImNhbm5vdCBhcmNoaXZlOiBvdXRzdGFuZGluZyBiYWxhbmNlIGZvciAiICsgYSkKCQl9Cgl9CgoJcy5BcmNoaXZlZCA9IHRydWUKCgkvLyBGcmVlIHRoZSBvd25lcidzIHNsb3Qgc28gdGhleSBjYW4gY3JlYXRlIG5ldyBzcGxpdHMKCW93bmVyU3BsaXRzW3MuT3duZXJdLS0KCWlmIG93bmVyU3BsaXRzW3MuT3duZXJdIDw9IDAgewoJCWRlbGV0ZShvd25lclNwbGl0cywgcy5Pd25lcikKCX0KCgkvLyBSZW1vdmUgZnJvbSBhY3RpdmUgSUQgbGlzdCAoa2VlcHMgbWFwIGVudHJ5IGZvciBhdWRpdCkKCWZvciBpLCBpZCA6PSByYW5nZSBzcGxpdElEcyB7CgkJaWYgaWQgPT0gc3BsaXRJRCB7CgkJCXNwbGl0SURzID0gYXBwZW5kKHNwbGl0SURzWzppXSwgc3BsaXRJRHNbaSsxOl0uLi4pCgkJCWJyZWFrCgkJfQoJfQp9CgovLyAtLS0tLS0tLS0tIHByb3RvY29sIGZlZSAtLS0tLS0tLS0tCgovLyBTZXRGZWUgc2V0cyB0aGUgcHJvdG9jb2wgZmVlIGluIGJhc2lzIHBvaW50cywgYWRtaW4gb25seSwgaGFyZC1jYXBwZWQKLy8gYXQgTWF4RmVlQnBzLiBBcHBsaWVzIHRvIEZVVFVSRSBkZXBvc2l0cyBvbmx5LgpmdW5jIFNldEZlZShjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIGZlZSBhZG1pbiBjYW4gc2V0IHRoZSBmZWUiKQoJfQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICIgKyBzdHJjb252LkZvcm1hdEludChNYXhGZWVCcHMsIDEwKSArICIgYmFzaXMgcG9pbnRzIikKCX0KCWZlZUJwcyA9IGJwcwp9CgovLyBDbGFpbUZlZXMgc2VuZHMgYWxsIGFjY3J1ZWQgcHJvdG9jb2wgZmVlcyB0byB0aGUgZmVlIGFkbWluLgpmdW5jIENsYWltRmVlcyhjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZmVlQWRtaW4gewoJCXBhbmljKCJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIGNsYWltIGZlZXMiKQoJfQoJaWYgZmVlc0FjY3J1ZWQgPT0gMCB7CgkJcGFuaWMoIm5vIGZlZXMgYWNjcnVlZCIpCgl9CglhbW91bnQgOj0gZmVlc0FjY3J1ZWQKCWZlZXNBY2NydWVkID0gMAoJZmVlc0NsYWltZWQgKz0gYW1vdW50CgoJYiA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpCgliLlNlbmRDb2lucyhjdXIuQWRkcmVzcygpLCBmZWVBZG1pbiwKCQljaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IGFtb3VudH19KQoJcmV0dXJuIGFtb3VudAp9CgovLyBOb21pbmF0ZUZlZUFkbWluIGJlZ2lucyBhIHR3by1zdGVwIGFkbWluIGhhbmRvdmVyOyB0aGUgbm9taW5lZSBtdXN0Ci8vIEFjY2VwdEZlZUFkbWluLiBQYXNzICIiIHRvIGNsZWFyIGEgcGVuZGluZyBub21pbmF0aW9uLiBUd28tc3RlcAovLyBiZWNhdXNlIHRoZSBhZG1pbiBhZGRyZXNzIGlzIGEgZnVuZHMgZGVzdGluYXRpb246IGEgdHlwbydkIG9uZS1zdGVwCi8vIHRyYW5zZmVyIHdvdWxkIHN0cmFuZCBhbGwgZnV0dXJlIGZlZXMuCmZ1bmMgTm9taW5hdGVGZWVBZG1pbihjdXIgcmVhbG0sIG5vbWluZWUgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBmZWVBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIGZlZSBhZG1pbiBjYW4gbm9taW5hdGUgYSBzdWNjZXNzb3IiKQoJfQoJaWYgbm9taW5lZSA9PSAiIiB7CgkJcGVuZGluZ0ZlZUFkbWluID0gIiIKCQlyZXR1cm4KCX0KCWlmICFub21pbmVlLklzVmFsaWQoKSB8fCBzdHJpbmcobm9taW5lZSkgIT0gc3RyaW5ncy5Ub0xvd2VyKHN0cmluZyhub21pbmVlKSkgewoJCXBhbmljKCJpbnZhbGlkIG5vbWluZWUgYWRkcmVzczogIiArIHN0cmluZyhub21pbmVlKSkKCX0KCXBlbmRpbmdGZWVBZG1pbiA9IG5vbWluZWUKfQoKLy8gQWNjZXB0RmVlQWRtaW4gY29tcGxldGVzIHRoZSBoYW5kb3Zlcjsgb25seSB0aGUgbm9taW5lZSBjYW4gYWNjZXB0LgpmdW5jIEFjY2VwdEZlZUFkbWluKGN1ciByZWFsbSkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIHBlbmRpbmdGZWVBZG1pbiA9PSAiIiB8fCBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcGVuZGluZ0ZlZUFkbWluIHsKCQlwYW5pYygiY2FsbGVyIGlzIG5vdCB0aGUgcGVuZGluZyBmZWUgYWRtaW4iKQoJfQoJZmVlQWRtaW4gPSBwZW5kaW5nRmVlQWRtaW4KCXBlbmRpbmdGZWVBZG1pbiA9ICIiCn0KCi8vIEdldEZlZUluZm8gcmV0dXJucyB0aGUgY3VycmVudCBmZWUgY29uZmlndXJhdGlvbiBhbmQgYWNjcnVlZCB0b3RhbC4KZnVuYyBHZXRGZWVJbmZvKCkgc3RyaW5nIHsKCXJldHVybiAiZmVlOiAiICsgZm9ybWF0UGN0KGZlZUJwcykgKyAiIChjYXAgIiArIGZvcm1hdFBjdChNYXhGZWVCcHMpICsKCQkiKSB8IGFkbWluOiAiICsgc3RyaW5nKGZlZUFkbWluKSArCgkJIiB8IGFjY3J1ZWQ6ICIgKyBzdHJjb252LkZvcm1hdEludChmZWVzQWNjcnVlZCwgMTApICsKCQkiIHwgY2xhaW1lZDogIiArIHN0cmNvbnYuRm9ybWF0SW50KGZlZXNDbGFpbWVkLCAxMCkKfQoKLy8gLS0tLS0tLS0tLSByZWFkLW9ubHkgcXVlcmllcyAtLS0tLS0tLS0tCgovLyBHZXRTcGxpdEluZm8gcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkuCmZ1bmMgR2V0U3BsaXRJbmZvKHNwbGl0SUQgc3RyaW5nKSBzdHJpbmcgewoJcyA6PSBtdXN0R2V0U3BsaXQoc3BsaXRJRCkKCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIlNwbGl0OiAiICsgc3BsaXRJRCArICJcbiIpCgliLldyaXRlU3RyaW5nKCJPd25lcjogIiArIHN0cmluZyhzLk93bmVyKSArICJcbiIpCglpZiBzLlBlbmRpbmdPd25lciAhPSAiIiB7CgkJLy8gYSBub21pbmVlIG11c3QgYmUgYWJsZSB0byBSRUFEIHRoZSBvZmZlciBiZWZvcmUgc3BlbmRpbmcgZ2FzCgkJLy8gcHJvYmluZyBpdCB3aXRoIEFjY2VwdE93bmVyc2hpcCAodjIgYXVkaXQgWTEtb2JzKQoJCWIuV3JpdGVTdHJpbmcoIlBlbmRpbmcgb3duZXI6ICIgKyBzdHJpbmcocy5QZW5kaW5nT3duZXIpICsgIlxuIikKCX0KCWIuV3JpdGVTdHJpbmcoIkZyb3plbjogIiArIGJvb2xTdHIocy5Gcm96ZW4pICsgIlxuIikKCWIuV3JpdGVTdHJpbmcoIkFyY2hpdmVkOiAiICsgYm9vbFN0cihzLkFyY2hpdmVkKSArICJcbiIpCgliLldyaXRlU3RyaW5nKCJUb3RhbCBkZXBvc2l0ZWQ6ICIgKyBzdHJjb252LkZvcm1hdEludChzLlRvdGFsRGVwb3NpdGVkLCAxMCkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiVG90YWwgY2xhaW1lZDogIiArIHN0cmNvbnYuRm9ybWF0SW50KHMuVG90YWxDbGFpbWVkLCAxMCkgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiUmVjaXBpZW50czpcbiIpCglmb3IgaSwgciA6PSByYW5nZSBzLlJlY2lwaWVudHMgewoJCWIuV3JpdGVTdHJpbmcoIiAgIiArIHN0cmluZyhyKSArICIgICIgKyBmb3JtYXRQY3Qocy5TaGFyZXNbaV0pICsgIiAgY2xhaW1hYmxlOiAiICsgc3RyY29udi5Gb3JtYXRJbnQocy5CYWxhbmNlc1tyXSwgMTApICsgIlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIEdldFBlbmRpbmdPd25lciByZXR1cm5zIHRoZSBzdGFnZWQgbm9taW5lZSBmb3IgYSBzcGxpdCwgb3IgIiIgd2hlbiBubwovLyBoYW5kb3ZlciBpcyBwZW5kaW5nLiBUaGUgY29uc2VudCBoYWxmIG9mIGEgdHdvLXN0ZXAgdHJhbnNmZXIgb25seSBtZWFucwovLyBzb21ldGhpbmcgaWYgdGhlIG5vbWluZWUgY2FuIGluc3BlY3QgdGhlIG9mZmVyIHdpdGhvdXQgcGF5aW5nIGdhcyB0bwovLyBwcm9iZSBpdCAodjIgYXVkaXQgWTEtb2JzKTsgdGhpcyBpcyB0aGF0IHJlYWQgcGF0aC4KZnVuYyBHZXRQZW5kaW5nT3duZXIoc3BsaXRJRCBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5nKG11c3RHZXRTcGxpdChzcGxpdElEKS5QZW5kaW5nT3duZXIpCn0KCi8vIEdldENsYWltYWJsZSByZXR1cm5zIGNsYWltYWJsZSBiYWxhbmNlIGZvciBhbiBhZGRyZXNzLgpmdW5jIEdldENsYWltYWJsZShzcGxpdElEIHN0cmluZywgYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglzIDo9IG11c3RHZXRTcGxpdChzcGxpdElEKQoJcmV0dXJuIHMuQmFsYW5jZXNbYWRkcl0KfQoKLy8gLS0tLS0tLS0tLSByZW5kZXIgLS0tLS0tLS0tLQoKLy8gUmVuZGVyIHJldHVybnMgYSBtYXJrZG93biBvdmVydmlldy4gTmV2ZXIgcGFuaWNzLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIGxlbihzcGxpdElEcykgPT0gMCB7CgkJcmV0dXJuICIjIEZlZSBTcGxpdFxuXG5ObyBhY3RpdmUgc3BsaXRzLlxuIgoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBGZWUgU3BsaXRcblxuIikKCWlmIGZlZUJwcyA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIioqUHJvdG9jb2wgZmVlOioqICIgKyBmb3JtYXRQY3QoZmVlQnBzKSArICIgKGhhcmQgY2FwICIgKyBmb3JtYXRQY3QoTWF4RmVlQnBzKSArICIpXG5cbiIpCgl9CgoJc2hvdyA6PSBzcGxpdElEcwoJaWYgbGVuKHNob3cpID4gTWF4UmVuZGVyU3BsaXRzIHsKCQliLldyaXRlU3RyaW5nKCJfU2hvd2luZyB0aGUgbW9zdCByZWNlbnQgIiArIHN0cmNvbnYuSXRvYShNYXhSZW5kZXJTcGxpdHMpICsgIiBhY3RpdmUgc3BsaXRzLl9cblxuIikKCQlzaG93ID0gc2hvd1tsZW4oc2hvdyktTWF4UmVuZGVyU3BsaXRzOl0KCX0KCWZvciBfLCBpZCA6PSByYW5nZSBzaG93IHsKCQlzIDo9IHNwbGl0c1tpZF0KCQliLldyaXRlU3RyaW5nKCIjIyAiICsgaWQgKyAiXG5cbiIpCgkJaWYgcyA9PSBuaWwgewoJCQliLldyaXRlU3RyaW5nKCJfKGludmFsaWQpX1xuXG4iKQoJCQljb250aW51ZQoJCX0KCQliLldyaXRlU3RyaW5nKCJgYGBcbiIpCgkJYi5Xcml0ZVN0cmluZygiT3duZXI6ICIgKyBzdHJpbmcocy5Pd25lcikgKyAiXG4iKQoJCWlmIHMuUGVuZGluZ093bmVyICE9ICIiIHsKCQkJYi5Xcml0ZVN0cmluZygiUGVuZGluZyBvd25lcjogIiArIHN0cmluZyhzLlBlbmRpbmdPd25lcikgKyAiXG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCJGcm96ZW46ICIgKyBib29sU3RyKHMuRnJvemVuKSArICJcbiIpCgkJYi5Xcml0ZVN0cmluZygiVG90YWwgZGVwb3NpdGVkOiAiICsgc3RyY29udi5Gb3JtYXRJbnQocy5Ub3RhbERlcG9zaXRlZCwgMTApICsgIlxuIikKCQliLldyaXRlU3RyaW5nKCJUb3RhbCBjbGFpbWVkOiAiICsgc3RyY29udi5Gb3JtYXRJbnQocy5Ub3RhbENsYWltZWQsIDEwKSArICJcbiIpCgkJaWYgbGVuKHMuUmVjaXBpZW50cykgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiUmVjaXBpZW50czpcbiIpCgkJCWZvciBpLCByIDo9IHJhbmdlIHMuUmVjaXBpZW50cyB7CgkJCQlzaGFyZSA6PSAiPz8lIgoJCQkJaWYgaSA8IGxlbihzLlNoYXJlcykgewoJCQkJCXNoYXJlID0gZm9ybWF0UGN0KHMuU2hhcmVzW2ldKQoJCQkJfQoJCQkJYmFsIDo9ICIwIgoJCQkJaWYgcy5CYWxhbmNlcyAhPSBuaWwgewoJCQkJCWJhbCA9IHN0cmNvbnYuRm9ybWF0SW50KHMuQmFsYW5jZXNbcl0sIDEwKQoJCQkJfQoJCQkJYi5Xcml0ZVN0cmluZygiICAiICsgc3RyaW5nKHIpICsgIiAgIiArIHNoYXJlICsgIiAgY2xhaW1hYmxlOiAiICsgYmFsICsgIlxuIikKCQkJfQoJCX0KCQliLldyaXRlU3RyaW5nKCJgYGBcblxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KGu60AgoSZmVlX3NwbGl0X3Rlc3QuZ25vEta0AnBhY2thZ2UgZmVlX3NwbGl0CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgp2YXIgKAoJb3duZXIgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoIm93bmVyIikKCWFsaWNlICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpCglib2IgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYm9iIikKCWNhcm9sICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJjYXJvbCIpCglkYXZlICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZGF2ZSIpCglhdHRhY2tlciA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYXR0YWNrZXIiKQopCgovLyByZXNldFN0YXRlIHJlc2V0cyBhbGwgcGFja2FnZS1sZXZlbCBzdGF0ZSBiZXR3ZWVuIHRlc3RzLgovLyBSZXF1aXJlZCBiZWNhdXNlIEdubyB0ZXN0IGZ1bmN0aW9ucyBzaGFyZSB0aGUgc2FtZSBWTSBjb250ZXh0LgpmdW5jIHJlc2V0U3RhdGUoKSB7CglzcGxpdHMgPSBtYWtlKG1hcFtzdHJpbmddKlNwbGl0KQoJc3BsaXRJRHMgPSBbXXN0cmluZ3t9Cglvd25lclNwbGl0cyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJbmV4dElEID0gMQoJZmVlQnBzID0gMAoJZmVlQWRtaW4gPSBmZWVBZG1pbkFkZHIKCXBlbmRpbmdGZWVBZG1pbiA9ICIiCglmZWVzQWNjcnVlZCA9IDAKCWZlZXNDbGFpbWVkID0gMAp9Cgp2YXIgZmVlQWRtaW5BZGRyID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJmZWVhZG1pbiIpCgpmdW5jIGFkZHJMaXN0KGFkZHJzIC4uLmFkZHJlc3MpIHN0cmluZyB7CglwYXJ0cyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oYWRkcnMpKQoJZm9yIGksIGEgOj0gcmFuZ2UgYWRkcnMgewoJCXBhcnRzW2ldID0gc3RyaW5nKGEpCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCIpCn0KCi8vIGZ1bmQgZ2l2ZXMgdGhlIHJlYWxtJ3MgcGFja2FnZSBhZGRyZXNzIGNvaW5zIHNvIENsYWltIHBheW91dHMgc3VjY2VlZCwKLy8gbWlycm9yaW5nIHRoZSBkZXBvc2l0cyB0aGUgYWNjb3VudGluZyByZWNvcmRzLgpmdW5jIGZ1bmQoYW1vdW50IGludDY0KSB7Cglwa2dBZGRyIDo9IGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvZmVlX3NwbGl0L3YyIikKCXRlc3RpbmcuSXNzdWVDb2lucyhwa2dBZGRyLCBjaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IGFtb3VudH19KQp9CgovLyBkZXBvc2l0IHBlcmZvcm1zIGEgY29pbi1iYWNrZWQgZGVwb3NpdCBhcyBhZGRyLgpmdW5jIGRlcG9zaXQoY3VyIHJlYWxtLCBhZGRyIGFkZHJlc3MsIHNwbGl0SUQgc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRkcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e0Rlbm9tOiBEZW5vbSwgQW1vdW50OiBhbW91bnR9fSkKCWZ1bmQoYW1vdW50KQoJRGVwb3NpdChjcm9zcyhjdXIpLCBzcGxpdElEKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKfQoKLy8gLS0tLS0tLS0tLSBDcmVhdGVTcGxpdCAtLS0tLS0tLS0tCgpmdW5jIFRlc3RDcmVhdGVTcGxpdF9CYXNpYyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjYwMDAsNDAwMCIpCgl1YXNzZXJ0LkVxdWFsKHQsICJzcGxpdF8xIiwgaWQpCgoJcyA6PSBzcGxpdHNbInNwbGl0XzEiXQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcob3duZXIpLCBzdHJpbmcocy5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihzLlJlY2lwaWVudHMpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcoYWxpY2UpLCBzdHJpbmcocy5SZWNpcGllbnRzWzBdKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGJvYiksIHN0cmluZyhzLlJlY2lwaWVudHNbMV0pKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg2MDAwKSwgcy5TaGFyZXNbMF0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDQwMDApLCBzLlNoYXJlc1sxXSkKCXVhc3NlcnQuRmFsc2UodCwgcy5Gcm96ZW4sICJuZXcgc3BsaXQgbXVzdCBub3QgYmUgZnJvemVuIikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHMuVG90YWxEZXBvc2l0ZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBzLlRvdGFsQ2xhaW1lZCkKfQoKZnVuYyBUZXN0Q3JlYXRlU3BsaXRfSURzSW5jcmVtZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCWlkMSA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglpZDIgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYm9iKSwgIjEwMDAwIikKCXVhc3NlcnQuRXF1YWwodCwgInNwbGl0XzEiLCBpZDEpCgl1YXNzZXJ0LkVxdWFsKHQsICJzcGxpdF8yIiwgaWQyKQp9CgpmdW5jIFRlc3RDcmVhdGVTcGxpdF9EdXBsaWNhdGVSZWNpcGllbnQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImR1cGxpY2F0ZSByZWNpcGllbnQ6ICIrc3RyaW5nKGFsaWNlKSwKCQlmdW5jKCkgeyBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYWxpY2UpLCAiNTAwMCw1MDAwIikgfSwKCSkKfQoKZnVuYyBUZXN0Q3JlYXRlU3BsaXRfU2hhcmVzRG9udFN1bShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic2hhcmVzIG11c3Qgc3VtIHRvIDEwMDAwIGJhc2lzIHBvaW50cywgZ290IDUwMDAiLAoJCWZ1bmMoKSB7IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjUwMDAiKSB9LAoJKQp9CgpmdW5jIFRlc3RDcmVhdGVTcGxpdF9MZW5ndGhNaXNtYXRjaChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkicmVjaXBpZW50cyBhbmQgc2hhcmVzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiLAoJCWZ1bmMoKSB7IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiMTAwMDAiKSB9LAoJKQp9CgpmdW5jIFRlc3RDcmVhdGVTcGxpdF9JbnZhbGlkQWRkcmVzc1JlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJpbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzOiBub3RfYW5fYWRkcmVzcyIsCgkJZnVuYygpIHsgQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgIm5vdF9hbl9hZGRyZXNzIiwgIjEwMDAwIikgfSwKCSkKfQoKZnVuYyBUZXN0Q3JlYXRlU3BsaXRfUGVyT3duZXJMaW1pdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCglmb3IgaSA6PSAwOyBpIDwgTWF4U3BsaXRzUGVyT3duZXI7IGkrKyB7CgkJQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJfQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInBlci1vd25lciBzcGxpdCBsaW1pdCByZWFjaGVkIiwKCQlmdW5jKCkgeyBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpIH0sCgkpCn0KCi8vIC0tLS0tLS0tLS0gRGVwb3NpdCAoY29pbi1iYWNrZWQpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdERlcG9zaXRfVXNlc1NlbnRDb2lucyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiNTAwMCw1MDAwIikKCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDAwKQoKCXMgOj0gc3BsaXRzW2lkXQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDAwKSwgcy5Ub3RhbERlcG9zaXRlZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwKSwgcy5CYWxhbmNlc1thbGljZV0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUwMCksIHMuQmFsYW5jZXNbYm9iXSkKfQoKZnVuYyBUZXN0RGVwb3NpdF9Ob0NvaW5zUGFuaWNzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoKCS8vIG5vIFNldE9yaWdpblNlbmQ6IG5vdGhpbmcgYXR0YWNoZWQgdG8gdGhlIGNhbGwKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiZGVwb3NpdCBtdXN0IHNlbmQgZXhhY3RseSBvbmUgY29pbiBvZiAiK0Rlbm9tLAoJCWZ1bmMoKSB7IERlcG9zaXQoY3Jvc3MoY3VyKSwgaWQpIH0sCgkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBzcGxpdHNbaWRdLlRvdGFsRGVwb3NpdGVkKQp9CgpmdW5jIFRlc3REZXBvc2l0X1dyb25nRGVub21QYW5pY3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogInVmb28iLCBBbW91bnQ6IDEwMH19KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImRlcG9zaXQgbXVzdCBzZW5kIGV4YWN0bHkgb25lIGNvaW4gb2YgIitEZW5vbSwKCQlmdW5jKCkgeyBEZXBvc2l0KGNyb3NzKGN1ciksIGlkKSB9LAoJKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKfQoKZnVuYyBUZXN0RGVwb3NpdF9Sb3VuZGluZ0R1c3RHb2VzVG9IaWdoZXN0U2hhcmUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iLCBjYXJvbCksICIzMzM0LDMzMzMsMzMzMyIpCgoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTApCgoJcyA6PSBzcGxpdHNbaWRdCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwKSwgcy5Ub3RhbERlcG9zaXRlZCkKCS8vIGFsaWNlOiAoMTAqMzMzNCkvMTAwMDAgPSAzLCArMSBkdXN0IChoaWdoZXN0IHNoYXJlKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg0KSwgcy5CYWxhbmNlc1thbGljZV0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMpLCBzLkJhbGFuY2VzW2JvYl0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMpLCBzLkJhbGFuY2VzW2Nhcm9sXSkKfQoKZnVuYyBUZXN0RGVwb3NpdF9BY2N1bXVsYXRlc0Fjcm9zc011bHRpcGxlRGVwb3NpdHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjUwMDAsNTAwMCIpCgoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTAwKQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMjAwKQoKCXMgOj0gc3BsaXRzW2lkXQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzMDApLCBzLlRvdGFsRGVwb3NpdGVkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxNTApLCBzLkJhbGFuY2VzW2FsaWNlXSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTUwKSwgcy5CYWxhbmNlc1tib2JdKQp9CgpmdW5jIFRlc3REZXBvc2l0X092ZXJmbG93R3VhcmQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogRGVub20sIEFtb3VudDogTWF4RGVwb3NpdEFtb3VudCArIDF9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJkZXBvc2l0IGV4Y2VlZHMgbWF4aW11bSBzdXBwb3J0ZWQgYW1vdW50IiwKCQlmdW5jKCkgeyBEZXBvc2l0KGNyb3NzKGN1ciksIGlkKSB9LAoJKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHNwbGl0c1tpZF0uVG90YWxEZXBvc2l0ZWQpCn0KCmZ1bmMgVGVzdERlcG9zaXRfRnJvemVuU3BsaXRQYW5pY3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglGcmVlemUoY3Jvc3MoY3VyKSwgaWQpCgoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogRGVub20sIEFtb3VudDogMTAwfX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic3BsaXQgaXMgZnJvemVuIiwKCQlmdW5jKCkgeyBEZXBvc2l0KGNyb3NzKGN1ciksIGlkKSB9LAoJKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKfQoKZnVuYyBUZXN0RGVwb3NpdF9Vbmtub3duU3BsaXRQYW5pY3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInNwbGl0IG5vdCBmb3VuZDogc3BsaXRfOTkiLAoJCWZ1bmMoKSB7IERlcG9zaXQoY3Jvc3MoY3VyKSwgInNwbGl0Xzk5IikgfSwKCSkKfQoKLy8gLS0tLS0tLS0tLSBDbGFpbSAocGF5cyBvdXQgY29pbnMpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdENsYWltX1NlbmRzQ29pbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjcwMDAsMzAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDAwMCkKCgliZWZvcmUgOj0gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbnMoYWxpY2UpLkFtb3VudE9mKERlbm9tKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJY2xhaW1lZCA6PSBDbGFpbShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNzAwMCksIGNsYWltZWQpCgoJYWZ0ZXIgOj0gYmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkuR2V0Q29pbnMoYWxpY2UpLkFtb3VudE9mKERlbm9tKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg3MDAwKSwgYWZ0ZXItYmVmb3JlKQoKCXMgOj0gc3BsaXRzW2lkXQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgcy5CYWxhbmNlc1thbGljZV0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDcwMDApLCBzLlRvdGFsQ2xhaW1lZCkKfQoKZnVuYyBUZXN0Q2xhaW1fQ2FsbGVySWRlbnRpdHlJc0VuZm9yY2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTAwKQoKCS8vIHRoZSBhdHRhY2tlciBjYW5ub3QgY2xhaW0gYWxpY2UncyBiYWxhbmNlOiBpZGVudGl0eSBjb21lcyBmcm9tIHRoZQoJLy8gY2hhaW4sIG5vdCBmcm9tIGFuIGFyZ3VtZW50Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJub3QgYSByZWNpcGllbnQgb2YgdGhpcyBzcGxpdCIsCgkJZnVuYygpIHsgQ2xhaW0oY3Jvc3MoY3VyKSwgaWQpIH0sCgkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMCksIHNwbGl0c1tpZF0uQmFsYW5jZXNbYWxpY2VdKQp9CgpmdW5jIFRlc3RDbGFpbV9Ob3RoaW5nVG9DbGFpbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiNTAwMCw1MDAwIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJub3RoaW5nIHRvIGNsYWltIiwKCQlmdW5jKCkgeyBDbGFpbShjcm9zcyhjdXIpLCBpZCkgfSwKCSkKfQoKZnVuYyBUZXN0Q2xhaW1fQ2Fubm90Q2xhaW1Ud2ljZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgaWQsIDEwMCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCUNsYWltKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJIm5vdGhpbmcgdG8gY2xhaW0iLAoJCWZ1bmMoKSB7IENsYWltKGNyb3NzKGN1ciksIGlkKSB9LAoJKQp9CgpmdW5jIFRlc3RDbGFpbV9FeFJlY2lwaWVudEtlZXBzQWNjcnVlZEJhbGFuY2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjUwMDAsNTAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJVXBkYXRlU2hhcmVzKGNyb3NzKGN1ciksIGlkLCBhZGRyTGlzdChjYXJvbCwgZGF2ZSksICI2MDAwLDQwMDAiKQoKCS8vIGJvYiB3YXMgcmVtb3ZlZCBidXQga2VlcHMg4oCUIGFuZCBjYW4gY2xhaW0g4oCUIGhpcyBhY2NydWVkIDUwMAoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJY2xhaW1lZCA6PSBDbGFpbShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwKSwgY2xhaW1lZCkKfQoKLy8gLS0tLS0tLS0tLSBVcGRhdGVTaGFyZXMgLS0tLS0tLS0tLQoKZnVuYyBUZXN0VXBkYXRlU2hhcmVzX0Jhc2ljKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UsIGJvYiksICI1MDAwLDUwMDAiKQoKCVVwZGF0ZVNoYXJlcyhjcm9zcyhjdXIpLCBpZCwgYWRkckxpc3QoYWxpY2UsIGNhcm9sKSwgIjcwMDAsMzAwMCIpCgoJcyA6PSBzcGxpdHNbaWRdCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihzLlJlY2lwaWVudHMpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcoYWxpY2UpLCBzdHJpbmcocy5SZWNpcGllbnRzWzBdKSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGNhcm9sKSwgc3RyaW5nKHMuUmVjaXBpZW50c1sxXSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDcwMDApLCBzLlNoYXJlc1swXSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMzAwMCksIHMuU2hhcmVzWzFdKQp9CgpmdW5jIFRlc3RVcGRhdGVTaGFyZXNfUHJlc2VydmVzVW5jbGFpbWVkQmFsYW5jZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjUwMDAsNTAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJVXBkYXRlU2hhcmVzKGNyb3NzKGN1ciksIGlkLCBhZGRyTGlzdChjYXJvbCwgZGF2ZSksICI2MDAwLDQwMDAiKQoKCXMgOj0gc3BsaXRzW2lkXQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MDApLCBzLkJhbGFuY2VzW2FsaWNlXSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwKSwgcy5CYWxhbmNlc1tib2JdKQp9CgpmdW5jIFRlc3RVcGRhdGVTaGFyZXNfV3JvbmdPd25lcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGF0dGFja2VyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJvbmx5IHRoZSBvd25lciBjYW4gdXBkYXRlIHNoYXJlcyIsCgkJZnVuYygpIHsgVXBkYXRlU2hhcmVzKGNyb3NzKGN1ciksIGlkLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpIH0sCgkpCn0KCmZ1bmMgVGVzdFVwZGF0ZVNoYXJlc19Gcm96ZW5TcGxpdFBhbmljcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCUZyZWV6ZShjcm9zcyhjdXIpLCBpZCkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkic3BsaXQgaXMgZnJvemVuIiwKCQlmdW5jKCkgeyBVcGRhdGVTaGFyZXMoY3Jvc3MoY3VyKSwgaWQsIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiNTAwMCw1MDAwIikgfSwKCSkKfQoKLy8gLS0tLS0tLS0tLSBUcmFuc2Zlck93bmVyc2hpcCAvIEFjY2VwdE93bmVyc2hpcCAodHdvLXN0ZXAsIHYyIFkxKSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RUcmFuc2Zlck93bmVyc2hpcF9Ud29TdGVwKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGlkLCBib2IpCgkvLyBzdGFnaW5nIG1vdmVzIE5PVEhJTkc6IG93bmVyLCBib3RoIHF1b3RhcyB1bmNoYW5nZWQKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKG93bmVyKSwgc3RyaW5nKHNwbGl0c1tpZF0uT3duZXIpKQoJdWFzc2VydC5FcXVhbCh0LCBzdHJpbmcoYm9iKSwgc3RyaW5nKHNwbGl0c1tpZF0uUGVuZGluZ093bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgb3duZXJTcGxpdHNbb3duZXJdKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBvd25lclNwbGl0c1tib2JdKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGJvYiksIHN0cmluZyhzcGxpdHNbaWRdLk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHN0cmluZyhzcGxpdHNbaWRdLlBlbmRpbmdPd25lcikpCn0KCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwX1dyb25nT3duZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgb3duZXIgY2FuIHRyYW5zZmVyIG93bmVyc2hpcCIsCgkJZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGF0dGFja2VyKSB9LAoJKQp9CgpmdW5jIFRlc3RBY2NlcHRPd25lcnNoaXBfT25seU5vbWluZWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCwgYm9iKQoKCS8vIGEgbm9uLW5vbWluZWUgY2Fubm90IGFjY2VwdCDigJQgaW5jbHVkaW5nIHdpdGggbm8gbm9taW5hdGlvbiBzdGFnZWQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIiLAoJCWZ1bmMoKSB7IEFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCkgfSwKCSkKCS8vIHRoZSBvd25lciBjbGVhcnMgdGhlIG5vbWluYXRpb247IHRoZSBleC1ub21pbmVlIGNhbiBubyBsb25nZXIgYWNjZXB0Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGlkLCAiIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIG93bmVyIiwKCQlmdW5jKCkgeyBBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQpIH0sCgkpCn0KCmZ1bmMgVGVzdEFjY2VwdE93bmVyc2hpcF9Nb3Zlc093bmVyU2xvdEF0Q29uc2VudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCXVhc3NlcnQuRXF1YWwodCwgMSwgb3duZXJTcGxpdHNbb3duZXJdKQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGJvYikKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCglBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQpCgoJLy8gdGhlIGNyZWF0b3IncyBzbG90IGlzIGZyZWVkOyB0aGUgYWNjZXB0b3IncyBpcyBjb25zdW1lZAoJdWFzc2VydC5FcXVhbCh0LCAwLCBvd25lclNwbGl0c1tvd25lcl0pCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIG93bmVyU3BsaXRzW2JvYl0pCgoJLy8gYW5kIHRoZSBjcmVhdG9yIGNhbiBmaWxsIHRoZSBmcmVlZCBzbG90IGFnYWluCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWZvciBpIDo9IDA7IGkgPCBNYXhTcGxpdHNQZXJPd25lcjsgaSsrIHsKCQlDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgl9Cn0KCmZ1bmMgVGVzdEFjY2VwdE93bmVyc2hpcF9BY2NlcHRvckF0TGltaXRCbG9ja2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCWZvciBpIDo9IDA7IGkgPCBNYXhTcGxpdHNQZXJPd25lcjsgaSsrIHsKCQlDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgl9CgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCwgYm9iKQoKCS8vIHRoZSBxdW90YSBnYXRlIGZpcmVzIGF0IEFDQ0VQVCwgYWdhaW5zdCB0aGUgYWNjZXB0b3IncyBvd24gY291bnQKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJuZXcgb3duZXIgaXMgYXQgdGhlIHBlci1vd25lciBzcGxpdCBsaW1pdCIsCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGlkKSB9LAoJKQp9CgovLyBUaGUgdjIgYXVkaXQgWTEgZ3JpZWZpbmcgc2NlbmFyaW8gaXMgZGVhZDogc3RhZ2luZyBhIHRyYW5zZmVyIGF0IGEKLy8gdmljdGltIGNvbnN1bWVzIG5vbmUgb2YgdGhlIHZpY3RpbSdzIHF1b3RhIGFuZCBjaGFuZ2VzIG5vdGhpbmcgdGhlCi8vIHZpY3RpbSBtdXN0IGFjdCBvbi4KZnVuYyBUZXN0VHJhbnNmZXJPd25lcnNoaXBfVW5jb25zZW50ZWRHcmllZkRlZnVzZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCglmb3IgaSA6PSAwOyBpIDwgTWF4U3BsaXRzUGVyT3duZXI7IGkrKyB7CgkJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGlkLCBib2IpIC8vIHN0YWdlZCBhdCB0aGUgdmljdGltLCBuZXZlciBhY2NlcHRlZAoJfQoJLy8gdmljdGltIHF1b3RhIHVudG91Y2hlZDsgdmljdGltIGNhbiBzdGlsbCBjcmVhdGUgYSBmdWxsIHF1b3RhIG9mIHNwbGl0cwoJdWFzc2VydC5FcXVhbCh0LCAwLCBvd25lclNwbGl0c1tib2JdKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJZm9yIGkgOj0gMDsgaSA8IE1heFNwbGl0c1Blck93bmVyOyBpKysgewoJCUNyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCX0KCS8vIHdoaWxlIHRoZSBhdHRhY2tlcidzIG93biBidWRnZXQgc3RheXMgY29uc3VtZWQg4oCUIGFzIGRvY3VtZW50ZWQKCXVhc3NlcnQuRXF1YWwodCwgTWF4U3BsaXRzUGVyT3duZXIsIG93bmVyU3BsaXRzW2F0dGFja2VyXSkKfQoKLy8gU2VsZi10cmFuc2ZlciBpcyByZWZ1c2VkIGF0IFNUQUdFIHRpbWUuIFRoaXMgZ3VhcmQgaXMgd2hhdCBtYWtlcwovLyBzZWxmLWFjY2VwdCB1bnJlYWNoYWJsZSwgYW5kIHNvIHdoYXQga2VlcHMgQWNjZXB0T3duZXJzaGlwJ3MgLTEvKzEKLy8gcXVvdGEgcGFpciBmcm9tIGNvbGxhcHNpbmcgb250byBvbmUgYWRkcmVzcyAodjIgYXVkaXQgRy03LjEpLgpmdW5jIFRlc3RUcmFuc2Zlck93bmVyc2hpcF9TZWxmUmVmdXNlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkibmV3IG93bmVyIGlzIGFscmVhZHkgdGhlIG93bmVyIiwKCQlmdW5jKCkgeyBUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCwgb3duZXIpIH0sCgkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIG93bmVyU3BsaXRzW293bmVyXSkKfQoKLy8gUmUtc3RhZ2luZyBvdmVyd3JpdGVzIHRoZSBwcmlvciBub21pbmF0aW9uOyBvbmx5IHRoZSBsYXRlc3Qgbm9taW5lZQovLyBjYW4gYWNjZXB0ICh2MiBhdWRpdCBHLTcuNCkuCmZ1bmMgVGVzdFRyYW5zZmVyT3duZXJzaGlwX1Jlc3RhZ2VPdmVyd3JpdGVzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGJvYikKCVRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGlkLCBhbGljZSkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGFsaWNlKSwgR2V0UGVuZGluZ093bmVyKGlkKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGJvYikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY2FsbGVyIGlzIG5vdCB0aGUgcGVuZGluZyBvd25lciIsCgkJZnVuYygpIHsgQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGlkKSB9LAoJKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCglBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhhbGljZSksIHN0cmluZyhzcGxpdHNbaWRdLk93bmVyKSkKfQoKLy8gQSBub21pbmF0aW9uIG9uIGEgc3BsaXQgdGhhdCBpcyBsYXRlciBhcmNoaXZlZCBpcyBpbmVydCDigJQgdGhlIGRvYwovLyBjb21tZW50IG9uIEFjY2VwdE93bmVyc2hpcCBjbGFpbXMgaXQsIHRoaXMgcGlucyBpdCAodjIgYXVkaXQgRy03LjIpLgpmdW5jIFRlc3RBY2NlcHRPd25lcnNoaXBfQXJjaGl2ZWRSZWZ1c2VkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGJvYikKCUFyY2hpdmUoY3Jvc3MoY3VyKSwgaWQpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGxpdCBpcyBhcmNoaXZlZDogIitpZCwKCQlmdW5jKCkgeyBBY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQpIH0sCgkpCgkvLyB0aGUgYXJjaGl2ZWQgc3BsaXQncyBzbG90IHN0YXlzIHJldHVybmVkIHRvIGl0cyBjcmVhdG9yLCBub3QgdGhlIG5vbWluZWUKCXVhc3NlcnQuRXF1YWwodCwgMCwgb3duZXJTcGxpdHNbb3duZXJdKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBvd25lclNwbGl0c1tib2JdKQp9CgovLyBGcmVlemluZyBsb2NrcyBzaGFyZXMgYW5kIGRlcG9zaXRzLCBub3QgY3VzdG9keTogYSBmcm96ZW4gc3BsaXQgc3RheXMKLy8gdHJhbnNmZXJhYmxlIHNvIGl0cyBvd25lciBjYW4gaGFuZCBvZmYgY2xhaW0tc2VydmljaW5nIGR1dHkKLy8gKHYyIGF1ZGl0IEctNy4zKS4KZnVuYyBUZXN0QWNjZXB0T3duZXJzaGlwX0Zyb3plbkFsbG93ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglUcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCwgYm9iKQoJRnJlZXplKGNyb3NzKGN1ciksIGlkKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCUFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGJvYiksIHN0cmluZyhzcGxpdHNbaWRdLk93bmVyKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzcGxpdHNbaWRdLkZyb3plbikKfQoKLy8gVGhlIG5vbWluZWUgY2FuIHJlYWQgdGhlIG9mZmVyIHdpdGhvdXQgcGF5aW5nIGdhcyB0byBwcm9iZSBpdCwgYW5kIHRoZQovLyBwZW5kaW5nIGxpbmUgZGlzYXBwZWFycyBvbmNlIGNvbnN1bWVkIG9yIGNsZWFyZWQgKHYyIGF1ZGl0IFkxLW9icykuCmZ1bmMgVGVzdFBlbmRpbmdPd25lcl9SZWFkU3VyZmFjZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCXVhc3NlcnQuRXF1YWwodCwgIiIsIEdldFBlbmRpbmdPd25lcihpZCkpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMoR2V0U3BsaXRJbmZvKGlkKSwgIlBlbmRpbmcgb3duZXI6IikpCgoJVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGJvYikKCXVhc3NlcnQuRXF1YWwodCwgc3RyaW5nKGJvYiksIEdldFBlbmRpbmdPd25lcihpZCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhHZXRTcGxpdEluZm8oaWQpLCAiUGVuZGluZyBvd25lcjogIitzdHJpbmcoYm9iKSkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIiIpLCAiUGVuZGluZyBvd25lcjogIitzdHJpbmcoYm9iKSkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShib2IpKQoJQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgR2V0UGVuZGluZ093bmVyKGlkKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhHZXRTcGxpdEluZm8oaWQpLCAiUGVuZGluZyBvd25lcjoiKSkKfQoKLy8gLS0tLS0tLS0tLSBGcmVlemUgLS0tLS0tLS0tLQoKZnVuYyBUZXN0RnJlZXplX0Jhc2ljKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoKCUZyZWV6ZShjcm9zcyhjdXIpLCBpZCkKCXVhc3NlcnQuVHJ1ZSh0LCBzcGxpdHNbaWRdLkZyb3plbiwgInNwbGl0IG11c3QgYmUgZnJvemVuIGFmdGVyIEZyZWV6ZSgpIikKfQoKZnVuYyBUZXN0RnJlZXplX1dyb25nT3duZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkib25seSB0aGUgb3duZXIgY2FuIGZyZWV6ZSIsCgkJZnVuYygpIHsgRnJlZXplKGNyb3NzKGN1ciksIGlkKSB9LAoJKQp9CgpmdW5jIFRlc3RGcmVlemVfQ2xhaW1zU3RpbGxXb3JrKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTAwKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJRnJlZXplKGNyb3NzKGN1ciksIGlkKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDApLCBDbGFpbShjcm9zcyhjdXIpLCBpZCkpCn0KCi8vIC0tLS0tLS0tLS0gQXJjaGl2ZSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RBcmNoaXZlX0Jsb2Nrc1dpdGhPdXRzdGFuZGluZ0JhbGFuY2UoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY2Fubm90IGFyY2hpdmU6IG91dHN0YW5kaW5nIGJhbGFuY2UgZm9yICIrc3RyaW5nKGFsaWNlKSwKCQlmdW5jKCkgeyBBcmNoaXZlKGNyb3NzKGN1ciksIGlkKSB9LAoJKQp9CgpmdW5jIFRlc3RBcmNoaXZlX0Jsb2Nrc09uRXhSZWNpcGllbnRCYWxhbmNlKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UsIGJvYiksICI1MDAwLDUwMDAiKQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTAwMCkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCS8vIHJlbW92ZSBib2I7IGhpcyA1MDAgc3RheXMgY2xhaW1hYmxlCglVcGRhdGVTaGFyZXMoY3Jvc3MoY3VyKSwgaWQsIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJQ2xhaW0oY3Jvc3MoY3VyKSwgaWQpCgoJLy8gYXJjaGl2ZSBtdXN0IHJlZnVzZSB3aGlsZSB0aGUgRVgtcmVjaXBpZW50IHN0aWxsIGhhcyBhIGJhbGFuY2Ug4oCUCgkvLyBhcmNoaXZpbmcgd291bGQgbG9jayBoaXMgY2xhaW0gZm9yZXZlcgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiY2Fubm90IGFyY2hpdmU6IG91dHN0YW5kaW5nIGJhbGFuY2UgZm9yICIrc3RyaW5nKGJvYiksCgkJZnVuYygpIHsgQXJjaGl2ZShjcm9zcyhjdXIpLCBpZCkgfSwKCSkKCgkvLyBvbmNlIGJvYiBjbGFpbXMsIGFyY2hpdmUgc3VjY2VlZHMKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYm9iKSkKCUNsYWltKGNyb3NzKGN1ciksIGlkKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglBcmNoaXZlKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5UcnVlKHQsIHNwbGl0c1tpZF0uQXJjaGl2ZWQsICJzcGxpdCBtdXN0IGJlIGFyY2hpdmVkIikKfQoKLy8gLS0tLS0tLS0tLSBxdWVyaWVzIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdEdldENsYWltYWJsZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiODAwMCwyMDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgaWQsIDUwMDApCgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg0MDAwKSwgR2V0Q2xhaW1hYmxlKGlkLCBhbGljZSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMDApLCBHZXRDbGFpbWFibGUoaWQsIGJvYikpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBHZXRDbGFpbWFibGUoaWQsIGF0dGFja2VyKSkKfQoKZnVuYyBUZXN0R2V0U3BsaXRJbmZvX0NvbnRhaW5zRXhwZWN0ZWRGaWVsZHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjUwMDAsNTAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAyMDApCgoJaW5mbyA6PSBHZXRTcGxpdEluZm8oaWQpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmZvLCAiT3duZXIiKSwgIkdldFNwbGl0SW5mbyBvdXRwdXQgbXVzdCBjb250YWluICdPd25lciciKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5mbywgc3RyaW5nKG93bmVyKSksICJHZXRTcGxpdEluZm8gb3V0cHV0IG11c3QgY29udGFpbiBvd25lciBhZGRyZXNzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGluZm8sIHN0cmluZyhhbGljZSkpLCAiR2V0U3BsaXRJbmZvIG91dHB1dCBtdXN0IGNvbnRhaW4gcmVjaXBpZW50IikKfQoKLy8gLS0tLS0tLS0tLSByZW5kZXIgLS0tLS0tLS0tLQoKZnVuYyBUZXN0UmVuZGVyX0VtcHR5U3RhdGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LkVxdWFsKHQsICIjIEZlZSBTcGxpdFxuXG5ObyBhY3RpdmUgc3BsaXRzLlxuIiwgb3V0KQp9CgpmdW5jIFRlc3RSZW5kZXJfV2l0aFNwbGl0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCUNyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiNjAwMCw0MDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgInNwbGl0XzEiLCAxMDAwKQoKCW91dCA6PSBSZW5kZXIoIiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhvdXQsICJzcGxpdF8xIiksICJSZW5kZXIgb3V0cHV0IG11c3QgcmVmZXJlbmNlIHNwbGl0XzEiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMob3V0LCBzdHJpbmcob3duZXIpKSwgIlJlbmRlciBvdXRwdXQgbXVzdCBpbmNsdWRlIG93bmVyIikKfQoKLy8gLS0tLS0tLS0tLSByZS1hdWRpdCByZWdyZXNzaW9ucyAoMjAyNi0wOS0wMikgLS0tLS0tLS0tLQoKZnVuYyBUZXN0Q3JlYXRlU3BsaXRfU2hhcmVTdW1XcmFwYXJvdW5kUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJLy8gcmUtYXVkaXQgUDE6IHRoZXNlIHNoYXJlcyBzdW0gcGFzdCAyXjY0IGJhY2sgdG8gZXhhY3RseSAxMDAwMDsgdGhlCgkvLyBwZXItc2hhcmUgPD0xMDAwMCBib3VuZCBtdXN0IHJlZnVzZSB0aGVtIGJlZm9yZSB0aGUgc3VtIGNhbiB3cmFwCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiaW52YWxpZCBzaGFyZSB2YWx1ZTogMTE1MjkyMTUwNTYwNjg0Njk3NiIsCgkJZnVuYygpIHsKCQkJQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UsIGJvYiwgY2Fyb2wpLAoJCQkJIjExNTI5MjE1MDU2MDY4NDY5NzYsODY0NjkxMTI4NDA1MTM1NzMyMCw4NjQ2OTExMjg0MDUxMzU3MzIwIikKCQl9LAoJKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImludmFsaWQgc2hhcmUgdmFsdWU6IDEwMDAxIiwKCQlmdW5jKCkgeyBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjEwMDAxLDEwMDAwIikgfSwKCSkKfQoKZnVuYyBUZXN0QXJjaGl2ZUZyZWVzQWN0aXZlTGlzdEFuZE93bmVyU2xvdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglBcmNoaXZlKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBsZW4oc3BsaXRzKSwgImFyY2hpdmVkIGVudHJ5IHN0YXlzIGZvciBhdWRpdCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihzcGxpdElEcyksICJhcmNoaXZlZCBlbnRyeSBmcmVlcyB0aGUgYWN0aXZlIGxpc3QiKQoJQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKSAvLyBtdXN0IG5vdCBhYm9ydAp9CgpmdW5jIFRlc3ROb0dsb2JhbENhcF9TeWJpbHNDYW5ub3RCbG9ja090aGVycyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgoJLy8gcm91bmQtNCBQMjogd2l0aCBwZXItb3duZXIgcXVvdGFzIG9ubHksIG90aGVyIG93bmVycyBmaWxsaW5nIHRoZWlyCgkvLyBvd24gYnVkZ2V0cyBuZXZlciBibG9jayBhIGxlZ2l0aW1hdGUgY3JlYXRvcgoJZm9yIGkgOj0gMDsgaSA8IDMwOyBpKysgewoJCXN5YiA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoInN5YmlsXyIgKyBzdHJjb252Lkl0b2EoaSkpCgkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShzeWIpKQoJCWZvciBqIDo9IDA7IGogPCBNYXhTcGxpdHNQZXJPd25lcjsgaisrIHsKCQkJQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJCX0KCX0KCXVhc3NlcnQuRXF1YWwodCwgMzAwLCBsZW4oc3BsaXRJRHMpKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKSAvLyBtdXN0IG5vdCBhYm9ydAp9CgpmdW5jIFRlc3RQcmVQYXJzZUlucHV0Qm91bmRzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoKCS8vIHJvdW5kLTQgUDI6IG92ZXJzaXplZCBpbnB1dHMgbXVzdCBiZSByZWZ1c2VkIEJFRk9SRSBwYXJzaW5nIHdvcmsKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJyZWNpcGllbnQgbGlzdCB0b28gbG9uZyIsCgkJZnVuYygpIHsgQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgc3RyaW5ncy5SZXBlYXQoIiwiLCBNYXhSZWNpcGllbnRMaXN0TGVuKzEpLCAiMTAwMDAiKSB9LAoJKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInNoYXJlIGxpc3QgdG9vIGxvbmciLAoJCWZ1bmMoKSB7IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgc3RyaW5ncy5SZXBlYXQoIjEsIiwgTWF4U2hhcmVMaXN0TGVuKSkgfSwKCSkKfQoKZnVuYyBUZXN0U3RyYXlTZW5kUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDApCgoJLy8gcmUtYXVkaXQgUDM6IGNvaW5zIGF0dGFjaGVkIHRvIGEgbm9uLURlcG9zaXQgY2FsbCBtdXN0IGFib3J0IChhbmQKCS8vIHRoZXJlZm9yZSByZXZlcnQgdG8gdGhlIHNlbmRlciksIG5ldmVyIHN0cmFuZCBvbiB0aGUgcmVhbG0gYWRkcmVzcwoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e0Rlbm9tOiBEZW5vbSwgQW1vdW50OiA1MH19KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zOyBhdHRhY2ggY29pbnMgdG8gRGVwb3NpdCBvbmx5IiwKCQlmdW5jKCkgeyBDbGFpbShjcm9zcyhjdXIpLCBpZCkgfSwKCSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgoJLy8gd2l0aG91dCBjb2lucyBhdHRhY2hlZCB0aGUgc2FtZSBjbGFpbSBzdWNjZWVkcwoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDApLCBDbGFpbShjcm9zcyhjdXIpLCBpZCkpCn0KCmZ1bmMgVGVzdERlcG9zaXRfQ29kZVJlYWxtUmVmdXNlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCgkvLyByZS1hdWRpdCBQMSBjb21wYW5pb246IG9ubHkgYSBkaXJlY3QgdXNlciBNc2dDYWxsIG1heSBkZXBvc2l0IOKAlCBhCgkvLyBjb2RlIHJlYWxtIGFzIHByZXZpb3VzIHJlYWxtIG11c3QgYmUgcmVmdXNlZCAoaXRzIHNlbmQgd291bGQgbm90CgkvLyBoYXZlIGxhbmRlZCBoZXJlKS4gVGhlIE1zZ1J1bi9lcGhlbWVyYWwgc2hhcGUgKHRoZSBvdGhlciBoYWxmIG9mCgkvLyB0aGUgSXNVc2VyQ2FsbC1ub3QtSXNVc2VyIHJhdGlvbmFsZSkgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGluIHRoaXMKCS8vIGRyaXZlcjogU2V0UmVhbG0gYWNjZXB0cyBvbmx5IHVzZXIgcmVhbG1zIGFuZCAvci8gY29kZSByZWFsbXMKCS8vIChOZXdDb2RlUmVhbG0gcmVqZWN0cyAvZS8gcGF0aHMpLCBzbyB0aGUgcHJlZGljYXRlIGNob2ljZSBpcwoJLy8gcGlubmVkIGhlcmUgdmlhIHRoZSBjb2RlLXJlYWxtIGJyYW5jaCBhbmQgdmVyaWZpZWQgbGl2ZSBvbi1jaGFpbi4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZGVtby9pbnRlcm1lZGlhcnkiKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IDEwMH19KQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsCgkJImRlcG9zaXRzIG11c3QgYmUgc2VudCBieSBkaXJlY3QgY2FsbCIsCgkJZnVuYygpIHsgRGVwb3NpdChjcm9zcyhjdXIpLCBpZCkgfSwKCSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCn0KCi8vIC0tLS0tLS0tLS0gcm91bmQtMyBhdWRpdCByZWdyZXNzaW9ucyAoMjAyNi0wOS0wMikgLS0tLS0tLS0tLQoKZnVuYyBUZXN0VXBwZXJjYXNlQWRkcmVzc2VzUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCgoJLy8gcm91bmQtMyBQMjogYWxsLXVwcGVyY2FzZSBiZWNoMzIgcGFzc2VzIElzVmFsaWQgYnV0IGNhbiBuZXZlcgoJLy8gbWF0Y2ggY2FsbGVyKCk6IGFzIGEgcmVjaXBpZW50IGl0IGxvY2tzIGZ1bmRzIGFuZCBibG9ja3MgQXJjaGl2ZTsKCS8vIGFzIHVwcGVyL2xvd2VyIHR3aW5zIGl0IGJ5cGFzc2VzIHRoZSBkdXBsaWNhdGUgY2hlY2s7IGFzIGFuIG93bmVyCgkvLyBpdCBvcnBoYW5zIHRoZSBzcGxpdAoJdXBwZXIgOj0gc3RyaW5ncy5Ub1VwcGVyKHN0cmluZyhhbGljZSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwKCQkiaW52YWxpZCByZWNpcGllbnQgYWRkcmVzczogIit1cHBlciwKCQlmdW5jKCkgeyBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBzdHJpbmcoYWxpY2UpKyIsIit1cHBlciwgIjUwMDAsNTAwMCIpIH0sCgkpCgoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJImludmFsaWQgbmV3IG93bmVyIGFkZHJlc3M6ICIrdXBwZXIsCgkJZnVuYygpIHsgVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgaWQsIGFkZHJlc3ModXBwZXIpKSB9LAoJKQp9CgpmdW5jIFRlc3RSZW5kZXJfT25seUFyY2hpdmVkU3BsaXRzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoJQXJjaGl2ZShjcm9zcyhjdXIpLCBpZCkKCgl1YXNzZXJ0LkVxdWFsKHQsICIjIEZlZSBTcGxpdFxuXG5ObyBhY3RpdmUgc3BsaXRzLlxuIiwgUmVuZGVyKCIiKSwKCQkiYXJjaGl2ZWQtb25seSBzdGF0ZSBtdXN0IHJlbmRlciBhcyBubyBhY3RpdmUgc3BsaXRzIikKfQoKLy8gLS0tLS0tLS0tLSBwcm90b2NvbCBmZWUgKDIwMjYtMDktMDMpIC0tLS0tLS0tLS0KCmZ1bmMgVGVzdEZlZV9EZWZhdWx0WmVyb0FuZENhcChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBmZWVCcHMpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJdWFzc2VydC5BYm9ydHNDb250YWlucyh0LCBjdXIsICJmZWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIiwKCQlmdW5jKCkgeyBTZXRGZWUoY3Jvc3MoY3VyKSwgTWF4RmVlQnBzKzEpIH0pCgl1YXNzZXJ0LkFib3J0c0NvbnRhaW5zKHQsIGN1ciwgImZlZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQiLAoJCWZ1bmMoKSB7IFNldEZlZShjcm9zcyhjdXIpLCAtMSkgfSkKCVNldEZlZShjcm9zcyhjdXIpLCBNYXhGZWVCcHMpIC8vIGV4YWN0bHkgdGhlIGNhcCBpcyBhbGxvd2VkCgl1YXNzZXJ0LkVxdWFsKHQsIE1heEZlZUJwcywgZmVlQnBzKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIHNldCB0aGUgZmVlIiwKCQlmdW5jKCkgeyBTZXRGZWUoY3Jvc3MoY3VyKSwgMSkgfSkKfQoKZnVuYyBUZXN0RmVlX1Rha2VuRnJvbURlcG9zaXROZXRBY2NvdW50aW5nKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZmVlQWRtaW5BZGRyKSkKCVNldEZlZShjcm9zcyhjdXIpLCA1MCkgLy8gMC41JQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UsIGJvYiksICI1MDAwLDUwMDAiKQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgMTAwMDApCgoJcyA6PSBzcGxpdHNbaWRdCgkvLyBmZWUgNTAgb2ZmIHRoZSB0b3A7IDk5NTAgbmV0IGRpc3RyaWJ1dGVkICg0OTc1ICsgNDk3NSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTApLCBmZWVzQWNjcnVlZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTk1MCksIHMuVG90YWxEZXBvc2l0ZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDQ5NzUpLCBzLkJhbGFuY2VzW2FsaWNlXSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNDk3NSksIHMuQmFsYW5jZXNbYm9iXSkKCS8vIGNvbnNlcnZhdGlvbiBvbiBuZXQgYW1vdW50cyBob2xkcyB1bnRvdWNoZWQKCXVhc3NlcnQuRXF1YWwodCwgcy5Ub3RhbERlcG9zaXRlZCwgcy5CYWxhbmNlc1thbGljZV0rcy5CYWxhbmNlc1tib2JdK3MuVG90YWxDbGFpbWVkKQp9CgpmdW5jIFRlc3RGZWVfTmV2ZXJSZXRyb2FjdGl2ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgaWQsIDEwMDAwKSAvLyBmZWUgMCBhdCBkZXBvc2l0IHRpbWUKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZlZUFkbWluQWRkcikpCglTZXRGZWUoY3Jvc3MoY3VyKSwgTWF4RmVlQnBzKQoKCS8vIHRoZSBwcmV2aW91c2x5IGNyZWRpdGVkIGJhbGFuY2UgaXMgdW50b3VjaGVkIGJ5IHRoZSBmZWUgY2hhbmdlCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMDAwKSwgc3BsaXRzW2lkXS5CYWxhbmNlc1thbGljZV0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwMDApLCBDbGFpbShjcm9zcyhjdXIpLCBpZCkpCn0KCmZ1bmMgVGVzdEZlZV9DbGFpbUZlZXNTZW5kc0NvaW5zKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZmVlQWRtaW5BZGRyKSkKCVNldEZlZShjcm9zcyhjdXIpLCAxMDApIC8vIDElCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCA1MDAwMCkgLy8gZmVlIDUwMAoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIGNsYWltIGZlZXMiLAoJCWZ1bmMoKSB7IENsYWltRmVlcyhjcm9zcyhjdXIpKSB9KQoKCWJlZm9yZSA6PSBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2lucyhmZWVBZG1pbkFkZHIpLkFtb3VudE9mKERlbm9tKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MDApLCBDbGFpbUZlZXMoY3Jvc3MoY3VyKSkpCglhZnRlciA6PSBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2lucyhmZWVBZG1pbkFkZHIpLkFtb3VudE9mKERlbm9tKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MDApLCBhZnRlci1iZWZvcmUpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBmZWVzQWNjcnVlZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNTAwKSwgZmVlc0NsYWltZWQpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJubyBmZWVzIGFjY3J1ZWQiLCBmdW5jKCkgeyBDbGFpbUZlZXMoY3Jvc3MoY3VyKSkgfSkKfQoKZnVuYyBUZXN0RmVlX1RpbnlEZXBvc2l0RnVsbHlDb25zdW1lZFJlZnVzZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJU2V0RmVlKGNyb3NzKGN1ciksIE1heEZlZUJwcykgLy8gMSUKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCS8vIGFtb3VudHMgPCAxMDAgYXQgMSUgcm91bmQgdGhlIGZlZSB0byAwIOKAlCBkZXBvc2l0IHBhc3NlcyB3aG9sZQoJZGVwb3NpdChjdXIsIG93bmVyLCBpZCwgOTkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBmZWVzQWNjcnVlZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTkpLCBzcGxpdHNbaWRdLkJhbGFuY2VzW2FsaWNlXSkKfQoKZnVuYyBUZXN0RmVlX1R3b1N0ZXBBZG1pbkhhbmRvdmVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCW5ld0FkbWluIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibmV3ZmVlYWRtaW4iKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIG5vbWluYXRlIGEgc3VjY2Vzc29yIiwKCQlmdW5jKCkgeyBOb21pbmF0ZUZlZUFkbWluKGNyb3NzKGN1ciksIGF0dGFja2VyKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZmVlQWRtaW5BZGRyKSkKCXVhc3NlcnQuQWJvcnRzQ29udGFpbnModCwgY3VyLCAiaW52YWxpZCBub21pbmVlIGFkZHJlc3MiLAoJCWZ1bmMoKSB7IE5vbWluYXRlRmVlQWRtaW4oY3Jvc3MoY3VyKSwgYWRkcmVzcygiSlVOSyIpKSB9KQoJTm9taW5hdGVGZWVBZG1pbihjcm9zcyhjdXIpLCBuZXdBZG1pbikKCS8vIG5vbWluYXRpb24gYWxvbmUgY2hhbmdlcyBub3RoaW5nCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhmZWVBZG1pbkFkZHIpLCBzdHJpbmcoZmVlQWRtaW4pKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYXR0YWNrZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIGZlZSBhZG1pbiIsCgkJZnVuYygpIHsgQWNjZXB0RmVlQWRtaW4oY3Jvc3MoY3VyKSkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG5ld0FkbWluKSkKCUFjY2VwdEZlZUFkbWluKGNyb3NzKGN1cikpCgl1YXNzZXJ0LkVxdWFsKHQsIHN0cmluZyhuZXdBZG1pbiksIHN0cmluZyhmZWVBZG1pbikpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBzdHJpbmcocGVuZGluZ0ZlZUFkbWluKSkKCgkvLyBjbGVhcmluZyBhIG5vbWluYXRpb24gd29ya3MKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obmV3QWRtaW4pKQoJTm9taW5hdGVGZWVBZG1pbihjcm9zcyhjdXIpLCBmZWVBZG1pbkFkZHIpCglOb21pbmF0ZUZlZUFkbWluKGNyb3NzKGN1ciksICIiKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIGZlZSBhZG1pbiIsCgkJZnVuYygpIHsgQWNjZXB0RmVlQWRtaW4oY3Jvc3MoY3VyKSkgfSkKfQoKZnVuYyBUZXN0RmVlX1N0cmF5U2VuZFJlamVjdGVkT25GZWVGdW5jdGlvbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3tEZW5vbTogRGVub20sIEFtb3VudDogNX19KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zOyBhdHRhY2ggY29pbnMgdG8gRGVwb3NpdCBvbmx5IiwKCQlmdW5jKCkgeyBTZXRGZWUoY3Jvc3MoY3VyKSwgMTApIH0sCgkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQp9CgovLyAtLS0tLS0tLS0tIHJvdW5kLTUgYXVkaXQgcmVncmVzc2lvbnMgKGZlZSBwYXRoLCAyMDI2LTA5LTAzKSAtLS0tLS0tLS0tCgovLyBQaW5zIHRoZSBiZW5pZ24tZGVncmFkYXRpb24gc2FmZXR5IHByb3BlcnR5OiBhbiBlbXB0eSBmZWUgYWRtaW4gKHRoZQovLyBnbm8tdGVzdC1WTSBpbml0IHN0YXRlLCBhbmQgYW55IGh5cG90aGV0aWNhbCBlbXB0eS1vcmlnaW4gZGVwbG95KQovLyBsZWF2ZXMgdGhlIGZlZSBwZXJtYW5lbnRseSBkaXNhYmxlZCBhbmQgemVybyBmdW5kcyBhdCByaXNrIOKAlCBTZXRGZWUKLy8gY2FuIG5ldmVyIGJlIGF1dGhvcml6ZWQsIHNvIGZlZUJwcyBzdGF5cyAwIGFuZCBub3RoaW5nIGFjY3J1ZXMuCmZ1bmMgVGVzdEZlZV9FbXB0eUFkbWluRGVncmFkZXNUb0Rpc2FibGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCWZlZUFkbWluID0gIiIKCWZlZUJwcyA9IDAKCglmb3IgXywgd2hvIDo9IHJhbmdlIFtdYWRkcmVzc3tvd25lciwgYWxpY2UsIGZlZUFkbWluQWRkciwgYXR0YWNrZXJ9IHsKCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHdobykpCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIHNldCB0aGUgZmVlIiwKCQkJZnVuYygpIHsgU2V0RmVlKGNyb3NzKGN1ciksIDEwMCkgfSkKCX0KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGZlZUJwcywgImZlZSBtdXN0IHJlbWFpbiAwIHdpdGggbm8gcmVhY2hhYmxlIGFkbWluIikKCgkvLyBhIGRlcG9zaXQgYWNjcnVlcyBub3RoaW5nCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgaWQsIDEwMDAwKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgZmVlc0FjY3J1ZWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFsaWNlKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwMDApLCBDbGFpbShjcm9zcyhjdXIpLCBpZCkpIC8vIGZ1bGwgYW1vdW50LCBubyBmZWUKfQoKLy8gRmVlcyBhY2NydWVkIGJlZm9yZSBhIGhhbmRvdmVyIGFyZSBjbGFpbWFibGUgYnkgdGhlIE5FVyBhZG1pbgovLyAoZG9jdW1lbnRlZCBzZW1hbnRpY3M6IGNsYWltIGJlZm9yZSB0cmFuc2ZlcnJpbmcgaWYgdGhhdCBtYXR0ZXJzKS4KZnVuYyBUZXN0RmVlX0hhbmRvdmVyVHJhbnNmZXJzQWNjcnVlZENsYWltUmlnaHQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJbmV3RmEgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJuZXdmYSIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZlZUFkbWluQWRkcikpCglTZXRGZWUoY3Jvc3MoY3VyKSwgMTAwKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSksICIxMDAwMCIpCglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDAwMDApIC8vIDEwMDAgYWNjcnVlZCB1bmRlciB0aGUgb3JpZ2luYWwgYWRtaW4KCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZlZUFkbWluQWRkcikpCglOb21pbmF0ZUZlZUFkbWluKGNyb3NzKGN1ciksIG5ld0ZhKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShuZXdGYSkpCglBY2NlcHRGZWVBZG1pbihjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDAwKSwgQ2xhaW1GZWVzKGNyb3NzKGN1cikpLCAibmV3IGFkbWluIGNsYWltcyBwcmlvci1yZWdpbWUgZmVlcyIpCgoJLy8gdGhlIG9sZCBhZG1pbiBjYW4gbm8gbG9uZ2VyIGNsYWltIOKAlCBmYWlscyB0aGUgYXV0aG9yaXphdGlvbiBjaGVjawoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvbmx5IHRoZSBmZWUgYWRtaW4gY2FuIGNsYWltIGZlZXMiLCBmdW5jKCkgeyBDbGFpbUZlZXMoY3Jvc3MoY3VyKSkgfSkKfQoKLy8gRXZlcnkgZmVlIGZ1bmN0aW9uIHJlamVjdHMgYW4gYXR0YWNoZWQgc2VuZCAob25seSBTZXRGZWUgd2FzIHBpbm5lZCkuCmZ1bmMgVGVzdEZlZV9BbGxGdW5jdGlvbnNSZWplY3RTdHJheVNlbmQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmZWVBZG1pbkFkZHIpKQoJc2VuZCA6PSBjaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IDN9fQoJbXNnIDo9ICJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2luczsgYXR0YWNoIGNvaW5zIHRvIERlcG9zaXQgb25seSIKCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoc2VuZCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFNldEZlZShjcm9zcyhjdXIpLCAxMCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IE5vbWluYXRlRmVlQWRtaW4oY3Jvc3MoY3VyKSwgYXR0YWNrZXIpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBDbGFpbUZlZXMoY3Jvc3MoY3VyKSkgfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgoJLy8gQWNjZXB0RmVlQWRtaW4gZnJvbSB0aGUgcGVuZGluZyBzaWRlLCBhbHNvIHdpdGggYSBzZW5kCglOb21pbmF0ZUZlZUFkbWluKGNyb3NzKGN1ciksIGF0dGFja2VyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhdHRhY2tlcikpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoc2VuZCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEFjY2VwdEZlZUFkbWluKGNyb3NzKGN1cikpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQp9CgovLyAtLS0tLS0tLS0tIGF1ZGl0IHJvdW5kLTEgZ2FwIGNsb3N1cmVzICgyMDI2LTA5LTIxKSAtLS0tLS0tLS0tCgpmdW5jIFRlc3RTdHJheVNlbmRSZWplY3RlZE9uQWxsU3BsaXRGdW5jdGlvbnMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXJlc2V0U3RhdGUoKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcikpCglpZCA6PSBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChhbGljZSwgYm9iKSwgIjUwMDAsNTAwMCIpCgoJLy8gYXVkaXQgWTIgZ2FwIDI6IG9ubHkgQ2xhaW0gYW5kIHRoZSBmZWUgZnVuY3Rpb25zIHdlcmUgcGlubmVkOyB0aGUKCS8vIGZpdmUgc3BsaXQtbWFuYWdlbWVudCBmdW5jdGlvbnMgY2FsbCB0aGUgc2FtZSBndWFyZCDigJQgcHJvdmUgaXQKCW1zZyA6PSAidGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhY2NlcHQgY29pbnM7IGF0dGFjaCBjb2lucyB0byBEZXBvc2l0IG9ubHkiCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7e0Rlbm9tOiBEZW5vbSwgQW1vdW50OiA3fX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBDcmVhdGVTcGxpdChjcm9zcyhjdXIpLCBhZGRyTGlzdChjYXJvbCksICIxMDAwMCIpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgbXNnLCBmdW5jKCkgeyBVcGRhdGVTaGFyZXMoY3Jvc3MoY3VyKSwgaWQsIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IFRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksIGlkLCBjYXJvbCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpLCBpZCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEZyZWV6ZShjcm9zcyhjdXIpLCBpZCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBtc2csIGZ1bmMoKSB7IEFyY2hpdmUoY3Jvc3MoY3VyKSwgaWQpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQp9CgpmdW5jIFRlc3RBcmNoaXZlZFNwbGl0UmVmdXNlc0RlcG9zaXRBbmRDbGFpbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlKSwgIjEwMDAwIikKCWRlcG9zaXQoY3VyLCBvd25lciwgaWQsIDEwMCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWxpY2UpKQoJQ2xhaW0oY3Jvc3MoY3VyKSwgaWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCUFyY2hpdmUoY3Jvc3MoY3VyKSwgaWQpCgoJLy8gYXVkaXQgWTIgZ2FwIDM6IHRoZSB0ZXJtaW5hbCBzdGF0ZSBtdXN0IHJlZnVzZSBib3RoIHZhbHVlIHBhdGhzCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IDUwfX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwbGl0IGlzIGFyY2hpdmVkOiAiK2lkLAoJCWZ1bmMoKSB7IERlcG9zaXQoY3Jvc3MoY3VyKSwgaWQpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShhbGljZSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwbGl0IGlzIGFyY2hpdmVkOiAiK2lkLAoJCWZ1bmMoKSB7IENsYWltKGNyb3NzKGN1ciksIGlkKSB9KQp9CgpmdW5jIFRlc3REZXBvc2l0X1R3b0NvaW5FbnZlbG9wZVJlamVjdGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglyZXNldFN0YXRlKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIpKQoJaWQgOj0gQ3JlYXRlU3BsaXQoY3Jvc3MoY3VyKSwgYWRkckxpc3QoYWxpY2UpLCAiMTAwMDAiKQoKCS8vIGF1ZGl0IFkyIGdhcCA0OiBvbmx5IHplcm8tY29pbiBhbmQgd3JvbmctZGVub20gd2VyZSBwaW5uZWQ7IGEKCS8vIHR3by1jb2luIGVudmVsb3BlIG11c3QgYWxzbyBiZSByZWZ1c2VkIGJ5IHRoZSBleGFjdCBsZW49PTEgY2hlY2sKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7RGVub206IERlbm9tLCBBbW91bnQ6IDEwMH0sIHtEZW5vbTogInVmb28iLCBBbW91bnQ6IDF9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJkZXBvc2l0IG11c3Qgc2VuZCBleGFjdGx5IG9uZSBjb2luIG9mICIrRGVub20sCgkJZnVuYygpIHsgRGVwb3NpdChjcm9zcyhjdXIpLCBpZCkgfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBzcGxpdHNbaWRdLlRvdGFsRGVwb3NpdGVkKQp9CgpmdW5jIFRlc3REdXN0X0VxdWFsU2hhcmVUaWVHb2VzVG9GaXJzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJcmVzZXRTdGF0ZSgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyKSkKCWlkIDo9IENyZWF0ZVNwbGl0KGNyb3NzKGN1ciksIGFkZHJMaXN0KGFsaWNlLCBib2IpLCAiNTAwMCw1MDAwIikKCgkvLyBhdWRpdCBZMiBnYXAgNTogdGhlIGR1c3QgcnVsZSBhdCBhbiBleGFjdCBzaGFyZSB0aWUgaXMKCS8vIGZpcnN0LWxpc3RlZC13aW5zIChzdHJpY3QgPiBuZXZlciByZXBsYWNlcyBkdXN0SWR4KSDigJQgcGluIGl0CglkZXBvc2l0KGN1ciwgb3duZXIsIGlkLCAxMDEpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUxKSwgc3BsaXRzW2lkXS5CYWxhbmNlc1thbGljZV0pCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUwKSwgc3BsaXRzW2lkXS5CYWxhbmNlc1tib2JdKQp9ChpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9mZWVfc3BsaXQvdjIiCmdubyA9ICIwLjkiCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTIwMDAwMDB1Z25vdBITCIDKte4BEgsyNTAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQI+F/3SD44LzJd5QXHh1vF/QcCo6KniXCcPaMD4J5RVpxJAD3mQbfUJG+iXH3CrLWblRIhQh6Zc1DaQnvq5N4V40+1udHWs5ikQ4ypLeze1vkCZxr/VpHtfGkC1eBND8J0d3BooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data