Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
0397D0D44CF8651E5700008D0C8BB73FE4BCD6A4F5402BBCA7EF55A2F9064C2E
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
21,605,559
Requested gas limit
GAS USED
16,619,621
Gas consumed
FEE
21606ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t42000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CshYCgwvdm0ubV9hZGRwa2cSt1gKKGcxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQS/FcKA2F2bBI3Z25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2F2bBpeCgtnbm9tb2QudG9tbBJPbW9kdWxlID0gImduby5sYW5kL3AvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC9hdmwiCmdubyA9ICIwLjkiChroRQoIbm9kZS5nbm8S20VwYWNrYWdlIGF2bAoKdHlwZSBOb2RlIHN0cnVjdCB7CglrZXkgICAgICAgc3RyaW5nIC8vIGtleSBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBub2RlLgoJdmFsdWUgICAgIGFueSAgICAvLyB2YWx1ZSBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIG5vZGUuCgloZWlnaHQgICAgaW50OCAgIC8vIGhlaWdodCBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBub2RlIGluIHRoZSB0cmVlLgoJc2l6ZSAgICAgIGludCAgICAvLyBzaXplIGlzIHRoZSBudW1iZXIgb2YgbGVhZiBub2RlcyAoa2V5LXZhbHVlIHBhaXJzKSBpbiB0aGUgc3VidHJlZSByb290ZWQgYXQgdGhpcyBub2RlLgoJbGVmdE5vZGUgICpOb2RlICAvLyBsZWZ0Tm9kZSBpcyB0aGUgbGVmdCBjaGlsZCBvZiB0aGUgbm9kZS4KCXJpZ2h0Tm9kZSAqTm9kZSAgLy8gcmlnaHROb2RlIGlzIHRoZSByaWdodCBjaGlsZCBvZiB0aGUgbm9kZS4KfQoKZnVuYyBOZXdOb2RlKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgKk5vZGUgewoJcmV0dXJuICZOb2RlewoJCWtleTogICAga2V5LAoJCXZhbHVlOiAgdmFsdWUsCgkJaGVpZ2h0OiAwLAoJCXNpemU6ICAgMSwKCX0KfQoKZnVuYyAobm9kZSAqTm9kZSkgU2l6ZSgpIGludCB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBub2RlLnNpemUKfQoKZnVuYyAobm9kZSAqTm9kZSkgSXNMZWFmKCkgYm9vbCB7CglyZXR1cm4gbm9kZS5oZWlnaHQgPT0gMAp9CgpmdW5jIChub2RlICpOb2RlKSBLZXkoKSBzdHJpbmcgewoJcmV0dXJuIG5vZGUua2V5Cn0KCmZ1bmMgKG5vZGUgKk5vZGUpIFZhbHVlKCkgYW55IHsKCXJldHVybiBub2RlLnZhbHVlCn0KCmZ1bmMgKG5vZGUgKk5vZGUpIF9jb3B5KCkgKk5vZGUgewoJaWYgbm9kZS5oZWlnaHQgPT0gMCB7CgkJcGFuaWMoIldoeSBhcmUgeW91IGNvcHlpbmcgYSB2YWx1ZSBub2RlPyIpCgl9CglyZXR1cm4gJk5vZGV7CgkJa2V5OiAgICAgICBub2RlLmtleSwKCQloZWlnaHQ6ICAgIG5vZGUuaGVpZ2h0LAoJCXNpemU6ICAgICAgbm9kZS5zaXplLAoJCWxlZnROb2RlOiAgbm9kZS5sZWZ0Tm9kZSwKCQlyaWdodE5vZGU6IG5vZGUucmlnaHROb2RlLAoJfQp9CgpmdW5jIChub2RlICpOb2RlKSBIYXMoa2V5IHN0cmluZykgKGhhcyBib29sKSB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBub2RlLmtleSA9PSBrZXkgewoJCXJldHVybiB0cnVlCgl9CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlyZXR1cm4gZmFsc2UKCX0gZWxzZSB7CgkJaWYga2V5IDwgbm9kZS5rZXkgewoJCQlyZXR1cm4gbm9kZS5nZXRMZWZ0Tm9kZSgpLkhhcyhrZXkpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIG5vZGUuZ2V0UmlnaHROb2RlKCkuSGFzKGtleSkKCQl9Cgl9Cn0KCmZ1bmMgKG5vZGUgKk5vZGUpIEdldChrZXkgc3RyaW5nKSAoaW5kZXggaW50LCB2YWx1ZSBhbnksIGV4aXN0cyBib29sKSB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIDAsIG5pbCwgZmFsc2UKCX0KCglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlpZiBub2RlLmtleSA9PSBrZXkgewoJCQlyZXR1cm4gMCwgbm9kZS52YWx1ZSwgdHJ1ZQoJCX0gZWxzZSBpZiBub2RlLmtleSA8IGtleSB7CgkJCXJldHVybiAxLCBuaWwsIGZhbHNlCgkJfSBlbHNlIHsKCQkJcmV0dXJuIDAsIG5pbCwgZmFsc2UKCQl9Cgl9IGVsc2UgewoJCWlmIGtleSA8IG5vZGUua2V5IHsKCQkJcmV0dXJuIG5vZGUuZ2V0TGVmdE5vZGUoKS5HZXQoa2V5KQoJCX0gZWxzZSB7CgkJCXJpZ2h0Tm9kZSA6PSBub2RlLmdldFJpZ2h0Tm9kZSgpCgkJCWluZGV4LCB2YWx1ZSwgZXhpc3RzID0gcmlnaHROb2RlLkdldChrZXkpCgkJCWluZGV4ICs9IG5vZGUuc2l6ZSAtIHJpZ2h0Tm9kZS5zaXplCgkJCXJldHVybiBpbmRleCwgdmFsdWUsIGV4aXN0cwoJCX0KCX0KfQoKZnVuYyAobm9kZSAqTm9kZSkgR2V0QnlJbmRleChpbmRleCBpbnQpIChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIHsKCWlmIGluZGV4IDwgMCB7CgkJcGFuaWMoIkdldEJ5SW5kZXg6IG5lZ2F0aXZlIGluZGV4IG5vdCBhbGxvd2VkIikKCX0KCglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlpZiBpbmRleCAhPSAwIHsKCQkJcGFuaWMoIkdldEJ5SW5kZXggYXNrZWQgZm9yIGludmFsaWQgaW5kZXgiKQoJCX0KCQlyZXR1cm4gbm9kZS5rZXksIG5vZGUudmFsdWUKCX0gZWxzZSB7CgkJbGVmdE5vZGUgOj0gbm9kZS5nZXRMZWZ0Tm9kZSgpCgkJaWYgaW5kZXggPCBsZWZ0Tm9kZS5zaXplIHsKCQkJcmV0dXJuIGxlZnROb2RlLkdldEJ5SW5kZXgoaW5kZXgpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIG5vZGUuZ2V0UmlnaHROb2RlKCkuR2V0QnlJbmRleChpbmRleCAtIGxlZnROb2RlLnNpemUpCgkJfQoJfQp9CgpmdW5jIChub2RlICpOb2RlKSBTZXQoa2V5IHN0cmluZywgdmFsdWUgYW55KSAobmV3U2VsZiAqTm9kZSwgdXBkYXRlZCBib29sKSB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIE5ld05vZGUoa2V5LCB2YWx1ZSksIGZhbHNlCgl9CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlpZiBrZXkgPCBub2RlLmtleSB7CgkJCXJldHVybiAmTm9kZXsKCQkJCWtleTogICAgICAgbm9kZS5rZXksCgkJCQloZWlnaHQ6ICAgIDEsCgkJCQlzaXplOiAgICAgIDIsCgkJCQlsZWZ0Tm9kZTogIE5ld05vZGUoa2V5LCB2YWx1ZSksCgkJCQlyaWdodE5vZGU6IG5vZGUsCgkJCX0sIGZhbHNlCgkJfSBlbHNlIGlmIGtleSA9PSBub2RlLmtleSB7CgkJCXJldHVybiBOZXdOb2RlKGtleSwgdmFsdWUpLCB0cnVlCgkJfSBlbHNlIHsKCQkJcmV0dXJuICZOb2RlewoJCQkJa2V5OiAgICAgICBrZXksCgkJCQloZWlnaHQ6ICAgIDEsCgkJCQlzaXplOiAgICAgIDIsCgkJCQlsZWZ0Tm9kZTogIG5vZGUsCgkJCQlyaWdodE5vZGU6IE5ld05vZGUoa2V5LCB2YWx1ZSksCgkJCX0sIGZhbHNlCgkJfQoJfSBlbHNlIHsKCQlub2RlID0gbm9kZS5fY29weSgpCgkJaWYga2V5IDwgbm9kZS5rZXkgewoJCQlub2RlLmxlZnROb2RlLCB1cGRhdGVkID0gbm9kZS5nZXRMZWZ0Tm9kZSgpLlNldChrZXksIHZhbHVlKQoJCX0gZWxzZSB7CgkJCW5vZGUucmlnaHROb2RlLCB1cGRhdGVkID0gbm9kZS5nZXRSaWdodE5vZGUoKS5TZXQoa2V5LCB2YWx1ZSkKCQl9CgkJaWYgdXBkYXRlZCB7CgkJCXJldHVybiBub2RlLCB1cGRhdGVkCgkJfSBlbHNlIHsKCQkJbm9kZS5jYWxjSGVpZ2h0QW5kU2l6ZSgpCgkJCXJldHVybiBub2RlLmJhbGFuY2UoKSwgdXBkYXRlZAoJCX0KCX0KfQoKZnVuYyAobm9kZSAqTm9kZSkgUmVtb3ZlKGtleSBzdHJpbmcpICgKCW5ld05vZGUgKk5vZGUsIG5ld0tleSBzdHJpbmcsIHZhbHVlIGFueSwgcmVtb3ZlZCBib29sLAopIHsKCWlmIG5vZGUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCAiIiwgbmlsLCBmYWxzZQoJfQoJaWYgbm9kZS5oZWlnaHQgPT0gMCB7CgkJaWYga2V5ID09IG5vZGUua2V5IHsKCQkJcmV0dXJuIG5pbCwgIiIsIG5vZGUudmFsdWUsIHRydWUKCQl9IGVsc2UgewoJCQlyZXR1cm4gbm9kZSwgIiIsIG5pbCwgZmFsc2UKCQl9Cgl9IGVsc2UgewoJCWlmIGtleSA8IG5vZGUua2V5IHsKCQkJdmFyIG5ld0xlZnROb2RlICpOb2RlCgkJCW5ld0xlZnROb2RlLCBuZXdLZXksIHZhbHVlLCByZW1vdmVkID0gbm9kZS5nZXRMZWZ0Tm9kZSgpLlJlbW92ZShrZXkpCgkJCWlmICFyZW1vdmVkIHsKCQkJCXJldHVybiBub2RlLCAiIiwgdmFsdWUsIGZhbHNlCgkJCX0gZWxzZSBpZiBuZXdMZWZ0Tm9kZSA9PSBuaWwgeyAvLyBsZWZ0IG5vZGUgaGVsZCB2YWx1ZSwgd2FzIHJlbW92ZWQKCQkJCXJldHVybiBub2RlLnJpZ2h0Tm9kZSwgbm9kZS5rZXksIHZhbHVlLCB0cnVlCgkJCX0KCQkJbm9kZSA9IG5vZGUuX2NvcHkoKQoJCQlub2RlLmxlZnROb2RlID0gbmV3TGVmdE5vZGUKCQkJbm9kZS5jYWxjSGVpZ2h0QW5kU2l6ZSgpCgkJCW5vZGUgPSBub2RlLmJhbGFuY2UoKQoJCQlyZXR1cm4gbm9kZSwgbmV3S2V5LCB2YWx1ZSwgdHJ1ZQoJCX0gZWxzZSB7CgkJCXZhciBuZXdSaWdodE5vZGUgKk5vZGUKCQkJbmV3UmlnaHROb2RlLCBuZXdLZXksIHZhbHVlLCByZW1vdmVkID0gbm9kZS5nZXRSaWdodE5vZGUoKS5SZW1vdmUoa2V5KQoJCQlpZiAhcmVtb3ZlZCB7CgkJCQlyZXR1cm4gbm9kZSwgIiIsIHZhbHVlLCBmYWxzZQoJCQl9IGVsc2UgaWYgbmV3UmlnaHROb2RlID09IG5pbCB7IC8vIHJpZ2h0IG5vZGUgaGVsZCB2YWx1ZSwgd2FzIHJlbW92ZWQKCQkJCXJldHVybiBub2RlLmxlZnROb2RlLCAiIiwgdmFsdWUsIHRydWUKCQkJfQoJCQlub2RlID0gbm9kZS5fY29weSgpCgkJCW5vZGUucmlnaHROb2RlID0gbmV3UmlnaHROb2RlCgkJCWlmIG5ld0tleSAhPSAiIiB7CgkJCQlub2RlLmtleSA9IG5ld0tleQoJCQl9CgkJCW5vZGUuY2FsY0hlaWdodEFuZFNpemUoKQoJCQlub2RlID0gbm9kZS5iYWxhbmNlKCkKCQkJcmV0dXJuIG5vZGUsICIiLCB2YWx1ZSwgdHJ1ZQoJCX0KCX0KfQoKZnVuYyAobm9kZSAqTm9kZSkgZ2V0TGVmdE5vZGUoKSAqTm9kZSB7CglyZXR1cm4gbm9kZS5sZWZ0Tm9kZQp9CgpmdW5jIChub2RlICpOb2RlKSBnZXRSaWdodE5vZGUoKSAqTm9kZSB7CglyZXR1cm4gbm9kZS5yaWdodE5vZGUKfQoKZnVuYyAobm9kZSAqTm9kZSkgcm90YXRlUmlnaHQoKSAqTm9kZSB7Cglub2RlID0gbm9kZS5fY29weSgpCglsIDo9IG5vZGUuZ2V0TGVmdE5vZGUoKQoJX2wgOj0gbC5fY29weSgpCgoJX2xyQ2FjaGVkIDo9IF9sLnJpZ2h0Tm9kZQoJX2wucmlnaHROb2RlID0gbm9kZQoJbm9kZS5sZWZ0Tm9kZSA9IF9sckNhY2hlZAoKCW5vZGUuY2FsY0hlaWdodEFuZFNpemUoKQoJX2wuY2FsY0hlaWdodEFuZFNpemUoKQoKCXJldHVybiBfbAp9CgpmdW5jIChub2RlICpOb2RlKSByb3RhdGVMZWZ0KCkgKk5vZGUgewoJbm9kZSA9IG5vZGUuX2NvcHkoKQoJciA6PSBub2RlLmdldFJpZ2h0Tm9kZSgpCglfciA6PSByLl9jb3B5KCkKCglfcmxDYWNoZWQgOj0gX3IubGVmdE5vZGUKCV9yLmxlZnROb2RlID0gbm9kZQoJbm9kZS5yaWdodE5vZGUgPSBfcmxDYWNoZWQKCglub2RlLmNhbGNIZWlnaHRBbmRTaXplKCkKCV9yLmNhbGNIZWlnaHRBbmRTaXplKCkKCglyZXR1cm4gX3IKfQoKZnVuYyAobm9kZSAqTm9kZSkgY2FsY0hlaWdodEFuZFNpemUoKSB7Cglub2RlLmhlaWdodCA9IG1heEludDgobm9kZS5nZXRMZWZ0Tm9kZSgpLmhlaWdodCwgbm9kZS5nZXRSaWdodE5vZGUoKS5oZWlnaHQpICsgMQoJbm9kZS5zaXplID0gbm9kZS5nZXRMZWZ0Tm9kZSgpLnNpemUgKyBub2RlLmdldFJpZ2h0Tm9kZSgpLnNpemUKfQoKZnVuYyAobm9kZSAqTm9kZSkgY2FsY0JhbGFuY2UoKSBpbnQgewoJcmV0dXJuIGludChub2RlLmdldExlZnROb2RlKCkuaGVpZ2h0KSAtIGludChub2RlLmdldFJpZ2h0Tm9kZSgpLmhlaWdodCkKfQoKZnVuYyAobm9kZSAqTm9kZSkgYmFsYW5jZSgpIChuZXdTZWxmICpOb2RlKSB7CgliYWxhbmNlIDo9IG5vZGUuY2FsY0JhbGFuY2UoKQoJaWYgYmFsYW5jZSA+IDEgewoJCWlmIG5vZGUuZ2V0TGVmdE5vZGUoKS5jYWxjQmFsYW5jZSgpID49IDAgewoJCQlyZXR1cm4gbm9kZS5yb3RhdGVSaWdodCgpCgkJfSBlbHNlIHsKCQkJbGVmdCA6PSBub2RlLmdldExlZnROb2RlKCkKCQkJbm9kZS5sZWZ0Tm9kZSA9IGxlZnQucm90YXRlTGVmdCgpCgkJCXJldHVybiBub2RlLnJvdGF0ZVJpZ2h0KCkKCQl9Cgl9CglpZiBiYWxhbmNlIDwgLTEgewoJCWlmIG5vZGUuZ2V0UmlnaHROb2RlKCkuY2FsY0JhbGFuY2UoKSA8PSAwIHsKCQkJcmV0dXJuIG5vZGUucm90YXRlTGVmdCgpCgkJfSBlbHNlIHsKCQkJcmlnaHQgOj0gbm9kZS5nZXRSaWdodE5vZGUoKQoJCQlub2RlLnJpZ2h0Tm9kZSA9IHJpZ2h0LnJvdGF0ZVJpZ2h0KCkKCQkJcmV0dXJuIG5vZGUucm90YXRlTGVmdCgpCgkJfQoJfQoJcmV0dXJuIG5vZGUKfQoKZnVuYyAobm9kZSAqTm9kZSkgSXRlcmF0ZShzdGFydCwgZW5kIHN0cmluZywgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglyZXR1cm4gbm9kZS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgdHJ1ZSwgdHJ1ZSwgY2IpCn0KCmZ1bmMgKG5vZGUgKk5vZGUpIFJldmVyc2VJdGVyYXRlKHN0YXJ0LCBlbmQgc3RyaW5nLCBjYiBmdW5jKCpOb2RlKSBib29sKSBib29sIHsKCXJldHVybiBub2RlLlRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kLCBmYWxzZSwgdHJ1ZSwgY2IpCn0KCmZ1bmMgKG5vZGUgKk5vZGUpIFRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kIHN0cmluZywgYXNjZW5kaW5nIGJvb2wsIGxlYXZlc09ubHkgYm9vbCwgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CglhZnRlclN0YXJ0IDo9IChzdGFydCA9PSAiIiB8fCBzdGFydCA8IG5vZGUua2V5KQoJc3RhcnRPckFmdGVyIDo9IChzdGFydCA9PSAiIiB8fCBzdGFydCA8PSBub2RlLmtleSkKCWJlZm9yZUVuZCA6PSBmYWxzZQoJaWYgYXNjZW5kaW5nIHsKCQliZWZvcmVFbmQgPSAoZW5kID09ICIiIHx8IG5vZGUua2V5IDwgZW5kKQoJfSBlbHNlIHsKCQliZWZvcmVFbmQgPSAoZW5kID09ICIiIHx8IG5vZGUua2V5IDw9IGVuZCkKCX0KCglzdG9wIDo9IGZhbHNlCglpZiAoIW5vZGUuSXNMZWFmKCkgJiYgIWxlYXZlc09ubHkpIHx8CgkJKG5vZGUuSXNMZWFmKCkgJiYgc3RhcnRPckFmdGVyICYmIGJlZm9yZUVuZCkgewoJCXN0b3AgPSBjYihub2RlKQoJCWlmIHN0b3AgewoJCQlyZXR1cm4gc3RvcAoJCX0KCX0KCWlmIG5vZGUuSXNMZWFmKCkgewoJCXJldHVybiBzdG9wCgl9CgoJaWYgYXNjZW5kaW5nIHsKCQlpZiBhZnRlclN0YXJ0IHsKCQkJc3RvcCA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgYXNjZW5kaW5nLCBsZWF2ZXNPbmx5LCBjYikKCQl9CgkJaWYgc3RvcCB7CgkJCXJldHVybiBzdG9wCgkJfQoJCWlmIGJlZm9yZUVuZCB7CgkJCXN0b3AgPSBub2RlLmdldFJpZ2h0Tm9kZSgpLlRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kLCBhc2NlbmRpbmcsIGxlYXZlc09ubHksIGNiKQoJCX0KCX0gZWxzZSB7CgkJaWYgYmVmb3JlRW5kIHsKCQkJc3RvcCA9IG5vZGUuZ2V0UmlnaHROb2RlKCkuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIGFzY2VuZGluZywgbGVhdmVzT25seSwgY2IpCgkJfQoJCWlmIHN0b3AgewoJCQlyZXR1cm4gc3RvcAoJCX0KCQlpZiBhZnRlclN0YXJ0IHsKCQkJc3RvcCA9IG5vZGUuZ2V0TGVmdE5vZGUoKS5UcmF2ZXJzZUluUmFuZ2Uoc3RhcnQsIGVuZCwgYXNjZW5kaW5nLCBsZWF2ZXNPbmx5LCBjYikKCQl9Cgl9CgoJcmV0dXJuIHN0b3AKfQoKZnVuYyAobm9kZSAqTm9kZSkgVHJhdmVyc2VCeU9mZnNldChvZmZzZXQsIGxpbWl0IGludCwgYXNjZW5kaW5nIGJvb2wsIGxlYXZlc09ubHkgYm9vbCwgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglpZiBub2RlID09IG5pbCB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJaWYgb2Zmc2V0IDwgMCB7CgkJb2Zmc2V0ID0gMAoJfQoKCWlmIGxpbWl0IDw9IDAgfHwgb2Zmc2V0ID49IG5vZGUuc2l6ZSB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBub2RlLklzTGVhZigpIHsKCQlpZiBvZmZzZXQgPiAwIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCXJldHVybiBjYihub2RlKQoJfQoKCXJldHVybiBub2RlLnRyYXZlcnNlQnlPZmZzZXQob2Zmc2V0LCBsaW1pdCwgYXNjZW5kaW5nLCBsZWF2ZXNPbmx5LCBjYikKfQoKZnVuYyAobm9kZSAqTm9kZSkgdHJhdmVyc2VCeU9mZnNldChvZmZzZXQsIGxpbWl0IGludCwgYXNjZW5kaW5nIGJvb2wsIGxlYXZlc09ubHkgYm9vbCwgY2IgZnVuYygqTm9kZSkgYm9vbCkgYm9vbCB7CglpZiAhbGVhdmVzT25seSB7CgkJaWYgY2Iobm9kZSkgewoJCQlyZXR1cm4gdHJ1ZSAvLyBTdG9wIHRyYXZlcnNhbCBpZiBjYWxsYmFjayByZXR1cm5zIHRydWUKCQl9Cgl9CglmaXJzdCwgc2Vjb25kIDo9IG5vZGUuZ2V0TGVmdE5vZGUoKSwgbm9kZS5nZXRSaWdodE5vZGUoKQoJaWYgIWFzY2VuZGluZyB7CgkJZmlyc3QsIHNlY29uZCA9IHNlY29uZCwgZmlyc3QKCX0KCWlmIGZpcnN0LklzTGVhZigpIHsKCQlpZiBvZmZzZXQgPiAwIHsKCQkJb2Zmc2V0LS0KCQl9IGVsc2UgewoJCQlpZiBjYihmaXJzdCkgewoJCQkJcmV0dXJuIHRydWUgLy8gU3RvcCB0cmF2ZXJzYWwgaWYgY2FsbGJhY2sgcmV0dXJucyB0cnVlCgkJCX0KCQkJbGltaXQtLQoJCQlpZiBsaW1pdCA8PSAwIHsKCQkJCXJldHVybiB0cnVlIC8vIFN0b3AgdHJhdmVyc2FsIHdoZW4gbGltaXQgaXMgcmVhY2hlZAoJCQl9CgkJfQoJfSBlbHNlIHsKCQlpZiBvZmZzZXQgPj0gZmlyc3Quc2l6ZSB7CgkJCW9mZnNldCAtPSBmaXJzdC5zaXplIC8vIDEKCQl9IGVsc2UgewoJCQlpZiBmaXJzdC50cmF2ZXJzZUJ5T2Zmc2V0KG9mZnNldCwgbGltaXQsIGFzY2VuZGluZywgbGVhdmVzT25seSwgY2IpIHsKCQkJCXJldHVybiB0cnVlCgkJCX0KCQkJZGVsdGEgOj0gZmlyc3Quc2l6ZSAtIG9mZnNldAoJCQlvZmZzZXQgPSAwCgkJCWlmIGRlbHRhID49IGxpbWl0IHsKCQkJCXJldHVybiB0cnVlIC8vIDMKCQkJfQoJCQlsaW1pdCAtPSBkZWx0YSAvLyAyCgkJfQoJfQoKCWlmIHNlY29uZC5Jc0xlYWYoKSB7CgkJcmV0dXJuIGNiKHNlY29uZCkKCX0KCXJldHVybiBzZWNvbmQudHJhdmVyc2VCeU9mZnNldChvZmZzZXQsIGxpbWl0LCBhc2NlbmRpbmcsIGxlYXZlc09ubHksIGNiKQp9CgpmdW5jIChub2RlICpOb2RlKSBsbWQoKSAqTm9kZSB7CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlyZXR1cm4gbm9kZQoJfQoJcmV0dXJuIG5vZGUuZ2V0TGVmdE5vZGUoKS5sbWQoKQp9CgpmdW5jIChub2RlICpOb2RlKSBybWQoKSAqTm9kZSB7CglpZiBub2RlLmhlaWdodCA9PSAwIHsKCQlyZXR1cm4gbm9kZQoJfQoJcmV0dXJuIG5vZGUuZ2V0UmlnaHROb2RlKCkucm1kKCkKfQoKZnVuYyBtYXhJbnQ4KGEsIGIgaW50OCkgaW50OCB7CglpZiBhID4gYiB7CgkJcmV0dXJuIGEKCX0KCXJldHVybiBiCn0KGswQCgh0cmVlLmdubxK/EHBhY2thZ2UgYXZsCgp0eXBlIElUcmVlIGludGVyZmFjZSB7CgoJU2l6ZSgpIGludAoJSGFzKGtleSBzdHJpbmcpIGJvb2wKCUdldChrZXkgc3RyaW5nKSBhbnkKCUdldEJ5SW5kZXgoaW5kZXggaW50KSAoa2V5IHN0cmluZywgdmFsdWUgYW55KQoJSXRlcmF0ZShzdGFydCwgZW5kIHN0cmluZywgY2IgSXRlckNiRm4pIGJvb2wKCVJldmVyc2VJdGVyYXRlKHN0YXJ0LCBlbmQgc3RyaW5nLCBjYiBJdGVyQ2JGbikgYm9vbAoJSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCBpbnQsIGNvdW50IGludCwgY2IgSXRlckNiRm4pIGJvb2wKCVJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0IGludCwgY291bnQgaW50LCBjYiBJdGVyQ2JGbikgYm9vbAoKCVNldChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpICh1cGRhdGVkIGJvb2wpCglSZW1vdmUoa2V5IHN0cmluZykgKHZhbHVlIGFueSwgcmVtb3ZlZCBib29sKQp9Cgp0eXBlIEl0ZXJDYkZuIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sCgp0eXBlIFRyZWUgc3RydWN0IHsKCW5vZGUgKk5vZGUKfQoKZnVuYyBOZXdUcmVlKCkgKlRyZWUgewoJcmV0dXJuICZUcmVlewoJCW5vZGU6IG5pbCwKCX0KfQoKZnVuYyAodHJlZSAqVHJlZSkgU2l6ZSgpIGludCB7CglyZXR1cm4gdHJlZS5ub2RlLlNpemUoKQp9CgpmdW5jICh0cmVlICpUcmVlKSBIYXMoa2V5IHN0cmluZykgKGhhcyBib29sKSB7CglyZXR1cm4gdHJlZS5ub2RlLkhhcyhrZXkpCn0KCmZ1bmMgKHRyZWUgKlRyZWUpIEdldChrZXkgc3RyaW5nKSBhbnkgewoJXywgdmFsdWUsIF8gOj0gdHJlZS5ub2RlLkdldChrZXkpCglyZXR1cm4gdmFsdWUKfQoKZnVuYyAodHJlZSAqVHJlZSkgR2V0QnlJbmRleChpbmRleCBpbnQpIChrZXkgc3RyaW5nLCB2YWx1ZSBhbnkpIHsKCXJldHVybiB0cmVlLm5vZGUuR2V0QnlJbmRleChpbmRleCkKfQoKZnVuYyAodHJlZSAqVHJlZSkgU2V0KGtleSBzdHJpbmcsIHZhbHVlIGFueSkgKHVwZGF0ZWQgYm9vbCkgewoJbmV3bm9kZSwgdXBkYXRlZCA6PSB0cmVlLm5vZGUuU2V0KGtleSwgdmFsdWUpCgl0cmVlLm5vZGUgPSBuZXdub2RlCglyZXR1cm4gdXBkYXRlZAp9CgpmdW5jICh0cmVlICpUcmVlKSBSZW1vdmUoa2V5IHN0cmluZykgKHZhbHVlIGFueSwgcmVtb3ZlZCBib29sKSB7CgluZXdub2RlLCBfLCB2YWx1ZSwgcmVtb3ZlZCA6PSB0cmVlLm5vZGUuUmVtb3ZlKGtleSkKCXRyZWUubm9kZSA9IG5ld25vZGUKCXJldHVybiB2YWx1ZSwgcmVtb3ZlZAp9CgpmdW5jICh0cmVlICpUcmVlKSBJdGVyYXRlKHN0YXJ0LCBlbmQgc3RyaW5nLCBjYiBJdGVyQ2JGbikgYm9vbCB7CglyZXR1cm4gdHJlZS5ub2RlLlRyYXZlcnNlSW5SYW5nZShzdGFydCwgZW5kLCB0cnVlLCB0cnVlLAoJCWZ1bmMobm9kZSAqTm9kZSkgYm9vbCB7CgkJCXJldHVybiBjYihub2RlLktleSgpLCBub2RlLlZhbHVlKCkpCgkJfSwKCSkKfQoKZnVuYyAodHJlZSAqVHJlZSkgUmV2ZXJzZUl0ZXJhdGUoc3RhcnQsIGVuZCBzdHJpbmcsIGNiIEl0ZXJDYkZuKSBib29sIHsKCXJldHVybiB0cmVlLm5vZGUuVHJhdmVyc2VJblJhbmdlKHN0YXJ0LCBlbmQsIGZhbHNlLCB0cnVlLAoJCWZ1bmMobm9kZSAqTm9kZSkgYm9vbCB7CgkJCXJldHVybiBjYihub2RlLktleSgpLCBub2RlLlZhbHVlKCkpCgkJfSwKCSkKfQoKZnVuYyAodHJlZSAqVHJlZSkgSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCBpbnQsIGNvdW50IGludCwgY2IgSXRlckNiRm4pIGJvb2wgewoJcmV0dXJuIHRyZWUubm9kZS5UcmF2ZXJzZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIHRydWUsIHRydWUsCgkJZnVuYyhub2RlICpOb2RlKSBib29sIHsKCQkJcmV0dXJuIGNiKG5vZGUuS2V5KCksIG5vZGUuVmFsdWUoKSkKCQl9LAoJKQp9CgpmdW5jICh0cmVlICpUcmVlKSBSZXZlcnNlSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCBpbnQsIGNvdW50IGludCwgY2IgSXRlckNiRm4pIGJvb2wgewoJcmV0dXJuIHRyZWUubm9kZS5UcmF2ZXJzZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZhbHNlLCB0cnVlLAoJCWZ1bmMobm9kZSAqTm9kZSkgYm9vbCB7CgkJCXJldHVybiBjYihub2RlLktleSgpLCBub2RlLlZhbHVlKCkpCgkJfSwKCSkKfQoKdmFyIF8gSVRyZWUgPSAoKlRyZWUpKG5pbCkKIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIgwyMDAwMDAwdWdub3QSEQjuss0UEgoyMTYwNnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAmZ5o8YfM9QJ/120fX+9FT8V+U0E7tB46swEA7Z5uzFQEkDEGSQ1C2pwrwm/6EJOsNcraO6afZ5+5XGBJqfNzST+aFQS9Ud+mssg8OXIox57sjVmYxGRmV6/KjUY8UkGcIkJGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl