Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
21BE2134F354C5D3B18AD20A251C7CC2DF38D788D81E0A64AC5D2455DC5EDE1D
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
86,260,912
Requested gas limit
GAS USED
43,130,486
Gas consumed
FEE
86261ugnot
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
CqXlAQoML3ZtLm1fYWRkcGtnEpPlAQooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRLl5AEKCmdhbWVfd29ybGQSImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2dhbWVfd29ybGQaQQoKY29uZmlnLmdubxIzcGFja2FnZSBnYW1lX3dvcmxkCgpjb25zdCBnYW1lV29ybGRMaXN0TGltaXQgPSAxMDAKGpgpCg5nYW1lX3dvcmxkLmdubxKFKXBhY2thZ2UgZ2FtZV93b3JsZAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpjb25zdCAoCglDcmVhdGVHYW1lV29ybGRFdmVudCAgID0gIkNyZWF0ZUdhbWVXb3JsZCIKCVJlc3RyaWN0R2FtZVdvcmxkRXZlbnQgPSAiUmVzdHJpY3RHYW1lV29ybGQiCikKCnR5cGUgQ3JlYXRpb25Nb2RlIGludAoKY29uc3QgKAoJQ3JlYXRpb25Nb2RlSW52YWxpZCBDcmVhdGlvbk1vZGUgPSBpb3RhCglDcmVhdGlvbk1vZGVPcGVyYXRvck9ubHkKCUNyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcgoJQ3JlYXRpb25Nb2RlUHVibGljQ3JlYXRvcgopCgp0eXBlIEdhbWVXb3JsZFN0YXR1cyBpbnQKCmNvbnN0ICgKCUdhbWVXb3JsZFN0YXR1c0ludmFsaWQgR2FtZVdvcmxkU3RhdHVzID0gaW90YQoJR2FtZVdvcmxkU3RhdHVzRXhpc3RzCglHYW1lV29ybGRTdGF0dXNSZXN0cmljdGVkCikKCnR5cGUgR2FtZVdvcmxkIHN0cnVjdCB7CglJRCAgICAgICAgICAgICAgIHVpbnQ2NAoJT3duZXIgICAgICAgICAgICBhZGRyZXNzCglHYW1lVHlwZSAgICAgICAgIHN0cmluZwoJU3RhdHVzICAgICAgICAgICBHYW1lV29ybGRTdGF0dXMKCUNyZWF0ZWRIZWlnaHQgICAgaW50NjQKCVJlc3RyaWN0ZWRIZWlnaHQgaW50NjQKfQoKdHlwZSBHYW1lVHlwZVBvbGljeSBzdHJ1Y3QgewoJQ3JlYXRpb25Db3N0IGludDY0CglDcmVhdGlvbk1vZGUgQ3JlYXRpb25Nb2RlCn0KCmZ1bmMgQ3JlYXRlR2FtZVdvcmxkKGN1ciByZWFsbSwgZ2FtZVR5cGUgc3RyaW5nKSB1aW50NjQgewoJb3duZXIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglwb2xpY3kgOj0gbXVzdEdldEdhbWVUeXBlUG9saWN5KGdhbWVUeXBlKQoJYXNzZXJ0Q3JlYXRpb25BbGxvd2VkKGdhbWVUeXBlLCBvd25lciwgcG9saWN5LkNyZWF0aW9uTW9kZSkKCWFzc2VydEV4YWN0VWdub3RQYXltZW50KHBvbGljeS5DcmVhdGlvbkNvc3QpCgoJaWQgOj0gY3JlYXRlR2FtZVdvcmxkKG93bmVyLCBnYW1lVHlwZSkKCWlmIHBvbGljeS5DcmVhdGlvbkNvc3QgPiAwIHsKCQlibmsgOj0gYmFua2VyLk5ld0JhbmtlcihiYW5rZXIuQmFua2VyVHlwZVJlYWxtU2VuZCwgY3VyKQoJCWJuay5TZW5kQ29pbnMoY3VyLkFkZHJlc3MoKSwgYWRtaW4uR2V0RmVlQ29sbGVjdG9yKCksIGNoYWluLkNvaW5ze3sidWdub3QiLCBwb2xpY3kuQ3JlYXRpb25Db3N0fX0pCgl9CgllbWl0Q3JlYXRlR2FtZVdvcmxkKG93bmVyLCBpZCwgZ2FtZVR5cGUsIHBvbGljeS5DcmVhdGlvbkNvc3QpCglyZXR1cm4gaWQKfQoKZnVuYyBSZXN0cmljdEdhbWVXb3JsZChjdXIgcmVhbG0sIGdhbWVXb3JsZElEIHVpbnQ2NCkgewoJZXhlY3V0b3IgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0QWRtaW5Pck9wZXJhdG9yQ2FsbGVyKDAsIGN1ciwgYWRtaW4uSXNBZG1pbiwgYWRtaW4uSXNPcGVyYXRvcikKCXdvcmxkIDo9IEdldEdhbWVXb3JsZChnYW1lV29ybGRJRCkKCWlmIHdvcmxkLlN0YXR1cyA9PSBHYW1lV29ybGRTdGF0dXNSZXN0cmljdGVkIHsKCQlyZXR1cm4KCX0KCXdvcmxkLlN0YXR1cyA9IEdhbWVXb3JsZFN0YXR1c1Jlc3RyaWN0ZWQKCXdvcmxkLlJlc3RyaWN0ZWRIZWlnaHQgPSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWdhbWVXb3JsZHMuU2V0KHVpbnQ2NEtleShnYW1lV29ybGRJRCksIHdvcmxkKQoJcmVtb3ZlT3duZXJHYW1lV29ybGRJRCh3b3JsZC5Pd25lciwgZ2FtZVdvcmxkSUQpCglyZXN0cmljdGVkR2FtZVdvcmxkSURzLlNldCh1aW50NjRLZXkoZ2FtZVdvcmxkSUQpLCB0cnVlKQoJY2hhaW4uRW1pdCgKCQlSZXN0cmljdEdhbWVXb3JsZEV2ZW50LAoJCSJleGVjdXRvciIsIGV4ZWN1dG9yLlN0cmluZygpLAoJCSJpZCIsIHN0cmNvbnYuRm9ybWF0VWludChnYW1lV29ybGRJRCwgMTApLAoJCSJvbGRTdGF0dXMiLCBzdHJjb252Lkl0b2EoaW50KEdhbWVXb3JsZFN0YXR1c0V4aXN0cykpLAoJCSJuZXdTdGF0dXMiLCBzdHJjb252Lkl0b2EoaW50KEdhbWVXb3JsZFN0YXR1c1Jlc3RyaWN0ZWQpKSwKCQkicmVzdHJpY3RlZEhlaWdodCIsIHN0cmNvbnYuRm9ybWF0SW50KHdvcmxkLlJlc3RyaWN0ZWRIZWlnaHQsIDEwKSwKCSkKfQoKZnVuYyBIYXNHYW1lV29ybGQoZ2FtZVdvcmxkSUQgdWludDY0KSBib29sIHsgcmV0dXJuIGdhbWVXb3JsZHMuSGFzKHVpbnQ2NEtleShnYW1lV29ybGRJRCkpIH0KCmZ1bmMgR2V0R2FtZVdvcmxkKGdhbWVXb3JsZElEIHVpbnQ2NCkgR2FtZVdvcmxkIHsKCXZhbHVlIDo9IGdhbWVXb3JsZHMuR2V0KHVpbnQ2NEtleShnYW1lV29ybGRJRCkpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXBhbmljKCJnYW1lIHdvcmxkIG5vdCBmb3VuZDogIiArIHN0cmNvbnYuRm9ybWF0VWludChnYW1lV29ybGRJRCwgMTApKQoJfQoJcmV0dXJuIHZhbHVlLihHYW1lV29ybGQpCn0KCmZ1bmMgR2V0TGF0ZXN0R2FtZVdvcmxkSUQoKSB1aW50NjQgeyByZXR1cm4gbGF0ZXN0R2FtZVdvcmxkSUQgfQoKZnVuYyBHZXRMaXN0TGltaXQoKSBpbnQgeyByZXR1cm4gZ2FtZVdvcmxkTGlzdExpbWl0IH0KCmZ1bmMgR2V0UmVzdHJpY3RlZEdhbWVXb3JsZENvdW50KCkgaW50IHsgcmV0dXJuIHJlc3RyaWN0ZWRHYW1lV29ybGRJRHMuU2l6ZSgpIH0KCmZ1bmMgTGlzdFJlc3RyaWN0ZWRHYW1lV29ybGRJRHMocGFnZSwgY291bnQgaW50KSBbXXVpbnQ2NCB7CglpZiBwYWdlIDwgMSB7CgkJcGFuaWMoInBhZ2UgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCWlmIGNvdW50IDwgMSB8fCBjb3VudCA+IGdhbWVXb3JsZExpc3RMaW1pdCB7CgkJcGFuaWMoImNvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDAiKQoJfQoJcmVzdWx0IDo9IFtddWludDY0e30KCXJlc3RyaWN0ZWRHYW1lV29ybGRJRHMuSXRlcmF0ZUJ5T2Zmc2V0KChwYWdlLTEpKmNvdW50LCBjb3VudCwgZnVuYyhrZXkgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGFyc2VVaW50NjRLZXkoa2V5KSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gcmVzdWx0Cn0KCmZ1bmMgTGlzdExhdGVzdEdhbWVXb3JsZHNCeU93bmVyKG93bmVyIGFkZHJlc3MpIFtdR2FtZVdvcmxkIHsKCWlkcywgZm91bmQgOj0gZ2V0T3duZXJHYW1lV29ybGRJRHMob3duZXIpCglpZiAhZm91bmQgewoJCXJldHVybiBbXUdhbWVXb3JsZHt9Cgl9CglvZmZzZXQgOj0gaWRzLlNpemUoKSAtIGdhbWVXb3JsZExpc3RMaW1pdAoJaWYgb2Zmc2V0IDwgMCB7CgkJb2Zmc2V0ID0gMAoJfQoJcmVzdWx0IDo9IFtdR2FtZVdvcmxke30KCWlkcy5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBnYW1lV29ybGRMaXN0TGltaXQsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCXJlc3VsdCA9IGFwcGVuZChyZXN1bHQsIEdldEdhbWVXb3JsZChwYXJzZVVpbnQ2NEtleShrZXkpKSkKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gcmVzdWx0Cn0KCmZ1bmMgY3JlYXRlR2FtZVdvcmxkKG93bmVyIGFkZHJlc3MsIGdhbWVUeXBlIHN0cmluZykgdWludDY0IHsKCWlmIGxhdGVzdEdhbWVXb3JsZElEID09IHVpbnQ2NCgxODQ0Njc0NDA3MzcwOTU1MTYxNSkgewoJCXBhbmljKCJnYW1lIHdvcmxkIGlkIGV4aGF1c3RlZCIpCgl9CglsYXRlc3RHYW1lV29ybGRJRCsrCglpZCA6PSBsYXRlc3RHYW1lV29ybGRJRAoJZ2FtZVdvcmxkcy5TZXQodWludDY0S2V5KGlkKSwgR2FtZVdvcmxkewoJCUlEOiAgICAgICAgICAgIGlkLAoJCU93bmVyOiAgICAgICAgIG93bmVyLAoJCUdhbWVUeXBlOiAgICAgIGdhbWVUeXBlLAoJCVN0YXR1czogICAgICAgIEdhbWVXb3JsZFN0YXR1c0V4aXN0cywKCQlDcmVhdGVkSGVpZ2h0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9KQoJYWRkT3duZXJHYW1lV29ybGRJRChvd25lciwgaWQpCglyZXR1cm4gaWQKfQoKZnVuYyBhc3NlcnRDcmVhdGlvbkFsbG93ZWQoZ2FtZVR5cGUgc3RyaW5nLCBjcmVhdG9yIGFkZHJlc3MsIG1vZGUgQ3JlYXRpb25Nb2RlKSB7Cglzd2l0Y2ggbW9kZSB7CgljYXNlIENyZWF0aW9uTW9kZU9wZXJhdG9yT25seToKCQlpZiAhYWRtaW4uSXNBZG1pbihjcmVhdG9yKSAmJiAhYWRtaW4uSXNPcGVyYXRvcihjcmVhdG9yKSB7CgkJCXBhbmljKCJnYW1lIHR5cGUgY3JlYXRpb24gaXMgb3BlcmF0b3Igb25seSIpCgkJfQoJY2FzZSBDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3I6CgkJaWYgIWlzQXBwcm92ZWRDcmVhdG9yKGdhbWVUeXBlLCBjcmVhdG9yKSB7CgkJCXBhbmljKCJjcmVhdG9yIGlzIG5vdCBhcHByb3ZlZCBmb3IgZ2FtZSB0eXBlIikKCQl9CgljYXNlIENyZWF0aW9uTW9kZVB1YmxpY0NyZWF0b3I6CgkJcmV0dXJuCglkZWZhdWx0OgoJCXBhbmljKCJpbnZhbGlkIGNyZWF0aW9uIG1vZGUiKQoJfQp9CgpmdW5jIGFzc2VydEV4YWN0VWdub3RQYXltZW50KGV4cGVjdGVkIGludDY0KSB7Cgljb2lucyA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiBleHBlY3RlZCA9PSAwIHsKCQlpZiBsZW4oY29pbnMpICE9IDAgewoJCQlwYW5pYygiZXhhY3QgcGF5bWVudCByZXF1aXJlZDogZXhwZWN0ZWQgbm8gY29pbnMsIGdvdCAiICsgY29pbnMuU3RyaW5nKCkpCgkJfQoJCXJldHVybgoJfQoJaWYgbGVuKGNvaW5zKSAhPSAxIHx8IGNvaW5zWzBdLkRlbm9tICE9ICJ1Z25vdCIgfHwgY29pbnNbMF0uQW1vdW50ICE9IGV4cGVjdGVkIHsKCQlwYW5pYygiZXhhY3QgcGF5bWVudCByZXF1aXJlZDogZXhwZWN0ZWQgIiArIHN0cmNvbnYuRm9ybWF0SW50KGV4cGVjdGVkLCAxMCkgKyAidWdub3QsIGdvdCAiICsgY29pbnMuU3RyaW5nKCkpCgl9Cn0KCmZ1bmMgZW1pdENyZWF0ZUdhbWVXb3JsZChvd25lciBhZGRyZXNzLCBpZCB1aW50NjQsIGdhbWVUeXBlIHN0cmluZywgY3JlYXRpb25Db3N0IGludDY0KSB7CgljaGFpbi5FbWl0KAoJCUNyZWF0ZUdhbWVXb3JsZEV2ZW50LAoJCSJleGVjdXRvciIsIG93bmVyLlN0cmluZygpLAoJCSJpZCIsIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApLAoJCSJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJnYW1lVHlwZSIsIGdhbWVUeXBlLAoJCSJjcmVhdGlvbkNvc3QiLCBzdHJjb252LkZvcm1hdEludChjcmVhdGlvbkNvc3QsIDEwKSwKCQkiY3JlYXRlZEhlaWdodCIsIHN0cmNvbnYuRm9ybWF0SW50KHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgMTApLAoJKQp9ChqmJQoTZ2FtZV93b3JsZF90ZXN0LmdubxKOJXBhY2thZ2UgZ2FtZV93b3JsZAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdENyZWF0ZUdhbWVXb3JsZFVzZXNDYWxsZXJBc093bmVyQW5kQ2hhcmdlc0V4YWN0Q29zdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMjUsIENyZWF0aW9uTW9kZVB1YmxpY0NyZWF0b3IpCgljb2xsZWN0b3JCZWZvcmUgOj0gdWdub3RCYWxhbmNlRm9yVGVzdCh0ZXN0RmVlQ29sbGVjdG9yKQoKCWlkIDo9IGNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdENyZWF0b3IsIHRlc3RHYW1lVHlwZUp1bXAsIGNoYWluLkNvaW5ze3sidWdub3QiLCAyNX19KQoKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDEpLCBpZCkKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDEpLCBHZXRMYXRlc3RHYW1lV29ybGRJRCgpKQoJd29ybGQgOj0gR2V0R2FtZVdvcmxkKGlkKQoJdWFzc2VydC5FcXVhbCh0LCB0ZXN0Q3JlYXRvci5TdHJpbmcoKSwgd29ybGQuT3duZXIuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIHRlc3RHYW1lVHlwZUp1bXAsIHdvcmxkLkdhbWVUeXBlKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyNSksIHVnbm90QmFsYW5jZUZvclRlc3QodGVzdEZlZUNvbGxlY3RvciktY29sbGVjdG9yQmVmb3JlKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgdWdub3RCYWxhbmNlRm9yVGVzdCh0ZXN0UGtnQWRkcikpCn0KCmZ1bmMgVGVzdENyZWF0ZUdhbWVXb3JsZERvZXNOb3RSZXF1aXJlUGVyc29uYWxXb3JsZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlUHVibGljQ3JlYXRvcikKCgl1YXNzZXJ0LlRydWUodCwgSGFzR2FtZVdvcmxkKGNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdE5vUGVyc29uYWwsIHRlc3RHYW1lVHlwZUp1bXAsIGNoYWluLkNvaW5ze30pKSkKfQoKZnVuYyBUZXN0T3BlcmF0b3JPbmx5Q3JlYXRpb25BbGxvd3NPcGVyYXRvcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlT3BlcmF0b3JPbmx5KQoKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNHYW1lV29ybGQoY3JlYXRlR2FtZVdvcmxkRm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0T3BlcmF0b3IsIHRlc3RHYW1lVHlwZUp1bXAsIGNoYWluLkNvaW5ze30pKSkKfQoKZnVuYyBUZXN0QXBwcm92ZWRDcmVhdG9yRmxvd0FuZFJldm9jYXRpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZVJhY2UsIDAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNyZWF0b3IgaXMgbm90IGFwcHJvdmVkIGZvciBnYW1lIHR5cGUiLCBmdW5jKCkgewoJCWNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdENyZWF0b3IsIHRlc3RHYW1lVHlwZVJhY2UsIGNoYWluLkNvaW5ze30pCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RPcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKSkKCUFkZEFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVSYWNlLCB0ZXN0Q3JlYXRvcikKCWlkIDo9IGNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdENyZWF0b3IsIHRlc3RHYW1lVHlwZVJhY2UsIGNoYWluLkNvaW5ze30pCgl1YXNzZXJ0LlRydWUodCwgSGFzR2FtZVdvcmxkKGlkKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCglSZW1vdmVBcHByb3ZlZENyZWF0b3IoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlUmFjZSwgdGVzdENyZWF0b3IpCgl1YXNzZXJ0LlRydWUodCwgSGFzR2FtZVdvcmxkKGlkKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY3JlYXRvciBpcyBub3QgYXBwcm92ZWQgZm9yIGdhbWUgdHlwZSIsIGZ1bmMoKSB7CgkJY3JlYXRlR2FtZVdvcmxkRm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0Q3JlYXRvciwgdGVzdEdhbWVUeXBlUmFjZSwgY2hhaW4uQ29pbnN7fSkKCX0pCn0KCmZ1bmMgVGVzdENyZWF0ZUdhbWVXb3JsZFJlamVjdHNJbmV4YWN0UGF5bWVudChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlRHJvcCwgMjUsIENyZWF0aW9uTW9kZVB1YmxpY0NyZWF0b3IpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJleGFjdCBwYXltZW50IHJlcXVpcmVkOiBleHBlY3RlZCAyNXVnbm90LCBnb3QgMjR1Z25vdCIsIGZ1bmMoKSB7CgkJY3JlYXRlR2FtZVdvcmxkRm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0Q3JlYXRvciwgdGVzdEdhbWVUeXBlRHJvcCwgY2hhaW4uQ29pbnN7eyJ1Z25vdCIsIDI0fX0pCgl9KQoJdWFzc2VydC5FcXVhbCh0LCB1aW50NjQoMCksIEdldExhdGVzdEdhbWVXb3JsZElEKCkpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJleGFjdCBwYXltZW50IHJlcXVpcmVkOiBleHBlY3RlZCAyNXVnbm90LCBnb3QgMjV1Z25vdCwxZm9vIiwgZnVuYygpIHsKCQljcmVhdGVHYW1lV29ybGRGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RDcmVhdG9yLCB0ZXN0R2FtZVR5cGVEcm9wLCBjaGFpbi5Db2luc3t7InVnbm90IiwgMjV9LCB7ImZvbyIsIDF9fSkKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQ2NCgwKSwgR2V0TGF0ZXN0R2FtZVdvcmxkSUQoKSkKfQoKZnVuYyBUZXN0QXBwcm92ZWRDcmVhdG9yTW9kZURvZXNOb3RJbXBsaWNpdGx5QXBwcm92ZU9wZXJhdG9yKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJc2V0UG9saWN5Rm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVSYWNlLCAwLCBDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3IpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjcmVhdG9yIGlzIG5vdCBhcHByb3ZlZCBmb3IgZ2FtZSB0eXBlIiwgZnVuYygpIHsKCQljcmVhdGVHYW1lV29ybGRGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RPcGVyYXRvciwgdGVzdEdhbWVUeXBlUmFjZSwgY2hhaW4uQ29pbnN7fSkKCX0pCn0KCmZ1bmMgVGVzdENyZWF0ZUdhbWVXb3JsZFJlamVjdHNJRE92ZXJmbG93KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJc2V0UG9saWN5Rm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCAwLCBDcmVhdGlvbk1vZGVQdWJsaWNDcmVhdG9yKQoJbGF0ZXN0R2FtZVdvcmxkSUQgPSB1aW50NjQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJnYW1lIHdvcmxkIGlkIGV4aGF1c3RlZCIsIGZ1bmMoKSB7CgkJY3JlYXRlR2FtZVdvcmxkRm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0Q3JlYXRvciwgdGVzdEdhbWVUeXBlSnVtcCwgY2hhaW4uQ29pbnN7fSkKCX0pCn0KCmZ1bmMgVGVzdExpc3RMYXRlc3RHYW1lV29ybGRzQnlPd25lcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlUHVibGljQ3JlYXRvcikKCWZpcnN0SUQgOj0gY3JlYXRlR2FtZVdvcmxkRm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0Q3JlYXRvciwgdGVzdEdhbWVUeXBlSnVtcCwgY2hhaW4uQ29pbnN7fSkKCWNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdE90aGVyQ3JlYXRvciwgdGVzdEdhbWVUeXBlSnVtcCwgY2hhaW4uQ29pbnN7fSkKCWZvciBpIDo9IDE7IGkgPD0gZ2FtZVdvcmxkTGlzdExpbWl0OyBpKysgewoJCWNyZWF0ZUdhbWVXb3JsZEZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdENyZWF0b3IsIHRlc3RHYW1lVHlwZUp1bXAsIGNoYWluLkNvaW5ze30pCgl9CgoJd29ybGRzIDo9IExpc3RMYXRlc3RHYW1lV29ybGRzQnlPd25lcih0ZXN0Q3JlYXRvcikKCXVhc3NlcnQuRXF1YWwodCwgZ2FtZVdvcmxkTGlzdExpbWl0LCBsZW4od29ybGRzKSkKCXVhc3NlcnQuRXF1YWwodCwgZmlyc3RJRCsyLCB3b3JsZHNbMF0uSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIGZpcnN0SUQrdWludDY0KGdhbWVXb3JsZExpc3RMaW1pdCsxKSwgd29ybGRzW2xlbih3b3JsZHMpLTFdLklEKQoJdWFzc2VydC5FcXVhbCh0LCB0ZXN0R2FtZVR5cGVKdW1wLCB3b3JsZHNbMF0uR2FtZVR5cGUpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGxlbihMaXN0TGF0ZXN0R2FtZVdvcmxkc0J5T3duZXIoYWRkcmVzcygiZzFtaXNzaW5nIikpKSkKfQoaSQoLZ25vbW9kLnRvbWwSOm1vZHVsZSA9ICJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9nYW1lX3dvcmxkIgpnbm8gPSAiMC45Igoa0zIKCnBvbGljeS5nbm8SxDJwYWNrYWdlIGdhbWVfd29ybGQKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCSJnbm8ubGFuZC9yL2Fra2FkaWEvYmV0YS9hZG1pbiIKKQoKY29uc3QgKAoJU2V0R2FtZVR5cGVQb2xpY3lFdmVudCAgICAgPSAiU2V0R2FtZVR5cGVQb2xpY3kiCglBZGRBcHByb3ZlZENyZWF0b3JFdmVudCAgICA9ICJBZGRBcHByb3ZlZENyZWF0b3IiCglSZW1vdmVBcHByb3ZlZENyZWF0b3JFdmVudCA9ICJSZW1vdmVBcHByb3ZlZENyZWF0b3IiCglTZXRBcHByb3ZlZENyZWF0b3JzRXZlbnQgICA9ICJTZXRBcHByb3ZlZENyZWF0b3JzIgoJYXBwcm92ZWRDcmVhdG9yTGlzdE1heCAgICAgPSAxMDAKCWFwcHJvdmVkQ3JlYXRvckJhdGNoTWF4ICAgID0gMTAwCglnYW1lVHlwZU1heExlbiAgICAgICAgICAgICA9IDY0CikKCnZhciAoCglnYW1lVHlwZVBvbGljaWVzICpicHRyZWUuQlBUcmVlCglhcHByb3ZlZENyZWF0b3JzICpicHRyZWUuQlBUcmVlCikKCmZ1bmMgaW5pdCgpIHsKCWluaXRpYWxpemVQb2xpY3lTdGF0ZSgpCn0KCmZ1bmMgU2V0R2FtZVR5cGVQb2xpY3koY3VyIHJlYWxtLCBnYW1lVHlwZSBzdHJpbmcsIGNyZWF0aW9uQ29zdCBpbnQ2NCwgbW9kZSBDcmVhdGlvbk1vZGUpIHsKCWV4ZWN1dG9yIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldEFkbWluT3JPcGVyYXRvckNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4sIGFkbWluLklzT3BlcmF0b3IpCglhc3NlcnRWYWxpZEdhbWVUeXBlKGdhbWVUeXBlKQoJaWYgY3JlYXRpb25Db3N0IDwgMCB7CgkJcGFuaWMoImNyZWF0aW9uIGNvc3QgbXVzdCBub3QgYmUgbmVnYXRpdmUiKQoJfQoJYXNzZXJ0VmFsaWRDcmVhdGlvbk1vZGUobW9kZSkKCglvbGRWYWx1ZSA6PSBnYW1lVHlwZVBvbGljaWVzLkdldChnYW1lVHlwZSkKCW9sZCA6PSBHYW1lVHlwZVBvbGljeXt9Cglmb3VuZCA6PSBvbGRWYWx1ZSAhPSBuaWwKCWlmIGZvdW5kIHsKCQlvbGQgPSBvbGRWYWx1ZS4oR2FtZVR5cGVQb2xpY3kpCgl9CglpZiBmb3VuZCAmJiBvbGQuQ3JlYXRpb25Db3N0ID09IGNyZWF0aW9uQ29zdCAmJiBvbGQuQ3JlYXRpb25Nb2RlID09IG1vZGUgewoJCXJldHVybgoJfQoJZ2FtZVR5cGVQb2xpY2llcy5TZXQoZ2FtZVR5cGUsIEdhbWVUeXBlUG9saWN5e0NyZWF0aW9uQ29zdDogY3JlYXRpb25Db3N0LCBDcmVhdGlvbk1vZGU6IG1vZGV9KQoJY2hhaW4uRW1pdCgKCQlTZXRHYW1lVHlwZVBvbGljeUV2ZW50LAoJCSJleGVjdXRvciIsIGV4ZWN1dG9yLlN0cmluZygpLAoJCSJnYW1lVHlwZSIsIGdhbWVUeXBlLAoJCSJvbGRDcmVhdGlvbkNvc3QiLCBzdHJjb252LkZvcm1hdEludChvbGQuQ3JlYXRpb25Db3N0LCAxMCksCgkJIm5ld0NyZWF0aW9uQ29zdCIsIHN0cmNvbnYuRm9ybWF0SW50KGNyZWF0aW9uQ29zdCwgMTApLAoJCSJvbGRDcmVhdGlvbk1vZGUiLCBzdHJjb252Lkl0b2EoaW50KG9sZC5DcmVhdGlvbk1vZGUpKSwKCQkibmV3Q3JlYXRpb25Nb2RlIiwgc3RyY29udi5JdG9hKGludChtb2RlKSksCgkpCn0KCmZ1bmMgQWRkQXBwcm92ZWRDcmVhdG9yKGN1ciByZWFsbSwgZ2FtZVR5cGUgc3RyaW5nLCBjcmVhdG9yIGFkZHJlc3MpIHsKCWV4ZWN1dG9yIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldEFkbWluT3JPcGVyYXRvckNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4sIGFkbWluLklzT3BlcmF0b3IpCgltdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUpCglhc3NlcnRWYWxpZENyZWF0b3IoY3JlYXRvcikKCWlmICFzZXRBcHByb3ZlZENyZWF0b3IoZ2FtZVR5cGUsIGNyZWF0b3IsIHRydWUpIHsKCQlyZXR1cm4KCX0KCWNoYWluLkVtaXQoCgkJQWRkQXBwcm92ZWRDcmVhdG9yRXZlbnQsCgkJImV4ZWN1dG9yIiwgZXhlY3V0b3IuU3RyaW5nKCksCgkJImdhbWVUeXBlIiwgZ2FtZVR5cGUsCgkJImNyZWF0b3IiLCBjcmVhdG9yLlN0cmluZygpLAoJKQp9CgpmdW5jIFJlbW92ZUFwcHJvdmVkQ3JlYXRvcihjdXIgcmVhbG0sIGdhbWVUeXBlIHN0cmluZywgY3JlYXRvciBhZGRyZXNzKSB7CglleGVjdXRvciA6PSBhY2Nlc3Njb250cm9sLk11c3RHZXRBZG1pbk9yT3BlcmF0b3JDYWxsZXIoMCwgY3VyLCBhZG1pbi5Jc0FkbWluLCBhZG1pbi5Jc09wZXJhdG9yKQoJbXVzdEdldEdhbWVUeXBlUG9saWN5KGdhbWVUeXBlKQoJYXNzZXJ0VmFsaWRDcmVhdG9yKGNyZWF0b3IpCglpZiAhc2V0QXBwcm92ZWRDcmVhdG9yKGdhbWVUeXBlLCBjcmVhdG9yLCBmYWxzZSkgewoJCXJldHVybgoJfQoJY2hhaW4uRW1pdCgKCQlSZW1vdmVBcHByb3ZlZENyZWF0b3JFdmVudCwKCQkiZXhlY3V0b3IiLCBleGVjdXRvci5TdHJpbmcoKSwKCQkiZ2FtZVR5cGUiLCBnYW1lVHlwZSwKCQkiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksCgkpCn0KCmZ1bmMgU2V0QXBwcm92ZWRDcmVhdG9ycyhjdXIgcmVhbG0sIGdhbWVUeXBlLCBjcmVhdG9yc0NTViBzdHJpbmcsIGFwcHJvdmVkIGJvb2wpIHsKCWV4ZWN1dG9yIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldEFkbWluT3JPcGVyYXRvckNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4sIGFkbWluLklzT3BlcmF0b3IpCgltdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUpCglpZiBjcmVhdG9yc0NTViA9PSAiIiB7CgkJcGFuaWMoImNyZWF0b3IgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eSIpCgl9CgoJcmVxdWVzdGVkQ291bnQgOj0gMAoJY2hhbmdlZENvdW50IDo9IDAKCXN0YXJ0IDo9IDAKCWZvciB7CgkJZW5kIDo9IHN0YXJ0CgkJZm9yIGVuZCA8IGxlbihjcmVhdG9yc0NTVikgJiYgY3JlYXRvcnNDU1ZbZW5kXSAhPSAnLCcgewoJCQllbmQrKwoJCX0KCQlyZXF1ZXN0ZWRDb3VudCsrCgkJaWYgcmVxdWVzdGVkQ291bnQgPiBhcHByb3ZlZENyZWF0b3JCYXRjaE1heCB7CgkJCXBhbmljKCJjcmVhdG9yIGxpc3QgZXhjZWVkcyBsaW1pdCIpCgkJfQoJCWNyZWF0b3IgOj0gYWRkcmVzcyhjcmVhdG9yc0NTVltzdGFydDplbmRdKQoJCWFzc2VydFZhbGlkQ3JlYXRvcihjcmVhdG9yKQoJCWlmIHNldEFwcHJvdmVkQ3JlYXRvcihnYW1lVHlwZSwgY3JlYXRvciwgYXBwcm92ZWQpIHsKCQkJY2hhbmdlZENvdW50KysKCQl9CgkJaWYgZW5kID09IGxlbihjcmVhdG9yc0NTVikgewoJCQlicmVhawoJCX0KCQlzdGFydCA9IGVuZCArIDEKCX0KCWlmIGNoYW5nZWRDb3VudCA9PSAwIHsKCQlyZXR1cm4KCX0KCWNoYWluLkVtaXQoCgkJU2V0QXBwcm92ZWRDcmVhdG9yc0V2ZW50LAoJCSJleGVjdXRvciIsIGV4ZWN1dG9yLlN0cmluZygpLAoJCSJnYW1lVHlwZSIsIGdhbWVUeXBlLAoJCSJjcmVhdG9yc0NTViIsIGNyZWF0b3JzQ1NWLAoJCSJhcHByb3ZlZCIsIHN0cmNvbnYuRm9ybWF0Qm9vbChhcHByb3ZlZCksCgkJInJlcXVlc3RlZENvdW50Iiwgc3RyY29udi5JdG9hKHJlcXVlc3RlZENvdW50KSwKCQkiY2hhbmdlZENvdW50Iiwgc3RyY29udi5JdG9hKGNoYW5nZWRDb3VudCksCgkpCn0KCmZ1bmMgc2V0QXBwcm92ZWRDcmVhdG9yKGdhbWVUeXBlIHN0cmluZywgY3JlYXRvciBhZGRyZXNzLCBhcHByb3ZlZCBib29sKSBib29sIHsKCXNldCwgZm91bmQgOj0gZ2V0QXBwcm92ZWRDcmVhdG9ycyhnYW1lVHlwZSkKCW9sZCA6PSBmb3VuZCAmJiBzZXQuSGFzKGNyZWF0b3IuU3RyaW5nKCkpCglpZiBvbGQgPT0gYXBwcm92ZWQgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgYXBwcm92ZWQgewoJCWlmICFmb3VuZCB7CgkJCXNldCA9IGNyZWF0ZUFwcHJvdmVkQ3JlYXRvcnMoZ2FtZVR5cGUpCgkJfQoJCXNldC5TZXQoY3JlYXRvci5TdHJpbmcoKSwgdHJ1ZSkKCX0gZWxzZSB7CgkJc2V0LlJlbW92ZShjcmVhdG9yLlN0cmluZygpKQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyBJc0FwcHJvdmVkQ3JlYXRvcihnYW1lVHlwZSBzdHJpbmcsIGNyZWF0b3IgYWRkcmVzcykgYm9vbCB7CgltdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUpCglhc3NlcnRWYWxpZENyZWF0b3IoY3JlYXRvcikKCXJldHVybiBpc0FwcHJvdmVkQ3JlYXRvcihnYW1lVHlwZSwgY3JlYXRvcikKfQoKZnVuYyBHZXRBcHByb3ZlZENyZWF0b3JDb3VudChnYW1lVHlwZSBzdHJpbmcpIGludCB7CgltdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUpCglzZXQsIGZvdW5kIDo9IGdldEFwcHJvdmVkQ3JlYXRvcnMoZ2FtZVR5cGUpCglpZiAhZm91bmQgewoJCXJldHVybiAwCgl9CglyZXR1cm4gc2V0LlNpemUoKQp9CgpmdW5jIExpc3RBcHByb3ZlZENyZWF0b3JzKGdhbWVUeXBlIHN0cmluZywgb2Zmc2V0LCBjb3VudCBpbnQpIFtdYWRkcmVzcyB7CgltdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUpCglpZiBvZmZzZXQgPCAwIHsKCQlwYW5pYygib2Zmc2V0IG11c3Qgbm90IGJlIG5lZ2F0aXZlIikKCX0KCWlmIGNvdW50IDwgMSB8fCBjb3VudCA+IGFwcHJvdmVkQ3JlYXRvckxpc3RNYXggewoJCXBhbmljKCJjb3VudCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwIikKCX0KCXJlc3VsdCA6PSBbXWFkZHJlc3N7fQoJc2V0LCBmb3VuZCA6PSBnZXRBcHByb3ZlZENyZWF0b3JzKGdhbWVUeXBlKQoJaWYgIWZvdW5kIHsKCQlyZXR1cm4gcmVzdWx0Cgl9CglzZXQuSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmModmFsdWUgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgYWRkcmVzcyh2YWx1ZSkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIHJlc3VsdAp9CgpmdW5jIEhhc0dhbWVUeXBlUG9saWN5KGdhbWVUeXBlIHN0cmluZykgYm9vbCB7Cglhc3NlcnRWYWxpZEdhbWVUeXBlKGdhbWVUeXBlKQoJcmV0dXJuIGdhbWVUeXBlUG9saWNpZXMuSGFzKGdhbWVUeXBlKQp9CgpmdW5jIEdldEdhbWVUeXBlUG9saWN5KGdhbWVUeXBlIHN0cmluZykgR2FtZVR5cGVQb2xpY3kgewoJcmV0dXJuIG11c3RHZXRHYW1lVHlwZVBvbGljeShnYW1lVHlwZSkKfQoKZnVuYyBpbml0aWFsaXplUG9saWN5U3RhdGUoKSB7CglnYW1lVHlwZVBvbGljaWVzID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCWFwcHJvdmVkQ3JlYXRvcnMgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQp9CgpmdW5jIGFzc2VydFZhbGlkR2FtZVR5cGUoZ2FtZVR5cGUgc3RyaW5nKSB7CglpZiBsZW4oZ2FtZVR5cGUpIDwgMSB8fCBsZW4oZ2FtZVR5cGUpID4gZ2FtZVR5cGVNYXhMZW4gewoJCXBhbmljKCJnYW1lIHR5cGUga2V5IGxlbmd0aCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjQiKQoJfQoJZm9yIF8sIGNoIDo9IHJhbmdlIGdhbWVUeXBlIHsKCQlpZiAoY2ggPCAnYScgfHwgY2ggPiAneicpICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgJiYgY2ggIT0gJ18nICYmIGNoICE9ICctJyB7CgkJCXBhbmljKCJpbnZhbGlkIGdhbWUgdHlwZSBrZXkiKQoJCX0KCX0KfQoKZnVuYyBtdXN0R2V0R2FtZVR5cGVQb2xpY3koZ2FtZVR5cGUgc3RyaW5nKSBHYW1lVHlwZVBvbGljeSB7Cglhc3NlcnRWYWxpZEdhbWVUeXBlKGdhbWVUeXBlKQoJdmFsdWUgOj0gZ2FtZVR5cGVQb2xpY2llcy5HZXQoZ2FtZVR5cGUpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXBhbmljKCJnYW1lIHR5cGUgcG9saWN5IG5vdCBmb3VuZDogIiArIGdhbWVUeXBlKQoJfQoJcmV0dXJuIHZhbHVlLihHYW1lVHlwZVBvbGljeSkKfQoKZnVuYyBnZXRBcHByb3ZlZENyZWF0b3JzKGdhbWVUeXBlIHN0cmluZykgKCpicHRyZWUuQlBUcmVlLCBib29sKSB7Cgl2YWx1ZSA6PSBhcHByb3ZlZENyZWF0b3JzLkdldChnYW1lVHlwZSkKCWlmIHZhbHVlID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiB2YWx1ZS4oKmJwdHJlZS5CUFRyZWUpLCB0cnVlCn0KCmZ1bmMgY3JlYXRlQXBwcm92ZWRDcmVhdG9ycyhnYW1lVHlwZSBzdHJpbmcpICpicHRyZWUuQlBUcmVlIHsKCXNldCA6PSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJYXBwcm92ZWRDcmVhdG9ycy5TZXQoZ2FtZVR5cGUsIHNldCkKCXJldHVybiBzZXQKfQoKZnVuYyBpc0FwcHJvdmVkQ3JlYXRvcihnYW1lVHlwZSBzdHJpbmcsIGNyZWF0b3IgYWRkcmVzcykgYm9vbCB7CglzZXQsIGZvdW5kIDo9IGdldEFwcHJvdmVkQ3JlYXRvcnMoZ2FtZVR5cGUpCglyZXR1cm4gZm91bmQgJiYgc2V0LkhhcyhjcmVhdG9yLlN0cmluZygpKQp9CgpmdW5jIGFzc2VydFZhbGlkQ3JlYXRpb25Nb2RlKG1vZGUgQ3JlYXRpb25Nb2RlKSB7CglpZiBtb2RlIDwgQ3JlYXRpb25Nb2RlT3BlcmF0b3JPbmx5IHx8IG1vZGUgPiBDcmVhdGlvbk1vZGVQdWJsaWNDcmVhdG9yIHsKCQlwYW5pYygiaW52YWxpZCBjcmVhdGlvbiBtb2RlIikKCX0KfQoKZnVuYyBhc3NlcnRWYWxpZENyZWF0b3IoY3JlYXRvciBhZGRyZXNzKSB7CglpZiAhY3JlYXRvci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGNyZWF0b3IgYWRkcmVzcyIpCgl9Cn0KCmZ1bmMgcmVzZXRHYW1lV29ybGRTdGF0ZSgpIHsKCWluaXRpYWxpemVQb2xpY3lTdGF0ZSgpCglyZXNldEdhbWVXb3JsZFN0b3JlKCkKfQoa8D4KD3BvbGljeV90ZXN0LmdubxLcPnBhY2thZ2UgZ2FtZV93b3JsZAoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdEdhbWVUeXBlUG9saWNpZXNTdGFydEVtcHR5QW5kQWRtaW5SZWdpc3RlcnNPcGFxdWVLZXkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhc0dhbWVUeXBlUG9saWN5KHRlc3RHYW1lVHlwZUR1bmdlb24pKQoJdWFzc2VydC5GYWxzZSh0LCBIYXNHYW1lVHlwZVBvbGljeSh0ZXN0R2FtZVR5cGVKdW1wKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCglTZXRHYW1lVHlwZVBvbGljeShjcm9zcyhjdXIpLCAiY3VzdG9tX3R5cGVfYWxwaGEiLCAxNywgQ3JlYXRpb25Nb2RlQXBwcm92ZWRDcmVhdG9yKQoKCXVhc3NlcnQuVHJ1ZSh0LCBIYXNHYW1lVHlwZVBvbGljeSgiY3VzdG9tX3R5cGVfYWxwaGEiKSkKCXBvbGljeSA6PSBHZXRHYW1lVHlwZVBvbGljeSgiY3VzdG9tX3R5cGVfYWxwaGEiKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxNyksIHBvbGljeS5DcmVhdGlvbkNvc3QpCgl1YXNzZXJ0LkVxdWFsKHQsIGludChDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3IpLCBpbnQocG9saWN5LkNyZWF0aW9uTW9kZSkpCn0KCmZ1bmMgVGVzdEFwcHJvdmVkQ3JlYXRvcklzTWFuYWdlZFBlck9wYXF1ZUtleShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlQXBwcm92ZWRDcmVhdG9yKQoJc2V0UG9saWN5Rm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVSYWNlLCAwLCBDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3IpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCgoJQWRkQXBwcm92ZWRDcmVhdG9yKGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yKQoJdWFzc2VydC5UcnVlKHQsIElzQXBwcm92ZWRDcmVhdG9yKHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yKSkKCXVhc3NlcnQuRmFsc2UodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlUmFjZSwgdGVzdENyZWF0b3IpKQoKCVJlbW92ZUFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCB0ZXN0Q3JlYXRvcikKCXVhc3NlcnQuRmFsc2UodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlSnVtcCwgdGVzdENyZWF0b3IpKQp9CgpmdW5jIFRlc3RBZGRBbmRSZW1vdmVBcHByb3ZlZENyZWF0b3IoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIDAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RPcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKSkKCglBZGRBcHByb3ZlZENyZWF0b3IoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgdGVzdENyZWF0b3IpCgl1YXNzZXJ0LlRydWUodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlSnVtcCwgdGVzdENyZWF0b3IpKQoKCVJlbW92ZUFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCB0ZXN0Q3JlYXRvcikKCXVhc3NlcnQuRmFsc2UodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlSnVtcCwgdGVzdENyZWF0b3IpKQp9CgpmdW5jIFRlc3RTZXRBcHByb3ZlZENyZWF0b3JzQnVsayhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlQXBwcm92ZWRDcmVhdG9yKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdE9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0T3BlcmF0b3IpKQoJY3JlYXRvcnNDU1YgOj0gdGVzdENyZWF0b3IuU3RyaW5nKCkgKyAiLCIgKyB0ZXN0T3RoZXJDcmVhdG9yLlN0cmluZygpCgoJU2V0QXBwcm92ZWRDcmVhdG9ycyhjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCBjcmVhdG9yc0NTViwgdHJ1ZSkKCXVhc3NlcnQuVHJ1ZSh0LCBJc0FwcHJvdmVkQ3JlYXRvcih0ZXN0R2FtZVR5cGVKdW1wLCB0ZXN0Q3JlYXRvcikpCgl1YXNzZXJ0LlRydWUodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlSnVtcCwgdGVzdE90aGVyQ3JlYXRvcikpCgoJU2V0QXBwcm92ZWRDcmVhdG9ycyhjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCBjcmVhdG9yc0NTViwgZmFsc2UpCgl1YXNzZXJ0LkZhbHNlKHQsIElzQXBwcm92ZWRDcmVhdG9yKHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yKSkKCXVhc3NlcnQuRmFsc2UodCwgSXNBcHByb3ZlZENyZWF0b3IodGVzdEdhbWVUeXBlSnVtcCwgdGVzdE90aGVyQ3JlYXRvcikpCn0KCmZ1bmMgVGVzdFNldEFwcHJvdmVkQ3JlYXRvcnNSZWplY3RzSW52YWxpZEFuZEVtcHR5Q1NWKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJc2V0UG9saWN5Rm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCAwLCBDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3IpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGNyZWF0b3IgYWRkcmVzcyIsIGZ1bmMoKSB7CgkJU2V0QXBwcm92ZWRDcmVhdG9ycyhjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCB0ZXN0Q3JlYXRvci5TdHJpbmcoKSsiLGludmFsaWQiLCB0cnVlKQoJfSkKCglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJc2V0UG9saWN5Rm9yVGVzdChjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCAwLCBDcmVhdGlvbk1vZGVBcHByb3ZlZENyZWF0b3IpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNyZWF0b3IgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eSIsIGZ1bmMoKSB7CgkJU2V0QXBwcm92ZWRDcmVhdG9ycyhjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCAiIiwgdHJ1ZSkKCX0pCn0KCmZ1bmMgVGVzdFNldEFwcHJvdmVkQ3JlYXRvcnNBbGxvd3NEdXBsaWNhdGVBZGRyZXNzZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIDAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RPcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKSkKCWNyZWF0b3JzQ1NWIDo9IHRlc3RDcmVhdG9yLlN0cmluZygpICsgIiwiICsgdGVzdENyZWF0b3IuU3RyaW5nKCkKCglTZXRBcHByb3ZlZENyZWF0b3JzKGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIGNyZWF0b3JzQ1NWLCB0cnVlKQoJdWFzc2VydC5UcnVlKHQsIElzQXBwcm92ZWRDcmVhdG9yKHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0QXBwcm92ZWRDcmVhdG9yQ291bnQodGVzdEdhbWVUeXBlSnVtcCkpCgoJU2V0QXBwcm92ZWRDcmVhdG9ycyhjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVKdW1wLCBjcmVhdG9yc0NTViwgZmFsc2UpCgl1YXNzZXJ0LkZhbHNlKHQsIElzQXBwcm92ZWRDcmVhdG9yKHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yKSkKfQoKZnVuYyBUZXN0U2V0QXBwcm92ZWRDcmVhdG9yc1JlamVjdHNFbXB0eUVudHJ5QW5kT3ZlcnNpemVkQmF0Y2goY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIDAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RPcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgY3JlYXRvciBhZGRyZXNzIiwgZnVuYygpIHsKCQlTZXRBcHByb3ZlZENyZWF0b3JzKGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIHRlc3RDcmVhdG9yLlN0cmluZygpKyIsIiwgdHJ1ZSkKCX0pCgoJc2V0dXBHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdCkKCXNldFBvbGljeUZvclRlc3QoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMCwgQ3JlYXRpb25Nb2RlQXBwcm92ZWRDcmVhdG9yKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdE9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0T3BlcmF0b3IpKQoJY3JlYXRvcnNDU1YgOj0gdGVzdENyZWF0b3IuU3RyaW5nKCkKCWZvciBpIDo9IDE7IGkgPCAxMDE7IGkrKyB7CgkJY3JlYXRvcnNDU1YgKz0gIiwiICsgdGVzdENyZWF0b3IuU3RyaW5nKCkKCX0KCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY3JlYXRvciBsaXN0IGV4Y2VlZHMgbGltaXQiLCBmdW5jKCkgewoJCVNldEFwcHJvdmVkQ3JlYXRvcnMoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgY3JlYXRvcnNDU1YsIHRydWUpCgl9KQp9CgpmdW5jIFRlc3RMaXN0QXBwcm92ZWRDcmVhdG9yc1N1cHBvcnRzTWFuYWdlbWVudFByb2plY3Rpb24oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZURyb3AsIDAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKHRlc3RPcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdE9wZXJhdG9yKSkKCUFkZEFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVEcm9wLCB0ZXN0Q3JlYXRvcikKCUFkZEFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCB0ZXN0R2FtZVR5cGVEcm9wLCB0ZXN0T3RoZXJDcmVhdG9yKQoKCXVhc3NlcnQuRXF1YWwodCwgMiwgR2V0QXBwcm92ZWRDcmVhdG9yQ291bnQodGVzdEdhbWVUeXBlRHJvcCkpCglsaXN0ZWQgOj0gTGlzdEFwcHJvdmVkQ3JlYXRvcnModGVzdEdhbWVUeXBlRHJvcCwgMCwgMTAwKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBsZW4obGlzdGVkKSkKCXVhc3NlcnQuVHJ1ZSh0LCBjb250YWluc0FwcHJvdmVkQ3JlYXRvcihsaXN0ZWQsIHRlc3RDcmVhdG9yKSkKCXVhc3NlcnQuVHJ1ZSh0LCBjb250YWluc0FwcHJvdmVkQ3JlYXRvcihsaXN0ZWQsIHRlc3RPdGhlckNyZWF0b3IpKQp9CgpmdW5jIGNvbnRhaW5zQXBwcm92ZWRDcmVhdG9yKGNyZWF0b3JzIFtdYWRkcmVzcywgdGFyZ2V0IGFkZHJlc3MpIGJvb2wgewoJZm9yIF8sIGNyZWF0b3IgOj0gcmFuZ2UgY3JlYXRvcnMgewoJCWlmIGNyZWF0b3IgPT0gdGFyZ2V0IHsKCQkJcmV0dXJuIHRydWUKCQl9Cgl9CglyZXR1cm4gZmFsc2UKfQoKZnVuYyBUZXN0U2V0R2FtZVR5cGVQb2xpY3lSZWplY3RzVW5hdXRob3JpemVkQ2FsbGVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdENyZWF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RDcmVhdG9yKSkKCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2V0R2FtZVR5cGVQb2xpY3koY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgMTAsIENyZWF0aW9uTW9kZUFwcHJvdmVkQ3JlYXRvcikKCX0pCn0KCmZ1bmMgVGVzdFNldEdhbWVUeXBlUG9saWN5VmFsaWRhdGVzT3BhcXVlS2V5QW5kUG9saWN5KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEdhbWVXb3JsZChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdE9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0T3BlcmF0b3IpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZ2FtZSB0eXBlIGtleSBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDY0IiwgZnVuYygpIHsKCQlTZXRHYW1lVHlwZVBvbGljeShjcm9zcyhjdXIpLCAiIiwgMCwgQ3JlYXRpb25Nb2RlT3BlcmF0b3JPbmx5KQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZ2FtZSB0eXBlIGtleSBsZW5ndGggbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDY0IiwgZnVuYygpIHsKCQlTZXRHYW1lVHlwZVBvbGljeShjcm9zcyhjdXIpLCAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCAwLCBDcmVhdGlvbk1vZGVPcGVyYXRvck9ubHkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGdhbWUgdHlwZSBrZXkiLCBmdW5jKCkgewoJCVNldEdhbWVUeXBlUG9saWN5KGNyb3NzKGN1ciksICJKdW1wIE1hcCIsIDAsIENyZWF0aW9uTW9kZU9wZXJhdG9yT25seSkKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNyZWF0aW9uIGNvc3QgbXVzdCBub3QgYmUgbmVnYXRpdmUiLCBmdW5jKCkgewoJCVNldEdhbWVUeXBlUG9saWN5KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIC0xLCBDcmVhdGlvbk1vZGVPcGVyYXRvck9ubHkpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJpbnZhbGlkIGNyZWF0aW9uIG1vZGUiLCBmdW5jKCkgewoJCVNldEdhbWVUeXBlUG9saWN5KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIDAsIENyZWF0aW9uTW9kZUludmFsaWQpCgl9KQp9CgpmdW5jIFRlc3RVbnJlZ2lzdGVyZWRHYW1lVHlwZUlzUmVqZWN0ZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0Q3JlYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0odGVzdENyZWF0b3IpKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZ2FtZSB0eXBlIHBvbGljeSBub3QgZm91bmQ6IHVua25vd25fdHlwZSIsIGZ1bmMoKSB7CgkJQ3JlYXRlR2FtZVdvcmxkKGNyb3NzKGN1ciksICJ1bmtub3duX3R5cGUiKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImdhbWUgdHlwZSBwb2xpY3kgbm90IGZvdW5kOiB1bmtub3duX3R5cGUiLCBmdW5jKCkgewoJCUFkZEFwcHJvdmVkQ3JlYXRvcihjcm9zcyhjdXIpLCAidW5rbm93bl90eXBlIiwgdGVzdENyZWF0b3IpCgl9KQp9ChrpBgoRc2VjdXJpdHlfdGVzdC5nbm8S0wZwYWNrYWdlIGdhbWVfd29ybGQKCmltcG9ydCAoCgkiY2hhaW4iCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3RHYW1lV29ybGRJbnRlcnJlYWxtU2VjdXJpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwR2FtZVdvcmxkKGNyb3NzKGN1ciksIHQpCglzZXRQb2xpY3lGb3JUZXN0KGNyb3NzKGN1ciksIHRlc3RHYW1lVHlwZUp1bXAsIDAsIENyZWF0aW9uTW9kZVB1YmxpY0NyZWF0b3IpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdENyZWF0b3IpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7fSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9nYW1lX3dvcmxkX3JlbGF5IikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvbnRyYWN0IGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIiwgZnVuYygpIHsKCQlDcmVhdGVHYW1lV29ybGQoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCkKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2dhbWVfd29ybGRfYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb3Igb3BlcmF0b3IgYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlBZGRBcHByb3ZlZENyZWF0b3IoY3Jvc3MoY3VyKSwgdGVzdEdhbWVUeXBlSnVtcCwgdGVzdENyZWF0b3IpCgl9KQp9ChqHEAoOc2V0dXBfdGVzdC5nbm8S9A9wYWNrYWdlIGdhbWVfd29ybGQKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdGVzdHV0aWxzL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgp2YXIgKAoJdGVzdEFkbWluICAgICAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZ3dBZG1pbiIpCgl0ZXN0T3BlcmF0b3IgICAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJnd09wZXJhdG9yIikKCXRlc3RDcmVhdG9yICAgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImd3Q3JlYXRvciIpCgl0ZXN0T3RoZXJDcmVhdG9yID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJnd090aGVyQ3JlYXRvciIpCgl0ZXN0UmVzdHJpY3RlZCAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJnd1Jlc3RyaWN0ZWQiKQoJdGVzdE5vUGVyc29uYWwgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZ3dOb1BlcnNvbmFsIikKCXRlc3RGZWVDb2xsZWN0b3IgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImd3RmVlQ29sbGVjdG9yIikKCXRlc3RQa2dBZGRyICAgICAgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvZ2FtZV93b3JsZCIpCglzZXR1cERvbmUgICAgICAgIGJvb2wKKQoKY29uc3QgKAoJdGVzdEdhbWVUeXBlRHVuZ2VvbiA9ICJpbnN0YW5jZV9kdW5nZW9uIgoJdGVzdEdhbWVUeXBlSnVtcCAgICA9ICJqdW1wX21hcCIKCXRlc3RHYW1lVHlwZVJhY2UgICAgPSAicmFjZV9tYXAiCgl0ZXN0R2FtZVR5cGVEcm9wICAgID0gImRyb3BfbWFwIgopCgpmdW5jIHNldHVwR2FtZVdvcmxkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglyZXNldEdhbWVXb3JsZFN0YXRlKCkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoKCWlmIHNldHVwRG9uZSB7CgkJcmV0dXJuCgl9CglvcmlnaW5hbEFkbWluIDo9IGFkbWluLkdldEFkbWluKCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKG9yaWdpbmFsQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG9yaWdpbmFsQWRtaW4pKQoJYWRtaW4uVHJhbnNmZXJBZG1pbihjcm9zcyhjdXIpLCB0ZXN0QWRtaW4pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIodGVzdEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbSh0ZXN0QWRtaW4pKQoJYWRtaW4uQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCWFkbWluLlNldE9wZXJhdG9yKGNyb3NzKGN1ciksIHRlc3RPcGVyYXRvcikKCWFkbWluLlNldEZlZUNvbGxlY3Rvcihjcm9zcyhjdXIpLCB0ZXN0RmVlQ29sbGVjdG9yKQoJc2V0dXBEb25lID0gdHJ1ZQp9CgpmdW5jIHNldFBvbGljeUZvclRlc3QoY3VyIHJlYWxtLCBnYW1lVHlwZSBzdHJpbmcsIGNvc3QgaW50NjQsIG1vZGUgQ3JlYXRpb25Nb2RlKSB7Cgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcih0ZXN0T3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKHRlc3RPcGVyYXRvcikpCglTZXRHYW1lVHlwZVBvbGljeShjcm9zcyhjdXIpLCBnYW1lVHlwZSwgY29zdCwgbW9kZSkKfQoKZnVuYyBjcmVhdGVHYW1lV29ybGRGb3JUZXN0KGN1ciByZWFsbSwgY3JlYXRvciBhZGRyZXNzLCBnYW1lVHlwZSBzdHJpbmcsIGNvaW5zIGNoYWluLkNvaW5zKSB1aW50NjQgewoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoY3JlYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oY3JlYXRvcikpCglpZiBsZW4oY29pbnMpID4gMCB7CgkJdGVzdGluZy5Jc3N1ZUNvaW5zKHRlc3RQa2dBZGRyLCBjb2lucykKCX0KCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjb2lucykKCXJldHVybiBDcmVhdGVHYW1lV29ybGQoY3Jvc3MoY3VyKSwgZ2FtZVR5cGUpCn0KCmZ1bmMgdWdub3RCYWxhbmNlRm9yVGVzdChhZGRyIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2lucyhhZGRyKS5BbW91bnRPZigidWdub3QiKQp9Chr9CwoJc3RvcmUuZ25vEu8LcGFja2FnZSBnYW1lX3dvcmxkCgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgopCgp2YXIgKAoJZ2FtZVdvcmxkcyAgICAgICAgICAgICAqYnB0cmVlLkJQVHJlZSA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCglvd25lckdhbWVXb3JsZElEcyAgICAgICpicHRyZWUuQlBUcmVlID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCXJlc3RyaWN0ZWRHYW1lV29ybGRJRHMgKmJwdHJlZS5CUFRyZWUgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJbGF0ZXN0R2FtZVdvcmxkSUQgICAgICB1aW50NjQKKQoKZnVuYyBhZGRPd25lckdhbWVXb3JsZElEKG93bmVyIGFkZHJlc3MsIGdhbWVXb3JsZElEIHVpbnQ2NCkgewoJdmFsdWUgOj0gb3duZXJHYW1lV29ybGRJRHMuR2V0KG93bmVyLlN0cmluZygpKQoJdmFyIGlkcyAqYnB0cmVlLkJQVHJlZQoJaWYgdmFsdWUgIT0gbmlsIHsKCQlpZHMgPSB2YWx1ZS4oKmJwdHJlZS5CUFRyZWUpCgl9IGVsc2UgewoJCWlkcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCgkJb3duZXJHYW1lV29ybGRJRHMuU2V0KG93bmVyLlN0cmluZygpLCBpZHMpCgl9CglpZHMuU2V0KHVpbnQ2NEtleShnYW1lV29ybGRJRCksIHRydWUpCn0KCmZ1bmMgcmVtb3ZlT3duZXJHYW1lV29ybGRJRChvd25lciBhZGRyZXNzLCBnYW1lV29ybGRJRCB1aW50NjQpIHsKCWlkcywgZm91bmQgOj0gZ2V0T3duZXJHYW1lV29ybGRJRHMob3duZXIpCglpZiAhZm91bmQgewoJCXJldHVybgoJfQoJaWRzLlJlbW92ZSh1aW50NjRLZXkoZ2FtZVdvcmxkSUQpKQp9CgpmdW5jIGdldE93bmVyR2FtZVdvcmxkSURzKG93bmVyIGFkZHJlc3MpICgqYnB0cmVlLkJQVHJlZSwgYm9vbCkgewoJdmFsdWUgOj0gb3duZXJHYW1lV29ybGRJRHMuR2V0KG93bmVyLlN0cmluZygpKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmYWxzZQoJfQoJcmV0dXJuIHZhbHVlLigqYnB0cmVlLkJQVHJlZSksIHRydWUKfQoKZnVuYyByZXNldEdhbWVXb3JsZFN0b3JlKCkgewoJZ2FtZVdvcmxkcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCglvd25lckdhbWVXb3JsZElEcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCglyZXN0cmljdGVkR2FtZVdvcmxkSURzID0gYnB0cmVlLk5ld0JQVHJlZTMyKCkKCWxhdGVzdEdhbWVXb3JsZElEID0gMAp9CgpmdW5jIHVpbnQ2NEtleShpZCB1aW50NjQpIHN0cmluZyB7CgkvLyBaZXJvLXBhZCBzbyBCUFRyZWUga2V5IG9yZGVyIG1hdGNoZXMgbnVtZXJpYyBJRCBvcmRlci4KCXMgOj0gc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkKCWlmIGxlbihzKSA+PSAyMCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiW2xlbihzKTpdICsgcwp9CgpmdW5jIHBhcnNlVWludDY0S2V5KGtleSBzdHJpbmcpIHVpbnQ2NCB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VVaW50KGtleSwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImludmFsaWQgdWludDY0IGtleTogIiArIGtleSkKCX0KCXJldHVybiBpZAp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCODyoVISCjg2MjYxdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECLUUtr6vIOzviOGbyUc1h+4x9Ac78WI57H+Na8gUVG8MSQDDrT31nKSL0mqvutmD+ijCN4mc+1D0YRgLYkZgCU24PRk2e9TX7QmORxVoazsD9mmclIon90iatkX+bAy0VQXUaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=