Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
D4085F156DEBD5AC1EDF53CB8AD6FE46DE961EFD5DA1193C6CF3771F65301D86
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
78,000,000
Requested gas limit
GAS USED
43,068,119
Gas consumed
FEE
78000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf13000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CqXkAQoML3ZtLm1fYWRkcGtnEpPkAQooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLW4wEKCW1lbWJhX2dvdhIcZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2dvdhreBAoNZHVyYXRpb25zLmdubxLMBHBhY2thZ2UgbWVtYmFfZ292CgppbXBvcnQgInRpbWUiCgovLyBUaGUgcG9saWN5J3MgZHVyYXRpb25zLCBpbiB0aGVpciBvd24gZmlsZSBzbyBhIG5vZGUgZml4dHVyZSwgd2hpY2ggY2Fubm90Ci8vIHdhaXQgZGF5cywgY2FuIHJlcGxhY2UgdGhpcyBmaWxlIGFsb25lIGFuZCBydW4gdGhlIHJlYWwgcnVsZXMgZmFzdGVyLgpjb25zdCAoCglWb3RpbmdQZXJpb2QgICAgPSA3ICogMjQgKiB0aW1lLkhvdXIKCUV4ZWN1dGlvbldpbmRvdyA9IDcgKiAyNCAqIHRpbWUuSG91cgoJV2VpZ2h0ZWREZWxheSAgID0gMjQgKiB0aW1lLkhvdXIgLy8gY3JpdGljYWwsIHdlaWdodCByb3V0ZQoJSGVhZGNvdW50RGVsYXkgID0gNzIgKiB0aW1lLkhvdXIgLy8gY3JpdGljYWwsIGhlYWRjb3VudCByb3V0ZQoJUm9zdGVyRGVsYXkgICAgID0gNyAqIDI0ICogdGltZS5Ib3VyCglJbmFjdGl2ZURlbGF5ICAgPSAxNCAqIDI0ICogdGltZS5Ib3VyCglJbmFjdGl2ZUFmdGVyICAgPSAxODAgKiAyNCAqIHRpbWUuSG91cgoJU2VlZEludml0ZVRUTCAgID0gOTAgKiAyNCAqIHRpbWUuSG91cgoJVm90ZWRJbnZpdGVUVEwgID0gMzAgKiAyNCAqIHRpbWUuSG91cgopChpDCgtnbm9tb2QudG9tbBI0bW9kdWxlID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9nb3YiCmdubyA9ICIwLjkiChrFfAoHZ292LmdubxK5fC8vIFBhY2thZ2UgbWVtYmFfZ292IGlzIHRoZSBNZW1iYSBEQU8gZ292ZXJuYW5jZSBjb3JlLiBJdCBob2xkcyB0aGUgcm9zdGVyLAovLyBwcm9wb3NhbHMgYW5kIHZvdGVzLCBhbmQgZ3JhbnRzIG5vdGhpbmcgYnkgaXRzZWxmOiBhIGdvdmVybmVkIHJlYWxtIGFza3MKLy8gZm9yIGFuIGFwcHJvdmFsIGJ5IGNyb3NzaW5nLWNhbGxpbmcgQ29uc3VtZSBiZWZvcmUgYSBwcml2aWxlZ2VkIHN0ZXAsIGFuZAovLyB0aGUgY29yZSBjaGVja3MgdGhhdCB0aGUgY2FsbGVyIGlzIGV4YWN0bHkgdGhlIHJlYWxtIHRoZSBwcm9wb3NhbCBuYW1lcywKLy8gd2l0aCBleGFjdGx5IHRoZSBhcmd1bWVudHMgbWVtYmVycyB2b3RlZCBvbi4gVGhlIGNvcmUgbmV2ZXIgY2FsbHMgYW5vdGhlcgovLyByZWFsbS4KLy8KLy8gUnVsZXMgKGRlc2lnbiBub3RlIEdPVi0xLCBhcHByb3ZlZCAyMDI2LTEwLTA2KToKLy8gICAtIG1lbWJlcnMgcHJvcG9zZSwgdm90ZSBhbmQgZXhlY3V0ZSBieSBkaXJlY3QgY2FsbHMgZnJvbSB0aGVpciBvd24KLy8gICAgIGFjY291bnQsIGFuZCBhbiBpbnZpdGVkIGtleSBqb2lucyBieSBpdHMgb3duIGRpcmVjdCBjYWxsOyBvbmx5IGEKLy8gICAgIGdvdmVybmVkIHJlYWxtJ3MgY3Jvc3NpbmcgY2FsbCByZWFjaGVzIENvbnN1bWU7Ci8vICAgLSBhIGtleSBjb3VudHMgdG93YXJkIHRoZSByb3N0ZXIgb25seSBhZnRlciBpdCBzaWduZWQgSm9pbiBpdHNlbGY7Ci8vICAgLSBvbmUgYWN0aW9uIHBlciBwcm9wb3NhbCwgc3RvcmVkIGJ5IHZhbHVlOyBhcHByb3ZhbHMgYXJlIHVzZWQgb25jZTsKLy8gICAtIGV2ZXJ5IGV4ZWN1dGVkIHJvc3RlciBhY3Rpb24gYW5kIGV2ZXJ5IEpvaW4gaW52YWxpZGF0ZXMgZXZlcnkgb3BlbgovLyAgICAgcHJvcG9zYWwsIHNvIHZvdGVzIGFsd2F5cyBjb3VudCBhZ2FpbnN0IGFuIHVuY2hhbmdlZCByb3N0ZXI7Ci8vICAgLSBDb25zdW1lIGludmFsaWRhdGVzIHRoZSBvdGhlciBvcGVuIHByb3Bvc2FscyBvZiBpdHMgKHRhcmdldCwgc2NvcGUpLgpwYWNrYWdlIG1lbWJhX2dvdgoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2F2bCIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvZGFvYXV0aCIKKQoKY29uc3QgKAoJY29yZVBhdGggID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9nb3YiCglNYXhTZWF0cyAgPSAyNQoJTWluU2VhdHMgID0gMgoJTWF4U2NvcGUgID0gMTYwCglNYXhOb3RlICAgPSAyODAKCU1heEFjdGlvbiA9IDY0CgoJYWN0QWRkTWVtYmVyICAgICAgPSAiQWRkTWVtYmVyIgoJYWN0UmVtb3ZlTWVtYmVyICAgPSAiUmVtb3ZlTWVtYmVyIgoJYWN0U2V0V2VpZ2h0ICAgICAgPSAiU2V0V2VpZ2h0IgoJYWN0UmVjb3ZlciAgICAgICAgPSAiUmVjb3ZlciIKCWFjdFJlbW92ZUluYWN0aXZlID0gIlJlbW92ZUluYWN0aXZlIgoJYWN0VW5pbnZpdGUgICAgICAgPSAiVW5pbnZpdGUiCgoJdm90ZVllcyAgICAgPSAieWVzIgoJdm90ZU5vICAgICAgPSAibm8iCgl2b3RlQWJzdGFpbiA9ICJhYnN0YWluIgopCgp0eXBlIHBlcnNvbiBzdHJ1Y3QgewoJaWQgICAgICAgICBzdHJpbmcKCWFkZHIgICAgICAgYWRkcmVzcwoJd2VpZ2h0ICAgICBpbnQKCWxhc3RBY3RpdmUgaW50NjQgIC8vIHVuaXggc2Vjb25kcyBvZiB0aGUgbGFzdCBQcm9wb3NlLCBWb3RlLCBFeGVjdXRlIG9yIEpvaW4KCXJvc3RlclBpZCAgdWludDY0IC8vIHRoaXMgcGVyc29uJ3Mgb3BlbiByb3N0ZXIgcHJvcG9zYWwsIGlmIGFueQp9CgovLyBpbnZpdGUgc2VhdHMgYWRkciBhcyBpZCAoYSBuZXcgcGVyc29uKSBvciwgZm9yIGEgcmVjb3ZlcnksIGdpdmVzIHRoZQovLyBleGlzdGluZyBwZXJzb24gaWQgdGhlIG5ldyBrZXkgYWRkciwgb25jZSBhZGRyIGl0c2VsZiBjYWxscyBKb2luLgp0eXBlIGludml0ZSBzdHJ1Y3QgewoJaWQgICAgICBzdHJpbmcKCWFkZHIgICAgYWRkcmVzcwoJd2VpZ2h0ICBpbnQKCWV4cGlyZXMgaW50NjQgLy8gdW5peCBzZWNvbmRzCn0KCnR5cGUgYmFsbG90IHN0cnVjdCB7CglwZXJzb24gc3RyaW5nCgl2b3RlICAgc3RyaW5nCglzaW5jZSAgaW50NjQgLy8gdW5peCBzdGFydCBvZiB0aGUgY3VycmVudCB1bmludGVycnVwdGVkIFlFUyBzdHJlYWsKfQoKdHlwZSBwcm9wb3NhbCBzdHJ1Y3QgewoJaWQgICAgICAgICAgICAgICAgICAgIHVpbnQ2NAoJdGFyZ2V0LCBhY3Rpb24sIGFyZ3MgIHN0cmluZwoJc2NvcGUsIG5vdGUsIHByb3Bvc2VyIHN0cmluZwoJc3ViamVjdCAgICAgICAgICAgICAgIHN0cmluZyAvLyB0aGUgcGVyc29uIGEgcm9zdGVyIGFjdGlvbiBuYW1lcwoJY2xhc3MgICAgICAgICAgICAgICAgIGludAoJc2NvcGVHZW4sIGdsb2JhbEdlbiAgIHVpbnQ2NAoJY3JlYXRlZCAgICAgICAgICAgICAgIGludDY0IC8vIHVuaXggc2Vjb25kcwoJYmFsbG90cyAgICAgICAgICAgICAgIFtdYmFsbG90Cgljb25zdW1lZCAgICAgICAgICAgICAgYm9vbAp9Cgp2YXIgKAoJc2VhdGVkICAgIFtdKnBlcnNvbgoJaW52aXRlcyAgIFtdKmludml0ZQoJcHJvcG9zYWxzID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRkZWQgaWQgLT4gKnByb3Bvc2FsCglzY29wZXMgICAgPSBhdmwuTmV3VHJlZSgpIC8vIHRhcmdldCArICJcbiIgKyBzY29wZSAtPiB1aW50NjQgZ2VuZXJhdGlvbgoJbGFzdElEICAgIHVpbnQ2NAoJZ2xvYmFsR2VuIHVpbnQ2NAopCgpmdW5jIGluaXQoKSB7IHNlZWRSb3N0ZXIoKSB9CgpmdW5jIHNlZWRSb3N0ZXIoKSB7Cgl0IDo9IG5vdygpCglmb3IgXywgcyA6PSByYW5nZSBzZWVkU2VhdGVkIHsKCQlzZWF0ZWQgPSBhcHBlbmQoc2VhdGVkLCAmcGVyc29ue2lkOiBzLmlkLCBhZGRyOiBzLmFkZHIsIHdlaWdodDogcy53ZWlnaHQsIGxhc3RBY3RpdmU6IHR9KQoJfQoJZm9yIF8sIHMgOj0gcmFuZ2Ugc2VlZEludml0ZWQgewoJCWludml0ZXMgPSBhcHBlbmQoaW52aXRlcywgJmludml0ZXtpZDogcy5pZCwgYWRkcjogcy5hZGRyLCB3ZWlnaHQ6IHMud2VpZ2h0LCBleHBpcmVzOiB0ICsgc2VjcyhTZWVkSW52aXRlVFRMKX0pCgl9CgljaGVja1Jvc3RlcigpCn0KCi8vIG5vdyBpcyB0aGUgYmxvY2sgdGltZSBpbiB1bml4IHNlY29uZHM7IGV2ZXJ5IHN0b3JlZCB0aW1lIHVzZXMgaXQuCmZ1bmMgbm93KCkgaW50NjQgeyByZXR1cm4gdGltZS5Ob3coKS5Vbml4KCkgfQoKZnVuYyBzZWNzKGQgdGltZS5EdXJhdGlvbikgaW50NjQgeyByZXR1cm4gaW50NjQoZCAvIHRpbWUuU2Vjb25kKSB9CgovLyDilIDilIAgV3JpdGVzIChkaXJlY3QgY2FsbHMgZnJvbSBhIG1lbWJlcidzIGFjY291bnQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gUHJvcG9zZSBmaWxlcyBvbmUgYWN0aW9uLiB0YXJnZXQgaXMgdGhlIHJlYWxtIHRoYXQgd2lsbCBjb25zdW1lIGl0LCBvcgovLyB0aGlzIHJlYWxtIGZvciBhIHJvc3RlciBhY3Rpb247IHNjb3BlIGlzIHRoZSBpbnZhbGlkYXRpb24ga2V5IHRoYXQgcmVhbG0KLy8gY29tcHV0ZXMgZm9yIHRoZSBhY3Rpb247IGNsYXNzIGlzIGF0IGxlYXN0IHRoZSBjbGFzcyBpdCByZXF1aXJlcy4KZnVuYyBQcm9wb3NlKGN1ciByZWFsbSwgdGFyZ2V0LCBhY3Rpb24sIGFyZ3MsIHNjb3BlIHN0cmluZywgY2xhc3MgaW50LCBub3RlIHN0cmluZykgdWludDY0IHsKCW0gOj0gbWVtYmVyKGN1cikKCWlmICF2YWxpZFRhcmdldCh0YXJnZXQpIHx8ICF2YWxpZEFjdGlvbihhY3Rpb24pIHx8IGxlbihzY29wZSkgPiBNYXhTY29wZSB8fCBsZW4obm90ZSkgPiBNYXhOb3RlIHx8CgkJIWRhb2F1dGguVmFsaWRUZXh0KHNjb3BlKSB8fCAhZGFvYXV0aC5WYWxpZFRleHQobm90ZSkgewoJCXBhbmljKCJtZW1iYV9nb3Y6IGludmFsaWQgdGFyZ2V0LCBhY3Rpb24sIHNjb3BlIG9yIG5vdGUiKQoJfQoJZmllbGRzLCBlcnIgOj0gZGFvYXV0aC5QYXJzZShhcmdzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CglpZiB0YXJnZXQgPT0gY29yZVBhdGggewoJCWlmIHNjb3BlICE9ICIiIHx8IGNsYXNzICE9IHJvc3RlckNsYXNzKGFjdGlvbikgewoJCQlwYW5pYygibWVtYmFfZ292OiBhIHJvc3RlciBhY3Rpb24gaGFzIG5vIHNjb3BlIGFuZCBhIGZpeGVkIGNsYXNzIikKCQl9CgkJY2hlY2tSb3N0ZXJBY3Rpb24oYWN0aW9uLCBmaWVsZHMpCgkJaWYgbS5yb3N0ZXJQaWQgIT0gMCAmJiBpc09wZW4obS5yb3N0ZXJQaWQpIHsKCQkJcGFuaWMoIm1lbWJhX2dvdjogeW91IGFscmVhZHkgaGF2ZSBhbiBvcGVuIHJvc3RlciBwcm9wb3NhbCIpCgkJfQoJfSBlbHNlIGlmIGNsYXNzIDwgUm91dGluZSB8fCBjbGFzcyA+IENyaXRpY2FsIHsKCQlwYW5pYygibWVtYmFfZ292OiB1bmtub3duIGNsYXNzIikKCX0KCWxhc3RJRCsrCglwIDo9ICZwcm9wb3NhbHtpZDogbGFzdElELCB0YXJnZXQ6IHRhcmdldCwgYWN0aW9uOiBhY3Rpb24sIGFyZ3M6IGFyZ3MsIHNjb3BlOiBzY29wZSwgbm90ZTogbm90ZSwKCQlwcm9wb3NlcjogbS5pZCwgY2xhc3M6IGNsYXNzLCBzY29wZUdlbjogc2NvcGVHZW4odGFyZ2V0LCBzY29wZSksIGdsb2JhbEdlbjogZ2xvYmFsR2VuLCBjcmVhdGVkOiBub3coKX0KCXByb3Bvc2Fscy5TZXQoa2V5KHAuaWQpLCBwKQoJaWYgdGFyZ2V0ID09IGNvcmVQYXRoIHsKCQlwLnN1YmplY3QgPSBmaWVsZHNbMF0uVmFsdWUKCQltLnJvc3RlclBpZCA9IHAuaWQKCX0KCW0ubGFzdEFjdGl2ZSA9IHAuY3JlYXRlZAoJcmV0dXJuIHAuaWQKfQoKLy8gVm90ZSByZWNvcmRzIHllcywgbm8gb3IgYWJzdGFpbiB1bnRpbCB0aGUgdm90aW5nIGRlYWRsaW5lLiBBZnRlciBpdCwgYQovLyBZRVMgY2FuIHN0aWxsIGJlIHdpdGhkcmF3biB3aGlsZSB0aGUgcHJvcG9zYWwgaXMgbm90IGV4ZWN1dGVkIG9yIGV4cGlyZWQsCi8vIHNvIG1lbWJlcnMgY2FuIHN0b3AgYW4gYXBwcm92YWwgdGhleSBubyBsb25nZXIgYmFjay4KZnVuYyBWb3RlKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCwgY2hvaWNlIHN0cmluZykgewoJbSA6PSBtZW1iZXIoY3VyKQoJaWYgY2hvaWNlICE9IHZvdGVZZXMgJiYgY2hvaWNlICE9IHZvdGVObyAmJiBjaG9pY2UgIT0gdm90ZUFic3RhaW4gewoJCXBhbmljKCJtZW1iYV9nb3Y6IHZvdGUgeWVzLCBubyBvciBhYnN0YWluIikKCX0KCXAgOj0gbXVzdEdldChwaWQpCgl0IDo9IG5vdygpCgltaW5lIDo9IC0xCglmb3IgaSwgYiA6PSByYW5nZSBwLmJhbGxvdHMgewoJCWlmIGIucGVyc29uID09IG0uaWQgewoJCQltaW5lID0gaQoJCX0KCX0KCXN0LCBfIDo9IHN0YXRlKHApCglvcGVuIDo9IHN0ID09IHN0Vm90aW5nIHx8IHN0ID09IHN0VGltZWxvY2tlZCB8fCBzdCA9PSBzdFJlYWR5Cgl3aXRoZHJhd2luZyA6PSBtaW5lID49IDAgJiYgcC5iYWxsb3RzW21pbmVdLnZvdGUgPT0gdm90ZVllcyAmJiBjaG9pY2UgIT0gdm90ZVllcwoJaWYgIW9wZW4gfHwgKHQgPj0gcC5jcmVhdGVkK3NlY3MoVm90aW5nUGVyaW9kKSAmJiAhd2l0aGRyYXdpbmcpIHsKCQlwYW5pYygibWVtYmFfZ292OiB2b3RpbmcgaXMgY2xvc2VkIikKCX0KCW0ubGFzdEFjdGl2ZSA9IHQKCXN3aXRjaCB7CgljYXNlIG1pbmUgPCAwOgoJCXAuYmFsbG90cyA9IGFwcGVuZChwLmJhbGxvdHMsIGJhbGxvdHtwZXJzb246IG0uaWQsIHZvdGU6IGNob2ljZSwgc2luY2U6IHR9KQoJY2FzZSBwLmJhbGxvdHNbbWluZV0udm90ZSAhPSBjaG9pY2U6CgkJcC5iYWxsb3RzW21pbmVdID0gYmFsbG90e3BlcnNvbjogbS5pZCwgdm90ZTogY2hvaWNlLCBzaW5jZTogdH0KCX0KfQoKLy8gSm9pbiBzZWF0cyB0aGUgY2FsbGVyJ3MgaW52aXRhdGlvbjogYSBuZXcgcGVyc29uLCBvciBhIHJlY292ZXJlZCBrZXkuCmZ1bmMgSm9pbihjdXIgcmVhbG0pIHsKCWFkZHIgOj0gdXNlcihjdXIpCgl0IDo9IG5vdygpCglmb3IgaSwgaW52IDo9IHJhbmdlIGludml0ZXMgewoJCWlmIGludi5hZGRyICE9IGFkZHIgfHwgdCA+IGludi5leHBpcmVzIHsKCQkJY29udGludWUKCQl9CgkJaW52aXRlcyA9IGFwcGVuZChpbnZpdGVzWzppOmldLCBpbnZpdGVzW2krMTpdLi4uKQoJCWlmIHAgOj0gcGVyc29uQnlJRChpbnYuaWQpOyBwICE9IG5pbCB7CgkJCXAuYWRkciA9IGFkZHIKCQkJcC5sYXN0QWN0aXZlID0gdAoJCX0gZWxzZSB7CgkJCWlmIGxlbihzZWF0ZWQpID49IE1heFNlYXRzIHsKCQkJCXBhbmljKCJtZW1iYV9nb3Y6IHRoZSByb3N0ZXIgaXMgZnVsbCAoIiArIHN0cmNvbnYuSXRvYShNYXhTZWF0cykgKyAiIHNlYXRzKSIpCgkJCX0KCQkJc2VhdGVkID0gYXBwZW5kKHNlYXRlZCwgJnBlcnNvbntpZDogaW52LmlkLCBhZGRyOiBhZGRyLCB3ZWlnaHQ6IGludi53ZWlnaHQsIGxhc3RBY3RpdmU6IHR9KQoJCX0KCQlnbG9iYWxHZW4rKwoJCWNoZWNrUm9zdGVyKCkKCQlyZXR1cm4KCX0KCXBhbmljKCJtZW1iYV9nb3Y6IG5vIG9wZW4gaW52aXRhdGlvbiBmb3IgIiArIHN0cmluZyhhZGRyKSkKfQoKLy8gRXhlY3V0ZSBydW5zIGEgcmVhZHkgcm9zdGVyIGFjdGlvbiBvZiB0aGlzIHJlYWxtLiBUaGUgcm9zdGVyIGl0IHdhcwovLyBjaGVja2VkIGFnYWluc3QgYXQgUHJvcG9zZSBpcyB1bmNoYW5nZWQ6IGFueSBjaGFuZ2Ugd291bGQgaGF2ZQovLyBpbnZhbGlkYXRlZCBpdC4KZnVuYyBFeGVjdXRlKGN1ciByZWFsbSwgcGlkIHVpbnQ2NCkgewoJbSA6PSBtZW1iZXIoY3VyKQoJcCA6PSBtdXN0R2V0KHBpZCkKCWlmIHAudGFyZ2V0ICE9IGNvcmVQYXRoIHsKCQlwYW5pYygibWVtYmFfZ292OiBvbmx5IHJvc3RlciBhY3Rpb25zIHJ1biBoZXJlOyB0aGUgdGFyZ2V0IHJlYWxtIGNvbnN1bWVzIHRoZSBvdGhlcnMiKQoJfQoJaWYgc3QsIF8gOj0gc3RhdGUocCk7IHN0ICE9IHN0UmVhZHkgewoJCXBhbmljKCJtZW1iYV9nb3Y6IHByb3Bvc2FsIGlzICIgKyBzdCkKCX0KCWZpZWxkcywgXyA6PSBkYW9hdXRoLlBhcnNlKHAuYXJncykKCWlkIDo9IHAuc3ViamVjdAoJc3dpdGNoIHAuYWN0aW9uIHsKCWNhc2UgYWN0QWRkTWVtYmVyOgoJCWFkZEludml0ZShpZCwgYWRkcmVzcyhmaWVsZHNbMV0uVmFsdWUpLCB3ZWlnaHRGaWVsZChmaWVsZHNbMl0pLCBWb3RlZEludml0ZVRUTCkKCWNhc2UgYWN0UmVjb3ZlcjoKCQlhZGRJbnZpdGUoaWQsIGFkZHJlc3MoZmllbGRzWzFdLlZhbHVlKSwgMCwgVm90ZWRJbnZpdGVUVEwpCgljYXNlIGFjdFNldFdlaWdodDoKCQlwZXJzb25CeUlEKGlkKS53ZWlnaHQgPSB3ZWlnaHRGaWVsZChmaWVsZHNbMV0pCgljYXNlIGFjdFJlbW92ZU1lbWJlciwgYWN0UmVtb3ZlSW5hY3RpdmUsIGFjdFVuaW52aXRlOgoJCXJlbW92ZVBlcnNvbihpZCkKCX0KCXAuY29uc3VtZWQgPSB0cnVlCgltLmxhc3RBY3RpdmUgPSBub3coKQoJZ2xvYmFsR2VuKysKCWNoZWNrUm9zdGVyKCkKfQoKLy8g4pSA4pSAIFRoZSBvbmx5IGNyb3NzLXJlYWxtIGVudHJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gQ29uc3VtZSBpcyBjcm9zc2luZy1jYWxsZWQgYnkgYSBnb3Zlcm5lZCByZWFsbSByaWdodCBiZWZvcmUgdGhlIHN0ZXAgYQovLyBwcm9wb3NhbCBhcHByb3ZlZC4gSXQgcGFuaWNzIHVubGVzcyB0aGUgY2FsbGVyIGlzIGV4YWN0bHkgdGhlIHByb3Bvc2FsJ3MKLy8gdGFyZ2V0LCB0aGUgYWN0aW9uLCBhcmd1bWVudHMgYW5kIHNjb3BlIGFyZSB0aGUgdm90ZWQgb25lcyBieXRlIGZvciBieXRlLAovLyB0aGUgY2xhc3MgaXMgYXQgbGVhc3QgbWluQ2xhc3MsIHRoZSBwcm9wb3NhbCBpcyByZWFkeSwgYW5kIGV4ZWN1dG9yLCB0aGUKLy8gYWNjb3VudCB0aGF0IGNhbGxlZCB0aGUgdGFyZ2V0IGRpcmVjdGx5LCBpcyBhIHNlYXRlZCBtZW1iZXIuIEl0IG1hcmtzIHRoZQovLyBwcm9wb3NhbCB1c2VkIGFuZCBpbnZhbGlkYXRlcyB0aGUgb3RoZXIgb3BlbiBwcm9wb3NhbHMgb2YgKHRhcmdldCwgc2NvcGUpLgpmdW5jIENvbnN1bWUoY3VyIHJlYWxtLCBwaWQgdWludDY0LCBhY3Rpb24sIGFyZ3MsIHNjb3BlIHN0cmluZywgbWluQ2xhc3MgaW50LCBleGVjdXRvciBhZGRyZXNzKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygibWVtYmFfZ292OiBzdGFsZSByZWFsbSIpCgl9CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuUGtnUGF0aCgpCglwIDo9IG11c3RHZXQocGlkKQoJLy8gQSByb3N0ZXIgYWN0aW9uIHJ1bnMgb25seSB0aHJvdWdoIEV4ZWN1dGUuCglpZiBjYWxsZXIgIT0gcC50YXJnZXQgfHwgcC50YXJnZXQgPT0gY29yZVBhdGggewoJCXBhbmljKCJtZW1iYV9nb3Y6IHByb3Bvc2FsICIgKyBzdHJjb252LkZvcm1hdFVpbnQocGlkLCAxMCkgKyAiIGlzIG5vdCBmb3IgIiArIGNhbGxlcikKCX0KCWlmIGFjdGlvbiAhPSBwLmFjdGlvbiB8fCBhcmdzICE9IHAuYXJncyB8fCBzY29wZSAhPSBwLnNjb3BlIHsKCQlwYW5pYygibWVtYmFfZ292OiBhY3Rpb24sIGFyZ3VtZW50cyBvciBzY29wZSBkaWZmZXIgZnJvbSB0aGUgdm90ZSIpCgl9CglpZiBwLmNsYXNzIDwgbWluQ2xhc3MgewoJCXBhbmljKCJtZW1iYV9nb3Y6IGNsYXNzIGJlbG93IHdoYXQgdGhlIHRhcmdldCByZXF1aXJlcyIpCgl9CglpZiBzdCwgXyA6PSBzdGF0ZShwKTsgc3QgIT0gc3RSZWFkeSB7CgkJcGFuaWMoIm1lbWJhX2dvdjogcHJvcG9zYWwgaXMgIiArIHN0KQoJfQoJLy8gQmVpbmcgbmFtZWQgZXhlY3V0b3IgaXMgbm90IGFjdGl2aXR5OiB0aGUgdGFyZ2V0LCBub3QgdGhlIG1lbWJlciwKCS8vIHN1cHBsaWVzIHRoYXQgYWRkcmVzcy4KCWlmIHBlcnNvbkJ5QWRkcihleGVjdXRvcikgPT0gbmlsIHsKCQlwYW5pYygibWVtYmFfZ292OiBleGVjdXRvciBpcyBub3QgYSBzZWF0ZWQgbWVtYmVyIikKCX0KCXAuY29uc3VtZWQgPSB0cnVlCglzY29wZXMuU2V0KHAudGFyZ2V0KyJcbiIrcC5zY29wZSwgc2NvcGVHZW4ocC50YXJnZXQsIHAuc2NvcGUpKzEpCn0KCi8vIElzTWVtYmVyIHJlcG9ydHMgd2hldGhlciBhZGRyIGlzIGEgc2VhdGVkIG1lbWJlcidzIGN1cnJlbnQga2V5LgpmdW5jIElzTWVtYmVyKGFkZHIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBwZXJzb25CeUFkZHIoYWRkcikgIT0gbmlsIH0KCi8vIFBlcnNvbk9mIHJldHVybnMgdGhlIGlkIG9mIHRoZSBzZWF0ZWQgbWVtYmVyIHdob3NlIGN1cnJlbnQga2V5IGlzIGFkZHIsCi8vIG9yICIiLiBUaGUgaWQgc3Vydml2ZXMgYSBrZXkgcmVjb3ZlcnkuCmZ1bmMgUGVyc29uT2YoYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJaWYgcCA6PSBwZXJzb25CeUFkZHIoYWRkcik7IHAgIT0gbmlsIHsKCQlyZXR1cm4gcC5pZAoJfQoJcmV0dXJuICIiCn0KCi8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKLy8gdXNlciByZXR1cm5zIHRoZSBhY2NvdW50IHRoYXQgY2FsbGVkIHRoaXMgcmVhbG0gZGlyZWN0bHkuCmZ1bmMgdXNlcihjdXIgcmVhbG0pIGFkZHJlc3MgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoIm1lbWJhX2dvdjogc3RhbGUgcmVhbG0iKQoJfQoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJaWYgIXByZXYuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygibWVtYmFfZ292OiBjYWxsIGRpcmVjdGx5IGZyb20geW91ciBhY2NvdW50IikKCX0KCXJldHVybiBwcmV2LkFkZHJlc3MoKQp9CgpmdW5jIG1lbWJlcihjdXIgcmVhbG0pICpwZXJzb24gewoJYWRkciA6PSB1c2VyKGN1cikKCW0gOj0gcGVyc29uQnlBZGRyKGFkZHIpCglpZiBtID09IG5pbCB7CgkJcGFuaWMoIm1lbWJhX2dvdjogbm90IGEgc2VhdGVkIG1lbWJlcjogIiArIHN0cmluZyhhZGRyKSkKCX0KCXJldHVybiBtCn0KCi8vIHJvc3RlckNsYXNzIGFuZCByb3N0ZXJEZWxheSBmaXggaG93IGVhY2ggcm9zdGVyIGFjdGlvbiBwYXNzZXMuCmZ1bmMgcm9zdGVyQ2xhc3MoYWN0aW9uIHN0cmluZykgaW50IHsKCXN3aXRjaCBhY3Rpb24gewoJY2FzZSBhY3RSZW1vdmVJbmFjdGl2ZToKCQlyZXR1cm4gUm91dGluZQoJY2FzZSBhY3RVbmludml0ZTogLy8gZmFzdCBmb3IgYSBsZWFrZWQgaW52aXRlZSBrZXksIG5ldmVyIGEgdHdvLXBlcnNvbiBsZXZlcgoJCXJldHVybiBGaW5hbmNpYWwKCX0KCXJldHVybiBDcml0aWNhbAp9CgpmdW5jIHJvc3RlckRlbGF5KGFjdGlvbiBzdHJpbmcpIHRpbWUuRHVyYXRpb24gewoJc3dpdGNoIGFjdGlvbiB7CgljYXNlIGFjdFVuaW52aXRlOgoJCXJldHVybiAwCgljYXNlIGFjdFJlbW92ZUluYWN0aXZlOgoJCXJldHVybiBJbmFjdGl2ZURlbGF5Cgl9CglyZXR1cm4gUm9zdGVyRGVsYXkKfQoKLy8gY2hlY2tSb3N0ZXJBY3Rpb24gdmFsaWRhdGVzIGEgcm9zdGVyIGFjdGlvbidzIGZpZWxkcyBhZ2FpbnN0IHRoZSByb3N0ZXIuCmZ1bmMgY2hlY2tSb3N0ZXJBY3Rpb24oYWN0aW9uIHN0cmluZywgZiBbXWRhb2F1dGguRmllbGQpIHsKCXNoYXBlIDo9IG1hcFtzdHJpbmddc3RyaW5ne2FjdEFkZE1lbWJlcjogInNhdSIsIGFjdFJlbW92ZU1lbWJlcjogInMiLCBhY3RTZXRXZWlnaHQ6ICJzdSIsCgkJYWN0UmVjb3ZlcjogInNhIiwgYWN0UmVtb3ZlSW5hY3RpdmU6ICJzIiwgYWN0VW5pbnZpdGU6ICJzIn1bYWN0aW9uXQoJaWYgc2hhcGUgPT0gIiIgfHwgbGVuKGYpICE9IGxlbihzaGFwZSkgewoJCXBhbmljKCJtZW1iYV9nb3Y6IHVua25vd24gcm9zdGVyIGFjdGlvbiBvciB3cm9uZyBhcmd1bWVudHMiKQoJfQoJZm9yIGkgOj0gcmFuZ2UgZiB7CgkJaWYgZltpXS5UYWcgIT0gc2hhcGVbaV0gewoJCQlwYW5pYygibWVtYmFfZ292OiB3cm9uZyByb3N0ZXIgYXJndW1lbnRzIikKCQl9Cgl9CglpZCA6PSBmWzBdLlZhbHVlCglwIDo9IHBlcnNvbkJ5SUQoaWQpCglzd2l0Y2ggYWN0aW9uIHsKCWNhc2UgYWN0QWRkTWVtYmVyLCBhY3RVbmludml0ZToKCQlpZiBwICE9IG5pbCB8fCAhdmFsaWRJRChpZCkgewoJCQlwYW5pYygibWVtYmFfZ292OiBwZXJzb24gaWQgdGFrZW4gb3IgaW52YWxpZCIpCgkJfQoJZGVmYXVsdDoKCQlpZiBwID09IG5pbCB7CgkJCXBhbmljKCJtZW1iYV9nb3Y6IG5vIHNlYXRlZCBwZXJzb24gIiArIGlkKQoJCX0KCX0KCXN3aXRjaCBhY3Rpb24gewoJY2FzZSBhY3RBZGRNZW1iZXIsIGFjdFJlY292ZXI6CgkJaWYgYWRkclRha2VuKGFkZHJlc3MoZlsxXS5WYWx1ZSksIGlkKSB7CgkJCXBhbmljKCJtZW1iYV9nb3Y6IGFkZHJlc3MgYWxyZWFkeSBzZWF0ZWQgb3IgaW52aXRlZCIpCgkJfQoJY2FzZSBhY3RVbmludml0ZToKCQlpZiAhaW52aXRlZChpZCkgewoJCQlwYW5pYygibWVtYmFfZ292OiBubyBvcGVuIGludml0YXRpb24gZm9yICIgKyBpZCkKCQl9CgljYXNlIGFjdFJlbW92ZU1lbWJlciwgYWN0UmVtb3ZlSW5hY3RpdmU6CgkJaWYgbGVuKHNlYXRlZCkgPD0gTWluU2VhdHMgewoJCQlwYW5pYygibWVtYmFfZ292OiB0aGUgcm9zdGVyIGNhbm5vdCBzaHJpbmsgYmVsb3cgIiArIHN0cmNvbnYuSXRvYShNaW5TZWF0cykpCgkJfQoJfQoJaWYgYWN0aW9uID09IGFjdEFkZE1lbWJlciB7CgkJd2VpZ2h0RmllbGQoZlsyXSkKCX0KCWlmIGFjdGlvbiA9PSBhY3RTZXRXZWlnaHQgJiYgd2VpZ2h0RmllbGQoZlsxXSkgPT0gcC53ZWlnaHQgewoJCXBhbmljKCJtZW1iYV9nb3Y6IHdlaWdodCB1bmNoYW5nZWQiKQoJfQoJaWYgYWN0aW9uID09IGFjdFJlbW92ZUluYWN0aXZlICYmIG5vdygpIDw9IHAubGFzdEFjdGl2ZStzZWNzKEluYWN0aXZlQWZ0ZXIpIHsKCQlwYW5pYygibWVtYmFfZ292OiBhY3RpdmUgd2l0aGluICIgKyBzdHJjb252Lkl0b2EoaW50KHNlY3MoSW5hY3RpdmVBZnRlcikvODY0MDApKSArICIgZGF5cyIpCgl9Cn0KCmZ1bmMgd2VpZ2h0RmllbGQoZiBkYW9hdXRoLkZpZWxkKSBpbnQgewoJaWYgZi5WYWx1ZSAhPSAiMSIgJiYgZi5WYWx1ZSAhPSAiMiIgewoJCXBhbmljKCJtZW1iYV9nb3Y6IHdlaWdodCBpcyAxIG9yIDIiKQoJfQoJcmV0dXJuIGludChmLlZhbHVlWzBdIC0gJzAnKQp9CgpmdW5jIGFkZEludml0ZShpZCBzdHJpbmcsIGFkZHIgYWRkcmVzcywgd2VpZ2h0IGludCwgdHRsIHRpbWUuRHVyYXRpb24pIHsKCWRyb3BJbnZpdGUoaWQpCglpbnZpdGVzID0gYXBwZW5kKGludml0ZXMsICZpbnZpdGV7aWQ6IGlkLCBhZGRyOiBhZGRyLCB3ZWlnaHQ6IHdlaWdodCwgZXhwaXJlczogbm93KCkgKyBzZWNzKHR0bCl9KQp9CgpmdW5jIGRyb3BJbnZpdGUoaWQgc3RyaW5nKSB7CglrZXB0IDo9IGludml0ZXNbOjA6MF0KCWZvciBfLCBpbnYgOj0gcmFuZ2UgaW52aXRlcyB7CgkJaWYgaW52LmlkICE9IGlkIHsKCQkJa2VwdCA9IGFwcGVuZChrZXB0LCBpbnYpCgkJfQoJfQoJaW52aXRlcyA9IGtlcHQKfQoKZnVuYyByZW1vdmVQZXJzb24oaWQgc3RyaW5nKSB7CglrZXB0IDo9IHNlYXRlZFs6MDowXQoJZm9yIF8sIHAgOj0gcmFuZ2Ugc2VhdGVkIHsKCQlpZiBwLmlkICE9IGlkIHsKCQkJa2VwdCA9IGFwcGVuZChrZXB0LCBwKQoJCX0KCX0KCXNlYXRlZCA9IGtlcHQKCWRyb3BJbnZpdGUoaWQpCn0KCi8vIGNoZWNrUm9zdGVyIGVuZm9yY2VzIHRoZSBib3VuZHMsIHZhbGlkIGlkcywgYWRkcmVzc2VzIGFuZCB3ZWlnaHRzLCBhbmQgdGhlCi8vIHVuaXF1ZW5lc3Mgb2YgaWRzIGFuZCBvZiBhZGRyZXNzZXMgYWNyb3NzIHNlYXRzIGFuZCBvcGVuIGludml0YXRpb25zLiBBbgovLyBpbnZpdGF0aW9uIG1heSBuYW1lIGEgc2VhdGVkIGlkOiB0aGF0IGlzIGEgcmVjb3ZlcnksIHdpdGggbm8gd2VpZ2h0LgpmdW5jIGNoZWNrUm9zdGVyKCkgewoJaWYgbGVuKHNlYXRlZCkgPCBNaW5TZWF0cyB8fCBsZW4oc2VhdGVkKSA+IE1heFNlYXRzIHsKCQlwYW5pYygibWVtYmFfZ292OiByb3N0ZXIgc2l6ZSBvdXQgb2YgYm91bmRzIikKCX0KCXNlZW4gOj0gbWFwW3N0cmluZ11ib29se30KCWZvciBfLCBwIDo9IHJhbmdlIHNlYXRlZCB7CgkJaWYgc2VlblsiaSIrcC5pZF0gfHwgc2VlblsiYSIrc3RyaW5nKHAuYWRkcildIHx8ICF2YWxpZElEKHAuaWQpIHx8ICFkYW9hdXRoLlZhbGlkQWRkcmVzcyhwLmFkZHIpIHx8IHAud2VpZ2h0IDwgMSB8fCBwLndlaWdodCA+IDIgewoJCQlwYW5pYygibWVtYmFfZ292OiBpbnZhbGlkIHJvc3RlciIpCgkJfQoJCXNlZW5bImkiK3AuaWRdLCBzZWVuWyJhIitzdHJpbmcocC5hZGRyKV0gPSB0cnVlLCB0cnVlCgl9Cgl0IDo9IG5vdygpCglmb3IgXywgaW52IDo9IHJhbmdlIGludml0ZXMgewoJCWlmIHQgPiBpbnYuZXhwaXJlcyB7CgkJCWNvbnRpbnVlCgkJfQoJCXJlY292ZXJ5IDo9IHBlcnNvbkJ5SUQoaW52LmlkKSAhPSBuaWwKCQlpZiBzZWVuWyJ2IitpbnYuaWRdIHx8IHNlZW5bImEiK3N0cmluZyhpbnYuYWRkcildIHx8ICF2YWxpZElEKGludi5pZCkgfHwgIWRhb2F1dGguVmFsaWRBZGRyZXNzKGludi5hZGRyKSB8fAoJCQkoIXJlY292ZXJ5ICYmIChpbnYud2VpZ2h0IDwgMSB8fCBpbnYud2VpZ2h0ID4gMikpIHsKCQkJcGFuaWMoIm1lbWJhX2dvdjogaW52YWxpZCBpbnZpdGF0aW9uIikKCQl9CgkJc2VlblsidiIraW52LmlkXSwgc2VlblsiYSIrc3RyaW5nKGludi5hZGRyKV0gPSB0cnVlLCB0cnVlCgl9Cn0KCi8vIGFkZHJUYWtlbiByZXBvcnRzIHdoZXRoZXIgYSBpcyBzZWF0ZWQsIG9yIGludml0ZWQgZm9yIHNvbWVvbmUgb3RoZXIgdGhhbgovLyBpZDogYSBuZXdlciBpbnZpdGF0aW9uIGZvciBpZCByZXBsYWNlcyBpZCdzIG93bi4KZnVuYyBhZGRyVGFrZW4oYSBhZGRyZXNzLCBpZCBzdHJpbmcpIGJvb2wgewoJaWYgcGVyc29uQnlBZGRyKGEpICE9IG5pbCB7CgkJcmV0dXJuIHRydWUKCX0KCWZvciBfLCBpbnYgOj0gcmFuZ2UgaW52aXRlcyB7CgkJaWYgaW52LmFkZHIgPT0gYSAmJiBpbnYuaWQgIT0gaWQgJiYgbm93KCkgPD0gaW52LmV4cGlyZXMgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgpmdW5jIGludml0ZWQoaWQgc3RyaW5nKSBib29sIHsKCWZvciBfLCBpbnYgOj0gcmFuZ2UgaW52aXRlcyB7CgkJaWYgaW52LmlkID09IGlkICYmIG5vdygpIDw9IGludi5leHBpcmVzIHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKZnVuYyBwZXJzb25CeUFkZHIoYSBhZGRyZXNzKSAqcGVyc29uIHsKCWZvciBfLCBwIDo9IHJhbmdlIHNlYXRlZCB7CgkJaWYgcC5hZGRyID09IGEgewoJCQlyZXR1cm4gcAoJCX0KCX0KCXJldHVybiBuaWwKfQoKZnVuYyBwZXJzb25CeUlEKGlkIHN0cmluZykgKnBlcnNvbiB7Cglmb3IgXywgcCA6PSByYW5nZSBzZWF0ZWQgewoJCWlmIHAuaWQgPT0gaWQgewoJCQlyZXR1cm4gcAoJCX0KCX0KCXJldHVybiBuaWwKfQoKZnVuYyB3ZWlnaHRPZihpZCBzdHJpbmcpIGludCB7CglpZiBwIDo9IHBlcnNvbkJ5SUQoaWQpOyBwICE9IG5pbCB7CgkJcmV0dXJuIHAud2VpZ2h0Cgl9CglyZXR1cm4gMAp9CgpmdW5jIHNlYXRlZFRvdGFscygpICh3LCBuIGludCkgewoJZm9yIF8sIHAgOj0gcmFuZ2Ugc2VhdGVkIHsKCQl3ICs9IHAud2VpZ2h0Cgl9CglyZXR1cm4gdywgbGVuKHNlYXRlZCkKfQoKZnVuYyBzY29wZUdlbih0YXJnZXQsIHNjb3BlIHN0cmluZykgdWludDY0IHsKCWlmIHYsIG9rIDo9IHNjb3Blcy5HZXQodGFyZ2V0ICsgIlxuIiArIHNjb3BlKTsgb2sgewoJCXJldHVybiB2Lih1aW50NjQpCgl9CglyZXR1cm4gMAp9CgpmdW5jIGlzT3BlbihwaWQgdWludDY0KSBib29sIHsKCXN0LCBfIDo9IHN0YXRlKG11c3RHZXQocGlkKSkKCXJldHVybiBzdCA9PSBzdFZvdGluZyB8fCBzdCA9PSBzdFRpbWVsb2NrZWQgfHwgc3QgPT0gc3RSZWFkeQp9CgpmdW5jIG11c3RHZXQocGlkIHVpbnQ2NCkgKnByb3Bvc2FsIHsKCXYsIG9rIDo9IHByb3Bvc2Fscy5HZXQoa2V5KHBpZCkpCglpZiAhb2sgewoJCXBhbmljKCJtZW1iYV9nb3Y6IG5vIHByb3Bvc2FsICIgKyBzdHJjb252LkZvcm1hdFVpbnQocGlkLCAxMCkpCgl9CglyZXR1cm4gdi4oKnByb3Bvc2FsKQp9CgpmdW5jIGtleShpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApCglyZXR1cm4gc3RyaW5ncy5SZXBlYXQoIjAiLCAyMC1sZW4ocykpICsgcwp9CgovLyB2YWxpZFRhcmdldCBhY2NlcHRzIGEgcmVhbG0gcGF0aDogbm8gdXNlciAoIiIpIG9yIE1zZ1J1biAoZ25vLmxhbmQvZS8pCi8vIGlkZW50aXR5LCBubyBzdWItcmVhbG0gKCIjIiksIGxvd2VyY2FzZSBwYXRoIGNoYXJhY3RlcnMgb25seS4KZnVuYyB2YWxpZFRhcmdldCh0IHN0cmluZykgYm9vbCB7CglyZXR1cm4gc3RyaW5ncy5IYXNQcmVmaXgodCwgImduby5sYW5kL3IvIikgJiYgbGVuKHQpIDw9IDI1NiAmJiAhc3RyaW5ncy5Db250YWlucyh0LCAiLy8iKSAmJgoJCSFzdHJpbmdzLkhhc1N1ZmZpeCh0LCAiLyIpICYmIG9ubHkodCwgbG93ZXIrZGlnaXRzKyJfLy4iKQp9CgpmdW5jIHZhbGlkQWN0aW9uKGEgc3RyaW5nKSBib29sIHsKCXJldHVybiBhICE9ICIiICYmIGxlbihhKSA8PSBNYXhBY3Rpb24gJiYgb25seShhLCBsb3dlcit1cHBlcitkaWdpdHMrIl8uIikKfQoKZnVuYyB2YWxpZElEKGlkIHN0cmluZykgYm9vbCB7IHJldHVybiBpZCAhPSAiIiAmJiBsZW4oaWQpIDw9IDMyICYmIG9ubHkoaWQsIGxvd2VyK2RpZ2l0cysiXy0iKSB9Cgpjb25zdCAoCglsb3dlciAgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCgl1cHBlciAgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCglkaWdpdHMgPSAiMDEyMzQ1Njc4OSIKKQoKLy8gb25seSByZXBvcnRzIHdoZXRoZXIgZXZlcnkgYnl0ZSBvZiBzIGlzIGluIHNldC4KZnVuYyBvbmx5KHMsIHNldCBzdHJpbmcpIGJvb2wgewoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQlpZiBzdHJpbmdzLkluZGV4Qnl0ZShzZXQsIHNbaV0pIDwgMCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KGvshCgpwb2xpY3kuZ25vEuwhcGFja2FnZSBtZW1iYV9nb3YKCmltcG9ydCAidGltZSIKCi8vIENsYXNzZXMuIEEgdGFyZ2V0IGhhcmQtY29kZXMgdGhlIG1pbmltdW0gY2xhc3Mgb2YgZWFjaCBhY3Rpb24gaXQgZ292ZXJucy4KY29uc3QgKAoJUm91dGluZSAgID0gMQoJRmluYW5jaWFsID0gMgoJQ3JpdGljYWwgID0gMwopCgovLyBBIHJvdXRlIGlzIG9uZSB3YXkgYSBwcm9wb3NhbCBwYXNzZXM6IGEgcnVsZSBvbiB0aGUgWUVTIHZvdGVzIG9mIHRoZQovLyBzZWF0ZWQgcm9zdGVyIGFuZCB0aGUgZGVsYXkgdGhhdCBmb2xsb3dzLiBUaHJlc2hvbGRzIGFyZSBmcmFjdGlvbnMgb2YgdGhlCi8vIHNlYXRlZCB3ZWlnaHQgVyBhbmQgcGVyc29ucyBOLiBFdmVyeSBydWxlIG5lZWRzIGF0IGxlYXN0IHR3byBwZXJzb25zOiB0aGUKLy8gY3JpdGljYWwgb25lcyBiZWNhdXNlIE4gaXMgYXQgbGVhc3QgMi4KdHlwZSByb3V0ZSBzdHJ1Y3QgewoJcnVsZSAgaW50CglkZWxheSB0aW1lLkR1cmF0aW9uCn0KCmNvbnN0ICgKCXJ1bGVSb3V0aW5lID0gaW90YQoJcnVsZUZpbmFuY2lhbAoJcnVsZVdlaWdodGVkCglydWxlSGVhZGNvdW50CikKCmZ1bmMgbWVldHMocnVsZSwgdywgcCwgVywgTiBpbnQpIGJvb2wgewoJc3dpdGNoIHJ1bGUgewoJY2FzZSBydWxlUm91dGluZTogLy8gPj0gMy84IG9mIHRoZSB3ZWlnaHQKCQlyZXR1cm4gOCp3ID49IDMqVyAmJiBwID49IDIKCWNhc2UgcnVsZUZpbmFuY2lhbDogLy8gPj0gMy81IG9mIHRoZSB3ZWlnaHQgYW5kIGEgbWFqb3JpdHkgb2YgcGVyc29ucwoJCXJldHVybiA1KncgPj0gMypXICYmIHAgPj0gMyAmJiAyKnAgPiBOCgljYXNlIHJ1bGVXZWlnaHRlZDogLy8gPj0gMi8zIG9mIHRoZSB3ZWlnaHQgYW5kIGEgbWFqb3JpdHkgb2YgcGVyc29ucwoJCXJldHVybiAzKncgPj0gMipXICYmIDIqcCA+IE4KCWNhc2UgcnVsZUhlYWRjb3VudDogLy8gPj0gMi8zIG9mIHRoZSBwZXJzb25zIGFuZCBhIG1ham9yaXR5IG9mIHRoZSB3ZWlnaHQKCQlyZXR1cm4gMypwID49IDIqTiAmJiAyKncgPiBXCgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gcm91dGVzIHJldHVybnMgdGhlIHdheXMgcHJvcG9zYWwgcCBwYXNzZXM6IGl0cyBjbGFzcyBzZXRzIHRoZSBydWxlcywgYW5kCi8vIGEgcm9zdGVyIGFjdGlvbiBvZiB0aGlzIHJlYWxtIGhhcyBpdHMgb3duIGRlbGF5IG9uIGV2ZXJ5IHJvdXRlLgpmdW5jIHJvdXRlcyhwICpwcm9wb3NhbCkgW11yb3V0ZSB7Cgl2YXIgcnMgW11yb3V0ZQoJc3dpdGNoIHAuY2xhc3MgewoJY2FzZSBSb3V0aW5lOgoJCXJzID0gW11yb3V0ZXt7cnVsZVJvdXRpbmUsIDB9fQoJY2FzZSBGaW5hbmNpYWw6CgkJcnMgPSBbXXJvdXRle3tydWxlRmluYW5jaWFsLCAwfX0KCWRlZmF1bHQ6CgkJcnMgPSBbXXJvdXRle3tydWxlV2VpZ2h0ZWQsIFdlaWdodGVkRGVsYXl9LCB7cnVsZUhlYWRjb3VudCwgSGVhZGNvdW50RGVsYXl9fQoJfQoJaWYgcC50YXJnZXQgPT0gY29yZVBhdGggewoJCWZvciBpIDo9IHJhbmdlIHJzIHsKCQkJcnNbaV0uZGVsYXkgPSByb3N0ZXJEZWxheShwLmFjdGlvbikKCQl9Cgl9CglyZXR1cm4gcnMKfQoKLy8gQSBzdHJlYWsgaXMgb25lIGN1cnJlbnQgWUVTIGJhbGxvdDogd2hlbiBpdCBiZWdhbiBhbmQgaXRzIHZvdGVyJ3Mgd2VpZ2h0Lgp0eXBlIHN0cmVhayBzdHJ1Y3QgewoJc2luY2UgIGludDY0Cgl3ZWlnaHQgaW50Cn0KCi8vIHllc1N0cmVha3MgcmV0dXJucyBwJ3MgY3VycmVudCBZRVMgYmFsbG90cywgb2xkZXN0IHN0cmVhayBmaXJzdC4KZnVuYyB5ZXNTdHJlYWtzKHAgKnByb3Bvc2FsKSBbXXN0cmVhayB7Cgl2YXIgeXMgW11zdHJlYWsKCWZvciBfLCBiIDo9IHJhbmdlIHAuYmFsbG90cyB7CgkJaWYgYi52b3RlICE9IHZvdGVZZXMgewoJCQljb250aW51ZQoJCX0KCQl4IDo9IHN0cmVha3tiLnNpbmNlLCB3ZWlnaHRPZihiLnBlcnNvbil9CgkJeXMgPSBhcHBlbmQoeXMsIHgpCgkJaSA6PSBsZW4oeXMpIC0gMQoJCWZvciA7IGkgPiAwICYmIHlzW2ktMV0uc2luY2UgPiB4LnNpbmNlOyBpLS0gewoJCQl5c1tpXSA9IHlzW2ktMV0KCQl9CgkJeXNbaV0gPSB4Cgl9CglyZXR1cm4geXMKfQoKLy8gcXVhbGlmaWVkU2luY2UgcmV0dXJucyB3aGVuICh1bml4IHNlY29uZHMpIHRoZSBlYXJsaWVzdCBjb2FsaXRpb24gc3RpbGwKLy8gdm90aW5nIFlFUyB3aXRob3V0IGludGVycnVwdGlvbiBmaXJzdCBtZXQgcnVsZSwgb3IgMC4gVGhlIGNvYWxpdGlvbiBvZiBhCi8vIHN0YXJ0IHRpbWUgaXMgZXZlcnkgWUVTIHN0cmVhayBiZWd1biBubyBsYXRlcjsgZXZlcnkgcnVsZSBvbmx5IGdyb3dzIHdpdGgKLy8gbW9yZSB2b3Rlcywgc28gdGhlIGZpcnN0IHByZWZpeCBvZiB5cyB0aGF0IG1lZXRzIGl0IGVuZHMgb24gdGhhdCB0aW1lCi8vIChzdHJlYWtzIGJlZ3VuIGluIHRoZSBzYW1lIHNlY29uZCBzaGFyZSBpdCkuIEEgdm90ZXIgdGhlIHJlc3Qgb2YgdGhlCi8vIGNvYWxpdGlvbiBkb2VzIG5vdCBuZWVkIGNhbm5vdCBwb3N0cG9uZSB0aGUgY2xvY2sgYnkgd2l0aGRyYXdpbmcgYW5kCi8vIHJlam9pbmluZy4KZnVuYyBxdWFsaWZpZWRTaW5jZSh5cyBbXXN0cmVhaywgcnVsZSwgVywgTiBpbnQpIGludDY0IHsKCXcsIG4gOj0gMCwgMAoJZm9yIF8sIHggOj0gcmFuZ2UgeXMgewoJCXcgKz0geC53ZWlnaHQKCQluKysKCQlpZiBtZWV0cyhydWxlLCB3LCBuLCBXLCBOKSB7CgkJCXJldHVybiB4LnNpbmNlCgkJfQoJfQoJcmV0dXJuIDAKfQoKLy8gUHJvcG9zYWwgc3RhdGVzLCBpbiB0aGUgb3JkZXIgYSByZWFkZXIgY2hlY2tzIHRoZW0uCmNvbnN0ICgKCXN0RXhlY3V0ZWQgICAgPSAiZXhlY3V0ZWQiCglzdEludmFsaWRhdGVkID0gImludmFsaWRhdGVkIgoJc3RFeHBpcmVkICAgICA9ICJleHBpcmVkIgoJc3RSZWFkeSAgICAgICA9ICJyZWFkeSIKCXN0VGltZWxvY2tlZCAgPSAidGltZWxvY2tlZCIKCXN0Vm90aW5nICAgICAgPSAidm90aW5nIgopCgovLyBzdGF0ZSByZXR1cm5zIHAncyBzdGF0dXMgYW5kLCBvbmNlIHNvbWUgcm91dGUgcXVhbGlmaWVkLCB0aGUgZWFybGllc3QKLy8gdW5peCB0aW1lIGl0IGlzIG9yIGJlY29tZXMgZXhlY3V0YWJsZSAoMCBiZWZvcmUpLiBWb3RpbmcgZW5kcyBqdXN0IGJlZm9yZQovLyB0aGUgZGVhZGxpbmUgc2Vjb25kOyByZWFkeUF0IGFuZCB0aGUgZW5kIG9mIHRoZSBleGVjdXRpb24gd2luZG93IGFyZQovLyBpbmNsdXNpdmUuCmZ1bmMgc3RhdGUocCAqcHJvcG9zYWwpIChzdHJpbmcsIGludDY0KSB7CglpZiBwLmNvbnN1bWVkIHsKCQlyZXR1cm4gc3RFeGVjdXRlZCwgMAoJfQoJaWYgcC5nbG9iYWxHZW4gIT0gZ2xvYmFsR2VuIHx8IHAuc2NvcGVHZW4gIT0gc2NvcGVHZW4ocC50YXJnZXQsIHAuc2NvcGUpIHx8IHZldG9lZChwKSB7CgkJcmV0dXJuIHN0SW52YWxpZGF0ZWQsIDAKCX0KCXQgOj0gbm93KCkKCVcsIE4gOj0gc2VhdGVkVG90YWxzKCkKCXlzIDo9IHllc1N0cmVha3MocCkKCXZhciByZWFkeUF0LCBsb25nZXN0IGludDY0Cglmb3IgXywgciA6PSByYW5nZSByb3V0ZXMocCkgewoJCWlmIGQgOj0gc2VjcyhyLmRlbGF5KTsgZCA+IGxvbmdlc3QgewoJCQlsb25nZXN0ID0gZAoJCX0KCQlpZiBzaW5jZSA6PSBxdWFsaWZpZWRTaW5jZSh5cywgci5ydWxlLCBXLCBOKTsgc2luY2UgIT0gMCB7CgkJCWlmIGF0IDo9IHNpbmNlICsgc2VjcyhyLmRlbGF5KTsgcmVhZHlBdCA9PSAwIHx8IGF0IDwgcmVhZHlBdCB7CgkJCQlyZWFkeUF0ID0gYXQKCQkJfQoJCX0KCX0KCWRlYWRsaW5lIDo9IHAuY3JlYXRlZCArIHNlY3MoVm90aW5nUGVyaW9kKQoJaWYgdCA+IGRlYWRsaW5lK2xvbmdlc3Qrc2VjcyhFeGVjdXRpb25XaW5kb3cpIHx8IChyZWFkeUF0ID09IDAgJiYgdCA+PSBkZWFkbGluZSkgewoJCXJldHVybiBzdEV4cGlyZWQsIHJlYWR5QXQKCX0KCXN3aXRjaCB7CgljYXNlIHJlYWR5QXQgPT0gMDoKCQlyZXR1cm4gc3RWb3RpbmcsIHJlYWR5QXQKCWNhc2UgdCA8IHJlYWR5QXQ6CgkJcmV0dXJuIHN0VGltZWxvY2tlZCwgcmVhZHlBdAoJfQoJcmV0dXJuIHN0UmVhZHksIHJlYWR5QXQKfQoKLy8gdmV0b2VkIHJlcG9ydHMgd2hldGhlciB0aGUgbWVtYmVyIGEgUmVtb3ZlSW5hY3RpdmUgbmFtZXMgaGFzIGJlZW4gYWN0aXZlCi8vIHNpbmNlIHRoZSBwcm9wb3NhbDogcHJvcG9zaW5nLCB2b3RpbmcsIGV4ZWN1dGluZyBvciBqb2luaW5nIHZldG9lcyBpdC4KZnVuYyB2ZXRvZWQocCAqcHJvcG9zYWwpIGJvb2wgewoJaWYgcC50YXJnZXQgIT0gY29yZVBhdGggfHwgcC5hY3Rpb24gIT0gYWN0UmVtb3ZlSW5hY3RpdmUgewoJCXJldHVybiBmYWxzZQoJfQoJbSA6PSBwZXJzb25CeUlEKHAuc3ViamVjdCkKCXJldHVybiBtICE9IG5pbCAmJiBtLmxhc3RBY3RpdmUgPj0gcC5jcmVhdGVkCn0KGsY3CglyZWFkcy5nbm8SuDdwYWNrYWdlIG1lbWJhX2dvdgoKaW1wb3J0ICgKCSJzdHJjb252IgoJInRpbWUiCikKCi8vIFJlYWRzIG1ha2Ugbm8gY3Jvc3MtcmVhbG0gY2FsbCBhbmQgbmV2ZXIgc3RhcnQgb3IgYWR2YW5jZSBhIGNsb2NrLiBJZHMgYW5kCi8vIHVuaXggdGltZXMgYXJlIEpTT04gc3RyaW5ncyAoY2xpZW50cyBwYXJzZSB0aGVtIGFzIGJpZyBpbnRlZ2VycykuIFN0b3JlZAovLyB0ZXh0IGlzIHByaW50YWJsZSBBU0NJSSwgc28gdGhlIGVzY2FwZXJzIHdvcmsgYnl0ZSBieSBieXRlLgoKLy8gTWF4TGlzdGVkIGlzIHRoZSBtb3N0IHByb3Bvc2FscyBQcm9wb3NhbHNKU09OIGFuZCBSZW5kZXIgcmV0dXJuIGF0IG9uY2UuCmNvbnN0IE1heExpc3RlZCA9IDIwCgovLyBSb3N0ZXJKU09OIGxpc3RzIHNlYXRlZCBtZW1iZXJzIGFuZCBvcGVuIGludml0YXRpb25zLgpmdW5jIFJvc3RlckpTT04oKSBzdHJpbmcgewoJVywgTiA6PSBzZWF0ZWRUb3RhbHMoKQoJYiA6PSBbXWJ5dGUoYHsid2VpZ2h0IjpgICsgc3RyY29udi5JdG9hKFcpICsgYCwicGVyc29ucyI6YCArIHN0cmNvbnYuSXRvYShOKSArIGAsIm1lbWJlcnMiOltgKQoJZm9yIGksIHAgOj0gcmFuZ2Ugc2VhdGVkIHsKCQlpZiBpID4gMCB7CgkJCWIgPSBhcHBlbmQoYiwgJywnKQoJCX0KCQliID0gYXBwZW5kKGIsIGB7ImlkIjpgLi4uKQoJCWIgPSBxKGIsIHAuaWQpCgkJYiA9IGFwcGVuZChiLCBgLCJhZGRyZXNzIjpgLi4uKQoJCWIgPSBxKGIsIHN0cmluZyhwLmFkZHIpKQoJCWIgPSBhcHBlbmQoYiwgYCwid2VpZ2h0IjpgK3N0cmNvbnYuSXRvYShwLndlaWdodCkrYCwibGFzdEFjdGl2ZSI6ImArdW5peChwLmxhc3RBY3RpdmUpK2AifWAuLi4pCgl9CgliID0gYXBwZW5kKGIsIGBdLCJpbnZpdGF0aW9ucyI6W2AuLi4pCgluIDo9IDAKCWZvciBfLCBpbnYgOj0gcmFuZ2UgaW52aXRlcyB7CgkJaWYgbm93KCkgPiBpbnYuZXhwaXJlcyB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIG4gPiAwIHsKCQkJYiA9IGFwcGVuZChiLCAnLCcpCgkJfQoJCW4rKwoJCWIgPSBhcHBlbmQoYiwgYHsiaWQiOmAuLi4pCgkJYiA9IHEoYiwgaW52LmlkKQoJCWIgPSBhcHBlbmQoYiwgYCwiYWRkcmVzcyI6YC4uLikKCQliID0gcShiLCBzdHJpbmcoaW52LmFkZHIpKQoJCWIgPSBhcHBlbmQoYiwgYCwid2VpZ2h0IjpgK3N0cmNvbnYuSXRvYShpbnYud2VpZ2h0KStgLCJleHBpcmVzIjoiYCt1bml4KGludi5leHBpcmVzKStgIn1gLi4uKQoJfQoJcmV0dXJuIHN0cmluZyhhcHBlbmQoYiwgYF19YC4uLikpCn0KCi8vIFByb3Bvc2FsSlNPTiByZXR1cm5zIG9uZSBwcm9wb3NhbCB3aXRoIGl0cyBiYWxsb3RzIGFuZCBjdXJyZW50IHN0YXR1cywgb3IKLy8gbnVsbCBmb3IgYW4gdW5rbm93biBpZC4KZnVuYyBQcm9wb3NhbEpTT04ocGlkIHVpbnQ2NCkgc3RyaW5nIHsKCXYsIG9rIDo9IHByb3Bvc2Fscy5HZXQoa2V5KHBpZCkpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBzdHJpbmcocHJvcG9zYWxKU09OKG5pbCwgdi4oKnByb3Bvc2FsKSkpCn0KCi8vIENvbnN0YW50c0pTT04gcmV0dXJucyB0aGUgZml4ZWQgcG9saWN5OiBkdXJhdGlvbnMgaW4gc2Vjb25kcywgcm9zdGVyIGJvdW5kcy4KZnVuYyBDb25zdGFudHNKU09OKCkgc3RyaW5nIHsKCXNlYyA6PSBmdW5jKGQgdGltZS5EdXJhdGlvbikgc3RyaW5nIHsgcmV0dXJuIHVuaXgoc2VjcyhkKSkgfQoJcmV0dXJuIGB7InZvdGluZ1BlcmlvZCI6YCArIHNlYyhWb3RpbmdQZXJpb2QpICsgYCwiZXhlY3V0aW9uV2luZG93IjpgICsgc2VjKEV4ZWN1dGlvbldpbmRvdykgKwoJCWAsImNyaXRpY2FsV2VpZ2h0RGVsYXkiOmAgKyBzZWMoV2VpZ2h0ZWREZWxheSkgKyBgLCJjcml0aWNhbEhlYWRjb3VudERlbGF5IjpgICsgc2VjKEhlYWRjb3VudERlbGF5KSArCgkJYCwicm9zdGVyRGVsYXkiOmAgKyBzZWMoUm9zdGVyRGVsYXkpICsgYCwiaW5hY3RpdmVEZWxheSI6YCArIHNlYyhJbmFjdGl2ZURlbGF5KSArCgkJYCwiaW5hY3RpdmVBZnRlciI6YCArIHNlYyhJbmFjdGl2ZUFmdGVyKSArIGAsIm1pblNlYXRzIjpgICsgc3RyY29udi5JdG9hKE1pblNlYXRzKSArCgkJYCwibWF4U2VhdHMiOmAgKyBzdHJjb252Lkl0b2EoTWF4U2VhdHMpICsgYCwibWF4TGlzdGVkIjpgICsgc3RyY29udi5JdG9hKE1heExpc3RlZCkgKyBgfWAKfQoKLy8gUHJvcG9zYWxzSlNPTiBsaXN0cyB1cCB0byBsaW1pdCBwcm9wb3NhbHMgKGF0IG1vc3QgTWF4TGlzdGVkKSB3aXRoIGlkcwovLyBiZWxvdyBiZWZvcmUsIG5ld2VzdCBmaXJzdDsgYmVmb3JlID0gMCBzdGFydHMgZnJvbSB0aGUgbmV3ZXN0LgpmdW5jIFByb3Bvc2Fsc0pTT04oYmVmb3JlIHVpbnQ2NCwgbGltaXQgaW50KSBzdHJpbmcgewoJaWYgbGltaXQgPCAxIHx8IGxpbWl0ID4gTWF4TGlzdGVkIHsKCQlsaW1pdCA9IE1heExpc3RlZAoJfQoJYiA6PSBbXWJ5dGUoYHsidG90YWwiOiJgICsgc3RyY29udi5Gb3JtYXRVaW50KGxhc3RJRCwgMTApICsgYCIsInByb3Bvc2FscyI6W2ApCglpZiBiZWZvcmUgIT0gMSB7CgkJZW5kIDo9ICIiIC8vIGEgZGVzY2VuZGluZyByYW5nZSBpbmNsdWRlcyBpdHMgZW5kCgkJaWYgYmVmb3JlID4gMSB7CgkJCWVuZCA9IGtleShiZWZvcmUgLSAxKQoJCX0KCQluIDo9IDAKCQlwcm9wb3NhbHMuUmV2ZXJzZUl0ZXJhdGUoIiIsIGVuZCwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCQlpZiBuID4gMCB7CgkJCQliID0gYXBwZW5kKGIsICcsJykKCQkJfQoJCQliID0gcHJvcG9zYWxKU09OKGIsIHYuKCpwcm9wb3NhbCkpCgkJCW4rKwoJCQlyZXR1cm4gbiA+PSBsaW1pdAoJCX0pCgl9CglyZXR1cm4gc3RyaW5nKGFwcGVuZChiLCBgXX1gLi4uKSkKfQoKZnVuYyBwcm9wb3NhbEpTT04oYiBbXWJ5dGUsIHAgKnByb3Bvc2FsKSBbXWJ5dGUgewoJc3QsIHJlYWR5QXQgOj0gc3RhdGUocCkKCWIgPSBhcHBlbmQoYiwgYHsiaWQiOiJgK3N0cmNvbnYuRm9ybWF0VWludChwLmlkLCAxMCkrYCIsInRhcmdldCI6YC4uLikKCWIgPSBxKGIsIHAudGFyZ2V0KQoJYiA9IGFwcGVuZChiLCBgLCJhY3Rpb24iOmAuLi4pCgliID0gcShiLCBwLmFjdGlvbikKCWIgPSBhcHBlbmQoYiwgYCwiYXJncyI6YC4uLikKCWIgPSBxKGIsIHAuYXJncykKCWIgPSBhcHBlbmQoYiwgYCwic2NvcGUiOmAuLi4pCgliID0gcShiLCBwLnNjb3BlKQoJYiA9IGFwcGVuZChiLCBgLCJjbGFzcyI6YCtzdHJjb252Lkl0b2EocC5jbGFzcykrYCwicHJvcG9zZXIiOmAuLi4pCgliID0gcShiLCBwLnByb3Bvc2VyKQoJYiA9IGFwcGVuZChiLCBgLCJub3RlIjpgLi4uKQoJYiA9IHEoYiwgcC5ub3RlKQoJYiA9IGFwcGVuZChiLCBgLCJjcmVhdGVkIjoiYCt1bml4KHAuY3JlYXRlZCkrYCIsImRlYWRsaW5lIjoiYCt1bml4KHAuY3JlYXRlZCtzZWNzKFZvdGluZ1BlcmlvZCkpKwoJCWAiLCJzdGF0dXMiOiJgK3N0K2AiLCJyZWFkeUF0IjoiYCt1bml4KHJlYWR5QXQpK2AiLCJiYWxsb3RzIjpbYC4uLikKCWZvciBpLCBibCA6PSByYW5nZSBwLmJhbGxvdHMgewoJCWlmIGkgPiAwIHsKCQkJYiA9IGFwcGVuZChiLCAnLCcpCgkJfQoJCWIgPSBhcHBlbmQoYiwgYHsicGVyc29uIjpgLi4uKQoJCWIgPSBxKGIsIGJsLnBlcnNvbikKCQliID0gYXBwZW5kKGIsIGAsInZvdGUiOiJgK2JsLnZvdGUrYCIsInNpbmNlIjoiYCt1bml4KGJsLnNpbmNlKStgIn1gLi4uKQoJfQoJcmV0dXJuIGFwcGVuZChiLCBgXX1gLi4uKQp9CgovLyBSZW5kZXIgc2hvd3MgdGhlIHJvc3RlciBhbmQgdGhlIGxhdGVzdCBwcm9wb3NhbHMuIEVhY2ggcHJvcG9zYWwncyBsaW5lCi8vIGhvbGRzIG9ubHkgZmllbGRzIHRoZSByZWFsbSBzZXRzIChpZCwgc3RhdHVzLCBjbGFzcywgcHJvcG9zZXIgaWQpOyBldmVyeQovLyB2YWx1ZSBhIHByb3Bvc2VyIHdyb3RlIGZvbGxvd3MgYXMgaXRzIG93biBsYWJlbGxlZCwgZXNjYXBlZCBpdGVtLCBzbyBub25lCi8vIGNhbiBmb3JnZSBhIGZpZWxkLgpmdW5jIFJlbmRlcihfIHN0cmluZykgc3RyaW5nIHsKCVcsIE4gOj0gc2VhdGVkVG90YWxzKCkKCWIgOj0gW11ieXRlKCIjIE1lbWJhIERBTyBnb3Zlcm5hbmNlXG5cbiMjIE1lbWJlcnM6ICIgKyBzdHJjb252Lkl0b2EoTikgKyAiIHNlYXRlZCwgd2VpZ2h0ICIgKyBzdHJjb252Lkl0b2EoVykgKyAiXG5cbiIpCglmb3IgXywgcCA6PSByYW5nZSBzZWF0ZWQgewoJCWIgPSBhcHBlbmQoYiwgIi0gIi4uLikKCQliID0gbWQoYiwgcC5pZCkKCQliID0gYXBwZW5kKGIsICIgKHdlaWdodCAiK3N0cmNvbnYuSXRvYShwLndlaWdodCkrIik6ICIuLi4pCgkJYiA9IG1kKGIsIHN0cmluZyhwLmFkZHIpKQoJCWIgPSBhcHBlbmQoYiwgJ1xuJykKCX0KCWIgPSBhcHBlbmQoYiwgIlxuIyMgTGF0ZXN0IHByb3Bvc2Fsc1xuXG4iLi4uKQoJbiA6PSAwCglwcm9wb3NhbHMuUmV2ZXJzZUl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJcCA6PSB2LigqcHJvcG9zYWwpCgkJc3QsIF8gOj0gc3RhdGUocCkKCQliID0gYXBwZW5kKGIsICItICMiK3N0cmNvbnYuRm9ybWF0VWludChwLmlkLCAxMCkrIiAiK3N0KyIsIGNsYXNzICIrc3RyY29udi5JdG9hKHAuY2xhc3MpKyIsIGJ5ICIuLi4pCgkJYiA9IG1kKGIsIHAucHJvcG9zZXIpCgkJYiA9IGFwcGVuZChiLCAnXG4nKQoJCWZvciBfLCBmIDo9IHJhbmdlIFtdWzJdc3RyaW5ne3sidGFyZ2V0IiwgcC50YXJnZXR9LCB7ImFjdGlvbiIsIHAuYWN0aW9ufSwgeyJhcmdzIiwgcC5hcmdzfSwgeyJzY29wZSIsIHAuc2NvcGV9LCB7InByb3Bvc2VyJ3Mgbm90ZSIsIHAubm90ZX19IHsKCQkJaWYgZlsxXSAhPSAiIiB7CgkJCQliID0gYXBwZW5kKGIsICIgIC0gIitmWzBdKyI6ICIuLi4pCgkJCQliID0gbWQoYiwgZlsxXSkKCQkJCWIgPSBhcHBlbmQoYiwgJ1xuJykKCQkJfQoJCX0KCQluKysKCQlyZXR1cm4gbiA+PSBNYXhMaXN0ZWQKCX0pCglpZiBuID09IDAgewoJCWIgPSBhcHBlbmQoYiwgIk5vbmUgeWV0LlxuIi4uLikKCX0KCXJldHVybiBzdHJpbmcoYikKfQoKLy8gdW5peCBmb3JtYXRzIGEgdW5peC1zZWNvbmQgdGltZSAoMCA9IG5vbmUpLgpmdW5jIHVuaXgodCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHQsIDEwKSB9CgovLyBncm93IG1ha2VzIHJvb20gZm9yIG4gbW9yZSBieXRlcy4gVGhlIFZNJ3MgYXBwZW5kIHJlYWxsb2NhdGVzIHRvIHRoZSBleGFjdAovLyBsZW5ndGgsIHNvIGFwcGVuZGluZyBieXRlIGJ5IGJ5dGUgcGFzdCBjYXBhY2l0eSB3b3VsZCBjb3B5IHRoZSB3aG9sZQovLyBidWZmZXIgZWFjaCB0aW1lOyBkb3VibGluZyBrZWVwcyB0aGUgZXNjYXBlcnMgbGluZWFyLgpmdW5jIGdyb3coYiBbXWJ5dGUsIG4gaW50KSBbXWJ5dGUgewoJaWYgY2FwKGIpLWxlbihiKSA+PSBuIHsKCQlyZXR1cm4gYgoJfQoJbmIgOj0gbWFrZShbXWJ5dGUsIGxlbihiKSwgMipjYXAoYikrbikKCWNvcHkobmIsIGIpCglyZXR1cm4gbmIKfQoKLy8gRXNjYXBlciBjbGFzc2VzIG9mIGVhY2ggQVNDSUkgYnl0ZSwgb25lIHRhYmxlIGxvb2t1cCBwZXIgYnl0ZTogJy4nIGlzCi8vIGNvcGllZCwgJ2InIGdldHMgYSBiYWNrc2xhc2gsICd1JyBiZWNvbWVzIFx1MDBYWCwgJ2UnIGEgbnVtZXJpYwovLyBjaGFyYWN0ZXIgcmVmZXJlbmNlLiBTdG9yZWQgdGV4dCBpcyBwcmludGFibGUgQVNDSUkgKDB4N2YgbWFza3MgdGhlCi8vIGluZGV4OyBubyBvdGhlciBieXRlIHJlYWNoZXMgaGVyZSkuCmNvbnN0ICgKCXFDbGFzcyA9ICJ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dSIgKwoJCSIuLmIuLi51Li4uLi4uLi4uLi4uLi4uLi4uLi4udS51LiIgKwoJCSIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uYi4uLiIgKwoJCSIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4udSIKCS8vIE1hcmtkb3duIHB1bmN0dWF0aW9uIGlzIGJhY2tzbGFzaC1lc2NhcGVkOyA8ID4gJiBhbmQgZyBiZWNvbWUKCS8vIHJlZmVyZW5jZXMsIHNvIG5vIEhUTUwsIGVudGl0eSBvciAiIGcxLi4uIiBhZGRyZXNzIG1lbnRpb24gKGEgZ25vd2ViCgkvLyB1c2VyIGxpbmspIGNhbiBmb3JtLgoJbWRDbGFzcyA9ICJlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZSIgKwoJCSIuYmJiYi5lYmJiYmIuYmJiLi4uLi4uLi4uLmIuZWJlLiIgKwoJCSJiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5iYmJiYiIgKwoJCSJiLi4uLi4uZS4uLi4uLi4uLi4uLi4uLi4uLi5iYmJiZSIKCWhleERpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmIgopCgovLyBxIGFwcGVuZHMgcyBhcyBhIEpTT04gc3RyaW5nOyA8ID4gJiBhcmUgZXNjYXBlZCBzbyB0aGUgdGV4dCBzdGF5cyBpbmVydAovLyBpbiBIVE1MLgpmdW5jIHEoYiBbXWJ5dGUsIHMgc3RyaW5nKSBbXWJ5dGUgewoJYiA9IGdyb3coYiwgNipsZW4ocykrMikKCWIgPSBhcHBlbmQoYiwgJyInKQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQlzd2l0Y2ggYyA6PSBzW2ldOyBxQ2xhc3NbYyYweDdmXSB7CgkJY2FzZSAnLic6CgkJCWIgPSBhcHBlbmQoYiwgYykKCQljYXNlICdiJzoKCQkJYiA9IGFwcGVuZChiLCAnXFwnLCBjKQoJCWRlZmF1bHQ6CgkJCWIgPSBhcHBlbmQoYiwgJ1xcJywgJ3UnLCAnMCcsICcwJywgaGV4RGlnaXRzW2M+PjRdLCBoZXhEaWdpdHNbYyYweGZdKQoJCX0KCX0KCXJldHVybiBhcHBlbmQoYiwgJyInKQp9CgovLyBtZCBhcHBlbmRzIHMgd2l0aCBldmVyeSBjaGFyYWN0ZXIgTWFya2Rvd24sIEhUTUwgb3IgZ25vd2ViIGNvdWxkIGFjdCBvbgovLyBtYWRlIGxpdGVyYWwuCmZ1bmMgbWQoYiBbXWJ5dGUsIHMgc3RyaW5nKSBbXWJ5dGUgewoJYiA9IGdyb3coYiwgNipsZW4ocykpCglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCXN3aXRjaCBjIDo9IHNbaV07IG1kQ2xhc3NbYyYweDdmXSB7CgkJY2FzZSAnLic6CgkJCWIgPSBhcHBlbmQoYiwgYykKCQljYXNlICdiJzoKCQkJYiA9IGFwcGVuZChiLCAnXFwnLCBjKQoJCWRlZmF1bHQ6IC8vICYjTk47IG9yICYjTk5OOwoJCQliID0gYXBwZW5kKGIsICcmJywgJyMnKQoJCQlpZiBjID49IDEwMCB7CgkJCQliID0gYXBwZW5kKGIsICcwJytjLzEwMCkKCQkJfQoJCQliID0gYXBwZW5kKGIsICcwJytjLzEwJTEwLCAnMCcrYyUxMCwgJzsnKQoJCX0KCX0KCXJldHVybiBiCn0KGtEHCghzZWVkLmdubxLEB3BhY2thZ2UgbWVtYmFfZ292CgovLyBUaGUgcHVibGljYXRpb24gcm9zdGVyIChHT1YtMSwgb3duZXIgZGVjaXNpb24gUTEgPSBBLCAyMDI2LTEwLTA2KS4KLy8gU2VhdGVkOiB0aGUgbWVtYmVycyB3aG9zZSBrZXkgaGFzIHNpZ25lZCBvbiBnbm9sYW5kLTEuIEludml0ZWQ6IHRoZSBvdGhlcgovLyBmb3VuZGluZyBtZW1iZXJzOyBlYWNoIHNlYXQgY291bnRzIG9ubHkgb25jZSBpdHMgb3duIGtleSBjYWxscyBKb2luLgovLyBSZWFkIG9uIGdub2xhbmQtMSBhdCBoNjI4MTg5IChub2RlX2luZm8ubmV0d29yayBjaGVja2VkKTogZWFjaCBzZWF0ZWQKLy8gYWRkcmVzcyBpcyByZS1kZXJpdmVkIGZyb20gdGhlIGFjY291bnQncyBvd24gcHVibGljIGtleTsgZ2hvc3QgYW5kIGRhZGlkb3UKLy8gYXJlIGF0IHNlcXVlbmNlIDAgd2l0aCBubyBrZXkuCgp0eXBlIHNlYXQgc3RydWN0IHsKCWlkICAgICBzdHJpbmcKCWFkZHIgICBhZGRyZXNzCgl3ZWlnaHQgaW50Cn0KCnZhciBzZWVkU2VhdGVkID0gW11zZWF0ewoJeyJ6eHhtYSIsICJnMTc0N3Q1bTJmMDhwbHFqbHJqazJxMHFsZDc0NjVoeHo4Z2t4NTljIiwgMn0sCgl7Im1pa2VjaXRvIiwgImcxY3ZyNDhyN2w3bGttdnA3N2NyNnpnMnpodTI2amdmd3IweThwZXciLCAxfSwKCXsiZGF2aWQiLCAiZzFyYXlmZ2tsd2wwYXNwejQ4OHd2cmNydnQ3dDJxdXk2cTA2bGdrMiIsIDF9LAoJeyJsb3VycyIsICJnMW52eHo5NHVrbWdnZng0bWxsZHdhZTNjcGRlOTlxbWxkdGNnbTl1IiwgMX0sCgl7Im1pa2FlbCIsICJnMWx5ZWp3d214ZWY1dG44bng2OXNheWttZ204cmxyNHhxOXllaDN6IiwgMX0sCn0KCnZhciBzZWVkSW52aXRlZCA9IFtdc2VhdHsKCXsiZ2hvc3QiLCAiZzEyeWc5bmg0bmNtYTQ0ZW1nbThtc3hlOGFhdnp5d3QwcDk1dGFudiIsIDF9LAoJeyJkYWRpZG91IiwgImcxampldXY0OGozcG1zbW52Z2E4andmbmMyYW1meXY5YzMwengwNHkiLCAxfSwKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEzMDAwMDAwdWdub3QSEQiAvrFKEgo3ODAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQKBNgPNinj67H+I7YSgEcNi/8+cL+rZRD6KXFJJ2j84AK3OtXaiIIe3yckVoP2fowjBs1LyeYGj02hmB3WAgMJsSQA9AxPrOIu/yaN/eOvowkRtSwPRMdVYUoAyXYIXt5hFWOrSQMCqkhbKr6QpjPRH/lHtJZzrOJL63Oa1E8UFesEMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=