Transaction executed successfully

Transaction Details

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

Transaction hash
1294686A2E8971729992E893D3FBDFF3AEB22E6E1FC4CDFA1A01FE3331A7DBD0

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
130,947,581
Gas consumed
FEE
300000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf25000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

Cr+ABgoML3ZtLm1fYWRkcGtnEq2ABgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhLw/wUKDm1lbWJhX25vdGVzX3YxEiFnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfbm90ZXNfdjEayCUKB2FjbC5nbm8SvCVwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJa2V5cyAiZ25vLmxhbmQvci9zYW1jcmV3L2VuY2tleXNfdjEiCgkic3RyaW5ncyIKKQoKZnVuYyB3cml0ZXIobiAqbm90ZSwgd2hvIGFkZHJlc3MpIGJvb2wgewoJZm9yIF8sIGEgOj0gcmFuZ2Ugbi5Xcml0ZXJzIHsKCQlpZiBhID09IHdobyB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KZnVuYyBjYW5Xcml0ZShjdXIgcmVhbG0sIG4gKm5vdGUsIHdobyBhZGRyZXNzKSBib29sIHsKCWlmIHdobyA9PSBuLk93bmVyIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJaWYgbi5Nb2RlID09IE1vZGVQdWJsaWNPcGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHdyaXRlcihuLCB3aG8pIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJaWYgZW5jcnlwdGVkKG4uTW9kZSkgJiYgIWNvbnRhaW5zKG4uUmVhZGVycywgd2hvKSB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBuLkdvdldyaXRlcnMgJiYgbi5Pd25lciA9PSBnb3ZBZGRyZXNzICYmIGdvdk1lbWJlcih3aG8pIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJcmV0dXJuIHBvbGljeUFsbG93cyhjdXIsIG4sIHdobywgT3BXcml0ZSkKfQpmdW5jIHJlcXVpcmVXcml0ZShjdXIgcmVhbG0sIG4gKm5vdGUsIHdobyBhZGRyZXNzKSB7CglpZiAhY2FuV3JpdGUoY3VyLCBuLCB3aG8pIHsKCQlwYW5pYygibm90ZXM6IHdyaXRlciByZXF1aXJlZCIpCgl9Cn0KZnVuYyBBZGRXcml0ZXIoY3VyIHJlYWxtLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgdG8gYWRkcmVzcywgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVBZGRXcml0ZXIoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIHRvLCBvcElEKQp9CmZ1bmMgbXV0YXRlQWRkV3JpdGVyKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCB0byBhZGRyZXNzLCBvcElEIFsxNl1ieXRlKSB7CgluIDo9IGxpdmUoaWQpCglvd25lcihuLCB3aG8pCglleHBlY3RlZChuLCBiYXNlUmV2aXNpb24pCglpZiAhcHVibGljKG4uTW9kZSkgewoJCXBhbmljKCJub3RlczogZW5jcnlwdGVkIEFDTCByZXF1aXJlcyBhdG9taWMgbWFuaWZlc3QiKQoJfQoJdG8gPSBrZXlzLkNhbm9uaWNhbEFkZHJlc3ModG8pCglpZiB0byA9PSBuLk93bmVyIHx8IHdyaXRlcihuLCB0bykgewoJCXBhbmljKCJub3Rlczogd3JpdGVyIGFscmVhZHkgcHJlc2VudCIpCgl9CglpZiBsZW4obi5Xcml0ZXJzKSA+PSBNYXhSZWFkZXJzIHsKCQlwYW5pYygibm90ZXM6IHRvbyBtYW55IHdyaXRlcnMiKQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCgluLldyaXRlcnMgPSBhcHBlbmQobi5Xcml0ZXJzLCB0bykKCXNoYXJlZEluZGV4LlNldChzdHJpbmcodG8pKyI6IitpbmRleEtleShuKSwgaWRUZXh0KGlkKSkKCWJ1bXAobiwgd2hvLCBvcElELCAid3JpdGVyLWFkZCIpCn0KZnVuYyBSZW1vdmVXcml0ZXIoY3VyIHJlYWxtLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgdG8gYWRkcmVzcywgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVSZW1vdmVXcml0ZXIoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIHRvLCBvcElEKQp9CmZ1bmMgbXV0YXRlUmVtb3ZlV3JpdGVyKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCB0byBhZGRyZXNzLCBvcElEIFsxNl1ieXRlKSB7CgluIDo9IGxpdmUoaWQpCglvd25lcihuLCB3aG8pCglleHBlY3RlZChuLCBiYXNlUmV2aXNpb24pCglpZiAhcHVibGljKG4uTW9kZSkgewoJCXBhbmljKCJub3RlczogZW5jcnlwdGVkIEFDTCByZXF1aXJlcyByb3RhdGlvbiIpCgl9Cgl0byA9IGtleXMuQ2Fub25pY2FsQWRkcmVzcyh0bykKCWlmICF3cml0ZXIobiwgdG8pIHsKCQlwYW5pYygibm90ZXM6IHdyaXRlciBtaXNzaW5nIikKCX0KCW9wZXJhdGlvbihuLCBvcElEKQoJZm9yIGksIGEgOj0gcmFuZ2Ugbi5Xcml0ZXJzIHsKCQlpZiBhID09IHRvIHsKCQkJbi5Xcml0ZXJzID0gYXBwZW5kKG4uV3JpdGVyc1s6aV0sIG4uV3JpdGVyc1tpKzE6XS4uLikKCQkJYnJlYWsKCQl9Cgl9CglzaGFyZWRJbmRleC5SZW1vdmUoc3RyaW5nKHRvKSArICI6IiArIGluZGV4S2V5KG4pKQoJYnVtcChuLCB3aG8sIG9wSUQsICJ3cml0ZXItcmVtb3ZlIikKfQpmdW5jIFByb3Bvc2VPd25lcihjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCB0byBhZGRyZXNzLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVByb3Bvc2VPd25lcihjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgdG8sIG9wSUQpCn0KZnVuYyBtdXRhdGVQcm9wb3NlT3duZXIoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIHRvIGFkZHJlc3MsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCW93bmVyKG4sIHdobykKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmIHRvICE9ICIiIHsKCQl0byA9IGtleXMuQ2Fub25pY2FsQWRkcmVzcyh0bykKCX0KCWlmIHRvID09IG4uT3duZXIgewoJCXBhbmljKCJub3RlczogYWxyZWFkeSBvd25lciIpCgl9CglvcGVyYXRpb24obiwgb3BJRCkKCW4uUGVuZGluZ093bmVyID0gdG8KCWJ1bXAobiwgd2hvLCBvcElELCAib3duZXItcHJvcG9zZSIpCn0KZnVuYyBBY2NlcHRPd25lcnNoaXAoY3VyIHJlYWxtLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVBY2NlcHRPd25lcnNoaXAoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIG9wSUQpCn0KZnVuYyBtdXRhdGVBY2NlcHRPd25lcnNoaXAoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmIG4uUGVuZGluZ093bmVyID09ICIiIHx8IHdobyAhPSBuLlBlbmRpbmdPd25lciB7CgkJcGFuaWMoIm5vdGVzOiBwZW5kaW5nIG93bmVyIHJlcXVpcmVkIikKCX0KCWlzUmVhbG0gOj0gc3RyaW5ncy5IYXNQcmVmaXgoY3VyLlByZXZpb3VzKCkuUGtnUGF0aCgpLCAiZ25vLmxhbmQvci8iKSB8fCB3aG8gPT0gZ292QWRkcmVzcwoJaWYgZW5jcnlwdGVkKG4uTW9kZSkgJiYgKCFpc1JlYWxtICYmICFjb250YWlucyhuLlJlYWRlcnMsIHdobykgfHwgaXNSZWFsbSAmJiBuLk1vZGUgPT0gTW9kZVByaXZhdGUpIHsKCQlwYW5pYygibm90ZXM6IGVuY3J5cHRlZCBvd25lcnNoaXAgcmVxdWlyZXMgY3VycmVudCB3cmFwL3NoYXJlZCBtb2RlIikKCX0KCWlmIG4uT3duZXJHZW5lcmF0aW9uID09IF51aW50NjQoMCkgewoJCXBhbmljKCJub3Rlczogb3duZXIgZ2VuZXJhdGlvbiBleGhhdXN0ZWQiKQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCgl1bmluZGV4KG4pCgluLk93bmVySXNSZWFsbSA9IGlzUmVhbG0KCXJlc2V0UHVibGljV3JpdGVzKG4pCgluLk93bmVyID0gd2hvCgluLlBlbmRpbmdPd25lciA9ICIiCgluLk93bmVyR2VuZXJhdGlvbisrCgluLkdvdldyaXRlcnMgPSBmYWxzZQoJaWYgZW5jcnlwdGVkKG4uTW9kZSkgewoJCXByZXNlcnZlVHJhbnNmZXJyZWRXcml0ZXJzKG4pCgl9CglpbmRleChuKQoJYnVtcChuLCB3aG8sIG9wSUQsICJvd25lci1hY2NlcHQiKQp9CmZ1bmMgU2V0TGlzdGVkKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGxpc3RlZCBib29sLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVNldExpc3RlZChjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgbGlzdGVkLCBvcElEKQp9CmZ1bmMgbXV0YXRlU2V0TGlzdGVkKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBsaXN0ZWQgYm9vbCwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJaWYgd2hvICE9IG4uT3duZXIgJiYgbW9kZXJhdG9yKHdobykgewoJCW11dGF0ZU1vZGVyYXRlTGlzdGluZyhjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgbGlzdGVkLCBvcElEKQoJCXJldHVybgoJfQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlwYW5pYygibm90ZXM6IHB1YmxpYyBub3RlIHJlcXVpcmVkIikKCX0KCW9wZXJhdGlvbihuLCBvcElEKQoJdW5pbmRleChuKQoJbi5MaXN0ZWQgPSBsaXN0ZWQKCWluZGV4KG4pCglidW1wKG4sIHdobywgb3BJRCwgImxpc3RpbmciKQp9CmZ1bmMgV3JpdGVyc0pTT04oaWRIZXggc3RyaW5nKSBzdHJpbmcgewoJbiA6PSBmaW5kKHJlYWRJRChpZEhleCkpCglvdXQgOj0gIlsiCglmb3IgaSwgYSA6PSByYW5nZSBuLldyaXRlcnMgewoJCWlmIGkgPiAwIHsKCQkJb3V0ICs9ICIsIgoJCX0KCQlvdXQgKz0gcShzdHJpbmcoYSkpCgl9CglyZXR1cm4gb3V0ICsgIl0iCn0KZnVuYyBMaXN0U2hhcmVkV2l0aEpTT04oYWRkciBhZGRyZXNzLCBjdXJzb3Igc3RyaW5nLCBsaW1pdCBpbnQpIHN0cmluZyB7CglyZXR1cm4gcGFnZShzaGFyZWRJbmRleCwgc3RyaW5nKGtleXMuQ2Fub25pY2FsQWRkcmVzcyhhZGRyKSkrIjoiLCBjdXJzb3IsIGxpbWl0KQp9ChqqCgoJYWRtaW4uZ25vEpwKcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICgKCSJjaGFpbiIKCWtleXMgImduby5sYW5kL3Ivc2FtY3Jldy9lbmNrZXlzX3YxIgopCgpmdW5jIGFkbWluaXN0cmF0b3Iod2hvIGFkZHJlc3MpIHsKCWlmIHdobyAhPSBhZG1pbiB7CgkJcGFuaWMoIm5vdGVzOiBhZG1pbiByZXF1aXJlZCIpCgl9Cn0KZnVuYyBTZXRDcmVhdGVGZWUoY3VyIHJlYWxtLCBmZWUgaW50NjQpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJYWRtaW5pc3RyYXRvcih3aG8pCglpZiBmZWUgPCAwIHx8IGZlZSA+IDEwMDAwMDAgewoJCXBhbmljKCJub3RlczogZmVlIG91dCBvZiByYW5nZSIpCgl9CgljcmVhdGVGZWUgPSBmZWUKfQpmdW5jIFNldFRyZWFzdXJ5KGN1ciByZWFsbSwgdG8gYWRkcmVzcykgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCglhZG1pbmlzdHJhdG9yKHdobykKCXRvID0ga2V5cy5DYW5vbmljYWxBZGRyZXNzKHRvKQoJaWYgdG8gPT0gY3VyLkFkZHJlc3MoKSB8fCB0byA9PSBjaGFpbi5EZXJpdmVTdG9yYWdlRGVwb3NpdEFkZHIoUmVhbG1QYXRoKSB7CgkJcGFuaWMoIm5vdGVzOiBsb2NrZWQgdHJlYXN1cnkiKQoJfQoJdHJlYXN1cnkgPSB0bwp9CmZ1bmMgUGF1c2UoY3VyIHJlYWxtLCBvbiBib29sKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCWFkbWluaXN0cmF0b3Iod2hvKQoJcGF1c2VkID0gb24KfQpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCB0byBhZGRyZXNzKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCWFkbWluaXN0cmF0b3Iod2hvKQoJdG8gPSBrZXlzLkNhbm9uaWNhbEFkZHJlc3ModG8pCglpZiB0byA9PSBnb3ZBZGRyZXNzIHsKCQlwYW5pYygibm90ZXM6IGdvdmVybmFuY2UgY2Fubm90IGFjY2VwdCByZWFsbSBhZG1pbmlzdHJhdGlvbiIpCgl9CglwZW5kaW5nQWRtaW4gPSB0bwp9CmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCWlmIHdobyAhPSBwZW5kaW5nQWRtaW4gfHwgcGVuZGluZ0FkbWluID09ICIiIHsKCQlwYW5pYygibm90ZXM6IHBlbmRpbmcgYWRtaW4gcmVxdWlyZWQiKQoJfQoJYWRtaW4gPSB3aG8KCXBlbmRpbmdBZG1pbiA9ICIiCn0KCi8vIEdldEFkbWluIHN1cHBsaWVzIHRoZSBjbG9zZWQgYXV0aG9yaXR5IHJlYWRiYWNrIHVzZWQgYnkgZGVwbG95bWVudCByZWhlYXJzYWwuCmZ1bmMgR2V0QWRtaW4oKSBhZGRyZXNzIHsgcmV0dXJuIGFkbWluIH0KGtYnCgpiYWNrdXAuZ25vEscncGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICgKCSJieXRlcyIKCSJjaGFpbi9ydW50aW1lIgoJImNyeXB0by9iZWNoMzIiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9iaW5hcnkiCgkiZW5jb2RpbmcvaGV4IgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCglrZXlzICJnbm8ubGFuZC9yL3NhbWNyZXcvZW5ja2V5c192MSIKCSJzdHJjb252IgoJInN0cmluZ3MiCikKCmNvbnN0IE1heEJhY2t1cEJ5dGVzID0gMzY1Cgp0eXBlIGJhY2t1cFJlY29yZCBzdHJ1Y3QgewoJUmVjb3JkICAgICAgICAgICAgICAgW11ieXRlCglNb2RlICAgICAgICAgICAgICAgICB1aW50OAoJR2VuZXJhdGlvbiwgUmV2aXNpb24gdWludDY0CglQdWJsaWNLZXlIYXNoICAgICAgICBbXWJ5dGUKCUxhc3QgICAgICAgICAgICAgICAgIHJlY2VpcHQKfQoKdmFyIGJhY2t1cExhdGVzdCA9IGF2bC5OZXdUcmVlKCkKdmFyIGJhY2t1cHMgPSBhdmwuTmV3VHJlZSgpCgovLyBBIHdhbGxldC1wcm90ZWN0ZWQgaGlzdG9yaWNhbCBiYWNrdXAgY2Fubm90IGJlY29tZSBWYXVsdC1zYWZlIGJ5IHJlbGFiZWxsaW5nLgp2YXIgc3RhbmRhcmRCYWNrdXBLZXlzID0gYXZsLk5ld1RyZWUoKQoKZnVuYyBiYWNrdXBLZXkod2hvIGFkZHJlc3MsIGdlbmVyYXRpb24gdWludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQoZ2VuZXJhdGlvbiwgMTApCglyZXR1cm4gc3RyaW5nKHdobykgKyAiOiIgKyBzdHJpbmdzLlJlcGVhdCgiMCIsIDIwLWxlbihzKSkgKyBzCn0KZnVuYyBiYWNrdXBUZXh0KHJlY29yZCBbXWJ5dGUsIHBvcywgY2FwIGludCkgKHN0cmluZywgaW50KSB7CglpZiBwb3MrNCA+IGxlbihyZWNvcmQpIHsKCQlwYW5pYygibm90ZXM6IGJhY2t1cCB0cnVuY2F0ZWQiKQoJfQoJc2l6ZSA6PSBpbnQoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIocmVjb3JkW3BvcyA6IHBvcys0XSkpCglwb3MgKz0gNAoJaWYgc2l6ZSA8IDEgfHwgc2l6ZSA+IGNhcCB8fCBwb3Mrc2l6ZSA+IGxlbihyZWNvcmQpIHsKCQlwYW5pYygibm90ZXM6IGJhY2t1cCB0ZXh0IGxlbmd0aCIpCgl9Cglmb3IgXywgYiA6PSByYW5nZSByZWNvcmRbcG9zIDogcG9zK3NpemVdIHsKCQlpZiBiIDwgMzMgfHwgYiA+IDEyNiB7CgkJCXBhbmljKCJub3RlczogYmFja3VwIGFzY2lpIikKCQl9Cgl9CglyZXR1cm4gc3RyaW5nKHJlY29yZFtwb3MgOiBwb3Mrc2l6ZV0pLCBwb3MgKyBzaXplCn0KZnVuYyB2YWxpZGF0ZUJhY2t1cCh3aG8gYWRkcmVzcywgcmVjb3JkIFtdYnl0ZSkgKHVpbnQ4LCB1aW50NjQsIFtdYnl0ZSkgewoJaWYgbGVuKHJlY29yZCkgPCAxODUgfHwgbGVuKHJlY29yZCkgPiBNYXhCYWNrdXBCeXRlcyB8fCBzdHJpbmcocmVjb3JkWzo0XSkgIT0gIk1OS0IiIHx8IHJlY29yZFs0XSAhPSAxIHx8IHJlY29yZFs1XSAhPSAxIHsKCQlwYW5pYygibm90ZXM6IGJhY2t1cCBmb3JtYXQiKQoJfQoJbW9kZSA6PSByZWNvcmRbNl0KCWtkZiA6PSByZWNvcmRbN10KCW1lbW9yeSA6PSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihyZWNvcmRbODoxMl0pCglwYXNzZXMgOj0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIocmVjb3JkWzEyOjE2XSkKCWxhbmVzIDo9IHJlY29yZFsxNl0KCWlmICEobW9kZSA9PSAxICYmIGtkZiA9PSAxICYmIG1lbW9yeSA9PSAwICYmIHBhc3NlcyA9PSAwICYmIGxhbmVzID09IDAgfHwgbW9kZSA9PSAyICYmIGtkZiA9PSAyICYmIG1lbW9yeSA9PSA2NTUzNiAmJiBwYXNzZXMgPT0gMyAmJiBsYW5lcyA9PSAxKSB7CgkJcGFuaWMoIm5vdGVzOiBiYWNrdXAga2RmIHByb2ZpbGUiKQoJfQoJY2hhaW4sIHBvcyA6PSBiYWNrdXBUZXh0KHJlY29yZCwgMzMsIDY0KQoJcmVhbG1QYXRoLCBwb3MgOj0gYmFja3VwVGV4dChyZWNvcmQsIHBvcywgMTI4KQoJaWYgY2hhaW4gIT0gcnVudGltZS5DaGFpbklEKCkgfHwgcmVhbG1QYXRoICE9IFJlYWxtUGF0aCB8fCBsZW4ocmVjb3JkKSAhPSBwb3MrMTMyIHsKCQlwYW5pYygibm90ZXM6IGJhY2t1cCBuZXR3b3JrL2xlbmd0aCIpCgl9CgllbmNvZGVkLCBlcnIgOj0gYmVjaDMyLkVuY29kZUZyb21CYXNlMjU2KCJnIiwgcmVjb3JkW3Bvczpwb3MrMjBdKQoJaWYgZXJyICE9IG5pbCB8fCBhZGRyZXNzKGVuY29kZWQpICE9IHdobyB7CgkJcGFuaWMoIm5vdGVzOiBiYWNrdXAgYWRkcmVzcyIpCgl9Cglwb3MgKz0gMjAKCWdlbmVyYXRpb24gOj0gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQocmVjb3JkW3BvcyA6IHBvcys4XSkKCXBvcyArPSA4CgloYXNoIDo9IHJlY29yZFtwb3MgOiBwb3MrMzJdCglwaywgZ2VuLCBhY3RpdmUgOj0ga2V5cy5HZXRLZXkod2hvLCBrZXlzLlN1aXRlWFdpbmdWMSkKCWggOj0gc2hhMjU2LlN1bTI1NihwaykKCWlmIGdlbmVyYXRpb24gPT0gMCB8fCBnZW5lcmF0aW9uICE9IGdlbiB8fCAhYWN0aXZlIHx8ICFieXRlcy5FcXVhbChoYXNoLCBoWzpdKSB7CgkJcGFuaWMoIm5vdGVzOiBiYWNrdXAgcmVnaXN0cnkgaWRlbnRpdHkiKQoJfQoJcmV0dXJuIG1vZGUsIGdlbmVyYXRpb24sIGNvcGllZChoYXNoKQp9CmZ1bmMgU2V0U2VlZEJhY2t1cChjdXIgcmVhbG0sIGJhc2VSZXZpc2lvbiB1aW50NjQsIHJlY29yZCBbXWJ5dGUsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoIm5vdGVzOiBiYWNrdXAgZGlyZWN0bHkgZnJvbSBhY2NvdW50IikKCX0KCWlmIG9wSUQgPT0gKFsxNl1ieXRle30pIHx8IGJhc2VSZXZpc2lvbiA9PSBedWludDY0KDApIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgYmFja3VwIG9wZXJhdGlvbiIpCgl9Cgl2YXIgcmV2aXNpb24gdWludDY0CglpZiB2LCBvayA6PSBiYWNrdXBMYXRlc3QuR2V0KHN0cmluZyh3aG8pKTsgb2sgewoJCXIgOj0gdi4oKmJhY2t1cFJlY29yZCkKCQlyZXZpc2lvbiA9IHIuUmV2aXNpb24KCQlpZiByLkxhc3QuT3BlcmF0aW9uID09IG9wSUQgewoJCQlwYW5pYygibm90ZXM6IG9wZXJhdGlvbiBpZCByZXVzZWQiKQoJCX0KCX0KCWlmIHJldmlzaW9uICE9IGJhc2VSZXZpc2lvbiB7CgkJcGFuaWMoIm5vdGVzOiBzdGFsZSBiYWNrdXAgcmV2aXNpb24iKQoJfQoJbW9kZSwgZ2VuZXJhdGlvbiwgaGFzaCA6PSB2YWxpZGF0ZUJhY2t1cCh3aG8sIHJlY29yZCkKCWV4cG9zdXJlS2V5IDo9IHN0cmluZyh3aG8pICsgIjoiICsgaGV4LkVuY29kZVRvU3RyaW5nKGhhc2gpCglpZiBtb2RlID09IDIgewoJCWlmIF8sIHNlZW4gOj0gc3RhbmRhcmRCYWNrdXBLZXlzLkdldChleHBvc3VyZUtleSk7IHNlZW4gewoJCQlwYW5pYygibm90ZXM6IHZhdWx0IHJlcXVpcmVzIGluZGVwZW5kZW50IGlkZW50aXR5IikKCQl9Cgl9IGVsc2UgewoJCXN0YW5kYXJkQmFja3VwS2V5cy5TZXQoZXhwb3N1cmVLZXksIHRydWUpCgl9CglyIDo9ICZiYWNrdXBSZWNvcmR7Y29waWVkKHJlY29yZCksIG1vZGUsIGdlbmVyYXRpb24sIHJldmlzaW9uICsgMSwgaGFzaCwgcmVjZWlwdHtvcElELCB3aG8sIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKX19CgliYWNrdXBzLlNldChiYWNrdXBLZXkod2hvLCBnZW5lcmF0aW9uKSwgcikKCWJhY2t1cExhdGVzdC5TZXQoc3RyaW5nKHdobyksIHIpCn0KZnVuYyBiYWNrdXBKU09OKHIgKmJhY2t1cFJlY29yZCwgd2l0aFJlY29yZCBib29sKSBzdHJpbmcgewoJcyA6PSBgeyJtb2RlIjpgICsgc3RyY29udi5JdG9hKGludChyLk1vZGUpKSArIGAsInN1aXRlIjoieHdpbmctdjEiLCJnZW5lcmF0aW9uIjpgICsgdShyLkdlbmVyYXRpb24pICsgYCwicmV2aXNpb24iOmAgKyB1KHIuUmV2aXNpb24pICsgYCwicHVibGljX2tleV9oYXNoIjpgICsgYmxvYihyLlB1YmxpY0tleUhhc2gpICsgYCwib3BfaWQiOmAgKyBxKGlkVGV4dChyLkxhc3QuT3BlcmF0aW9uKSkgKyBgLCJhY3RvciI6YCArIHEoc3RyaW5nKHIuTGFzdC5BY3RvcikpICsgYCwiaGVpZ2h0IjpgICsgcShzdHJjb252LkZvcm1hdEludChyLkxhc3QuSGVpZ2h0LCAxMCkpCglpZiB3aXRoUmVjb3JkIHsKCQlzICs9IGAsInJlY29yZCI6YCArIGJsb2Ioci5SZWNvcmQpCgl9CglyZXR1cm4gcyArIGB9YAp9CmZ1bmMgU2VlZEJhY2t1cEpTT04od2hvIGFkZHJlc3MpIHN0cmluZyB7Cgl2LCBvayA6PSBiYWNrdXBMYXRlc3QuR2V0KHN0cmluZyhrZXlzLkNhbm9uaWNhbEFkZHJlc3Mod2hvKSkpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBiYWNrdXBKU09OKHYuKCpiYWNrdXBSZWNvcmQpLCB0cnVlKQp9CmZ1bmMgU2VlZEJhY2t1cEF0SlNPTih3aG8gYWRkcmVzcywgZ2VuZXJhdGlvbiB1aW50NjQpIHN0cmluZyB7Cgl2LCBvayA6PSBiYWNrdXBzLkdldChiYWNrdXBLZXkoa2V5cy5DYW5vbmljYWxBZGRyZXNzKHdobyksIGdlbmVyYXRpb24pKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gYmFja3VwSlNPTih2LigqYmFja3VwUmVjb3JkKSwgdHJ1ZSkKfQpmdW5jIFNlZWRCYWNrdXBzSlNPTih3aG8gYWRkcmVzcywgY3Vyc29yIHVpbnQ2NCwgbGltaXQgaW50KSBzdHJpbmcgewoJd2hvID0ga2V5cy5DYW5vbmljYWxBZGRyZXNzKHdobykKCWlmIGxpbWl0IDwgMSB8fCBsaW1pdCA+IE1heFBhZ2UgewoJCXBhbmljKCJub3RlczogcGFnZSBsaW1pdCIpCgl9CglpdGVtcyA6PSBbXXN0cmluZ3t9Cgl2YXIgbmV4dCB1aW50NjQKCWJhY2t1cHMuSXRlcmF0ZShiYWNrdXBLZXkod2hvLCBjdXJzb3IpLCBzdHJpbmcod2hvKSsiOlx4ZmYiLCBmdW5jKGsgc3RyaW5nLCB2IGludGVyZmFjZXt9KSBib29sIHsKCQlyIDo9IHYuKCpiYWNrdXBSZWNvcmQpCgkJaWYgci5HZW5lcmF0aW9uIDw9IGN1cnNvciB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpdGVtcyA9IGFwcGVuZChpdGVtcywgYmFja3VwSlNPTihyLCBmYWxzZSkpCgkJbmV4dCA9IHIuR2VuZXJhdGlvbgoJCXJldHVybiBsZW4oaXRlbXMpID09IGxpbWl0Cgl9KQoJaWYgbGVuKGl0ZW1zKSA8IGxpbWl0IHsKCQluZXh0ID0gMAoJfQoJcmV0dXJuIGB7Iml0ZW1zIjpbYCArIHN0cmluZ3MuSm9pbihpdGVtcywgIiwiKSArIGBdLCJuZXh0X2N1cnNvciI6YCArIHUobmV4dCkgKyBgfWAKfQoa9xAKEGNhcGFiaWxpdGllcy5nbm8S4hBwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkic3RyY29udiIKKQoKLy8gT25seSBleHBsaWNpdCBwdWJsaWMgZ3JhbnRzIGFyZSBzdG9yZWQuIFByaXZhdGUgbm90ZXMga2VlcCB0aGVpciBleGlzdGluZyBBQ0wuCnZhciBwdWJsaWNXcml0ZUdyYW50cyA9IGF2bC5OZXdUcmVlKCkKCmZ1bmMgcHVibGljV3JpdGVzRW5hYmxlZChuICpub3RlKSBib29sIHsKCV8sIGdyYW50ZWQgOj0gcHVibGljV3JpdGVHcmFudHMuR2V0KGlkVGV4dChuLklEKSkKCXJldHVybiAhbi5EZWxldGVkICYmIG4uTW9kZSA9PSBNb2RlUHVibGljT3BlbiAmJiBncmFudGVkCn0KZnVuYyByZXNldFB1YmxpY1dyaXRlcyhuICpub3RlKSB7CglpZiBfLCBncmFudGVkIDo9IHB1YmxpY1dyaXRlR3JhbnRzLkdldChpZFRleHQobi5JRCkpOyBncmFudGVkIHsKCQlwdWJsaWNXcml0ZUdyYW50cy5SZW1vdmUoaWRUZXh0KG4uSUQpKQoJfQp9CgovLyBDb21tdW5pdHkgZWRpdGluZyBuZXZlciBncmFudHMgUmVzb2x2ZUNvbW1lbnQgb3IgYW55IG93bmVyL21vZGVyYXRvciBhY3Rpb24uCi8vIEtlZXAgcmVxdWlyZVdyaXRlIHVuY2hhbmdlZCBmb3IgdGhvc2UgZXhpc3RpbmcgcGVybWlzc2lvbnMuCi8vIFdoaWxlIHBhdXNlZCB0aGUgZ3JhbnQgaXMgaWdub3JlZCwgc28gb25seSB0aGUgZXhpc3RpbmcgQUNMIGNhbiBlZGl0LgpmdW5jIHJlcXVpcmVDb250ZW50V3JpdGUoY3VyIHJlYWxtLCBuICpub3RlLCB3aG8gYWRkcmVzcykgewoJaWYgIXBhdXNlZCAmJiBwdWJsaWNXcml0ZXNFbmFibGVkKG4pICYmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcmV0dXJuCgl9CglyZXF1aXJlV3JpdGUoY3VyLCBuLCB3aG8pCn0KCmZ1bmMgU2V0UHVibGljV3JpdGVzKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9uIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbXV0YXRlU2V0UHVibGljV3JpdGVzKGN1ciwgd2hvLCBpZCwgYmFzZVJldmlzaW9uLCBvbiwgb3BJRCkKfQpmdW5jIG11dGF0ZVNldFB1YmxpY1dyaXRlcyhjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgb24gYm9vbCwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgbi5Nb2RlICE9IE1vZGVQdWJsaWNPcGVuIHsKCQlwYW5pYygibm90ZXM6IHB1YmxpYy1vcGVuIG5vdGUgcmVxdWlyZWQiKQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCglpZiBwdWJsaWNXcml0ZXNFbmFibGVkKG4pID09IG9uIHsKCQlwYW5pYygibm90ZXM6IHB1YmxpYyB3cml0ZXMgdW5jaGFuZ2VkIikKCX0KCWlmIG9uIHsKCQlwdWJsaWNXcml0ZUdyYW50cy5TZXQoaWRUZXh0KGlkKSwgdHJ1ZSkKCX0gZWxzZSB7CgkJcmVzZXRQdWJsaWNXcml0ZXMobikKCX0KCWJ1bXAobiwgd2hvLCBvcElELCAicHVibGljLXdyaXRlcyIpCn0KCi8vIFNlcGFyYXRlIHNjaGVtYTogZXhpc3RpbmcgTm90ZUpTT04gY29uc3VtZXJzIHJldGFpbiB0aGVpciBleGFjdCBmaWVsZCBzZXQuCmZ1bmMgUHVibGljQ2FwYWJpbGl0aWVzSlNPTihpZEhleCBzdHJpbmcpIHN0cmluZyB7Cgl2LCBvayA6PSBub3Rlcy5HZXQoaWRUZXh0KHJlYWRJRChpZEhleCkpKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CgluIDo9IHYuKCpub3RlKQoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gYHsic2NoZW1hIjoibWVtYmEtbm90ZXMvcHVibGljLWNhcGFiaWxpdGllcy92MSIsImlkIjpgICsgcShpZFRleHQobi5JRCkpICsgYCwic3RhdGVfcmV2aXNpb24iOmAgKyB1KG4uUmV2aXNpb24pICsgYCwib3duZXJfZ2VuZXJhdGlvbiI6YCArIHUobi5Pd25lckdlbmVyYXRpb24pICsgYCwibW9kZSI6YCArIHN0cmNvbnYuSXRvYShpbnQobi5Nb2RlKSkgKyBgLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKG4uRGVsZXRlZCkgKyBgLCJhbGxvd19wdWJsaWNfd3JpdGVzIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHB1YmxpY1dyaXRlc0VuYWJsZWQobikpICsgYH1gCn0KGt4ICgpjaHVua3MuZ25vEs8IcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICJzdHJjb252IgoKY29uc3QgTWF4Qm9keUNodW5rQnl0ZXMgPSA4MTkyCgpmdW5jIE5vdGVNZXRhSlNPTihpZEhleCBzdHJpbmcpIHN0cmluZyB7Cgl2LCBvayA6PSBub3Rlcy5HZXQoaWRUZXh0KHJlYWRJRChpZEhleCkpKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gbm90ZUpTT04odi4oKm5vdGUpLCBmYWxzZSkKfQoKLy8gRWFjaCBwYWdlIGlzIHRpZWQgdG8gdGhlIGNvbXBsZXRlIHN0YXRlIHJldmlzaW9uLCBpbmNsdWRpbmcgYWNjZXNzL21vZGUgYW5kCi8vIGVwb2NoIGNoYW5nZXMuIENsaWVudHMgY29uY2F0ZW5hdGUgYmluYXJ5IGNodW5rcyBiZWZvcmUgZGVjb2RpbmcgVVRGOC9BRUFELgpmdW5jIE5vdGVCb2R5Q2h1bmtKU09OKGlkSGV4IHN0cmluZywgZXhwZWN0ZWRSZXZpc2lvbiB1aW50NjQsIG9mZnNldCwgbGltaXQgaW50KSBzdHJpbmcgewoJbiA6PSBmaW5kKHJlYWRJRChpZEhleCkpCglpZiBleHBlY3RlZFJldmlzaW9uICE9IG4uUmV2aXNpb24gewoJCXBhbmljKCJub3Rlczogc3RhbGUgYm9keSByZXZpc2lvbiIpCgl9CglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiBNYXhCb2R5Q2h1bmtCeXRlcyB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+IG4uQm9keUJ5dGVzIHsKCQlwYW5pYygibm90ZXM6IGJvZHkgY2h1bmsgYm91bmRzIikKCX0KCWVuZCA6PSBvZmZzZXQgKyBsaW1pdAoJaWYgZW5kID4gbi5Cb2R5Qnl0ZXMgewoJCWVuZCA9IG4uQm9keUJ5dGVzCgl9CglyZXR1cm4gYHsiaWQiOmAgKyBxKGlkVGV4dChuLklEKSkgKyBgLCJzdGF0ZV9yZXZpc2lvbiI6YCArIHUobi5SZXZpc2lvbikgKyBgLCJib2R5X3JldmlzaW9uIjpgICsgdShuLkJvZHlSZXZpc2lvbikgKyBgLCJlcG9jaCI6YCArIHUodWludDY0KG4uRXBvY2gpKSArIGAsIm9mZnNldCI6YCArIHEoc3RyY29udi5JdG9hKG9mZnNldCkpICsgYCwidG90YWwiOmAgKyBxKHN0cmNvbnYuSXRvYShuLkJvZHlCeXRlcykpICsgYCwibmV4dF9vZmZzZXQiOmAgKyBxKHN0cmNvbnYuSXRvYShlbmQpKSArIGAsImNodW5rX2Jsb2IiOmAgKyBibG9iKG4uQm9keVtvZmZzZXQ6ZW5kXSkgKyBgfWAKfQoakkYKDGNvbW1lbnRzLmdubxKBRnBhY2thZ2UgbWVtYmFfbm90ZXNfdjEKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvYXZsIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ1bmljb2RlL3V0ZjgiCikKCmNvbnN0IE1heENvbW1lbnRCeXRlcyA9IDQwMDAKY29uc3QgTWF4QW5jaG9yQnl0ZXMgPSA2MDAKY29uc3QgQ29tbWVudENvb2xkb3duQmxvY2tzIGludDY0ID0gMTAKY29uc3QgTWF4Q29tbWVudFBhZ2UgPSA1Cgp0eXBlIGNvbW1lbnQgc3RydWN0IHsKCVNlcXVlbmNlICAgICAgICAgICAgICAgICAgdWludDY0CglJRCwgUGFyZW50ICAgICAgICAgICAgICAgIFsxNl1ieXRlCglBdXRob3IgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKCUJvZHlSZXZpc2lvbiAgICAgICAgICAgICAgdWludDY0CglFcG9jaCAgICAgICAgICAgICAgICAgICAgIHVpbnQzMgoJQW5jaG9yLCBCb2R5ICAgICAgICAgICAgICBbXWJ5dGUKCVJldmlzaW9uICAgICAgICAgICAgICAgICAgdWludDY0CglDcmVhdGVkSGVpZ2h0ICAgICAgICAgICAgIGludDY0CglMYXN0ICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQKCURlbGV0ZWQsIEhpZGRlbiwgUmVzb2x2ZWQgYm9vbAoJRW5jcnlwdGVkICAgICAgICAgICAgICAgICBib29sCn0KCnZhciBjb21tZW50cyA9IGF2bC5OZXdUcmVlKCkKdmFyIGNvbW1lbnRJbmRleCA9IGF2bC5OZXdUcmVlKCkKdmFyIGNvb2xkb3ducyA9IGF2bC5OZXdUcmVlKCkKCmZ1bmMgY29tbWVudEtleShpZCwgY2lkIFsxNl1ieXRlKSBzdHJpbmcgeyByZXR1cm4gaWRUZXh0KGlkKSArICI6IiArIGlkVGV4dChjaWQpIH0KZnVuYyBnZXRDb21tZW50KGlkLCBjaWQgWzE2XWJ5dGUpICpjb21tZW50IHsKCXYsIG9rIDo9IGNvbW1lbnRzLkdldChjb21tZW50S2V5KGlkLCBjaWQpKQoJaWYgIW9rIHsKCQlwYW5pYygibm90ZXM6IGNvbW1lbnQgbWlzc2luZyIpCgl9CglyZXR1cm4gdi4oKmNvbW1lbnQpCn0KZnVuYyBjb21tZW50RXhwZWN0ZWQoYyAqY29tbWVudCwgcmV2IHVpbnQ2NCwgb3AgWzE2XWJ5dGUpIHsKCWlmIGMuUmV2aXNpb24gIT0gcmV2IHx8IHJldiA9PSBedWludDY0KDApIHsKCQlwYW5pYygibm90ZXM6IHN0YWxlIGNvbW1lbnQgcmV2aXNpb24iKQoJfQoJaWYgb3AgPT0gKFsxNl1ieXRle30pIHx8IGMuTGFzdC5PcGVyYXRpb24gPT0gb3AgewoJCXBhbmljKCJub3RlczogaW52YWxpZCBjb21tZW50IG9wZXJhdGlvbiIpCgl9Cn0KZnVuYyBjb21tZW50UmVjZWlwdChjICpjb21tZW50LCB3aG8gYWRkcmVzcywgb3AgWzE2XWJ5dGUpIHsKCWMuUmV2aXNpb24rKwoJYy5MYXN0ID0gcmVjZWlwdHtvcCwgd2hvLCBydW50aW1lLkNoYWluSGVpZ2h0KCl9Cn0KZnVuYyBtYXlDb21tZW50KGN1ciByZWFsbSwgbiAqbm90ZSwgd2hvIGFkZHJlc3MpIGJvb2wgewoJaWYgbi5Nb2RlID09IE1vZGVQdWJsaWNPcGVuIHsKCQlyZXR1cm4gdHJ1ZQoJfQoJaWYgbi5Nb2RlID09IE1vZGVQdWJsaWMgewoJCXJldHVybiB3aG8gPT0gbi5Pd25lciB8fCB3cml0ZXIobiwgd2hvKSB8fCBuLkdvdldyaXRlcnMgJiYgbi5Pd25lciA9PSBnb3ZBZGRyZXNzICYmIGdvdk1lbWJlcih3aG8pIHx8IHBvbGljeUFsbG93cyhjdXIsIG4sIHdobywgT3BDb21tZW50KQoJfQoJaWYgbi5Nb2RlID09IE1vZGVTaGFyZWQgewoJCXJldHVybiBjb250YWlucyhuLlJlYWRlcnMsIHdobykKCX0KCXJldHVybiBmYWxzZQp9CgovLyBQdWJsaWMgY29tbWVudHMgY2FycnkgVVRGOCBhbmNob3IvYm9keSBzZXBhcmF0ZWx5LiBFbmNyeXB0ZWQgY29tbWVudHMgd2lsbAovLyBjYXJyeSB0aGVpciBjb21iaW5lZCBhdXRoZW50aWNhdGVkIHBheWxvYWQgaW4gQm9keSBhbmQgYW4gZW1wdHkgQW5jaG9yLgpmdW5jIEFkZENvbW1lbnQoY3VyIHJlYWxtLCBpZCwgY2lkIFsxNl1ieXRlLCBib2R5UmV2aXNpb24gdWludDY0LCBlcG9jaCB1aW50MzIsIHBhcmVudCBbMTZdYnl0ZSwgYW5jaG9yLCBib2R5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgluIDo9IGxpdmUoaWQpCglpZiBwYXVzZWQgewoJCXBhbmljKCJub3RlczogY29tbWVudHMgcGF1c2VkIikKCX0KCWlmICFtYXlDb21tZW50KGN1ciwgbiwgd2hvKSB7CgkJcGFuaWMoIm5vdGVzOiBjb21tZW50cyBkZW5pZWQiKQoJfQoJaWYgY2lkID09IChbMTZdYnl0ZXt9KSB8fCBvcElEID09IChbMTZdYnl0ZXt9KSB7CgkJcGFuaWMoIm5vdGVzOiBlbXB0eSBjb21tZW50IGlkIikKCX0KCWlmIF8sIG9rIDo9IGNvbW1lbnRzLkdldChjb21tZW50S2V5KGlkLCBjaWQpKTsgb2sgewoJCXBhbmljKCJub3RlczogY29tbWVudCBpZCB1c2VkIikKCX0KCWlmIGJvZHlSZXZpc2lvbiA9PSAwIHx8IGJvZHlSZXZpc2lvbiA+IG4uQm9keVJldmlzaW9uIHx8IGVwb2NoICE9IG4uRXBvY2ggewoJCXBhbmljKCJub3RlczogYmFkIGNvbW1lbnQgYW5jaG9yIHZlcnNpb24iKQoJfQoJaWYgcHVibGljKG4uTW9kZSkgJiYgKGxlbihhbmNob3IpID4gTWF4QW5jaG9yQnl0ZXMgfHwgIXV0ZjguVmFsaWQoYW5jaG9yKSB8fCBsZW4oYm9keSkgPT0gMCB8fCBsZW4oYm9keSkgPiBNYXhDb21tZW50Qnl0ZXMgfHwgIXV0ZjguVmFsaWQoYm9keSkgfHwgdXRmOC5SdW5lQ291bnQoYm9keSkgPiAxMDAwKSB7CgkJcGFuaWMoIm5vdGVzOiBpbnZhbGlkIGNvbW1lbnQgcGF5bG9hZCIpCgl9Cglwcml2YXRlV3JpdGFibGUobikKCWlmIGVuY3J5cHRlZChuLk1vZGUpIHsKCQlpZiBsZW4oYW5jaG9yKSAhPSAwIHsKCQkJcGFuaWMoIm5vdGVzOiBlbmNyeXB0ZWQgYW5jaG9yIG11c3QgYmUgaW5zaWRlIHBheWxvYWQiKQoJCX0KCQl2YWxpZGF0ZUNpcGhlcihib2R5LCBuLkVwb2NoLCAzLCAxLCBNYXhDaXBoZXJDb21tZW50Qnl0ZXMpCgl9CglpZiBwYXJlbnQgIT0gKFsxNl1ieXRle30pIHsKCQlwIDo9IGdldENvbW1lbnQoaWQsIHBhcmVudCkKCQlpZiBwLkRlbGV0ZWQgewoJCQlwYW5pYygibm90ZXM6IHBhcmVudCBkZWxldGVkIikKCQl9Cgl9CgljayA6PSBpZFRleHQoaWQpICsgIjoiICsgc3RyaW5nKHdobykKCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglpZiB2LCBvayA6PSBjb29sZG93bnMuR2V0KGNrKTsgb2sgJiYgaC12LihpbnQ2NCkgPCBDb21tZW50Q29vbGRvd25CbG9ja3MgewoJCXBhbmljKCJub3RlczogY29tbWVudCBjb29sZG93biIpCgl9CglpZiBuLkNvbW1lbnRTZXF1ZW5jZSA9PSBedWludDY0KDApIHsKCQlwYW5pYygibm90ZXM6IGNvbW1lbnQgc2VxdWVuY2UgZXhoYXVzdGVkIikKCX0KCW4uQ29tbWVudFNlcXVlbmNlKysKCWMgOj0gJmNvbW1lbnR7U2VxdWVuY2U6IG4uQ29tbWVudFNlcXVlbmNlLCBFbmNyeXB0ZWQ6IGVuY3J5cHRlZChuLk1vZGUpLCBJRDogY2lkLCBQYXJlbnQ6IHBhcmVudCwgQXV0aG9yOiB3aG8sIEJvZHlSZXZpc2lvbjogYm9keVJldmlzaW9uLCBFcG9jaDogZXBvY2gsIEFuY2hvcjogY29waWVkKGFuY2hvciksIEJvZHk6IGNvcGllZChib2R5KSwgQ3JlYXRlZEhlaWdodDogaH0KCWNvbW1lbnRSZWNlaXB0KGMsIHdobywgb3BJRCkKCWNvbW1lbnRzLlNldChjb21tZW50S2V5KGlkLCBjaWQpLCBjKQoJc2VxIDo9IHN0cmNvbnYuRm9ybWF0VWludChjLlNlcXVlbmNlLCAxMCkKCWNvbW1lbnRJbmRleC5TZXQoaWRUZXh0KGlkKSsiOiIrc3RyaW5ncy5SZXBlYXQoIjAiLCAyMC1sZW4oc2VxKSkrc2VxKyI6IitpZFRleHQoY2lkKSwgY29tbWVudEtleShpZCwgY2lkKSkKCWNvb2xkb3ducy5TZXQoY2ssIGgpCgloaXN0b3J5Q29tbWVudENoYW5nZShuLCBjLCAiY29tbWVudC1hZGQiKQp9CmZ1bmMgRGVsZXRlQ29tbWVudChjdXIgcmVhbG0sIGlkLCBjaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJLy8gQXV0aG9ycyBjYW4gY2xlYXIgdGhlaXIgY3VycmVudCBwYXlsb2FkIGV2ZW4gYWZ0ZXIgdGhlIG5vdGUgaXMgZGVsZXRlZCBvcgoJLy8gcGF1c2VkLiBQdWJsaWMgaGlzdG9yeSBrZWVwcyB0aGUgb3JpZ2luYWwgdW5sZXNzIGEgbW9kZXJhdG9yIHJlZGFjdHMgaXQuCgluIDo9IGZpbmQoaWQpCgljIDo9IGdldENvbW1lbnQoaWQsIGNpZCkKCWlmIGMuQXV0aG9yICE9IHdobyB7CgkJcGFuaWMoIm5vdGVzOiBjb21tZW50IGF1dGhvciByZXF1aXJlZCIpCgl9CglpZiBjLkRlbGV0ZWQgewoJCXBhbmljKCJub3RlczogY29tbWVudCBkZWxldGVkIikKCX0KCWNvbW1lbnRFeHBlY3RlZChjLCBiYXNlUmV2aXNpb24sIG9wSUQpCgljLkRlbGV0ZWQgPSB0cnVlCgljLkFuY2hvciA9IG5pbAoJYy5Cb2R5ID0gbmlsCgljb21tZW50UmVjZWlwdChjLCB3aG8sIG9wSUQpCgloaXN0b3J5Q29tbWVudENoYW5nZShuLCBjLCAiY29tbWVudC1kZWxldGUiKQp9CmZ1bmMgUmVzb2x2ZUNvbW1lbnQoY3VyIHJlYWxtLCBpZCwgY2lkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCByZXNvbHZlZCBib29sLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVJlc29sdmVDb21tZW50KGN1ciwgd2hvLCBpZCwgY2lkLCBiYXNlUmV2aXNpb24sIHJlc29sdmVkLCBvcElEKQp9CmZ1bmMgbXV0YXRlUmVzb2x2ZUNvbW1lbnQoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQsIGNpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgcmVzb2x2ZWQgYm9vbCwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJcmVxdWlyZVdyaXRlKGN1ciwgbiwgd2hvKQoJYyA6PSBnZXRDb21tZW50KGlkLCBjaWQpCgljb21tZW50RXhwZWN0ZWQoYywgYmFzZVJldmlzaW9uLCBvcElEKQoJYy5SZXNvbHZlZCA9IHJlc29sdmVkCgljb21tZW50UmVjZWlwdChjLCB3aG8sIG9wSUQpCgloaXN0b3J5Q29tbWVudENoYW5nZShuLCBjLCAiY29tbWVudC1yZXNvbHV0aW9uIikKfQpmdW5jIEhpZGVDb21tZW50KGN1ciByZWFsbSwgaWQsIGNpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgaGlkZGVuIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbXV0YXRlSGlkZUNvbW1lbnQoY3VyLCB3aG8sIGlkLCBjaWQsIGJhc2VSZXZpc2lvbiwgaGlkZGVuLCBvcElEKQp9CmZ1bmMgbXV0YXRlSGlkZUNvbW1lbnQoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQsIGNpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgaGlkZGVuIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCWlmIHdobyAhPSBuLk93bmVyICYmICFtb2RlcmF0b3Iod2hvKSB7CgkJcGFuaWMoIm5vdGVzOiBvd25lciByZXF1aXJlZCBvciBtb2RlcmF0b3IiKQoJfQoJYyA6PSBnZXRDb21tZW50KGlkLCBjaWQpCgljb21tZW50RXhwZWN0ZWQoYywgYmFzZVJldmlzaW9uLCBvcElEKQoJaWYgdiwgb2sgOj0gaGlzdG9yeUNvbW1lbnRzLkdldChjb21tZW50S2V5KGlkLCBjaWQpKTsgb2sgJiYgIWhpZGRlbiAmJiB2LigqaGlzdG9yeUNvbW1lbnQpLlJlZGFjdGVkIHsKCQlwYW5pYygibm90ZXM6IGNvbW1lbnQgcmVkYWN0ZWQiKQoJfQoJYy5IaWRkZW4gPSBoaWRkZW4KCWNvbW1lbnRSZWNlaXB0KGMsIHdobywgb3BJRCkKCWhpc3RvcnlDb21tZW50Q2hhbmdlKG4sIGMsICJjb21tZW50LXZpc2liaWxpdHkiKQp9CmZ1bmMgY29tbWVudEpTT04oYyAqY29tbWVudCkgc3RyaW5nIHsKCXJldHVybiBgeyJpZCI6YCArIHEoaWRUZXh0KGMuSUQpKSArIGAsInBhcmVudCI6YCArIHEoaWRUZXh0KGMuUGFyZW50KSkgKyBgLCJhdXRob3IiOmAgKyBxKHN0cmluZyhjLkF1dGhvcikpICsgYCwiZW5jcnlwdGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGMuRW5jcnlwdGVkKSArIGAsImJvZHlfcmV2aXNpb24iOmAgKyB1KGMuQm9keVJldmlzaW9uKSArIGAsImVwb2NoIjpgICsgdSh1aW50NjQoYy5FcG9jaCkpICsgYCwicmV2aXNpb24iOmAgKyB1KGMuUmV2aXNpb24pICsgYCwiYW5jaG9yX2Jsb2IiOmAgKyBibG9iKGMuQW5jaG9yKSArIGAsImJvZHlfYmxvYiI6YCArIGJsb2IoYy5Cb2R5KSArIGAsImNyZWF0ZWRfaGVpZ2h0IjpgICsgcShzdHJjb252LkZvcm1hdEludChjLkNyZWF0ZWRIZWlnaHQsIDEwKSkgKyBgLCJvcF9pZCI6YCArIHEoaWRUZXh0KGMuTGFzdC5PcGVyYXRpb24pKSArIGAsImFjdG9yIjpgICsgcShzdHJpbmcoYy5MYXN0LkFjdG9yKSkgKyBgLCJoZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KGMuTGFzdC5IZWlnaHQsIDEwKSkgKyBgLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGMuRGVsZXRlZCkgKyBgLCJoaWRkZW4iOmAgKyBzdHJjb252LkZvcm1hdEJvb2woYy5IaWRkZW4pICsgYCwicmVzb2x2ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woYy5SZXNvbHZlZCkgKyBgfWAKfQpmdW5jIENvbW1lbnRKU09OKGlkSGV4LCBjaWRIZXggc3RyaW5nKSBzdHJpbmcgewoJdiwgb2sgOj0gY29tbWVudHMuR2V0KGNvbW1lbnRLZXkocmVhZElEKGlkSGV4KSwgcmVhZElEKGNpZEhleCkpKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gY29tbWVudEpTT04odi4oKmNvbW1lbnQpKQp9CgovLyBDb21tZW50cyBwYWdpbmF0ZSBpbiBhcHBlbmQgb3JkZXI7IGVkaXRpbmcgb3IgbW9kZXJhdGlvbiBuZXZlciByZW9yZGVycyB0aGVtLgpmdW5jIENvbW1lbnRzSlNPTihpZEhleCwgY3Vyc29yIHN0cmluZywgbGltaXQgaW50KSBzdHJpbmcgewoJaWQgOj0gcmVhZElEKGlkSGV4KQoJZmluZChpZCkKCWlmIGxpbWl0IDwgMSB8fCBsaW1pdCA+IE1heENvbW1lbnRQYWdlIHsKCQlwYW5pYygibm90ZXM6IHBhZ2UgbGltaXQiKQoJfQoJaWYgY3Vyc29yICE9ICIiIHsKCQlpZiBsZW4oY3Vyc29yKSAhPSA1MyB8fCBjdXJzb3JbMjBdICE9ICc6JyB7CgkJCXBhbmljKCJub3RlczogYmFkIGN1cnNvciIpCgkJfQoJCXJlYWRJRChjdXJzb3JbMjE6XSkKCQlmb3IgXywgYyA6PSByYW5nZSBjdXJzb3JbOjIwXSB7CgkJCWlmIGMgPCAnMCcgfHwgYyA+ICc5JyB7CgkJCQlwYW5pYygibm90ZXM6IGJhZCBjdXJzb3IiKQoJCQl9CgkJfQoJfQoJcHJlZml4IDo9IGlkVGV4dChpZCkgKyAiOiIKCXN0YXJ0IDo9IHByZWZpeCArIGN1cnNvcgoJaXRlbXMgOj0gW11zdHJpbmd7fQoJbmV4dCA6PSAiIgoJY29tbWVudEluZGV4Lkl0ZXJhdGUoc3RhcnQsIHByZWZpeCsiXHhmZiIsIGZ1bmMoayBzdHJpbmcsIHYgaW50ZXJmYWNle30pIGJvb2wgewoJCWlmIGN1cnNvciAhPSAiIiAmJiBrID09IHN0YXJ0IHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWN2LCBvayA6PSBjb21tZW50cy5HZXQodi4oc3RyaW5nKSkKCQlpZiAhb2sgewoJCQlwYW5pYygibm90ZXM6IGNvcnJ1cHQgY29tbWVudCBpbmRleCIpCgkJfQoJCWl0ZW1zID0gYXBwZW5kKGl0ZW1zLCBjb21tZW50SlNPTihjdi4oKmNvbW1lbnQpKSkKCQluZXh0ID0gc3RyaW5ncy5UcmltUHJlZml4KGssIHByZWZpeCkKCQlyZXR1cm4gbGVuKGl0ZW1zKSA9PSBsaW1pdAoJfSkKCWlmIGxlbihpdGVtcykgPCBsaW1pdCB7CgkJbmV4dCA9ICIiCgl9CglyZXR1cm4gYHsiaXRlbXMiOltgICsgc3RyaW5ncy5Kb2luKGl0ZW1zLCAiLCIpICsgYF0sIm5leHRfY3Vyc29yIjpgICsgcShuZXh0KSArIGB9YAp9CgovLyBQdXJnZSBuZXZlciBvcGVyYXRlcyBvbiBhIGxpdmUgbm90ZS4gRWFjaCBjYWxsIGVyYXNlcyBhdCBtb3N0IGxpbWl0IHJlY29yZHMKLy8gKGluY2x1ZGluZyBjb29sZG93bnMpOyBhIHBlcm1hbmVudCBub3RlIHRvbWJzdG9uZSBwcmV2ZW50cyBJRCByZXVzZS4KZnVuYyBQdXJnZShjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBsaW1pdCBpbnQpIGludCB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCXJldHVybiBtdXRhdGVQdXJnZShjdXIsIHdobywgaWQsIGxpbWl0KQp9CmZ1bmMgbXV0YXRlUHVyZ2UoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGxpbWl0IGludCkgaW50IHsKCW4gOj0gZmluZChpZCkKCW93bmVyKG4sIHdobykKCWlmICFuLkRlbGV0ZWQgewoJCXBhbmljKCJub3RlczogZGVsZXRlIGJlZm9yZSBwdXJnZSIpCgl9CglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiBNYXhQYWdlIHsKCQlwYW5pYygibm90ZXM6IHB1cmdlIGxpbWl0IikKCX0KCWNvdW50cyA6PSBbNV1pbnR7fQoJY291bnRzWzBdID0gcHVyZ2VQcmVmaXgoY29tbWVudEluZGV4LCBpZFRleHQoaWQpKyI6IiwgbGltaXQpCgljb3VudHNbMV0gPSBwdXJnZVByZWZpeChjb21tZW50cywgaWRUZXh0KGlkKSsiOiIsIGxpbWl0LWNvdW50c1swXSkKCWNvdW50c1syXSA9IHB1cmdlUHJlZml4KGNvb2xkb3ducywgaWRUZXh0KGlkKSsiOiIsIGxpbWl0LWNvdW50c1swXS1jb3VudHNbMV0pCgljb3VudHNbM10gPSBwdXJnZVByZWZpeChlcG9jaHMsIGlkVGV4dChpZCkrIjoiLCBsaW1pdC1jb3VudHNbMF0tY291bnRzWzFdLWNvdW50c1syXSkKCWNvdW50c1s0XSA9IHB1cmdlUmVxdWVzdHMobiwgbGltaXQtY291bnRzWzBdLWNvdW50c1sxXS1jb3VudHNbMl0tY291bnRzWzNdKQoJaGlzdG9yeUNsZWFudXAobiwgd2hvLCBjb3VudHMpCglyZXR1cm4gY291bnRzWzBdK2NvdW50c1sxXStjb3VudHNbMl0rY291bnRzWzNdK2NvdW50c1s0XQp9CmZ1bmMgcHVyZ2VQcmVmaXgodHJlZSAqYXZsLlRyZWUsIHByZWZpeCBzdHJpbmcsIGxpbWl0IGludCkgaW50IHsKCWlmIGxpbWl0ID09IDAgewoJCXJldHVybiAwCgl9Cglkb29tZWQgOj0gW11zdHJpbmd7fQoJdHJlZS5JdGVyYXRlKHByZWZpeCwgcHJlZml4KyJceGZmIiwgZnVuYyhrIHN0cmluZywgdiBpbnRlcmZhY2V7fSkgYm9vbCB7IGRvb21lZCA9IGFwcGVuZChkb29tZWQsIGspOyByZXR1cm4gbGVuKGRvb21lZCkgPT0gbGltaXQgfSkKCWZvciBfLCBrIDo9IHJhbmdlIGRvb21lZCB7CgkJdHJlZS5SZW1vdmUoaykKCX0KCXJldHVybiBsZW4oZG9vbWVkKQp9ChqqIwoKY3J5cHRvLmdubxKbI3BhY2thZ2UgbWVtYmFfbm90ZXNfdjEKCmltcG9ydCAoCgkiYnl0ZXMiCgkiY2hhaW4vcnVudGltZSIKCSJjcnlwdG8vYmVjaDMyIgoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvYmluYXJ5IgoJa2V5cyAiZ25vLmxhbmQvci9zYW1jcmV3L2VuY2tleXNfdjEiCgkic3RyY29udiIKKQoKY29uc3QgTWFuaWZlc3RFbnRyeUJ5dGVzID0gMTI5OQpjb25zdCBNYXhNYW5pZmVzdEJ5dGVzID0gMiArIE1heFJlYWRlcnMqTWFuaWZlc3RFbnRyeUJ5dGVzCmNvbnN0IE1heENpcGhlckNvbW1lbnRCeXRlcyA9IDU2ODcKCnR5cGUgcmVjaXBpZW50IHN0cnVjdCB7CglXaG8gICAgICAgIGFkZHJlc3MKCVdyaXRlciAgICAgYm9vbAoJR2VuZXJhdGlvbiB1aW50NjQKfQoKZnVuYyBlbmNyeXB0ZWQobW9kZSB1aW50OCkgYm9vbCB7IHJldHVybiBtb2RlIDw9IE1vZGVMaW5rIH0KZnVuYyBjb250YWlucyhhZGRycyBbXWFkZHJlc3MsIHdobyBhZGRyZXNzKSBib29sIHsKCWZvciBfLCBhIDo9IHJhbmdlIGFkZHJzIHsKCQlpZiBhID09IHdobyB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KZnVuYyBwYXJzZU1hbmlmZXN0KGRhdGEgW11ieXRlLCBlcG9jaCB1aW50MzIsIG93bmVyIGFkZHJlc3MsIG1vZGUgdWludDgpIFtdcmVjaXBpZW50IHsKCXJldHVybiBwYXJzZU1hbmlmZXN0Rm9yKGRhdGEsIGVwb2NoLCBvd25lciwgbW9kZSwgIiIpCn0KCi8vIEEgc2VsZiByZWZyZXNoIGNoZWNrcyB0aGUgbmV3IGNhbGxlciBpZGVudGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGV2ZXJ5IG90aGVyCi8vIGFscmVhZHktc3RvcmVkIGVudmVsb3BlLCBpbmNsdWRpbmcgcmV2b2tlZCBvciBzdXBlcnNlZGVkIGlkZW50aXRpZXMuCmZ1bmMgcGFyc2VNYW5pZmVzdEZvcihkYXRhIFtdYnl0ZSwgZXBvY2ggdWludDMyLCBvd25lciBhZGRyZXNzLCBtb2RlIHVpbnQ4LCBjdXJyZW50T25seSBhZGRyZXNzKSBbXXJlY2lwaWVudCB7CglpZiBsZW4oZGF0YSkgPCAyIHx8IGxlbihkYXRhKSA+IE1heE1hbmlmZXN0Qnl0ZXMgfHwgZGF0YVswXSAhPSAxIHx8IGRhdGFbMV0gPCAxIHx8IGRhdGFbMV0gPiBNYXhSZWFkZXJzIHx8IGxlbihkYXRhKSAhPSAyK2ludChkYXRhWzFdKSpNYW5pZmVzdEVudHJ5Qnl0ZXMgewoJCXBhbmljKCJub3RlczogbWFuaWZlc3QgaGVhZGVyL2xlbmd0aCIpCgl9CglyZXN1bHQgOj0gW11yZWNpcGllbnR7fQoJcHJldmlvdXMgOj0gW11ieXRlKG5pbCkKCWhhc093bmVyIDo9IGZhbHNlCgloYXNXcml0ZXIgOj0gZmFsc2UKCWZvciBpIDo9IDA7IGkgPCBpbnQoZGF0YVsxXSk7IGkrKyB7CgkJb2ZmIDo9IDIgKyBpKk1hbmlmZXN0RW50cnlCeXRlcwoJCXJhdyA6PSBkYXRhW29mZiA6IG9mZisyMF0KCQlpZiBpID4gMCAmJiBieXRlcy5Db21wYXJlKHJhdywgcHJldmlvdXMpIDw9IDAgfHwgZGF0YVtvZmYrMjBdID4gMSB7CgkJCXBhbmljKCJub3RlczogbWFuaWZlc3Qgb3JkZXIvcm9sZSIpCgkJfQoJCXByZXZpb3VzID0gcmF3CgkJZW5jb2RlZCwgZXJyIDo9IGJlY2gzMi5FbmNvZGVGcm9tQmFzZTI1NigiZyIsIHJhdykKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoIm5vdGVzOiByZWNpcGllbnQgYWRkcmVzcyIpCgkJfQoJCXdobyA6PSBhZGRyZXNzKGVuY29kZWQpCgkJZ2VuZXJhdGlvbiA6PSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChkYXRhW29mZisyMSA6IG9mZisyOV0pCgkJaWYgZ2VuZXJhdGlvbiA9PSAwIHsKCQkJcGFuaWMoIm5vdGVzOiB6ZXJvIGlkZW50aXR5IGdlbmVyYXRpb24iKQoJCX0KCQl3ciA6PSBvZmYgKyA2MQoJCWlmIGRhdGFbd3JdICE9IDEgfHwgZGF0YVt3cisxXSAhPSAxIHx8IGJpbmFyeS5CaWdFbmRpYW4uVWludDMyKGRhdGFbd3IrMjp3cis2XSkgIT0gZXBvY2ggewoJCQlwYW5pYygibm90ZXM6IHdyYXAgc3VpdGUvZXBvY2giKQoJCX0KCQlpZiBiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChkYXRhW3dyKzY6d3IrMTRdKSAhPSBnZW5lcmF0aW9uIHx8ICFieXRlcy5FcXVhbChkYXRhW29mZisyOTpvZmYrNjFdLCBkYXRhW3dyKzE0OndyKzQ2XSkgewoJCQlwYW5pYygibm90ZXM6IHdyYXAgaWRlbnRpdHkgbWlzbWF0Y2giKQoJCX0KCQlpZiBjdXJyZW50T25seSA9PSAiIiB8fCBjdXJyZW50T25seSA9PSB3aG8gewoJCQlwaywgZ2VuLCBhY3RpdmUgOj0ga2V5cy5HZXRLZXkod2hvLCBrZXlzLlN1aXRlWFdpbmdWMSkKCQkJaWYgIWFjdGl2ZSB8fCBnZW4gIT0gZ2VuZXJhdGlvbiB7CgkJCQlwYW5pYygibm90ZXM6IHJlY2lwaWVudCBrZXkgaW5hY3RpdmUvc3RhbGUiKQoJCQl9CgkJCWhhc2ggOj0gc2hhMjU2LlN1bTI1NihwaykKCQkJaWYgIWJ5dGVzLkVxdWFsKGhhc2hbOl0sIGRhdGFbb2ZmKzI5Om9mZis2MV0pIHsKCQkJCXBhbmljKCJub3RlczogcmVjaXBpZW50IHB1YmxpYyBrZXkgaGFzaCIpCgkJCX0KCQl9CgkJaXNXcml0ZXIgOj0gZGF0YVtvZmYrMjBdID09IDEKCQlpZiBpc1dyaXRlciB7CgkJCWhhc1dyaXRlciA9IHRydWUKCQl9CgkJaWYgd2hvID09IG93bmVyIHsKCQkJaWYgIWlzV3JpdGVyIHsKCQkJCXBhbmljKCJub3Rlczogb3duZXIgbXVzdCB3cml0ZSIpCgkJCX0KCQkJaGFzT3duZXIgPSB0cnVlCgkJfQoJCWlmIG1vZGUgPT0gTW9kZUxpbmsgJiYgIWlzV3JpdGVyIHsKCQkJcGFuaWMoIm5vdGVzOiBsaW5rIHdyYXBzIGFyZSBmb3Igd3JpdGVycyIpCgkJfQoJCXJlc3VsdCA9IGFwcGVuZChyZXN1bHQsIHJlY2lwaWVudHt3aG8sIGlzV3JpdGVyLCBnZW5lcmF0aW9ufSkKCX0KCWlmIG93bmVyICE9ICIiICYmICghaGFzT3duZXIgfHwgIWhhc1dyaXRlcikgfHwgbW9kZSA9PSBNb2RlUHJpdmF0ZSAmJiAobGVuKHJlc3VsdCkgIT0gMSB8fCBvd25lciA9PSAiIikgewoJCXBhbmljKCJub3RlczogbWlzc2luZyBvd25lci9wcml2YXRlIHJlYWRlcnMiKQoJfQoJcmV0dXJuIHJlc3VsdAp9CmZ1bmMgdmFsaWRhdGVDaXBoZXIoYmxvYiBbXWJ5dGUsIGVwb2NoIHVpbnQzMiwgZmllbGQgdWludDgsIHJldmlzaW9uIHVpbnQ2NCwgY2FwIGludCkgewoJaWYgbGVuKGJsb2IpIDwgNTkgfHwgbGVuKGJsb2IpID4gY2FwIHx8IGJsb2JbMF0gIT0gMSB8fCBibG9iWzFdICE9IDEgfHwgYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoYmxvYlsyOjZdKSAhPSBlcG9jaCB8fCBibG9iWzZdICE9IGZpZWxkIHx8IGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGJsb2JbNzoxNV0pICE9IHJldmlzaW9uIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgY2lwaGVyIGVudmVsb3BlIikKCX0KfQpmdW5jIHZhbGlkYXRlQ29tbWl0bWVudChrYyBbXWJ5dGUpIHsKCWlmIGxlbihrYykgIT0gMzIgfHwgYnl0ZXMuRXF1YWwoa2MsIG1ha2UoW11ieXRlLCAzMikpIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgZXBvY2ggY29tbWl0bWVudCIpCgl9Cn0KZnVuYyBhcHBlbmRUZXh0KGIgW11ieXRlLCBzIHN0cmluZykgW11ieXRlIHsKCXNpemUgOj0gbWFrZShbXWJ5dGUsIDQpCgliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihzaXplLCB1aW50MzIobGVuKHMpKSkKCWIgPSBhcHBlbmQoYiwgc2l6ZS4uLikKCXJldHVybiBhcHBlbmQoYiwgW11ieXRlKHMpLi4uKQp9CmZ1bmMgZXBvY2hDb21taXRtZW50KGlkIFsxNl1ieXRlLCBlcG9jaCB1aW50MzIsIGtleSBbXWJ5dGUpIFtdYnl0ZSB7CgliIDo9IGFwcGVuZFRleHQobmlsLCAibWVtYmEtbm90ZXMvdjEvZXBvY2gtY29tbWl0bWVudCIpCgliID0gYXBwZW5kVGV4dChiLCBydW50aW1lLkNoYWluSUQoKSkKCWIgPSBhcHBlbmRUZXh0KGIsIFJlYWxtUGF0aCkKCWIgPSBhcHBlbmQoYiwgaWRbOl0uLi4pCgllcCA6PSBtYWtlKFtdYnl0ZSwgNCkKCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKGVwLCBlcG9jaCkKCWIgPSBhcHBlbmQoYiwgZXAuLi4pCgliID0gYXBwZW5kKGIsIGtleS4uLikKCWggOj0gc2hhMjU2LlN1bTI1NihiKQoJcmV0dXJuIGhbOl0KfQoKZnVuYyBtYW5pZmVzdEFkZHJlc3MocmF3IFtdYnl0ZSkgYWRkcmVzcyB7CglzLCBlcnIgOj0gYmVjaDMyLkVuY29kZUZyb21CYXNlMjU2KCJnIiwgcmF3KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoIm5vdGVzOiBtYW5pZmVzdCBhZGRyZXNzIikKCX0KCXJldHVybiBhZGRyZXNzKHMpCn0KCmZ1bmMgY2Fub25pY2FsUmVjaXBpZW50KHdobyBhZGRyZXNzKSBhZGRyZXNzIHsgcmV0dXJuIGtleXMuQ2Fub25pY2FsQWRkcmVzcyh3aG8pIH0KZnVuYyB3cmFwSlNPTihlbnRyeSBbXWJ5dGUsIGVwb2NoIHVpbnQzMiwgd2hvIGFkZHJlc3MpIHN0cmluZyB7CglyZXR1cm4gYHsiYWRkcmVzcyI6YCArIHEoc3RyaW5nKHdobykpICsgYCwiZXBvY2giOmAgKyB1KHVpbnQ2NChlcG9jaCkpICsgYCwid3JpdGVyIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGVudHJ5WzIwXSA9PSAxKSArIGAsImdlbmVyYXRpb24iOmAgKyB1KGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGVudHJ5WzIxOjI5XSkpICsgYCwicHVibGljX2tleV9oYXNoIjpgICsgYmxvYihlbnRyeVsyOTo2MV0pICsgYCwid3JhcCI6YCArIGJsb2IoZW50cnlbNjE6XSkgKyBgfWAKfQoa8E0KCmVwb2Nocy5nbm8S4U1wYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImJ5dGVzIgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgp0eXBlIGVwb2NoUmVjb3JkIHN0cnVjdCB7CglFcG9jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyCglNYW5pZmVzdCwgQ29tbWl0bWVudCwgUmV2ZWFsZWRLZXkgW11ieXRlCn0KCnZhciBlcG9jaHMgPSBhdmwuTmV3VHJlZSgpCgpmdW5jIGVwb2NoS2V5KGlkIFsxNl1ieXRlLCBlcG9jaCB1aW50MzIpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoZXBvY2gpLCAxMCkKCXJldHVybiBpZFRleHQoaWQpICsgIjoiICsgc3RyaW5ncy5SZXBlYXQoIjAiLCAxMC1sZW4ocykpICsgcwp9CmZ1bmMgZ2V0RXBvY2goaWQgWzE2XWJ5dGUsIGVwb2NoIHVpbnQzMikgKmVwb2NoUmVjb3JkIHsKCXYsIG9rIDo9IGVwb2Nocy5HZXQoZXBvY2hLZXkoaWQsIGVwb2NoKSkKCWlmICFvayB7CgkJcGFuaWMoIm5vdGVzOiBlcG9jaCBtaXNzaW5nIikKCX0KCXJldHVybiB2LigqZXBvY2hSZWNvcmQpCn0KZnVuYyBwcml2YXRlV3JpdGFibGUobiAqbm90ZSkgewoJaWYgZW5jcnlwdGVkKG4uTW9kZSkgJiYgbGVuKGdldEVwb2NoKG4uSUQsIG4uRXBvY2gpLlJldmVhbGVkS2V5KSAhPSAwIHsKCQlwYW5pYygibm90ZXM6IHJldmVhbGVkIGVwb2NoIHJlcXVpcmVzIHJvdGF0aW9uIikKCX0KfQpmdW5jIHNldFJlY2lwaWVudHMobiAqbm90ZSwgbGlzdCBbXXJlY2lwaWVudCkgewoJbi5SZWFkZXJzID0gbmlsCgluLldyaXRlcnMgPSBuaWwKCWZvciBfLCByIDo9IHJhbmdlIGxpc3QgewoJCW4uUmVhZGVycyA9IGFwcGVuZChuLlJlYWRlcnMsIHIuV2hvKQoJCWlmIHIuV3JpdGVyICYmIHIuV2hvICE9IG4uT3duZXIgewoJCQluLldyaXRlcnMgPSBhcHBlbmQobi5Xcml0ZXJzLCByLldobykKCQl9Cgl9Cn0KZnVuYyBpbml0aWFsaXplRW5jcnlwdGVkKG4gKm5vdGUsIGFjY2Vzcywga2MgW11ieXRlKSB7Cgl2YWxpZGF0ZUNvbW1pdG1lbnQoa2MpCglsaXN0IDo9IHBhcnNlTWFuaWZlc3QoYWNjZXNzLCAxLCBuLk93bmVyLCBuLk1vZGUpCgl2YWxpZGF0ZUNpcGhlcihuLlRpdGxlLCAxLCAxLCAxLCBNYXhDaXBoZXJUaXRsZUJ5dGVzKQoJdmFsaWRhdGVDaXBoZXIobi5Cb2R5LCAxLCAyLCAxLCBNYXhDaXBoZXJCb2R5Qnl0ZXMpCgluLkVwb2NoID0gMQoJbi5Db21taXRtZW50ID0gY29waWVkKGtjKQoJc2V0UmVjaXBpZW50cyhuLCBsaXN0KQoJZXBvY2hzLlNldChlcG9jaEtleShuLklELCAxKSwgJmVwb2NoUmVjb3Jke0Vwb2NoOiAxLCBNYW5pZmVzdDogY29waWVkKGFjY2VzcyksIENvbW1pdG1lbnQ6IGNvcGllZChrYyl9KQp9CgovLyBSb3RhdGUgaW5zdGFsbHMgdGhlIGVudGlyZSBuZXh0IGVwb2NoIGluIG9uZSB0cmFuc2FjdGlvbi4gSGlzdG9yaWNhbCBlcG9jaAovLyByZWNvcmRzIHN0YXkgYXZhaWxhYmxlIHVudGlsIERlbGV0ZStib3VuZGVkUHVyZ2U7IHJvdGF0aW9uIG5ldmVyIHNjYW5zIHRoZW0uCmZ1bmMgUm90YXRlKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBtb2RlIHVpbnQ4LCB0aXRsZSwgYm9keSwgbWFuaWZlc3QsIGtjIFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVSb3RhdGUoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIGV4cGVjdGVkRXBvY2gsIG1vZGUsIHRpdGxlLCBib2R5LCBtYW5pZmVzdCwga2MsIG9wSUQpCn0KZnVuYyBtdXRhdGVSb3RhdGUoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBtb2RlIHVpbnQ4LCB0aXRsZSwgYm9keSwgbWFuaWZlc3QsIGtjIFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgIWVuY3J5cHRlZChuLk1vZGUpIHx8ICFlbmNyeXB0ZWQobW9kZSkgewoJCXBhbmljKCJub3RlczogZW5jcnlwdGVkIHJvdGF0aW9uIHJlcXVpcmVkIikKCX0KCWlmIGV4cGVjdGVkRXBvY2ggIT0gbi5FcG9jaCB8fCBuLkVwb2NoID09IF51aW50MzIoMCkgewoJCXBhbmljKCJub3Rlczogc3RhbGUvZXhoYXVzdGVkIGVwb2NoIikKCX0KCWlmIG4uVGl0bGVSZXZpc2lvbiA9PSBedWludDY0KDApIHx8IG4uQm9keVJldmlzaW9uID09IF51aW50NjQoMCkgewoJCXBhbmljKCJub3RlczogZmllbGQgcmV2aXNpb24gZXhoYXVzdGVkIikKCX0KCWVwIDo9IG4uRXBvY2ggKyAxCgl2YWxpZGF0ZUNvbW1pdG1lbnQoa2MpCglpZiBieXRlcy5FcXVhbChrYywgbi5Db21taXRtZW50KSB7CgkJcGFuaWMoIm5vdGVzOiBmcmVzaCBlcG9jaCBjb21taXRtZW50IHJlcXVpcmVkIikKCX0KCWxpc3QgOj0gcGFyc2VNYW5pZmVzdChtYW5pZmVzdCwgZXAsIG1hbmlmZXN0T3duZXIobiksIG1vZGUpCgl2YWxpZGF0ZUNpcGhlcih0aXRsZSwgZXAsIDEsIG4uVGl0bGVSZXZpc2lvbisxLCBNYXhDaXBoZXJUaXRsZUJ5dGVzKQoJdmFsaWRhdGVDaXBoZXIoYm9keSwgZXAsIDIsIG4uQm9keVJldmlzaW9uKzEsIE1heENpcGhlckJvZHlCeXRlcykKCW9wZXJhdGlvbihuLCBvcElEKQoJdW5pbmRleChuKQoJbi5Nb2RlID0gbW9kZQoJbi5FcG9jaCA9IGVwCgluLlRpdGxlID0gY29waWVkKHRpdGxlKQoJbi5Cb2R5ID0gY29waWVkKGJvZHkpCgluLkJvZHlCeXRlcyA9IGxlbihib2R5KQoJbi5UaXRsZVJldmlzaW9uKysKCW4uQm9keVJldmlzaW9uKysKCW4uQ29tbWl0bWVudCA9IGNvcGllZChrYykKCW4uUGVuZGluZ093bmVyID0gIiIKCXNldFJlY2lwaWVudHMobiwgbGlzdCkKCWluZGV4KG4pCgllcG9jaHMuU2V0KGVwb2NoS2V5KGlkLCBlcCksICZlcG9jaFJlY29yZHtFcG9jaDogZXAsIE1hbmlmZXN0OiBjb3BpZWQobWFuaWZlc3QpLCBDb21taXRtZW50OiBjb3BpZWQoa2MpfSkKCWFja25vd2xlZGdlUmVxdWVzdHMobiwgd2hvLCBvcElEKQoJYnVtcChuLCB3aG8sIG9wSUQsICJyb3RhdGUiKQp9CgovLyBBcHBseUFjY2VzcyBncmFudHMgYWNjZXNzIHRvIHRoZSBDVVJSRU5UIGVwb2NoIGFuZCBpdHMgaGlzdG9yeS4gUmVtb3ZpbmcgYQovLyByZWFkZXIvd3JpdGVyIG9yIGNoYW5naW5nIGxpbmsgc2NvcGUgcmVxdWlyZXMgUm90YXRlLCBuZXZlciB0aGlzIGVudHJ5cG9pbnQuCmZ1bmMgQXBwbHlBY2Nlc3MoY3VyIHJlYWxtLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgZXhwZWN0ZWRFcG9jaCB1aW50MzIsIG1vZGUgdWludDgsIG1hbmlmZXN0IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVBcHBseUFjY2VzcyhjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgZXhwZWN0ZWRFcG9jaCwgbW9kZSwgbWFuaWZlc3QsIG9wSUQpCn0KZnVuYyBtdXRhdGVBcHBseUFjY2VzcyhjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgZXhwZWN0ZWRFcG9jaCB1aW50MzIsIG1vZGUgdWludDgsIG1hbmlmZXN0IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJcHJpdmF0ZVdyaXRhYmxlKG4pCglpZiAhZW5jcnlwdGVkKG4uTW9kZSkgfHwgZXhwZWN0ZWRFcG9jaCAhPSBuLkVwb2NoIHx8ICEobW9kZSA9PSBuLk1vZGUgfHwgbi5Nb2RlID09IE1vZGVQcml2YXRlICYmIG1vZGUgPT0gTW9kZVNoYXJlZCkgewoJCXBhbmljKCJub3RlczogYWNjZXNzIHRyYW5zaXRpb24gcmVxdWlyZXMgcm90YXRpb24iKQoJfQoJbGlzdCA6PSBwYXJzZU1hbmlmZXN0KG1hbmlmZXN0LCBuLkVwb2NoLCBtYW5pZmVzdE93bmVyKG4pLCBtb2RlKQoJZm9yIF8sIGEgOj0gcmFuZ2Ugbi5SZWFkZXJzIHsKCQlmb3VuZCA6PSBmYWxzZQoJCWZvciBfLCByIDo9IHJhbmdlIGxpc3QgewoJCQlpZiByLldobyA9PSBhIHsKCQkJCWZvdW5kID0gdHJ1ZQoJCQkJaWYgd3JpdGVyKG4sIGEpICYmICFyLldyaXRlciB7CgkJCQkJcGFuaWMoIm5vdGVzOiB3cml0ZXIgcmVtb3ZhbCByZXF1aXJlcyByb3RhdGlvbiIpCgkJCQl9CgkJCX0KCQl9CgkJaWYgIWZvdW5kIHsKCQkJcGFuaWMoIm5vdGVzOiByZWFkZXIgcmVtb3ZhbCByZXF1aXJlcyByb3RhdGlvbiIpCgkJfQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCgl1bmluZGV4KG4pCgluLk1vZGUgPSBtb2RlCglzZXRSZWNpcGllbnRzKG4sIGxpc3QpCglpbmRleChuKQoJZ2V0RXBvY2goaWQsIG4uRXBvY2gpLk1hbmlmZXN0ID0gY29waWVkKG1hbmlmZXN0KQoJYWNrbm93bGVkZ2VSZXF1ZXN0cyhuLCB3aG8sIG9wSUQpCglidW1wKG4sIHdobywgb3BJRCwgImFjY2VzcyIpCn0KZnVuYyBQdWJsaXNoKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG1vZGUgdWludDgsIHRpdGxlLCBib2R5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVQdWJsaXNoKGN1ciwgd2hvLCBpZCwgYmFzZVJldmlzaW9uLCBtb2RlLCB0aXRsZSwgYm9keSwgb3BJRCkKfQpmdW5jIG11dGF0ZVB1Ymxpc2goY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG1vZGUgdWludDgsIHRpdGxlLCBib2R5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgIWVuY3J5cHRlZChuLk1vZGUpIHx8ICFwdWJsaWMobW9kZSkgewoJCXBhbmljKCJub3RlczogcHVibGlzaCB0cmFuc2l0aW9uIikKCX0KCWlmIG4uVGl0bGVSZXZpc2lvbiA9PSBedWludDY0KDApIHx8IG4uQm9keVJldmlzaW9uID09IF51aW50NjQoMCkgewoJCXBhbmljKCJub3RlczogZmllbGQgcmV2aXNpb24gZXhoYXVzdGVkIikKCX0KCXZhbGlkYXRlUHVibGljKHRpdGxlLCBib2R5KQoJb3BlcmF0aW9uKG4sIG9wSUQpCgl1bmluZGV4KG4pCgluLk1vZGUgPSBtb2RlCgluLlRpdGxlID0gY29waWVkKHRpdGxlKQoJbi5Cb2R5ID0gY29waWVkKGJvZHkpCgluLkJvZHlCeXRlcyA9IGxlbihib2R5KQoJbi5UaXRsZVJldmlzaW9uKysKCW4uQm9keVJldmlzaW9uKysKCW4uTGlzdGVkID0gdHJ1ZQoJbi5SZWFkZXJzID0gbmlsCgluLkNvbW1pdG1lbnQgPSBuaWwKCW4uUGVuZGluZ093bmVyID0gIiIKCWluZGV4KG4pCglidW1wKG4sIHdobywgb3BJRCwgInB1Ymxpc2giKQp9CmZ1bmMgUmV2ZWFsKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGVwb2NoIHVpbnQzMiwga2V5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVSZXZlYWwoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIGVwb2NoLCBrZXksIG9wSUQpCn0KZnVuYyBtdXRhdGVSZXZlYWwoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGVwb2NoIHVpbnQzMiwga2V5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJZXAgOj0gZ2V0RXBvY2goaWQsIGVwb2NoKQoJaWYgbGVuKGtleSkgIT0gMzIgfHwgbGVuKGVwLlJldmVhbGVkS2V5KSAhPSAwIHx8ICFieXRlcy5FcXVhbChlcG9jaENvbW1pdG1lbnQoaWQsIGVwb2NoLCBrZXkpLCBlcC5Db21taXRtZW50KSB7CgkJcGFuaWMoIm5vdGVzOiBpbnZhbGlkL2FscmVhZHkgcmV2ZWFsZWQga2V5IikKCX0KCW9wZXJhdGlvbihuLCBvcElEKQoJZXAuUmV2ZWFsZWRLZXkgPSBjb3BpZWQoa2V5KQoJYnVtcEhpc3Rvcnkobiwgd2hvLCBvcElELCAicmV2ZWFsIiwgYCwidGFyZ2V0X2Vwb2NoIjpgICsgdSh1aW50NjQoZXBvY2gpKSkKfQpmdW5jIGVwb2NoSlNPTihlcCAqZXBvY2hSZWNvcmQsIHdpdGhNYW5pZmVzdCBib29sKSBzdHJpbmcgewoJb3V0IDo9IGB7ImVwb2NoIjpgICsgdSh1aW50NjQoZXAuRXBvY2gpKSArIGAsImNvbW1pdG1lbnQiOmAgKyBibG9iKGVwLkNvbW1pdG1lbnQpICsgYCwicmV2ZWFsZWRfa2V5IjpgICsgYmxvYihlcC5SZXZlYWxlZEtleSkKCWlmIHdpdGhNYW5pZmVzdCB7CgkJb3V0ICs9IGAsIm1hbmlmZXN0IjpgICsgYmxvYihlcC5NYW5pZmVzdCkKCX0KCXJldHVybiBvdXQgKyBgfWAKfQpmdW5jIEVwb2NoSlNPTihpZEhleCBzdHJpbmcsIGVwb2NoIHVpbnQzMikgc3RyaW5nIHsKCWlkIDo9IHJlYWRJRChpZEhleCkKCXYsIG9rIDo9IGVwb2Nocy5HZXQoZXBvY2hLZXkoaWQsIGVwb2NoKSkKCWlmICFvayB7CgkJcmV0dXJuICJudWxsIgoJfQoJcmV0dXJuIGVwb2NoSlNPTih2LigqZXBvY2hSZWNvcmQpLCB0cnVlKQp9CmZ1bmMgRXBvY2hzSlNPTihpZEhleCBzdHJpbmcsIGN1cnNvciB1aW50MzIsIGxpbWl0IGludCkgc3RyaW5nIHsKCWlkIDo9IHJlYWRJRChpZEhleCkKCWZpbmQoaWQpCglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiBNYXhQYWdlIHsKCQlwYW5pYygibm90ZXM6IHBhZ2UgbGltaXQiKQoJfQoJaXRlbXMgOj0gW11zdHJpbmd7fQoJdmFyIG5leHQgdWludDMyCgllcG9jaHMuSXRlcmF0ZShlcG9jaEtleShpZCwgY3Vyc29yKSwgaWRUZXh0KGlkKSsiOlx4ZmYiLCBmdW5jKGsgc3RyaW5nLCB2IGludGVyZmFjZXt9KSBib29sIHsKCQllcCA6PSB2LigqZXBvY2hSZWNvcmQpCgkJaWYgZXAuRXBvY2ggPD0gY3Vyc29yIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWl0ZW1zID0gYXBwZW5kKGl0ZW1zLCBlcG9jaEpTT04oZXAsIGZhbHNlKSkKCQluZXh0ID0gZXAuRXBvY2gKCQlyZXR1cm4gbGVuKGl0ZW1zKSA9PSBsaW1pdAoJfSkKCWlmIGxlbihpdGVtcykgPCBsaW1pdCB7CgkJbmV4dCA9IDAKCX0KCXJldHVybiBgeyJpdGVtcyI6W2AgKyBzdHJpbmdzLkpvaW4oaXRlbXMsICIsIikgKyBgXSwibmV4dF9jdXJzb3IiOmAgKyB1KHVpbnQ2NChuZXh0KSkgKyBgfWAKfQpmdW5jIFJlYWRlcnNKU09OKGlkSGV4IHN0cmluZykgc3RyaW5nIHsKCW4gOj0gZmluZChyZWFkSUQoaWRIZXgpKQoJb3V0IDo9ICJbIgoJZm9yIGksIGEgOj0gcmFuZ2Ugbi5SZWFkZXJzIHsKCQlpZiBpID4gMCB7CgkJCW91dCArPSAiLCIKCQl9CgkJb3V0ICs9IHEoc3RyaW5nKGEpKQoJfQoJcmV0dXJuIG91dCArICJdIgp9CgpmdW5jIG1hbmlmZXN0T3duZXIobiAqbm90ZSkgYWRkcmVzcyB7CglpZiBuLk93bmVySXNSZWFsbSB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gbi5Pd25lcgp9CgovLyBPd25lcnNoaXAgY2hhbmdlcyBkbyBub3Qgc2lsZW50bHkgcmV2b2tlIGFuIGV4aXN0aW5nIG1hbmlmZXN0IHdyaXRlci4KLy8gUmV2b2NhdGlvbiByZXF1aXJlcyB0aGUgbmV3IG93bmVyIHRvIHJvdGF0ZTsgb2xkIGtleSBrbm93bGVkZ2UgYWxzbyByZW1haW5zLgpmdW5jIHByZXNlcnZlVHJhbnNmZXJyZWRXcml0ZXJzKG4gKm5vdGUpIHsKCWRhdGEgOj0gZ2V0RXBvY2gobi5JRCwgbi5FcG9jaCkuTWFuaWZlc3QKCW4uV3JpdGVycyA9IG5pbAoJZm9yIGkgOj0gMDsgaSA8IGludChkYXRhWzFdKTsgaSsrIHsKCQlvZmYgOj0gMiArIGkqTWFuaWZlc3RFbnRyeUJ5dGVzCgkJaWYgZGF0YVtvZmYrMjBdID09IDEgewoJCQl3aG8gOj0gbWFuaWZlc3RBZGRyZXNzKGRhdGFbb2ZmIDogb2ZmKzIwXSkKCQkJaWYgd2hvICE9IG4uT3duZXIgewoJCQkJbi5Xcml0ZXJzID0gYXBwZW5kKG4uV3JpdGVycywgd2hvKQoJCQl9CgkJfQoJfQp9CgpmdW5jIFdyYXBKU09OKGlkSGV4IHN0cmluZywgZXBvY2ggdWludDMyLCB3aG8gYWRkcmVzcykgc3RyaW5nIHsKCWlkIDo9IHJlYWRJRChpZEhleCkKCXdobyA9IGNhbm9uaWNhbFJlY2lwaWVudCh3aG8pCgl2LCBvayA6PSBlcG9jaHMuR2V0KGVwb2NoS2V5KGlkLCBlcG9jaCkpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCWRhdGEgOj0gdi4oKmVwb2NoUmVjb3JkKS5NYW5pZmVzdAoJZm9yIGkgOj0gMDsgaSA8IGludChkYXRhWzFdKTsgaSsrIHsKCQlvZmYgOj0gMiArIGkqTWFuaWZlc3RFbnRyeUJ5dGVzCgkJaWYgbWFuaWZlc3RBZGRyZXNzKGRhdGFbb2ZmOm9mZisyMF0pID09IHdobyB7CgkJCXJldHVybiB3cmFwSlNPTihkYXRhW29mZjpvZmYrTWFuaWZlc3RFbnRyeUJ5dGVzXSwgZXBvY2gsIHdobykKCQl9Cgl9CglyZXR1cm4gIm51bGwiCn0KCi8vIFJlZnJlc2hPd25XcmFwIGNoYW5nZXMgb25seSB0aGUgY2FsbGVyJ3MgaWRlbnRpdHkgZW52ZWxvcGUuIEl0IGNhbm5vdCBjaGFuZ2UKLy8gcm9sZXMsIHJlYWRlcnMsIG1vZGVzIG9yIGVwb2NocywgYW5kIG5ldmVyIHJld3JpdGVzIGFueWJvZHkgZWxzZSdzIHJlY292ZXJ5LgpmdW5jIFJlZnJlc2hPd25XcmFwKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBtYW5pZmVzdCBbXWJ5dGUsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbiA6PSBsaXZlKGlkKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJcHJpdmF0ZVdyaXRhYmxlKG4pCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHx8ICFlbmNyeXB0ZWQobi5Nb2RlKSB8fCBleHBlY3RlZEVwb2NoICE9IG4uRXBvY2ggfHwgIWNvbnRhaW5zKG4uUmVhZGVycywgd2hvKSB7CgkJcGFuaWMoIm5vdGVzOiBjdXJyZW50IHJlYWRlciByZXF1aXJlZCIpCgl9CgkvLyBBIHJlYWRlciB3aG8gYWNjZXB0ZWQgU2hhcmVkIG93bmVyc2hpcCBtYXkgcmV0YWluIGEgZmFsc2UgZXhwbGljaXQgd3JpdGVyCgkvLyBmbGFnOiBvd25lcnNoaXAgaXMgaW1wbGljaXQgYXV0aG9yaXR5LiBTZWxmLXJlZnJlc2ggcHJlc2VydmVzIHRoYXQgZmxhZy4KCW1hbmlmZXN0QWNjb3VudE93bmVyIDo9IGFkZHJlc3MoIiIpCglpZiBuLk1vZGUgPT0gTW9kZVByaXZhdGUgewoJCW1hbmlmZXN0QWNjb3VudE93bmVyID0gbi5Pd25lcgoJfQoJcGFyc2VNYW5pZmVzdEZvcihtYW5pZmVzdCwgbi5FcG9jaCwgbWFuaWZlc3RBY2NvdW50T3duZXIsIG4uTW9kZSwgd2hvKQoJb2xkIDo9IGdldEVwb2NoKGlkLCBuLkVwb2NoKS5NYW5pZmVzdAoJaWYgbGVuKG9sZCkgIT0gbGVuKG1hbmlmZXN0KSB7CgkJcGFuaWMoIm5vdGVzOiBzZWxmIHJlZnJlc2ggY2Fubm90IGNoYW5nZSByZWFkZXJzIikKCX0KCWNoYW5nZWQgOj0gZmFsc2UKCWZvciBpIDo9IDA7IGkgPCBpbnQob2xkWzFdKTsgaSsrIHsKCQlvZmYgOj0gMiArIGkqTWFuaWZlc3RFbnRyeUJ5dGVzCgkJcHJldmlvdXMgOj0gb2xkW29mZiA6IG9mZitNYW5pZmVzdEVudHJ5Qnl0ZXNdCgkJbmV4dCA6PSBtYW5pZmVzdFtvZmYgOiBvZmYrTWFuaWZlc3RFbnRyeUJ5dGVzXQoJCWlmIG1hbmlmZXN0QWRkcmVzcyhwcmV2aW91c1s6MjBdKSA9PSB3aG8gewoJCQlpZiBzdHJpbmcocHJldmlvdXNbOjIxXSkgIT0gc3RyaW5nKG5leHRbOjIxXSkgewoJCQkJcGFuaWMoIm5vdGVzOiBzZWxmIHJlZnJlc2ggY2Fubm90IGNoYW5nZSByb2xlIikKCQkJfQoJCQljaGFuZ2VkID0gc3RyaW5nKHByZXZpb3VzKSAhPSBzdHJpbmcobmV4dCkKCQl9IGVsc2UgaWYgc3RyaW5nKHByZXZpb3VzKSAhPSBzdHJpbmcobmV4dCkgewoJCQlwYW5pYygibm90ZXM6IHNlbGYgcmVmcmVzaCBjYW5ub3QgY2hhbmdlIGFub3RoZXIgd3JhcCIpCgkJfQoJfQoJaWYgIWNoYW5nZWQgewoJCXBhbmljKCJub3Rlczogd3JhcCB1bmNoYW5nZWQiKQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCglnZXRFcG9jaChpZCwgbi5FcG9jaCkuTWFuaWZlc3QgPSBjb3BpZWQobWFuaWZlc3QpCglidW1wKG4sIHdobywgb3BJRCwgInNlbGYtcmVrZXkiKQp9ChqJGQoLZ2V0dGVycy5nbm8S+RhwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImVuY29kaW5nL2Jhc2U2NCIKCSJnbm8ubGFuZC9wL3NhbWNyZXcvYXZsIgoJa2V5cyAiZ25vLmxhbmQvci9zYW1jcmV3L2VuY2tleXNfdjEiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgpmdW5jIHEocyBzdHJpbmcpIHN0cmluZyAgICB7IHJldHVybiBzdHJjb252LlF1b3RlKHMpIH0KZnVuYyB1KG4gdWludDY0KSBzdHJpbmcgICAgeyByZXR1cm4gcShzdHJjb252LkZvcm1hdFVpbnQobiwgMTApKSB9CmZ1bmMgYmxvYihiIFtdYnl0ZSkgc3RyaW5nIHsgcmV0dXJuICJcIiIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoYikgKyAiXCIiIH0KZnVuYyBub3RlSlNPTihuICpub3RlLCB3aXRoQm9keSBib29sKSBzdHJpbmcgewoJcyA6PSBgeyJpZCI6YCArIHEoaWRUZXh0KG4uSUQpKSArIGAsIm93bmVyIjpgICsgcShzdHJpbmcobi5Pd25lcikpICsgYCwicGVuZGluZ19vd25lciI6YCArIHEoc3RyaW5nKG4uUGVuZGluZ093bmVyKSkgKyBgLCJvd25lcl9nZW5lcmF0aW9uIjpgICsgdShuLk93bmVyR2VuZXJhdGlvbikgKyBgLCJtb2RlIjpgICsgc3RyY29udi5JdG9hKGludChuLk1vZGUpKSArIGAsInN0YXRlX3JldmlzaW9uIjpgICsgdShuLlJldmlzaW9uKSArIGAsInRpdGxlX3JldmlzaW9uIjpgICsgdShuLlRpdGxlUmV2aXNpb24pICsgYCwiYm9keV9yZXZpc2lvbiI6YCArIHUobi5Cb2R5UmV2aXNpb24pICsgYCwiZXBvY2giOmAgKyB1KHVpbnQ2NChuLkVwb2NoKSkgKyBgLCJib2R5X2J5dGVzIjpgICsgcShzdHJjb252Lkl0b2Eobi5Cb2R5Qnl0ZXMpKSArIGAsInRpdGxlX2Jsb2IiOmAgKyBibG9iKG4uVGl0bGUpICsgYCwiY29tbWl0bWVudCI6YCArIGJsb2Iobi5Db21taXRtZW50KSArIGAsImRlbGV0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wobi5EZWxldGVkKSArIGAsImxpc3RlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChuLkxpc3RlZCAmJiAhbi5Nb2RlcmF0b3JIaWRkZW4pICsgYCwib3duZXJfbGlzdGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKG4uTGlzdGVkKSArIGAsIm1vZGVyYXRvcl9oaWRkZW4iOmAgKyBzdHJjb252LkZvcm1hdEJvb2wobi5Nb2RlcmF0b3JIaWRkZW4pICsgYCwiY3JlYXRlZF9oZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KG4uQ3JlYXRlZEhlaWdodCwgMTApKSArIGAsIm9wX2lkIjpgICsgcShpZFRleHQobi5MYXN0Lk9wZXJhdGlvbikpICsgYCwiZXhlY3V0b3IiOmAgKyBxKHN0cmluZyhuLkxhc3RFeGVjdXRvcikpICsgYCwiZ292X3dyaXRlcnMiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wobi5Hb3ZXcml0ZXJzKSArIGAsImFjdG9yIjpgICsgcShzdHJpbmcobi5MYXN0LkFjdG9yKSkgKyBgLCJoZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KG4uTGFzdC5IZWlnaHQsIDEwKSkKCWlmIHdpdGhCb2R5IHsKCQlzICs9IGAsImJvZHlfYmxvYiI6YCArIGJsb2Iobi5Cb2R5KQoJfQoJcmV0dXJuIHMgKyBgfWAKfQpmdW5jIE5vdGVKU09OKGlkSGV4IHN0cmluZykgc3RyaW5nIHsKCXYsIG9rIDo9IG5vdGVzLkdldChpZFRleHQocmVhZElEKGlkSGV4KSkpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCXJldHVybiBub3RlSlNPTih2Ligqbm90ZSksIHRydWUpCn0KZnVuYyBwYWdlKHRyZWUgKmF2bC5UcmVlLCBwcmVmaXgsIGN1cnNvciBzdHJpbmcsIGxpbWl0IGludCkgc3RyaW5nIHsKCWlmIGxpbWl0IDwgMSB8fCBsaW1pdCA+IE1heFBhZ2UgewoJCXBhbmljKCJub3RlczogcGFnZSBsaW1pdCIpCgl9CglpZiBsZW4oY3Vyc29yKSA+IDUzIHsKCQlwYW5pYygibm90ZXM6IGN1cnNvciBsZW5ndGgiKQoJfQoJaWYgY3Vyc29yICE9ICIiIHsKCQlpZiBsZW4oY3Vyc29yKSAhPSA1MyB8fCBjdXJzb3JbMjBdICE9ICc6JyB7CgkJCXBhbmljKCJub3RlczogYmFkIGN1cnNvciIpCgkJfQoJCXJlYWRJRChjdXJzb3JbMjE6XSkKCQlmb3IgXywgYyA6PSByYW5nZSBjdXJzb3JbOjIwXSB7CgkJCWlmIGMgPCAnMCcgfHwgYyA+ICc5JyB7CgkJCQlwYW5pYygibm90ZXM6IGJhZCBjdXJzb3IiKQoJCQl9CgkJfQoJfQoJZW5kIDo9IHByZWZpeCArICJceGZmIgoJaWYgY3Vyc29yICE9ICIiIHsKCQllbmQgPSBwcmVmaXggKyBjdXJzb3IKCX0KCWl0ZW1zIDo9IFtdc3RyaW5ne30KCW5leHQgOj0gIiIKCXRyZWUuUmV2ZXJzZUl0ZXJhdGUocHJlZml4LCBlbmQsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgaW50ZXJmYWNle30pIGJvb2wgewoJCWlmIGN1cnNvciAhPSAiIiAmJiBrZXkgPT0gZW5kIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCXYsIG9rIDo9IG5vdGVzLkdldCh2YWx1ZS4oc3RyaW5nKSkKCQlpZiAhb2sgewoJCQlwYW5pYygibm90ZXM6IGNvcnJ1cHQgaW5kZXgiKQoJCX0KCQlpdGVtcyA9IGFwcGVuZChpdGVtcywgbm90ZUpTT04odi4oKm5vdGUpLCBmYWxzZSkpCgkJbmV4dCA9IHN0cmluZ3MuVHJpbVByZWZpeChrZXksIHByZWZpeCkKCQlyZXR1cm4gbGVuKGl0ZW1zKSA9PSBsaW1pdAoJfSkKCWlmIGxlbihpdGVtcykgPCBsaW1pdCB7CgkJbmV4dCA9ICIiCgl9CglyZXR1cm4gYHsiaXRlbXMiOltgICsgc3RyaW5ncy5Kb2luKGl0ZW1zLCAiLCIpICsgYF0sIm5leHRfY3Vyc29yIjpgICsgcShuZXh0KSArIGB9YAp9CmZ1bmMgTGlzdEJ5T3duZXJKU09OKGFkZHIgYWRkcmVzcywgY3Vyc29yIHN0cmluZywgbGltaXQgaW50KSBzdHJpbmcgewoJcmV0dXJuIHBhZ2Uob3duZXJJbmRleCwgc3RyaW5nKGtleXMuQ2Fub25pY2FsQWRkcmVzcyhhZGRyKSkrIjoiLCBjdXJzb3IsIGxpbWl0KQp9CmZ1bmMgTGlzdFB1YmxpY0pTT04oY3Vyc29yIHN0cmluZywgbGltaXQgaW50KSBzdHJpbmcgeyByZXR1cm4gcGFnZShwdWJsaWNJbmRleCwgIiIsIGN1cnNvciwgbGltaXQpIH0KZnVuYyBDb25maWdKU09OKCkgc3RyaW5nIHsKCXJldHVybiBgeyJyZWFsbSI6YCArIHEoUmVhbG1QYXRoKSArIGAsImFkbWluIjpgICsgcShzdHJpbmcoYWRtaW4pKSArIGAsInBlbmRpbmdfYWRtaW4iOmAgKyBxKHN0cmluZyhwZW5kaW5nQWRtaW4pKSArIGAsInRyZWFzdXJ5IjpgICsgcShzdHJpbmcodHJlYXN1cnkpKSArIGAsImNyZWF0ZV9mZWVfdWdub3QiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KGNyZWF0ZUZlZSwgMTApKSArIGAsInBhdXNlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChwYXVzZWQpICsgYH1gCn0KGkgKC2dub21vZC50b21sEjltb2R1bGUgPSAiZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX25vdGVzX3YxIgpnbm8gPSAiMC45Igoa7zgKB2dvdi5nbm8S4zhwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9iaW5hcnkiCgkiZW5jb2RpbmcvaGV4IgoJImduby5sYW5kL3Avc2FtY3Jldy9kYW9hdXRoIgoJZ292ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZ292IgoJInN0cmNvbnYiCikKCmNvbnN0IEdvdlJlYWxtUGF0aCA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZ292IgoKdmFyIGdvdkFkZHJlc3MgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhHb3ZSZWFsbVBhdGgpCgpmdW5jIGdvdk1lbWJlcih3aG8gYWRkcmVzcykgYm9vbCB7IHJldHVybiBnb3YuSXNNZW1iZXIod2hvKSB9CmZ1bmMgU2V0R292V3JpdGVycyhjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBvbiBib29sLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVNldEdvdldyaXRlcnMoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIG9uLCBvcElEKQp9CmZ1bmMgbXV0YXRlU2V0R292V3JpdGVycyhjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgb24gYm9vbCwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgbi5Pd25lciAhPSBnb3ZBZGRyZXNzIHsKCQlwYW5pYygibm90ZXM6IGdvdiBvd25lciByZXF1aXJlZCIpCgl9CglvcGVyYXRpb24obiwgb3BJRCkKCW4uR292V3JpdGVycyA9IG9uCglidW1wKG4sIHdobywgb3BJRCwgImdvdi13cml0ZXJzIikKfQpmdW5jIHZhbGlkR292QWN0aW9uKGFjdGlvbiBzdHJpbmcpIGJvb2wgewoJc3dpdGNoIGFjdGlvbiB7CgljYXNlICJBY2NlcHRPd25lcnNoaXAiLCAiQ29tbWl0IiwgIlJlbmFtZSIsICJSb3RhdGUiLCAiQXBwbHlBY2Nlc3MiLCAiUHVibGlzaCIsICJSZXZlYWwiLCAiRGVsZXRlIiwgIkFkZFdyaXRlciIsICJSZW1vdmVXcml0ZXIiLCAiUHJvcG9zZU93bmVyIiwgIlNldFBvbGljeSIsICJTZXRDb21tZW50TW9kZSIsICJTZXRQdWJsaWNXcml0ZXMiLCAiU2V0TGlzdGVkIiwgIk1vZGVyYXRlTGlzdGluZyIsICJTZXRHb3ZXcml0ZXJzIiwgIkhpZGVDb21tZW50IiwgIlJlc29sdmVDb21tZW50IiwgIlJlamVjdEFjY2Vzc1JlcXVlc3QiLCAiUHVyZ2UiOgoJCXJldHVybiB0cnVlCgl9CglyZXR1cm4gZmFsc2UKfQoKLy8gVGhlIHR5cGVkIHBheWxvYWQgaXMgYm91bmRlZCBhbmQgaGFzaGVkIGFzIGJ5dGVzLCBpbmNsdWRpbmcgaXRzIHZlcnNpb24uCi8vIEV2ZXJ5IHByZWNvbmRpdGlvbiBhbmQgb3BJRCBpcyBkb21haW4tYm91bmQ7IG5vIHJhdyBsYXJnZS9Vbmljb2RlIGNvbnRlbnQgaXMKLy8gcHV0IGluIGRhb2F1dGgncyAxMDI0LWJ5dGUgcHJpbnRhYmxlLUFTQ0lJIGFyZ3VtZW50IGVudmVsb3BlLgpmdW5jIGdvdkRpZ2VzdChuICpub3RlLCBiYXNlUmV2aXNpb24sIG93bmVyR2VuZXJhdGlvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBhY3Rpb24gc3RyaW5nLCBwYXlsb2FkIFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgc3RyaW5nIHsKCWlmICF2YWxpZEdvdkFjdGlvbihhY3Rpb24pIHx8IGxlbihwYXlsb2FkKSA8IDEgfHwgbGVuKHBheWxvYWQpID4gTWF4R292UGF5bG9hZEJ5dGVzIHsKCQlwYW5pYygibm90ZXM6IHVua25vd24vb3ZlcnNpemUgZ292IG9wZXJhdGlvbiIpCgl9CgliIDo9IGFwcGVuZFRleHQobmlsLCAibWVtYmEtbm90ZXMvdjEvZ292LW9wZXJhdGlvbiIpCgliID0gYXBwZW5kVGV4dChiLCBydW50aW1lLkNoYWluSUQoKSkKCWIgPSBhcHBlbmRUZXh0KGIsIFJlYWxtUGF0aCkKCWIgPSBhcHBlbmQoYiwgbi5JRFs6XS4uLikKCW51bWJlciA6PSBtYWtlKFtdYnl0ZSwgOCkKCWJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDY0KG51bWJlciwgb3duZXJHZW5lcmF0aW9uKQoJYiA9IGFwcGVuZChiLCBudW1iZXIuLi4pCgliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQ2NChudW1iZXIsIGJhc2VSZXZpc2lvbikKCWIgPSBhcHBlbmQoYiwgbnVtYmVyLi4uKQoJZXAgOj0gbWFrZShbXWJ5dGUsIDQpCgliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihlcCwgZXhwZWN0ZWRFcG9jaCkKCWIgPSBhcHBlbmQoYiwgZXAuLi4pCgliID0gYXBwZW5kKGIsIG4uTW9kZSkKCWIgPSBhcHBlbmRUZXh0KGIsIHN0cmluZyhuLk93bmVyKSkKCWIgPSBhcHBlbmRUZXh0KGIsIHN0cmluZyhuLlBlbmRpbmdPd25lcikpCgliID0gYXBwZW5kVGV4dChiLCBzdHJpbmcobi5Db21taXRtZW50KSkKCWIgPSBhcHBlbmRUZXh0KGIsIGFjdGlvbikKCWhhc2ggOj0gc2hhMjU2LlN1bTI1NihwYXlsb2FkKQoJYiA9IGFwcGVuZChiLCBoYXNoWzpdLi4uKQoJYiA9IGFwcGVuZChiLCBvcElEWzpdLi4uKQoJZGlnZXN0IDo9IHNoYTI1Ni5TdW0yNTYoYikKCXJldHVybiBoZXguRW5jb2RlVG9TdHJpbmcoZGlnZXN0WzpdKQp9CmZ1bmMgR292RGlnZXN0KGlkSGV4IHN0cmluZywgYmFzZVJldmlzaW9uLCBvd25lckdlbmVyYXRpb24gdWludDY0LCBleHBlY3RlZEVwb2NoIHVpbnQzMiwgYWN0aW9uIHN0cmluZywgcGF5bG9hZCBbXWJ5dGUsIG9wSUQgWzE2XWJ5dGUpIHN0cmluZyB7CglyZXR1cm4gZ292RGlnZXN0KGZpbmQocmVhZElEKGlkSGV4KSksIGJhc2VSZXZpc2lvbiwgb3duZXJHZW5lcmF0aW9uLCBleHBlY3RlZEVwb2NoLCBhY3Rpb24sIHBheWxvYWQsIG9wSUQpCn0KZnVuYyBHb3ZBcHBseShjdXIgcmVhbG0sIHBpZCB1aW50NjQsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24sIG93bmVyR2VuZXJhdGlvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBhY3Rpb24gc3RyaW5nLCBwYXlsb2FkIFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJZXhlY3V0b3IgOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJub3RlczogZGlyZWN0IGdvdmVybmFuY2UgZXhlY3V0b3IgcmVxdWlyZWQiKQoJfQoJb3BlcmF0aW9uKG5pbCwgb3BJRCkKCW4gOj0gZmluZChpZCkKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmIG93bmVyR2VuZXJhdGlvbiAhPSBuLk93bmVyR2VuZXJhdGlvbiB8fCBleHBlY3RlZEVwb2NoICE9IG4uRXBvY2ggewoJCXBhbmljKCJub3Rlczogc3RhbGUgZ292ZXJuYW5jZSBnZW5lcmF0aW9uL2Vwb2NoIikKCX0KCWlmIGFjdGlvbiA9PSAiQWNjZXB0T3duZXJzaGlwIiB7CgkJaWYgbi5QZW5kaW5nT3duZXIgIT0gZ292QWRkcmVzcyB7CgkJCXBhbmljKCJub3RlczogcGVuZGluZyBnb3Ygb3duZXIgcmVxdWlyZWQiKQoJCX0KCX0gZWxzZSBpZiBuLk93bmVyICE9IGdvdkFkZHJlc3MgJiYgISgoYWN0aW9uID09ICJNb2RlcmF0ZUxpc3RpbmciIHx8IGFjdGlvbiA9PSAiSGlkZUNvbW1lbnQiKSAmJiBtb2RlcmF0b3IoZ292QWRkcmVzcykpIHsKCQlwYW5pYygibm90ZXM6IGdvdiBvd25lciByZXF1aXJlZCIpCgl9CglkaWdlc3QgOj0gZ292RGlnZXN0KG4sIGJhc2VSZXZpc2lvbiwgb3duZXJHZW5lcmF0aW9uLCBleHBlY3RlZEVwb2NoLCBhY3Rpb24sIHBheWxvYWQsIG9wSUQpCgkvLyBGYWlsdXJlIGluIGRpc3BhdGNoIGFsc28gcm9sbHMgYmFjayBDb25zdW1lIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLgoJZ292LkNvbnN1bWUoY3Jvc3MoY3VyKSwgcGlkLCAibm90ZXMuIithY3Rpb24sIGRhb2F1dGguTmV3KCkuU3RyKGRpZ2VzdCkuU3RyaW5nKCksICJub3RlOiIraWRUZXh0KGlkKSwgZ292LlJvdXRpbmUsIGV4ZWN1dG9yKQoJaGlzdG9yeUdvdiA9ICZoaXN0b3J5Q2FsbHtleGVjdXRvciwgcGlkLCBvcElELCBhY3Rpb259CglkZWZlciBmdW5jKCkgeyBoaXN0b3J5R292ID0gbmlsIH0oKQoJZGlzcGF0Y2hHb3YoY3VyLCBuLCBiYXNlUmV2aXNpb24sIGV4cGVjdGVkRXBvY2gsIGFjdGlvbiwgcGF5bG9hZCwgb3BJRCkKCWlmIG4uUmV2aXNpb24gPiBiYXNlUmV2aXNpb24gJiYgbi5MYXN0Lk9wZXJhdGlvbiA9PSBvcElEIHsKCQluLkxhc3RFeGVjdXRvciA9IGV4ZWN1dG9yCgl9CgljaGFpbi5FbWl0KCJOb3RlR292ZXJuZWQiLCAiaWQiLCBpZFRleHQoaWQpLCAiYWN0aW9uIiwgYWN0aW9uLCAicGlkIiwgc3RyY29udi5Gb3JtYXRVaW50KHBpZCwgMTApLCAiZXhlY3V0b3IiLCBzdHJpbmcoZXhlY3V0b3IpLCAib3BfaWQiLCBpZFRleHQob3BJRCkpCn0KZnVuYyBkaXNwYXRjaEdvdihjdXIgcmVhbG0sIG4gKm5vdGUsIHJldiB1aW50NjQsIGVwb2NoIHVpbnQzMiwgYWN0aW9uIHN0cmluZywgcGF5bG9hZCBbXWJ5dGUsIG9wIFsxNl1ieXRlKSB7CglyIDo9IHBheWxvYWRSZWFkZXIocGF5bG9hZCkKCWlkIDo9IG4uSUQKCXdobyA6PSBnb3ZBZGRyZXNzCglzd2l0Y2ggYWN0aW9uIHsKCWNhc2UgIkFjY2VwdE93bmVyc2hpcCI6CgkJci5kb25lKCkKCQltdXRhdGVBY2NlcHRPd25lcnNoaXAoY3VyLCB3aG8sIGlkLCByZXYsIG9wKQoJY2FzZSAiQ29tbWl0IjoKCQltYXNrIDo9IHIuYnl0ZSgpCgkJdGl0bGUgOj0gci5ibG9iKE1heENpcGhlclRpdGxlQnl0ZXMpCgkJYm9keSA6PSByLmJsb2IoTWF4Q2lwaGVyQm9keUJ5dGVzKQoJCXIuZG9uZSgpCgkJbXV0YXRlQ29tbWl0KGN1ciwgd2hvLCBpZCwgcmV2LCBlcG9jaCwgbWFzaywgdGl0bGUsIGJvZHksIG9wKQoJY2FzZSAiUmVuYW1lIjoKCQl0aXRsZSA6PSByLmJsb2IoTWF4Q2lwaGVyVGl0bGVCeXRlcykKCQlyLmRvbmUoKQoJCW11dGF0ZUNvbW1pdChjdXIsIHdobywgaWQsIHJldiwgZXBvY2gsIDEsIHRpdGxlLCBuaWwsIG9wKQoJY2FzZSAiUm90YXRlIjoKCQltb2RlIDo9IHIuYnl0ZSgpCgkJdGl0bGUgOj0gci5ibG9iKE1heENpcGhlclRpdGxlQnl0ZXMpCgkJYm9keSA6PSByLmJsb2IoTWF4Q2lwaGVyQm9keUJ5dGVzKQoJCW1hbmlmZXN0IDo9IHIuYmxvYihNYXhNYW5pZmVzdEJ5dGVzKQoJCWtjIDo9IHIuYmxvYigzMikKCQlyLmRvbmUoKQoJCW11dGF0ZVJvdGF0ZShjdXIsIHdobywgaWQsIHJldiwgZXBvY2gsIG1vZGUsIHRpdGxlLCBib2R5LCBtYW5pZmVzdCwga2MsIG9wKQoJY2FzZSAiQXBwbHlBY2Nlc3MiOgoJCW1vZGUgOj0gci5ieXRlKCkKCQltYW5pZmVzdCA6PSByLmJsb2IoTWF4TWFuaWZlc3RCeXRlcykKCQlyLmRvbmUoKQoJCW11dGF0ZUFwcGx5QWNjZXNzKGN1ciwgd2hvLCBpZCwgcmV2LCBlcG9jaCwgbW9kZSwgbWFuaWZlc3QsIG9wKQoJY2FzZSAiUHVibGlzaCI6CgkJbW9kZSA6PSByLmJ5dGUoKQoJCXRpdGxlIDo9IHIuYmxvYihNYXhUaXRsZUJ5dGVzKQoJCWJvZHkgOj0gci5ibG9iKE1heEJvZHlCeXRlcykKCQlyLmRvbmUoKQoJCW11dGF0ZVB1Ymxpc2goY3VyLCB3aG8sIGlkLCByZXYsIG1vZGUsIHRpdGxlLCBib2R5LCBvcCkKCWNhc2UgIlJldmVhbCI6CgkJZXAgOj0gci51MzIoKQoJCWtleSA6PSByLnRha2UoMzIpCgkJci5kb25lKCkKCQltdXRhdGVSZXZlYWwoY3VyLCB3aG8sIGlkLCByZXYsIGVwLCBrZXksIG9wKQoJY2FzZSAiRGVsZXRlIjoKCQlyLmRvbmUoKQoJCW11dGF0ZURlbGV0ZShjdXIsIHdobywgaWQsIHJldiwgb3ApCgljYXNlICJBZGRXcml0ZXIiLCAiUmVtb3ZlV3JpdGVyIiwgIlByb3Bvc2VPd25lciI6CgkJdG8gOj0gYWRkcmVzcyhzdHJpbmcoci5ibG9iKDkwKSkpCgkJci5kb25lKCkKCQlpZiBhY3Rpb24gPT0gIkFkZFdyaXRlciIgewoJCQltdXRhdGVBZGRXcml0ZXIoY3VyLCB3aG8sIGlkLCByZXYsIHRvLCBvcCkKCQl9IGVsc2UgaWYgYWN0aW9uID09ICJSZW1vdmVXcml0ZXIiIHsKCQkJbXV0YXRlUmVtb3ZlV3JpdGVyKGN1ciwgd2hvLCBpZCwgcmV2LCB0bywgb3ApCgkJfSBlbHNlIHsKCQkJbXV0YXRlUHJvcG9zZU93bmVyKGN1ciwgd2hvLCBpZCwgcmV2LCB0bywgb3ApCgkJfQoJY2FzZSAiU2V0UG9saWN5IjoKCQlraW5kIDo9IHIuYnl0ZSgpCgkJa2V5IDo9IHN0cmluZyhyLmJsb2IoMjMzKSkKCQlyLmRvbmUoKQoJCW11dGF0ZVNldFBvbGljeShjdXIsIHdobywgaWQsIHJldiwga2luZCwga2V5LCBvcCkKCWNhc2UgIlNldFB1YmxpY1dyaXRlcyI6CgkJb24gOj0gci5ib29sZWFuKCkKCQlyLmRvbmUoKQoJCW11dGF0ZVNldFB1YmxpY1dyaXRlcyhjdXIsIHdobywgaWQsIHJldiwgb24sIG9wKQoJY2FzZSAiU2V0Q29tbWVudE1vZGUiOgoJCW9uIDo9IHIuYm9vbGVhbigpCgkJci5kb25lKCkKCQltdXRhdGVTZXRDb21tZW50TW9kZShjdXIsIHdobywgaWQsIHJldiwgb24sIG9wKQoJY2FzZSAiU2V0TGlzdGVkIjoKCQlvbiA6PSByLmJvb2xlYW4oKQoJCXIuZG9uZSgpCgkJbXV0YXRlU2V0TGlzdGVkKGN1ciwgd2hvLCBpZCwgcmV2LCBvbiwgb3ApCgljYXNlICJNb2RlcmF0ZUxpc3RpbmciOgoJCW9uIDo9IHIuYm9vbGVhbigpCgkJci5kb25lKCkKCQltdXRhdGVNb2RlcmF0ZUxpc3RpbmcoY3VyLCB3aG8sIGlkLCByZXYsIG9uLCBvcCkKCWNhc2UgIlNldEdvdldyaXRlcnMiOgoJCW9uIDo9IHIuYm9vbGVhbigpCgkJci5kb25lKCkKCQltdXRhdGVTZXRHb3ZXcml0ZXJzKGN1ciwgd2hvLCBpZCwgcmV2LCBvbiwgb3ApCgljYXNlICJIaWRlQ29tbWVudCIsICJSZXNvbHZlQ29tbWVudCI6CgkJY2lkIDo9IHIuaWQoKQoJCWNvbW1lbnRSZXYgOj0gci51NjQoKQoJCW9uIDo9IHIuYm9vbGVhbigpCgkJci5kb25lKCkKCQlpZiBhY3Rpb24gPT0gIkhpZGVDb21tZW50IiB7CgkJCW11dGF0ZUhpZGVDb21tZW50KGN1ciwgd2hvLCBpZCwgY2lkLCBjb21tZW50UmV2LCBvbiwgb3ApCgkJfSBlbHNlIHsKCQkJbXV0YXRlUmVzb2x2ZUNvbW1lbnQoY3VyLCB3aG8sIGlkLCBjaWQsIGNvbW1lbnRSZXYsIG9uLCBvcCkKCQl9CgljYXNlICJSZWplY3RBY2Nlc3NSZXF1ZXN0IjoKCQl0byA6PSBhZGRyZXNzKHN0cmluZyhyLmJsb2IoOTApKSkKCQlwcmlvck9wIDo9IHIuaWQoKQoJCXIuZG9uZSgpCgkJdiwgb2sgOj0gcmVxdWVzdHMuR2V0KHJlcXVlc3RLZXkoaWQsIHRvKSkKCQlpZiAhb2sgfHwgdi4oKmFjY2Vzc1JlcXVlc3QpLkxhc3QuT3BlcmF0aW9uICE9IHByaW9yT3AgewoJCQlwYW5pYygibm90ZXM6IHN0YWxlIHJlcXVlc3QgYXBwcm92YWwiKQoJCX0KCQltdXRhdGVSZWplY3RBY2Nlc3NSZXF1ZXN0KGN1ciwgd2hvLCBpZCwgdG8sIG9wKQoJY2FzZSAiUHVyZ2UiOgoJCWxpbWl0IDo9IHIuYnl0ZSgpCgkJci5kb25lKCkKCQltdXRhdGVQdXJnZShjdXIsIHdobywgaWQsIGludChsaW1pdCkpCglkZWZhdWx0OgoJCXBhbmljKCJub3RlczogdW5rbm93biBnb3Zlcm5hbmNlIGFjdGlvbiIpCgl9Cn0KGuEJCg1nb3ZfY29kZWMuZ25vEs8JcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICgKCSJlbmNvZGluZy9iaW5hcnkiCikKCmNvbnN0IE1heEdvdlBheWxvYWRCeXRlcyA9IE1heENpcGhlclRpdGxlQnl0ZXMgKyBNYXhDaXBoZXJCb2R5Qnl0ZXMgKyBNYXhNYW5pZmVzdEJ5dGVzICsgMTI4Cgp0eXBlIGdvdlJlYWRlciBzdHJ1Y3QgewoJYnl0ZXMgW11ieXRlCglwb3MgICBpbnQKfQoKZnVuYyBwYXlsb2FkUmVhZGVyKHBheWxvYWQgW11ieXRlKSAqZ292UmVhZGVyIHsKCWlmIGxlbihwYXlsb2FkKSA8IDEgfHwgbGVuKHBheWxvYWQpID4gTWF4R292UGF5bG9hZEJ5dGVzIHx8IHBheWxvYWRbMF0gIT0gMSB7CgkJcGFuaWMoIm5vdGVzOiBnb3YgcGF5bG9hZCBmb3JtYXQiKQoJfQoJcmV0dXJuICZnb3ZSZWFkZXJ7cGF5bG9hZCwgMX0KfQpmdW5jIChyICpnb3ZSZWFkZXIpIHRha2UobiBpbnQpIFtdYnl0ZSB7CglpZiBuIDwgMCB8fCBuID4gbGVuKHIuYnl0ZXMpLXIucG9zIHsKCQlwYW5pYygibm90ZXM6IGdvdiBwYXlsb2FkIHRydW5jYXRlZCIpCgl9CgliIDo9IHIuYnl0ZXNbci5wb3MgOiByLnBvcytuXQoJci5wb3MgKz0gbgoJcmV0dXJuIGIKfQpmdW5jIChyICpnb3ZSZWFkZXIpIGJ5dGUoKSB1aW50OCB7IHJldHVybiByLnRha2UoMSlbMF0gfQpmdW5jIChyICpnb3ZSZWFkZXIpIGJvb2xlYW4oKSBib29sIHsKCXYgOj0gci5ieXRlKCkKCWlmIHYgPiAxIHsKCQlwYW5pYygibm90ZXM6IGdvdiBib29sIikKCX0KCXJldHVybiB2ID09IDEKfQpmdW5jIChyICpnb3ZSZWFkZXIpIHU2NCgpIHVpbnQ2NCAgeyByZXR1cm4gYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoci50YWtlKDgpKSB9CmZ1bmMgKHIgKmdvdlJlYWRlcikgdTMyKCkgdWludDMyICB7IHJldHVybiBiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihyLnRha2UoNCkpIH0KZnVuYyAociAqZ292UmVhZGVyKSBpZCgpIFsxNl1ieXRlIHsgdmFyIHYgWzE2XWJ5dGU7IGNvcHkodls6XSwgci50YWtlKDE2KSk7IHJldHVybiB2IH0KZnVuYyAociAqZ292UmVhZGVyKSBibG9iKGNhcCBpbnQpIFtdYnl0ZSB7CgluIDo9IHIudTMyKCkKCWlmIG4gPiB1aW50MzIoY2FwKSB7CgkJcGFuaWMoIm5vdGVzOiBnb3YgZmllbGQgY2FwIikKCX0KCXJldHVybiByLnRha2UoaW50KG4pKQp9CmZ1bmMgKHIgKmdvdlJlYWRlcikgZG9uZSgpIHsKCWlmIHIucG9zICE9IGxlbihyLmJ5dGVzKSB7CgkJcGFuaWMoIm5vdGVzOiBnb3YgdHJhaWxpbmcgYnl0ZXMiKQoJfQp9ChqJWAoLaGlzdG9yeS5nbm8S+VdwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUiCgkiY3J5cHRvL3NoYTI1NiIKCSJlbmNvZGluZy9oZXgiCgkiZ25vLmxhbmQvcC9zYW1jcmV3L2F2bCIKCSJzdHJjb252IgoJInN0cmluZ3MiCikKCi8vIEJ5dGVzIHNoYXJlcyB0aGUgbm90ZSdzIGNvbW1pdHRlZCBhcnJheTogZmllbGRzIGFyZSByZXBsYWNlZCwgbmV2ZXIgbXV0YXRlZCBpbgovLyBwbGFjZSwgc28gaGlzdG9yeSBzdG9yZXMgZWFjaCB2ZXJzaW9uIG9uY2UgYW5kIGEgbGF0ZXIgY29tbWl0IGZyZWVzIG5vdGhpbmcKLy8gYW5vdGhlciBhY2NvdW50IHBhaWQgZm9yLiBBIG1vZGVyYXRvciByZWRhY3Rpb24gY2xlYXJzIEJ5dGVzIGFuZCBrZWVwcyBIYXNoLgp0eXBlIGhpc3RvcnlCbG9iIHN0cnVjdCB7CglCeXRlcyAgICBbXWJ5dGUKCUhhc2ggICAgIHN0cmluZwoJUmVkYWN0ZWQgYm9vbAp9CgovLyBoaXN0b3J5VmVyc2lvbiBpcyB0aGUgcHVibGljIHN0YXRlIHJlY29yZGVkIGJ5IG9uZSBub3RlLWxldmVsIGV2ZW50LiBJdCBrZWVwcwovLyBvbmx5IHdoYXQgdGhlIHB1YmxpYyBoaXN0b3J5IHJlYWRzIGV4cG9zZSwgbmV2ZXIgYSBjb3B5IG9mIHRoZSBsaXZlIG5vdGU6IG5vCi8vIHByaXZhdGUgbWFuaWZlc3QsIHJlYWRlcnMsIGNvbW1pdG1lbnQgb3IgcmVjZWlwdHMuIFZlcnNpb25zIHRoYXQgbGVhdmUgYSBmaWVsZAovLyB1bmNoYW5nZWQgc2hhcmUgdGhhdCBmaWVsZCdzIGJsb2IuCnR5cGUgaGlzdG9yeVZlcnNpb24gc3RydWN0IHsKCVJldmlzaW9uLCBUaXRsZVJldmlzaW9uLCBCb2R5UmV2aXNpb24sIE93bmVyR2VuZXJhdGlvbiB1aW50NjQKCU93bmVyLCBQZW5kaW5nT3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzCglXcml0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW11hZGRyZXNzCglQb2xpY3lSZWFkLCBQb2xpY3lXcml0ZSwgUG9saWN5Q29tbWVudCAgICAgICAgICAgICAgICAgc3RyaW5nCglFcG9jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyCglNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgKCU93bmVySXNSZWFsbSwgR292V3JpdGVycywgTGlzdGVkLCBNb2RlcmF0b3JIaWRkZW4gICAgICBib29sCglEZWxldGVkLCBQdWJsaWNXcml0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAoJVGl0bGUsIEJvZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoaXN0b3J5QmxvYgp9CgovLyBoaXN0b3J5SW5mbyBpcyBrZXB0IG9uIHRoZSBwdWJsaWMgbm90ZSBpdHNlbGYgKG5vdGUuSGlzdG9yeSk7IHRoZSBub3RlIHJlY29yZAovLyBpcyByZXRhaW5lZCBmb3JldmVyIGFzIGEgdG9tYnN0b25lLCBzbyBpdCBuZWVkcyBubyBpbmRleCBvZiBpdHMgb3duLgp0eXBlIGhpc3RvcnlJbmZvIHN0cnVjdCB7CglTdGFydFJldmlzaW9uLCBTdGFydEJvZHlSZXZpc2lvbiwgSGVhZCB1aW50NjQKCUxhdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoaXN0b3J5VmVyc2lvbgp9CgovLyBPbmUgcmVjb3JkIHBlciBldmVudC4gT3BlcmF0aW9uIGFuZCBDb21tZW50IGhvbGQgdGhlIHJhdyAxNi1ieXRlIGlkcyAoIiIgZm9yCi8vIG5vbmUpLiBWZXJzaW9uIGlzIHNldCBvbiBub3RlLWxldmVsIGV2ZW50cyBvbmx5OyBjb21tZW50IGFuZCBjbGVhbnVwIGV2ZW50cwovLyByZXVzZSB0aGUgY3VycmVudCBzdGF0ZSByZXZpc2lvbiBhbmQgcmVjb3JkIG5vIHZlcnNpb24uCnR5cGUgaGlzdG9yeUVudHJ5IHN0cnVjdCB7CglTZXEsIFJldmlzaW9uLCBQcm9wb3NhbCAgICAgICAgICB1aW50NjQKCUhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0CglBY3RvciwgRXhlY3V0b3IgICAgICAgICAgICAgICAgICBhZGRyZXNzCglPcGVyYXRpb24sIENvbW1lbnQgICAgICAgICAgICAgICBzdHJpbmcKCUFjdGlvbiwgR292ZXJuYW5jZUFjdGlvbiwgRGV0YWlsIHN0cmluZwoJVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKmhpc3RvcnlWZXJzaW9uCn0KCi8vIGhpc3RvcnlDb21tZW50IGtlZXBzIHRoZSBmaXJzdCBwdWJsaWMgdmVyc2lvbiBvZiBhIGNvbW1lbnQgKFBhcmVudCB0byBCb2R5LAovLyBQYXJlbnQgYXMgYSByYXcgaWQgb3IgIiIpIGFuZCBpdHMgbGF0ZXN0IHByZXNlbnRhdGlvbi4gQW5jaG9yIGFuZCBCb2R5IHNoYXJlCi8vIHRoZSBsaXZlIGNvbW1lbnQncyBhcnJheXMsIHNvIGEgY29tbWVudCdzIHRleHQgaXMgc3RvcmVkIG9uY2UuCnR5cGUgaGlzdG9yeUNvbW1lbnQgc3RydWN0IHsKCVBhcmVudCAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCglBdXRob3IgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKCUJvZHlSZXZpc2lvbiAgICAgICAgICAgICAgICAgdWludDY0CglFcG9jaCAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMgoJQ3JlYXRlZEhlaWdodCAgICAgICAgICAgICAgICBpbnQ2NAoJQW5jaG9yLCBCb2R5ICAgICAgICAgICAgICAgICBbXWJ5dGUKCUFuY2hvckhpc3RvcnksIFBhcmVudEhpc3RvcnkgYm9vbAoJTGF0ZXN0U2VxICAgICAgICAgICAgICAgICAgICB1aW50NjQKCURlbGV0ZWQsIEhpZGRlbiwgUmVzb2x2ZWQgICAgYm9vbAoJUmVkYWN0ZWQgICAgICAgICAgICAgICAgICAgICBib29sCn0KdHlwZSBoaXN0b3J5Q2FsbCBzdHJ1Y3QgewoJRXhlY3V0b3IgIGFkZHJlc3MKCVByb3Bvc2FsICB1aW50NjQKCU9wZXJhdGlvbiBbMTZdYnl0ZQoJQWN0aW9uICAgIHN0cmluZwp9Cgp2YXIgaGlzdG9yeUVudHJpZXMgPSBhdmwuTmV3VHJlZSgpCnZhciBoaXN0b3J5Q29tbWVudHMgPSBhdmwuTmV3VHJlZSgpCgovLyBPbmx5IEdvdkFwcGx5IHNldHMgdGhpcyB3aGlsZSB0aGUgZXhpc3RpbmcgYnVzeSBndWFyZCBleGNsdWRlcyByZWVudHJ5Lgp2YXIgaGlzdG9yeUdvdiAqaGlzdG9yeUNhbGwKCmZ1bmMgaGlzdG9yeUtleShpZCBbMTZdYnl0ZSwgc2VxIHVpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRVaW50KHNlcSwgMTApCglyZXR1cm4gaWRUZXh0KGlkKSArICI6IiArIHN0cmluZ3MuUmVwZWF0KCIwIiwgMjAtbGVuKHMpKSArIHMKfQpmdW5jIGhpc3RvcnlJRCh0ZXh0IHN0cmluZykgWzE2XWJ5dGUgewoJaWQgOj0gcmVhZElEKHRleHQpCglpZiBpZCA9PSAoWzE2XWJ5dGV7fSkgewoJCXBhbmljKCJub3RlczogZW1wdHkgaGlzdG9yeSBpZCIpCgl9CglyZXR1cm4gaWQKfQpmdW5jIGhpc3RvcnlHZXQoaWQgWzE2XWJ5dGUpICpoaXN0b3J5SW5mbyB7Cgl2LCBvayA6PSBub3Rlcy5HZXQoaWRUZXh0KGlkKSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpub3RlKS5IaXN0b3J5Cn0KZnVuYyBoaXN0b3J5RW50cnlBdChpZCBbMTZdYnl0ZSwgc2VxIHVpbnQ2NCkgKmhpc3RvcnlFbnRyeSB7Cgl2LCBvayA6PSBoaXN0b3J5RW50cmllcy5HZXQoaGlzdG9yeUtleShpZCwgc2VxKSkKCWlmICFvayB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IGdhcCIpCgl9CglyZXR1cm4gdi4oKmhpc3RvcnlFbnRyeSkKfQoKLy8gaGlzdG9yeVZlcnNpb25BdCByZXR1cm5zIHRoZSB2ZXJzaW9uIHJlY29yZGVkIGJ5IHRoZSBldmVudCB3aXRoIHRoaXMgc2VxLCBvcgovLyBuaWwgd2hlbiB0aGVyZSBpcyBubyBzdWNoIGV2ZW50IG9yIGl0IGlzIGEgY29tbWVudC9jbGVhbnVwIGV2ZW50LgpmdW5jIGhpc3RvcnlWZXJzaW9uQXQoaWQgWzE2XWJ5dGUsIHNlcSB1aW50NjQpICpoaXN0b3J5VmVyc2lvbiB7Cgl2LCBvayA6PSBoaXN0b3J5RW50cmllcy5HZXQoaGlzdG9yeUtleShpZCwgc2VxKSkKCWlmICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpoaXN0b3J5RW50cnkpLlZlcnNpb24KfQoKLy8gaGlzdG9yeVJldmlzaW9uRW50cnkgZmluZHMgdGhlIG5vdGUtbGV2ZWwgZXZlbnQgb2YgYSBwdWJsaWMgc3RhdGUgcmV2aXNpb24KLy8gd2l0aG91dCBhbiBpbmRleC4gRW50cmllcyBhcmUgY29udGlndW91cyBmcm9tIHNlcSAxIGFuZCB0aGVpciBzdGF0ZSByZXZpc2lvbgovLyBuZXZlciBkZWNyZWFzZXM7IGVhY2ggc3RhdGUgcmV2aXNpb24gc2luY2UgcHVibGljYXRpb24gaXMgcmVjb3JkZWQgYnkgZXhhY3RseQovLyBvbmUgbm90ZS1sZXZlbCBldmVudCwgdGhlIGZpcnN0IGVudHJ5IGNhcnJ5aW5nIGl0LgpmdW5jIGhpc3RvcnlSZXZpc2lvbkVudHJ5KGlkIFsxNl1ieXRlLCBoICpoaXN0b3J5SW5mbywgcmV2aXNpb24gdWludDY0KSAqaGlzdG9yeUVudHJ5IHsKCWlmIHJldmlzaW9uIDwgaC5TdGFydFJldmlzaW9uIHx8IHJldmlzaW9uID4gaC5MYXRlc3QuUmV2aXNpb24gewoJCXJldHVybiBuaWwKCX0KCWxvLCBoaSA6PSB1aW50NjQoMSksIGguSGVhZAoJZm9yIGxvIDwgaGkgewoJCW1pZCA6PSBsbyArIChoaS1sbykvMgoJCWlmIGhpc3RvcnlFbnRyeUF0KGlkLCBtaWQpLlJldmlzaW9uIDwgcmV2aXNpb24gewoJCQlsbyA9IG1pZCArIDEKCQl9IGVsc2UgewoJCQloaSA9IG1pZAoJCX0KCX0KCWUgOj0gaGlzdG9yeUVudHJ5QXQoaWQsIGxvKQoJaWYgZS5SZXZpc2lvbiAhPSByZXZpc2lvbiB8fCBlLlZlcnNpb24gPT0gbmlsIHsKCQlwYW5pYygibm90ZXM6IGNvcnJ1cHQgaGlzdG9yeSIpCgl9CglyZXR1cm4gZQp9CmZ1bmMgaGlzdG9yeUJsb2JPZihkYXRhIFtdYnl0ZSkgKmhpc3RvcnlCbG9iIHsKCWhhc2ggOj0gc2hhMjU2LlN1bTI1NihkYXRhKQoJcmV0dXJuICZoaXN0b3J5QmxvYntCeXRlczogZGF0YSwgSGFzaDogaGV4LkVuY29kZVRvU3RyaW5nKGhhc2hbOl0pfQp9CmZ1bmMgcmF3SUQoaWQgWzE2XWJ5dGUpIHN0cmluZyB7CglpZiBpZCA9PSAoWzE2XWJ5dGV7fSkgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHN0cmluZyhpZFs6XSkKfQpmdW5jIGhpc3RvcnlOdWxsYWJsZVJhdyhyYXcgc3RyaW5nKSBzdHJpbmcgewoJaWYgcmF3ID09ICIiIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gcShoZXguRW5jb2RlVG9TdHJpbmcoW11ieXRlKHJhdykpKQp9CmZ1bmMgaGlzdG9yeUFwcGVuZChuICpub3RlLCB3aG8gYWRkcmVzcywgb3AsIGNpZCBbMTZdYnl0ZSwgYWN0aW9uLCBkZXRhaWwgc3RyaW5nKSAqaGlzdG9yeUVudHJ5IHsKCWggOj0gbi5IaXN0b3J5CglpZiBoID09IG5pbCB8fCBoLkhlYWQgPT0gXnVpbnQ2NCgwKSB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IHVuYXZhaWxhYmxlL2V4aGF1c3RlZCIpCgl9CgloLkhlYWQrKwoJZSA6PSAmaGlzdG9yeUVudHJ5e1NlcTogaC5IZWFkLCBSZXZpc2lvbjogbi5SZXZpc2lvbiwgSGVpZ2h0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksIEFjdG9yOiB3aG8sIE9wZXJhdGlvbjogcmF3SUQob3ApLCBDb21tZW50OiByYXdJRChjaWQpLCBBY3Rpb246IGFjdGlvbiwgRGV0YWlsOiBkZXRhaWx9CglpZiBoaXN0b3J5R292ICE9IG5pbCB7CgkJZS5FeGVjdXRvciwgZS5Qcm9wb3NhbCwgZS5Hb3Zlcm5hbmNlQWN0aW9uID0gaGlzdG9yeUdvdi5FeGVjdXRvciwgaGlzdG9yeUdvdi5Qcm9wb3NhbCwgaGlzdG9yeUdvdi5BY3Rpb24KCQllLk9wZXJhdGlvbiA9IHJhd0lEKGhpc3RvcnlHb3YuT3BlcmF0aW9uKQoJfQoJaWYgXywgZXhpc3RzIDo9IGhpc3RvcnlFbnRyaWVzLkdldChoaXN0b3J5S2V5KG4uSUQsIGUuU2VxKSk7IGV4aXN0cyB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IGNvbGxpc2lvbiIpCgl9CgloaXN0b3J5RW50cmllcy5TZXQoaGlzdG9yeUtleShuLklELCBlLlNlcSksIGUpCglyZXR1cm4gZQp9CmZ1bmMgaGlzdG9yeU5vdGUobiAqbm90ZSwgd2hvIGFkZHJlc3MsIG9wIFsxNl1ieXRlLCBhY3Rpb24sIGV4dHJhIHN0cmluZykgewoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlyZXR1cm4KCX0KCWggOj0gbi5IaXN0b3J5CglpZiBoID09IG5pbCB7CgkJaWYgYWN0aW9uICE9ICJjcmVhdGUiICYmIGFjdGlvbiAhPSAicHVibGlzaCIgewoJCQlwYW5pYygibm90ZXM6IG1pc3NpbmcgcHVibGljIGhpc3RvcnkiKQoJCX0KCQloID0gJmhpc3RvcnlJbmZve1N0YXJ0UmV2aXNpb246IG4uUmV2aXNpb24sIFN0YXJ0Qm9keVJldmlzaW9uOiBuLkJvZHlSZXZpc2lvbn0KCQluLkhpc3RvcnkgPSBoCgl9CglwcmV2aW91cyA6PSAibnVsbCIKCW1hc2sgOj0gMAoJaWYgaC5MYXRlc3QgIT0gbmlsIHsKCQlwcmV2aW91cyA9IHUoaC5MYXRlc3QuUmV2aXNpb24pCgkJaWYgbi5UaXRsZVJldmlzaW9uICE9IGguTGF0ZXN0LlRpdGxlUmV2aXNpb24gewoJCQltYXNrIHw9IDEKCQl9CgkJaWYgbi5Cb2R5UmV2aXNpb24gIT0gaC5MYXRlc3QuQm9keVJldmlzaW9uIHsKCQkJbWFzayB8PSAyCgkJfQoJfQoJc3dpdGNoIGFjdGlvbiB7CgljYXNlICJjb21taXQiOgoJCWFjdGlvbiA9ICJjb250ZW50LWNvbW1pdCIKCQlleHRyYSA9IGAsImZpZWxkX21hc2siOmAgKyBzdHJjb252Lkl0b2EobWFzaykKCWNhc2UgImNvbW1lbnRzLW1vZGUiOgoJCWFjdGlvbiA9ICJjb21tZW50LW1vZGUiCgljYXNlICJwb2xpY3kiOgoJCWFjdGlvbiA9ICJwb2xpY3ktc2V0IgoJY2FzZSAibGlzdGluZyI6CgkJYWN0aW9uID0gIm93bmVyLWxpc3RpbmciCgljYXNlICJtb2RlcmF0ZS1saXN0aW5nIjoKCQlhY3Rpb24gPSAibGlzdGluZy1tb2RlcmF0aW9uIgoJY2FzZSAiZGVsZXRlIjoKCQlhY3Rpb24gPSAibm90ZS1kZWxldGUiCgljYXNlICJyZXZlYWwiOgoJCWFjdGlvbiA9ICJsZWdhY3ktZXBvY2gtcmV2ZWFsIgoJY2FzZSAib3duZXItcHJvcG9zZSI6CgkJaWYgbi5QZW5kaW5nT3duZXIgPT0gIiIgewoJCQlhY3Rpb24gPSAib3duZXItY2FuY2VsIgoJCX0KCX0KCWUgOj0gaGlzdG9yeUFwcGVuZChuLCB3aG8sIG9wLCBbMTZdYnl0ZXt9LCBhY3Rpb24sIGB7InNuYXBzaG90X3JldmlzaW9uIjpgK3Uobi5SZXZpc2lvbikrYCwicHJldmlvdXNfc3RhdGVfcmV2aXNpb24iOmArcHJldmlvdXMrZXh0cmErYH1gKQoJdiA6PSAmaGlzdG9yeVZlcnNpb257UmV2aXNpb246IG4uUmV2aXNpb24sIFRpdGxlUmV2aXNpb246IG4uVGl0bGVSZXZpc2lvbiwgQm9keVJldmlzaW9uOiBuLkJvZHlSZXZpc2lvbiwgT3duZXJHZW5lcmF0aW9uOiBuLk93bmVyR2VuZXJhdGlvbiwKCQlPd25lcjogbi5Pd25lciwgUGVuZGluZ093bmVyOiBuLlBlbmRpbmdPd25lciwgV3JpdGVyczogaGlzdG9yeVdyaXRlcnMoaC5MYXRlc3QsIG4uV3JpdGVycyksCgkJUG9saWN5UmVhZDogbi5Qb2xpY2llc1swXSwgUG9saWN5V3JpdGU6IG4uUG9saWNpZXNbMV0sIFBvbGljeUNvbW1lbnQ6IG4uUG9saWNpZXNbMl0sIEVwb2NoOiBuLkVwb2NoLCBNb2RlOiBuLk1vZGUsCgkJT3duZXJJc1JlYWxtOiBuLk93bmVySXNSZWFsbSwgR292V3JpdGVyczogbi5Hb3ZXcml0ZXJzLCBMaXN0ZWQ6IG4uTGlzdGVkLCBNb2RlcmF0b3JIaWRkZW46IG4uTW9kZXJhdG9ySGlkZGVuLAoJCURlbGV0ZWQ6IG4uRGVsZXRlZCwgUHVibGljV3JpdGVzOiBwdWJsaWNXcml0ZXNFbmFibGVkKG4pfQoJaWYgIW4uRGVsZXRlZCB7CgkJaWYgaC5MYXRlc3QgIT0gbmlsICYmIGguTGF0ZXN0LlRpdGxlUmV2aXNpb24gPT0gbi5UaXRsZVJldmlzaW9uIHsKCQkJdi5UaXRsZSA9IGguTGF0ZXN0LlRpdGxlCgkJfSBlbHNlIHsKCQkJdi5UaXRsZSA9IGhpc3RvcnlCbG9iT2Yobi5UaXRsZSkKCQl9CgkJaWYgaC5MYXRlc3QgIT0gbmlsICYmIGguTGF0ZXN0LkJvZHlSZXZpc2lvbiA9PSBuLkJvZHlSZXZpc2lvbiB7CgkJCXYuQm9keSA9IGguTGF0ZXN0LkJvZHkKCQl9IGVsc2UgewoJCQl2LkJvZHkgPSBoaXN0b3J5QmxvYk9mKG4uQm9keSkKCQl9Cgl9CgllLlZlcnNpb24gPSB2CgloLkxhdGVzdCA9IHYKfQoKLy8gaGlzdG9yeVdyaXRlcnMgc2hhcmVzIHRoZSBwcmV2aW91cyB2ZXJzaW9uJ3Mgd3JpdGVyIGxpc3Qgd2hpbGUgaXQgaXMKLy8gdW5jaGFuZ2VkLiBSZWNvcmRlZCBsaXN0cyBhcmUgbmV2ZXIgbXV0YXRlZCwgYW5kIHRoZSBsaXZlIGxpc3QgaXMgbmV2ZXIKLy8gc2hhcmVkOiBhIGNoYW5nZWQgbGlzdCBpcyBjb3BpZWQsIHNpbmNlIFJlbW92ZVdyaXRlciBlZGl0cyBpdCBpbiBwbGFjZS4KZnVuYyBoaXN0b3J5V3JpdGVycyhsYXRlc3QgKmhpc3RvcnlWZXJzaW9uLCB3cml0ZXJzIFtdYWRkcmVzcykgW11hZGRyZXNzIHsKCWlmIGxhdGVzdCAhPSBuaWwgJiYgbGVuKGxhdGVzdC5Xcml0ZXJzKSA9PSBsZW4od3JpdGVycykgewoJCXNhbWUgOj0gdHJ1ZQoJCWZvciBpLCB3aG8gOj0gcmFuZ2Ugd3JpdGVycyB7CgkJCWlmIGxhdGVzdC5Xcml0ZXJzW2ldICE9IHdobyB7CgkJCQlzYW1lID0gZmFsc2UKCQkJCWJyZWFrCgkJCX0KCQl9CgkJaWYgc2FtZSB7CgkJCXJldHVybiBsYXRlc3QuV3JpdGVycwoJCX0KCX0KCXJldHVybiBjb3BpZWRBZGRyZXNzZXMod3JpdGVycykKfQpmdW5jIGhpc3RvcnlOdWxsYWJsZVRleHQocyBzdHJpbmcpIHN0cmluZyB7CglpZiBzID09ICIiIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gcShzKQp9CgovLyBoaXN0b3J5Q29tbWVudERldGFpbCByZW5kZXJzIGEgY29tbWVudCByZWZlcmVuY2U7IGNpZCBpcyB0aGUgaGV4IGlkIGFuZCBwYXJlbnQKLy8gdGhlIHJhdyBwYXJlbnQgaWQgKCIiIGZvciBhIHRvcC1sZXZlbCBjb21tZW50KS4KZnVuYyBoaXN0b3J5Q29tbWVudERldGFpbChjaWQsIHBhcmVudCBzdHJpbmcsIHJldmlzaW9uLCBib2R5UmV2aXNpb24gdWludDY0LCBkZWxldGVkLCBoaWRkZW4sIHJlc29sdmVkIGJvb2wsIGFyY2hpdmVkICpoaXN0b3J5Q29tbWVudCkgc3RyaW5nIHsKCWFuY2hvclJldmlzaW9uIDo9ICJudWxsIgoJaWYgYXJjaGl2ZWQuQW5jaG9ySGlzdG9yeSB7CgkJYW5jaG9yUmV2aXNpb24gPSB1KGJvZHlSZXZpc2lvbikKCX0KCXJldHVybiBgeyJjb21tZW50X2lkIjpgICsgcShjaWQpICsgYCwiY29tbWVudF9yZXZpc2lvbiI6YCArIHUocmV2aXNpb24pICsgYCwiY29udGVudF9yZWYiOmAgKyBxKGNpZCkgKyBgLCJib2R5X3JldmlzaW9uIjpgICsgdShib2R5UmV2aXNpb24pICsgYCwiYW5jaG9yX2hpc3RvcnlfYm9keV9yZXZpc2lvbiI6YCArIGFuY2hvclJldmlzaW9uICsgYCwicGFyZW50IjpgICsgaGlzdG9yeU51bGxhYmxlUmF3KHBhcmVudCkgKyBgLCJwYXJlbnRfaGlzdG9yeV9hdmFpbGFibGUiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woYXJjaGl2ZWQuUGFyZW50SGlzdG9yeSkgKyBgLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGRlbGV0ZWQpICsgYCwiaGlkZGVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGhpZGRlbikgKyBgLCJyZXNvbHZlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChyZXNvbHZlZCkgKyBgfWAKfQpmdW5jIGhpc3RvcnlDb21tZW50Q2hhbmdlKG4gKm5vdGUsIGMgKmNvbW1lbnQsIGFjdGlvbiBzdHJpbmcpIHsKCWlmICFwdWJsaWMobi5Nb2RlKSB8fCBjLkVuY3J5cHRlZCB7CgkJcmV0dXJuCgl9CglrZXkgOj0gY29tbWVudEtleShuLklELCBjLklEKQoJdmFsdWUsIGV4aXN0cyA6PSBoaXN0b3J5Q29tbWVudHMuR2V0KGtleSkKCXZhciBhcmNoaXZlZCAqaGlzdG9yeUNvbW1lbnQKCWlmIGFjdGlvbiA9PSAiY29tbWVudC1hZGQiIHsKCQlpZiBleGlzdHMgewoJCQlwYW5pYygibm90ZXM6IGNvbW1lbnQgaGlzdG9yeSBjb2xsaXNpb24iKQoJCX0KCQloIDo9IG4uSGlzdG9yeQoJCWlmIGggPT0gbmlsIHsKCQkJcGFuaWMoIm5vdGVzOiBtaXNzaW5nIHB1YmxpYyBoaXN0b3J5IikKCQl9CgkJLy8gRXZlcnkgYm9keSByZXZpc2lvbiBzaW5jZSBwdWJsaWNhdGlvbiBpcyByZWNvcmRlZCwgc28gdGhlIGFuY2hvcmVkCgkJLy8gdmVyc2lvbiBpcyBpbiBwdWJsaWMgaGlzdG9yeSBleGFjdGx5IHdoZW4gaXQgaXMgbm90IG9sZGVyIHRoYW4gdGhhdC4KCQlhbmNob3IgOj0gYy5Cb2R5UmV2aXNpb24gPj0gaC5TdGFydEJvZHlSZXZpc2lvbgoJCV8sIHBhcmVudCA6PSBoaXN0b3J5Q29tbWVudHMuR2V0KGNvbW1lbnRLZXkobi5JRCwgYy5QYXJlbnQpKQoJCS8vIEFuY2hvciBhbmQgQm9keSBzaGFyZSB0aGUgY29tbWVudCdzIGFycmF5cyBmb3IgdGhlIHNhbWUgc2luZ2xlLWNvcHkgcmVhc29uLgoJCWFyY2hpdmVkID0gJmhpc3RvcnlDb21tZW50e1BhcmVudDogcmF3SUQoYy5QYXJlbnQpLCBBdXRob3I6IGMuQXV0aG9yLCBCb2R5UmV2aXNpb246IGMuQm9keVJldmlzaW9uLCBFcG9jaDogYy5FcG9jaCwgQ3JlYXRlZEhlaWdodDogYy5DcmVhdGVkSGVpZ2h0LAoJCQlBbmNob3I6IGMuQW5jaG9yLCBCb2R5OiBjLkJvZHksIEFuY2hvckhpc3Rvcnk6IGFuY2hvciwgUGFyZW50SGlzdG9yeTogcGFyZW50fQoJCWhpc3RvcnlDb21tZW50cy5TZXQoa2V5LCBhcmNoaXZlZCkKCX0gZWxzZSB7CgkJaWYgIWV4aXN0cyB7CgkJCXBhbmljKCJub3RlczogbWlzc2luZyBwdWJsaWMgY29tbWVudCBoaXN0b3J5IikKCQl9CgkJYXJjaGl2ZWQgPSB2YWx1ZS4oKmhpc3RvcnlDb21tZW50KQoJfQoJZSA6PSBoaXN0b3J5QXBwZW5kKG4sIGMuTGFzdC5BY3RvciwgYy5MYXN0Lk9wZXJhdGlvbiwgYy5JRCwgYWN0aW9uLCBoaXN0b3J5Q29tbWVudERldGFpbChpZFRleHQoYy5JRCksIHJhd0lEKGMuUGFyZW50KSwgYy5SZXZpc2lvbiwgYy5Cb2R5UmV2aXNpb24sIGMuRGVsZXRlZCwgYy5IaWRkZW4sIGMuUmVzb2x2ZWQsIGFyY2hpdmVkKSkKCWFyY2hpdmVkLkxhdGVzdFNlcSwgYXJjaGl2ZWQuRGVsZXRlZCwgYXJjaGl2ZWQuSGlkZGVuLCBhcmNoaXZlZC5SZXNvbHZlZCA9IGUuU2VxLCBjLkRlbGV0ZWQsIGMuSGlkZGVuLCBjLlJlc29sdmVkCn0KZnVuYyBoaXN0b3J5Q2xlYW51cChuICpub3RlLCB3aG8gYWRkcmVzcywgY291bnRzIFs1XWludCkgewoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlyZXR1cm4KCX0KCXRvdGFsIDo9IGNvdW50c1swXSArIGNvdW50c1sxXSArIGNvdW50c1syXSArIGNvdW50c1szXSArIGNvdW50c1s0XQoJaWYgdG90YWwgPT0gMCB7CgkJcmV0dXJuCgl9CglkZXRhaWwgOj0gYHsiY29tbWVudF9pbmRleCI6YCArIHUodWludDY0KGNvdW50c1swXSkpICsgYCwiY29tbWVudHMiOmAgKyB1KHVpbnQ2NChjb3VudHNbMV0pKSArIGAsImNvb2xkb3ducyI6YCArIHUodWludDY0KGNvdW50c1syXSkpICsgYCwiZXBvY2hzIjpgICsgdSh1aW50NjQoY291bnRzWzNdKSkgKyBgLCJyZXF1ZXN0cyI6YCArIHUodWludDY0KGNvdW50c1s0XSkpICsgYCwidG90YWwiOmAgKyB1KHVpbnQ2NCh0b3RhbCkpICsgYH1gCgloaXN0b3J5QXBwZW5kKG4sIHdobywgWzE2XWJ5dGV7fSwgWzE2XWJ5dGV7fSwgImNsZWFudXAiLCBkZXRhaWwpCn0KGqw1ChFoaXN0b3J5X3JlYWRzLmdubxKWNXBhY2thZ2UgbWVtYmFfbm90ZXNfdjEKCmltcG9ydCAic3RyY29udiIKCmZ1bmMgUHVibGljSGlzdG9yeUluZm9KU09OKGlkSGV4IHN0cmluZykgc3RyaW5nIHsKCWlkIDo9IGhpc3RvcnlJRChpZEhleCkKCWggOj0gaGlzdG9yeUdldChpZCkKCWlmIGggPT0gbmlsIHsKCQlyZXR1cm4gIm51bGwiCgl9CgluIDo9IGguTGF0ZXN0CglyZXR1cm4gYHsic2NoZW1hIjoibWVtYmEubm90ZXMucHVibGljLWhpc3RvcnktaW5mby92MSIsImlkIjpgICsgcShpZEhleCkgKyBgLCJzdGFydF9zdGF0ZV9yZXZpc2lvbiI6YCArIHUoaC5TdGFydFJldmlzaW9uKSArIGAsInN0YXJ0X2JvZHlfcmV2aXNpb24iOmAgKyB1KGguU3RhcnRCb2R5UmV2aXNpb24pICsgYCwiaGVhZF9zZXEiOmAgKyB1KGguSGVhZCkgKyBgLCJsYXRlc3Rfc3RhdGVfcmV2aXNpb24iOmAgKyB1KG4uUmV2aXNpb24pICsgYCwicmV0ZW50aW9uIjoicHVibGljLW1vZGVyYXRvci1yZWRhY3RhYmxlIiwiY292ZXJhZ2UiOiJwdWJsaWMtc2luY2UtcHVibGljYXRpb24tdjEiLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKG4uRGVsZXRlZCkgKyBgLCJtb2RlcmF0b3JfaGlkZGVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKG4uTW9kZXJhdG9ySGlkZGVuKSArIGB9YAp9CmZ1bmMgaGlzdG9yeUVudHJ5RmllbGRzKGUgKmhpc3RvcnlFbnRyeSkgc3RyaW5nIHsKCXByb3Bvc2FsIDo9ICJudWxsIgoJaWYgZS5Qcm9wb3NhbCAhPSAwIHsKCQlwcm9wb3NhbCA9IHUoZS5Qcm9wb3NhbCkKCX0KCXJldHVybiBgInNlcSI6YCArIHUoZS5TZXEpICsgYCwiYWN0aW9uIjpgICsgcShlLkFjdGlvbikgKyBgLCJoZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KGUuSGVpZ2h0LCAxMCkpICsgYCwic3RhdGVfcmV2aXNpb24iOmAgKyB1KGUuUmV2aXNpb24pICsgYCwiYWN0b3IiOmAgKyBxKHN0cmluZyhlLkFjdG9yKSkgKyBgLCJleGVjdXRvciI6YCArIGhpc3RvcnlOdWxsYWJsZVRleHQoc3RyaW5nKGUuRXhlY3V0b3IpKSArIGAsIm9wX2lkIjpgICsgaGlzdG9yeU51bGxhYmxlUmF3KGUuT3BlcmF0aW9uKSArIGAsInByb3Bvc2FsX2lkIjpgICsgcHJvcG9zYWwKfQpmdW5jIFB1YmxpY0hpc3RvcnlKU09OKGlkSGV4IHN0cmluZywgYWZ0ZXJTZXEsIHRocm91Z2hTZXEgdWludDY0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglpZCA6PSBoaXN0b3J5SUQoaWRIZXgpCglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiAyMCB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IHBhZ2UgbGltaXQiKQoJfQoJaCA6PSBoaXN0b3J5R2V0KGlkKQoJaWYgaCA9PSBuaWwgewoJCXJldHVybiAibnVsbCIKCX0KCWlmIHRocm91Z2hTZXEgPT0gMCB7CgkJaWYgYWZ0ZXJTZXEgIT0gMCB7CgkJCXBhbmljKCJub3RlczogaGlzdG9yeSBmaXJzdCBwYWdlIGN1cnNvciIpCgkJfQoJCXRocm91Z2hTZXEgPSBoLkhlYWQKCX0KCWlmIGFmdGVyU2VxID4gdGhyb3VnaFNlcSB8fCB0aHJvdWdoU2VxID4gaC5IZWFkIHsKCQlwYW5pYygibm90ZXM6IGhpc3RvcnkgY3Vyc29yIikKCX0KCWl0ZW1zLCBuZXh0IDo9ICIiLCAibnVsbCIKCWxhc3QsIGNvdW50IDo9IGFmdGVyU2VxLCAwCgkvLyBEaXJlY3Qga2V5cyBwcmVzZXJ2ZSBjb250aWd1aXR5IHdpdGhvdXQgYSBzY2FuIG9yIGFmdGVyK2xpbWl0IG92ZXJmbG93LgoJZm9yIGxhc3QgPCB0aHJvdWdoU2VxICYmIGNvdW50IDwgbGltaXQgewoJCWxhc3QrKwoJCWUgOj0gaGlzdG9yeUVudHJ5QXQoaWQsIGxhc3QpCgkJaWYgY291bnQgPiAwIHsKCQkJaXRlbXMgKz0gIiwiCgkJfQoJCWl0ZW1zICs9ICJ7IiArIGhpc3RvcnlFbnRyeUZpZWxkcyhlKSArIGAsImNvbW1lbnRfaWQiOmAgKyBoaXN0b3J5TnVsbGFibGVSYXcoZS5Db21tZW50KSArICJ9IgoJCWNvdW50KysKCX0KCWlmIGxhc3QgPCB0aHJvdWdoU2VxIHsKCQluZXh0ID0gdShsYXN0KQoJfQoJcmV0dXJuIGB7InNjaGVtYSI6Im1lbWJhLm5vdGVzLnB1YmxpYy1oaXN0b3J5LXBhZ2UvdjEiLCJpZCI6YCArIHEoaWRIZXgpICsgYCwidGhyb3VnaF9zZXEiOmAgKyB1KHRocm91Z2hTZXEpICsgYCwiaXRlbXMiOltgICsgaXRlbXMgKyBgXSwibmV4dF9jdXJzb3IiOmAgKyBuZXh0ICsgYH1gCn0KZnVuYyBQdWJsaWNIaXN0b3J5RW50cnlKU09OKGlkSGV4IHN0cmluZywgc2VxIHVpbnQ2NCkgc3RyaW5nIHsKCXYsIG9rIDo9IGhpc3RvcnlFbnRyaWVzLkdldChoaXN0b3J5S2V5KGhpc3RvcnlJRChpZEhleCksIHNlcSkpCglpZiAhb2sgewoJCXJldHVybiAibnVsbCIKCX0KCWUgOj0gdi4oKmhpc3RvcnlFbnRyeSkKCXJldHVybiBgeyJzY2hlbWEiOiJtZW1iYS5ub3Rlcy5wdWJsaWMtaGlzdG9yeS1lbnRyeS92MSIsImlkIjpgICsgcShpZEhleCkgKyAiLCIgKyBoaXN0b3J5RW50cnlGaWVsZHMoZSkgKyBgLCJnb3Zlcm5hbmNlX2FjdGlvbiI6YCArIGhpc3RvcnlOdWxsYWJsZVRleHQoZS5Hb3Zlcm5hbmNlQWN0aW9uKSArIGAsImRldGFpbCI6YCArIGUuRGV0YWlsICsgYH1gCn0KCi8vIFB1YmxpY0hpc3RvcnlWZXJzaW9uSlNPTiByZWFkcyB0aGUgcHVibGljIHN0YXRlIHJlY29yZGVkIGF0IGEgc3RhdGUgcmV2aXNpb24uCi8vIHJlY29yZGVkX3NlcSBpcyB0aGUgZXZlbnQgdGhhdCByZWNvcmRlZCBpdDsgUHVibGljSGlzdG9yeUJvZHlDaHVua0pTT04gYW5kCi8vIFJlZGFjdFB1YmxpY0NvbnRlbnRBdFNlcSBhZGRyZXNzIHRoYXQgdmVyc2lvbiBieSB0aGlzIHNlcS4KZnVuYyBQdWJsaWNIaXN0b3J5VmVyc2lvbkpTT04oaWRIZXggc3RyaW5nLCBzdGF0ZVJldmlzaW9uIHVpbnQ2NCkgc3RyaW5nIHsKCWlkIDo9IGhpc3RvcnlJRChpZEhleCkKCWggOj0gaGlzdG9yeUdldChpZCkKCWlmIGggPT0gbmlsIHsKCQlyZXR1cm4gIm51bGwiCgl9CgllIDo9IGhpc3RvcnlSZXZpc2lvbkVudHJ5KGlkLCBoLCBzdGF0ZVJldmlzaW9uKQoJaWYgZSA9PSBuaWwgewoJCXJldHVybiAibnVsbCIKCX0KCXYgOj0gZS5WZXJzaW9uCgl0aXRsZVJldmlzaW9uLCB0aXRsZSwgYm9keVJldmlzaW9uLCBib2R5SGFzaCwgYm9keUJ5dGVzIDo9ICJudWxsIiwgIm51bGwiLCAibnVsbCIsICJudWxsIiwgIjAiCgl0aXRsZVJlZGFjdGVkLCBib2R5UmVkYWN0ZWQgOj0gZmFsc2UsIGZhbHNlCglpZiB2LlRpdGxlICE9IG5pbCB7CgkJdGl0bGVSZXZpc2lvbiwgdGl0bGVSZWRhY3RlZCA9IHUodi5UaXRsZVJldmlzaW9uKSwgdi5UaXRsZS5SZWRhY3RlZAoJCWlmICF0aXRsZVJlZGFjdGVkIHsKCQkJdGl0bGUgPSBibG9iKHYuVGl0bGUuQnl0ZXMpCgkJfQoJfQoJaWYgdi5Cb2R5ICE9IG5pbCB7CgkJYm9keVJldmlzaW9uLCBib2R5SGFzaCwgYm9keUJ5dGVzLCBib2R5UmVkYWN0ZWQgPSB1KHYuQm9keVJldmlzaW9uKSwgcSh2LkJvZHkuSGFzaCksIHN0cmNvbnYuSXRvYShsZW4odi5Cb2R5LkJ5dGVzKSksIHYuQm9keS5SZWRhY3RlZAoJfQoJd3JpdGVycyA6PSAiIgoJZm9yIGksIHdobyA6PSByYW5nZSB2LldyaXRlcnMgewoJCWlmIGkgPiAwIHsKCQkJd3JpdGVycyArPSAiLCIKCQl9CgkJd3JpdGVycyArPSBxKHN0cmluZyh3aG8pKQoJfQoJcmV0dXJuIGB7InNjaGVtYSI6Im1lbWJhLm5vdGVzLnB1YmxpYy1oaXN0b3J5LXZlcnNpb24vdjEiLCJpZCI6YCArIHEoaWRIZXgpICsgYCwic3RhdGVfcmV2aXNpb24iOmAgKyB1KHYuUmV2aXNpb24pICsgYCwicmVjb3JkZWRfc2VxIjpgICsgdShlLlNlcSkgKyBgLCJvd25lciI6YCArIHEoc3RyaW5nKHYuT3duZXIpKSArIGAsInBlbmRpbmdfb3duZXIiOmAgKyBoaXN0b3J5TnVsbGFibGVUZXh0KHN0cmluZyh2LlBlbmRpbmdPd25lcikpICsgYCwib3duZXJfaXNfcmVhbG0iOmAgKyBzdHJjb252LkZvcm1hdEJvb2wodi5Pd25lcklzUmVhbG0pICsgYCwib3duZXJfZ2VuZXJhdGlvbiI6YCArIHUodi5Pd25lckdlbmVyYXRpb24pICsgYCwibW9kZSI6YCArIHN0cmNvbnYuSXRvYShpbnQodi5Nb2RlKSkgKyBgLCJlcG9jaCI6YCArIHUodWludDY0KHYuRXBvY2gpKSArIGAsInRpdGxlX3JldmlzaW9uIjpgICsgdGl0bGVSZXZpc2lvbiArIGAsInRpdGxlX2Jsb2IiOmAgKyB0aXRsZSArIGAsInRpdGxlX3JlZGFjdGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHRpdGxlUmVkYWN0ZWQpICsgYCwiYm9keV9yZXZpc2lvbiI6YCArIGJvZHlSZXZpc2lvbiArIGAsImJvZHlfYnl0ZXMiOmAgKyBxKGJvZHlCeXRlcykgKyBgLCJib2R5X3NoYTI1NiI6YCArIGJvZHlIYXNoICsgYCwiYm9keV9yZWRhY3RlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChib2R5UmVkYWN0ZWQpICsgYCwid3JpdGVycyI6W2AgKyB3cml0ZXJzICsgYF0sInBvbGljaWVzIjp7InJlYWQiOmAgKyBxKHYuUG9saWN5UmVhZCkgKyBgLCJ3cml0ZSI6YCArIHEodi5Qb2xpY3lXcml0ZSkgKyBgLCJjb21tZW50IjpgICsgcSh2LlBvbGljeUNvbW1lbnQpICsgYH0sImdvdl93cml0ZXJzIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHYuR292V3JpdGVycykgKyBgLCJhbGxvd19wdWJsaWNfd3JpdGVzIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHYuUHVibGljV3JpdGVzKSArIGAsIm93bmVyX2xpc3RlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbCh2Lkxpc3RlZCkgKyBgLCJtb2RlcmF0b3JfaGlkZGVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHYuTW9kZXJhdG9ySGlkZGVuKSArIGAsImRlbGV0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wodi5EZWxldGVkKSArIGB9YAp9CgovLyBQdWJsaWNIaXN0b3J5Qm9keUNodW5rSlNPTiByZWFkcyB0aGUgYm9keSBvZiB0aGUgdmVyc2lvbiByZWNvcmRlZCBieSB0aGUKLy8gbm90ZS1sZXZlbCBldmVudCBzZXEgKGEgdmVyc2lvbidzIHJlY29yZGVkX3NlcSkuIEEgbGF0ZXIgbm90ZS1sZXZlbCBldmVudAovLyB0aGF0IGtlcHQgdGhlIGJvZHkgcmV0dXJucyB0aGUgc2FtZSBib2R5OyBjb21tZW50IGFuZCBjbGVhbnVwIGV2ZW50cywgZGVsZXRpb24KLy8gdmVyc2lvbnMsIHVua25vd24gc2VxcyBhbmQgcmVkYWN0ZWQgYm9kaWVzIHJldHVybiBudWxsLgpmdW5jIFB1YmxpY0hpc3RvcnlCb2R5Q2h1bmtKU09OKGlkSGV4IHN0cmluZywgc2VxIHVpbnQ2NCwgb2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglpZCA6PSBoaXN0b3J5SUQoaWRIZXgpCglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiBNYXhCb2R5Q2h1bmtCeXRlcyB8fCBvZmZzZXQgPCAwIHsKCQlwYW5pYygibm90ZXM6IGhpc3RvcnkgY2h1bmsgYm91bmRzIikKCX0KCXYgOj0gaGlzdG9yeVZlcnNpb25BdChpZCwgc2VxKQoJaWYgdiA9PSBuaWwgfHwgdi5Cb2R5ID09IG5pbCB7CgkJcmV0dXJuICJudWxsIgoJfQoJYiA6PSB2LkJvZHkKCWlmIGIuUmVkYWN0ZWQgewoJCXJldHVybiAibnVsbCIKCX0KCWlmIG9mZnNldCA+IGxlbihiLkJ5dGVzKSB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IGNodW5rIGJvdW5kcyIpCgl9CgllbmQgOj0gb2Zmc2V0ICsgbGltaXQKCWlmIGVuZCA+IGxlbihiLkJ5dGVzKSB7CgkJZW5kID0gbGVuKGIuQnl0ZXMpCgl9CglyZXR1cm4gYHsic2NoZW1hIjoibWVtYmEubm90ZXMucHVibGljLWhpc3RvcnktYm9keS92MiIsImlkIjpgICsgcShpZEhleCkgKyBgLCJzZXEiOmAgKyB1KHNlcSkgKyBgLCJib2R5X3JldmlzaW9uIjpgICsgdSh2LkJvZHlSZXZpc2lvbikgKyBgLCJzaGEyNTYiOmAgKyBxKGIuSGFzaCkgKyBgLCJvZmZzZXQiOmAgKyBxKHN0cmNvbnYuSXRvYShvZmZzZXQpKSArIGAsInRvdGFsIjpgICsgcShzdHJjb252Lkl0b2EobGVuKGIuQnl0ZXMpKSkgKyBgLCJuZXh0X29mZnNldCI6YCArIHEoc3RyY29udi5JdG9hKGVuZCkpICsgYCwiY2h1bmtfYmxvYiI6YCArIGJsb2IoYi5CeXRlc1tvZmZzZXQ6ZW5kXSkgKyBgfWAKfQpmdW5jIFB1YmxpY0hpc3RvcnlDb21tZW50SlNPTihpZEhleCwgY2lkSGV4IHN0cmluZykgc3RyaW5nIHsKCWlkLCBjaWQgOj0gaGlzdG9yeUlEKGlkSGV4KSwgaGlzdG9yeUlEKGNpZEhleCkKCXYsIG9rIDo9IGhpc3RvcnlDb21tZW50cy5HZXQoY29tbWVudEtleShpZCwgY2lkKSkKCWlmICFvayB7CgkJcmV0dXJuICJudWxsIgoJfQoJaCA6PSB2LigqaGlzdG9yeUNvbW1lbnQpCgkvLyBUaGUgcmVmZXJlbmNlIGRlc2NyaWJlcyB0aGUgZmlyc3QgdmVyc2lvbjogcmV2aXNpb24gMSwgbm90IHlldCBkZWxldGVkLCBoaWRkZW4gb3IgcmVzb2x2ZWQuCglyZXR1cm4gYHsic2NoZW1hIjoibWVtYmEubm90ZXMucHVibGljLWhpc3RvcnktY29tbWVudC92MSIsImlkIjpgICsgcShpZEhleCkgKyBgLCJjb21tZW50X2lkIjpgICsgcShjaWRIZXgpICsgYCwiY29udGVudCI6eyJhdXRob3IiOmAgKyBxKHN0cmluZyhoLkF1dGhvcikpICsgYCwiY3JlYXRlZF9oZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KGguQ3JlYXRlZEhlaWdodCwgMTApKSArIGAsImVwb2NoIjpgICsgdSh1aW50NjQoaC5FcG9jaCkpICsgYCwiYW5jaG9yX2Jsb2IiOmAgKyBibG9iKGguQW5jaG9yKSArIGAsImJvZHlfYmxvYiI6YCArIGJsb2IoaC5Cb2R5KSArIGAsInJlZmVyZW5jZSI6YCArIGhpc3RvcnlDb21tZW50RGV0YWlsKGNpZEhleCwgaC5QYXJlbnQsIDEsIGguQm9keVJldmlzaW9uLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBoKSArIGB9LCJwcmVzZW50YXRpb24iOnsibGF0ZXN0X3NlcSI6YCArIHUoaC5MYXRlc3RTZXEpICsgYCwiZGVsZXRlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChoLkRlbGV0ZWQpICsgYCwiaGlkZGVuIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGguSGlkZGVuKSArIGAsInJlc29sdmVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGguUmVzb2x2ZWQpICsgYCwicmVkYWN0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woaC5SZWRhY3RlZCkgKyBgfX1gCn0KGqksCg5tb2RlcmF0aW9uLmdubxKWLHBhY2thZ2UgbWVtYmFfbm90ZXNfdjEKCmltcG9ydCBrZXlzICJnbm8ubGFuZC9yL3NhbWNyZXcvZW5ja2V5c192MSIKCmNvbnN0IE1heE1vZGVyYXRvcnMgPSAzMgoKdmFyIG1vZGVyYXRvcnMgW11hZGRyZXNzCgpmdW5jIG1vZGVyYXRvcih3aG8gYWRkcmVzcykgYm9vbCB7IHJldHVybiB3aG8gPT0gYWRtaW4gfHwgY29udGFpbnMobW9kZXJhdG9ycywgd2hvKSB9CmZ1bmMgQWRkTW9kZXJhdG9yKGN1ciByZWFsbSwgdG8gYWRkcmVzcykgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCglhZG1pbmlzdHJhdG9yKHdobykKCXRvID0ga2V5cy5DYW5vbmljYWxBZGRyZXNzKHRvKQoJaWYgY29udGFpbnMobW9kZXJhdG9ycywgdG8pIHsKCQlwYW5pYygibm90ZXM6IG1vZGVyYXRvciBleGlzdHMiKQoJfQoJaWYgbGVuKG1vZGVyYXRvcnMpID49IE1heE1vZGVyYXRvcnMgewoJCXBhbmljKCJub3RlczogbW9kZXJhdG9yIGNhcCIpCgl9Cgltb2RlcmF0b3JzID0gYXBwZW5kKG1vZGVyYXRvcnMsIHRvKQp9CmZ1bmMgUmVtb3ZlTW9kZXJhdG9yKGN1ciByZWFsbSwgdG8gYWRkcmVzcykgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCglhZG1pbmlzdHJhdG9yKHdobykKCXRvID0ga2V5cy5DYW5vbmljYWxBZGRyZXNzKHRvKQoJZm9yIGksIGEgOj0gcmFuZ2UgbW9kZXJhdG9ycyB7CgkJaWYgYSA9PSB0byB7CgkJCW1vZGVyYXRvcnMgPSBhcHBlbmQobW9kZXJhdG9yc1s6aV0sIG1vZGVyYXRvcnNbaSsxOl0uLi4pCgkJCXJldHVybgoJCX0KCX0KCXBhbmljKCJub3RlczogbW9kZXJhdG9yIG1pc3NpbmciKQp9CmZ1bmMgTW9kZXJhdG9yc0pTT04oKSBzdHJpbmcgewoJb3V0IDo9ICJbIgoJZm9yIGksIGEgOj0gcmFuZ2UgbW9kZXJhdG9ycyB7CgkJaWYgaSA+IDAgewoJCQlvdXQgKz0gIiwiCgkJfQoJCW91dCArPSBxKHN0cmluZyhhKSkKCX0KCXJldHVybiBvdXQgKyAiXSIKfQoKLy8gRGlyZWN0b3J5IG1vZGVyYXRpb24gaXMgc2VwYXJhdGUgZnJvbSBvd25lciBkaXNjb3ZlcmFiaWxpdHkuIE93bmVycyBjYW5ub3QKLy8gdW5kbyBhIG1vZGVyYXRpb24gaGlkZSBieSB0b2dnbGluZyB0aGVpciBvd24gbGlzdGluZyBwcmVmZXJlbmNlLgpmdW5jIE1vZGVyYXRlTGlzdGluZyhjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCB2aXNpYmxlIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbXV0YXRlTW9kZXJhdGVMaXN0aW5nKGN1ciwgd2hvLCBpZCwgYmFzZVJldmlzaW9uLCB2aXNpYmxlLCBvcElEKQp9CmZ1bmMgbXV0YXRlTW9kZXJhdGVMaXN0aW5nKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCB2aXNpYmxlIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCWlmICFtb2RlcmF0b3Iod2hvKSB7CgkJcGFuaWMoIm5vdGVzOiBtb2RlcmF0b3IgcmVxdWlyZWQiKQoJfQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlwYW5pYygibm90ZXM6IHB1YmxpYyBub3RlIHJlcXVpcmVkIikKCX0KCW9wZXJhdGlvbihuLCBvcElEKQoJdW5pbmRleChuKQoJbi5Nb2RlcmF0b3JIaWRkZW4gPSAhdmlzaWJsZQoJaW5kZXgobikKCWJ1bXAobiwgd2hvLCBvcElELCAibW9kZXJhdGUtbGlzdGluZyIpCn0KCi8vIFJlZGFjdGVkVGl0bGUgcmVwbGFjZXMgYSByZWRhY3RlZCBjdXJyZW50IHRpdGxlLCB3aGljaCBtdXN0IHN0YXkgdmFsaWQuCmNvbnN0IFJlZGFjdGVkVGl0bGUgPSAiUmVkYWN0ZWQgYnkgbW9kZXJhdGlvbiIKCi8vIFJlZGFjdFB1YmxpY0NvbnRlbnRBdFNlcSByZW1vdmVzIG9uZSBwdWJsaWMgdGl0bGUgKGZpZWxkIDEpIG9yIGJvZHkgKGZpZWxkIDIpCi8vIGZyb20gcmVhbG0gc3RvcmFnZTogdGhlIG9uZSByZWNvcmRlZCBieSB0aGUgbm90ZS1sZXZlbCBoaXN0b3J5IGV2ZW50IHNlcSAoYQovLyB2ZXJzaW9uJ3MgcmVjb3JkZWRfc2VxKS4gVGhlIG5hbWUgY2FycmllcyB0aGUgYWRkcmVzc2luZyBzbyBhIGNhbGxlciB3cml0dGVuCi8vIGZvciBmaWVsZCByZXZpc2lvbnMgY2Fubm90IGFjdCBvbiB0aGUgd3JvbmcgdmVyc2lvbi4gSGlzdG9yeSBzdG9yZXMgZWFjaCBmaWVsZAovLyByZXZpc2lvbiBvbmNlLCBzbyBldmVyeSB2ZXJzaW9uIHRoYXQga2VwdCB0aGF0IHRpdGxlIG9yIGJvZHkgc2hvd3MgaXQKLy8gcmVkYWN0ZWQuIFB1YmxpYyBoaXN0b3J5IGtlZXBzIGl0cyBTSEEtMjU2IGFuZCBhIGNvbnRlbnQtcmVkYWN0IGVudHJ5IG5hbWluZwovLyB0aGUgbW9kZXJhdG9yIGFuZCB0aGUgZmllbGQgcmV2aXNpb24uIFJlZGFjdGluZyB0aGUgY3VycmVudCB2ZXJzaW9uIGFsc28KLy8gcmVwbGFjZXMgaXQgKHBsYWNlaG9sZGVyIHRpdGxlLCBlbXB0eSBib2R5KSB1bmRlciBhIG5ldyBmaWVsZCByZXZpc2lvbi4gR25vCi8vIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UgdG8gdGhlIG1vZGVyYXRvciB3aG8gZnJlZXMgaXQuCmZ1bmMgUmVkYWN0UHVibGljQ29udGVudEF0U2VxKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGZpZWxkIHVpbnQ4LCBzZXEgdWludDY0LCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVJlZGFjdFB1YmxpY0NvbnRlbnRBdFNlcShjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgZmllbGQsIHNlcSwgb3BJRCkKfQpmdW5jIG11dGF0ZVJlZGFjdFB1YmxpY0NvbnRlbnRBdFNlcShjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgZmllbGQgdWludDgsIHNlcSB1aW50NjQsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gZmluZChpZCkKCWlmICFtb2RlcmF0b3Iod2hvKSB7CgkJcGFuaWMoIm5vdGVzOiBtb2RlcmF0b3IgcmVxdWlyZWQiKQoJfQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJaWYgIXB1YmxpYyhuLk1vZGUpIHsKCQlwYW5pYygibm90ZXM6IHB1YmxpYyBub3RlIHJlcXVpcmVkIikKCX0KCWlmIGZpZWxkICE9IDEgJiYgZmllbGQgIT0gMiB7CgkJcGFuaWMoIm5vdGVzOiBiYWQgcmVkYWN0aW9uIGZpZWxkIikKCX0KCXYgOj0gaGlzdG9yeVZlcnNpb25BdChuLklELCBzZXEpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoIm5vdGVzOiBoaXN0b3J5IHZlcnNpb24gbWlzc2luZyIpCgl9CgluYW1lLCBiLCBmaWVsZFJldmlzaW9uIDo9ICJ0aXRsZSIsIHYuVGl0bGUsIHYuVGl0bGVSZXZpc2lvbgoJaWYgZmllbGQgPT0gMiB7CgkJbmFtZSwgYiwgZmllbGRSZXZpc2lvbiA9ICJib2R5Iiwgdi5Cb2R5LCB2LkJvZHlSZXZpc2lvbgoJfQoJaWYgYiA9PSBuaWwgewoJCXBhbmljKCJub3RlczogaGlzdG9yeSB2ZXJzaW9uIG1pc3NpbmciKQoJfQoJaWYgYi5SZWRhY3RlZCB7CgkJcGFuaWMoIm5vdGVzOiBhbHJlYWR5IHJlZGFjdGVkIikKCX0KCW9wZXJhdGlvbihuLCBvcElEKQoJaWYgIW4uRGVsZXRlZCAmJiBmaWVsZCA9PSAxICYmIGZpZWxkUmV2aXNpb24gPT0gbi5UaXRsZVJldmlzaW9uIHsKCQlpZiBuLlRpdGxlUmV2aXNpb24gPT0gXnVpbnQ2NCgwKSB7CgkJCXBhbmljKCJub3RlczogdGl0bGUgcmV2aXNpb24gZXhoYXVzdGVkIikKCQl9CgkJbi5UaXRsZSA9IFtdYnl0ZShSZWRhY3RlZFRpdGxlKQoJCW4uVGl0bGVSZXZpc2lvbisrCgl9CglpZiAhbi5EZWxldGVkICYmIGZpZWxkID09IDIgJiYgZmllbGRSZXZpc2lvbiA9PSBuLkJvZHlSZXZpc2lvbiB7CgkJaWYgbi5Cb2R5UmV2aXNpb24gPT0gXnVpbnQ2NCgwKSB7CgkJCXBhbmljKCJub3RlczogYm9keSByZXZpc2lvbiBleGhhdXN0ZWQiKQoJCX0KCQluLkJvZHkgPSBbXWJ5dGV7fQoJCW4uQm9keUJ5dGVzID0gMAoJCW4uQm9keVJldmlzaW9uKysKCX0KCWIuQnl0ZXMsIGIuUmVkYWN0ZWQgPSBuaWwsIHRydWUKCWJ1bXBIaXN0b3J5KG4sIHdobywgb3BJRCwgImNvbnRlbnQtcmVkYWN0IiwgYCwiZmllbGQiOmArcShuYW1lKStgLCJmaWVsZF9yZXZpc2lvbiI6YCt1KGZpZWxkUmV2aXNpb24pK2AsInNoYTI1NiI6YCtxKGIuSGFzaCkpCn0KCi8vIFJlZGFjdFB1YmxpY0NvbW1lbnQgcmVtb3ZlcyBhIHB1YmxpYyBjb21tZW50J3MgYW5jaG9yIGFuZCBib2R5IGZyb20gYm90aCB0aGUKLy8gbGl2ZSBjb21tZW50ICh3aGljaCBiZWNvbWVzIGhpZGRlbiBhbmQgY2Fubm90IGJlIHNob3duIGFnYWluKSBhbmQgaXRzIHB1YmxpYwovLyBoaXN0b3J5LiBBIHB1cmdlZCBjb21tZW50IGtlZXBzIG9ubHkgaXRzIGhpc3RvcnkgcmVjb3JkLCB3aGljaCBpcyByZWRhY3RlZAovLyB0aGUgc2FtZSB3YXk7IGJhc2VSZXZpc2lvbiBpcyB0aGVuIGlnbm9yZWQgKHBhc3MgMCkuCmZ1bmMgUmVkYWN0UHVibGljQ29tbWVudChjdXIgcmVhbG0sIGlkLCBjaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbXV0YXRlUmVkYWN0UHVibGljQ29tbWVudChjdXIsIHdobywgaWQsIGNpZCwgYmFzZVJldmlzaW9uLCBvcElEKQp9CmZ1bmMgbXV0YXRlUmVkYWN0UHVibGljQ29tbWVudChjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCwgY2lkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBvcElEIFsxNl1ieXRlKSB7CgluIDo9IGZpbmQoaWQpCglpZiAhbW9kZXJhdG9yKHdobykgewoJCXBhbmljKCJub3RlczogbW9kZXJhdG9yIHJlcXVpcmVkIikKCX0KCWlmICFwdWJsaWMobi5Nb2RlKSB7CgkJcGFuaWMoIm5vdGVzOiBwdWJsaWMgbm90ZSByZXF1aXJlZCIpCgl9CglrZXkgOj0gY29tbWVudEtleShpZCwgY2lkKQoJdiwgb2sgOj0gaGlzdG9yeUNvbW1lbnRzLkdldChrZXkpCglpZiAhb2sgewoJCXBhbmljKCJub3RlczogbWlzc2luZyBwdWJsaWMgY29tbWVudCBoaXN0b3J5IikKCX0KCWFyY2hpdmVkIDo9IHYuKCpoaXN0b3J5Q29tbWVudCkKCWlmIGFyY2hpdmVkLlJlZGFjdGVkIHsKCQlwYW5pYygibm90ZXM6IGFscmVhZHkgcmVkYWN0ZWQiKQoJfQoJY3YsIGxpdmUgOj0gY29tbWVudHMuR2V0KGtleSkKCWlmICFsaXZlIHsKCQlpZiBvcElEID09IChbMTZdYnl0ZXt9KSB7CgkJCXBhbmljKCJub3RlczogZW1wdHkgb3BlcmF0aW9uIGlkIikKCQl9CgkJYXJjaGl2ZWQuQW5jaG9yLCBhcmNoaXZlZC5Cb2R5LCBhcmNoaXZlZC5SZWRhY3RlZCA9IG5pbCwgbmlsLCB0cnVlCgkJZSA6PSBoaXN0b3J5QXBwZW5kKG4sIHdobywgb3BJRCwgY2lkLCAiY29tbWVudC1yZWRhY3QiLCBgeyJjb21tZW50X2lkIjpgK3EoaWRUZXh0KGNpZCkpK2AsInB1cmdlZCI6dHJ1ZX1gKQoJCWFyY2hpdmVkLkxhdGVzdFNlcSA9IGUuU2VxCgkJcmV0dXJuCgl9CgljIDo9IGN2LigqY29tbWVudCkKCWNvbW1lbnRFeHBlY3RlZChjLCBiYXNlUmV2aXNpb24sIG9wSUQpCglhcmNoaXZlZC5BbmNob3IsIGFyY2hpdmVkLkJvZHksIGFyY2hpdmVkLlJlZGFjdGVkID0gbmlsLCBuaWwsIHRydWUKCWMuQW5jaG9yLCBjLkJvZHksIGMuSGlkZGVuID0gbmlsLCBuaWwsIHRydWUKCWNvbW1lbnRSZWNlaXB0KGMsIHdobywgb3BJRCkKCWhpc3RvcnlDb21tZW50Q2hhbmdlKG4sIGMsICJjb21tZW50LXJlZGFjdCIpCn0KGv8jCglub3Rlcy5nbm8S8SNwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL2JhbmtlciIKCSJjaGFpbi9ydW50aW1lIgopCgovLyBDcmVhdGVOb3RlIGlzIHRoZSBvbmx5IHBheWFibGUgZW50cnlwb2ludDsgZW5jcnlwdGVkIGNyZWF0aW9uIGlzIGF0b21pYy4KZnVuYyBDcmVhdGVOb3RlKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIG1vZGUgdWludDgsIHRpdGxlLCBib2R5LCBhY2Nlc3MsIGNvbW1pdG1lbnQgW11ieXRlLCBtYXhGZWUgaW50NjQsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIHRydWUpCglkZWZlciBsZWF2ZSgpCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygibm90ZXM6IGNyZWF0ZSBkaXJlY3RseSBmcm9tIHlvdXIgYWNjb3VudCIpCgl9CglpZiBwYXVzZWQgewoJCXBhbmljKCJub3RlczogY3JlYXRpb24gcGF1c2VkIikKCX0KCWlmIGlkID09IChbMTZdYnl0ZXt9KSB7CgkJcGFuaWMoIm5vdGVzOiBlbXB0eSBub3RlIGlkIikKCX0KCWlmIF8sIG9rIDo9IG5vdGVzLkdldChpZFRleHQoaWQpKTsgb2sgewoJCXBhbmljKCJub3Rlczogbm90ZSBpZCB1c2VkIikKCX0KCWlmIG1vZGUgPiBNb2RlUHVibGljT3BlbiB8fCBwdWJsaWMobW9kZSkgJiYgKGxlbihhY2Nlc3MpICE9IDAgfHwgbGVuKGNvbW1pdG1lbnQpICE9IDApIHsKCQlwYW5pYygibm90ZXM6IHVuc3VwcG9ydGVkIGNyZWF0aW9uIG1vZGUiKQoJfQoJaWYgcHVibGljKG1vZGUpIHsKCQl2YWxpZGF0ZVB1YmxpYyh0aXRsZSwgYm9keSkKCX0KCW9wZXJhdGlvbihuaWwsIG9wSUQpCglhc3NlcnRDcmVhdGVQYXltZW50KGN1ciwgbWF4RmVlKQoJaWYgc2VxdWVuY2UgPT0gXnVpbnQ2NCgwKSB7CgkJcGFuaWMoIm5vdGVzOiBzZXF1ZW5jZSBleGhhdXN0ZWQiKQoJfQoJc2VxdWVuY2UrKwoJbiA6PSAmbm90ZXtJRDogaWQsIE93bmVyOiB3aG8sIE93bmVyR2VuZXJhdGlvbjogMSwgTW9kZTogbW9kZSwgVGl0bGVSZXZpc2lvbjogMSwgQm9keVJldmlzaW9uOiAxLCBUaXRsZTogY29waWVkKHRpdGxlKSwgQm9keTogY29waWVkKGJvZHkpLCBCb2R5Qnl0ZXM6IGxlbihib2R5KSwgQ3JlYXRlZEhlaWdodDogcnVudGltZS5DaGFpbkhlaWdodCgpLCBTZXF1ZW5jZTogc2VxdWVuY2UsIExpc3RlZDogcHVibGljKG1vZGUpfQoJaWYgZW5jcnlwdGVkKG1vZGUpIHsKCQlpbml0aWFsaXplRW5jcnlwdGVkKG4sIGFjY2VzcywgY29tbWl0bWVudCkKCX0KCWJ1bXAobiwgd2hvLCBvcElELCAiY3JlYXRlIikKCW5vdGVzLlNldChpZFRleHQoaWQpLCBuKQoJaW5kZXgobikKCWlmIGNyZWF0ZUZlZSA+IDAgewoJCWJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHRyZWFzdXJ5LCBjaGFpbi5Db2luc3tjaGFpbi5OZXdDb2luKCJ1Z25vdCIsIGNyZWF0ZUZlZSl9KQoJfQp9CgovLyBmaWVsZE1hc2s6IDEgdGl0bGUsIDIgYm9keSwgMyBib3RoLiBBbiB1bmNoYW5nZWQgZmllbGQgbXVzdCBiZSBvbWl0dGVkIChlbXB0eQovLyBibG9iKS4gVGhlIHNlcGFyYXRlIGZpZWxkIHJldmlzaW9uIGFkdmFuY2VzIG9ubHkgd2hlbiB0aGF0IGZpZWxkIGNoYW5nZXMuCmZ1bmMgQ29tbWl0KGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBmaWVsZE1hc2sgdWludDgsIHRpdGxlLCBib2R5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVDb21taXQoY3VyLCB3aG8sIGlkLCBiYXNlUmV2aXNpb24sIGV4cGVjdGVkRXBvY2gsIGZpZWxkTWFzaywgdGl0bGUsIGJvZHksIG9wSUQpCn0KZnVuYyBtdXRhdGVDb21taXQoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcywgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIGV4cGVjdGVkRXBvY2ggdWludDMyLCBmaWVsZE1hc2sgdWludDgsIHRpdGxlLCBib2R5IFtdYnl0ZSwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJcmVxdWlyZUNvbnRlbnRXcml0ZShjdXIsIG4sIHdobykKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmIG4uRXBvY2ggIT0gZXhwZWN0ZWRFcG9jaCB7CgkJcGFuaWMoIm5vdGVzOiBzdGFsZSBlcG9jaCIpCgl9Cglwcml2YXRlV3JpdGFibGUobikKCWlmIGZpZWxkTWFzayA8IDEgfHwgZmllbGRNYXNrID4gMyB8fCAoZmllbGRNYXNrJjEgPT0gMCAmJiBsZW4odGl0bGUpICE9IDApIHx8IChmaWVsZE1hc2smMiA9PSAwICYmIGxlbihib2R5KSAhPSAwKSB7CgkJcGFuaWMoIm5vdGVzOiBiYWQgZmllbGQgbWFzayIpCgl9CglpZiBmaWVsZE1hc2smMSAhPSAwIHsKCQlpZiBwdWJsaWMobi5Nb2RlKSB7CgkJCXZhbGlkYXRlVGl0bGUodGl0bGUpCgkJfSBlbHNlIHsKCQkJdmFsaWRhdGVDaXBoZXIodGl0bGUsIG4uRXBvY2gsIDEsIG4uVGl0bGVSZXZpc2lvbisxLCBNYXhDaXBoZXJUaXRsZUJ5dGVzKQoJCX0KCQlpZiBuLlRpdGxlUmV2aXNpb24gPT0gXnVpbnQ2NCgwKSB7CgkJCXBhbmljKCJub3RlczogdGl0bGUgcmV2aXNpb24gZXhoYXVzdGVkIikKCQl9Cgl9CglpZiBmaWVsZE1hc2smMiAhPSAwIHsKCQlpZiBwdWJsaWMobi5Nb2RlKSB7CgkJCXZhbGlkYXRlUHVibGljKG4uVGl0bGUsIGJvZHkpCgkJfSBlbHNlIHsKCQkJdmFsaWRhdGVDaXBoZXIoYm9keSwgbi5FcG9jaCwgMiwgbi5Cb2R5UmV2aXNpb24rMSwgTWF4Q2lwaGVyQm9keUJ5dGVzKQoJCX0KCQlpZiBuLkJvZHlSZXZpc2lvbiA9PSBedWludDY0KDApIHsKCQkJcGFuaWMoIm5vdGVzOiBib2R5IHJldmlzaW9uIGV4aGF1c3RlZCIpCgkJfQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCglpZiBmaWVsZE1hc2smMSAhPSAwIHsKCQluLlRpdGxlID0gY29waWVkKHRpdGxlKQoJCW4uVGl0bGVSZXZpc2lvbisrCgl9CglpZiBmaWVsZE1hc2smMiAhPSAwIHsKCQluLkJvZHkgPSBjb3BpZWQoYm9keSkKCQluLkJvZHlCeXRlcyA9IGxlbihib2R5KQoJCW4uQm9keVJldmlzaW9uKysKCX0KCWJ1bXAobiwgd2hvLCBvcElELCAiY29tbWl0IikKfQpmdW5jIFJlbmFtZShjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBleHBlY3RlZEVwb2NoIHVpbnQzMiwgdGl0bGUgW11ieXRlLCBvcElEIFsxNl1ieXRlKSB7CglDb21taXQoY3VyLCBpZCwgYmFzZVJldmlzaW9uLCBleHBlY3RlZEVwb2NoLCAxLCB0aXRsZSwgbmlsLCBvcElEKQp9CgovLyBEZWxldGUgcmV0YWlucyB0aGUgSUQgYW5kIGxhc3Qgb3BlcmF0aW9uIHJlY2VpcHQgZm9yZXZlci4gTGFyZ2UgY29sbGVjdGlvbnMKLy8gYXJlIHB1cmdlZCBieSBib3VuZGVkIGZvbGxvdy11cCBjYWxscywgbmV2ZXIgYnkgYW4gdW5ib3VuZGVkIGRlbGV0ZSBsb29wLgpmdW5jIERlbGV0ZShjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZURlbGV0ZShjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgb3BJRCkKfQpmdW5jIG11dGF0ZURlbGV0ZShjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgb3BJRCBbMTZdYnl0ZSkgewoJbiA6PSBsaXZlKGlkKQoJb3duZXIobiwgd2hvKQoJZXhwZWN0ZWQobiwgYmFzZVJldmlzaW9uKQoJb3BlcmF0aW9uKG4sIG9wSUQpCgl1bmluZGV4KG4pCglyZXNldFB1YmxpY1dyaXRlcyhuKQoJbi5EZWxldGVkID0gdHJ1ZQoJbi5MaXN0ZWQgPSBmYWxzZQoJbi5UaXRsZSA9IG5pbAoJbi5Cb2R5ID0gbmlsCgluLkJvZHlCeXRlcyA9IDAKCW4uQ29tbWl0bWVudCA9IG5pbAoJbi5QZW5kaW5nT3duZXIgPSAiIgoJbi5Xcml0ZXJzID0gbmlsCgluLlJlYWRlcnMgPSBuaWwKCW4uUG9saWNpZXMgPSBbM11zdHJpbmd7fQoJbi5Hb3ZXcml0ZXJzID0gZmFsc2UKCWJ1bXAobiwgd2hvLCBvcElELCAiZGVsZXRlIikKfQpmdW5jIFNldENvbW1lbnRNb2RlKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9wZW4gYm9vbCwgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVTZXRDb21tZW50TW9kZShjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgb3Blbiwgb3BJRCkKfQpmdW5jIG11dGF0ZVNldENvbW1lbnRNb2RlKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBvcGVuIGJvb2wsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCW93bmVyKG4sIHdobykKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmICFwdWJsaWMobi5Nb2RlKSB7CgkJcGFuaWMoIm5vdGVzOiBwdWJsaWMgbm90ZSByZXF1aXJlZCIpCgl9CglvcGVyYXRpb24obiwgb3BJRCkKCWlmIG9wZW4gewoJCW4uTW9kZSA9IE1vZGVQdWJsaWNPcGVuCgl9IGVsc2UgewoJCXJlc2V0UHVibGljV3JpdGVzKG4pCgkJbi5Nb2RlID0gTW9kZVB1YmxpYwoJfQoJYnVtcChuLCB3aG8sIG9wSUQsICJjb21tZW50cy1tb2RlIikKfQoaxgYKC3BheWFibGUuZ25vErYGcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCi8vIEluZXJ0IGFjdGl2YXRpb24gdXNlcyB0aGUgb3JpZ2luYWwgcGFja2FnZSBjcmVhdG9yIGFzIE9yaWdpbkNhbGxlciwgbm90IHRoZQovLyBlbmFibGluZyBhcHByb3Zlci4gUnVudGltZSBlNzVmZWY4MmMga2VlcGVyX2luZXJ0LmdvIHBpbnMgdGhpcyBiZWhhdmlvci4KZnVuYyBpbml0KCkgeyBhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKSB9CmZ1bmMgYXNzZXJ0Tm9Db2lucygpIHsKCWlmICF1bnNhZmUuT3JpZ2luU2VuZCgpLklzWmVybygpIHsKCQlwYW5pYygibm90ZXM6IG5vIGNvaW5zIikKCX0KfQpmdW5jIGFzc2VydENyZWF0ZVBheW1lbnQoY3VyIHJlYWxtLCBtYXhGZWUgaW50NjQpIHsKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJub3RlczogY3JlYXRlIGRpcmVjdGx5IGZyb20geW91ciBhY2NvdW50IikKCX0KCWlmIG1heEZlZSA8IDAgfHwgY3JlYXRlRmVlID4gbWF4RmVlIHsKCQlwYW5pYygibm90ZXM6IGZlZSBleGNlZWRzIG1heGltdW0iKQoJfQoJY29pbnMgOj0gdW5zYWZlLk9yaWdpblNlbmQoKQoJaWYgY3JlYXRlRmVlID09IDAgewoJCWlmICFjb2lucy5Jc1plcm8oKSB7CgkJCXBhbmljKCJub3RlczogZXhhY3QgZmVlIHJlcXVpcmVkIikKCQl9CgkJcmV0dXJuCgl9CglpZiBsZW4oY29pbnMpICE9IDEgfHwgY29pbnNbMF0uRGVub20gIT0gInVnbm90IiB8fCBjb2luc1swXS5BbW91bnQgIT0gY3JlYXRlRmVlIHsKCQlwYW5pYygibm90ZXM6IGV4YWN0IGZlZSByZXF1aXJlZCIpCgl9Cn0KGrwdCgxwb2xpY2llcy5nbm8Sqx1wYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgpjb25zdCAoCglPcFJlYWQgdWludDggPSBpb3RhCglPcFdyaXRlCglPcENvbW1lbnQKKQoKLy8gVGhlIHJlYWxtIHBhcmFtZXRlciBmb3JjZXMgYW4gZXhwbGljaXQgY3Jvc3Npbmc6IGFkYXB0ZXJzIHJ1biB3aXRoIHRoZWlyIG93bgovLyByZWFsbSBpZGVudGl0eS4gQWxsIG11dGF0b3JzIHJldGFpbiB0aGUgYnVzeSBndWFyZCB0aHJvdWdob3V0IGNhbGxiYWNrcy4KdHlwZSBQb2xpY3kgaW50ZXJmYWNlIHsKCUFsbG93cyhjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCB3aG8gYWRkcmVzcywgb3AgdWludDgpIGJvb2wKfQoKdmFyIHBvbGljaWVzID0gYXZsLk5ld1RyZWUoKQoKZnVuYyBSZWdpc3RlclBvbGljeShjdXIgcmVhbG0sIHNsdWcgc3RyaW5nLCBwIFBvbGljeSkgc3RyaW5nIHsKCWVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCglwYXRoIDo9IGN1ci5QcmV2aW91cygpLlBrZ1BhdGgoKQoJaWYgIXN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJnbm8ubGFuZC9yLyIpIHx8IGxlbihwYXRoKSA+IDIwMCB8fCBsZW4oc2x1ZykgPCAxIHx8IGxlbihzbHVnKSA+IDMyIHx8IHAgPT0gbmlsIHsKCQlwYW5pYygibm90ZXM6IHJlYWxtIHBvbGljeSByZXF1aXJlZCIpCgl9Cglmb3IgXywgYyA6PSByYW5nZSBzbHVnIHsKCQlpZiAhKGMgPj0gJ2EnICYmIGMgPD0gJ3onIHx8IGMgPj0gJzAnICYmIGMgPD0gJzknIHx8IGMgPT0gJy0nKSB7CgkJCXBhbmljKCJub3RlczogaW52YWxpZCBwb2xpY3kgc2x1ZyIpCgkJfQoJfQoJa2V5IDo9IHBhdGggKyAiOiIgKyBzbHVnCglpZiBfLCBvayA6PSBwb2xpY2llcy5HZXQoa2V5KTsgb2sgewoJCXBhbmljKCJub3RlczogcG9saWN5IGFscmVhZHkgcmVnaXN0ZXJlZCIpCgl9Cglwb2xpY2llcy5TZXQoa2V5LCBwKQoJcmV0dXJuIGtleQp9CmZ1bmMgU2V0UG9saWN5KGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIGJhc2VSZXZpc2lvbiB1aW50NjQsIG9wIHVpbnQ4LCBrZXkgc3RyaW5nLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW11dGF0ZVNldFBvbGljeShjdXIsIHdobywgaWQsIGJhc2VSZXZpc2lvbiwgb3AsIGtleSwgb3BJRCkKfQpmdW5jIG11dGF0ZVNldFBvbGljeShjdXIgcmVhbG0sIHdobyBhZGRyZXNzLCBpZCBbMTZdYnl0ZSwgYmFzZVJldmlzaW9uIHVpbnQ2NCwgb3AgdWludDgsIGtleSBzdHJpbmcsIG9wSUQgWzE2XWJ5dGUpIHsKCW4gOj0gbGl2ZShpZCkKCW93bmVyKG4sIHdobykKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCWlmIG9wID4gT3BDb21tZW50IHsKCQlwYW5pYygibm90ZXM6IHVua25vd24gcG9saWN5IG9wZXJhdGlvbiIpCgl9CglpZiBrZXkgIT0gIiIgewoJCWlmIF8sIG9rIDo9IHBvbGljaWVzLkdldChrZXkpOyAhb2sgewoJCQlwYW5pYygibm90ZXM6IHBvbGljeSBtaXNzaW5nIikKCQl9Cgl9CglvcGVyYXRpb24obiwgb3BJRCkKCW4uUG9saWNpZXNbb3BdID0ga2V5CglidW1wSGlzdG9yeShuLCB3aG8sIG9wSUQsICJwb2xpY3kiLCBgLCJwb2xpY3lfb3AiOmArc3RyY29udi5JdG9hKGludChvcCkpK2AsInBvbGljeV9rZXkiOmArcShrZXkpKQp9CmZ1bmMgcG9saWN5QWxsb3dzKGN1ciByZWFsbSwgbiAqbm90ZSwgd2hvIGFkZHJlc3MsIG9wIHVpbnQ4KSBib29sIHsKCWtleSA6PSBuLlBvbGljaWVzW29wXQoJaWYga2V5ID09ICIiIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXAsIG9rIDo9IHBvbGljaWVzLkdldChrZXkpCglpZiAhb2sgewoJCXBhbmljKCJub3RlczogbWlzc2luZyBzdG9yZWQgcG9saWN5IikKCX0KCXJldHVybiBwLihQb2xpY3kpLkFsbG93cyhjcm9zcyhjdXIpLCBuLklELCB3aG8sIG9wKQp9CmZ1bmMgUG9saWNpZXNKU09OKGlkSGV4IHN0cmluZykgc3RyaW5nIHsKCW4gOj0gZmluZChyZWFkSUQoaWRIZXgpKQoJcmV0dXJuIGB7InJlYWQiOmAgKyBxKG4uUG9saWNpZXNbMF0pICsgYCwid3JpdGUiOmAgKyBxKG4uUG9saWNpZXNbMV0pICsgYCwiY29tbWVudCI6YCArIHEobi5Qb2xpY2llc1syXSkgKyBgfWAKfQoKLy8gQSBob2xkZXIgbWF5IGdyYW50IGEgcmVhZC1wb2xpY3ktYXBwcm92ZWQgcmVjaXBpZW50IHRoZSBjdXJyZW50IGVwb2NoLiBFdmVyeQovLyBleGlzdGluZyBlbnRyeSBtdXN0IHJlbWFpbiBieXRlLWlkZW50aWNhbDogYSBncmFudGVlIGNhbm5vdCBjb3JydXB0IHNvbWVvbmUKLy8gZWxzZSdzIHdyYXAsIGNoYW5nZSB3cml0ZXJzLCByZW1vdmUgYWNjZXNzIG9yIHJvdGF0ZSB0aGUgb3duZXIgaW50byBuZXcga2V5cy4KZnVuYyBHcmFudEFjY2VzcyhjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBiYXNlUmV2aXNpb24gdWludDY0LCBleHBlY3RlZEVwb2NoIHVpbnQzMiwgbWFuaWZlc3QgW11ieXRlLCBvcElEIFsxNl1ieXRlKSB7Cgl3aG8gOj0gZW50ZXIoY3VyLCBmYWxzZSkKCWRlZmVyIGxlYXZlKCkKCW4gOj0gbGl2ZShpZCkKCWV4cGVjdGVkKG4sIGJhc2VSZXZpc2lvbikKCXByaXZhdGVXcml0YWJsZShuKQoJaWYgbi5Nb2RlICE9IE1vZGVTaGFyZWQgfHwgZXhwZWN0ZWRFcG9jaCAhPSBuLkVwb2NoIHx8ICFjb250YWlucyhuLlJlYWRlcnMsIHdobykgewoJCXBhbmljKCJub3RlczogY3VycmVudCBzaGFyZWQgcmVhZGVyIHJlcXVpcmVkIikKCX0KCWxpc3QgOj0gcGFyc2VNYW5pZmVzdChtYW5pZmVzdCwgbi5FcG9jaCwgbWFuaWZlc3RPd25lcihuKSwgbi5Nb2RlKQoJb2xkIDo9IGdldEVwb2NoKGlkLCBuLkVwb2NoKS5NYW5pZmVzdAoJZm9yIGkgOj0gMDsgaSA8IGludChvbGRbMV0pOyBpKysgewoJCWVudHJ5IDo9IG9sZFsyK2kqTWFuaWZlc3RFbnRyeUJ5dGVzIDogMisoaSsxKSpNYW5pZmVzdEVudHJ5Qnl0ZXNdCgkJZm91bmQgOj0gZmFsc2UKCQlmb3IgaiA6PSAwOyBqIDwgaW50KG1hbmlmZXN0WzFdKTsgaisrIHsKCQkJbmV4dCA6PSBtYW5pZmVzdFsyK2oqTWFuaWZlc3RFbnRyeUJ5dGVzIDogMisoaisxKSpNYW5pZmVzdEVudHJ5Qnl0ZXNdCgkJCWlmIHN0cmluZyhlbnRyeSkgPT0gc3RyaW5nKG5leHQpIHsKCQkJCWZvdW5kID0gdHJ1ZQoJCQkJYnJlYWsKCQkJfQoJCX0KCQlpZiAhZm91bmQgewoJCQlwYW5pYygibm90ZXM6IGV4aXN0aW5nIHdyYXAgaW1tdXRhYmxlIGZvciByZWFkZXIiKQoJCX0KCX0KCWFkZGVkIDo9IGZhbHNlCglmb3IgXywgciA6PSByYW5nZSBsaXN0IHsKCQlpZiAhY29udGFpbnMobi5SZWFkZXJzLCByLldobykgewoJCQlnb3ZHcmFudCA6PSBuLkdvdldyaXRlcnMgJiYgbi5Pd25lciA9PSBnb3ZBZGRyZXNzICYmIGdvdk1lbWJlcih3aG8pICYmIGdvdk1lbWJlcihyLldobykKCQkJaWYgci5Xcml0ZXIgfHwgd2hvICE9IG4uT3duZXIgJiYgIWdvdkdyYW50ICYmICFwb2xpY3lBbGxvd3MoY3VyLCBuLCByLldobywgT3BSZWFkKSB7CgkJCQlwYW5pYygibm90ZXM6IHJlYWQgcG9saWN5IGRlbmllZCIpCgkJCX0KCQkJYWRkZWQgPSB0cnVlCgkJfQoJfQoJaWYgIWFkZGVkIHsKCQlwYW5pYygibm90ZXM6IG5vIG5ldyByZWFkZXIiKQoJfQoJb3BlcmF0aW9uKG4sIG9wSUQpCgl1bmluZGV4KG4pCglzZXRSZWNpcGllbnRzKG4sIGxpc3QpCglpbmRleChuKQoJZ2V0RXBvY2goaWQsIG4uRXBvY2gpLk1hbmlmZXN0ID0gY29waWVkKG1hbmlmZXN0KQoJYWNrbm93bGVkZ2VSZXF1ZXN0cyhuLCB3aG8sIG9wSUQpCglidW1wKG4sIHdobywgb3BJRCwgInJlYWQtZ3JhbnQiKQp9ChrMFgoKcmVuZGVyLmdubxK9FnBhY2thZ2UgbWVtYmFfbm90ZXNfdjEKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgovLyBnbm93ZWIgdXNlcyBib3VuZGVkIHBhZ2VzLiBBIHJldmlzaW9uIGluIGV2ZXJ5IGNvbnRpbnVhdGlvbiBsaW5rIHByZXZlbnRzCi8vIGFzc2VtYmxpbmcgYSB3aGl0ZXBhcGVyIGZyb20gZGlmZmVyZW50IGVkaXRzOyB0aGUgYXBwIHJlYWRzIGJpbmFyeSBjaHVua3MuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCA9PSAiIiB7CgkJcmV0dXJuICIjIE5vdGVzXG5cblVzZSBMaXN0UHVibGljSlNPTiBmb3IgdGhlIHB1YmxpYyBkaXJlY3RvcnkuXG4iCgl9CglpZiBsZW4ocGF0aCkgPiA4MCB7CgkJcGFuaWMoIm5vdGVzOiByZW5kZXIgcGF0aCIpCgl9CglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHBhdGgsICIvIikKCWlmIGxlbihwYXJ0cykgIT0gMSAmJiBsZW4ocGFydHMpICE9IDMgewoJCXBhbmljKCJub3RlczogcmVuZGVyIHBhdGgiKQoJfQoJbiA6PSBmaW5kKHJlYWRJRChwYXJ0c1swXSkpCglpZiBuLkRlbGV0ZWQgewoJCXJldHVybiAiIyBEZWxldGVkIG5vdGVcblxuUGFzdCB2ZXJzaW9ucyByZW1haW4gaW4gY2hhaW4gaGlzdG9yeS5cbiIKCX0KCXBhZ2UgOj0gMAoJaWYgbGVuKHBhcnRzKSA9PSAzIHsKCQlyZXYsIGVyciA6PSBzdHJjb252LlBhcnNlVWludChwYXJ0c1sxXSwgMTAsIDY0KQoJCWlmIGVyciAhPSBuaWwgfHwgcmV2ICE9IG4uUmV2aXNpb24gewoJCQlyZXR1cm4gIiMgTm90ZSBjaGFuZ2VkXG5cbltTdGFydCBhZ2Fpbl0oOiIgKyBpZFRleHQobi5JRCkgKyAiKS5cbiIKCQl9CgkJcGFnZSwgZXJyID0gc3RyY29udi5BdG9pKHBhcnRzWzJdKQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygibm90ZXM6IHJlbmRlciBwYWdlIikKCQl9Cgl9CglpZiAhcHVibGljKG4uTW9kZSkgewoJCXJldHVybiAiIyBFbmNyeXB0ZWQgbm90ZVxuXG4iICsgc2VhbChuLkJvZHkpICsgIlxuT3duZXI6ICIgKyBzdHJpbmcobi5Pd25lcikgKyAiXG5cbkVuY3J5cHRlZCBieXRlczogIiArIHN0cmNvbnYuSXRvYShuLkJvZHlCeXRlcykgKyAiIMK3IFJldmlzaW9uICIgKyBzdHJjb252LkZvcm1hdFVpbnQobi5SZXZpc2lvbiwgMTApICsgIlxuXG5PcGVuIHRoaXMgbm90ZSBpbiBNZW1iYSB0byBkZWNyeXB0LiBUaGlzIHNlYWwgaXMgZGVjb3JhdGl2ZS5cbiIKCX0KCXBhZ2VzIDo9IChuLkJvZHlCeXRlcyArIE1heEJvZHlDaHVua0J5dGVzIC0gMSkgLyBNYXhCb2R5Q2h1bmtCeXRlcwoJaWYgcGFnZXMgPT0gMCB7CgkJcGFnZXMgPSAxCgl9CglpZiBwYWdlIDwgMCB8fCBwYWdlID49IHBhZ2VzIHsKCQlwYW5pYygibm90ZXM6IHJlbmRlciBwYWdlIikKCX0KCXN0YXJ0IDo9IHJlbmRlckJvdW5kYXJ5KG4uQm9keSwgcGFnZSpNYXhCb2R5Q2h1bmtCeXRlcykKCWVuZCA6PSByZW5kZXJCb3VuZGFyeShuLkJvZHksIChwYWdlKzEpKk1heEJvZHlDaHVua0J5dGVzKQoJdGl0bGUgOj0gc3RyaW5ncy5OZXdSZXBsYWNlcigiXFwiLCAiXFxcXCIsICJbIiwgIlxcWyIsICJdIiwgIlxcXSIsICIqIiwgIlxcKiIsICJfIiwgIlxcXyIsICJgIiwgIlxcYCIsICIjIiwgIlxcIyIsICI8IiwgIiZsdDsiLCAiPiIsICImZ3Q7IikuUmVwbGFjZShzdHJpbmcobi5UaXRsZSkpCglib2R5IDo9IHN0cmluZ3MuUmVwbGFjZUFsbChzdHJpbmdzLlJlcGxhY2VBbGwoc3RyaW5nKG4uQm9keVtzdGFydDplbmRdKSwgIjwiLCAiJmx0OyIpLCAiPiIsICImZ3Q7IikKCS8vIEVudGl0eSB0b2tlbnMgYXJlIHRleHQsIG5vdCBNYXJrZG93biBpbWFnZSBzeW50YXgsIGV2ZW4gYWZ0ZXIgYSBiYWNrc2xhc2guCgkvLyBLZWVwIG9yZGluYXJ5IGxpbmtzIGF2YWlsYWJsZSB3aXRob3V0IGF1dG9tYXRpY2FsbHkgZmV0Y2hpbmcgcmVtb3RlIGltYWdlcy4KCWJvZHkgPSBzdHJpbmdzLlJlcGxhY2VBbGwoYm9keSwgIiFbIiwgIiYjMzM7WyIpCgluYXYgOj0gIiIKCWlmIHBhZ2VzID4gMSB7CgkJbmF2ID0gIlxuXG4tLS1cblxuUGFnZSAiICsgc3RyY29udi5JdG9hKHBhZ2UrMSkgKyAiIG9mICIgKyBzdHJjb252Lkl0b2EocGFnZXMpICsgIiDCtyAiICsgc3RyY29udi5JdG9hKG4uQm9keUJ5dGVzKSArICIgYnl0ZXMgwrcgcmV2aXNpb24gIiArIHN0cmNvbnYuRm9ybWF0VWludChuLlJldmlzaW9uLCAxMCkgKyAiLiBNYXJrZG93biBtYXkgY29udGludWUgYWNyb3NzIHBhZ2VzLlxuXG4iCgkJYmFzZSA6PSAiOiIgKyBpZFRleHQobi5JRCkgKyAiLyIgKyBzdHJjb252LkZvcm1hdFVpbnQobi5SZXZpc2lvbiwgMTApICsgIi8iCgkJaWYgcGFnZSA+IDAgewoJCQluYXYgKz0gIltQcmV2aW91c10oIiArIGJhc2UgKyBzdHJjb252Lkl0b2EocGFnZS0xKSArICIpICIKCQl9CgkJaWYgcGFnZSsxIDwgcGFnZXMgewoJCQluYXYgKz0gIltOZXh0XSgiICsgYmFzZSArIHN0cmNvbnYuSXRvYShwYWdlKzEpICsgIikgIgoJCX0KCQluYXYgKz0gIltSZWFkIHRoZSBjb21wbGV0ZSBub3RlIGluIE1lbWJhXShodHRwczovL21lbWJhLmNsdWIvb3Mvbm90ZXMvIiArIGlkVGV4dChuLklEKSArICIpXG4iCgl9CglyZXR1cm4gIiMgIiArIHRpdGxlICsgIlxuXG4iICsgYm9keSArIG5hdgp9CgovLyBBZHZhbmNlIGF0IG1vc3QgdGhyZWUgY29udGludWF0aW9uIGJ5dGVzOyBhZGphY2VudCBwYWdlcyB1c2UgdGhlIHNhbWUKLy8gYm91bmRhcnksIHNvIG5vIFVURjggYnl0ZSBpcyBsb3N0IG9yIHJlcGVhdGVkLgpmdW5jIHJlbmRlckJvdW5kYXJ5KGJvZHkgW11ieXRlLCBwb3MgaW50KSBpbnQgewoJaWYgcG9zID49IGxlbihib2R5KSB7CgkJcmV0dXJuIGxlbihib2R5KQoJfQoJZm9yIHBvcyA8IGxlbihib2R5KSAmJiBib2R5W3Bvc10mMHhjMCA9PSAweDgwIHsKCQlwb3MrKwoJfQoJcmV0dXJuIHBvcwp9ChqdLwoMcmVxdWVzdHMuZ25vEowvcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJImduby5sYW5kL3Avc2FtY3Jldy9hdmwiCglrZXlzICJnbm8ubGFuZC9yL3NhbWNyZXcvZW5ja2V5c192MSIKCSJzdHJjb252IgoJInN0cmluZ3MiCikKCmNvbnN0IE1heEFjY2Vzc1JlcXVlc3RzID0gMjU2CmNvbnN0IFJlcXVlc3RUVExCbG9ja3MgaW50NjQgPSAxMDAwMAoKdHlwZSBhY2Nlc3NSZXF1ZXN0IHN0cnVjdCB7CglXaG8gICAgIGFkZHJlc3MKCUV4cGlyZXMgaW50NjQKCUFjdGl2ZSAgYm9vbAoJU3RhdHVzICBzdHJpbmcKCUxhc3QgICAgcmVjZWlwdAp9Cgp2YXIgcmVxdWVzdHMgPSBhdmwuTmV3VHJlZSgpCgpmdW5jIHJlcXVlc3RLZXkoaWQgWzE2XWJ5dGUsIHdobyBhZGRyZXNzKSBzdHJpbmcgeyByZXR1cm4gaWRUZXh0KGlkKSArICI6IiArIHN0cmluZyh3aG8pIH0KZnVuYyBSZXF1ZXN0QWNjZXNzKGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbiA6PSBsaXZlKGlkKQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB8fCAhZW5jcnlwdGVkKG4uTW9kZSkgfHwgd2hvID09IG4uT3duZXIgfHwgY29udGFpbnMobi5SZWFkZXJzLCB3aG8pIHsKCQlwYW5pYygibm90ZXM6IHJlcXVlc3Qgbm90IGFwcGxpY2FibGUiKQoJfQoJaWYgb3BJRCA9PSAoWzE2XWJ5dGV7fSkgewoJCXBhbmljKCJub3RlczogZW1wdHkgb3BlcmF0aW9uIGlkIikKCX0KCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglpZiBoID4gaW50NjQoOTIyMzM3MjAzNjg1NDc3NTgwNyktUmVxdWVzdFRUTEJsb2NrcyB7CgkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IGhlaWdodCBvdmVyZmxvdyIpCgl9CglrZXkgOj0gcmVxdWVzdEtleShpZCwgd2hvKQoJaWYgdiwgb2sgOj0gcmVxdWVzdHMuR2V0KGtleSk7IG9rIHsKCQlyIDo9IHYuKCphY2Nlc3NSZXF1ZXN0KQoJCWlmIHIuTGFzdC5PcGVyYXRpb24gPT0gb3BJRCB7CgkJCXBhbmljKCJub3Rlczogb3BlcmF0aW9uIGlkIHJldXNlZCIpCgkJfQoJCWlmICFyLkFjdGl2ZSAmJiByLlN0YXR1cyA9PSAicmVqZWN0ZWQiICYmIHIuRXhwaXJlcyA+IGggewoJCQlwYW5pYygibm90ZXM6IHJlcXVlc3QgcmVqZWN0ZWQgcmVjZW50bHkiKQoJCX0KCQlpZiByLkFjdGl2ZSB7CgkJCWlmIHIuRXhwaXJlcyA+IGggewoJCQkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IHBlbmRpbmciKQoJCQl9CgkJCW4uUmVxdWVzdENvdW50LS0KCQl9Cgl9CglpZiBuLlJlcXVlc3RDb3VudCA+PSBNYXhBY2Nlc3NSZXF1ZXN0cyB7CgkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IGNhcGFjaXR5OyBwdXJnZSBleHBpcmVkIHJlcXVlc3RzIikKCX0KCW4uUmVxdWVzdENvdW50KysKCXJlcXVlc3RzLlNldChrZXksICZhY2Nlc3NSZXF1ZXN0e3dobywgaCArIFJlcXVlc3RUVExCbG9ja3MsIHRydWUsICJwZW5kaW5nIiwgcmVjZWlwdHtvcElELCB3aG8sIGh9fSkKfQpmdW5jIGNsb3NlUmVxdWVzdChuICpub3RlLCB3aG8gYWRkcmVzcywgc3RhdHVzIHN0cmluZywgYWN0b3IgYWRkcmVzcywgb3BJRCBbMTZdYnl0ZSkgewoJdiwgb2sgOj0gcmVxdWVzdHMuR2V0KHJlcXVlc3RLZXkobi5JRCwgd2hvKSkKCWlmICFvayB7CgkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IG1pc3NpbmciKQoJfQoJciA6PSB2LigqYWNjZXNzUmVxdWVzdCkKCWlmICFyLkFjdGl2ZSB7CgkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IGFscmVhZHkgY2xvc2VkIikKCX0KCWlmIG9wSUQgPT0gKFsxNl1ieXRle30pIHx8IG9wSUQgPT0gci5MYXN0Lk9wZXJhdGlvbiB7CgkJcGFuaWMoIm5vdGVzOiBpbnZhbGlkIHJlcXVlc3Qgb3BlcmF0aW9uIikKCX0KCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyLkFjdGl2ZSA9IGZhbHNlCglyLlN0YXR1cyA9IHN0YXR1cwoJci5MYXN0ID0gcmVjZWlwdHtvcElELCBhY3RvciwgaH0KCW4uUmVxdWVzdENvdW50LS0KCS8vIEEgcmVqZWN0aW9uIGtlZXBzIHRoZSByZWNvcmQgdW50aWwgb25lIGZ1bGwgVFRMIGFmdGVyIGl0LCBzbyBuZWl0aGVyIHRoZQoJLy8gcmVxdWVzdGVyIG5vciBQdXJnZUV4cGlyZWRSZXF1ZXN0cyBjYW4gZW5kIHRoZSByZS1yZXF1ZXN0IGNvb2xkb3duIGVhcmx5LgoJaWYgc3RhdHVzID09ICJyZWplY3RlZCIgewoJCWlmIGggPiBpbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3KS1SZXF1ZXN0VFRMQmxvY2tzIHsKCQkJcGFuaWMoIm5vdGVzOiByZXF1ZXN0IGhlaWdodCBvdmVyZmxvdyIpCgkJfQoJCXIuRXhwaXJlcyA9IGggKyBSZXF1ZXN0VFRMQmxvY2tzCgl9Cn0KZnVuYyBDYW5jZWxBY2Nlc3NSZXF1ZXN0KGN1ciByZWFsbSwgaWQgWzE2XWJ5dGUsIG9wSUQgWzE2XWJ5dGUpIHsKCXdobyA6PSBlbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbiA6PSBmaW5kKGlkKQoJY2xvc2VSZXF1ZXN0KG4sIHdobywgImNhbmNlbGxlZCIsIHdobywgb3BJRCkKfQpmdW5jIFJlamVjdEFjY2Vzc1JlcXVlc3QoY3VyIHJlYWxtLCBpZCBbMTZdYnl0ZSwgdG8gYWRkcmVzcywgb3BJRCBbMTZdYnl0ZSkgewoJd2hvIDo9IGVudGVyKGN1ciwgZmFsc2UpCglkZWZlciBsZWF2ZSgpCgltdXRhdGVSZWplY3RBY2Nlc3NSZXF1ZXN0KGN1ciwgd2hvLCBpZCwgdG8sIG9wSUQpCn0KZnVuYyBtdXRhdGVSZWplY3RBY2Nlc3NSZXF1ZXN0KGN1ciByZWFsbSwgd2hvIGFkZHJlc3MsIGlkIFsxNl1ieXRlLCB0byBhZGRyZXNzLCBvcElEIFsxNl1ieXRlKSB7CgluIDo9IGxpdmUoaWQpCglvd25lcihuLCB3aG8pCgljbG9zZVJlcXVlc3Qobiwga2V5cy5DYW5vbmljYWxBZGRyZXNzKHRvKSwgInJlamVjdGVkIiwgd2hvLCBvcElEKQp9CmZ1bmMgYWNrbm93bGVkZ2VSZXF1ZXN0cyhuICpub3RlLCBhY3RvciBhZGRyZXNzLCBvcElEIFsxNl1ieXRlKSB7Cglmb3IgXywgd2hvIDo9IHJhbmdlIG4uUmVhZGVycyB7CgkJaWYgdiwgb2sgOj0gcmVxdWVzdHMuR2V0KHJlcXVlc3RLZXkobi5JRCwgd2hvKSk7IG9rIHsKCQkJciA6PSB2LigqYWNjZXNzUmVxdWVzdCkKCQkJaWYgci5BY3RpdmUgewoJCQkJci5BY3RpdmUgPSBmYWxzZQoJCQkJci5TdGF0dXMgPSAiZ3JhbnRlZCIKCQkJCXIuTGFzdCA9IHJlY2VpcHR7b3BJRCwgYWN0b3IsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKX0KCQkJCW4uUmVxdWVzdENvdW50LS0KCQkJfQoJCX0KCX0KfQpmdW5jIHJlcXVlc3RKU09OKHIgKmFjY2Vzc1JlcXVlc3QpIHN0cmluZyB7CglyZXR1cm4gYHsiYWRkcmVzcyI6YCArIHEoc3RyaW5nKHIuV2hvKSkgKyBgLCJleHBpcmVzX2hlaWdodCI6YCArIHEoc3RyY29udi5Gb3JtYXRJbnQoci5FeHBpcmVzLCAxMCkpICsgYCwiYWN0aXZlIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHIuQWN0aXZlKSArIGAsInN0YXR1cyI6YCArIHEoci5TdGF0dXMpICsgYCwib3BfaWQiOmAgKyBxKGlkVGV4dChyLkxhc3QuT3BlcmF0aW9uKSkgKyBgLCJhY3RvciI6YCArIHEoc3RyaW5nKHIuTGFzdC5BY3RvcikpICsgYCwiaGVpZ2h0IjpgICsgcShzdHJjb252LkZvcm1hdEludChyLkxhc3QuSGVpZ2h0LCAxMCkpICsgYH1gCn0KZnVuYyBBY2Nlc3NSZXF1ZXN0SlNPTihpZEhleCBzdHJpbmcsIHdobyBhZGRyZXNzKSBzdHJpbmcgewoJdiwgb2sgOj0gcmVxdWVzdHMuR2V0KHJlcXVlc3RLZXkocmVhZElEKGlkSGV4KSwga2V5cy5DYW5vbmljYWxBZGRyZXNzKHdobykpKQoJaWYgIW9rIHsKCQlyZXR1cm4gIm51bGwiCgl9CglyZXR1cm4gcmVxdWVzdEpTT04odi4oKmFjY2Vzc1JlcXVlc3QpKQp9CmZ1bmMgcmVxdWVzdFN0YXJ0KGlkIFsxNl1ieXRlLCBjdXJzb3Igc3RyaW5nKSBzdHJpbmcgewoJaWYgY3Vyc29yICE9ICIiICYmIHN0cmluZyhrZXlzLkNhbm9uaWNhbEFkZHJlc3MoYWRkcmVzcyhjdXJzb3IpKSkgIT0gY3Vyc29yIHsKCQlwYW5pYygibm90ZXM6IGJhZCByZXF1ZXN0IGN1cnNvciIpCgl9CglyZXR1cm4gaWRUZXh0KGlkKSArICI6IiArIGN1cnNvcgp9CmZ1bmMgQWNjZXNzUmVxdWVzdHNKU09OKGlkSGV4LCBjdXJzb3Igc3RyaW5nLCBsaW1pdCBpbnQpIHN0cmluZyB7CglpZCA6PSByZWFkSUQoaWRIZXgpCgluIDo9IGZpbmQoaWQpCglpZiBsaW1pdCA8IDEgfHwgbGltaXQgPiBNYXhQYWdlIHsKCQlwYW5pYygibm90ZXM6IHBhZ2UgbGltaXQiKQoJfQoJc3RhcnQgOj0gcmVxdWVzdFN0YXJ0KGlkLCBjdXJzb3IpCglwcmVmaXggOj0gaWRUZXh0KGlkKSArICI6IgoJaXRlbXMgOj0gW11zdHJpbmd7fQoJbmV4dCA6PSAiIgoJcmVxdWVzdHMuSXRlcmF0ZShzdGFydCwgcHJlZml4KyJceGZmIiwgZnVuYyhrIHN0cmluZywgdiBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJaWYgY3Vyc29yICE9ICIiICYmIGsgPT0gc3RhcnQgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJaXRlbXMgPSBhcHBlbmQoaXRlbXMsIHJlcXVlc3RKU09OKHYuKCphY2Nlc3NSZXF1ZXN0KSkpCgkJbmV4dCA9IHN0cmluZ3MuVHJpbVByZWZpeChrLCBwcmVmaXgpCgkJcmV0dXJuIGxlbihpdGVtcykgPT0gbGltaXQKCX0pCglpZiBsZW4oaXRlbXMpIDwgbGltaXQgewoJCW5leHQgPSAiIgoJfQoJcmV0dXJuIGB7Iml0ZW1zIjpbYCArIHN0cmluZ3MuSm9pbihpdGVtcywgIiwiKSArIGBdLCJuZXh0X2N1cnNvciI6YCArIHEobmV4dCkgKyBgLCJhY3RpdmVfY291bnQiOmAgKyB1KHVpbnQ2NChuLlJlcXVlc3RDb3VudCkpICsgYH1gCn0KCi8vIEF0IG1vc3QgbGltaXQgcmVjb3JkcyBhcmUgaW5zcGVjdGVkLCBub3QganVzdCByZW1vdmVkLiBUaGUgcmV0dXJuZWQgY3Vyc29yCi8vIGxldHMgYSBjYWxsZXIgc3dlZXAgdGhlIGZ1bGwgcmVxdWVzdCBzZXQgd2l0aG91dCBhbiB1bmJvdW5kZWQgc2Nhbi4KZnVuYyBQdXJnZUV4cGlyZWRSZXF1ZXN0cyhjdXIgcmVhbG0sIGlkIFsxNl1ieXRlLCBjdXJzb3Igc3RyaW5nLCBsaW1pdCBpbnQpIHN0cmluZyB7CgllbnRlcihjdXIsIGZhbHNlKQoJZGVmZXIgbGVhdmUoKQoJbiA6PSBmaW5kKGlkKQoJaWYgbGltaXQgPCAxIHx8IGxpbWl0ID4gTWF4UGFnZSB7CgkJcGFuaWMoIm5vdGVzOiBwdXJnZSBsaW1pdCIpCgl9CglzdGFydCA6PSByZXF1ZXN0U3RhcnQoaWQsIGN1cnNvcikKCXByZWZpeCA6PSBpZFRleHQoaWQpICsgIjoiCglkb29tZWQgOj0gW11zdHJpbmd7fQoJbmV4dCA6PSAiIgoJaW5zcGVjdGVkIDo9IDAKCWggOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyZXF1ZXN0cy5JdGVyYXRlKHN0YXJ0LCBwcmVmaXgrIlx4ZmYiLCBmdW5jKGsgc3RyaW5nLCB2IGludGVyZmFjZXt9KSBib29sIHsKCQlpZiBjdXJzb3IgIT0gIiIgJiYgayA9PSBzdGFydCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlyIDo9IHYuKCphY2Nlc3NSZXF1ZXN0KQoJCWlmIHIuRXhwaXJlcyA8PSBoIHsKCQkJZG9vbWVkID0gYXBwZW5kKGRvb21lZCwgaykKCQkJaWYgci5BY3RpdmUgewoJCQkJbi5SZXF1ZXN0Q291bnQtLQoJCQl9CgkJfQoJCWluc3BlY3RlZCsrCgkJbmV4dCA9IHN0cmluZ3MuVHJpbVByZWZpeChrLCBwcmVmaXgpCgkJcmV0dXJuIGluc3BlY3RlZCA9PSBsaW1pdAoJfSkKCWZvciBfLCBrZXkgOj0gcmFuZ2UgZG9vbWVkIHsKCQlyZXF1ZXN0cy5SZW1vdmUoa2V5KQoJfQoJaWYgaW5zcGVjdGVkIDwgbGltaXQgewoJCW5leHQgPSAiIgoJfQoJcmV0dXJuIG5leHQKfQoKZnVuYyBwdXJnZVJlcXVlc3RzKG4gKm5vdGUsIGxpbWl0IGludCkgaW50IHsKCWlmIGxpbWl0ID09IDAgewoJCXJldHVybiAwCgl9CglwcmVmaXggOj0gaWRUZXh0KG4uSUQpICsgIjoiCglkb29tZWQgOj0gW11zdHJpbmd7fQoJcmVxdWVzdHMuSXRlcmF0ZShwcmVmaXgsIHByZWZpeCsiXHhmZiIsIGZ1bmMoayBzdHJpbmcsIHYgaW50ZXJmYWNle30pIGJvb2wgewoJCXIgOj0gdi4oKmFjY2Vzc1JlcXVlc3QpCgkJaWYgci5BY3RpdmUgewoJCQluLlJlcXVlc3RDb3VudC0tCgkJfQoJCWRvb21lZCA9IGFwcGVuZChkb29tZWQsIGspCgkJcmV0dXJuIGxlbihkb29tZWQpID09IGxpbWl0Cgl9KQoJZm9yIF8sIGsgOj0gcmFuZ2UgZG9vbWVkIHsKCQlyZXF1ZXN0cy5SZW1vdmUoaykKCX0KCXJldHVybiBsZW4oZG9vbWVkKQp9ChqBCAoIc2VhbC5nbm8S9AdwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmNvbnYiCikKCi8vIERlY29yYXRpdmUgZmluZ2VycHJpbnQgZnJvbSBwdWJsaWMgY2lwaGVydGV4dCBvbmx5LiBJdCBpcyBub3QgYSBoaXN0b3JpY2FsCi8vIGluY2x1c2lvbiBwcm9vZiBvciBwcm9vZiBvZiBrbm93bGVkZ2Ugb2YgYSBwbGFpbnRleHQva2V5LgpmdW5jIHNlYWwoYm9keSBbXWJ5dGUpIHN0cmluZyB7CgloYXNoIDo9IHNoYTI1Ni5TdW0yNTYoYm9keSkKCWdseXBocyA6PSBbXXJ1bmUoIuKXh+KXhuKXi+KXj+KWoeKWoOKWs+KWsuKcpiIpCglvdXQgOj0gImBgYFxuIgoJZm9yIGkgOj0gMDsgaSA8IDgxOyBpKysgewoJCW91dCArPSBzdHJpbmcoZ2x5cGhzW2ludChoYXNoW2klMzJdK2J5dGUoaS8zMikpJWxlbihnbHlwaHMpXSkKCQlpZiBpJTkgPT0gOCB7CgkJCW91dCArPSAiXG4iCgkJfQoJfQoJcmV0dXJuIG91dCArICJgYGBcbiIKfQpmdW5jIFNlYWxKU09OKGlkSGV4IHN0cmluZykgc3RyaW5nIHsKCW4gOj0gZmluZChyZWFkSUQoaWRIZXgpKQoJaGFzaCA6PSBzaGEyNTYuU3VtMjU2KG4uQm9keSkKCXJldHVybiBgeyJpZCI6YCArIHEoaWRUZXh0KG4uSUQpKSArIGAsInN0YXRlX3JldmlzaW9uIjpgICsgdShuLlJldmlzaW9uKSArIGAsImJvZHlfcmV2aXNpb24iOmAgKyB1KG4uQm9keVJldmlzaW9uKSArIGAsImVwb2NoIjpgICsgdSh1aW50NjQobi5FcG9jaCkpICsgYCwiY2lwaGVydGV4dF9zaGEyNTYiOmAgKyBxKGhleC5FbmNvZGVUb1N0cmluZyhoYXNoWzpdKSkgKyBgLCJlbmNyeXB0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woZW5jcnlwdGVkKG4uTW9kZSkgJiYgIW4uRGVsZXRlZCkgKyBgLCJkZWxldGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKG4uRGVsZXRlZCkgKyBgLCJoZWlnaHQiOmAgKyBxKHN0cmNvbnYuRm9ybWF0SW50KG4uTGFzdC5IZWlnaHQsIDEwKSkgKyBgLCJoaXN0b3JpY2FsX3Byb29mIjpmYWxzZX1gCn0KGrkaCglzdGF0ZS5nbm8SqxpwYWNrYWdlIG1lbWJhX25vdGVzX3YxCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ1bmljb2RlIgoJInVuaWNvZGUvdXRmOCIKKQoKZnVuYyBlbnRlcihjdXIgcmVhbG0sIHBheWFibGUgYm9vbCkgYWRkcmVzcyB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygibm90ZXM6IHN0YWxlIHJlYWxtIikKCX0KCWlmIGJ1c3kgewoJCXBhbmljKCJub3RlczogcmVlbnRyeSIpCgl9CglpZiAhcGF5YWJsZSB7CgkJYXNzZXJ0Tm9Db2lucygpCgl9CglidXN5ID0gdHJ1ZQoJcmV0dXJuIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQp9CmZ1bmMgbGVhdmUoKSAgICAgICAgICAgICAgICAgICAgeyBidXN5ID0gZmFsc2UgfQpmdW5jIGlkVGV4dChpZCBbMTZdYnl0ZSkgc3RyaW5nIHsgcmV0dXJuIGhleC5FbmNvZGVUb1N0cmluZyhpZFs6XSkgfQpmdW5jIHJlYWRJRChzIHN0cmluZykgWzE2XWJ5dGUgewoJaWYgbGVuKHMpICE9IDMyIHsKCQlwYW5pYygibm90ZXM6IGJhZCBub3RlIGlkIikKCX0KCWIsIGVyciA6PSBoZXguRGVjb2RlU3RyaW5nKHMpCglpZiBlcnIgIT0gbmlsIHx8IGhleC5FbmNvZGVUb1N0cmluZyhiKSAhPSBzIHsKCQlwYW5pYygibm90ZXM6IGJhZCBub3RlIGlkIikKCX0KCXZhciBpZCBbMTZdYnl0ZQoJY29weShpZFs6XSwgYikKCXJldHVybiBpZAp9CmZ1bmMgZmluZChpZCBbMTZdYnl0ZSkgKm5vdGUgewoJdiwgb2sgOj0gbm90ZXMuR2V0KGlkVGV4dChpZCkpCglpZiAhb2sgewoJCXBhbmljKCJub3Rlczogbm90ZSBub3QgZm91bmQiKQoJfQoJcmV0dXJuIHYuKCpub3RlKQp9CmZ1bmMgbGl2ZShpZCBbMTZdYnl0ZSkgKm5vdGUgewoJbiA6PSBmaW5kKGlkKQoJaWYgbi5EZWxldGVkIHsKCQlwYW5pYygibm90ZXM6IG5vdGUgZGVsZXRlZCIpCgl9CglyZXR1cm4gbgp9CmZ1bmMgZXhwZWN0ZWQobiAqbm90ZSwgcmV2IHVpbnQ2NCkgewoJaWYgcmV2ICE9IG4uUmV2aXNpb24gewoJCXBhbmljKCJub3Rlczogc3RhbGUgcmV2aXNpb24iKQoJfQoJaWYgcmV2ID09IF51aW50NjQoMCkgewoJCXBhbmljKCJub3RlczogcmV2aXNpb24gZXhoYXVzdGVkIikKCX0KfQpmdW5jIG93bmVyKG4gKm5vdGUsIHdobyBhZGRyZXNzKSB7CglpZiBuLk93bmVyICE9IHdobyB7CgkJcGFuaWMoIm5vdGVzOiBvd25lciByZXF1aXJlZCIpCgl9Cn0KZnVuYyBvcGVyYXRpb24obiAqbm90ZSwgb3AgWzE2XWJ5dGUpIHsKCWlmIG9wID09IChbMTZdYnl0ZXt9KSB7CgkJcGFuaWMoIm5vdGVzOiBlbXB0eSBvcGVyYXRpb24gaWQiKQoJfQoJaWYgbiAhPSBuaWwgJiYgbi5MYXN0Lk9wZXJhdGlvbiA9PSBvcCB7CgkJcGFuaWMoIm5vdGVzOiBvcGVyYXRpb24gaWQgcmV1c2VkIikKCX0KfQpmdW5jIGJ1bXAobiAqbm90ZSwgd2hvIGFkZHJlc3MsIG9wIFsxNl1ieXRlLCBhY3Rpb24gc3RyaW5nKSB7CglidW1wSGlzdG9yeShuLCB3aG8sIG9wLCBhY3Rpb24sICIiKQp9CmZ1bmMgYnVtcEhpc3RvcnkobiAqbm90ZSwgd2hvIGFkZHJlc3MsIG9wIFsxNl1ieXRlLCBhY3Rpb24sIGhpc3RvcnlFeHRyYSBzdHJpbmcpIHsKCW9wZXJhdGlvbihuLCBvcCkKCW4uUmV2aXNpb24rKwoJbi5MYXN0ID0gcmVjZWlwdHtvcCwgd2hvLCBydW50aW1lLkNoYWluSGVpZ2h0KCl9CgluLkxhc3RFeGVjdXRvciA9ICIiCgloaXN0b3J5Tm90ZShuLCB3aG8sIG9wLCBhY3Rpb24sIGhpc3RvcnlFeHRyYSkKCWNoYWluLkVtaXQoIk5vdGVDaGFuZ2VkIiwgImlkIiwgaWRUZXh0KG4uSUQpLCAiYWN0aW9uIiwgYWN0aW9uLCAicmV2aXNpb24iLCBzdHJjb252LkZvcm1hdFVpbnQobi5SZXZpc2lvbiwgMTApLCAiYWN0b3IiLCBzdHJpbmcod2hvKSwgIm9wX2lkIiwgaWRUZXh0KG9wKSkKfQpmdW5jIGNvcGllZChiIFtdYnl0ZSkgW11ieXRlIHsgcmV0dXJuIGFwcGVuZChbXWJ5dGUobmlsKSwgYi4uLikgfQpmdW5jIHB1YmxpYyhtb2RlIHVpbnQ4KSBib29sIHsgcmV0dXJuIG1vZGUgPT0gTW9kZVB1YmxpYyB8fCBtb2RlID09IE1vZGVQdWJsaWNPcGVuIH0KZnVuYyBpbmRleEtleShuICpub3RlKSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQobi5TZXF1ZW5jZSwgMTApCglyZXR1cm4gc3RyaW5ncy5SZXBlYXQoIjAiLCAyMC1sZW4ocykpICsgcyArICI6IiArIGlkVGV4dChuLklEKQp9CmZ1bmMgaW5kZXgobiAqbm90ZSkgewoJZm9yIF8sIGEgOj0gcmFuZ2UgYXBwZW5kKGNvcGllZEFkZHJlc3NlcyhuLldyaXRlcnMpLCBuLlJlYWRlcnMuLi4pIHsKCQlzaGFyZWRJbmRleC5TZXQoc3RyaW5nKGEpKyI6IitpbmRleEtleShuKSwgaWRUZXh0KG4uSUQpKQoJfQoJb3duZXJJbmRleC5TZXQoc3RyaW5nKG4uT3duZXIpKyI6IitpbmRleEtleShuKSwgaWRUZXh0KG4uSUQpKQoJaWYgcHVibGljKG4uTW9kZSkgJiYgbi5MaXN0ZWQgJiYgIW4uTW9kZXJhdG9ySGlkZGVuIHsKCQlwdWJsaWNJbmRleC5TZXQoaW5kZXhLZXkobiksIGlkVGV4dChuLklEKSkKCX0KfQpmdW5jIHVuaW5kZXgobiAqbm90ZSkgewoJZm9yIF8sIGEgOj0gcmFuZ2UgYXBwZW5kKGNvcGllZEFkZHJlc3NlcyhuLldyaXRlcnMpLCBuLlJlYWRlcnMuLi4pIHsKCQlzaGFyZWRJbmRleC5SZW1vdmUoc3RyaW5nKGEpICsgIjoiICsgaW5kZXhLZXkobikpCgl9Cglvd25lckluZGV4LlJlbW92ZShzdHJpbmcobi5Pd25lcikgKyAiOiIgKyBpbmRleEtleShuKSkKCXB1YmxpY0luZGV4LlJlbW92ZShpbmRleEtleShuKSkKfQpmdW5jIHZhbGlkYXRlVGl0bGUodGl0bGUgW11ieXRlKSB7CglpZiBsZW4odGl0bGUpID09IDAgfHwgbGVuKHRpdGxlKSA+IE1heFRpdGxlQnl0ZXMgfHwgIXV0ZjguVmFsaWQodGl0bGUpIHx8IHV0ZjguUnVuZUNvdW50KHRpdGxlKSA+IDgwIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgdGl0bGUiKQoJfQoJcyA6PSBzdHJpbmcodGl0bGUpCglpZiBzdHJpbmdzLlRyaW1TcGFjZShzKSAhPSBzIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgdGl0bGUiKQoJfQoJZm9yIF8sIHIgOj0gcmFuZ2UgcyB7CgkJaWYgciA9PSAnLycgfHwgdW5pY29kZS5Jc0NvbnRyb2wocikgfHwgdW5pY29kZS5Jcyh1bmljb2RlLkNmLCByKSB7CgkJCXBhbmljKCJub3RlczogaW52YWxpZCB0aXRsZSIpCgkJfQoJfQp9CmZ1bmMgdmFsaWRhdGVQdWJsaWModGl0bGUsIGJvZHkgW11ieXRlKSB7Cgl2YWxpZGF0ZVRpdGxlKHRpdGxlKQoJaWYgbGVuKGJvZHkpID4gTWF4Qm9keUJ5dGVzIHx8ICF1dGY4LlZhbGlkKGJvZHkpIHsKCQlwYW5pYygibm90ZXM6IGludmFsaWQgYm9keSIpCgl9Cn0KCmZ1bmMgY29waWVkQWRkcmVzc2VzKGEgW11hZGRyZXNzKSBbXWFkZHJlc3MgeyByZXR1cm4gYXBwZW5kKFtdYWRkcmVzcyhuaWwpLCBhLi4uKSB9ChrpDwoJdHlwZXMuZ25vEtsPLy8gUGFja2FnZSBtZW1iYV9ub3Rlc192MSBzdG9yZXMgdmVyc2lvbmVkIE1hcmtkb3duIG5vdGVzIGFuZCB0aGVpciByZWNlaXB0cy4KLy8gUHVibGljYXRpb24gaXMgaW1tdXRhYmxlOyBkZXBsb3ltZW50IGlzIGdhdGVkIG9uIHRoZSBjb21wbGV0ZSBjb250cmFjdCBhdWRpdC4KcGFja2FnZSBtZW1iYV9ub3Rlc192MQoKaW1wb3J0ICJnbm8ubGFuZC9wL3NhbWNyZXcvYXZsIgoKY29uc3QgUmVhbG1QYXRoID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9ub3Rlc192MSIKY29uc3QgUmVzZXJ2ZUFkZHJlc3MgYWRkcmVzcyA9ICJnMWp3NzZseHZ6amFmdzJreWpoZG56d2dnY2Z0eWhubGZqYWVyMnUwIgpjb25zdCAoCglNb2RlUHJpdmF0ZSB1aW50OCA9IGlvdGEKCU1vZGVTaGFyZWQKCU1vZGVMaW5rCglNb2RlUHVibGljCglNb2RlUHVibGljT3BlbgopCmNvbnN0ICgKCU1heEJvZHlCeXRlcyAgICAgICAgPSAxMzEwNzIKCU1heENpcGhlckJvZHlCeXRlcyAgPSAxMzUyMjMKCU1heFRpdGxlQnl0ZXMgICAgICAgPSAxNjAKCU1heENpcGhlclRpdGxlQnl0ZXMgPSAyMzEKCU1heFJlYWRlcnMgICAgICAgICAgPSAzMgoJTWF4UGFnZSAgICAgICAgICAgICA9IDUwCikKCnR5cGUgcmVjZWlwdCBzdHJ1Y3QgewoJT3BlcmF0aW9uIFsxNl1ieXRlCglBY3RvciAgICAgYWRkcmVzcwoJSGVpZ2h0ICAgIGludDY0Cn0KdHlwZSBub3RlIHN0cnVjdCB7CglJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNl1ieXRlCglPd25lciwgUGVuZGluZ093bmVyICAgICAgICAgICAgICAgICAgIGFkZHJlc3MKCU93bmVyR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgdWludDY0CglXcml0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdYWRkcmVzcwoJUmVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXWFkZHJlc3MKCU93bmVySXNSZWFsbSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbAoJUG9saWNpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbM11zdHJpbmcKCVJlcXVlc3RDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2CglHb3ZXcml0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCUxhc3RFeGVjdXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcwoJTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OAoJUmV2aXNpb24sIFRpdGxlUmV2aXNpb24sIEJvZHlSZXZpc2lvbiB1aW50NjQKCUVwb2NoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyCglUaXRsZSwgQm9keSwgQ29tbWl0bWVudCAgICAgICAgICAgICAgIFtdYnl0ZQoJQm9keUJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQKCUNyZWF0ZWRIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQKCVNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0CglDb21tZW50U2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NAoJTGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXB0CglEZWxldGVkLCBMaXN0ZWQgICAgICAgICAgICAgICAgICAgICAgIGJvb2wKCU1vZGVyYXRvckhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAgYm9vbAoJSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGlzdG9yeUluZm8gLy8gcHVibGljIG5vdGVzIG9ubHkKfQoKdmFyIG5vdGVzID0gYXZsLk5ld1RyZWUoKQp2YXIgb3duZXJJbmRleCA9IGF2bC5OZXdUcmVlKCkKdmFyIHB1YmxpY0luZGV4ID0gYXZsLk5ld1RyZWUoKQp2YXIgc2hhcmVkSW5kZXggPSBhdmwuTmV3VHJlZSgpCnZhciBzZXF1ZW5jZSB1aW50NjQKdmFyIGJ1c3kgYm9vbAp2YXIgYWRtaW4sIHBlbmRpbmdBZG1pbiBhZGRyZXNzCnZhciB0cmVhc3VyeSA9IFJlc2VydmVBZGRyZXNzCnZhciBjcmVhdGVGZWUgaW50NjQgPSAxMDAwMDAKdmFyIHBhdXNlZCBib29sCiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMjUwMDAwMDB1Z25vdBITCICI3r4BEgszMDAwMDB1Z25vdBqIAwrNAQoSL3RtLlB1YktleU11bHRpc2lnErYBCAISOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXU7K848tqANWyscQogEgTFVEXmW3vBUKP59RlEEvX+0SOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDKOOJ3rhkJhDgSaVn8LeWBXf9fD3IHUtT4nWr6t2RpngSOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDIOV/XirsLZoGpqv9CvKHp1VH1UALFVlXp85ozdflgQASiwEKBQgDEgGgEkBwrYL0thQ2qj3PARdw6SFMsWXwgZXxfaVQgSypdx+/HHKuZMuLDIY3uFPTnERs2Kze7cqkn/TfnGJNYerEFwAYEkAdofE8jB2isp8GMd4ZYwkmnlOSPpaS6WI2QtZyWjKmbXtF4sVOeORISpGqofiZjY5YugolcM+QagUGdQ7J4PR4GihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data