Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
1A736DFE292B5B7F8454AB8C22BF18CE8700D420E2AD68A687FE903953F1AD34
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
96,531,318
Requested gas limit
GAS USED
48,265,689
Gas consumed
FEE
96532ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1ftls0ctrrj0y96sr9dq906j7gdqhg9exgcvaey
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CrqEAgoML3ZtLm1fYWRkcGtnEqiEAgooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRL6gwIKCmRlZmluaXRpb24SImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2RlZmluaXRpb24a5SwKDmRlZmluaXRpb24uZ25vEtIscGFja2FnZSBkZWZpbml0aW9uCgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJIm5ldC91cmwiCgkic29ydCIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp0eXBlIEZpZWxkIHN0cnVjdCB7CglLZXkgICBzdHJpbmcKCVZhbHVlIHN0cmluZwp9Cgp2YXIgZGVmaW5pdGlvbnMgKmJwdHJlZS5CUFRyZWUKCmZ1bmMgaW5pdCgpIHsKCWRlZmluaXRpb25zID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKfQoKLy8gRGVsZXRlQWxsIHJlbW92ZXMgYWxsIGRlZmluaXRpb25zIHNvIGFuIGFkbWluaXN0cmF0b3IgY2FuIHJlbG9hZCB0aGUgY2F0YWxvZy4KZnVuYyBEZWxldGVBbGwoY3VyIHJlYWxtKSB7Cglhc3NlcnRDYW5Xcml0ZSgwLCBjdXIpCglkZWZpbml0aW9ucyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCn0KCi8vIFNldERlZmluaXRpb25zIGFjY2VwdHMgVVJMLWVzY2FwZWQga2V5cyBhbmQgcXVlcnktZW5jb2RlZCBmaWVsZCBvYmplY3RzIGFzIHBhaXJlZAovLyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncywgc28gTXNnQ2FsbCBjYW4gcGFzcyBhIGJhdGNoIHdpdGhvdXQgcmVhbG0gRFRPcy4KZnVuYyBTZXREZWZpbml0aW9ucyhjdXIgcmVhbG0sIGtleXMsIHZhbHVlcyBzdHJpbmcpIHsKCWFzc2VydENhbldyaXRlKDAsIGN1cikKCWlmIGxlbihrZXlzKStsZW4odmFsdWVzKSA+IDEzMTA3MSB7CgkJcGFuaWMoImNhbGwgYnl0ZXMgZXhjZWVkcyAxMzEwNzEiKQoJfQoJaWYga2V5cyA9PSAiIiAmJiB2YWx1ZXMgPT0gIiIgewoJCWFzc2VydEJhdGNoQ291bnQoMCkKCX0KCWlmIGtleXMgPT0gIiIgfHwgdmFsdWVzID09ICIiIHsKCQlwYW5pYygia2V5cyBhbmQgdmFsdWVzIGNvdW50IG1pc21hdGNoIikKCX0KCXR5cGUgZW50cnkgc3RydWN0IHsKCQlLZXkgICAgc3RyaW5nCgkJRmllbGRzIFtdRmllbGQKCX0KCWVudHJpZXMgOj0gW11lbnRyeXt9CglrZXlTdGFydCwga2V5RW5kIDo9IDAsIDAKCXZhbHVlU3RhcnQsIHZhbHVlRW5kIDo9IDAsIDAKCWZvciB7CgkJYXNzZXJ0QmF0Y2hDb3VudChsZW4oZW50cmllcykgKyAxKQoJCWZvciBrZXlFbmQgPCBsZW4oa2V5cykgJiYga2V5c1trZXlFbmRdICE9ICcsJyB7CgkJCWtleUVuZCsrCgkJfQoJCWZvciB2YWx1ZUVuZCA8IGxlbih2YWx1ZXMpICYmIHZhbHVlc1t2YWx1ZUVuZF0gIT0gJywnIHsKCQkJdmFsdWVFbmQrKwoJCX0KCQlpZiBrZXlTdGFydCA9PSBrZXlFbmQgfHwgdmFsdWVTdGFydCA9PSB2YWx1ZUVuZCB7CgkJCXBhbmljKCJlbXB0eSBlbnRyeSB0b2tlbiIpCgkJfQoJCWtleSwgZXJyIDo9IHVybC5RdWVyeVVuZXNjYXBlKGtleXNba2V5U3RhcnQ6a2V5RW5kXSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoImludmFsaWQgZW5jb2RlZCBrZXkiKQoJCX0KCQlhdHRyaWJ1dGVzLCBlcnIgOj0gdXJsLlBhcnNlUXVlcnkodmFsdWVzW3ZhbHVlU3RhcnQ6dmFsdWVFbmRdKQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygiaW52YWxpZCBlbmNvZGVkIGZpZWxkcyIpCgkJfQoJCWlmIGxlbihhdHRyaWJ1dGVzKSA8IDEgfHwgbGVuKGF0dHJpYnV0ZXMpID4gMzIgewoJCQlwYW5pYygiZmllbGQgY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyIikKCQl9CgkJZmllbGRzIDo9IG1ha2UoW11GaWVsZCwgMCwgbGVuKGF0dHJpYnV0ZXMpKQoJCWZvciBuYW1lLCBmaWVsZFZhbHVlcyA6PSByYW5nZSBhdHRyaWJ1dGVzIHsKCQkJaWYgbGVuKGZpZWxkVmFsdWVzKSAhPSAxIHsKCQkJCXBhbmljKCJkdXBsaWNhdGUgZmllbGQga2V5IikKCQkJfQoJCQlmaWVsZHMgPSBhcHBlbmQoZmllbGRzLCBGaWVsZHtuYW1lLCBmaWVsZFZhbHVlc1swXX0pCgkJfQoJCWVudHJpZXMgPSBhcHBlbmQoZW50cmllcywgZW50cnl7a2V5LCBmaWVsZHN9KQoJCWtleURvbmUgOj0ga2V5RW5kID49IGxlbihrZXlzKQoJCXZhbHVlRG9uZSA6PSB2YWx1ZUVuZCA+PSBsZW4odmFsdWVzKQoJCWlmIGtleURvbmUgIT0gdmFsdWVEb25lIHsKCQkJcGFuaWMoImtleXMgYW5kIHZhbHVlcyBjb3VudCBtaXNtYXRjaCIpCgkJfQoJCWlmIGtleURvbmUgewoJCQlicmVhawoJCX0KCQlrZXlFbmQrKwoJCXZhbHVlRW5kKysKCQlrZXlTdGFydCwgdmFsdWVTdGFydCA9IGtleUVuZCwgdmFsdWVFbmQKCX0KCS8vIFByZXBhcmUgZXZlcnkgZmluYWwgcmVjb3JkIGJlZm9yZSB3cml0aW5nIGFueSBzdGF0ZS4KCXByZXBhcmVkIDo9IG1ha2UoW11bXUZpZWxkLCBsZW4oZW50cmllcykpCgliYXRjaEJ5dGVzIDo9IDAKCWZvciBpLCBlbnRyeSA6PSByYW5nZSBlbnRyaWVzIHsKCQlhc3NlcnRJZGVudGlmaWVyKGVudHJ5LktleSwgImtleSIsIDEyOCkKCQliYXRjaEJ5dGVzICs9IGxlbihlbnRyeS5LZXkpICsgYXNzZXJ0RmllbGRzKGVudHJ5LkZpZWxkcykKCQlpZiBiYXRjaEJ5dGVzID4gNjU1MzYgewoJCQlwYW5pYygiYmF0Y2ggYnl0ZXMgZXhjZWVkcyA2NTUzNiIpCgkJfQoJCWZvciBqIDo9IDA7IGogPCBpOyBqKysgewoJCQlpZiBlbnRyaWVzW2pdLktleSA9PSBlbnRyeS5LZXkgewoJCQkJcGFuaWMoImR1cGxpY2F0ZSBlbnRyeSIpCgkJCX0KCQl9CgkJZmllbGRzLCBfIDo9IGdldEZpZWxkcyhlbnRyeS5LZXkpCgkJZm9yIF8sIHVwZGF0ZSA6PSByYW5nZSBlbnRyeS5GaWVsZHMgewoJCQlmb3VuZCA6PSBmYWxzZQoJCQlmb3IgaiA6PSByYW5nZSBmaWVsZHMgewoJCQkJaWYgZmllbGRzW2pdLktleSA9PSB1cGRhdGUuS2V5IHsKCQkJCQlmaWVsZHNbal0uVmFsdWUgPSB1cGRhdGUuVmFsdWUKCQkJCQlmb3VuZCA9IHRydWUKCQkJCQlicmVhawoJCQkJfQoJCQl9CgkJCWlmICFmb3VuZCB7CgkJCQlmaWVsZHMgPSBhcHBlbmQoZmllbGRzLCB1cGRhdGUpCgkJCX0KCQl9CgkJYXNzZXJ0RmllbGRzKGZpZWxkcykKCQkvLyBBdCBtb3N0IDMyIGZpZWxkczsgaW5zZXJ0aW9uIHNvcnQgYXZvaWRzIGFub3RoZXIgcGVyc2lzdGVudCBpbmRleC4KCQlmb3IgaiA6PSAxOyBqIDwgbGVuKGZpZWxkcyk7IGorKyB7CgkJCWZvciBrIDo9IGo7IGsgPiAwICYmIGZpZWxkc1trXS5LZXkgPCBmaWVsZHNbay0xXS5LZXk7IGstLSB7CgkJCQlmaWVsZHNba10sIGZpZWxkc1trLTFdID0gZmllbGRzW2stMV0sIGZpZWxkc1trXQoJCQl9CgkJfQoJCXByZXBhcmVkW2ldID0gZmllbGRzCgl9Cglmb3IgaSwgZW50cnkgOj0gcmFuZ2UgZW50cmllcyB7CgkJZGVmaW5pdGlvbnMuU2V0KGVudHJ5LktleSwgcHJlcGFyZWRbaV0pCgl9Cn0KCi8vIEdldCByZXR1cm5zIG9yZGVyZWQgZmllbGQgcmVjb3Jkcy4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUga2V5IGlzIGFic2VudDsKLy8gc3RvcmVkIGRlZmluaXRpb25zIGFsd2F5cyBjb250YWluIGF0IGxlYXN0IG9uZSBmaWVsZC4KZnVuYyBHZXQoa2V5IHN0cmluZykgW11tYXBbc3RyaW5nXXN0cmluZyB7CglmaWVsZHMsIF8gOj0gZ2V0RmllbGRzKGtleSkKCXJlc3VsdCA6PSBtYWtlKFtdbWFwW3N0cmluZ11zdHJpbmcsIDAsIGxlbihmaWVsZHMpKQoJZm9yIF8sIGZpZWxkIDo9IHJhbmdlIGZpZWxkcyB7CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgbWFwW3N0cmluZ11zdHJpbmd7ImtleSI6IGZpZWxkLktleSwgInZhbHVlIjogZmllbGQuVmFsdWV9KQoJfQoJcmV0dXJuIHJlc3VsdAp9CgpmdW5jIGdldEZpZWxkcyhrZXkgc3RyaW5nKSAoZmllbGRzIFtdRmllbGQsIGZvdW5kIGJvb2wpIHsKCWlmICFkZWZpbml0aW9ucy5IYXMoa2V5KSB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXN0b3JlZCA6PSBkZWZpbml0aW9ucy5HZXQoa2V5KS4oW11GaWVsZCkKCWZpZWxkcyA9IG1ha2UoW11GaWVsZCwgbGVuKHN0b3JlZCkpCgljb3B5KGZpZWxkcywgc3RvcmVkKQoJcmV0dXJuIGZpZWxkcywgdHJ1ZQp9CgovLyBHZXRGaWVsZCBpbmNsdWRlcyAidmFsdWUiIGV2ZW4gd2hlbiBpdCBpcyBlbXB0eS4gQW4gZW1wdHkgbWFwIG1lYW5zIGFic2VudC4KZnVuYyBHZXRGaWVsZChrZXksIGZpZWxkS2V5IHN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgewoJZmllbGRzLCBfIDo9IGdldEZpZWxkcyhrZXkpCglmb3IgXywgZmllbGQgOj0gcmFuZ2UgZmllbGRzIHsKCQlpZiBmaWVsZC5LZXkgPT0gZmllbGRLZXkgewoJCQlyZXR1cm4gbWFwW3N0cmluZ11zdHJpbmd7InZhbHVlIjogZmllbGQuVmFsdWV9CgkJfQoJfQoJcmV0dXJuIG1hcFtzdHJpbmddc3RyaW5ne30KfQoKZnVuYyBHZXRLZXlDb3VudCgpIGludCB7IHJldHVybiBkZWZpbml0aW9ucy5TaXplKCkgfQoKZnVuYyBMaXN0S2V5cyhwYWdlLCBjb3VudCBpbnQpIFtdc3RyaW5nIHsKCWFzc2VydFBhZ2UocGFnZSwgY291bnQpCglyZXN1bHQgOj0gW11zdHJpbmd7fQoJLy8gQ29tcGFyZSBiZWZvcmUgbXVsdGlwbGljYXRpb24gc28gYW4gZXh0cmVtZSBwYWdlIGNhbm5vdCBvdmVyZmxvdy4KCWlmIGRlZmluaXRpb25zLlNpemUoKSA9PSAwIHx8IHBhZ2UtMSA+IChkZWZpbml0aW9ucy5TaXplKCktMSkvY291bnQgewoJCXJldHVybiByZXN1bHQKCX0KCS8vIFNvcnQgYSBxdWVyeS1sb2NhbCB2aWV3IHNvIGV4aXN0aW5nIHJlY29yZHMga2VlcCB0aGVpciBvcmlnaW5hbCBzdG9yYWdlIGtleXMuCglvcmRlcmVkIDo9IG1ha2UoW11zdHJpbmcsIDAsIGRlZmluaXRpb25zLlNpemUoKSkKCWRlZmluaXRpb25zLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQludW1lcmljIDo9IHRydWUKCQlmb3IgXywgciA6PSByYW5nZSBrZXkgewoJCQlpZiByIDwgJzAnIHx8IHIgPiAnOScgewoJCQkJbnVtZXJpYyA9IGZhbHNlCgkJCQlicmVhawoJCQl9CgkJfQoJCWlmIG51bWVyaWMgewoJCQkvLyBLZXlzIGFyZSBhdCBtb3N0IDEyOCBieXRlcy4gUGFkZGluZyBhdm9pZHMgaW50ZWdlciBvdmVyZmxvdzsgdGhlCgkJCS8vIG9yaWdpbmFsIGtleSBicmVha3MgdGllcyBzdWNoIGFzICIwMSIgYW5kICIxIiB3aXRob3V0IG1lcmdpbmcgdGhlbS4KCQkJb3JkZXJlZCA9IGFwcGVuZChvcmRlcmVkLCAiMCIrc3RyaW5ncy5SZXBlYXQoIjAiLCAxMjgtbGVuKGtleSkpK2tleSsiOiIra2V5KQoJCX0gZWxzZSB7CgkJCW9yZGVyZWQgPSBhcHBlbmQob3JkZXJlZCwgIjE6IitrZXkpCgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCXNvcnQuU3RyaW5ncyhvcmRlcmVkKQoJc3RhcnQgOj0gKHBhZ2UgLSAxKSAqIGNvdW50CgllbmQgOj0gc3RhcnQgKyBjb3VudAoJaWYgZW5kID4gbGVuKG9yZGVyZWQpIHsKCQllbmQgPSBsZW4ob3JkZXJlZCkKCX0KCWZvciBfLCBrZXkgOj0gcmFuZ2Ugb3JkZXJlZFtzdGFydDplbmRdIHsKCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBrZXlbc3RyaW5ncy5JbmRleEJ5dGUoa2V5LCAnOicpKzE6XSkKCX0KCXJldHVybiByZXN1bHQKfQoKZnVuYyBhc3NlcnRDYW5Xcml0ZShfIGludCwgcmxtIHJlYWxtKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgcmxtLCBhZG1pbi5Jc0FkbWluKQoJLy8gTXNnUnVuIGhhcyB0aGUgc2lnbmVyIGFkZHJlc3MgYnV0IGFuIGVwaGVtZXJhbCAvZS88YWRkcmVzcz4vcnVuIHBhdGguCglpZiAhcmxtLlByZXZpb3VzKCkuSXNVc2VyKCkgewoJCXBhbmljKCJkaXJlY3QgdXNlciBjYWxsIG9yIHJ1biByZXF1aXJlZCIpCgl9CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoImF0dGFjaGVkIGNvaW5zIG5vdCBhbGxvd2VkIikKCX0KfQoa53gKE2RlZmluaXRpb25fdGVzdC5nbm8Sz3hwYWNrYWdlIGRlZmluaXRpb24KCmltcG9ydCAoCgkiY2hhaW4iCgkibmV0L3VybCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp2YXIgZGVmaW5pdGlvbkFkbWluID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJkZWZpbml0aW9uQWRtaW4iKQoKLy8gQ2FsbCB3aXRoIGNyb3NzKGN1cik7IGVhY2ggdGVzdCBnZXRzIGZyZXNoIHN0YXRlIGFuZCBhIGRpcmVjdCBhZG1pbiBjYWxsZXIuCmZ1bmMgc2V0dXBEZWZpbml0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglkZWZpbml0aW9ucyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7fSkKCWlmIGFkbWluLkdldEFkbWluKCkgIT0gZGVmaW5pdGlvbkFkbWluIHsKCQl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihhZG1pbi5HZXRBZG1pbigpKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oYWRtaW4uR2V0QWRtaW4oKSkpCgkJYWRtaW4uVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBkZWZpbml0aW9uQWRtaW4pCgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZGVmaW5pdGlvbkFkbWluKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCQlhZG1pbi5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJfQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZGVmaW5pdGlvbkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQp9CgpmdW5jIFRlc3RTdG9yYWdlTWVyZ2VBbmRDb3BpZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBHZXRLZXlDb3VudCgpKQoJZmllbGRzIDo9IFtdRmllbGR7eyJ6IiwgIiJ9LCB7Im5hbWUiLCAi64+MIn0sIHsiZGVzY3JpcHRpb24iLCAiIOykhFxu67CU6r+IIGAgPHRhZz4gIn19CglzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCAiMTEwMTAwMCIsIGZpZWxkcykKCWZpZWxkc1sxXS5WYWx1ZSA9ICJjaGFuZ2VkIgoJc2V0VGVzdERlZmluaXRpb24oY3Jvc3MoY3VyKSwgIjExMDEwMDAiLCBbXUZpZWxke3sibmFtZSIsICJTdG9uZSJ9LCB7ImEiLCAiYWRkZWQifX0pCglnb3QgOj0gR2V0KCIxMTAxMDAwIikKCWFzc2VydEZpZWxkTGlzdCh0LCBbXUZpZWxke3siYSIsICJhZGRlZCJ9LCB7ImRlc2NyaXB0aW9uIiwgIiDspIRcbuuwlOq/iCBgIDx0YWc+ICJ9LCB7Im5hbWUiLCAiU3RvbmUifSwgeyJ6IiwgIiJ9fSwgZ290KQoJZ290WzBdWyJ2YWx1ZSJdID0gIm11dGF0ZWQgcmV0dXJuIgoJZmllbGQgOj0gR2V0RmllbGQoIjExMDEwMDAiLCAiYSIpCglmaWVsZFsidmFsdWUiXSA9ICJtdXRhdGVkIGZpZWxkIHJldHVybiIKCXZhbHVlLCBmb3VuZCA6PSBHZXRGaWVsZCgiMTEwMTAwMCIsICJhIilbInZhbHVlIl0KCXVhc3NlcnQuVHJ1ZSh0LCBmb3VuZCkKCXVhc3NlcnQuRXF1YWwodCwgImFkZGVkIiwgdmFsdWUpCgl2YWx1ZSwgZm91bmQgPSBHZXRGaWVsZCgiMTEwMTAwMCIsICJ6IilbInZhbHVlIl0KCXVhc3NlcnQuVHJ1ZSh0LCBmb3VuZCkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIHZhbHVlKQoJXywgZm91bmQgPSBHZXRGaWVsZCgiMTEwMTAwMCIsICJtaXNzaW5nIilbInZhbHVlIl0KCXVhc3NlcnQuRmFsc2UodCwgZm91bmQpCgl1YXNzZXJ0LkVxdWFsKHQsIGxlbihHZXQoIm1pc3NpbmciKSksIDApCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldEtleUNvdW50KCkpCglzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCAiIEEgOiDtlZzquIAgIiwgW11GaWVsZHt7IiDsnbTrpoQgIiwgIiJ9fSkKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7IjExMDEwMDAiLCAiIEEgOiDtlZzquIAgIn0sIExpc3RLZXlzKDEsIDUwKSkKfQoKZnVuYyBUZXN0RGVsZXRlQWxsQW5kUmVsb2FkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cERlZmluaXRpb24oY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCWJhdGNoIDo9IFtddGVzdEVudHJ5e30KCWZvciBpIDo9IDEwMDsgaSA8IDIwMDsgaSsrIHsKCQliYXRjaCA9IGFwcGVuZChiYXRjaCwgdGVzdEVudHJ5e3N0cmNvbnYuSXRvYShpKSwgW11GaWVsZHt7Im9sZCIsICJkaXNjYXJkIn19fSkKCX0KCXNldFRlc3REZWZpbml0aW9ucyhjcm9zcyhjdXIpLCBiYXRjaCkKCXVhc3NlcnQuRXF1YWwodCwgMTAwLCBHZXRLZXlDb3VudCgpKQoJRGVsZXRlQWxsKGNyb3NzKGN1cikpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIEdldEtleUNvdW50KCkpCglhc3NlcnRTdHJpbmdzKHQsIFtdc3RyaW5ne30sIExpc3RLZXlzKDEsIDUwKSkKCWZvciBfLCBlbnRyeSA6PSByYW5nZSBiYXRjaCB7CgkJdWFzc2VydC5FcXVhbCh0LCBsZW4oR2V0KGVudHJ5LktleSkpLCAwKQoJCV8sIGZvdW5kIDo9IEdldEZpZWxkKGVudHJ5LktleSwgIm9sZCIpWyJ2YWx1ZSJdCgkJdWFzc2VydC5GYWxzZSh0LCBmb3VuZCkKCX0KCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigiIiksICJObyBlbnRyaWVzIikpCglEZWxldGVBbGwoY3Jvc3MoY3VyKSkKCXNldFRlc3REZWZpbml0aW9uKGNyb3NzKGN1ciksICIxMDAiLCBbXUZpZWxke3sibmV3IiwgInJlcGxhY2VtZW50In19KQoJZmllbGRzIDo9IEdldCgiMTAwIikKCWFzc2VydEZpZWxkTGlzdCh0LCBbXUZpZWxke3sibmV3IiwgInJlcGxhY2VtZW50In19LCBmaWVsZHMpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldEtleUNvdW50KCkpCn0KCmZ1bmMgVGVzdEJhdGNoSWRlbXBvdGVuY2VBbmRBdG9taWNWYWxpZGF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cERlZmluaXRpb24oY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCWVudHJpZXMgOj0gW110ZXN0RW50cnl7eyJhIiwgW11GaWVsZHt7Im5hbWUiLCAib2xkIn19fSwgeyJiIiwgW11GaWVsZHt7Im5hbWUiLCAib3RoZXIifX19fQoJc2V0VGVzdERlZmluaXRpb25zKGNyb3NzKGN1ciksIGVudHJpZXMpCglzZXRUZXN0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgZW50cmllcykKCXVhc3NlcnQuRXF1YWwodCwgMiwgR2V0S2V5Q291bnQoKSkKCWZvciBfLCB0YyA6PSByYW5nZSBbXXN0cnVjdCB7CgkJbmFtZSAgIHN0cmluZwoJCWVudHJ5ICB0ZXN0RW50cnkKCQllcnJNc2cgc3RyaW5nCgl9ewoJCXsiZHVwbGljYXRlIGVudHJ5IiwgdGVzdEVudHJ5eyJhIiwgW11GaWVsZHt7Im4iLCAidiJ9fX0sICJkdXBsaWNhdGUgZW50cnkifSwKCQl7ImR1cGxpY2F0ZSBmaWVsZCIsIHRlc3RFbnRyeXsiYyIsIFtdRmllbGR7eyJuIiwgInYifSwgeyJuIiwgInYifX19LCAiZHVwbGljYXRlIGZpZWxkIGtleSJ9LAoJCXsiaW52YWxpZCBrZXkiLCB0ZXN0RW50cnl7IiIsIFtdRmllbGR7eyJuIiwgInYifX19LCAiZW1wdHkgZW50cnkgdG9rZW4ifSwKCQl7ImludmFsaWQgZmllbGQiLCB0ZXN0RW50cnl7ImMiLCBbXUZpZWxke3siXG4iLCAidiJ9fX0sICJmaWVsZCBrZXkgaXMgcmVxdWlyZWQifSwKCQl7ImVtcHR5IGZpZWxkcyIsIHRlc3RFbnRyeXsiYyIsIG5pbH0sICJlbXB0eSBlbnRyeSB0b2tlbiJ9LAoJfSB7CgkJdC5SdW4odGMubmFtZSwgZnVuYyh0ICp0ZXN0aW5nLlQpIHsKCQkJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJCQliYXRjaCA6PSBbXXRlc3RFbnRyeXt7ImEiLCBbXUZpZWxke3sibmFtZSIsICJuZXcifX19LCB0Yy5lbnRyeX0KCQkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsIHRjLmVyck1zZywgZnVuYygpIHsgc2V0VGVzdERlZmluaXRpb25zKGNyb3NzKGN1ciksIGJhdGNoKSB9KQoJCQl2YWx1ZSwgXyA6PSBHZXRGaWVsZCgiYSIsICJuYW1lIilbInZhbHVlIl0KCQkJdWFzc2VydC5FcXVhbCh0LCAib2xkIiwgdmFsdWUpCgkJCXVhc3NlcnQuRXF1YWwodCwgMiwgR2V0S2V5Q291bnQoKSkKCQl9KQoJfQp9CgpmdW5jIFRlc3RMaW1pdHNBbmRNZXJnZWRSZWNvcmQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJZnVsbCA6PSBbXUZpZWxke30KCWZvciBpIDo9IDA7IGkgPCAzMjsgaSsrIHsKCQlmdWxsID0gYXBwZW5kKGZ1bGwsIEZpZWxke3N0cmNvbnYuSXRvYShpKSwgInYifSkKCX0KCXNldFRlc3REZWZpbml0aW9uKGNyb3NzKGN1ciksICJmdWxsIiwgZnVsbCkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZmllbGQgY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyIiwgZnVuYygpIHsKCQlzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCAiZnVsbCIsIFtdRmllbGR7eyJleHRyYSIsICJ2In19KQoJfSkKCXNldFRlc3REZWZpbml0aW9uKGNyb3NzKGN1ciksICJieXRlcyIsIFtdRmllbGR7eyJhIiwgc3RyaW5ncy5SZXBlYXQoIngiLCAxNjM4Myl9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZW50cnkgYnl0ZXMgZXhjZWVkcyAxNjM4NCIsIGZ1bmMoKSB7CgkJc2V0VGVzdERlZmluaXRpb24oY3Jvc3MoY3VyKSwgImJ5dGVzIiwgW11GaWVsZHt7ImIiLCAiIn19KQoJfSkKCXNldFRlc3REZWZpbml0aW9uKGNyb3NzKGN1ciksICJieXRlcyIsIFtdRmllbGR7eyJhIiwgInNtYWxsIn0sIHsiYiIsICIifX0pCglmb3IgXywgdGMgOj0gcmFuZ2UgW11zdHJ1Y3R7IGtleSwgZXJyTXNnIHN0cmluZyB9ewoJCXsiIiwgImtleXMgYW5kIHZhbHVlcyBjb3VudCBtaXNtYXRjaCJ9LCB7IiBcdCIsICJrZXkgaXMgcmVxdWlyZWQifSwgeyJ4XG4iLCAiaW52YWxpZCBrZXkifSwKCQl7c3RyaW5nKFtdYnl0ZXsyNTV9KSwgImludmFsaWQga2V5In0sIHtzdHJpbmdzLlJlcGVhdCgi6rCAIiwgNDMpLCAia2V5IGJ5dGVzIGV4Y2VlZHMgMTI4In0sCgl9IHsKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgdGMuZXJyTXNnLCBmdW5jKCkgeyBzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0Yy5rZXksIFtdRmllbGR7eyJuIiwgInYifX0pIH0pCgl9CglzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCBzdHJpbmdzLlJlcGVhdCgiayIsIDEyOCksIFtdRmllbGR7e3N0cmluZ3MuUmVwZWF0KCJmIiwgMTI4KSwgIiJ9fSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZmllbGQga2V5IGJ5dGVzIGV4Y2VlZHMgMTI4IiwgZnVuYygpIHsgc2V0VGVzdERlZmluaXRpb24oY3Jvc3MoY3VyKSwgIngiLCBbXUZpZWxke3tzdHJpbmdzLlJlcGVhdCgiZiIsIDEyOSksICIifX0pIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgZmllbGQgdmFsdWUiLCBmdW5jKCkgeyBzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCAieCIsIFtdRmllbGR7eyJuIiwgc3RyaW5nKFtdYnl0ZXsyNTV9KX19KSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJiYXRjaCBjb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwIiwgZnVuYygpIHsgc2V0VGVzdERlZmluaXRpb25zKGNyb3NzKGN1ciksIG5pbCkgfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYmF0Y2ggY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCIsIGZ1bmMoKSB7IFNldERlZmluaXRpb25zKGNyb3NzKGN1ciksIHN0cmluZ3MuUmVwZWF0KCJ4LCIsIDEwMCkrIngiLCBzdHJpbmdzLlJlcGVhdCgibj12LCIsIDEwMCkrIm49diIpIH0pCgl0b3RhbCA6PSBHZXRLZXlDb3VudCgpCgliYXRjaCA6PSBbXXRlc3RFbnRyeXt9Cglmb3IgaSA6PSAwOyBpIDwgNTsgaSsrIHsKCQliYXRjaCA9IGFwcGVuZChiYXRjaCwgdGVzdEVudHJ5e3N0cmNvbnYuSXRvYShpKSwgW11GaWVsZHt7ImEiLCBzdHJpbmdzLlJlcGVhdCgieCIsIDE2MzgzKX19fSkKCX0KCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYmF0Y2ggYnl0ZXMgZXhjZWVkcyA2NTUzNiIsIGZ1bmMoKSB7IHNldFRlc3REZWZpbml0aW9ucyhjcm9zcyhjdXIpLCBiYXRjaCkgfSkKCXVhc3NlcnQuRXF1YWwodCwgdG90YWwsIEdldEtleUNvdW50KCkpCn0KCmZ1bmMgVGVzdFBhZ2luYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJYXNzZXJ0U3RyaW5ncyh0LCBbXXN0cmluZ3t9LCBMaXN0S2V5cygxLCA1MCkpCgliYXRjaCA6PSBbXXRlc3RFbnRyeXt9Cglmb3IgaSA6PSA5OTsgaSA+PSAwOyBpLS0gewoJCWJhdGNoID0gYXBwZW5kKGJhdGNoLCB0ZXN0RW50cnl7c3RyY29udi5JdG9hKGkgKyAxMDApLCBbXUZpZWxke3sibiIsICJ2In19fSkKCX0KCXNldFRlc3REZWZpbml0aW9ucyhjcm9zcyhjdXIpLCBiYXRjaCkKCXVhc3NlcnQuRXF1YWwodCwgMTAwLCBHZXRLZXlDb3VudCgpKQoJYXNzZXJ0U3RyaW5ncyh0LCBbXXN0cmluZ3siMTAwIiwgIjEwMSJ9LCBMaXN0S2V5cygxLCAyKSkKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7IjE5OCIsICIxOTkifSwgTGlzdEtleXMoNTAsIDIpKQoJYXNzZXJ0U3RyaW5ncyh0LCBbXXN0cmluZ3t9LCBMaXN0S2V5cyg1MSwgMikpCglhc3NlcnRTdHJpbmdzKHQsIFtdc3RyaW5ne30sIExpc3RLZXlzKGludCg5MjIzMzcyMDM2ODU0Nzc1ODA3KSwgNTApKQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJwYWdlIG11c3QgYmUgcG9zaXRpdmUiLCBmdW5jKCkgeyBMaXN0S2V5cygwLCAxKSB9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTAiLCBmdW5jKCkgeyBMaXN0S2V5cygxLCA1MSkgfSkKCWtleXMgOj0gTGlzdEtleXMoMSwgMSkKCWtleXNbMF0gPSAiY2hhbmdlZCIKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7IjEwMCJ9LCBMaXN0S2V5cygxLCAxKSkKfQoKZnVuYyBUZXN0V3JpdGVBdXRob3JpdHlBbmRQYXltZW50KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cERlZmluaXRpb24oY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCXNldFRlc3REZWZpbml0aW9uKGNyb3NzKGN1ciksICJrZXB0IiwgW11GaWVsZHt7Im5hbWUiLCAicHJlc2VydmVkIn19KQoJb3BlcmF0b3IgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJkZWZpbml0aW9uT3BlcmF0b3IiKQoJYWRtaW4uU2V0T3BlcmF0b3IoY3Jvc3MoY3VyKSwgb3BlcmF0b3IpCglmb3IgXywgY2FsbGVyIDo9IHJhbmdlIFtdYWRkcmVzc3t0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImRlZmluaXRpb25Vc2VyIiksIG9wZXJhdG9yfSB7CgkJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY2FsbGVyKQoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY2FsbGVyKSkKCQl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7IERlbGV0ZUFsbChjcm9zcyhjdXIpKSB9KQoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsgU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIngiLCAibj12IikgfSkKCX0KCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGRlZmluaXRpb25BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9kZWZpbml0aW9uX3JlbGF5IikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7IERlbGV0ZUFsbChjcm9zcyhjdXIpKSB9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgeyBTZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCAieCIsICJuPXYiKSB9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3sidWdub3QiLCAxfX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImF0dGFjaGVkIGNvaW5zIG5vdCBhbGxvd2VkIiwgZnVuYygpIHsgRGVsZXRlQWxsKGNyb3NzKGN1cikpIH0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImF0dGFjaGVkIGNvaW5zIG5vdCBhbGxvd2VkIiwgZnVuYygpIHsgU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIngiLCAibj12IikgfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJdWFzc2VydC5FcXVhbCh0LCAxLCBHZXRLZXlDb3VudCgpKQoJdmFsdWUsIGZvdW5kIDo9IEdldEZpZWxkKCJrZXB0IiwgIm5hbWUiKVsidmFsdWUiXQoJdWFzc2VydC5UcnVlKHQsIGZvdW5kKQoJdWFzc2VydC5FcXVhbCh0LCAicHJlc2VydmVkIiwgdmFsdWUpCglzdGFsZSA6PSBjYXB0dXJlRGVmaW5pdGlvblJlYWxtKGNyb3NzKGN1cikpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwb29mZWQgcmVhbG0iLCBmdW5jKCkgeyBhc3NlcnRDYW5Xcml0ZSgwLCBzdGFsZSkgfSkKfQoKZnVuYyBhc3NlcnRTdHJpbmdzKHQgKnRlc3RpbmcuVCwgZXhwZWN0ZWQsIGFjdHVhbCBbXXN0cmluZykgewoJdC5IZWxwZXIoKQoJaWYgIXVhc3NlcnQuRXF1YWwodCwgbGVuKGV4cGVjdGVkKSwgbGVuKGFjdHVhbCkpIHsKCQlyZXR1cm4KCX0KCWZvciBpIDo9IHJhbmdlIGV4cGVjdGVkIHsKCQl1YXNzZXJ0LkVxdWFsKHQsIGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pCgl9Cn0KCmZ1bmMgYXNzZXJ0RmllbGRMaXN0KHQgKnRlc3RpbmcuVCwgZXhwZWN0ZWQgW11GaWVsZCwgYWN0dWFsIFtdbWFwW3N0cmluZ11zdHJpbmcpIHsKCXQuSGVscGVyKCkKCWlmICF1YXNzZXJ0LkVxdWFsKHQsIGxlbihleHBlY3RlZCksIGxlbihhY3R1YWwpKSB7CgkJcmV0dXJuCgl9Cglmb3IgaSA6PSByYW5nZSBleHBlY3RlZCB7CgkJdWFzc2VydC5FcXVhbCh0LCBleHBlY3RlZFtpXS5LZXksIGFjdHVhbFtpXVsia2V5Il0pCgkJdWFzc2VydC5FcXVhbCh0LCBleHBlY3RlZFtpXS5WYWx1ZSwgYWN0dWFsW2ldWyJ2YWx1ZSJdKQoJfQp9CgpmdW5jIGNhcHR1cmVEZWZpbml0aW9uUmVhbG0oY3VyIHJlYWxtKSByZWFsbSB7IHJldHVybiBjdXIgfQoKZnVuYyBUZXN0U2V0RGVmaW5pdGlvbnNBbmRFc2NhcGVkRmllbGRzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cERlZmluaXRpb24oY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCWtleSA6PSAi7ZWc6riAIPCfmIAsKyY9JTsiCglmaWVsZEtleSA6PSAiZmllbGQsKyY9JTsiCgl2YWx1ZSA6PSAi7ZWc6riAIPCfmIBcblwiXFxgXHgwMCwrJj0lOyB9IC8vIgoJU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgdXJsLlF1ZXJ5RXNjYXBlKGtleSkrIiwxMTAxMDAwIiwgdXJsLlF1ZXJ5RXNjYXBlKGZpZWxkS2V5KSsiPSIrdXJsLlF1ZXJ5RXNjYXBlKHZhbHVlKSsiJmVtcHR5PSxrZXk9d29vZGVuX3N3b3JkIikKCWdvdCwgZm91bmQgOj0gR2V0RmllbGQoa2V5LCBmaWVsZEtleSlbInZhbHVlIl0KCXVhc3NlcnQuVHJ1ZSh0LCBmb3VuZCkKCXVhc3NlcnQuRXF1YWwodCwgdmFsdWUsIGdvdCkKCWdvdCwgZm91bmQgPSBHZXRGaWVsZChrZXksICJlbXB0eSIpWyJ2YWx1ZSJdCgl1YXNzZXJ0LlRydWUodCwgZm91bmQpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBnb3QpCglTZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCB1cmwuUXVlcnlFc2NhcGUoa2V5KSwgIm5ldz1hZGRlZCIpCglnb3QsIF8gPSBHZXRGaWVsZChrZXksIGZpZWxkS2V5KVsidmFsdWUiXQoJdWFzc2VydC5FcXVhbCh0LCB2YWx1ZSwgZ290KQoJdWFzc2VydC5FcXVhbCh0LCAyLCBHZXRLZXlDb3VudCgpKQoJZ290LCBfID0gR2V0RmllbGQoIjExMDEwMDAiLCAia2V5IilbInZhbHVlIl0KCXVhc3NlcnQuRXF1YWwodCwgIndvb2Rlbl9zd29yZCIsIGdvdCkKCURlbGV0ZUFsbChjcm9zcyhjdXIpKQoJU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIjExMDEwMDAiLCAiZnJlc2g9dmFsdWUiKQoJXywgZm91bmQgPSBHZXRGaWVsZCgiMTEwMTAwMCIsICJrZXkiKVsidmFsdWUiXQoJdWFzc2VydC5GYWxzZSh0LCBmb3VuZCkKfQoKZnVuYyBUZXN0U2V0RGVmaW5pdGlvbnNSZWplY3RzSW52YWxpZElucHV0QXRvbWljYWxseShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBEZWZpbml0aW9uKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlZmluaXRpb25BZG1pbikpCglzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCAia2VwdCIsIFtdRmllbGR7eyJuYW1lIiwgIm9sZCJ9fSkKCWZvciBfLCB0YyA6PSByYW5nZSBbXXN0cnVjdHsgbmFtZSwga2V5cywgdmFsdWVzLCBlcnJNc2cgc3RyaW5nIH17CgkJeyJlbXB0eSIsICIiLCAiIiwgImJhdGNoIGNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAifSwKCQl7Im1pc3Npbmcga2V5cyIsICIiLCAibj12IiwgImtleXMgYW5kIHZhbHVlcyBjb3VudCBtaXNtYXRjaCJ9LAoJCXsibWlzc2luZyB2YWx1ZXMiLCAieCIsICIiLCAia2V5cyBhbmQgdmFsdWVzIGNvdW50IG1pc21hdGNoIn0sCgkJeyJzaG9ydCB2YWx1ZXMiLCAia2VwdCx4IiwgIm5hbWU9bmV3IiwgImtleXMgYW5kIHZhbHVlcyBjb3VudCBtaXNtYXRjaCJ9LAoJCXsic2hvcnQga2V5cyIsICJrZXB0IiwgIm5hbWU9bmV3LG49diIsICJrZXlzIGFuZCB2YWx1ZXMgY291bnQgbWlzbWF0Y2gifSwKCQl7ImVtcHR5IGtleSIsICJrZXB0LCx4IiwgIm5hbWU9bmV3LG49dixuPXYiLCAiZW1wdHkgZW50cnkgdG9rZW4ifSwKCQl7ImVtcHR5IGZpZWxkcyIsICJrZXB0LHgiLCAibmFtZT1uZXcsIiwgImVtcHR5IGVudHJ5IHRva2VuIn0sCgkJeyJ0cmFpbGluZyBjb21tYSIsICJrZXB0LCIsICJuYW1lPW5ldywiLCAiZW1wdHkgZW50cnkgdG9rZW4ifSwKCQl7ImR1cGxpY2F0ZSBrZXkiLCAia2VwdCxrJTY1cHQiLCAibmFtZT1uZXcsbj12IiwgImR1cGxpY2F0ZSBlbnRyeSJ9LAoJCXsiZHVwbGljYXRlIGZpZWxkIiwgImtlcHQiLCAibmFtZT1uZXcmbj0xJiU2RT0yIiwgImR1cGxpY2F0ZSBmaWVsZCBrZXkifSwKCQl7ImludmFsaWQgZXNjYXBlIGtleSIsICJrZXB0LCV6eiIsICJuYW1lPW5ldyxuPXYiLCAiaW52YWxpZCBlbmNvZGVkIGtleSJ9LAoJCXsiaW52YWxpZCBlc2NhcGUgdmFsdWUiLCAia2VwdCx4IiwgIm5hbWU9bmV3LG49JXp6IiwgImludmFsaWQgZW5jb2RlZCBmaWVsZHMifSwKCQl7ImludmFsaWQgdXRmOCBrZXkiLCAia2VwdCwlRkYiLCAibmFtZT1uZXcsbj12IiwgImludmFsaWQga2V5In0sCgkJeyJpbnZhbGlkIHV0ZjggdmFsdWUiLCAia2VwdCx4IiwgIm5hbWU9bmV3LG49JUZGIiwgImludmFsaWQgZmllbGQgdmFsdWUifSwKCQl7ImludmFsaWQgZmllbGQiLCAia2VwdCx4IiwgIm5hbWU9bmV3LCUwQT12IiwgImZpZWxkIGtleSBpcyByZXF1aXJlZCJ9LAoJCXsiZW5jb2RlZCBlbXB0eSBrZXkiLCAia2VwdCwrIiwgIm5hbWU9bmV3LG49diIsICJrZXkgaXMgcmVxdWlyZWQifSwKCQl7Im5vIGZpZWxkcyIsICJrZXB0LHgiLCAibmFtZT1uZXcsJiIsICJmaWVsZCBjb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMzIifSwKCQl7ImVuY29kZWQgbGltaXQiLCBzdHJpbmdzLlJlcGVhdCgieCIsIDEzMTA3MiksICJuPXYiLCAiY2FsbCBieXRlcyBleGNlZWRzIDEzMTA3MSJ9LAoJCXsiY291bnQgbGltaXQiLCBzdHJpbmdzLlJlcGVhdCgieCwiLCAxMDApICsgImxhc3QiLCBzdHJpbmdzLlJlcGVhdCgibj12LCIsIDEwMCkgKyAibj12IiwgImJhdGNoIGNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAifSwKCQl7InJhdyBsaW1pdCIsICJhLGIsYyxkLGUiLCBzdHJpbmdzLlJlcGVhdCgiYT0iK3N0cmluZ3MuUmVwZWF0KCJ4IiwgMTYzODMpKyIsIiwgNCkgKyAiYT0iICsgc3RyaW5ncy5SZXBlYXQoIngiLCAxNjM4MyksICJiYXRjaCBieXRlcyBleGNlZWRzIDY1NTM2In0sCgl9IHsKCQl0LlJ1bih0Yy5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewoJCQl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlZmluaXRpb25BZG1pbikpCgkJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCB0Yy5lcnJNc2csIGZ1bmMoKSB7IFNldERlZmluaXRpb25zKGNyb3NzKGN1ciksIHRjLmtleXMsIHRjLnZhbHVlcykgfSkKCQkJdmFsdWUsIGZvdW5kIDo9IEdldEZpZWxkKCJrZXB0IiwgIm5hbWUiKVsidmFsdWUiXQoJCQl1YXNzZXJ0LlRydWUodCwgZm91bmQpCgkJCXVhc3NlcnQuRXF1YWwodCwgIm9sZCIsIHZhbHVlKQoJCQl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldEtleUNvdW50KCkpCgkJfSkKCX0KfQoKZnVuYyBUZXN0U2V0RGVmaW5pdGlvbnNCYXRjaEFuZE1lcmdlZExpbWl0cyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBEZWZpbml0aW9uKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlZmluaXRpb25BZG1pbikpCglrZXlzLCB2YWx1ZXMsIGZpZWxkcyA6PSAiIiwgIiIsICIiCglmb3IgaSA6PSAwOyBpIDwgMzI7IGkrKyB7CgkJaWYgaSA+IDAgewoJCQlmaWVsZHMgKz0gIiYiCgkJfQoJCWZpZWxkcyArPSBzdHJjb252Lkl0b2EoaSkgKyAiPXZhbHVlIgoJfQoJZm9yIGkgOj0gMDsgaSA8IDEwMDsgaSsrIHsKCQlpZiBpID4gMCB7CgkJCWtleXMgKz0gIiwiCgkJCXZhbHVlcyArPSAiLCIKCQl9CgkJa2V5cyArPSBzdHJjb252Lkl0b2EoaSkKCQl2YWx1ZXMgKz0gZmllbGRzCgl9CglTZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCBrZXlzLCB2YWx1ZXMpCgl1YXNzZXJ0LkVxdWFsKHQsIDEwMCwgR2V0S2V5Q291bnQoKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZmllbGQgY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyIiwgZnVuYygpIHsKCQlTZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCAiMCIsICJleHRyYT12YWx1ZSIpCgl9KQoJZ290IDo9IEdldCgiMCIpCgl1YXNzZXJ0LkVxdWFsKHQsIDMyLCBsZW4oZ290KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZmllbGQgY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyIiwgZnVuYygpIHsKCQlTZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCAibmV3IiwgZmllbGRzKyImZXh0cmE9dmFsdWUiKQoJfSkKfQoKLy8gVGVzdCBmaXh0dXJlcyB1c2UgdGhlIHNhbWUgZW5jb2RlZCBpbnB1dCBib3VuZGFyeSBhcyB0aGUgaW1wb3J0ZXIuCnR5cGUgdGVzdEVudHJ5IHN0cnVjdCB7CglLZXkgICAgc3RyaW5nCglGaWVsZHMgW11GaWVsZAp9CgpmdW5jIHNldFRlc3REZWZpbml0aW9uKGN1ciByZWFsbSwga2V5IHN0cmluZywgZmllbGRzIFtdRmllbGQpIHsKCXNldFRlc3REZWZpbml0aW9ucyhjdXIsIFtddGVzdEVudHJ5e3trZXksIGZpZWxkc319KQp9CgpmdW5jIHNldFRlc3REZWZpbml0aW9ucyhjdXIgcmVhbG0sIGVudHJpZXMgW110ZXN0RW50cnkpIHsKCWtleXMsIHZhbHVlcyA6PSAiIiwgIiIKCWZvciBpLCBlbnRyeSA6PSByYW5nZSBlbnRyaWVzIHsKCQlpZiBpID4gMCB7CgkJCWtleXMgKz0gIiwiCgkJCXZhbHVlcyArPSAiLCIKCQl9CgkJa2V5cyArPSB1cmwuUXVlcnlFc2NhcGUoZW50cnkuS2V5KQoJCWZvciBqLCBmaWVsZCA6PSByYW5nZSBlbnRyeS5GaWVsZHMgewoJCQlpZiBqID4gMCB7CgkJCQl2YWx1ZXMgKz0gIiYiCgkJCX0KCQkJdmFsdWVzICs9IHVybC5RdWVyeUVzY2FwZShmaWVsZC5LZXkpICsgIj0iICsgdXJsLlF1ZXJ5RXNjYXBlKGZpZWxkLlZhbHVlKQoJCX0KCX0KCVNldERlZmluaXRpb25zKGN1ciwga2V5cywgdmFsdWVzKQp9CgpmdW5jIFRlc3ROdW1lcmljS2V5UGFnaW5hdGlvbihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBEZWZpbml0aW9uKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlZmluaXRpb25BZG1pbikpCglodWdlIDo9IHN0cmluZ3MuUmVwZWF0KCI5IiwgMTI4KQoJa2V5cyA6PSBbXXN0cmluZ3siMTAwMDAwMCIsICIxMDAiLCAiMTAiLCAiMiIsICIxIiwgIjAiLCAiMDEiLCAiMDAiLCAiaXRlbToyIiwgIml0ZW06MTAiLCAiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLCBodWdlfQoJZW50cmllcyA6PSBbXXRlc3RFbnRyeXt9Cglmb3IgXywga2V5IDo9IHJhbmdlIGtleXMgewoJCWVudHJpZXMgPSBhcHBlbmQoZW50cmllcywgdGVzdEVudHJ5e2tleSwgW11GaWVsZHt7Im5hbWUiLCBrZXl9fX0pCgl9CglzZXRUZXN0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgZW50cmllcykKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7IjAiLCAiMDAiLCAiMDEiLCAiMSIsICIyIn0sIExpc3RLZXlzKDEsIDUpKQoJYXNzZXJ0U3RyaW5ncyh0LCBbXXN0cmluZ3siMTAiLCAiMTAwIiwgIjEwMDAwMDAiLCAiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLCBodWdlfSwgTGlzdEtleXMoMiwgNSkpCglhc3NlcnRTdHJpbmdzKHQsIFtdc3RyaW5neyJpdGVtOjEwIiwgIml0ZW06MiJ9LCBMaXN0S2V5cygzLCA1KSkKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7fSwgTGlzdEtleXMoNCwgNSkpCglmb3IgXywga2V5IDo9IHJhbmdlIGtleXMgewoJCXZhbHVlLCBmb3VuZCA6PSBHZXRGaWVsZChrZXksICJuYW1lIilbInZhbHVlIl0KCQl1YXNzZXJ0LlRydWUodCwgZm91bmQpCgkJdWFzc2VydC5FcXVhbCh0LCBrZXksIHZhbHVlKQoJfQoJU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIjIiLCAibmFtZT11cGRhdGVkIikKCXVhc3NlcnQuRXF1YWwodCwgbGVuKGtleXMpLCBHZXRLZXlDb3VudCgpKQoJYXNzZXJ0U3RyaW5ncyh0LCBbXXN0cmluZ3siMCIsICIwMCIsICIwMSIsICIxIiwgIjIifSwgTGlzdEtleXMoMSwgNSkpCglEZWxldGVBbGwoY3Jvc3MoY3VyKSkKCWFzc2VydFN0cmluZ3ModCwgW11zdHJpbmd7fSwgTGlzdEtleXMoMSwgNSkpCn0KGq8OChFleHRlcm5hbF90ZXN0LmdubxKZDnBhY2thZ2UgZGVmaW5pdGlvbl90ZXN0CgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2RlZmluaXRpb24iCikKCmZ1bmMgVGVzdEV4dGVybmFsRGVmaW5pdGlvbnNBbmRBZG1pblJ1bihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJY2FsbGVyIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZGVmaW5pdGlvbkV4dGVybmFsIikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGFkbWluLkdldEFkbWluKCkpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGFkbWluLkdldEFkbWluKCkpKQoJYWRtaW4uVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCBjYWxsZXIpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihjYWxsZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGNhbGxlcikpCglhZG1pbi5BY2NlcHRBZG1pbihjcm9zcyhjdXIpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCgl0ZXN0aW5nLlNldFJlYWxtKHJ1bnRpbWUuTmV3UmVhbG0oY2FsbGVyLCAiZ25vLmxhbmQvZS8iK2NhbGxlci5TdHJpbmcoKSsiL3J1biIpKQoJZGVmaW5pdGlvbi5TZXREZWZpbml0aW9ucyhjcm9zcyhjdXIpLCAieCIsICJuYW1lPWJlZm9yZSIpCgl2YWx1ZSwgZm91bmQgOj0gZGVmaW5pdGlvbi5HZXRGaWVsZCgieCIsICJuYW1lIilbInZhbHVlIl0KCXVhc3NlcnQuVHJ1ZSh0LCBmb3VuZCkKCXVhc3NlcnQuRXF1YWwodCwgImJlZm9yZSIsIHZhbHVlKQoKCS8vIEEgZm9yZ2VkIGNvZGUgcGF0aCB3aXRoIHRoZSBhZG1pbiBhZGRyZXNzIHN0aWxsIGlzIG5vdCBhIHVzZXIgY2FsbC9ydW4uCgl0ZXN0aW5nLlNldFJlYWxtKHJ1bnRpbWUuTmV3UmVhbG0oY2FsbGVyLCAiZ25vLmxhbmQvci9leGFtcGxlL2ZvcmdlZF9kZWZpbml0aW9uX2FkbWluIikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImRpcmVjdCB1c2VyIGNhbGwgb3IgcnVuIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlkZWZpbml0aW9uLkRlbGV0ZUFsbChjcm9zcyhjdXIpKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZGlyZWN0IHVzZXIgY2FsbCBvciBydW4gcmVxdWlyZWQiLCBmdW5jKCkgewoJCWRlZmluaXRpb24uU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIngiLCAibmFtZT1mb3JnZWQiKQoJfSkKCXZhbHVlLCBfID0gZGVmaW5pdGlvbi5HZXRGaWVsZCgieCIsICJuYW1lIilbInZhbHVlIl0KCXVhc3NlcnQuRXF1YWwodCwgImJlZm9yZSIsIHZhbHVlKQoKCXRlc3RpbmcuU2V0UmVhbG0ocnVudGltZS5OZXdSZWFsbShjYWxsZXIsICJnbm8ubGFuZC9lLyIrY2FsbGVyLlN0cmluZygpKyIvcnVuIikpCglkZWZpbml0aW9uLkRlbGV0ZUFsbChjcm9zcyhjdXIpKQoJdWFzc2VydC5FcXVhbCh0LCBsZW4oZGVmaW5pdGlvbi5HZXQoIngiKSksIDApCglkZWZpbml0aW9uLlNldERlZmluaXRpb25zKGNyb3NzKGN1ciksICJ4IiwgImZyZXNoPXZhbHVlIikKCV8sIGZvdW5kID0gZGVmaW5pdGlvbi5HZXRGaWVsZCgieCIsICJuYW1lIilbInZhbHVlIl0KCXVhc3NlcnQuRmFsc2UodCwgZm91bmQpCgl2YWx1ZSwgZm91bmQgPSBkZWZpbml0aW9uLkdldEZpZWxkKCJ4IiwgImZyZXNoIilbInZhbHVlIl0KCXVhc3NlcnQuVHJ1ZSh0LCBmb3VuZCkKCXVhc3NlcnQuRXF1YWwodCwgInZhbHVlIiwgdmFsdWUpCn0KGkkKC2dub21vZC50b21sEjptb2R1bGUgPSAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvZGVmaW5pdGlvbiIKZ25vID0gIjAuOSIKGuMdCgpyZW5kZXIuZ25vEtQdcGFja2FnZSBkZWZpbml0aW9uCgppbXBvcnQgKAoJImh0bWwiCgkibmV0L3VybCIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidW5pY29kZSIKKQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cgl1LCBlcnIgOj0gdXJsLlBhcnNlKHBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gcmVuZGVyRXJyb3IoIkludmFsaWQgVVJMIikKCX0KCXF1ZXJ5LCBlcnIgOj0gdXJsLlBhcnNlUXVlcnkodS5SYXdRdWVyeSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiByZW5kZXJFcnJvcigiSW52YWxpZCBxdWVyeSIpCgl9CglwYWdlIDo9IDEKCWlmIHJhdyA6PSBxdWVyeS5HZXQoInBhZ2UiKTsgcmF3ICE9ICIiIHsKCQlwYWdlLCBlcnIgPSBzdHJjb252LkF0b2kocmF3KQoJCWlmIGVyciAhPSBuaWwgfHwgcGFnZSA8IDEgewoJCQlyZXR1cm4gcmVuZGVyRXJyb3IoIkludmFsaWQgcGFnZSIpCgkJfQoJfQoJa2V5IDo9IHF1ZXJ5LkdldCgia2V5IikKCW91dHB1dCA6PSAiIyBBS0tBRElBIERlZmluaXRpb25cblxuW0FsbCBpdGVtc10oLi9kZWZpbml0aW9uOilcblxuIiArIHJlbmRlclNlYXJjaEZvcm0oa2V5KQoJc3dpdGNoIHUuUGF0aCB7CgljYXNlICIiLCAibGlzdCI6CgkJdG90YWwgOj0gR2V0S2V5Q291bnQoKQoJCW91dHB1dCArPSAiIyMgSXRlbXMgKCIgKyBzdHJjb252Lkl0b2EodG90YWwpICsgIilcblxuIgoJCWtleXMgOj0gTGlzdEtleXMocGFnZSwgMjApCgkJaWYgbGVuKGtleXMpID09IDAgewoJCQlvdXRwdXQgKz0gIk5vIGVudHJpZXMgb24gdGhpcyBwYWdlLlxuIgoJCX0KCQlmb3IgXywga2V5IDo9IHJhbmdlIGtleXMgewoJCQlsYWJlbCA6PSBrZXkKCQkJaWYgaXRlbUtleSwgZm91bmQgOj0gR2V0RmllbGQoa2V5LCAia2V5IilbInZhbHVlIl07IGZvdW5kICYmIGl0ZW1LZXkgIT0gIiIgewoJCQkJbGFiZWwgKz0gIiDigJQgIiArIGl0ZW1LZXkKCQkJfQoJCQlvdXRwdXQgKz0gIiogWyIgKyByZW5kZXJMYWJlbChsYWJlbCkgKyAiXSguL2RlZmluaXRpb246c2VhcmNoP2tleT0iICsgdXJsLlF1ZXJ5RXNjYXBlKGtleSkgKyAiJnBhZ2U9IiArIHN0cmNvbnYuSXRvYShwYWdlKSArICIpXG4iCgkJfQoJCXBhZ2VzIDo9IDEKCQlpZiB0b3RhbCA+IDAgewoJCQlwYWdlcyA9ICh0b3RhbC0xKS8yMCArIDEKCQl9CgkJb3V0cHV0ICs9ICJcblBhZ2UgIiArIHN0cmNvbnYuSXRvYShwYWdlKSArICIgLyAiICsgc3RyY29udi5JdG9hKHBhZ2VzKSArICJcbiIKCQlyZXR1cm4gb3V0cHV0ICsgcmVuZGVyUGFnZXMoIi4vZGVmaW5pdGlvbjpsaXN0PyIsIHBhZ2UsIHRvdGFsKQoJY2FzZSAic2VhcmNoIjoKCQlpZiBzdHJpbmdzLlRyaW1TcGFjZShrZXkpID09ICIiIHsKCQkJcmV0dXJuIG91dHB1dCArICJLZXkgaXMgcmVxdWlyZWRcbiIKCQl9CgkJZmllbGRzLCBmb3VuZCA6PSBnZXRGaWVsZHMoa2V5KQoJCWlmICFmb3VuZCB7CgkJCXJldHVybiBvdXRwdXQgKyAiRW50cnkgbm90IGZvdW5kXG4iCgkJfQoJCW91dHB1dCArPSAiW0JhY2sgdG8gbGlzdF0oLi9kZWZpbml0aW9uOmxpc3Q/cGFnZT0iICsgc3RyY29udi5JdG9hKHBhZ2UpICsgIilcblxuIgoJCW91dHB1dCArPSAiIyMgIiArIHJlbmRlckxhYmVsKGtleSkgKyAiXG5cbiIKCQlmb3IgXywgZmllbGQgOj0gcmFuZ2UgZmllbGRzIHsKCQkJb3V0cHV0ICs9ICIjIyMgIiArIHJlbmRlckxhYmVsKGZpZWxkLktleSkgKyAiXG5cbiIKCQkJbGluaywgZXJyIDo9IHVybC5QYXJzZShmaWVsZC5WYWx1ZSkKCQkJaXNMaW5rIDo9IGVyciA9PSBuaWwgJiYgKGxpbmsuU2NoZW1lID09ICJodHRwIiB8fCBsaW5rLlNjaGVtZSA9PSAiaHR0cHMiKSAmJiBsaW5rLkhvc3RuYW1lKCkgIT0gIiIgJiYgbGluay5PcGFxdWUgPT0gIiIKCQkJZm9yIF8sIHIgOj0gcmFuZ2UgZmllbGQuVmFsdWUgewoJCQkJaWYgdW5pY29kZS5Jc1NwYWNlKHIpIHx8IHVuaWNvZGUuSXNDb250cm9sKHIpIHsKCQkJCQlpc0xpbmsgPSBmYWxzZQoJCQkJfQoJCQl9CgkJCWlmIGlzTGluayB7CgkJCQkvLyBBbmdsZS1kZWxpbWl0ZWQgTWFya2Rvd24gZGVzdGluYXRpb25zIHJldGFpbiBwYXJlbnRoZXNlcyBhbmQgYW1wZXJzYW5kcy4KCQkJCXRhcmdldCA6PSBzdHJpbmdzLlJlcGxhY2VBbGwoc3RyaW5ncy5SZXBsYWNlQWxsKGxpbmsuU3RyaW5nKCksICI8IiwgIiUzQyIpLCAiPiIsICIlM0UiKQoJCQkJb3V0cHV0ICs9ICJbIiArIHJlbmRlckxhYmVsKGZpZWxkLlZhbHVlKSArICJdKDwiICsgdGFyZ2V0ICsgIj4pXG5cbiIKCQkJfSBlbHNlIHsKCQkJCS8vIEEgZmVuY2UgbG9uZ2VyIHRoYW4gYW55IHVzZXIgZmVuY2Uga2VlcHMgSFRNTCBhbmQgTWFya2Rvd24gbGl0ZXJhbC4KCQkJCWxvbmdlc3QsIHJ1biA6PSAyLCAwCgkJCQlmb3IgXywgciA6PSByYW5nZSBmaWVsZC5WYWx1ZSB7CgkJCQkJaWYgciA9PSAnYCcgewoJCQkJCQlydW4rKwoJCQkJCQlpZiBydW4gPiBsb25nZXN0IHsKCQkJCQkJCWxvbmdlc3QgPSBydW4KCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCXJ1biA9IDAKCQkJCQl9CgkJCQl9CgkJCQlmZW5jZSA6PSBzdHJpbmdzLlJlcGVhdCgiYCIsIGxvbmdlc3QrMSkKCQkJCW91dHB1dCArPSBmZW5jZSArICJcbiIgKyBmaWVsZC5WYWx1ZSArICJcbiIgKyBmZW5jZSArICJcblxuIgoJCQl9CgkJfQoJCXJldHVybiBvdXRwdXQKCWRlZmF1bHQ6CgkJcmV0dXJuIHJlbmRlckVycm9yKCJQYWdlIG5vdCBmb3VuZCIpCgl9Cn0KCmZ1bmMgcmVuZGVyTGFiZWwodmFsdWUgc3RyaW5nKSBzdHJpbmcgewoJLy8gR25vd2ViJ3MgVE9DIHVuZXNjYXBlcyBNYXJrZG93biBwdW5jdHVhdGlvbiBidXQgbGVhdmVzIEhUTUwgZW50aXRpZXMgbGl0ZXJhbC4KCXZhciBvdXRwdXQgc3RyaW5ncy5CdWlsZGVyCglmb3IgXywgciA6PSByYW5nZSB2YWx1ZSB7CgkJaWYgdW5pY29kZS5Jc0NvbnRyb2wocikgewoJCQlvdXRwdXQuV3JpdGVTdHJpbmcoIiAiKQoJCQljb250aW51ZQoJCX0KCQlpZiAociA+PSAnIScgJiYgciA8PSAnLycpIHx8IChyID49ICc6JyAmJiByIDw9ICdAJykgfHwgKHIgPj0gJ1snICYmIHIgPD0gJ2AnKSB8fCAociA+PSAneycgJiYgciA8PSAnficpIHsKCQkJb3V0cHV0LldyaXRlU3RyaW5nKCJcXCIpCgkJfQoJCW91dHB1dC5Xcml0ZVJ1bmUocikKCX0KCXJldHVybiBvdXRwdXQuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJQYWdlcyhiYXNlIHN0cmluZywgcGFnZSwgdG90YWwgaW50KSBzdHJpbmcgewoJb3V0cHV0IDo9ICJcbiIKCWlmIHBhZ2UgPiAxIHsKCQlvdXRwdXQgKz0gIltQcmV2aW91c10oIiArIGJhc2UgKyAicGFnZT0iICsgc3RyY29udi5JdG9hKHBhZ2UtMSkgKyAiKSAiCgl9CglpZiB0b3RhbCA+IDAgJiYgcGFnZSA8PSAodG90YWwtMSkvMjAgewoJCW91dHB1dCArPSAiW05leHRdKCIgKyBiYXNlICsgInBhZ2U9IiArIHN0cmNvbnYuSXRvYShwYWdlKzEpICsgIikiCgl9CglyZXR1cm4gb3V0cHV0ICsgIlxuIgp9CgpmdW5jIHJlbmRlckVycm9yKG1lc3NhZ2Ugc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuICIjIERlZmluaXRpb25cblxuIiArIG1lc3NhZ2UgKyAiXG5cbltBbGwgaXRlbXNdKC4vZGVmaW5pdGlvbjopXG5cbiIgKyByZW5kZXJTZWFyY2hGb3JtKCIiKQp9CgpmdW5jIHJlbmRlclNlYXJjaEZvcm0oa2V5IHN0cmluZykgc3RyaW5nIHsKCXJldHVybiAiPGduby1mb3JtIHBhdGg9XCJzZWFyY2hcIj5cbiAgPGduby1pbnB1dCBuYW1lPVwia2V5XCIgdmFsdWU9XCIiICsgaHRtbC5Fc2NhcGVTdHJpbmcoa2V5KSArICJcIiBwbGFjZWhvbGRlcj1cIkl0ZW0gSUQgKGUuZy4gMTEwMTAwMClcIiAvPlxuPC9nbm8tZm9ybT5cblxuIgp9ChrwJgoPcmVuZGVyX3Rlc3QuZ25vEtwmcGFja2FnZSBkZWZpbml0aW9uCgppbXBvcnQgKAoJIm5ldC91cmwiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKKQoKZnVuYyBUZXN0UmVuZGVyU2VhcmNoQW5kRXNjYXBpbmcoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJa2V5IDo9ICLtlZzquIBcIjwmW2tleV0gJiA/IDoiCglzZXRUZXN0RGVmaW5pdGlvbihjcm9zcyhjdXIpLCBrZXksIFtdRmllbGR7CgkJeyJ0ZXh0IiwgIu2VnOq4gFxuYGBgXG48c2NyaXB0PmFsZXJ0KDEpPC9zY3JpcHQ+XG4qKmJvbGQqKiJ9LAoJCXsibGluayIsICJodHRwczovL2V4YW1wbGUuY29tL2EoYik/eD0xJnk9MiJ9LAoJCXsidW5zYWZlIiwgImphdmFzY3JpcHQ6YWxlcnQoMSkifSwKCQl7Im1peGVkIiwgImh0dHBzOi8vZXhhbXBsZS5jb20vIHRleHQifSwKCQl7ImVtcHR5IiwgIiJ9LAoJfSkKCXBhZ2UgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIjxnbm8tZm9ybSBwYXRoPVwic2VhcmNoXCI+IikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAibmFtZT1cImtleVwiIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIm5hbWU9XCJ0eXBlXCIiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJzZWFyY2g/a2V5PSIrdXJsLlF1ZXJ5RXNjYXBlKGtleSkpKQoJcmVzdWx0IDo9IFJlbmRlcigic2VhcmNoP2tleT0iICsgdXJsLlF1ZXJ5RXNjYXBlKGtleSkgKyAiJnBhZ2U9MiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhyZXN1bHQsICJ2YWx1ZT1cIu2VnOq4gCYjMzQ7Jmx0OyZhbXA7W2tleV0gJmFtcDsgPyA6XCIiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJlc3VsdCwgIltCYWNrIHRvIGxpc3RdKC4vZGVmaW5pdGlvbjpsaXN0P3BhZ2U9MikiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJlc3VsdCwgImBgYGBcbu2VnOq4gFxuYGBgXG48c2NyaXB0PmFsZXJ0KDEpPC9zY3JpcHQ+XG4qKmJvbGQqKlxuYGBgYCIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocmVzdWx0LCAiXSg8aHR0cHM6Ly9leGFtcGxlLmNvbS9hKGIpP3g9MSZ5PTI+KSIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocmVzdWx0LCAiYGBgXG5qYXZhc2NyaXB0OmFsZXJ0KDEpXG5gYGAiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHJlc3VsdCwgImBgYFxuaHR0cHM6Ly9leGFtcGxlLmNvbS8gdGV4dFxuYGBgIikpCglmb3IgXywgdGMgOj0gcmFuZ2UgW11zdHJ1Y3R7IHBhdGgsIG1lc3NhZ2Ugc3RyaW5nIH17CgkJeyJzZWFyY2giLCAiS2V5IGlzIHJlcXVpcmVkIn0sIHsic2VhcmNoP2tleT1taXNzaW5nIiwgIkVudHJ5IG5vdCBmb3VuZCJ9LAoJCXsibGlzdD9wYWdlPTAiLCAiSW52YWxpZCBwYWdlIn0sIHsiP3BhZ2U9OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IiwgIkludmFsaWQgcGFnZSJ9LAoJCXsiP2tleT0lenoiLCAiSW52YWxpZCBxdWVyeSJ9LCB7Im90aGVyIiwgIlBhZ2Ugbm90IGZvdW5kIn0sCgl9IHsKCQlyZXN1bHQgOj0gUmVuZGVyKHRjLnBhdGgpCgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocmVzdWx0LCB0Yy5tZXNzYWdlKSkKCQl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhyZXN1bHQsICI8Z25vLWZvcm0gcGF0aD1cInNlYXJjaFwiPiIpKQoJfQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJzZWFyY2g/a2V5PW1pc3NpbmciKSwgInZhbHVlPVwibWlzc2luZ1wiIikpCn0KCmZ1bmMgVGVzdFJlbmRlclBhZ2luYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCIiKSwgIk5vIGVudHJpZXMiKSkKCWJhdGNoIDo9IFtddGVzdEVudHJ5e30KCWZvciBpIDo9IDEwMDsgaSA8IDE0MTsgaSsrIHsKCQliYXRjaCA9IGFwcGVuZChiYXRjaCwgdGVzdEVudHJ5e3N0cmNvbnYuSXRvYShpKSwgW11GaWVsZHt7ImtleSIsICJpdGVtXyIgKyBzdHJjb252Lkl0b2EoaSl9fX0pCgl9CglzZXRUZXN0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgYmF0Y2gpCglmb3IgXywgdGMgOj0gcmFuZ2UgW11zdHJ1Y3QgewoJCXBhZ2UsIGNvdW50ICAgIGludAoJCXByZXZpb3VzLCBuZXh0IGJvb2wKCX17CgkJezEsIDIwLCBmYWxzZSwgdHJ1ZX0sIHsyLCAyMCwgdHJ1ZSwgdHJ1ZX0sIHszLCAxLCB0cnVlLCBmYWxzZX0sIHs0LCAwLCB0cnVlLCBmYWxzZX0sCgl9IHsKCQlwYWdlIDo9IFJlbmRlcigibGlzdD9wYWdlPSIgKyBzdHJjb252Lkl0b2EodGMucGFnZSkpCgkJdWFzc2VydC5FcXVhbCh0LCB0Yy5jb3VudCwgc3RyaW5ncy5Db3VudChwYWdlLCAiLi9kZWZpbml0aW9uOnNlYXJjaD9rZXk9IikpCgkJdWFzc2VydC5FcXVhbCh0LCB0Yy5wcmV2aW91cywgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiW1ByZXZpb3VzXSIpKQoJCXVhc3NlcnQuRXF1YWwodCwgdGMubmV4dCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiW05leHRdIikpCgkJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIlBhZ2UgIitzdHJjb252Lkl0b2EodGMucGFnZSkrIiAvIDMiKSkKCX0KCWZpcnN0IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGZpcnN0LCAiKiBbMTAwIOKAlCBpdGVtXFxfMTAwXSguL2RlZmluaXRpb246c2VhcmNoP2tleT0xMDAmcGFnZT0xKSIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZmlyc3QsICJzZWFyY2g/a2V5PTExOSZwYWdlPTEiKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhmaXJzdCwgInNlYXJjaD9rZXk9MTIwIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJsaXN0P3BhZ2U9OTIyMzM3MjAzNjg1NDc3NTgwNyIpLCAiW05leHRdIikpCn0KCmZ1bmMgVGVzdFJlbmRlclJlYWRhYmxlSGVhZGluZ3MoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRGVmaW5pdGlvbihjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWZpbml0aW9uQWRtaW4pKQoJU2V0RGVmaW5pdGlvbnMoY3Jvc3MoY3VyKSwgIjExMDMwMTUiLCAiYWJpbGl0aWVzPXZhbHVlJmRpc3BsYXlNZXRhZGF0YT12YWx1ZSZrZXk9d29vZGVuX3N3b3JkIikKCXBhZ2UgOj0gUmVuZGVyKCJzZWFyY2g/a2V5PTExMDMwMTUmcGFnZT0xMCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiIyMgMTEwMzAxNVxuIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiIyMjIGFiaWxpdGllc1xuIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiIyMjIGRpc3BsYXlNZXRhZGF0YVxuIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIiYjIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhSZW5kZXIoIiIpLCAiWzExMDMwMTUg4oCUIHdvb2RlblxcX3N3b3JkXSIpKQoJLy8gTGl0ZXJhbCBlbnRpdGllcyBhbmQgbWFya3VwIG11c3QgcmVtYWluIHRleHQsIGluY2x1ZGluZyBpbiB0aGUgVE9DLgoJdWFzc2VydC5FcXVhbCh0LCBgXCZcIzQ5XDsgXDxzY3JpcHRcPiBcW3hcXVwodXJsXCkgXCpib2xkXCogXH5zdHJpa2VcfmAsIHJlbmRlckxhYmVsKCImIzQ5OyA8c2NyaXB0PiBbeF0odXJsKSAqYm9sZCogfnN0cmlrZX4iKSkKCXVhc3NlcnQuRXF1YWwodCwgIu2VnOq4gCDwn5iAIG5leHQgbGluZSIsIHJlbmRlckxhYmVsKCLtlZzquIAg8J+YgFxubmV4dFxybGluZSIpKQp9CgpmdW5jIFRlc3RSZW5kZXJOdW1lcmljUGFnZU9yZGVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cERlZmluaXRpb24oY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVmaW5pdGlvbkFkbWluKSkKCWVudHJpZXMgOj0gW110ZXN0RW50cnl7fQoJZm9yIGkgOj0gMjE7IGkgPj0gMDsgaS0tIHsKCQllbnRyaWVzID0gYXBwZW5kKGVudHJpZXMsIHRlc3RFbnRyeXtzdHJjb252Lkl0b2EoaSksIFtdRmllbGR7eyJuYW1lIiwgIml0ZW0ifX19KQoJfQoJc2V0VGVzdERlZmluaXRpb25zKGNyb3NzKGN1ciksIGVudHJpZXMpCglmaXJzdCA6PSBSZW5kZXIoIiIpCglwcmV2aW91cyA6PSAtMQoJZm9yIGkgOj0gMDsgaSA8IDIwOyBpKysgewoJCXBvc2l0aW9uIDo9IHN0cmluZ3MuSW5kZXgoZmlyc3QsICJdKC4vZGVmaW5pdGlvbjpzZWFyY2g/a2V5PSIrc3RyY29udi5JdG9hKGkpKyImcGFnZT0xKSIpCgkJdWFzc2VydC5UcnVlKHQsIHBvc2l0aW9uID4gcHJldmlvdXMpCgkJcHJldmlvdXMgPSBwb3NpdGlvbgoJfQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGZpcnN0LCAic2VhcmNoP2tleT0yMCYiKSkKCXNlY29uZCA6PSBSZW5kZXIoImxpc3Q/cGFnZT0yIikKCXVhc3NlcnQuRXF1YWwodCwgMiwgc3RyaW5ncy5Db3VudChzZWNvbmQsICJdKC4vZGVmaW5pdGlvbjpzZWFyY2g/a2V5PSIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoc2Vjb25kLCAic2VhcmNoP2tleT0yMCZwYWdlPTIiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHNlY29uZCwgInNlYXJjaD9rZXk9MjEmcGFnZT0yIikpCn0KGvsJCg52YWxpZGF0aW9uLmdubxLoCXBhY2thZ2UgZGVmaW5pdGlvbgoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidW5pY29kZSIKCSJ1bmljb2RlL3V0ZjgiCikKCmZ1bmMgYXNzZXJ0SWRlbnRpZmllcih2YWx1ZSwgbmFtZSBzdHJpbmcsIGxpbWl0IGludCkgewoJaWYgc3RyaW5ncy5UcmltU3BhY2UodmFsdWUpID09ICIiIHsKCQlwYW5pYyhuYW1lICsgIiBpcyByZXF1aXJlZCIpCgl9CglpZiBsZW4odmFsdWUpID4gbGltaXQgewoJCXBhbmljKG5hbWUgKyAiIGJ5dGVzIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShsaW1pdCkpCgl9CglpZiAhdXRmOC5WYWxpZFN0cmluZyh2YWx1ZSkgewoJCXBhbmljKCJpbnZhbGlkICIgKyBuYW1lKQoJfQoJZm9yIF8sIHIgOj0gcmFuZ2UgdmFsdWUgewoJCWlmIHVuaWNvZGUuSXNDb250cm9sKHIpIHsKCQkJcGFuaWMoImludmFsaWQgIiArIG5hbWUpCgkJfQoJfQp9CgpmdW5jIGFzc2VydEZpZWxkcyhmaWVsZHMgW11GaWVsZCkgaW50IHsKCWlmIGxlbihmaWVsZHMpIDwgMSB8fCBsZW4oZmllbGRzKSA+IDMyIHsKCQlwYW5pYygiZmllbGQgY291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDMyIikKCX0KCXNpemUgOj0gMAoJZm9yIGksIGZpZWxkIDo9IHJhbmdlIGZpZWxkcyB7CgkJYXNzZXJ0SWRlbnRpZmllcihmaWVsZC5LZXksICJmaWVsZCBrZXkiLCAxMjgpCgkJaWYgIXV0ZjguVmFsaWRTdHJpbmcoZmllbGQuVmFsdWUpIHsKCQkJcGFuaWMoImludmFsaWQgZmllbGQgdmFsdWUiKQoJCX0KCQlmb3IgaiA6PSAwOyBqIDwgaTsgaisrIHsKCQkJaWYgZmllbGRzW2pdLktleSA9PSBmaWVsZC5LZXkgewoJCQkJcGFuaWMoImR1cGxpY2F0ZSBmaWVsZCBrZXkiKQoJCQl9CgkJfQoJCXNpemUgKz0gbGVuKGZpZWxkLktleSkgKyBsZW4oZmllbGQuVmFsdWUpCgkJaWYgc2l6ZSA+IDE2Mzg0IHsKCQkJcGFuaWMoImVudHJ5IGJ5dGVzIGV4Y2VlZHMgMTYzODQiKQoJCX0KCX0KCXJldHVybiBzaXplCn0KCmZ1bmMgYXNzZXJ0QmF0Y2hDb3VudChjb3VudCBpbnQpIHsKCWlmIGNvdW50IDwgMSB8fCBjb3VudCA+IDEwMCB7CgkJcGFuaWMoImJhdGNoIGNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAiKQoJfQp9CgpmdW5jIGFzc2VydFBhZ2UocGFnZSwgY291bnQgaW50KSB7CglpZiBwYWdlIDwgMSB7CgkJcGFuaWMoInBhZ2UgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CglpZiBjb3VudCA8IDEgfHwgY291bnQgPiA1MCB7CgkJcGFuaWMoImNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MCIpCgl9Cn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhEI7M2HXBIKOTY1MzJ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQItRS2vq8g7O+I4ZvJRzWH7jH0BzvxYjnsf41ryBRUbwxJANWDuygDR8CVuxXmCpWX3egf9gQ8+aT6yBJnbqupw+LEEjetNO6gGmTrKVaTS+n724HfX+dqfPx/JbT3tnq+WahooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==