Transaction executed successfully

Transaction Details

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

Transaction hash
EA5615D92EA0637E109D5DB5DA45C09E2D7C4F3C19852F727D29390364908966

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
70,000,000
Requested gas limit
GAS USED
43,878,960
Gas consumed
FEE
140000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf12000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cs3pAQoML3ZtLm1fYWRkcGtnErvpAQooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhL+6AEKEG1lbWJhX3Jldmlld3NfdjISI2duby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9yZXZpZXdzX3YyGtMgCglhZG1pbi5nbm8SxSBwYWNrYWdlIG1lbWJhX3Jldmlld3NfdjIKCi8vIE1vZGVyYXRvciBhdXRob3JpdHkgYW5kIGl0cyByb3RhdGlvbiBwYXRoLgovLwovLyBObyBtb2RlcmF0b3IgaXMgY29tcGlsZWQgaW46IGBtb2RlcmF0b3JgIGJlbG93IGlzIHNlZWRlZCBhdCBwYWNrYWdlIGxvYWQgZnJvbQovLyB0aGUgcHVibGlzaGluZyB0cmFuc2FjdGlvbidzIHNpZ25lciAob24gZ25vbGFuZC0xIHRoZSBzYW1jcmV3IG5hbWVzcGFjZQovLyBtdWx0aXNpZywgdGhlIHN0YW1wZWQgY3JlYXRvciBhdCBlbmFibGUgdGltZSksIGFuZCBhc3NlcnRNb2RlcmF0b3IgcmVhZHMgdGhlCi8vIG11dGFibGUgYG1vZGVyYXRvcmAsIHNvIHRoZSBhZGRyZXNzIGhvbGRpbmcgbW9kZXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhZnRlcgovLyBkZXBsb3ltZW50LgovLwovLyBXSFkgVEhJUyBNQVRURVJTIE9OIE1BSU5ORVQuIFJlYWxtcyBhcmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLCB0aGVyZSBpcyBubwovLyBmYXVjZXQsIGFuZCBtYWlubmV0IGdlbmVzaXMgbG9ja3MgdWdub3QgdHJhbnNmZXJzIHVuZGVyIENvbnN0aXR1dGlvbiDCpzEyNiDigJQgc28KLy8gYSBjb21waWxlLXRpbWUgbW9kZXJhdG9yIGNhbm5vdCBiZSBjb3JyZWN0ZWQgYWZ0ZXIgdGhlIGZhY3Q6IGEgdGVzdG5ldCBrZXkKLy8gY29tcGlsZWQgaW4gd291bGQgcGVybWFuZW50bHkgZGlzYWJsZSBIaWRlVGFyZ2V0L1VuaGlkZVRhcmdldC9DbGVhckZsYWdzLAovLyBsZWF2aW5nIHRoaXMgcmVhbG0gd2l0aCBubyB3YXkgdG8gYWN0IG9uIGEgZmxhZ2dlZCByZXZpZXcgZXZlciBhZ2Fpbi4KLy8KLy8gVFdPLVNURVAgQlkgREVTSUdOOiB0aGUgc3VjY2Vzc29yIG11c3QgY2xhaW0gdGhlIHJvbGUgd2l0aCBpdHMgb3duIHRyYW5zYWN0aW9uLAovLyBzbyBtb2RlcmF0aW9uIGNhbiBuZXZlciBiZSBoYW5kZWQgdG8gYW4gYWRkcmVzcyB0aGF0IGNhbm5vdCB0cmFuc2FjdCAoYSB0eXBvLAovLyBvciBhbiB1bmZ1bmRlZCBhZGRyZXNzIHVuZGVyIMKnMTI2KSB3aXRoIG5vIHdheSBiYWNrLgovLwovLyBDQUxMRVIgQVVUSCBoZXJlIHVzZXMgYGN1ci5Jc0N1cnJlbnQoKWAgKyBgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpYCwgcGVyCi8vIGNvbnRyYWN0LXJldmlldyBjaGVja2xpc3QgIzksIG1hdGNoaW5nIG1lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MSAvCi8vIG1lbWJhX3BvaW50c192MS4gVGhlIHJlYWxtJ3MgZXhpc3RpbmcgYXNzZXJ0TW9kZXJhdG9yIGtlZXBzIGl0cyBvbGRlcgovLyBmcmFtZS11bnZlcmlmaWVkIGNhbGxlciByZWFkIChncmFuZGZhdGhlcmVkIGluCi8vIGFudGlwYXR0ZXJuLXByZXZyZWFsbS1iYXNlbGluZS50eHQpOyBvbmx5IHRoZSB2YWx1ZSBpdCBjb21wYXJlcyBhZ2FpbnN0Ci8vIGNoYW5nZWQsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBlZGl0IHRoYXQgcmVtb3ZlcyB0aGUgaW1tdXRhYmlsaXR5LgoKaW1wb3J0ICJjaGFpbiIKCnZhciAoCgkvLyBtb2RlcmF0b3IgaXMgdGhlIExJVkUgYXV0aG9yaXR5LCBzZWVkZWQgd2l0aCB0aGUgcHVibGlzaGVyIGF0IHBhY2thZ2UgbG9hZC4KCS8vIEluaXRpYWxpemVkIGF0IGRlY2xhcmF0aW9uIHNvIHRoZXJlIGlzIG5vIGluaXQtb3JkZXJpbmcgcXVlc3Rpb24gYWJvdXQKCS8vIGdhdGVzIHRoYXQgcmVhZCBpdC4KCW1vZGVyYXRvciBhZGRyZXNzID0gcHVibGlzaGVyQXRMb2FkKCkKCgkvLyBwZW5kaW5nTW9kZXJhdG9yIGlzIHRoZSBzdGFnZWQgc3VjY2Vzc29yOyAiIiB3aGVuIG5vbmUgaXMgaW4gZmxpZ2h0LgoJcGVuZGluZ01vZGVyYXRvciBhZGRyZXNzCikKCi8vIFRyYW5zZmVyT3duZXJzaGlwIHN0YWdlcyBhIGhhbmRvZmYgb2YgdGhlIG1vZGVyYXRvciByb2xlLiBNb2RlcmF0b3Igb25seTsgaXQKLy8gdGFrZXMgZWZmZWN0IG9ubHkgb25jZSBuZXdNb2RlcmF0b3IgY2FsbHMgQWNjZXB0T3duZXJzaGlwLiBDYWxsaW5nIGl0IGFnYWluCi8vIGJlZm9yZSBhY2NlcHRhbmNlIHJlcGxhY2VzIHRoZSBzdGFnZWQgYWRkcmVzcywgd2hpY2ggaXMgaG93IGEgbWlzdHlwZWQKLy8gcHJvcG9zYWwgaXMgY29ycmVjdGVkLgpmdW5jIFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgbmV3TW9kZXJhdG9yIGFkZHJlc3MpIHsKCWFzc2VydE1vZGVyYXRvckN1cihjdXIpCglpZiBuZXdNb2RlcmF0b3IgPT0gIiIgewoJCXBhbmljKCJuZXdNb2RlcmF0b3IgbXVzdCBiZSBub24tZW1wdHkiKQoJfQoJaWYgIW5ld01vZGVyYXRvci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGFkZHJlc3M6ICIgKyBuZXdNb2RlcmF0b3IuU3RyaW5nKCkpCgl9CglpZiBuZXdNb2RlcmF0b3IgPT0gbW9kZXJhdG9yIHsKCQlwYW5pYygibmV3TW9kZXJhdG9yIGlzIHRoZSBjdXJyZW50IG1vZGVyYXRvciIpCgl9CglwZW5kaW5nTW9kZXJhdG9yID0gbmV3TW9kZXJhdG9yCgljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlclN0YXJ0ZWQiLCAicGVuZGluZyIsIG5ld01vZGVyYXRvci5TdHJpbmcoKSkKfQoKLy8gQWNjZXB0T3duZXJzaGlwIGNvbXBsZXRlcyB0aGUgaGFuZG9mZi4gT25seSB0aGUgc3RhZ2VkIHBlbmRpbmdNb2RlcmF0b3IgbWF5Ci8vIGNhbGwgaXQg4oCUIGluY2x1ZGluZyBhZ2FpbnN0IHRoZSBvdXRnb2luZyBtb2RlcmF0b3IsIHNvIHRoZSB0d28gc3RlcHMgY2Fubm90IGJlCi8vIGNvbGxhcHNlZCBpbnRvIG9uZSBieSB0aGUgcGFydHkgZ2l2aW5nIHVwIHRoZSByb2xlLgpmdW5jIEFjY2VwdE93bmVyc2hpcChjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJzcG9vZmVkIHJlYWxtIikKCX0KCWlmIHBlbmRpbmdNb2RlcmF0b3IgPT0gIiIgewoJCXBhbmljKCJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcGVuZGluZ01vZGVyYXRvciB7CgkJcGFuaWMoInVuYXV0aG9yaXplZDogb25seSB0aGUgcGVuZGluZyBtb2RlcmF0b3IgbWF5IGFjY2VwdCIpCgl9Cgltb2RlcmF0b3IgPSBwZW5kaW5nTW9kZXJhdG9yCglwZW5kaW5nTW9kZXJhdG9yID0gIiIKCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVyQWNjZXB0ZWQiLCAibW9kZXJhdG9yIiwgbW9kZXJhdG9yLlN0cmluZygpKQp9CgovLyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlciBjbGVhcnMgYSBzdGFnZWQgaGFuZG9mZi4gTW9kZXJhdG9yIG9ubHksIHNvIGEKLy8gcHJvcG9zYWwgY2FuIGJlIGFib3J0ZWQgd2l0aG91dCB0aGUgcHJvcG9zZWQgYWRkcmVzcyBjb29wZXJhdGluZy4KZnVuYyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlcihjdXIgcmVhbG0pIHsKCWFzc2VydE1vZGVyYXRvckN1cihjdXIpCglpZiBwZW5kaW5nTW9kZXJhdG9yID09ICIiIHsKCQlwYW5pYygibm8gcGVuZGluZyBvd25lcnNoaXAgdHJhbnNmZXIiKQoJfQoJY2FuY2VsbGVkIDo9IHBlbmRpbmdNb2RlcmF0b3IKCXBlbmRpbmdNb2RlcmF0b3IgPSAiIgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJDYW5jZWxsZWQiLCAiY2FuY2VsbGVkIiwgY2FuY2VsbGVkLlN0cmluZygpKQp9CgovLyBHZXRNb2RlcmF0b3IgcmV0dXJucyB0aGUgYWRkcmVzcyB0aGF0IGN1cnJlbnRseSBob2xkcyBtb2RlcmF0aW9uLgpmdW5jIEdldE1vZGVyYXRvcigpIHN0cmluZyB7IHJldHVybiBtb2RlcmF0b3IuU3RyaW5nKCkgfQoKLy8gR2V0UGVuZGluZ01vZGVyYXRvciByZXR1cm5zIHRoZSBzdGFnZWQgc3VjY2Vzc29yICgiIiB3aGVuIG5vbmUpLgpmdW5jIEdldFBlbmRpbmdNb2RlcmF0b3IoKSBzdHJpbmcgeyByZXR1cm4gcGVuZGluZ01vZGVyYXRvci5TdHJpbmcoKSB9CgovLyBhc3NlcnRNb2RlcmF0b3JDdXIgaXMgdGhlIGdhdGUgZm9yIHRoaXMgZmlsZSdzIGVudHJ5cG9pbnRzLiBOYW1lZCBhcGFydCBmcm9tCi8vIHRoZSByZWFsbSdzIGV4aXN0aW5nIGFzc2VydE1vZGVyYXRvciBzbyB0aGUgb2xkZXIgY2FsbCBzaXRlcyBrZWVwIHRoZWlyCi8vIHNpZ25hdHVyZSBhbmQgc2VtYW50aWNzIHVudG91Y2hlZC4KZnVuYyBhc3NlcnRNb2RlcmF0b3JDdXIoY3VyIHJlYWxtKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygic3Bvb2ZlZCByZWFsbSIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gbW9kZXJhdG9yIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBtb2RlcmF0b3IgbXVsdGlzaWcgb25seSIpCgl9Cn0KGkoKC2dub21vZC50b21sEjttb2R1bGUgPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX3Jldmlld3NfdjIiCmdubyA9ICIwLjkiChqGuAEKFG1lbWJhX3Jldmlld3NfdjIuZ25vEuy3AXBhY2thZ2UgbWVtYmFfcmV2aWV3c192MgoKLy8gTWVtYmEgUmV2aWV3cyAvIFdlYi1vZi1UcnVzdCByZWFsbS4KLy8KLy8gT1BFTiwgb24tY2hhaW4gcmF0aW5ncyArIHJldmlld3MgZm9yIGFueSBNZW1iYSBzdWJqZWN0ICh2YWxpZGF0b3IvY2FuZGlkYXRlLwovLyBpbmRpdmlkdWFsIGFkZHJlc3MsIG9yIGFuIG9yZy9EQU8gcmVhbG0gcGF0aCkuIEFueW9uZSB3aXRoIGEgd2FsbGV0IG1heSBwb3N0Ci8vIE9ORSBlZGl0YWJsZSByZXZpZXcgcGVyIHN1YmplY3QsIHJlYWN0IChsaWtlL2Rpc2xpa2UpLCByZXBseSAoZmxhdCwgb25lCi8vIGxldmVsKSwgYW5kIGZsYWcuIEEgcnVubmluZyBuZXQtbGlrZXMgcmVwdXRhdGlvbiBjb3VudGVyIHBlciBhdXRob3IgZHJpdmVzCi8vIHJhbmtpbmcuIE1vZGVyYXRpb24gPSBhdXRob3IgZGVsZXRlICh0b21ic3RvbmUpICsgY29tbXVuaXR5IGZsYWcgKyBtdWx0aXNpZwovLyBoaWRlIChzb2Z0LWRlbGV0ZSkuIFRleHQgaXMgcGVybWFuZW50IG9uLWNoYWluOyBIaWRlIG9ubHkgb21pdHMgZnJvbSByZWFkcy4KLy8KLy8gUmVhZHM6IGV4cG9ydGVkICpKU09OIGZ1bmNzIHF1ZXJpZWQgdmlhIFJQQyB2bS9xZXZhbCAocGFnaW5hdGVkKS4gUmVuZGVyKCkgaXMKLy8gYSBzZWNvbmRhcnkgaHVtYW4gdmlldyBmb3IgZ25vd2ViLgoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgopCgovLyDilIDilIAgQ29uc3RhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCAoCglNYXhCb2R5TGVuICAgID0gMjAwMCAvLyByZXZpZXcgYm9keQoJTWF4Q29tbWVudExlbiA9IDEwMDAgLy8gY29tbWVudCBib2R5CglNYXhQYWdlTGltaXQgID0gMTAwICAvLyBoYXJkIGNhcCBvbiBhbnkgcGFnaW5hdGVkIHJlYWQgKERvUyBndWFyZCkKCgkvLyBUaGUgbW9kZXJhdG9yIGlzIG5vdCBhIGNvbnN0YW50OiBhZG1pbi5nbm8gc2VlZHMgaXQgZnJvbSB0aGUgcHVibGlzaGVyIGF0CgkvLyBwYWNrYWdlIGxvYWQgYW5kIHJvdGF0ZXMgaXQgdmlhIFRyYW5zZmVyT3duZXJzaGlwL0FjY2VwdE93bmVyc2hpcC4KKQoKLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAp0eXBlIFJldmlldyBzdHJ1Y3QgewoJSUQgICAgICAgIHVpbnQ2NAoJU3ViamVjdCAgIHN0cmluZyAgLy8gZzHigKYgYWRkcmVzcyBPUiByZWFsbSBwYXRoCglBdXRob3IgICAgYWRkcmVzcwoJUmF0aW5nICAgIGludCAgICAgLy8gMS4uNQoJQm9keSAgICAgIHN0cmluZyAgLy8gb3B0aW9uYWwsIOKJpCBNYXhCb2R5TGVuCglDcmVhdGVkQXQgaW50NjQgICAvLyBibG9jayBoZWlnaHQKCUVkaXRlZEF0ICBpbnQ2NCAgIC8vIGJsb2NrIGhlaWdodCBvZiBsYXN0IGVkaXQgKDAgaWYgbmV2ZXIpCglIaWRkZW4gICAgYm9vbCAgICAvLyBtdWx0aXNpZyBzb2Z0LWRlbGV0ZSAvIGF1dG8taGlkZQoJRGVsZXRlZCAgIGJvb2wgICAgLy8gYXV0aG9yIHRvbWJzdG9uZQoJTGlrZXMgICAgIHVpbnQ2NAoJRGlzbGlrZXMgIHVpbnQ2NAoJRmxhZ0NvdW50IHVpbnQ2NAp9Cgp0eXBlIENvbW1lbnQgc3RydWN0IHsKCUlEICAgICAgICB1aW50NjQKCVJldmlld0lEICB1aW50NjQKCUF1dGhvciAgICBhZGRyZXNzCglCb2R5ICAgICAgc3RyaW5nIC8vIOKJpCBNYXhDb21tZW50TGVuCglDcmVhdGVkQXQgaW50NjQKCUVkaXRlZEF0ICBpbnQ2NAoJSGlkZGVuICAgIGJvb2wKCURlbGV0ZWQgICBib29sCglMaWtlcyAgICAgdWludDY0CglEaXNsaWtlcyAgdWludDY0CglGbGFnQ291bnQgdWludDY0Cn0KCi8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKdmFyICgKCXJldmlld3MgICAgICAgKmF2bC5UcmVlIC8vIHN0cklEKGlkKSAtPiAqUmV2aWV3Cgljb21tZW50cyAgICAgICphdmwuVHJlZSAvLyBzdHJJRChpZCkgLT4gKkNvbW1lbnQKCXN1YmplY3RJbmRleCAgKmF2bC5UcmVlIC8vIHN1YmplY3QgLT4gW111aW50NjQgKHJldmlldyBJRHMsIGFzY2VuZGluZykg4oCUIGJvdW5kcyByZWFkcwoJY29tbWVudEluZGV4ICAqYXZsLlRyZWUgLy8gc3RySUQocmV2aWV3SUQpIC0+IFtddWludDY0IChjb21tZW50IElEcywgYXNjZW5kaW5nKQoJYXV0aG9yU3ViamVjdCAqYXZsLlRyZWUgLy8gc3ViamVjdCArICJceDAwIiArIGF1dGhvciAtPiB1aW50NjQgKHJldmlld0lEKSDigJQgb25lLXBlci1wYWlyCglyZWFjdGlvbnMgICAgICphdmwuVHJlZSAvLyBzdHJJRCh0YXJnZXRJRCkgKyAiLyIgKyBhZGRyIC0+ICJsaWtlInwiZGlzbGlrZSIKCWZsYWdzICAgICAgICAgKmF2bC5UcmVlIC8vIHN0cklEKHRhcmdldElEKSArICIvIiArIGFkZHIgLT4gdHJ1ZSAob25lIGZsYWcgcGVyIGFjY3QvdGFyZ2V0KQoJcmVwdXRhdGlvbiAgICAqYXZsLlRyZWUgLy8gYWRkciAtPiBpbnQ2NCAozqMgbGlrZXPiiJJkaXNsaWtlcyBvbiB0aGVpciByZXZpZXdzK2NvbW1lbnRzKQoJZmxhZ2dlZElEcyAgICAqYXZsLlRyZWUgLy8gc3RySUQodGFyZ2V0SUQpIC0+IHRydWUgKHZpc2libGUgdGFyZ2V0cyB3aXRoIOKJpTEgZmxhZywgZm9yIHRoZSBtb2QgZGFzaGJvYXJkKQoJLy8gUlYtMTogTygxKSBwZXItc3ViamVjdCB2aXNpYmxlLXJldmlldyBjb3VudGVycyAodmlzaWJsZSA9ICFEZWxldGVkICYmICFIaWRkZW4pIHNvCgkvLyBHZXRTdWJqZWN0U3VtbWFyeUpTT04gbmV2ZXIgc2NhbnMgYSBzeWJpbC1ncm93YWJsZSByZXZpZXcgbGlzdC4gTWFpbnRhaW5lZCBieSBldmVyeQoJLy8gdHJhbnNpdGlvbiB0aGF0IGNoYW5nZXMgYSByZXZpZXcncyBjb3VudGVkIHN0YXRlIChwb3N0IC8gZWRpdC1yYXRpbmcgLyBkZWxldGUgLyBoaWRlIC8gdW5oaWRlKS4KCXN1YmpTdGF0Q291bnQgKmF2bC5UcmVlIC8vIHN1YmplY3QgLT4gaW50NjQgKCMgdmlzaWJsZSByZXZpZXdzKQoJc3VialN0YXRTdW0gICAqYXZsLlRyZWUgLy8gc3ViamVjdCAtPiBpbnQ2NCAozqMgcmF0aW5nIG92ZXIgdmlzaWJsZSByZXZpZXdzKQoJbmV4dElEICAgICAgICB1aW50NjQKKQoKZnVuYyBpbml0KCkgewoJcmV2aWV3cyA9IGF2bC5OZXdUcmVlKCkKCWNvbW1lbnRzID0gYXZsLk5ld1RyZWUoKQoJc3ViamVjdEluZGV4ID0gYXZsLk5ld1RyZWUoKQoJY29tbWVudEluZGV4ID0gYXZsLk5ld1RyZWUoKQoJYXV0aG9yU3ViamVjdCA9IGF2bC5OZXdUcmVlKCkKCXJlYWN0aW9ucyA9IGF2bC5OZXdUcmVlKCkKCWZsYWdzID0gYXZsLk5ld1RyZWUoKQoJcmVwdXRhdGlvbiA9IGF2bC5OZXdUcmVlKCkKCWZsYWdnZWRJRHMgPSBhdmwuTmV3VHJlZSgpCglzdWJqU3RhdENvdW50ID0gYXZsLk5ld1RyZWUoKQoJc3VialN0YXRTdW0gPSBhdmwuTmV3VHJlZSgpCgluZXh0SUQgPSAxCn0KCi8vIOKUgOKUgCBSVi0xIHN1YmplY3Qtc3RhdCBjb3VudGVycyAoTygxKSBzdW1tYXJ5KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuYyBnZXRTdGF0KHQgKmF2bC5UcmVlLCBzdWJqZWN0IHN0cmluZykgaW50NjQgewoJaWYgdiwgb2sgOj0gdC5HZXQoc3ViamVjdCk7IG9rIHsKCQlyZXR1cm4gdi4oaW50NjQpCgl9CglyZXR1cm4gMAp9CgovLyBhcHBseVN1YmplY3RTdGF0IGFkanVzdHMgdGhlIHZpc2libGUtcmV2aWV3IGNvdW50ZXJzIGZvciBhIHN1YmplY3QuIENhbGxlcnMgYXBwbHkgYSBkZWx0YQovLyBvbmx5IHdoZW4gYSByZXZpZXcncyAqY291bnRlZCogc3RhdGUgKHZpc2libGUgPSAhRGVsZXRlZCAmJiAhSGlkZGVuKSBhY3R1YWxseSBjaGFuZ2VzLgpmdW5jIGFwcGx5U3ViamVjdFN0YXQoc3ViamVjdCBzdHJpbmcsIGRDb3VudCwgZFN1bSBpbnQ2NCkgewoJaWYgZENvdW50ICE9IDAgewoJCXN1YmpTdGF0Q291bnQuU2V0KHN1YmplY3QsIGdldFN0YXQoc3VialN0YXRDb3VudCwgc3ViamVjdCkrZENvdW50KQoJfQoJaWYgZFN1bSAhPSAwIHsKCQlzdWJqU3RhdFN1bS5TZXQoc3ViamVjdCwgZ2V0U3RhdChzdWJqU3RhdFN1bSwgc3ViamVjdCkrZFN1bSkKCX0KfQoKLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmMgc3RySUQoaWQgdWludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkgfQoKZnVuYyBnZXRSZXZpZXcoaWQgdWludDY0KSAoKlJldmlldywgYm9vbCkgewoJdiwgb2sgOj0gcmV2aWV3cy5HZXQoc3RySUQoaWQpKQoJaWYgIW9rIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoJcmV0dXJuIHYuKCpSZXZpZXcpLCB0cnVlCn0KCmZ1bmMgZ2V0Q29tbWVudChpZCB1aW50NjQpICgqQ29tbWVudCwgYm9vbCkgewoJdiwgb2sgOj0gY29tbWVudHMuR2V0KHN0cklEKGlkKSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiB2LigqQ29tbWVudCksIHRydWUKfQoKZnVuYyBhc3NlcnRNb2RlcmF0b3IoKSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBtb2RlcmF0b3IgewoJCXBhbmljKCJ1bmF1dGhvcml6ZWQ6IG1vZGVyYXRvciBtdWx0aXNpZyBvbmx5IikKCX0KfQoKZnVuYyBnZXRSZXB1dGF0aW9uKGFkZHIgc3RyaW5nKSBpbnQ2NCB7CglpZiB2LCBvayA6PSByZXB1dGF0aW9uLkdldChhZGRyKTsgb2sgewoJCXJldHVybiB2LihpbnQ2NCkKCX0KCXJldHVybiAwCn0KCmZ1bmMgYWRkUmVwdXRhdGlvbihhZGRyIHN0cmluZywgZGVsdGEgaW50NjQpIHsKCXJlcHV0YXRpb24uU2V0KGFkZHIsIGdldFJlcHV0YXRpb24oYWRkcikrZGVsdGEpCn0KCmZ1bmMgaWRMaXN0KHQgKmF2bC5UcmVlLCBrZXkgc3RyaW5nKSBbXXVpbnQ2NCB7CglpZiB2LCBvayA6PSB0LkdldChrZXkpOyBvayB7CgkJcmV0dXJuIHYuKFtddWludDY0KQoJfQoJcmV0dXJuIG5pbAp9CgovLyByZW1vdmVJRCByZXR1cm5zIGlkcyB3aXRoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRhcmdldCByZW1vdmVkLgpmdW5jIHJlbW92ZUlEKGlkcyBbXXVpbnQ2NCwgdGFyZ2V0IHVpbnQ2NCkgW111aW50NjQgewoJb3V0IDo9IG1ha2UoW111aW50NjQsIDAsIGxlbihpZHMpKQoJcmVtb3ZlZCA6PSBmYWxzZQoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkcyB7CgkJaWYgIXJlbW92ZWQgJiYgaWQgPT0gdGFyZ2V0IHsKCQkJcmVtb3ZlZCA9IHRydWUKCQkJY29udGludWUKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgaWQpCgl9CglyZXR1cm4gb3V0Cn0KCi8vIHNhbml0aXplRm9yUmVuZGVyIHN0cmlwcyBtYXJrZG93bi9IVE1MLXNlbnNpdGl2ZSBjaGFycyBmcm9tIHVzZXIgc3RyaW5ncyB1c2VkCi8vIGluc2lkZSBSZW5kZXIoKSBtYXJrZG93biAoZGVmZW5zZS1pbi1kZXB0aDsgdGhlIGZyb250ZW5kIGFsc28gRE9NUHVyaWZpZXMpLgovLyAiJiIgaXMgZXNjYXBlZCBGSVJTVCB0byBwcmV2ZW50IGVudGl0eS1pbmplY3Rpb24gKGUuZy4gIiZsdDsiIOKGkiAiJmFtcDtsdDsiKS4KZnVuYyBzYW5pdGl6ZUZvclJlbmRlcihzIHN0cmluZykgc3RyaW5nIHsKCXIgOj0gc3RyaW5ncy5OZXdSZXBsYWNlcigKCQkiJiIsICImYW1wOyIsCgkJIjwiLCAiJmx0OyIsICI+IiwgIiZndDsiLAoJCSJbIiwgIigiLCAiXSIsICIpIiwKCQkiYCIsICInIiwgInwiLCAiLyIsCgkJIlxuIiwgIiAiLCAiXHIiLCAiICIsCgkpCglyZXR1cm4gci5SZXBsYWNlKHMpCn0KCi8vIGpzb25Fc2NhcGUgZXNjYXBlcyBhIHN0cmluZyBmb3IgZW1iZWRkaW5nIGluIHRoZSByZWFsbSdzIGhhbmQtYnVpbHQgSlNPTi4KZnVuYyBqc29uRXNjYXBlKHMgc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglmb3IgXywgYyA6PSByYW5nZSBzIHsKCQlzd2l0Y2ggYyB7CgkJY2FzZSAnIic6CgkJCWIuV3JpdGVTdHJpbmcoIlxcXCIiKQoJCWNhc2UgJ1xcJzoKCQkJYi5Xcml0ZVN0cmluZygiXFxcXCIpCgkJY2FzZSAnXG4nOgoJCQliLldyaXRlU3RyaW5nKCJcXG4iKQoJCWNhc2UgJ1xyJzoKCQkJYi5Xcml0ZVN0cmluZygiXFxyIikKCQljYXNlICdcdCc6CgkJCWIuV3JpdGVTdHJpbmcoIlxcdCIpCgkJZGVmYXVsdDoKCQkJaWYgYyA8IDB4MjAgewoJCQkJY29uc3QgaGV4RGlnaXRzID0gIjAxMjM0NTY3ODlhYmNkZWYiCgkJCQliLldyaXRlU3RyaW5nKCJcXHUwMCIpCgkJCQliLldyaXRlQnl0ZShoZXhEaWdpdHNbaW50KChjPj40KSYweGYpXSkKCQkJCWIuV3JpdGVCeXRlKGhleERpZ2l0c1tpbnQoYyYweGYpXSkKCQkJfSBlbHNlIHsKCQkJCWIuV3JpdGVSdW5lKGMpCgkJCX0KCQl9Cgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyDilIDilIAgVmFsaWRhdGlvbiBoZWxwZXJzIChwdXJlLCBubyBzaWRlLWVmZmVjdHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuYyB2YWxpZFJhdGluZyhyIGludCkgYm9vbCB7IHJldHVybiByID49IDEgJiYgciA8PSA1IH0KCmZ1bmMgdmFsaWRCb2R5KGIgc3RyaW5nKSBib29sIHsgcmV0dXJuIGxlbihiKSA8PSBNYXhCb2R5TGVuIH0KCi8vIHBhaXJLZXkgcmV0dXJucyB0aGUgYXV0aG9yU3ViamVjdCB0cmVlIGtleSBmb3IgYSAoc3ViamVjdCwgYXV0aG9yKSBwYWlyLgovLyBUaGUgTlVMIHNlcGFyYXRvciBwcmV2ZW50cyBwcmVmaXggY29sbGlzaW9ucyBiZXR3ZWVuIHN1YmplY3QgYW5kIGF1dGhvci4KZnVuYyBwYWlyS2V5KHN1YmplY3Qgc3RyaW5nLCBhIGFkZHJlc3MpIHN0cmluZyB7IHJldHVybiBzdWJqZWN0ICsgIlx4MDAiICsgYS5TdHJpbmcoKSB9CgovLyDilIDilIAgV3JpdGUgZnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gUG9zdFJldmlldyBjcmVhdGVzIHRoZSBjYWxsZXIncyByZXZpZXcgZm9yIGBzdWJqZWN0YCwgb3IgcmVwbGFjZXMgaXQgaW4gcGxhY2UKLy8gaWYgb25lIGFscmVhZHkgZXhpc3RzICh0aGUgIm9uZSBlZGl0YWJsZSByZXZpZXcgcGVyIHBhaXIiIHJ1bGUpLgpmdW5jIFBvc3RSZXZpZXcoY3VyIHJlYWxtLCBzdWJqZWN0IHN0cmluZywgcmF0aW5nIGludCwgYm9keSBzdHJpbmcpIHsKCWNhbGxlciA6PSB1bnNhZmUuUHJldmlvdXNSZWFsbSgpLkFkZHJlc3MoKQoJaWYgc3ViamVjdCA9PSAiIiB7CgkJcGFuaWMoInN1YmplY3QgcmVxdWlyZWQiKQoJfQoJaWYgIXZhbGlkUmF0aW5nKHJhdGluZykgewoJCXBhbmljKCJyYXRpbmcgbXVzdCBiZSAxLi41IikKCX0KCWlmICF2YWxpZEJvZHkoYm9keSkgewoJCXBhbmljKCJib2R5IHRvbyBsb25nIikKCX0KCglwayA6PSBwYWlyS2V5KHN1YmplY3QsIGNhbGxlcikKCWlmIHYsIG9rIDo9IGF1dGhvclN1YmplY3QuR2V0KHBrKTsgb2sgewoJCXIsIGZvdW5kIDo9IGdldFJldmlldyh2Lih1aW50NjQpKQoJCWlmIGZvdW5kICYmICFyLkRlbGV0ZWQgJiYgIXIuSGlkZGVuIHsKCQkJLy8gY291bnRlZCByZXZpZXcgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgKHN1YmplY3QsIGF1dGhvcik6IHJhdGluZyBjaGFuZ2Ugb25seS4KCQkJYXBwbHlTdWJqZWN0U3RhdChzdWJqZWN0LCAwLCBpbnQ2NChyYXRpbmcpLWludDY0KHIuUmF0aW5nKSkKCQkJci5SYXRpbmcgPSByYXRpbmcKCQkJci5Cb2R5ID0gYm9keQoJCQlyLkVkaXRlZEF0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCgkJCXJldmlld3MuU2V0KHN0cklEKHIuSUQpLCByKQoJCQljaGFpbi5FbWl0KCJSZXZpZXdVcGRhdGVkIiwgImlkIiwgc3RySUQoci5JRCksICJzdWJqZWN0Iiwgc3ViamVjdCkKCQkJcmV0dXJuCgkJfQoJfQoKCWlkIDo9IG5leHRJRAoJbmV4dElEKysKCXIgOj0gJlJldmlld3sKCQlJRDogICAgICAgIGlkLAoJCVN1YmplY3Q6ICAgc3ViamVjdCwKCQlBdXRob3I6ICAgIGNhbGxlciwKCQlSYXRpbmc6ICAgIHJhdGluZywKCQlCb2R5OiAgICAgIGJvZHksCgkJQ3JlYXRlZEF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9CglyZXZpZXdzLlNldChzdHJJRChpZCksIHIpCglhdXRob3JTdWJqZWN0LlNldChwaywgaWQpCglzdWJqZWN0SW5kZXguU2V0KHN1YmplY3QsIGFwcGVuZChpZExpc3Qoc3ViamVjdEluZGV4LCBzdWJqZWN0KSwgaWQpKQoJYXBwbHlTdWJqZWN0U3RhdChzdWJqZWN0LCAxLCBpbnQ2NChyYXRpbmcpKSAvLyBuZXcgdmlzaWJsZSByZXZpZXcKCWNoYWluLkVtaXQoIlJldmlld1Bvc3RlZCIsICJpZCIsIHN0cklEKGlkKSwgInN1YmplY3QiLCBzdWJqZWN0LCAiYXV0aG9yIiwgY2FsbGVyLlN0cmluZygpKQp9CgovLyBFZGl0UmV2aWV3IHVwZGF0ZXMgcmF0aW5nICsgYm9keSBvZiBhbiBleGlzdGluZyBub24tZGVsZXRlZCByZXZpZXcuCi8vIE9ubHkgdGhlIG9yaWdpbmFsIGF1dGhvciBtYXkgZWRpdC4KZnVuYyBFZGl0UmV2aWV3KGN1ciByZWFsbSwgcmV2aWV3SUQgdWludDY0LCByYXRpbmcgaW50LCBib2R5IHN0cmluZykgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglyLCBvayA6PSBnZXRSZXZpZXcocmV2aWV3SUQpCglpZiAhb2sgfHwgci5EZWxldGVkIHsKCQlwYW5pYygicmV2aWV3IG5vdCBmb3VuZCIpCgl9CglpZiByLkF1dGhvciAhPSBjYWxsZXIgewoJCXBhbmljKCJhdXRob3Igb25seSIpCgl9CglpZiAhdmFsaWRSYXRpbmcocmF0aW5nKSB7CgkJcGFuaWMoInJhdGluZyBtdXN0IGJlIDEuLjUiKQoJfQoJaWYgIXZhbGlkQm9keShib2R5KSB7CgkJcGFuaWMoImJvZHkgdG9vIGxvbmciKQoJfQoJaWYgIXIuSGlkZGVuIHsgLy8gY291bnRlZCAoci5EZWxldGVkIGlzIGZhbHNlIHBlciB0aGUgZ3VhcmQgYWJvdmUpOiBhcHBseSB0aGUgcmF0aW5nIGRlbHRhCgkJYXBwbHlTdWJqZWN0U3RhdChyLlN1YmplY3QsIDAsIGludDY0KHJhdGluZyktaW50NjQoci5SYXRpbmcpKQoJfQoJci5SYXRpbmcgPSByYXRpbmcKCXIuQm9keSA9IGJvZHkKCXIuRWRpdGVkQXQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCXJldmlld3MuU2V0KHN0cklEKHJldmlld0lEKSwgcikKCWNoYWluLkVtaXQoIlJldmlld1VwZGF0ZWQiLCAiaWQiLCBzdHJJRChyZXZpZXdJRCksICJzdWJqZWN0Iiwgci5TdWJqZWN0KQp9CgovLyBEZWxldGVSZXZpZXcgdG9tYnN0b25lcyB0aGUgY2FsbGVyJ3MgcmV2aWV3OiBrZWVwcyB0aGUgSUQgKyByZWFjdGlvbiBoaXN0b3J5LAovLyBjbGVhcnMgdGhlIGJvZHksIGFuZCBmcmVlcyB0aGUgKGF1dGhvciwgc3ViamVjdCkgcGFpciBmb3IgYSBmcmVzaCByZXZpZXcuCi8vIE9ubHkgdGhlIG9yaWdpbmFsIGF1dGhvciBtYXkgZGVsZXRlLgpmdW5jIERlbGV0ZVJldmlldyhjdXIgcmVhbG0sIHJldmlld0lEIHVpbnQ2NCkgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglyLCBvayA6PSBnZXRSZXZpZXcocmV2aWV3SUQpCglpZiAhb2sgfHwgci5EZWxldGVkIHsKCQlwYW5pYygicmV2aWV3IG5vdCBmb3VuZCIpCgl9CglpZiByLkF1dGhvciAhPSBjYWxsZXIgewoJCXBhbmljKCJhdXRob3Igb25seSIpCgl9CglpZiAhci5IaWRkZW4geyAvLyB3YXMgY291bnRlZCAoci5EZWxldGVkIGZhbHNlIHBlciBndWFyZCk6IGRyb3AgaXQgZnJvbSB0aGUgc3ViamVjdCBzdGF0cwoJCWFwcGx5U3ViamVjdFN0YXQoci5TdWJqZWN0LCAtMSwgLWludDY0KHIuUmF0aW5nKSkKCX0KCXIuRGVsZXRlZCA9IHRydWUKCXIuQm9keSA9ICIiCglyZXZpZXdzLlNldChzdHJJRChyZXZpZXdJRCksIHIpCglhdXRob3JTdWJqZWN0LlJlbW92ZShwYWlyS2V5KHIuU3ViamVjdCwgY2FsbGVyKSkKCXN1YmplY3RJbmRleC5TZXQoci5TdWJqZWN0LCByZW1vdmVJRChpZExpc3Qoc3ViamVjdEluZGV4LCByLlN1YmplY3QpLCByZXZpZXdJRCkpCglmbGFnZ2VkSURzLlJlbW92ZShzdHJJRChyZXZpZXdJRCkpIC8vIFJWLTM6IGRvbid0IGxlYXZlIGEgdG9tYnN0b25lZCByZXZpZXcgaW4gdGhlIG1vZCBkYXNoYm9hcmQKCWNoYWluLkVtaXQoIlJldmlld0RlbGV0ZWQiLCAiaWQiLCBzdHJJRChyZXZpZXdJRCksICJzdWJqZWN0Iiwgci5TdWJqZWN0KQp9CgovLyDilIDilIAgQ29tbWVudCB2YWxpZGF0aW9uIChwdXJlLCBubyBzaWRlLWVmZmVjdHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gdmFsaWRDb21tZW50IHJldHVybnMgdHJ1ZSBpZmYgYm9keSBpcyBub24tZW1wdHkgYW5kIHdpdGhpbiBNYXhDb21tZW50TGVuLgpmdW5jIHZhbGlkQ29tbWVudChiIHN0cmluZykgYm9vbCB7IHJldHVybiBiICE9ICIiICYmIGxlbihiKSA8PSBNYXhDb21tZW50TGVuIH0KCi8vIOKUgOKUgCBDb21tZW50IHdyaXRlIGZ1bmN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFBvc3RDb21tZW50IHBvc3RzIGEgZmxhdCByZXBseSB0byBhbiBleGlzdGluZywgbm9uLWRlbGV0ZWQsIG5vbi1oaWRkZW4gcmV2aWV3LgpmdW5jIFBvc3RDb21tZW50KGN1ciByZWFsbSwgcmV2aWV3SUQgdWludDY0LCBib2R5IHN0cmluZykgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCglyLCBvayA6PSBnZXRSZXZpZXcocmV2aWV3SUQpCglpZiAhb2sgfHwgci5EZWxldGVkIHx8IHIuSGlkZGVuIHsKCQlwYW5pYygicmV2aWV3IG5vdCBmb3VuZCIpCgl9CglpZiAhdmFsaWRDb21tZW50KGJvZHkpIHsKCQlwYW5pYygiY29tbWVudCBsZW5ndGggaW52YWxpZCIpCgl9CglpZCA6PSBuZXh0SUQKCW5leHRJRCsrCgljIDo9ICZDb21tZW50ewoJCUlEOiAgICAgICAgaWQsCgkJUmV2aWV3SUQ6ICByZXZpZXdJRCwKCQlBdXRob3I6ICAgIGNhbGxlciwKCQlCb2R5OiAgICAgIGJvZHksCgkJQ3JlYXRlZEF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9Cgljb21tZW50cy5TZXQoc3RySUQoaWQpLCBjKQoJY29tbWVudEluZGV4LlNldChzdHJJRChyZXZpZXdJRCksIGFwcGVuZChpZExpc3QoY29tbWVudEluZGV4LCBzdHJJRChyZXZpZXdJRCkpLCBpZCkpCgljaGFpbi5FbWl0KCJDb21tZW50UG9zdGVkIiwgImlkIiwgc3RySUQoaWQpLCAicmV2aWV3Iiwgc3RySUQocmV2aWV3SUQpLCAiYXV0aG9yIiwgY2FsbGVyLlN0cmluZygpKQp9CgovLyBFZGl0Q29tbWVudCB1cGRhdGVzIHRoZSBib2R5IG9mIGFuIGV4aXN0aW5nLCBub24tZGVsZXRlZCBjb21tZW50LgovLyBPbmx5IHRoZSBvcmlnaW5hbCBhdXRob3IgbWF5IGVkaXQuCmZ1bmMgRWRpdENvbW1lbnQoY3VyIHJlYWxtLCBjb21tZW50SUQgdWludDY0LCBib2R5IHN0cmluZykgewoJY2FsbGVyIDo9IHVuc2FmZS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCgljLCBvayA6PSBnZXRDb21tZW50KGNvbW1lbnRJRCkKCWlmICFvayB8fCBjLkRlbGV0ZWQgewoJCXBhbmljKCJjb21tZW50IG5vdCBmb3VuZCIpCgl9CglpZiBjLkF1dGhvciAhPSBjYWxsZXIgewoJCXBhbmljKCJhdXRob3Igb25seSIpCgl9CglpZiAhdmFsaWRDb21tZW50KGJvZHkpIHsKCQlwYW5pYygiY29tbWVudCBsZW5ndGggaW52YWxpZCIpCgl9CgljLkJvZHkgPSBib2R5CgljLkVkaXRlZEF0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCgljb21tZW50cy5TZXQoc3RySUQoY29tbWVudElEKSwgYykKCWNoYWluLkVtaXQoIkNvbW1lbnRVcGRhdGVkIiwgImlkIiwgc3RySUQoY29tbWVudElEKSkKfQoKLy8gRGVsZXRlQ29tbWVudCB0b21ic3RvbmVzIHRoZSBjYWxsZXIncyBjb21tZW50OiBjbGVhcnMgdGhlIGJvZHkuCi8vIE9ubHkgdGhlIG9yaWdpbmFsIGF1dGhvciBtYXkgZGVsZXRlLgpmdW5jIERlbGV0ZUNvbW1lbnQoY3VyIHJlYWxtLCBjb21tZW50SUQgdWludDY0KSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWMsIG9rIDo9IGdldENvbW1lbnQoY29tbWVudElEKQoJaWYgIW9rIHx8IGMuRGVsZXRlZCB7CgkJcGFuaWMoImNvbW1lbnQgbm90IGZvdW5kIikKCX0KCWlmIGMuQXV0aG9yICE9IGNhbGxlciB7CgkJcGFuaWMoImF1dGhvciBvbmx5IikKCX0KCWMuRGVsZXRlZCA9IHRydWUKCWMuQm9keSA9ICIiCgljb21tZW50cy5TZXQoc3RySUQoY29tbWVudElEKSwgYykKCWZsYWdnZWRJRHMuUmVtb3ZlKHN0cklEKGNvbW1lbnRJRCkpIC8vIFJWLTM6IGRvbid0IGxlYXZlIGEgdG9tYnN0b25lZCBjb21tZW50IGluIHRoZSBtb2QgZGFzaGJvYXJkCgljaGFpbi5FbWl0KCJDb21tZW50RGVsZXRlZCIsICJpZCIsIHN0cklEKGNvbW1lbnRJRCkpCn0KCi8vIOKUgOKUgCBSZWFjdGlvbiBoZWxwZXJzIChwdXJlLCBubyBzaWRlLWVmZmVjdHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZnVuYyBib29sVG9JbnQoYiBib29sKSBpbnQgewoJaWYgYiB7CgkJcmV0dXJuIDEKCX0KCXJldHVybiAwCn0KCi8vIHJlYWN0aW9uRGVsdGEgcmV0dXJucyBob3cgYSByZWFjdGlvbiBjaGFuZ2UgKG9sZCAtPiBuZXdLaW5kLCBlYWNoICIiIHwgImxpa2UiIHwgImRpc2xpa2UiKQovLyBtb3ZlcyB0aGUgdGFyZ2V0J3MgbGlrZSBjb3VudCwgZGlzbGlrZSBjb3VudCwgYW5kIHRoZSB0YXJnZXQgYXV0aG9yJ3MgcmVwdXRhdGlvbi4KLy8gcmVwRGVsdGEgPSBsaWtlc0RlbHRhIC0gZGlzbGlrZXNEZWx0YS4KZnVuYyByZWFjdGlvbkRlbHRhKG9sZCwgbmV3S2luZCBzdHJpbmcpIChsaWtlc0RlbHRhLCBkaXNsaWtlc0RlbHRhLCByZXBEZWx0YSBpbnQpIHsKCWxpa2VzRGVsdGEgPSBib29sVG9JbnQobmV3S2luZCA9PSAibGlrZSIpIC0gYm9vbFRvSW50KG9sZCA9PSAibGlrZSIpCglkaXNsaWtlc0RlbHRhID0gYm9vbFRvSW50KG5ld0tpbmQgPT0gImRpc2xpa2UiKSAtIGJvb2xUb0ludChvbGQgPT0gImRpc2xpa2UiKQoJcmVwRGVsdGEgPSBsaWtlc0RlbHRhIC0gZGlzbGlrZXNEZWx0YQoJcmV0dXJuCn0KCi8vIGFwcGx5RGVsdGEgYWRqdXN0cyBhbiB1bnNpZ25lZCBjb3VudGVyIGJ5IMKxMS1zdHlsZSBkZWx0YSB3aXRob3V0IHVuZGVyZmxvdy4KZnVuYyBhcHBseURlbHRhKHYgdWludDY0LCBkZWx0YSBpbnQpIHVpbnQ2NCB7CglpZiBkZWx0YSA8IDAgewoJCWQgOj0gdWludDY0KC1kZWx0YSkKCQlpZiB2IDwgZCB7CgkJCXJldHVybiAwCgkJfQoJCXJldHVybiB2IC0gZAoJfQoJcmV0dXJuIHYgKyB1aW50NjQoZGVsdGEpCn0KCi8vIOKUgOKUgCBSZWFjdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIFJlYWN0IHJlY29yZHMgb3IgdG9nZ2xlcyBhIGxpa2UvZGlzbGlrZSBvbiBhIHJldmlldyBvciBjb21tZW50LgovLyBSZS1yZWFjdGluZyB3aXRoIHRoZSBzYW1lIGtpbmQgdG9nZ2xlcyBpdCBvZmY7IHN3aXRjaGluZyBraW5kIHJlcGxhY2VzIGl0LgovLyBVcGRhdGVzIHRoZSB0YXJnZXQncyBMaWtlcy9EaXNsaWtlcyBjb3VudGVycyBhbmQgdGhlIGF1dGhvcidzIHJlcHV0YXRpb24gYnkKLy8gzpQobGlrZXPiiJJkaXNsaWtlcykuIFNlbGYtcmVhY3Rpb25zIGFyZSByZWplY3RlZC4gRGVsZXRlZC9oaWRkZW4gdGFyZ2V0cyBhcmUgcmVqZWN0ZWQuCmZ1bmMgUmVhY3QoY3VyIHJlYWxtLCB0YXJnZXRJRCB1aW50NjQsIGtpbmQgc3RyaW5nKSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCWlmIGtpbmQgIT0gImxpa2UiICYmIGtpbmQgIT0gImRpc2xpa2UiIHsKCQlwYW5pYygia2luZCBtdXN0IGJlIGxpa2Ugb3IgZGlzbGlrZSIpCgl9CgoJciwgaXNSZXZpZXcgOj0gZ2V0UmV2aWV3KHRhcmdldElEKQoJYywgaXNDb21tZW50IDo9IGdldENvbW1lbnQodGFyZ2V0SUQpCglpZiAhaXNSZXZpZXcgJiYgIWlzQ29tbWVudCB7CgkJcGFuaWMoInRhcmdldCBub3QgZm91bmQiKQoJfQoKCXZhciBhdXRob3IgYWRkcmVzcwoJaWYgaXNSZXZpZXcgewoJCWF1dGhvciA9IHIuQXV0aG9yCgkJaWYgci5EZWxldGVkIHx8IHIuSGlkZGVuIHsKCQkJcGFuaWMoInRhcmdldCBub3QgZm91bmQiKQoJCX0KCX0gZWxzZSB7CgkJYXV0aG9yID0gYy5BdXRob3IKCQlpZiBjLkRlbGV0ZWQgfHwgYy5IaWRkZW4gewoJCQlwYW5pYygidGFyZ2V0IG5vdCBmb3VuZCIpCgkJfQoJfQoJaWYgYXV0aG9yID09IGNhbGxlciB7CgkJcGFuaWMoImNhbm5vdCByZWFjdCB0byB5b3VyIG93biByZXZpZXcgb3IgY29tbWVudCIpCgl9CgoJcmsgOj0gc3RySUQodGFyZ2V0SUQpICsgIi8iICsgY2FsbGVyLlN0cmluZygpCgl2YXIgb2xkIHN0cmluZwoJaWYgdiwgb2sgOj0gcmVhY3Rpb25zLkdldChyayk7IG9rIHsKCQlvbGQgPSB2LihzdHJpbmcpCgl9CgoJbmV3S2luZCA6PSBraW5kCglpZiBvbGQgPT0ga2luZCB7CgkJbmV3S2luZCA9ICIiIC8vIHRvZ2dsZSBvZmYKCX0KCglsaWtlc0RlbHRhLCBkaXNsaWtlc0RlbHRhLCByZXBEZWx0YSA6PSByZWFjdGlvbkRlbHRhKG9sZCwgbmV3S2luZCkKCglpZiBuZXdLaW5kID09ICIiIHsKCQlyZWFjdGlvbnMuUmVtb3ZlKHJrKQoJfSBlbHNlIHsKCQlyZWFjdGlvbnMuU2V0KHJrLCBuZXdLaW5kKQoJfQoKCWlmIGlzUmV2aWV3IHsKCQlyLkxpa2VzID0gYXBwbHlEZWx0YShyLkxpa2VzLCBsaWtlc0RlbHRhKQoJCXIuRGlzbGlrZXMgPSBhcHBseURlbHRhKHIuRGlzbGlrZXMsIGRpc2xpa2VzRGVsdGEpCgkJcmV2aWV3cy5TZXQoc3RySUQodGFyZ2V0SUQpLCByKQoJfSBlbHNlIHsKCQljLkxpa2VzID0gYXBwbHlEZWx0YShjLkxpa2VzLCBsaWtlc0RlbHRhKQoJCWMuRGlzbGlrZXMgPSBhcHBseURlbHRhKGMuRGlzbGlrZXMsIGRpc2xpa2VzRGVsdGEpCgkJY29tbWVudHMuU2V0KHN0cklEKHRhcmdldElEKSwgYykKCX0KCWFkZFJlcHV0YXRpb24oYXV0aG9yLlN0cmluZygpLCBpbnQ2NChyZXBEZWx0YSkpCgljaGFpbi5FbWl0KCJSZWFjdGVkIiwgInRhcmdldCIsIHN0cklEKHRhcmdldElEKSwgImtpbmQiLCBuZXdLaW5kLCAiYnkiLCBjYWxsZXIuU3RyaW5nKCkpCn0KCi8vIOKUgOKUgCBGbGFnICsgbW9kZXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8vIEZsYWcgcmVjb3JkcyBvbmUgY29tbXVuaXR5IGZsYWcgcGVyIGFjY291bnQgcGVyIHRhcmdldCAocmV2aWV3IG9yIGNvbW1lbnQpLgovLyBBdXRvLWhpZGUgaXMgTk9UIHBlcmZvcm1lZCBoZXJlOyB0YWtlZG93bnMgYXJlIG11bHRpc2lnLW9ubHkgKEhpZGVSZXZpZXcvSGlkZUNvbW1lbnQpLgovLyBEZWxldGVkL2hpZGRlbiB0YXJnZXRzIGFyZSByZWplY3RlZC4KZnVuYyBGbGFnKGN1ciByZWFsbSwgdGFyZ2V0SUQgdWludDY0KSB7CgljYWxsZXIgOj0gdW5zYWZlLlByZXZpb3VzUmVhbG0oKS5BZGRyZXNzKCkKCXIsIGlzUmV2aWV3IDo9IGdldFJldmlldyh0YXJnZXRJRCkKCWMsIGlzQ29tbWVudCA6PSBnZXRDb21tZW50KHRhcmdldElEKQoJaWYgIWlzUmV2aWV3ICYmICFpc0NvbW1lbnQgewoJCXBhbmljKCJ0YXJnZXQgbm90IGZvdW5kIikKCX0KCWlmIGlzUmV2aWV3ICYmIChyLkRlbGV0ZWQgfHwgci5IaWRkZW4pIHsKCQlwYW5pYygidGFyZ2V0IG5vdCBmb3VuZCIpCgl9CglpZiBpc0NvbW1lbnQgJiYgKGMuRGVsZXRlZCB8fCBjLkhpZGRlbikgewoJCXBhbmljKCJ0YXJnZXQgbm90IGZvdW5kIikKCX0KCWZrIDo9IHN0cklEKHRhcmdldElEKSArICIvIiArIGNhbGxlci5TdHJpbmcoKQoJaWYgXywgb2sgOj0gZmxhZ3MuR2V0KGZrKTsgb2sgewoJCXBhbmljKCJhbHJlYWR5IGZsYWdnZWQiKQoJfQoJZmxhZ3MuU2V0KGZrLCB0cnVlKQoKCWlmIGlzUmV2aWV3IHsKCQlyLkZsYWdDb3VudCsrCgkJcmV2aWV3cy5TZXQoc3RySUQodGFyZ2V0SUQpLCByKQoJfSBlbHNlIHsKCQljLkZsYWdDb3VudCsrCgkJY29tbWVudHMuU2V0KHN0cklEKHRhcmdldElEKSwgYykKCX0KCWZsYWdnZWRJRHMuU2V0KHN0cklEKHRhcmdldElEKSwgdHJ1ZSkKCWNoYWluLkVtaXQoIkZsYWdnZWQiLCAidGFyZ2V0Iiwgc3RySUQodGFyZ2V0SUQpLCAiYnkiLCBjYWxsZXIuU3RyaW5nKCkpCn0KCi8vIEhpZGVSZXZpZXcgc29mdC1kZWxldGVzIGEgcmV2aWV3LiBNb2RlcmF0b3IgKG11bHRpc2lnKSBvbmx5LgpmdW5jIEhpZGVSZXZpZXcoY3VyIHJlYWxtLCBpZCB1aW50NjQpIHsKCWFzc2VydE1vZGVyYXRvcigpCglyLCBvayA6PSBnZXRSZXZpZXcoaWQpCglpZiAhb2sgewoJCXBhbmljKCJyZXZpZXcgbm90IGZvdW5kIikKCX0KCWlmICFyLkhpZGRlbiAmJiAhci5EZWxldGVkIHsgLy8gd2FzIGNvdW50ZWQg4oaSIGRyb3AgZnJvbSBzdWJqZWN0IHN0YXRzIChndWFyZCBhZ2FpbnN0IHJlLWhpZGUpCgkJYXBwbHlTdWJqZWN0U3RhdChyLlN1YmplY3QsIC0xLCAtaW50NjQoci5SYXRpbmcpKQoJfQoJci5IaWRkZW4gPSB0cnVlCglyZXZpZXdzLlNldChzdHJJRChpZCksIHIpCgljaGFpbi5FbWl0KCJIaWRkZW4iLCAidGFyZ2V0Iiwgc3RySUQoaWQpKQp9CgovLyBIaWRlQ29tbWVudCBzb2Z0LWRlbGV0ZXMgYSBjb21tZW50LiBNb2RlcmF0b3IgKG11bHRpc2lnKSBvbmx5LgpmdW5jIEhpZGVDb21tZW50KGN1ciByZWFsbSwgaWQgdWludDY0KSB7Cglhc3NlcnRNb2RlcmF0b3IoKQoJYywgb2sgOj0gZ2V0Q29tbWVudChpZCkKCWlmICFvayB7CgkJcGFuaWMoImNvbW1lbnQgbm90IGZvdW5kIikKCX0KCWMuSGlkZGVuID0gdHJ1ZQoJY29tbWVudHMuU2V0KHN0cklEKGlkKSwgYykKCWNoYWluLkVtaXQoIkhpZGRlbiIsICJ0YXJnZXQiLCBzdHJJRChpZCkpCn0KCi8vIFVuaGlkZSByZXZlcnNlcyBhIGhpZGUgKG1hbnVhbCBvciBhdXRvLWZsYWcpIG9uIGEgcmV2aWV3IG9yIGNvbW1lbnQuCi8vIE1vZGVyYXRvciAobXVsdGlzaWcpIG9ubHkuIEFsc28gcmVtb3ZlcyB0aGUgdGFyZ2V0IGZyb20gdGhlIG1vZCBkYXNoYm9hcmQgaW5kZXguCmZ1bmMgVW5oaWRlKGN1ciByZWFsbSwgdGFyZ2V0SUQgdWludDY0KSB7Cglhc3NlcnRNb2RlcmF0b3IoKQoJaWYgciwgb2sgOj0gZ2V0UmV2aWV3KHRhcmdldElEKTsgb2sgewoJCWlmIHIuSGlkZGVuICYmICFyLkRlbGV0ZWQgeyAvLyBiZWNvbWVzIGNvdW50ZWQgYWdhaW4g4oaSIHJlc3RvcmUgdG8gc3ViamVjdCBzdGF0cwoJCQlhcHBseVN1YmplY3RTdGF0KHIuU3ViamVjdCwgMSwgaW50NjQoci5SYXRpbmcpKQoJCX0KCQlyLkhpZGRlbiA9IGZhbHNlCgkJcmV2aWV3cy5TZXQoc3RySUQodGFyZ2V0SUQpLCByKQoJCWZsYWdnZWRJRHMuUmVtb3ZlKHN0cklEKHRhcmdldElEKSkKCQljaGFpbi5FbWl0KCJVbmhpZGRlbiIsICJ0YXJnZXQiLCBzdHJJRCh0YXJnZXRJRCkpCgkJcmV0dXJuCgl9CglpZiBjLCBvayA6PSBnZXRDb21tZW50KHRhcmdldElEKTsgb2sgewoJCWMuSGlkZGVuID0gZmFsc2UKCQljb21tZW50cy5TZXQoc3RySUQodGFyZ2V0SUQpLCBjKQoJCWZsYWdnZWRJRHMuUmVtb3ZlKHN0cklEKHRhcmdldElEKSkKCQljaGFpbi5FbWl0KCJVbmhpZGRlbiIsICJ0YXJnZXQiLCBzdHJJRCh0YXJnZXRJRCkpCgkJcmV0dXJuCgl9CglwYW5pYygidGFyZ2V0IG5vdCBmb3VuZCIpCn0KCi8vIOKUgOKUgCBSZWFkIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgovLyBjbGFtcExpbWl0IGVuc3VyZXMgbGltaXQgaXMgaW4gWzEsIE1heFBhZ2VMaW1pdF0uIFplcm8gb3IgbmVnYXRpdmUgdmFsdWVzIGFuZAovLyB2YWx1ZXMgYWJvdmUgTWF4UGFnZUxpbWl0IGFyZSBhbGwgY2xhbXBlZCB0byBNYXhQYWdlTGltaXQuCmZ1bmMgY2xhbXBMaW1pdChsaW1pdCBpbnQpIGludCB7CglpZiBsaW1pdCA8PSAwIHx8IGxpbWl0ID4gTWF4UGFnZUxpbWl0IHsKCQlyZXR1cm4gTWF4UGFnZUxpbWl0Cgl9CglyZXR1cm4gbGltaXQKfQoKLy8gd2luZG93IHNsaWNlcyBpZHNbb2Zmc2V0IDogb2Zmc2V0K2xpbWl0XSBzYWZlbHkgKG5vIHBhbmljcyBvbiBvdXQtb2YtcmFuZ2UpLgpmdW5jIHdpbmRvdyhpZHMgW111aW50NjQsIG9mZnNldCwgbGltaXQgaW50KSBbXXVpbnQ2NCB7CglsaW1pdCA9IGNsYW1wTGltaXQobGltaXQpCglpZiBvZmZzZXQgPCAwIHsKCQlvZmZzZXQgPSAwCgl9CglpZiBvZmZzZXQgPj0gbGVuKGlkcykgewoJCXJldHVybiBuaWwKCX0KCWVuZCA6PSBvZmZzZXQgKyBsaW1pdAoJaWYgZW5kID4gbGVuKGlkcykgewoJCWVuZCA9IGxlbihpZHMpCgl9CglyZXR1cm4gaWRzW29mZnNldDplbmRdCn0KCmZ1bmMgcmV2aWV3SlNPTihyICpSZXZpZXcpIHN0cmluZyB7Cglib2R5IDo9ICIiCglpZiAhci5EZWxldGVkIHsKCQlib2R5ID0ganNvbkVzY2FwZShyLkJvZHkpCgl9CglyZXR1cm4gdWZtdC5TcHJpbnRmKAoJCWB7ImlkIjolZCwic3ViamVjdCI6IiVzIiwiYXV0aG9yIjoiJXMiLCJyYXRpbmciOiVkLCJib2R5IjoiJXMiLCJjcmVhdGVkQXQiOiVkLCJlZGl0ZWRBdCI6JWQsImRlbGV0ZWQiOiV0LCJsaWtlcyI6JWQsImRpc2xpa2VzIjolZCwiZmxhZ3MiOiVkLCJyZXB1dGF0aW9uIjolZH1gLAoJCXIuSUQsIGpzb25Fc2NhcGUoci5TdWJqZWN0KSwganNvbkVzY2FwZShyLkF1dGhvci5TdHJpbmcoKSksIHIuUmF0aW5nLCBib2R5LAoJCXIuQ3JlYXRlZEF0LCByLkVkaXRlZEF0LCByLkRlbGV0ZWQsIHIuTGlrZXMsIHIuRGlzbGlrZXMsIHIuRmxhZ0NvdW50LAoJCWdldFJlcHV0YXRpb24oci5BdXRob3IuU3RyaW5nKCkpLAoJKQp9CgpmdW5jIGNvbW1lbnRKU09OKGMgKkNvbW1lbnQpIHN0cmluZyB7Cglib2R5IDo9ICIiCglpZiAhYy5EZWxldGVkIHsKCQlib2R5ID0ganNvbkVzY2FwZShjLkJvZHkpCgl9CglyZXR1cm4gdWZtdC5TcHJpbnRmKAoJCWB7ImlkIjolZCwicmV2aWV3SWQiOiVkLCJhdXRob3IiOiIlcyIsImJvZHkiOiIlcyIsImNyZWF0ZWRBdCI6JWQsImVkaXRlZEF0IjolZCwiZGVsZXRlZCI6JXQsImxpa2VzIjolZCwiZGlzbGlrZXMiOiVkLCJmbGFncyI6JWQsInJlcHV0YXRpb24iOiVkfWAsCgkJYy5JRCwgYy5SZXZpZXdJRCwganNvbkVzY2FwZShjLkF1dGhvci5TdHJpbmcoKSksIGJvZHksCgkJYy5DcmVhdGVkQXQsIGMuRWRpdGVkQXQsIGMuRGVsZXRlZCwgYy5MaWtlcywgYy5EaXNsaWtlcywgYy5GbGFnQ291bnQsCgkJZ2V0UmVwdXRhdGlvbihjLkF1dGhvci5TdHJpbmcoKSksCgkpCn0KCi8vIEdldFJldmlld3NKU09OIHJldHVybnMgYSBKU09OIGFycmF5IG9mIGEgc3ViamVjdCdzIG5vbi1oaWRkZW4gcmV2aWV3cyAocGFnaW5hdGVkKS4KLy8gRGVsZXRlZCByZXZpZXdzIGFyZSBpbmNsdWRlZCBhcyB0b21ic3RvbmVzIChlbXB0eSBib2R5LCBkZWxldGVkOnRydWUpLgpmdW5jIEdldFJldmlld3NKU09OKHN1YmplY3Qgc3RyaW5nLCBvZmZzZXQsIGxpbWl0IGludCkgc3RyaW5nIHsKCWlkcyA6PSB3aW5kb3coaWRMaXN0KHN1YmplY3RJbmRleCwgc3ViamVjdCksIG9mZnNldCwgbGltaXQpCgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIlsiKQoJZmlyc3QgOj0gdHJ1ZQoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkcyB7CgkJciwgb2sgOj0gZ2V0UmV2aWV3KGlkKQoJCWlmICFvayB8fCByLkhpZGRlbiB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmICFmaXJzdCB7CgkJCWIuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQliLldyaXRlU3RyaW5nKHJldmlld0pTT04ocikpCgkJZmlyc3QgPSBmYWxzZQoJfQoJYi5Xcml0ZVN0cmluZygiXSIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBHZXRDb21tZW50c0pTT04gcmV0dXJucyBhIEpTT04gYXJyYXkgb2YgYSByZXZpZXcncyBub24taGlkZGVuIGNvbW1lbnRzIChwYWdpbmF0ZWQpLgpmdW5jIEdldENvbW1lbnRzSlNPTihyZXZpZXdJRCB1aW50NjQsIG9mZnNldCwgbGltaXQgaW50KSBzdHJpbmcgewoJaWRzIDo9IHdpbmRvdyhpZExpc3QoY29tbWVudEluZGV4LCBzdHJJRChyZXZpZXdJRCkpLCBvZmZzZXQsIGxpbWl0KQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJbIikKCWZpcnN0IDo9IHRydWUKCWZvciBfLCBpZCA6PSByYW5nZSBpZHMgewoJCWMsIG9rIDo9IGdldENvbW1lbnQoaWQpCgkJaWYgIW9rIHx8IGMuSGlkZGVuIHsKCQkJY29udGludWUKCQl9CgkJaWYgIWZpcnN0IHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoY29tbWVudEpTT04oYykpCgkJZmlyc3QgPSBmYWxzZQoJfQoJYi5Xcml0ZVN0cmluZygiXSIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBHZXRTdWJqZWN0U3VtbWFyeUpTT04gcmV0dXJucyB7ImNvdW50IjpOLCJhdmVyYWdlIjpBLCJzdW0iOlN9IG92ZXIgbm9uLWhpZGRlbiwKLy8gbm9uLWRlbGV0ZWQgcmV2aWV3cyBmb3IgYSBzdWJqZWN0LiBBdmVyYWdlIGlzIGludGVnZXItcm91bmRlZC4KLy8gR2V0U3ViamVjdFN1bW1hcnlKU09OIHJldHVybnMgdGhlIGNvdW50L2F2ZXJhZ2Uvc3VtIG9mIGEgc3ViamVjdCdzIFZJU0lCTEUgcmV2aWV3cy4KLy8gUlYtMTogTygxKSDigJQgcmVhZHMgdGhlIG1haW50YWluZWQgcGVyLXN1YmplY3QgY291bnRlcnMgaW5zdGVhZCBvZiBzY2FubmluZyB0aGUgKHN5YmlsLQovLyBncm93YWJsZSkgcmV2aWV3IGxpc3QsIHNvIGl0IGNhbiBuZXZlciBleGNlZWQgdGhlIHF1ZXJ5IGdhcyBjYXAuCmZ1bmMgR2V0U3ViamVjdFN1bW1hcnlKU09OKHN1YmplY3Qgc3RyaW5nKSBzdHJpbmcgewoJbiA6PSBnZXRTdGF0KHN1YmpTdGF0Q291bnQsIHN1YmplY3QpCglzdW0gOj0gZ2V0U3RhdChzdWJqU3RhdFN1bSwgc3ViamVjdCkKCWF2ZyA6PSBpbnQ2NCgwKQoJaWYgbiA+IDAgewoJCWF2ZyA9IChzdW0gKyBuLzIpIC8gbiAvLyByb3VuZCB0byBuZWFyZXN0Cgl9CglyZXR1cm4gdWZtdC5TcHJpbnRmKGB7ImNvdW50IjolZCwiYXZlcmFnZSI6JWQsInN1bSI6JWR9YCwgbiwgYXZnLCBzdW0pCn0KCi8vIEdldFJlcHV0YXRpb24gcmV0dXJucyB0aGUgbmV0IGxpa2Vz4oiSZGlzbGlrZXMgcmVwdXRhdGlvbiBmb3IgYW4gYWRkcmVzcy4KLy8gUmV0dXJucyAwIGZvciB1bmtub3duIGFkZHJlc3Nlcy4gUXVlcmllZCB2aWEgdm0vcWV2YWwgKGJhcmUgaW50NjQpLgpmdW5jIEdldFJlcHV0YXRpb24oYWRkciBzdHJpbmcpIGludDY0IHsgcmV0dXJuIGdldFJlcHV0YXRpb24oYWRkcikgfQoKLy8gR2V0RmxhZ2dlZEpTT04gcmV0dXJucyBhIEpTT04gYXJyYXkgb2YgZmxhZ2dlZCB0YXJnZXQgSURzIGZvciB0aGUgbW9kIGRhc2hib2FyZCwKLy8gcGFnaW5hdGVkLiBJRHMgYXJlIHJldHVybmVkIGFzIGJhcmUgaW50ZWdlcnMgKG5vdCBxdW90ZWQgc3RyaW5ncykuCi8vIFVzZXMgZWFybHktc3RvcCBpdGVyYXRpb24gdG8gYXZvaWQgbG9hZGluZyB0aGUgZW50aXJlIHRyZWUuCmZ1bmMgR2V0RmxhZ2dlZEpTT04ob2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglsaW1pdCA9IGNsYW1wTGltaXQobGltaXQpCglpZiBvZmZzZXQgPCAwIHsKCQlvZmZzZXQgPSAwCgl9Cgl2YXIgaWRzIFtddWludDY0Cglza2lwcGVkIDo9IDAKCWZsYWdnZWRJRHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJaWYgc2tpcHBlZCA8IG9mZnNldCB7CgkJCXNraXBwZWQrKwoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJaWQsIF8gOj0gc3RyY29udi5QYXJzZVVpbnQoa2V5LCAxMCwgNjQpCgkJaWRzID0gYXBwZW5kKGlkcywgaWQpCgkJcmV0dXJuIGxlbihpZHMpID49IGxpbWl0IC8vIHN0b3Agb25jZSBjb2xsZWN0ZWQgZW5vdWdoCgl9KQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJbIikKCWZvciBpLCBpZCA6PSByYW5nZSBpZHMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoc3RySUQoaWQpKQoJfQoJYi5Xcml0ZVN0cmluZygiXSIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBSZW5kZXIg4oCUIGh1bWFuIGdub3dlYiB2aWV3LgovLyAiIiDihpIgaG9tZSAodG90YWwgY291bnQpOyAicy88c3ViamVjdD4iIOKGkiBzdWJqZWN0IHJldmlldyBsaXN0OyBlbHNlIDQwNC4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQlyZXR1cm4gdWZtdC5TcHJpbnRmKCIjIE1lbWJhIFJldmlld3NcblxuT24tY2hhaW4gd2ViLW9mLXRydXN0LiAlZCByZXZpZXdzIHRvdGFsLlxuIiwgcmV2aWV3cy5TaXplKCkpCgl9CglpZiBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAicy8iKSB7CgkJc3ViamVjdCA6PSBzdHJpbmdzLlRyaW1QcmVmaXgocGF0aCwgInMvIikKCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKCIjIFJldmlld3MgZm9yICIgKyBzYW5pdGl6ZUZvclJlbmRlcihzdWJqZWN0KSArICJcblxuIikKCQl3cml0dGVuIDo9IGZhbHNlCgkJcmVuZGVyZWRDb3VudCA6PSAwCgkJZm9yIF8sIGlkIDo9IHJhbmdlIGlkTGlzdChzdWJqZWN0SW5kZXgsIHN1YmplY3QpIHsKCQkJaWYgcmVuZGVyZWRDb3VudCA+PSBNYXhQYWdlTGltaXQgewoJCQkJYnJlYWsKCQkJfQoJCQlyLCBvayA6PSBnZXRSZXZpZXcoaWQpCgkJCWlmICFvayB8fCByLkhpZGRlbiB8fCByLkRlbGV0ZWQgewoJCQkJY29udGludWUKCQkJfQoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiolZC81KiogYnkgJXNcblxuJXNcblxuLS0tXG4iLAoJCQkJci5SYXRpbmcsIHIuQXV0aG9yLlN0cmluZygpLCBzYW5pdGl6ZUZvclJlbmRlcihyLkJvZHkpKSkKCQkJd3JpdHRlbiA9IHRydWUKCQkJcmVuZGVyZWRDb3VudCsrCgkJfQoJCWlmICF3cml0dGVuIHsKCQkJYi5Xcml0ZVN0cmluZygiTm8gcmV2aWV3cyB5ZXQuXG4iKQoJCX0KCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJcmV0dXJuICIjIDQwNFxuIgp9ChrzCwoUbW9kZXJhdGlvbl9zdGF0ZS5nbm8S2gtwYWNrYWdlIG1lbWJhX3Jldmlld3NfdjIKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCikKCi8vIE1vZGVyYXRpb25TdGF0ZSBpcyBhIGJvdW5kZWQgY29waWVkIHNuYXBzaG90LCBpbmNsdWRpbmcgaGlkZGVuL2RlbGV0ZWQgaXRlbXMuCi8vIE5vIHBvaW50ZXIgb3IgYm9keSBpcyBleHBvc2VkLiBCb2R5SGFzaCBiaW5kcyBlZGl0cyBldmVuIHdpdGhpbiB0aGUgc2FtZSBibG9jay4KLy8gUmVhY3Rpb25zIGFuZCBjdW11bGF0aXZlIGZsYWcgY291bnRzIGFyZSBub3QgbW9kZXJhdGlvbiBhdXRob3JpemF0aW9uIGlucHV0cy4KdHlwZSBNb2RlcmF0aW9uU3RhdGUgc3RydWN0IHsKCUlEICAgICAgICB1aW50NjQKCVJldmlldyAgICBib29sCglQYXJlbnRJRCAgdWludDY0CglTdWJqZWN0ICAgc3RyaW5nCglBdXRob3IgICAgYWRkcmVzcwoJUmF0aW5nICAgIGludAoJQm9keUhhc2ggIHN0cmluZwoJQ3JlYXRlZEF0IGludDY0CglFZGl0ZWRBdCAgaW50NjQKCUhpZGRlbiAgICBib29sCglEZWxldGVkICAgYm9vbAoJRmxhZ2dlZCAgIGJvb2wKfQoKZnVuYyBtb2RlcmF0aW9uQm9keUhhc2goYm9keSBzdHJpbmcpIHN0cmluZyB7CglzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUoYm9keSkpCglyZXR1cm4gaGV4LkVuY29kZVRvU3RyaW5nKHN1bVs6XSkKfQoKLy8gR2V0TW9kZXJhdGlvblN0YXRlIHJldHVybnMgYSB6ZXJvIHZhbHVlIGZvciBhbiBhYnNlbnQgSUQuIFRoZSBmbGFnZ2VkLWluZGV4Ci8vIGJpdCBpcyBkaXN0aW5jdCBmcm9tIGhpc3RvcmljYWwgZmxhZ3M7IFVuaGlkZSByZW1vdmVzIG9ubHkgdGhlIGluZGV4IGVudHJ5LgpmdW5jIEdldE1vZGVyYXRpb25TdGF0ZShpZCB1aW50NjQpIE1vZGVyYXRpb25TdGF0ZSB7CglfLCBmbGFnZ2VkIDo9IGZsYWdnZWRJRHMuR2V0KHN0cklEKGlkKSkKCWlmIHIsIG9rIDo9IGdldFJldmlldyhpZCk7IG9rIHsKCQlyZXR1cm4gTW9kZXJhdGlvblN0YXRle0lEOiByLklELCBSZXZpZXc6IHRydWUsIFN1YmplY3Q6IHIuU3ViamVjdCwgQXV0aG9yOiByLkF1dGhvciwKCQkJUmF0aW5nOiByLlJhdGluZywgQm9keUhhc2g6IG1vZGVyYXRpb25Cb2R5SGFzaChyLkJvZHkpLCBDcmVhdGVkQXQ6IHIuQ3JlYXRlZEF0LAoJCQlFZGl0ZWRBdDogci5FZGl0ZWRBdCwgSGlkZGVuOiByLkhpZGRlbiwgRGVsZXRlZDogci5EZWxldGVkLCBGbGFnZ2VkOiBmbGFnZ2VkfQoJfQoJaWYgYywgb2sgOj0gZ2V0Q29tbWVudChpZCk7IG9rIHsKCQlyZXR1cm4gTW9kZXJhdGlvblN0YXRle0lEOiBjLklELCBQYXJlbnRJRDogYy5SZXZpZXdJRCwgQXV0aG9yOiBjLkF1dGhvciwKCQkJQm9keUhhc2g6IG1vZGVyYXRpb25Cb2R5SGFzaChjLkJvZHkpLCBDcmVhdGVkQXQ6IGMuQ3JlYXRlZEF0LCBFZGl0ZWRBdDogYy5FZGl0ZWRBdCwKCQkJSGlkZGVuOiBjLkhpZGRlbiwgRGVsZXRlZDogYy5EZWxldGVkLCBGbGFnZ2VkOiBmbGFnZ2VkfQoJfQoJcmV0dXJuIE1vZGVyYXRpb25TdGF0ZXt9Cn0KGv4CCg1wdWJsaXNoZXIuZ25vEuwCcGFja2FnZSBtZW1iYV9yZXZpZXdzX3YyCgppbXBvcnQgImNoYWluL3J1bnRpbWUvdW5zYWZlIgoKLy8gcHVibGlzaGVyQXRMb2FkIGNhcHR1cmVzIHRoZSBBZGRQYWNrYWdlIHNpZ25lciBkdXJpbmcgcGFja2FnZSBpbml0aWFsaXphdGlvbi4KLy8gS2VlcGluZyB0aGUgdW5zYWZlIGxvYWQtdGltZSBwcmltaXRpdmUgc2VwYXJhdGUgZnJvbSBjcm9zc2luZyBlbnRyeXBvaW50cyBsZXRzCi8vIHByaXZpbGVnZWQgY2FsbHMgdXNlIG9ubHkgdGhlIGZyYW1lLXZlcmlmaWVkIGN1ci5Jc0N1cnJlbnQvY3VyLlByZXZpb3VzIEFQSS4KZnVuYyBwdWJsaXNoZXJBdExvYWQoKSBhZGRyZXNzIHsgcmV0dXJuIHVuc2FmZS5PcmlnaW5DYWxsZXIoKSB9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTIwMDAwMDB1Z25vdBISCID24EISCzE0MDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQA4TF7FeSUvw8gMtIkxXfOCoGT/RsQfm2k1SAvZCZfPjCNgMeEbXoxRM34qlVa07PcvJK4ou30K/pCnZIbT9usYSQHn1ITMKZxbUXbg73scC3DNzb4f2OjAh+hUPmxgNk0TfINTGXvmm17lzOCvn1NaXkwcvRN78JtxklQmL7hlz5bkaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data