Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
BCAB53390D720FF0B29E1E01E379EB03463018539EA64BBF283652A44D3B9A3C
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
110,773,978
Requested gas limit
GAS USED
85,210,723
Gas consumed
FEE
110774ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t430000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CpL8AwoML3ZtLm1fYWRkcGtnEoD8AwooZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NBLD+wMKBmFydDNkMhI6Z25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2FydDNkMhr0+QMKB2FydC5nbm8S5/kDcGFja2FnZSBhcnQzZDIKCmltcG9ydCAoCgkiY3J5cHRvL3NoYTI1NiIKCSJtYXRoIgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJY2FudmFzVywgY2FudmFzSCA9IDE3MC4wLCAxNzAuMAoJc3VialgsIHN1YmpZICAgICA9IDg1LjAsIDc4LjAKKQoKZnVuYyBpdG9hKHYgaW50NjQpIHN0cmluZyB7CglpZiB2ID09IDAgewoJCXJldHVybiAiMCIKCX0KCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXZhciBiIFsyMF1ieXRlCglpIDo9IGxlbihiKQoJZm9yIHYgPiAwIHsKCQlpLS0KCQliW2ldID0gYnl0ZSgnMCcgKyB2JTEwKQoJCXYgLz0gMTAKCX0KCWlmIG5lZyB7CgkJaS0tCgkJYltpXSA9ICctJwoJfQoJcmV0dXJuIHN0cmluZyhiW2k6XSkKfQoKZnVuYyBmbnVtKHYgZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIGNudW0odikgfQoKZnVuYyBmbnVtUGFkKHYgZmxvYXQ2NCkgc3RyaW5nIHsKCW5lZyA6PSB2IDwgMAoJaWYgbmVnIHsKCQl2ID0gLXYKCX0KCXNjYWxlZCA6PSBpbnQ2NCh2KjEwMCArIDAuNSkKCXdob2xlIDo9IHNjYWxlZCAvIDEwMAoJZnJhYyA6PSBzY2FsZWQgJSAxMDAKCWZyYWNTdHIgOj0gaXRvYShmcmFjKQoJaWYgZnJhYyA8IDEwIHsKCQlmcmFjU3RyID0gIjAiICsgZnJhY1N0cgoJfQoJcyA6PSBpdG9hKHdob2xlKSArICIuIiArIGZyYWNTdHIKCWlmIG5lZyB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgY251bSh2IGZsb2F0NjQpIHN0cmluZyB7CglzIDo9IGZudW1QYWQodikKCWlmIHN0cmluZ3MuQ29udGFpbnMocywgIi4iKSB7CgkJcyA9IHN0cmluZ3MuVHJpbVJpZ2h0KHN0cmluZ3MuVHJpbVJpZ2h0KHMsICIwIiksICIuIikKCX0KCWlmIHN0cmluZ3MuSGFzUHJlZml4KHMsICIwLiIpIHsKCQlzID0gc1sxOl0KCX0gZWxzZSBpZiBzdHJpbmdzLkhhc1ByZWZpeChzLCAiLTAuIikgewoJCXMgPSAiLSIgKyBzWzI6XQoJfQoJcmV0dXJuIHMKfQoKZnVuYyBmbnVtMSh2IGZsb2F0NjQpIHN0cmluZyB7CgluZWcgOj0gdiA8IDAKCWlmIG5lZyB7CgkJdiA9IC12Cgl9CglzY2FsZWQgOj0gaW50NjQodioxMCArIDAuNSkKCXMgOj0gaXRvYShzY2FsZWQvMTApICsgIi4iICsgaXRvYShzY2FsZWQlMTApCglpZiBuZWcgewoJCXJldHVybiAiLSIgKyBzCgl9CglyZXR1cm4gcwp9CgpmdW5jIHBjdG51bSh2IGZsb2F0NjQpIHN0cmluZyB7IHJldHVybiBmbnVtKHYpIH0KCmZ1bmMgaGV4VG9SR0IoaGV4IHN0cmluZykgKGludCwgaW50LCBpbnQpIHsKCWggOj0gaGV4CglpZiBsZW4oaCkgPiAwICYmIGhbMF0gPT0gJyMnIHsKCQloID0gaFsxOl0KCX0KCXIgOj0gaGV4Qnl0ZShoWzA6Ml0pCglnIDo9IGhleEJ5dGUoaFsyOjRdKQoJYiA6PSBoZXhCeXRlKGhbNDo2XSkKCXJldHVybiByLCBnLCBiCn0KCmZ1bmMgaGV4Qnl0ZShzIHN0cmluZykgaW50IHsKCXYgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQl2YXIgZCBpbnQKCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnMCcgJiYgYyA8PSAnOSc6CgkJCWQgPSBpbnQoYyAtICcwJykKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ2YnOgoJCQlkID0gaW50KGMtJ2EnKSArIDEwCgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdGJzoKCQkJZCA9IGludChjLSdBJykgKyAxMAoJCX0KCQl2ID0gdioxNiArIGQKCX0KCXJldHVybiB2Cn0KCmZ1bmMgcmdiVG9IZXgociwgZywgYiBpbnQpIHN0cmluZyB7CglyZXR1cm4gIiMiICsgaGV4RGlnaXQyKHIpICsgaGV4RGlnaXQyKGcpICsgaGV4RGlnaXQyKGIpCn0KCmZ1bmMgaGV4RGlnaXQyKHYgaW50KSBzdHJpbmcgewoJaWYgdiA8IDAgewoJCXYgPSAwCgl9CglpZiB2ID4gMjU1IHsKCQl2ID0gMjU1Cgl9Cgljb25zdCBkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXJldHVybiBzdHJpbmcoZGlnaXRzW3YvMTZdKSArIHN0cmluZyhkaWdpdHNbdiUxNl0pCn0KCmZ1bmMgY2xhbXBCeXRlKHYgZmxvYXQ2NCkgaW50IHsKCWl2IDo9IGludCh2KQoJaWYgaXYgPCAwIHsKCQlyZXR1cm4gMAoJfQoJaWYgaXYgPiAyNTUgewoJCXJldHVybiAyNTUKCX0KCXJldHVybiBpdgp9CgpmdW5jIGxpZ2h0ZW4oaGV4IHN0cmluZywgYW10IGZsb2F0NjQpIHN0cmluZyB7CglyLCBnLCBiIDo9IGhleFRvUkdCKGhleCkKCW5yIDo9IGNsYW1wQnl0ZShmbG9hdDY0KHIpICsgKDI1NS1mbG9hdDY0KHIpKSphbXQpCgluZyA6PSBjbGFtcEJ5dGUoZmxvYXQ2NChnKSArICgyNTUtZmxvYXQ2NChnKSkqYW10KQoJbmIgOj0gY2xhbXBCeXRlKGZsb2F0NjQoYikgKyAoMjU1LWZsb2F0NjQoYikpKmFtdCkKCXJldHVybiByZ2JUb0hleChuciwgbmcsIG5iKQp9CgpmdW5jIG1peEhleChoZXgsIHRhcmdldCBzdHJpbmcsIGFtdCBmbG9hdDY0KSBzdHJpbmcgewoJcjEsIGcxLCBiMSA6PSBoZXhUb1JHQihoZXgpCglyMiwgZzIsIGIyIDo9IGhleFRvUkdCKHRhcmdldCkKCW5yIDo9IGNsYW1wQnl0ZShmbG9hdDY0KHIxKSArIGZsb2F0NjQocjItcjEpKmFtdCkKCW5nIDo9IGNsYW1wQnl0ZShmbG9hdDY0KGcxKSArIGZsb2F0NjQoZzItZzEpKmFtdCkKCW5iIDo9IGNsYW1wQnl0ZShmbG9hdDY0KGIxKSArIGZsb2F0NjQoYjItYjEpKmFtdCkKCXJldHVybiByZ2JUb0hleChuciwgbmcsIG5iKQp9CgpmdW5jIGh1ZVJvdGF0ZShoZXggc3RyaW5nLCBkZWcgZmxvYXQ2NCkgc3RyaW5nIHsKCWMsIHNuIDo9IG1hdGguQ29zKGRlZyptYXRoLlBpLzE4MCksIG1hdGguU2luKGRlZyptYXRoLlBpLzE4MCkKCXIsIGcsIGIgOj0gaGV4VG9SR0IoaGV4KQoJZnIsIGZnLCBmYiA6PSBmbG9hdDY0KHIpLCBmbG9hdDY0KGcpLCBmbG9hdDY0KGIpCgluciA6PSAoMC4yMTMrYyowLjc4Ny1zbiowLjIxMykqZnIgKyAoMC43MTUtYyowLjcxNS1zbiowLjcxNSkqZmcgKyAoMC4wNzItYyowLjA3MitzbiowLjkyOCkqZmIKCW5nIDo9ICgwLjIxMy1jKjAuMjEzK3NuKjAuMTQzKSpmciArICgwLjcxNStjKjAuMjg1K3NuKjAuMTQwKSpmZyArICgwLjA3Mi1jKjAuMDcyLXNuKjAuMjgzKSpmYgoJbmIgOj0gKDAuMjEzLWMqMC4yMTMtc24qMC43ODcpKmZyICsgKDAuNzE1LWMqMC43MTUrc24qMC43MTUpKmZnICsgKDAuMDcyK2MqMC45Mjgrc24qMC4wNzIpKmZiCglyZXR1cm4gcmdiVG9IZXgoY2xhbXBCeXRlKG5yKSwgY2xhbXBCeXRlKG5nKSwgY2xhbXBCeXRlKG5iKSkKfQoKZnVuYyBzaGFkZVNlcmllcyhoZXggc3RyaW5nLCBuIGludCwgbG8sIGhpIGZsb2F0NjQpIFtdc3RyaW5nIHsKCXIsIGcsIGIgOj0gaGV4VG9SR0IoaGV4KQoJb3V0IDo9IG1ha2UoW11zdHJpbmcsIG4pCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl0IDo9IGxvCgkJaWYgbiA+IDEgewoJCQl0ID0gbG8gKyAoaGktbG8pKmZsb2F0NjQoaSkvZmxvYXQ2NChuLTEpCgkJfQoJCW91dFtpXSA9IHJnYlRvSGV4KGNsYW1wQnl0ZShmbG9hdDY0KHIpKnQpLCBjbGFtcEJ5dGUoZmxvYXQ2NChnKSp0KSwgY2xhbXBCeXRlKGZsb2F0NjQoYikqdCkpCgl9CglyZXR1cm4gb3V0Cn0KCnR5cGUgcHJuZyBzdHJ1Y3QgewoJc2VlZCBzdHJpbmcKCW4gICAgaW50Cn0KCmZ1bmMgbmV3UFJORyhzZWVkIHN0cmluZykgKnBybmcgeyByZXR1cm4gJnBybmd7c2VlZDogc2VlZH0gfQoKZnVuYyAocCAqcHJuZykgbmV4dCgpIHVpbnQ2NCB7CglwLm4rKwoJbWF0ZXJpYWwgOj0gcC5zZWVkICsgIjoiICsgaXRvYShpbnQ2NChwLm4pKSAvLyBzYW1lIGJ5dGVzIGFzICIlczolZCIKCXN1bSA6PSBzaGEyNTYuU3VtMjU2KFtdYnl0ZShtYXRlcmlhbCkpCgl2YXIgdiB1aW50NjQKCWZvciBpIDo9IDA7IGkgPCA4OyBpKysgewoJCXYgPSB2PDw4IHwgdWludDY0KHN1bVtpXSkKCX0KCXJldHVybiB2Cn0KCmZ1bmMgKHAgKnBybmcpIGZsb2F0SW4obG8sIGhpIGZsb2F0NjQpIGZsb2F0NjQgewoJZnJhYyA6PSBmbG9hdDY0KHAubmV4dCgpJTEwMDAwMDApIC8gMTAwMDAwMC4wCglyZXR1cm4gbG8gKyBmcmFjKihoaS1sbykKfQoKZnVuYyAocCAqcHJuZykgaW50bihuIGludCkgaW50IHsKCWlmIG4gPD0gMSB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBpbnQocC5uZXh0KCkgJSB1aW50NjQobikpCn0KCnR5cGUgcHQgc3RydWN0eyB4LCB5IGZsb2F0NjQgfQoKZnVuYyBwb2x5UGF0aChwdHMgW11wdCkgc3RyaW5nIHsKCXMgOj0gIk0iCglmb3IgaSwgcCA6PSByYW5nZSBwdHMgewoJCWlmIGkgPiAwIHsKCQkJcyArPSAiIEwiCgkJfQoJCXMgKz0gZm51bShwLngpICsgIiwiICsgZm51bShwLnkpCgl9CglyZXR1cm4gcyArICIgWiIKfQoKZnVuYyBwb2x5Z29uUG9pbnRzKHB0cyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiIgoJZm9yIGksIHAgOj0gcmFuZ2UgcHRzIHsKCQlpZiBpID4gMCB7CgkJCXMgKz0gIiAiCgkJfQoJCXMgKz0gZm51bShwLngpICsgIiwiICsgZm51bShwLnkpCgl9CglyZXR1cm4gcwp9Cgp0eXBlIGdzdG9wIHN0cnVjdCB7CglwY3QgICBmbG9hdDY0Cgljb2xvciBzdHJpbmcKCW9wICAgIGZsb2F0NjQKfQoKdHlwZSBncmFtcCBzdHJ1Y3QgewoJeDEsIHkxLCB4MiwgeTIgZmxvYXQ2NAoJc3RvcHMgICAgICAgICAgW11nc3RvcAp9CgpmdW5jIChnIGdyYW1wKSBzYW1wbGUocHgsIHB5IGZsb2F0NjQpIChzdHJpbmcsIGZsb2F0NjQpIHsKCWR4LCBkeSA6PSBnLngyLWcueDEsIGcueTItZy55MQoJdCA6PSAoKHB4LWcueDEpKmR4ICsgKHB5LWcueTEpKmR5KSAvIChkeCpkeCArIGR5KmR5KSAqIDEwMAoJaWYgdCA8IDAgewoJCXQgPSAwCgl9CglpZiB0ID4gMTAwIHsKCQl0ID0gMTAwCgl9Cglmb3IgaSA6PSAxOyBpIDwgbGVuKGcuc3RvcHMpOyBpKysgewoJCWlmIHQgPD0gZy5zdG9wc1tpXS5wY3QgewoJCQlhLCBiIDo9IGcuc3RvcHNbaS0xXSwgZy5zdG9wc1tpXQoJCQlmIDo9ICh0IC0gYS5wY3QpIC8gKGIucGN0IC0gYS5wY3QpCgkJCXJldHVybiBtaXhIZXgoYS5jb2xvciwgYi5jb2xvciwgZiksIGEub3AgKyAoYi5vcC1hLm9wKSpmCgkJfQoJfQoJbGFzdCA6PSBnLnN0b3BzW2xlbihnLnN0b3BzKS0xXQoJcmV0dXJuIGxhc3QuY29sb3IsIGxhc3Qub3AKfQoKZnVuYyBjZW50cm9pZChwb2x5IFtdcHQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CgljeCwgY3kgOj0gMC4wLCAwLjAKCWZvciBfLCBwIDo9IHJhbmdlIHBvbHkgewoJCWN4ICs9IHAueAoJCWN5ICs9IHAueQoJfQoJcmV0dXJuIGN4IC8gZmxvYXQ2NChsZW4ocG9seSkpLCBjeSAvIGZsb2F0NjQobGVuKHBvbHkpKQp9Cgp0eXBlIGZhY2V0U3R5bGUgc3RydWN0IHsKCWZsYXNoICAgIGdyYW1wCglyaW5nQ2VudCBbXXB0Cglwcm9mICAgICBmaXJlUHJvZmlsZQoJem9uZSAgICAgKnBybmcgLy8gcGVyLWZhY2V0IGh1ZSBkcmlmdCBhbmQgc2hhZGUgaml0dGVyLCBzZWVkZWQgcGVyIHRva2VuCglzdG9uZSAgICBzdHJpbmcgLy8gd2hpY2ggY3J5c3RhbCBoYWJpdCBhIFJhdyBDcnlzdGFsIHRha2VzCgl0aHVtYiBib29sCglnbGludHMgc3RyaW5nCn0KCnR5cGUgZmlyZVByb2ZpbGUgc3RydWN0IHsKCXNhdCwgaGl0ICBmbG9hdDY0CglwaW5wb2ludHMgaW50CglzaGFkb3cgICAgc3RyaW5nCglib2R5TWl4ICAgZmxvYXQ2NAoJbmV1dHJhbCAgIHN0cmluZwp9CgpmdW5jIGZpcmVQcm9maWxlRm9yKHN0b25lLCBjb2xvck5hbWUgc3RyaW5nKSBmaXJlUHJvZmlsZSB7CglpZiBzdG9uZSA9PSAiRGlhbW9uZCIgewoJCXN3aXRjaCBjb2xvck5hbWUgewoJCWNhc2UgIkNvbG9ybGVzcyI6CgkJCXJldHVybiBmaXJlUHJvZmlsZXsxLjAsIDAuODUsIDUsICIjMGQxMjIyIiwgMC4xMiwgIiNmNGY3ZmMifQoJCWNhc2UgIkJsYWNrIjoKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuMTUsIDAuMzUsIDEsICIjMDAwMDAwIiwgMCwgIiJ9CgkJfQoJCXJldHVybiBmaXJlUHJvZmlsZXswLjk1LCAwLjcsIDQsICIjMGIwZDE4IiwgMCwgIiJ9Cgl9CglpZiBzdG9uZSA9PSAiUXVhcnR6IiB7CgkJaWYgY29sb3JOYW1lID09ICJSb2NrIENyeXN0YWwiIHsKCQkJcmV0dXJuIGZpcmVQcm9maWxlezAuNCwgMC42LCAzLCAiIzE0MWEyYyIsIDAuMjUsICIjZThlZGY0In0KCQl9CgkJcmV0dXJuIGZpcmVQcm9maWxlezAuMzUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiQ29sb3JsZXNzIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43LCA0LCAiIzE0MWEyYyIsIDAuNTUsICIjZGZlNGVlIn0KCX0KCWlmIGNvbG9yTmFtZSA9PSAiV2hpdGUiIHsKCQlyZXR1cm4gZmlyZVByb2ZpbGV7MC44NSwgMC42LCAzLCAiIzdkODZhMCIsIDAsICIifQoJfQoJaWYgY29sb3JOYW1lID09ICJDcnlzdGFsIiB7CgkJcmV0dXJuIGZpcmVQcm9maWxlezEuMCwgMC43OCwgNCwgIiMxNDFhMmMiLCAwLjMsICIjZTRlOWYyIn0KCX0KCWlmIHN0b25lID09ICJUb3BheiIgewoJCXJldHVybiBmaXJlUHJvZmlsZXswLjUsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KCX0KCXJldHVybiBmaXJlUHJvZmlsZXswLjcsIDAuNSwgMywgIiMwMDAwMDAiLCAwLCAiIn0KfQoKY29uc3QgZmlyZVpvbmVEZWcgPSA3LjAKCnR5cGUgcmdiSSBzdHJ1Y3R7IHIsIGcsIGIgaW50IH0KCmZ1bmMgdG9SR0JJKGhleCBzdHJpbmcpIHJnYkkgeyByLCBnLCBiIDo9IGhleFRvUkdCKGhleCk7IHJldHVybiByZ2JJe3IsIGcsIGJ9IH0KCmZ1bmMgKGMgcmdiSSkgaGV4KCkgc3RyaW5nIHsgcmV0dXJuIHJnYlRvSGV4KGMuciwgYy5nLCBjLmIpIH0KCmZ1bmMgbWl4SShhLCBiIHJnYkksIGFtdCBmbG9hdDY0KSByZ2JJIHsKCXJldHVybiByZ2JJewoJCWNsYW1wQnl0ZShmbG9hdDY0KGEucikgKyBmbG9hdDY0KGIuci1hLnIpKmFtdCksCgkJY2xhbXBCeXRlKGZsb2F0NjQoYS5nKSArIGZsb2F0NjQoYi5nLWEuZykqYW10KSwKCQljbGFtcEJ5dGUoZmxvYXQ2NChhLmIpICsgZmxvYXQ2NChiLmItYS5iKSphbXQpLAoJfQp9CgpmdW5jIGh1ZVJvdGF0ZUkoeCByZ2JJLCBkZWcgZmxvYXQ2NCkgcmdiSSB7CgljLCBzbiA6PSBtYXRoLkNvcyhkZWcqbWF0aC5QaS8xODApLCBtYXRoLlNpbihkZWcqbWF0aC5QaS8xODApCglmciwgZmcsIGZiIDo9IGZsb2F0NjQoeC5yKSwgZmxvYXQ2NCh4LmcpLCBmbG9hdDY0KHguYikKCW5yIDo9ICgwLjIxMytjKjAuNzg3LXNuKjAuMjEzKSpmciArICgwLjcxNS1jKjAuNzE1LXNuKjAuNzE1KSpmZyArICgwLjA3Mi1jKjAuMDcyK3NuKjAuOTI4KSpmYgoJbmcgOj0gKDAuMjEzLWMqMC4yMTMrc24qMC4xNDMpKmZyICsgKDAuNzE1K2MqMC4yODUrc24qMC4xNDApKmZnICsgKDAuMDcyLWMqMC4wNzItc24qMC4yODMpKmZiCgluYiA6PSAoMC4yMTMtYyowLjIxMy1zbiowLjc4NykqZnIgKyAoMC43MTUtYyowLjcxNStzbiowLjcxNSkqZmcgKyAoMC4wNzIrYyowLjkyOCtzbiowLjA3MikqZmIKCXJldHVybiByZ2JJe2NsYW1wQnl0ZShuciksIGNsYW1wQnl0ZShuZyksIGNsYW1wQnl0ZShuYil9Cn0KCmZ1bmMgaGV4M0koeCByZ2JJKSBzdHJpbmcgewoJZCA6PSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXEgOj0gZnVuYyh2IGludCkgYnl0ZSB7IHJldHVybiBkWyh2KzgpKjE1LzI1NSUxNl0gfQoJcmV0dXJuICIjIiArIHN0cmluZyhbXWJ5dGV7cSh4LnIpLCBxKHguZyksIHEoeC5iKX0pCn0KCnZhciB3aGl0ZUkgPSByZ2JJezI1NSwgMjU1LCAyNTV9CgpmdW5jIGRhcmtlbihoZXgsIHNoYWRvdyBzdHJpbmcsIGFtdCBmbG9hdDY0KSBzdHJpbmcgewoJaWYgYW10ID4gMC45NSB7CgkJYW10ID0gMC45NQoJfQoJcmV0dXJuIG1peEhleChoZXgsIHNoYWRvdywgYW10KQp9Cgpjb25zdCBwcmlzbUZsYXNoID0gdHJ1ZQoKZnVuYyBmbGFzaFJhbXAoZXh0LCBzYXQgZmxvYXQ2NCkgZ3JhbXAgewoJciA6PSBncmFtcHt4MTogc3VialggLSBleHQsIHkxOiBzdWJqWSAtIGV4dCwgeDI6IHN1YmpYICsgZXh0LCB5Mjogc3VialkgKyBleHR9CglpZiAhcHJpc21GbGFzaCB7CgkJci5zdG9wcyA9IFtdZ3N0b3B7ezAsICIjZmZmZmZmIiwgMX0sIHsxMDAsICIjZmZmZmZmIiwgMC4yNX19CgkJcmV0dXJuIHIKCX0KCXIuc3RvcHMgPSBbXWdzdG9wewoJCXswLCAiI2ZmZmZmZiIsIDF9LCB7MTQsICIjZmY0MDQwIiwgMC45NX0sIHsyOCwgIiNmZjlhMWYiLCAwLjk1fSwgezQyLCAiI2ZmZTgxZiIsIDAuOX0sCgkJezU2LCAiIzM1ZmY3YSIsIDAuODV9LCB7NzAsICIjMjJjY2ZmIiwgMC44fSwgezg0LCAiIzU1NjZmZiIsIDAuNzV9LCB7MTAwLCAiI2MwNGRmZiIsIDAuN30sCgl9Cglmb3IgaSA6PSByYW5nZSByLnN0b3BzIHsKCQlyLnN0b3BzW2ldLmNvbG9yID0gbWl4SGV4KHIuc3RvcHNbaV0uY29sb3IsICIjZmZmZmZmIiwgMS1zYXQpCgl9CglyZXR1cm4gcgp9Cgp0eXBlIHYzIHN0cnVjdHsgeCwgeSwgeiBmbG9hdDY0IH0KCmZ1bmMgdnN1YihhLCBiIHYzKSB2MyAgICAgICB7IHJldHVybiB2M3thLnggLSBiLngsIGEueSAtIGIueSwgYS56IC0gYi56fSB9CmZ1bmMgdmRvdChhLCBiIHYzKSBmbG9hdDY0ICB7IHJldHVybiBhLngqYi54ICsgYS55KmIueSArIGEueipiLnogfQpmdW5jIHZjcm9zcyhhLCBiIHYzKSB2MyAgICAgeyByZXR1cm4gdjN7YS55KmIueiAtIGEueipiLnksIGEueipiLnggLSBhLngqYi56LCBhLngqYi55IC0gYS55KmIueH0gfQpmdW5jIHZzY2FsZShhIHYzLCBrIGZsb2F0NjQpIHYzIHsgcmV0dXJuIHYze2EueCAqIGssIGEueSAqIGssIGEueiAqIGt9IH0KZnVuYyB2bm9ybShhIHYzKSB2MyB7CglsIDo9IG1hdGguU3FydCh2ZG90KGEsIGEpKQoJaWYgbCA9PSAwIHsKCQlyZXR1cm4gYQoJfQoJcmV0dXJuIHYze2EueCAvIGwsIGEueSAvIGwsIGEueiAvIGx9Cn0KCmZ1bmMgc2duUG93KHYsIGUgZmxvYXQ2NCkgZmxvYXQ2NCB7CglpZiB2IDwgMCB7CgkJcmV0dXJuIC1tYXRoLlBvdygtdiwgZSkKCX0KCXJldHVybiBtYXRoLlBvdyh2LCBlKQp9Cgp0eXBlIG91dGxpbmVGbiBmdW5jKHQgZmxvYXQ2NCkgKGZsb2F0NjQsIGZsb2F0NjQpCgpmdW5jIGNpcmNsZU91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCXJldHVybiBtYXRoLkNvcyhhKSwgbWF0aC5TaW4oYSkKfQoKZnVuYyBzdXBlck91dGxpbmUocCBmbG9hdDY0KSBvdXRsaW5lRm4gewoJcmV0dXJuIGZ1bmModCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJCWEgOj0gMiAqIG1hdGguUGkgKiB0CgkJcmV0dXJuIHNnblBvdyhtYXRoLkNvcyhhKSwgMi9wKSwgc2duUG93KG1hdGguU2luKGEpLCAyL3ApCgl9Cn0KCmZ1bmMgcG9seU91dGxpbmUodnMgW11wdCkgb3V0bGluZUZuIHsKCXJldHVybiBmdW5jKHQgZmxvYXQ2NCkgKGZsb2F0NjQsIGZsb2F0NjQpIHsKCQluIDo9IGxlbih2cykKCQlmIDo9IHQgKiBmbG9hdDY0KG4pCgkJayA6PSBpbnQobWF0aC5GbG9vcihmKSkKCQlmciA6PSBmIC0gZmxvYXQ2NChrKQoJCWEgOj0gdnNbKChrJW4pK24pJW5dCgkJYiA6PSB2c1soKChrKzEpJW4pK24pJW5dCgkJcmV0dXJuIGEueCArIChiLngtYS54KSpmciwgYS55ICsgKGIueS1hLnkpKmZyCgl9Cn0KCmZ1bmMgb2N0YWdvbihodywgaGgsIGMgZmxvYXQ2NCkgW11wdCB7CglyZXR1cm4gW11wdHsKCQl7aHcgLSBjLCBoaH0sIHstaHcgKyBjLCBoaH0sIHstaHcsIGhoIC0gY30sIHstaHcsIC1oaCArIGN9LAoJCXstaHcgKyBjLCAtaGh9LCB7aHcgLSBjLCAtaGh9LCB7aHcsIC1oaCArIGN9LCB7aHcsIGhoIC0gY30sCgl9Cn0KCmZ1bmMgcGVhck91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJYSA6PSAyICogbWF0aC5QaSAqIHQKCWMgOj0gbWF0aC5Db3MoYSkKCXJldHVybiBjKjAuOTIgKyAwLjA4LCAwLjcgKiBtYXRoLlNpbihhKSAqICgxIC0gMC40NipjKQp9CgpmdW5jIG1hcnF1aXNlT3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJcmV0dXJuIG1hdGguQ29zKGEpLCAwLjUyICogc2duUG93KG1hdGguU2luKGEpLCAxLjM1KQp9CgpmdW5jIGhlYXJ0T3V0bGluZSh0IGZsb2F0NjQpIChmbG9hdDY0LCBmbG9hdDY0KSB7CglhIDo9IDIgKiBtYXRoLlBpICogdAoJc24gOj0gbWF0aC5TaW4oYSkKCXkgOj0gKDEzKm1hdGguQ29zKGEpIC0gNCptYXRoLkNvcygyKmEpIC0gMS40Km1hdGguQ29zKDMqYSkgLSAwLjUqbWF0aC5Db3MoNCphKSkgLyAxNwoJcmV0dXJuIDAuODgqc24qc24qc24gKyAwLjEyKnNuLCAoeSArIDAuMTU3NikgLyAwLjc4OTQKfQoKZnVuYyB0cmlsbGlvbk91dGxpbmUodCBmbG9hdDY0KSAoZmxvYXQ2NCwgZmxvYXQ2NCkgewoJdnMgOj0gW11wdHt7MCwgMX0sIHstMC44NjYsIC0wLjV9LCB7MC44NjYsIC0wLjV9fQoJZiA6PSB0ICogMwoJayA6PSBpbnQobWF0aC5GbG9vcihmKSkKCWZyIDo9IGYgLSBmbG9hdDY0KGspCglhLCBiIDo9IHZzWygoayUzKSszKSUzXSwgdnNbKCgoaysxKSUzKSszKSUzXQoJYnVsZ2UgOj0gMSArIDAuMTYqbWF0aC5TaW4obWF0aC5QaSpmcikKCXJldHVybiAoYS54ICsgKGIueC1hLngpKmZyKSAqIGJ1bGdlLCAoYS55ICsgKGIueS1hLnkpKmZyKSAqIGJ1bGdlCn0KCnR5cGUgY3V0U3BlYyBzdHJ1Y3QgewoJbiAgICAgICAgIGludAoJYnJpbGxpYW50IGJvb2wKCW91dGxpbmUgICBvdXRsaW5lRm4KCXJ4LCByeSAgICBmbG9hdDY0Cn0KCnZhciBTaGFwZU5hbWVzID0gW11zdHJpbmd7CgkiUm91bmQgQnJpbGxpYW50IiwgIk92YWwiLCAiQ3VzaGlvbiIsICJFbWVyYWxkIEN1dCIsICJBc3NjaGVyIiwKCSJSYWRpYW50IiwgIlByaW5jZXNzIEN1dCIsICJQZWFyIiwgIk1hcnF1aXNlIiwgIlRyaWxsaW9uIiwKCSJIZWFydCIsICJSb3NlIEN1dCIsICJSYXcgQ3J5c3RhbCIsCn0KCmNvbnN0ICgKCXNoYXBlSGVhcnQgPSAxMAoJc2hhcGVSb3NlICA9IDExCglzaGFwZVJhdyAgID0gMTIKKQoKY29uc3Qgc3RvbmVTY2FsZSA9IDAuNzgKCmZ1bmMgY3V0Rm9yKHNoYXBlSWR4IGludCkgY3V0U3BlYyB7CgljIDo9IGN1dEZvclVuc2NhbGVkKHNoYXBlSWR4KQoJYy5yeCwgYy5yeSA9IGMucngqc3RvbmVTY2FsZSwgYy5yeSpzdG9uZVNjYWxlCglyZXR1cm4gYwp9CgpmdW5jIGN1dEZvclVuc2NhbGVkKHNoYXBlSWR4IGludCkgY3V0U3BlYyB7Cglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSAxOgoJCXJldHVybiBjdXRTcGVjezgsIHRydWUsIGNpcmNsZU91dGxpbmUsIDMwLCAyMS41fQoJY2FzZSAyOgoJCXJldHVybiBjdXRTcGVjezgsIHRydWUsIHN1cGVyT3V0bGluZSgzLjQpLCAyNywgMjR9CgljYXNlIDM6CgkJcmV0dXJuIGN1dFNwZWN7OCwgZmFsc2UsIHBvbHlPdXRsaW5lKG9jdGFnb24oMSwgMSwgMC4zKSksIDMwLCAyMX0KCWNhc2UgNDoKCQlyZXR1cm4gY3V0U3BlY3s4LCBmYWxzZSwgcG9seU91dGxpbmUob2N0YWdvbigxLCAxLCAwLjM2KSksIDI1LCAyNX0KCWNhc2UgNToKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShvY3RhZ29uKDEsIDEsIDAuMykpLCAyOSwgMjIuNX0KCWNhc2UgNjoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBwb2x5T3V0bGluZShbXXB0e3sxLCAxfSwgezAsIDF9LCB7LTEsIDF9LCB7LTEsIDB9LCB7LTEsIC0xfSwgezAsIC0xfSwgezEsIC0xfSwgezEsIDB9fSksIDIzLjUsIDIzLjV9CgljYXNlIDc6CgkJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgcGVhck91dGxpbmUsIDMxLCAyN30KCWNhc2UgODoKCQlyZXR1cm4gY3V0U3BlY3s4LCB0cnVlLCBtYXJxdWlzZU91dGxpbmUsIDMzLCAzMH0KCWNhc2UgOToKCQlyZXR1cm4gY3V0U3BlY3s5LCB0cnVlLCB0cmlsbGlvbk91dGxpbmUsIDI3LCAyN30KCWNhc2Ugc2hhcGVIZWFydDoKCQlyZXR1cm4gY3V0U3BlY3sxMCwgdHJ1ZSwgaGVhcnRPdXRsaW5lLCAyOSwgMjh9CgljYXNlIHNoYXBlUm9zZToKCQlyZXR1cm4gY3V0U3BlY3s2LCB0cnVlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9CgljYXNlIHNoYXBlUmF3OgoJCXJldHVybiBjdXRTcGVjezAsIGZhbHNlLCBjaXJjbGVPdXRsaW5lLCAyNywgMjd9IC8vIHNpemVkIHBlciBzdG9uZSBpbiBidWlsZFJhdwoJfQoJcmV0dXJuIGN1dFNwZWN7OCwgdHJ1ZSwgY2lyY2xlT3V0bGluZSwgMjcsIDI3fQp9CgpmdW5jIEN1dHNGb3JTdG9uZShzdG9uZSBzdHJpbmcpIFtdaW50IHsKCXN3aXRjaCBzdG9uZSB7CgljYXNlICJEaWFtb25kIjoKCQlyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlNhcHBoaXJlIjoKCQlyZXR1cm4gW11pbnR7MSwgMiwgMCwgMywgNywgc2hhcGVIZWFydCwgOCwgOSwgNiwgc2hhcGVSb3NlLCBzaGFwZVJhd30KCWNhc2UgIlRvcGF6IjoKCQlyZXR1cm4gW11pbnR7MywgMSwgNywgMiwgOCwgMCwgOSwgc2hhcGVIZWFydCwgNiwgc2hhcGVSYXd9Cgl9CglyZXR1cm4gW11pbnR7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgc2hhcGVIZWFydCwgc2hhcGVSb3NlLCBzaGFwZVJhd30KfQoKY29uc3QgKAoJa0Nyb3duID0gaW90YQoJa1RhYmxlCglrUGF2CikKCnR5cGUgZmFjZSBzdHJ1Y3QgewoJcCAgICBbXXYzCglraW5kIGludAp9CgpmdW5jIHJpbmdQdHMoYyBjdXRTcGVjLCBuIGludCwgc2NhbGUsIHosIG9mZiBmbG9hdDY0KSBbXXYzIHsKCW91dCA6PSBtYWtlKFtddjMsIG4pCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQl4LCB5IDo9IGMub3V0bGluZSgoZmxvYXQ2NChrKSArIG9mZikgLyBmbG9hdDY0KG4pKQoJCW91dFtrXSA9IHYze3ggKiBjLnJ4ICogc2NhbGUsIHkgKiBjLnJ5ICogc2NhbGUsIHp9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYnVpbGRDdXQoYyBjdXRTcGVjKSAoZmFjZXMgW11mYWNlLCBnaXJkbGUgW112MykgewoJYmFzZSA6PSBjLnJ4CglpZiBjLnJ5IDwgYmFzZSB7CgkJYmFzZSA9IGMucnkKCX0KCWhjLCBocCA6PSAwLjM0KmJhc2UsIDAuOSpiYXNlCgluIDo9IGMubgoJaWYgYy5icmlsbGlhbnQgewoJCVQgOj0gcmluZ1B0cyhjLCBuLCAwLjU2LCBoYywgMCkKCQlCIDo9IHJpbmdQdHMoYywgbiwgMC44LCBoYyowLjQ2LCAwLjUpCgkJRyA6PSByaW5nUHRzKGMsIDIqbiwgMSwgMCwgMCkKCQljdWxldCA6PSB2M3swLCAwLCAtaHB9CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCQlmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQkJazEgOj0gKGsgKyAxKSAlIG4KCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tUW2tdLCBCW2tdLCBUW2sxXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7VFtrMV0sIEJba10sIEdbKDIqaysyKSUoMipuKV0sIEJbazFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tCW2tdLCBHWzIqa10sIEdbMiprKzFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tCW2tdLCBHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXX0sIGtDcm93bn0pCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7R1syKmtdLCBHWzIqaysxXSwgR1soMiprKzIpJSgyKm4pXSwgY3VsZXR9LCBrUGF2fSkKCQl9CgkJcmV0dXJuIGZhY2VzLCBHCgl9CglUIDo9IHJpbmdQdHMoYywgbiwgMC41NCwgaGMsIDApCglTIDo9IHJpbmdQdHMoYywgbiwgMC43OCwgaGMqMC41LCAwKQoJRyA6PSByaW5nUHRzKGMsIG4sIDEsIDAsIDApCglQMSA6PSByaW5nUHRzKGMsIG4sIDAuNywgLWhwKjAuNDIsIDApCglQMiA6PSByaW5nUHRzKGMsIG4sIDAuMzgsIC1ocCowLjc4LCAwKQoJSyA6PSByaW5nUHRzKGMsIG4sIDAuMSwgLWhwLCAwKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7VCwga1RhYmxlfSkKCXJvd3MgOj0gW11bMl1bXXYze3tULCBTfSwge1MsIEd9fQoJZm9yIF8sIHIgOj0gcmFuZ2Ugcm93cyB7CgkJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJCWsxIDo9IChrICsgMSkgJSBuCgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7clswXVtrXSwgclswXVtrMV0sIHJbMV1bazFdLCByWzFdW2tdfSwga0Nyb3dufSkKCQl9Cgl9Cglwcm93IDo9IFtdWzJdW112M3t7RywgUDF9LCB7UDEsIFAyfSwge1AyLCBLfX0KCWZvciBfLCByIDo9IHJhbmdlIHByb3cgewoJCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCQlrMSA6PSAoayArIDEpICUgbgoJCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze3JbMF1ba10sIHJbMF1bazFdLCByWzFdW2sxXSwgclsxXVtrXX0sIGtQYXZ9KQoJCX0KCX0KCXJldHVybiBmYWNlcywgRwp9CgpmdW5jIGJ1aWxkUm9zZShjIGN1dFNwZWMpIChmYWNlcyBbXWZhY2UsIGdpcmRsZSBbXXYzKSB7CgluIDo9IGMubgoJYmFzZSA6PSBtYXRoLk1pbihjLnJ4LCBjLnJ5KQoJaCA6PSAwLjYyICogYmFzZQoJYXBleCA6PSB2M3swLCAwLCBofQoJUiA6PSByaW5nUHRzKGMsIG4sIDAuNTUsIGgqMC42MiwgMC41KQoJRyA6PSByaW5nUHRzKGMsIDIqbiwgMSwgMCwgMCkKCWZvciBrIDo9IDA7IGsgPCBuOyBrKysgewoJCWsxIDo9IChrICsgMSkgJSBuCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3thcGV4LCBSW2tdLCBSW2sxXX0sIGtDcm93bn0pCgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tHWzIqa10sIEdbMiprKzFdLCBSW2tdfSwga0Nyb3dufSkKCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze0dbMiprKzFdLCBHWygyKmsrMiklKDIqbildLCBSW2tdfSwga0Nyb3dufSkKCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgZmFjZXtbXXYze1Jba10sIEdbKDIqaysyKSUoMipuKV0sIFJbazFdfSwga0Nyb3dufSkKCX0KCWJhY2sgOj0gbWFrZShbXXYzLCBsZW4oRykpCglmb3IgaSA6PSByYW5nZSBHIHsKCQliYWNrW2xlbihHKS0xLWldID0gR1tpXQoJfQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7YmFjaywga1Bhdn0pCglyZXR1cm4gZmFjZXMsIEcKfQoKZnVuYyByaW5nWChuIGludCwgeCwgcnksIHJ6LCBwaGFzZSBmbG9hdDY0KSBbXXYzIHsKCW91dCA6PSBtYWtlKFtddjMsIG4pCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQlhIDo9IDIqbWF0aC5QaSooZmxvYXQ2NChrKStwaGFzZSkvZmxvYXQ2NChuKSArIG1hdGguUGkvMgoJCW91dFtrXSA9IHYze3gsIHJ5ICogbWF0aC5Db3MoYSksIHJ6ICogbWF0aC5TaW4oYSl9Cgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgYmFuZFgoYSwgYiBbXXYzKSBbXWZhY2UgewoJdmFyIGZzIFtdZmFjZQoJZm9yIGsgOj0gcmFuZ2UgYSB7CgkJazEgOj0gKGsgKyAxKSAlIGxlbihhKQoJCWZzID0gYXBwZW5kKGZzLCBmYWNle1tddjN7YVtrXSwgYVtrMV0sIGJbazFdLCBiW2tdfSwga0Nyb3dufSkKCX0KCXJldHVybiBmcwp9CgpmdW5jIGNhcFgociBbXXYzKSBmYWNlIHsgcmV0dXJuIGZhY2V7ciwga0Nyb3dufSB9CgpmdW5jIHR1cm5GYWNlcyhmcyBbXWZhY2UsIGF4LCBheiBmbG9hdDY0KSBbXWZhY2UgewoJY3gsIHN4LCBjeiwgc3ogOj0gbWF0aC5Db3MoYXgpLCBtYXRoLlNpbihheCksIG1hdGguQ29zKGF6KSwgbWF0aC5TaW4oYXopCglmb3IgaSA6PSByYW5nZSBmcyB7CgkJZnNbaV0ua2luZCA9IGtQYXYKCQlmb3IgaiwgcCA6PSByYW5nZSBmc1tpXS5wIHsKCQkJeSwgeiA6PSBwLnkqY3gtcC56KnN4LCBwLnkqc3grcC56KmN4CgkJCWZzW2ldLnBbal0gPSB2M3twLngqY3ogLSB5KnN6LCBwLngqc3ogKyB5KmN6LCB6fQoJCX0KCX0KCXJldHVybiBmcwp9CgpmdW5jIGJ1aWxkUmF3KHN0b25lIHN0cmluZykgKGZhY2VzIFtdZmFjZSwgZ2lyZGxlIFtddjMpIHsKCWRlZyA6PSBtYXRoLlBpIC8gMTgwCglzd2l0Y2ggc3RvbmUgewoJY2FzZSAiRGlhbW9uZCI6CgkJYSwgYiwgaCA6PSAyNS4wKnN0b25lU2NhbGUsIDIyLjAqc3RvbmVTY2FsZSwgMjMuMCpzdG9uZVNjYWxlCgkJdiA6PSBbXXYze3thLCAwLCAwfSwgezAsIGIsIDB9LCB7LWEsIDAsIDB9LCB7MCwgLWIsIDB9fQoJCXRvcCwgYm90IDo9IHYzezAsIDAsIGh9LCB2M3swLCAwLCAtaH0KCQlmb3IgayA6PSAwOyBrIDwgNDsgaysrIHsKCQkJazEgOj0gKGsgKyAxKSAlIDQKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3t0b3AsIHZba10sIHZbazFdfSwga0Nyb3dufSkKCQkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3tib3QsIHZbazFdLCB2W2tdfSwga0Nyb3dufSkKCQl9CgkJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTM4KmRlZywgMjgqZGVnKSwgbmlsCgljYXNlICJTYXBwaGlyZSI6CgkJTCwgUiA6PSAyNi4wKnN0b25lU2NhbGUsIDE2LjAqc3RvbmVTY2FsZQoJCXIwIDo9IHJpbmdYKDYsIC1MLCBSKjAuNDIsIFIqMC40MiwgMCkKCQlyMSA6PSByaW5nWCg2LCAtTCowLjMsIFIsIFIqMC45NCwgMCkKCQlyMiA6PSByaW5nWCg2LCBMKjAuMywgUiwgUiowLjk0LCAwKQoJCXIzIDo9IHJpbmdYKDYsIEwsIFIqMC40MiwgUiowLjQyLCAwKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMSwgcjIpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMiwgcjMpLi4uKQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBjYXBYKHIzKSkKCQlyZXYgOj0gbWFrZShbXXYzLCA2KQoJCWZvciBpIDo9IHJhbmdlIHIwIHsKCQkJcmV2WzUtaV0gPSByMFtpXQoJCX0KCQlmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJCXJldHVybiB0dXJuRmFjZXMoZmFjZXMsIC0zMCpkZWcsIC0xNCpkZWcpLCBuaWwKCX0KCWlmIHN0b25lID09ICJRdWFydHoiIHsKCQlMLCBSIDo9IDI3LjAqc3RvbmVTY2FsZSwgMTIuNSpzdG9uZVNjYWxlCgkJcjAgOj0gcmluZ1goNiwgLUwsIFIqMS4wNCwgUiwgMCkKCQlyMSA6PSByaW5nWCg2LCBMKjAuNCwgUiwgUiowLjk2LCAwKQoJCXBvaW50IDo9IHYze0wsIDAsIDB9CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGJhbmRYKHIwLCByMSkuLi4pCgkJZm9yIGsgOj0gMDsgayA8IDY7IGsrKyB7CgkJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBmYWNle1tddjN7cjFba10sIHIxWyhrKzEpJTZdLCBwb2ludH0sIGtDcm93bn0pCgkJfQoJCXJldiA6PSBtYWtlKFtddjMsIDYpCgkJZm9yIGkgOj0gcmFuZ2UgcjAgewoJCQlyZXZbNS1pXSA9IHIwW2ldCgkJfQoJCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBjYXBYKHJldikpCgkJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTMyKmRlZywgMTYqZGVnKSwgbmlsCgl9CglMLCByeSwgcnogOj0gMjYuMCpzdG9uZVNjYWxlLCAxNi4wKnN0b25lU2NhbGUsIDEzLjAqc3RvbmVTY2FsZQoJcjAgOj0gcmluZ1goOCwgLUwsIHJ5LCByeiwgMC41KQoJcjEgOj0gcmluZ1goOCwgTCowLjUsIHJ5LCByeiwgMC41KQoJdGlwIDo9IHJpbmdYKDgsIEwqMC44MiwgcnkqMC40NSwgcnoqMC40NSwgMC41KQoJcG9pbnQgOj0gdjN7TCwgMCwgMH0KCWZhY2VzID0gYXBwZW5kKGZhY2VzLCBiYW5kWChyMCwgcjEpLi4uKQoJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGJhbmRYKHIxLCB0aXApLi4uKQoJZm9yIGsgOj0gMDsgayA8IDg7IGsrKyB7CgkJZmFjZXMgPSBhcHBlbmQoZmFjZXMsIGZhY2V7W112M3t0aXBba10sIHRpcFsoaysxKSU4XSwgcG9pbnR9LCBrQ3Jvd259KQoJfQoJcmV2IDo9IG1ha2UoW112MywgOCkKCWZvciBpIDo9IHJhbmdlIHIwIHsKCQlyZXZbNy1pXSA9IHIwW2ldCgl9CglmYWNlcyA9IGFwcGVuZChmYWNlcywgY2FwWChyZXYpKQoJcmV0dXJuIHR1cm5GYWNlcyhmYWNlcywgLTMwKmRlZywgMTIqZGVnKSwgbmlsCn0KCmNvbnN0IHZpZXdUaWx0ID0gNjEuMAoKY29uc3QgKAoJcGllY2VDWSAgID0gc3VialkgKyAxLjUKKQoKZnVuYyBuMSh2IGZsb2F0NjQpIHN0cmluZyB7CgluZWcgOj0gdiA8IDAKCWlmIG5lZyB7CgkJdiA9IC12Cgl9Cgl0IDo9IGludDY0KHYqMTAgKyAwLjUpCgl3LCBmIDo9IHQvMTAsIHQlMTAKCXMgOj0gIiIKCWlmIGYgPT0gMCB7CgkJcyA9IGl0b2EodykKCX0gZWxzZSBpZiB3ID09IDAgewoJCXMgPSAiLiIgKyBzdHJpbmcoYnl0ZSgnMCcrZikpCgl9IGVsc2UgewoJCXMgPSBpdG9hKHcpICsgIi4iICsgc3RyaW5nKGJ5dGUoJzAnK2YpKQoJfQoJaWYgbmVnICYmIHQgIT0gMCB7CgkJcmV0dXJuICItIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgcmVsUGF0aChwcyBbXXB0KSBzdHJpbmcgewoJcyA6PSAiTSIgKyBuMShwc1swXS54KSArICIgIiArIG4xKHBzWzBdLnkpICsgImwiCglweCwgcHkgOj0gbWF0aC5Sb3VuZChwc1swXS54KjEwKS8xMCwgbWF0aC5Sb3VuZChwc1swXS55KjEwKS8xMAoJZm9yIGkgOj0gMTsgaSA8IGxlbihwcyk7IGkrKyB7CgkJcXgsIHF5IDo9IG1hdGguUm91bmQocHNbaV0ueCoxMCkvMTAsIG1hdGguUm91bmQocHNbaV0ueSoxMCkvMTAKCQlkeCwgZHkgOj0gbjEocXgtcHgpLCBuMShxeS1weSkKCQlpZiBpID4gMSAmJiBkeFswXSAhPSAnLScgewoJCQlzICs9ICIgIgoJCX0KCQlzICs9IGR4CgkJaWYgZHlbMF0gIT0gJy0nIHsKCQkJcyArPSAiICIKCQl9CgkJcyArPSBkeQoJCXB4LCBweSA9IHF4LCBxeQoJfQoJcmV0dXJuIHMgKyAieiIKfQoKZnVuYyBoZXgzKGggc3RyaW5nKSBzdHJpbmcgewoJciwgZywgYiA6PSBoZXhUb1JHQihoKQoJZCA6PSAiMDEyMzQ1Njc4OWFiY2RlZiIKCXEgOj0gZnVuYyh2IGludCkgYnl0ZSB7IHJldHVybiBkWyh2KzgpKjE1LzI1NSUxNl0gfQoJcmV0dXJuICIjIiArIHN0cmluZyhbXWJ5dGV7cShyKSwgcShnKSwgcShiKX0pCn0KCmZ1bmMgY29udmV4SHVsbChwcyBbXXB0KSBbXXB0IHsKCW4gOj0gbGVuKHBzKQoJaWR4IDo9IG1ha2UoW11pbnQsIG4pCglmb3IgaSA6PSByYW5nZSBpZHggewoJCWlkeFtpXSA9IGkKCX0KCWxlc3MgOj0gZnVuYyhhLCBiIGludCkgYm9vbCB7CgkJcmV0dXJuIHBzW2FdLnggPCBwc1tiXS54IHx8IChwc1thXS54ID09IHBzW2JdLnggJiYgcHNbYV0ueSA8IHBzW2JdLnkpCgl9Cgl0bXAgOj0gbWFrZShbXWludCwgbikKCWZvciB3IDo9IDE7IHcgPCBuOyB3ICo9IDIgewoJCWZvciBsbyA6PSAwOyBsbyA8IG47IGxvICs9IDIgKiB3IHsKCQkJbWlkLCBoaSA6PSBsbyt3LCBsbysyKncKCQkJaWYgbWlkID4gbiB7CgkJCQltaWQgPSBuCgkJCX0KCQkJaWYgaGkgPiBuIHsKCQkJCWhpID0gbgoJCQl9CgkJCWksIGosIGsgOj0gbG8sIG1pZCwgbG8KCQkJZm9yIGkgPCBtaWQgJiYgaiA8IGhpIHsKCQkJCWlmIGxlc3MoaWR4W2pdLCBpZHhbaV0pIHsKCQkJCQl0bXBba10gPSBpZHhbal0KCQkJCQlqKysKCQkJCX0gZWxzZSB7CgkJCQkJdG1wW2tdID0gaWR4W2ldCgkJCQkJaSsrCgkJCQl9CgkJCQlrKysKCQkJfQoJCQlmb3IgaSA8IG1pZCB7CgkJCQl0bXBba10gPSBpZHhbaV0KCQkJCWkrKwoJCQkJaysrCgkJCX0KCQkJZm9yIGogPCBoaSB7CgkJCQl0bXBba10gPSBpZHhbal0KCQkJCWorKwoJCQkJaysrCgkJCX0KCQl9CgkJaWR4LCB0bXAgPSB0bXAsIGlkeAoJfQoJY3IgOj0gZnVuYyhvLCBhLCBiIHB0KSBmbG9hdDY0IHsgcmV0dXJuIChhLngtby54KSooYi55LW8ueSkgLSAoYS55LW8ueSkqKGIueC1vLngpIH0KCXZhciBoIFtdcHQKCWZvciBwYXNzIDo9IDA7IHBhc3MgPCAyOyBwYXNzKysgewoJCXN0YXJ0IDo9IGxlbihoKQoJCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCQlwIDo9IHBzW2lkeFtpXV0KCQkJaWYgcGFzcyA9PSAxIHsKCQkJCXAgPSBwc1tpZHhbbi0xLWldXQoJCQl9CgkJCWZvciBsZW4oaCkgPj0gc3RhcnQrMiAmJiBjcihoW2xlbihoKS0yXSwgaFtsZW4oaCktMV0sIHApIDw9IDAgewoJCQkJaCA9IGhbOmxlbihoKS0xXQoJCQl9CgkJCWggPSBhcHBlbmQoaCwgcCkKCQl9CgkJaCA9IGhbOmxlbihoKS0xXQoJfQoJcmV0dXJuIGgKfQoKZnVuYyBwb2x5QXJlYShwcyBbXXB0KSBmbG9hdDY0IHsKCWEgOj0gMC4wCglmb3IgaSA6PSByYW5nZSBwcyB7CgkJaiA6PSAoaSArIDEpICUgbGVuKHBzKQoJCWEgKz0gcHNbaV0ueCpwc1tqXS55IC0gcHNbal0ueCpwc1tpXS55Cgl9CglpZiBhIDwgMCB7CgkJcmV0dXJuIC1hIC8gMgoJfQoJcmV0dXJuIGEgLyAyCn0KCmZ1bmMgY2xpcEhhbGYocHMgW11wdCwgb3gsIG95LCBueCwgbnkgZmxvYXQ2NCkgW11wdCB7CglpZiBsZW4ocHMpID09IDAgewoJCXJldHVybiBwcwoJfQoJZCA6PSBmdW5jKHEgcHQpIGZsb2F0NjQgeyByZXR1cm4gKHEueC1veCkqbnggKyAocS55LW95KSpueSB9Cgl2YXIgb3V0IFtdcHQKCWZvciBpIDo9IHJhbmdlIHBzIHsKCQlhLCBiIDo9IHBzW2ldLCBwc1soaSsxKSVsZW4ocHMpXQoJCWRhLCBkYiA6PSBkKGEpLCBkKGIpCgkJaWYgZGEgPD0gMCB7CgkJCW91dCA9IGFwcGVuZChvdXQsIGEpCgkJfQoJCWlmIChkYSA8IDAgJiYgZGIgPiAwKSB8fCAoZGEgPiAwICYmIGRiIDwgMCkgewoJCQl0IDo9IGRhIC8gKGRhIC0gZGIpCgkJCW91dCA9IGFwcGVuZChvdXQsIHB0e2EueCArIChiLngtYS54KSp0LCBhLnkgKyAoYi55LWEueSkqdH0pCgkJfQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIGNsaXBUb0NvbnZleChwcywgd2luIFtdcHQpIFtdcHQgewoJZm9yIGkgOj0gcmFuZ2Ugd2luIHsKCQlhLCBiIDo9IHdpbltpXSwgd2luWyhpKzEpJWxlbih3aW4pXQoJCW54LCBueSA6PSBiLnktYS55LCBhLngtYi54CgkJbWlkIDo9IHB0eyhhLnggKyBiLngpIC8gMiwgKGEueSArIGIueSkgLyAyfQoJCWN4LCBjeSA6PSBjZW50cm9pZCh3aW4pCgkJaWYgKG1pZC54LWN4KSpueCsobWlkLnktY3kpKm55IDwgMCB7CgkJCW54LCBueSA9IC1ueCwgLW55CgkJfQoJCXBzID0gY2xpcEhhbGYocHMsIGEueCwgYS55LCBueCwgbnkpCgkJaWYgbGVuKHBzKSA8IDMgewoJCQlyZXR1cm4gbmlsCgkJfQoJfQoJcmV0dXJuIHBzCn0KCmZ1bmMgc3BsaXRQb2x5KHBzIFtdcHQsIGFuZyBmbG9hdDY0KSAoW11wdCwgW11wdCkgewoJY3gsIGN5IDo9IGNlbnRyb2lkKHBzKQoJbngsIG55IDo9IG1hdGguQ29zKGFuZyksIG1hdGguU2luKGFuZykKCXJldHVybiBjbGlwSGFsZihwcywgY3gsIGN5LCBueCwgbnkpLCBjbGlwSGFsZihwcywgY3gsIGN5LCAtbngsIC1ueSkKfQoKZnVuYyByZW5kZXJTb2xpZDNEKHNoYXBlSWR4IGludCwgYmFzZSwgc2FsdCBzdHJpbmcsIGZzICpmYWNldFN0eWxlKSAodW5kZXIsIGZhY2V0cywgb3ZlciBzdHJpbmcpIHsKCWMgOj0gY3V0Rm9yKHNoYXBlSWR4KQoJdmFyIGZhY2VzIFtdZmFjZQoJdmFyIGdpcmRsZSBbXXYzCglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSBzaGFwZVJvc2U6CgkJZmFjZXMsIGdpcmRsZSA9IGJ1aWxkUm9zZShjKQoJY2FzZSBzaGFwZVJhdzoKCQlmYWNlcywgZ2lyZGxlID0gYnVpbGRSYXcoZnMuc3RvbmUpCglkZWZhdWx0OgoJCWZhY2VzLCBnaXJkbGUgPSBidWlsZEN1dChjKQoJfQoJcmF3IDo9IHNoYXBlSWR4ID09IHNoYXBlUmF3CgoJc2ggOj0gZnMucHJvZi5zaGFkb3cKCWlmIGZzLnByb2YubmV1dHJhbCAhPSAiIiB7CgkJYmFzZSA9IGZzLnByb2YubmV1dHJhbAoJfQoJYmFzZSA9IG1peEhleChiYXNlLCBzaCwgZnMucHJvZi5ib2R5TWl4KQoJZGVlcCA6PSBkYXJrZW4oYmFzZSwgc2gsIDAuOSkKCWJyaWdodCA6PSBsaWdodGVuKGJhc2UsIDAuNSkKCWZzLmZsYXNoID0gZmxhc2hSYW1wKDI4LCBmcy5wcm9mLnNhdCkKCWRlZXBJLCBiYXNlSSwgYnJpZ2h0SSA6PSB0b1JHQkkoZGVlcCksIHRvUkdCSShiYXNlKSwgdG9SR0JJKGJyaWdodCkKCXRvbmVJIDo9IGZ1bmMobHVtIGZsb2F0NjQpIHJnYkkgewoJCWlmIGx1bSA8IDAgewoJCQlsdW0gPSAwCgkJfQoJCWlmIGx1bSA+IDEgewoJCQlsdW0gPSAxCgkJfQoJCWlmIGx1bSA8IDAuNSB7CgkJCXJldHVybiBtaXhJKGRlZXBJLCBiYXNlSSwgbHVtKjIpCgkJfQoJCXJldHVybiBtaXhJKGJhc2VJLCBicmlnaHRJLCAobHVtLTAuNSkqMikKCX0KCXRvbmUgOj0gZnVuYyhsdW0gZmxvYXQ2NCkgc3RyaW5nIHsgcmV0dXJuIHRvbmVJKGx1bSkuaGV4KCkgfQoKCXlhdyA6PSBmcy56b25lLmZsb2F0SW4oLTEzLCAxMykgKiBtYXRoLlBpIC8gMTgwCgl0aCA6PSB2aWV3VGlsdCAqIG1hdGguUGkgLyAxODAKCWN5LCBzeSA6PSBtYXRoLkNvcyh5YXcpLCBtYXRoLlNpbih5YXcpCgljdCwgc3R0IDo9IG1hdGguQ29zKHRoKSwgbWF0aC5TaW4odGgpCgl2aWV3IDo9IGZ1bmMocCB2MykgdjMgewoJCXgxLCB5MSA6PSBwLngqY3ktcC55KnN5LCBwLngqc3krcC55KmN5CgkJcmV0dXJuIHYze3gxLCB5MSpjdCArIHAueipzdHQsIHAueipjdCAtIHkxKnN0dH0KCX0KCWV4MCwgZXkwLCBleDEsIGV5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJZm9yIF8sIGYgOj0gcmFuZ2UgZmFjZXMgewoJCWZvciBfLCBwIDo9IHJhbmdlIGYucCB7CgkJCXEgOj0gdmlldyhwKQoJCQlleDAsIGV5MCA9IG1hdGguTWluKGV4MCwgcS54KSwgbWF0aC5NaW4oZXkwLCBxLnkpCgkJCWV4MSwgZXkxID0gbWF0aC5NYXgoZXgxLCBxLngpLCBtYXRoLk1heChleTEsIHEueSkKCQl9Cgl9CglveCwgb3kgOj0gLShleDArZXgxKS8yLCAtKGV5MCtleTEpLzIKCXNjciA6PSBmdW5jKHAgdjMpIHB0IHsgcmV0dXJuIHB0e3N1YmpYICsgcC54ICsgb3gsIHBpZWNlQ1kgLSAocC55ICsgb3kpfSB9CglsaWdodCA6PSB2bm9ybSh2M3stMC41LCAwLjYyLCAwLjZ9KQoJaW5zaWRlIDo9IHYzezAsIDAsIC0wLjI1ICogYy5yeX0KCWlmIHJhdyB7CgkJaW5zaWRlID0gdjN7fQoJfSBlbHNlIGlmIHNoYXBlSWR4ID09IHNoYXBlUm9zZSB7CgkJaW5zaWRlID0gdjN7MCwgMCwgMC4xNSAqIGMucnl9Cgl9CgoJdHlwZSBkcmF3biBzdHJ1Y3QgewoJCXB0cyAgIFtdcHQKCQlkZXB0aCBmbG9hdDY0CgkJZmlsbCAgc3RyaW5nCgkJa2luZCAgaW50CgkJbHVtICAgZmxvYXQ2NAoJCW52ICAgICAgICAgICAgICAgIHYzCgkJaml0LCBkcmlmdCwgdGhpY2sgZmxvYXQ2NAoJCWV4dCAgICAgICAgICAgICAgIGJvb2wKCX0KCXNoYWRlRnJvbnQgOj0gZnVuYyhraW5kIGludCwgbnYsIEwgdjMsIGppdCwgZHJpZnQsIHRoaWNrIGZsb2F0NjQsIGV4dCBib29sKSAoc3RyaW5nLCBmbG9hdDY0KSB7CgkJSCA6PSB2bm9ybSh2M3tMLngsIEwueSwgTC56ICsgMX0pCgkJbGFtIDo9IG1hdGguTWF4KDAsIHZkb3QobnYsIEwpKQoJCWx1bSA6PSAwLjAzICsgMC43Km1hdGguUG93KGxhbSwgMi4xKSArIGppdAoJCWlmIGV4dCB7CgkJCWx1bSAqPSAwLjMKCQl9CgkJaWYga2luZCA9PSBrVGFibGUgewoJCQlsdW0gPSAwLjM2ICsgMC4yNipsYW0KCQl9CgkJaWYga2luZCA9PSBrUGF2IHsKCQkJbHVtID0gMC4yMiArIDAuNSptYXRoLk1heCgwLCB2ZG90KHZzY2FsZShudiwgLTEpLCBMKSkgKyBqaXQKCQl9CgkJaWYgcmF3IHsKCQkJbHVtID0gMC4zICsgMC40MiptYXRoLlBvdyhsYW0sIDEuNCkgKyAwLjIyKm1hdGguTWF4KDAsIHZkb3QodnNjYWxlKG52LCAtMSksIEwpKSArIGppdCowLjYKCQl9CgkJY29sIDo9IG1peEkodG9uZUkobHVtKSwgZGVlcEksIDAuMzQqdGhpY2sqdGhpY2spCgkJaWYgc3AgOj0gbWF0aC5Qb3cobWF0aC5NYXgoMCwgdmRvdChudiwgSCkpLCAyOCk7IHNwID4gMC4zIHsKCQkJY29sID0gbWl4SShjb2wsIHdoaXRlSSwgc3AqMC44NSkKCQl9CgkJaWYgbHVtID4gMC41ICYmIGtpbmQgIT0ga1RhYmxlIHsKCQkJYW10IDo9IG1hdGguTWluKDEsIChsdW0tMC41KS8wLjQpICogZGlzcGVyc2lvbk1peCAqIGZzLnByb2Yuc2F0CgkJCXQgOj0gbWF0aC5BdGFuMihudi55LCBudi54KS9tYXRoLlBpICsgZHJpZnQvNDAKCQkJY29sID0gbWl4SShjb2wsIHNwZWN0cnVtQXRJKHQpLCBhbXQpCgkJfQoJCXJldHVybiBoZXgzSShodWVSb3RhdGVJKGNvbCwgZHJpZnQpKSwgbHVtCgl9Cgl2YXIgYmFjaywgZnJvbnQsIHBhdiBbXWRyYXduCgl2YXIgYWxsIFtdcHQKCWZvciBfLCBmIDo9IHJhbmdlIGZhY2VzIHsKCQl2cCA6PSBtYWtlKFtddjMsIGxlbihmLnApKQoJCWN0ciA6PSB2M3t9CgkJZm9yIGksIHAgOj0gcmFuZ2UgZi5wIHsKCQkJdnBbaV0gPSB2aWV3KHApCgkJCWN0ciA9IHYze2N0ci54ICsgcC54LCBjdHIueSArIHAueSwgY3RyLnogKyBwLnp9CgkJfQoJCWN0ciA9IHZzY2FsZShjdHIsIDEvZmxvYXQ2NChsZW4oZi5wKSkpCgkJbm0gOj0gdjN7fQoJCWZvciBpIDo9IHJhbmdlIGYucCB7CgkJCWEsIGIgOj0gZi5wW2ldLCBmLnBbKGkrMSklbGVuKGYucCldCgkJCW5tID0gdjN7bm0ueCArIChhLnktYi55KSooYS56K2IueiksIG5tLnkgKyAoYS56LWIueikqKGEueCtiLngpLCBubS56ICsgKGEueC1iLngpKihhLnkrYi55KX0KCQl9CgkJbm0gPSB2bm9ybShubSkKCQlpZiB2ZG90KG5tLCB2c3ViKGN0ciwgaW5zaWRlKSkgPCAwIHsKCQkJbm0gPSB2c2NhbGUobm0sIC0xKQoJCX0KCQludiA6PSB2bm9ybSh2aWV3KG5tKSkKCQlkIDo9IGRyYXdue2tpbmQ6IGYua2luZH0KCQlmb3IgXywgcCA6PSByYW5nZSB2cCB7CgkJCWQucHRzID0gYXBwZW5kKGQucHRzLCBzY3IocCkpCgkJCWQuZGVwdGggKz0gcC56CgkJCWFsbCA9IGFwcGVuZChhbGwsIHNjcihwKSkKCQl9CgkJZC5kZXB0aCAvPSBmbG9hdDY0KGxlbih2cCkpCgkJck4gOj0gbWF0aC5TcXJ0KChjdHIueC9jLnJ4KSooY3RyLngvYy5yeCkgKyAoY3RyLnkvYy5yeSkqKGN0ci55L2MucnkpKQoJCWlmIHJOID4gMSB7CgkJCXJOID0gMQoJCX0KCQl0aGljayA6PSAxIC0gck4KCQlqaXQgOj0gZnMuem9uZS5mbG9hdEluKC0wLjEzLCAwLjEzKQoJCWlmIG52LnogPiAwLjAyIHsKCQkJZXh0IDo9IGYua2luZCA9PSBrQ3Jvd24gJiYgZnMuem9uZS5mbG9hdEluKDAsIDEpIDwgMC4yOAoJCQlkcmlmdCA6PSBmcy56b25lLmZsb2F0SW4oLWZpcmVab25lRGVnLCBmaXJlWm9uZURlZykKCQkJZC5udiwgZC5qaXQsIGQuZHJpZnQsIGQudGhpY2ssIGQuZXh0ID0gbnYsIGppdCwgZHJpZnQsIHRoaWNrLCBleHQKCQkJZC5maWxsLCBkLmx1bSA9IHNoYWRlRnJvbnQoZi5raW5kLCBudiwgbGlnaHQsIGppdCwgZHJpZnQsIHRoaWNrLCBleHQpCgkJCWZyb250ID0gYXBwZW5kKGZyb250LCBkKQoJCQlpZiBmLmtpbmQgPT0ga1BhdiB7CgkJCQlwYXYgPSBhcHBlbmQocGF2LCBkKQoJCQl9CgkJfSBlbHNlIGlmIGYua2luZCA9PSBrUGF2IHsKCQkJaW5uZXIgOj0gdnNjYWxlKG52LCAtMSkKCQkJbHVtIDo9IDAuMiArIDAuNiptYXRoLk1heCgwLCB2ZG90KGlubmVyLCBsaWdodCkpICsgaml0CgkJCWQuZmlsbCA9IGhleDMobWl4SGV4KHRvbmUobHVtKSwgZGVlcCwgMC4zNCp0aGljayp0aGljaykpCgkJCWQubHVtID0gbHVtCgkJCWJhY2sgPSBhcHBlbmQoYmFjaywgZCkKCQkJcGF2ID0gYXBwZW5kKHBhdiwgZCkKCQl9Cgl9Cglzb3J0RHJhd24gOj0gZnVuYyhkcyBbXWRyYXduKSB7CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihkcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGRzW2pdLmRlcHRoIDwgZHNbai0xXS5kZXB0aDsgai0tIHsKCQkJCWRzW2pdLCBkc1tqLTFdID0gZHNbai0xXSwgZHNbal0KCQkJfQoJCX0KCX0KCXNvcnREcmF3bihiYWNrKQoJc29ydERyYXduKGZyb250KQoKCWh1bGwgOj0gY29udmV4SHVsbChhbGwpCglpZiBzaGFwZUlkeCA9PSBzaGFwZUhlYXJ0IHsKCQlodWxsID0gbmlsCgkJZm9yIF8sIGcgOj0gcmFuZ2UgZ2lyZGxlIHsKCQkJaHVsbCA9IGFwcGVuZChodWxsLCBzY3IodmlldyhnKSkpCgkJfQoJfQoJdmFyIHVuZGVyQiwgZmFjZXRzQiBzdHJpbmdzLkJ1aWxkZXIKCXVuZGVyQi5Xcml0ZVN0cmluZyhgPGRlZnM+PHJhZGlhbEdyYWRpZW50IGlkPSJiZGAgKyBzYWx0ICsgYCIgY3g9Ii40IiBjeT0iLjM1IiByPSIuNzUiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9ImAgKyBoZXgzKGJhc2UpICsgYCIvPjxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9ImAgKyBoZXgzKGRhcmtlbihiYXNlLCBzaCwgMC4yNSkpICsgYCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iYCArIGhleDMoZGFya2VuKGJhc2UsIHNoLCAwLjg1KSkgKyBgIi8+PC9yYWRpYWxHcmFkaWVudD48L2RlZnM+YCArCgkJYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGh1bGwpICsgYCIgZmlsbD0idXJsKCNiZGAgKyBzYWx0ICsgYCkiIG9wYWNpdHk9Ii43Ii8+PGcgZmlsbC1vcGFjaXR5PSIuNiI+YCkKCWZvciBfLCBkIDo9IHJhbmdlIGJhY2sgewoJCXVuZGVyQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiLz5gKQoJfQoJdW5kZXJCLldyaXRlU3RyaW5nKGA8L2c+YCkKCgluQ3Jvd24gOj0gMAoJZm9yIF8sIGQgOj0gcmFuZ2UgZnJvbnQgewoJCWlmIGQua2luZCA9PSBrQ3Jvd24gewoJCQluQ3Jvd24rKwoJCX0KCX0KCWNhbmRQIDo9IDEuMAoJaWYgbkNyb3duID4gZmlyZU1heEZhY2V0cyB7CgkJY2FuZFAgPSBmbG9hdDY0KGZpcmVNYXhGYWNldHMpIC8gZmxvYXQ2NChuQ3Jvd24pICogMS4yNQoJfQoJbkNhbmQgOj0gMAoJblNwbGl0IDo9IDAKCWlmIHJhdyB8fCBmcy50aHVtYiB7CgkJY2FuZFAgPSAwCgl9Cglmb3IgXywgZCA6PSByYW5nZSBmcm9udCB7CgkJaWYgZC5raW5kID09IGtUYWJsZSAmJiBzaGFwZUlkeCA9PSBzaGFwZUhlYXJ0IHsKCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiIGZpbGwtb3BhY2l0eT0iLjQ2Ii8+YCkKCQkJY29udGludWUKCQl9CgkJaWYgZC5raW5kID09IGtUYWJsZSB7CgkJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDxwYXRoIGQ9ImAgKyByZWxQYXRoKGQucHRzKSArIGAiIGZpbGw9ImAgKyBkLmZpbGwgKyBgIiBmaWxsLW9wYWNpdHk9Ii40NiIvPmApCgkJCXdpbiA6PSBjb252ZXhIdWxsKGQucHRzKQoJCQl0eCwgdHkgOj0gY2VudHJvaWQod2luKQoJCQlpZiBsZW4ocGF2KSA+IDAgJiYgIWZzLnRodW1iIHsKCQkJCWJ4MCwgYnkwLCBieDEsIGJ5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJCQkJZm9yIF8sIGIgOj0gcmFuZ2UgcGF2IHsKCQkJCQlmb3IgXywgcSA6PSByYW5nZSBiLnB0cyB7CgkJCQkJCWJ4MCwgYnkwID0gbWF0aC5NaW4oYngwLCBxLngpLCBtYXRoLk1pbihieTAsIHEueSkKCQkJCQkJYngxLCBieTEgPSBtYXRoLk1heChieDEsIHEueCksIG1hdGguTWF4KGJ5MSwgcS55KQoJCQkJCX0KCQkJCX0KCQkJCXd4MCwgd3kwLCB3eDEsIHd5MSA6PSAxZTksIDFlOSwgLTFlOSwgLTFlOQoJCQkJZm9yIF8sIHEgOj0gcmFuZ2Ugd2luIHsKCQkJCQl3eDAsIHd5MCA9IG1hdGguTWluKHd4MCwgcS54KSwgbWF0aC5NaW4od3kwLCBxLnkpCgkJCQkJd3gxLCB3eTEgPSBtYXRoLk1heCh3eDEsIHEueCksIG1hdGguTWF4KHd5MSwgcS55KQoJCQkJfQoJCQkJayA6PSAwLjkyICogbWF0aC5NaW4oKHd4MS13eDApL21hdGguTWF4KDEsIGJ4MS1ieDApLCAod3kxLXd5MCkvbWF0aC5NYXgoMSwgYnkxLWJ5MCkpCgkJCQlieCwgYnkgOj0gKGJ4MCtieDEpLzIsIChieTArYnkxKS8yCgkJCQl2YXIgbW9zQiBzdHJpbmdzLkJ1aWxkZXIKCQkJCW5SZWZsIDo9IDAKCQkJCWZvciBfLCBiIDo9IHJhbmdlIHBhdiB7CgkJCQkJaWYgblJlZmwgPj0gOCB7CgkJCQkJCWJyZWFrCgkJCQkJfQoJCQkJCW1wIDo9IG1ha2UoW11wdCwgbGVuKGIucHRzKSkKCQkJCQlmb3IgaSwgcSA6PSByYW5nZSBiLnB0cyB7CgkJCQkJCW1wW2ldID0gcHR7dHggKyAocS54LWJ4KSprLCB0eSAtIChxLnktYnkpKmt9CgkJCQkJfQoJCQkJCWNsIDo9IGNsaXBUb0NvbnZleChtcCwgd2luKQoJCQkJCWlmIGxlbihjbCkgPCAzIHx8IHBvbHlBcmVhKGNsKSA8IDQgewoJCQkJCQljb250aW51ZQoJCQkJCX0KCQkJCQluUmVmbCsrCgkJCQkJbW9zQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoY2wpICsgYCIgZmlsbD0iYCArIGhleDModG9uZShiLmx1bSowLjk1KSkgKyBgIi8+YCkKCQkJCX0KCQkJCWlmIG1vc0IuTGVuKCkgPiAwIHsKCQkJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8ZyBmaWxsLW9wYWNpdHk9Ii41NSI+YCArIG1vc0IuU3RyaW5nKCkgKyBgPC9nPmApCgkJCQl9CgkJCX0KCQkJY29udGludWUKCQl9CgkJaWYgZC5raW5kID09IGtDcm93biAmJiBuQ2FuZCA8IGZpcmVNYXhGYWNldHMgJiYgZnMuem9uZS5mbG9hdEluKDAsIDEpIDwgY2FuZFAgewoJCQluQ2FuZCsrCgkJCWN4LCBjeXkgOj0gY2VudHJvaWQoZC5wdHMpCgkJCWZzLnJpbmdDZW50ID0gYXBwZW5kKGZzLnJpbmdDZW50LCBwdHtjeCwgY3l5fSkKCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiIGNsYXNzPSJmIi8+YCkKCQkJY29udGludWUKCQl9CgkJaWYgIXJhdyAmJiBuU3BsaXQgPCA2ICYmIHBvbHlBcmVhKGQucHRzKSA+IDI2ICYmIGZzLnpvbmUuZmxvYXRJbigwLCAxKSA8IDAuNSB7CgkJCWEsIGIgOj0gc3BsaXRQb2x5KGQucHRzLCBmcy56b25lLmZsb2F0SW4oMCwgbWF0aC5QaSkpCgkJCWlmIGxlbihhKSA+PSAzICYmIGxlbihiKSA+PSAzIHsKCQkJCW5TcGxpdCsrCgkJCQlsbyA6PSBoZXgzKG1peEhleCh0b25lKG1hdGguTWF4KDAsIGQubHVtKjAuNi0wLjA0KSksIGRlZXAsIDAuMTgpKQoJCQkJaGkgOj0gaGV4Myh0b25lKG1hdGguTWluKDEsIGQubHVtKjEuMzUrMC4wNikpKQoJCQkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoYSkgKyBgIiBmaWxsPSJgICsgaGkgKyBgIi8+PHBhdGggZD0iYCArIHJlbFBhdGgoYikgKyBgIiBmaWxsPSJgICsgbG8gKyBgIi8+YCkKCQkJCWNvbnRpbnVlCgkJCX0KCQl9CgkJZmFjZXRzQi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIHJlbFBhdGgoZC5wdHMpICsgYCIgZmlsbD0iYCArIGQuZmlsbCArIGAiLz5gKQoJfQoKCV8sIF8sIF8sIF8sIHJvdERlZyA6PSBtb3Rpb25QaGFzZXMoc2FsdCkKCXR5cGUgY2FuZCBzdHJ1Y3QgewoJCWkgICAgIGludAoJCWZpbGwgIHN0cmluZwoJCWRlbHRhIGZsb2F0NjQKCX0KCWZvciBzaSwgc2duIDo9IHJhbmdlIFtdZmxvYXQ2NHsxLCAtMX0gewoJCWlmIGZzLnRodW1iIHsKCQkJYnJlYWsKCQl9CgkJYSA6PSAtc2duICogcm90RGVnICogbGlnaHRTd2luZyAqIG1hdGguUGkgLyAxODAKCQljYSwgc2EgOj0gbWF0aC5Db3MoYSksIG1hdGguU2luKGEpCgkJTCA6PSB2bm9ybSh2M3tsaWdodC54KmNhIC0gbGlnaHQueSpzYSwgbGlnaHQueCpzYSArIGxpZ2h0LnkqY2EsIGxpZ2h0Lnp9KQoJCXZhciBjcyBbXWNhbmQKCQlmb3IgaSwgZCA6PSByYW5nZSBmcm9udCB7CgkJCWlmIGQua2luZCA9PSBrVGFibGUgewoJCQkJY29udGludWUKCQkJfQoJCQlmMiwgXyA6PSBzaGFkZUZyb250KGQua2luZCwgZC5udiwgTCwgZC5qaXQsIGQuZHJpZnQsIGQudGhpY2ssIGQuZXh0KQoJCQlpZiBkbCA6PSBsdW1hRGVsdGEoZjIsIGQuZmlsbCk7IGRsID4gMC4wNiAmJiBwb2x5QXJlYShkLnB0cykgPiAzIHsKCQkJCWNzID0gYXBwZW5kKGNzLCBjYW5ke2ksIGYyLCBkbH0pCgkJCX0KCQl9CgkJZm9yIGkgOj0gMTsgaSA8IGxlbihjcyk7IGkrKyB7CgkJCWZvciBqIDo9IGk7IGogPiAwICYmIGNzW2pdLmRlbHRhID4gY3Nbai0xXS5kZWx0YTsgai0tIHsKCQkJCWNzW2pdLCBjc1tqLTFdID0gY3Nbai0xXSwgY3Nbal0KCQkJfQoJCX0KCQlpZiBsZW4oY3MpID4gbGlnaHRNYXhGYWNldHMgewoJCQljcyA9IGNzWzpsaWdodE1heEZhY2V0c10KCQl9CgkJaWYgbGVuKGNzKSA9PSAwIHsKCQkJY29udGludWUKCQl9CgkJY2xzIDo9ICJndC1sYSIKCQlpZiBzaSA9PSAxIHsKCQkJY2xzID0gImd0LWxiIgoJCX0KCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8ZyBjbGFzcz0iYCArIGNscyArIGAiIG9wYWNpdHk9IjAiPmApCgkJZm9yIF8sIGMgOj0gcmFuZ2UgY3MgewoJCQlmYWNldHNCLldyaXRlU3RyaW5nKGA8cGF0aCBkPSJgICsgcmVsUGF0aChmcm9udFtjLmldLnB0cykgKyBgIiBmaWxsPSJgICsgYy5maWxsICsgYCIvPmApCgkJfQoJCWZhY2V0c0IuV3JpdGVTdHJpbmcoYDwvZz5gKQoJfQoKCWdkLCBsYXN0RyA6PSAiIiwgIiIKCWZvciBpIDo9IHJhbmdlIGdpcmRsZSB7CgkJYSwgYiA6PSB2aWV3KGdpcmRsZVtpXSksIHZpZXcoZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXSkKCQltaWQgOj0gdnNjYWxlKHYze2dpcmRsZVtpXS54ICsgZ2lyZGxlWyhpKzEpJWxlbihnaXJkbGUpXS54LCBnaXJkbGVbaV0ueSArIGdpcmRsZVsoaSsxKSVsZW4oZ2lyZGxlKV0ueSwgMH0sIDAuNSkKCQlpZiB2aWV3KHZub3JtKG1pZCkpLnotMCA+IC0wLjA1ICYmIHZpZXcobWlkKS56ID49IHZpZXcodjN7fSkuei0wLjAxIHsKCQkJcGEsIHBiIDo9IHNjcihhKSwgc2NyKGIpCgkJCXNhIDo9IG4xKHBhLngpICsgIiAiICsgbjEocGEueSkKCQkJaWYgc2EgIT0gbGFzdEcgewoJCQkJZ2QgKz0gIk0iICsgc2EKCQkJfQoJCQlsYXN0RyA9IG4xKHBiLngpICsgIiAiICsgbjEocGIueSkKCQkJZ2QgKz0gIiAiICsgbGFzdEcKCQl9Cgl9CglvdmVyID0gYDxwYXRoIGQ9ImAgKyBnZCArIGAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iYCArIGhleDMobGlnaHRlbihiYXNlLCAwLjE4KSkgKyBgIiBzdHJva2Utd2lkdGg9Ii43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIG9wYWNpdHk9Ii40Ii8+YAoJcmV0dXJuIHVuZGVyQi5TdHJpbmcoKSwgZmFjZXRzQi5TdHJpbmcoKSwgb3Zlcgp9Cgpjb25zdCBkaXNwZXJzaW9uTWl4ID0gMC4zMgoKdmFyIHNwZWN0cnVtID0gW11zdHJpbmd7IiNmZjQwNDAiLCAiI2ZmOWExZiIsICIjZmZlODFmIiwgIiMzNWZmN2EiLCAiIzIyY2NmZiIsICIjNTU2NmZmIiwgIiNjMDRkZmYifQoKdmFyIHNwZWN0cnVtSSA9IGZ1bmMoKSBbXXJnYkkgewoJb3V0IDo9IG1ha2UoW11yZ2JJLCBsZW4oc3BlY3RydW0pKQoJZm9yIGksIGggOj0gcmFuZ2Ugc3BlY3RydW0gewoJCW91dFtpXSA9IHRvUkdCSShoKQoJfQoJcmV0dXJuIG91dAp9KCkKCmZ1bmMgc3BlY3RydW1BdEkodCBmbG9hdDY0KSByZ2JJIHsKCXQgPSB0IC0gbWF0aC5GbG9vcih0KQoJZiA6PSB0ICogZmxvYXQ2NChsZW4oc3BlY3RydW1JKSkKCWkgOj0gaW50KGYpCglyZXR1cm4gbWl4SShzcGVjdHJ1bUlbaSVsZW4oc3BlY3RydW1JKV0sIHNwZWN0cnVtSVsoaSsxKSVsZW4oc3BlY3RydW1JKV0sIGYtZmxvYXQ2NChpKSkKfQoKZnVuYyBzcGVjdHJ1bUF0KHQgZmxvYXQ2NCkgc3RyaW5nIHsKCXQgPSB0IC0gbWF0aC5GbG9vcih0KQoJZiA6PSB0ICogZmxvYXQ2NChsZW4oc3BlY3RydW0pKQoJaSA6PSBpbnQoZikKCXJldHVybiBtaXhIZXgoc3BlY3RydW1baSVsZW4oc3BlY3RydW0pXSwgc3BlY3RydW1bKGkrMSklbGVuKHNwZWN0cnVtKV0sIGYtZmxvYXQ2NChpKSkKfQoKY29uc3QgKAoJbGlnaHRTd2luZyAgICAgPSAyLjIKCWxpZ2h0TWF4RmFjZXRzID0gMTIKKQoKZnVuYyBsdW1hRGVsdGEoYSwgYiBzdHJpbmcpIGZsb2F0NjQgewoJd2lkZSA6PSBmdW5jKGggc3RyaW5nKSBzdHJpbmcgewoJCWlmIGxlbihoKSA9PSA0IHsKCQkJcmV0dXJuICIjIiArIGhbMToyXSArIGhbMToyXSArIGhbMjozXSArIGhbMjozXSArIGhbMzo0XSArIGhbMzo0XQoJCX0KCQlyZXR1cm4gaAoJfQoJYXIsIGFnLCBhYiA6PSBoZXhUb1JHQih3aWRlKGEpKQoJYnIsIGJnLCBiYiA6PSBoZXhUb1JHQih3aWRlKGIpKQoJZCA6PSAoMC4yMTI2KmZsb2F0NjQoYXItYnIpICsgMC43MTUyKmZsb2F0NjQoYWctYmcpICsgMC4wNzIyKmZsb2F0NjQoYWItYmIpKSAvIDI1NQoJaWYgZCA8IDAgewoJCXJldHVybiAtZAoJfQoJcmV0dXJuIGQKfQoKY29uc3QgZmlyZU1heEZhY2V0cyA9IDEyCgpjb25zdCBzdGFyZmllbGQgPSB0cnVlCgpmdW5jIHJlbmRlclN0YXJzKHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJaWYgIXN0YXJmaWVsZCB7CgkJcmV0dXJuICIiCgl9CglybmQgOj0gbmV3UFJORygic3RhcnMiICsgc2FsdCkKCXR5cGUgc3RhciBzdHJ1Y3R7IHgsIHkgZmxvYXQ2NCB9Cgl2YXIgYnlMZXZlbCBbNF1bXXN0YXIKCWZvciBpIDo9IDA7IGkgPCAzNjsgaSsrIHsKCQl4LCB5IDo9IHJuZC5mbG9hdEluKDMsIGNhbnZhc1ctMyksIHJuZC5mbG9hdEluKDMsIDEyNykKCQlrIDo9IHJuZC5pbnRuKDIwKQoJCWR4LCBkeSA6PSB4LXN1YmpYLCB5LXN1YmpZCgkJaWYgciA6PSBtYXRoLlNxcnQoZHgqZHggKyBkeSpkeSk7IHIgPiA0MyAmJiByIDwgNTggewoJCQljb250aW51ZQoJCX0KCQlsdmwgOj0gMCAvLyBtb3N0IHN0YXJzIGFyZSBmYWludDsgYSBmZXcgYXJlIGJyaWdodAoJCXN3aXRjaCB7CgkJY2FzZSBrID49IDE4OgoJCQlsdmwgPSAzCgkJY2FzZSBrID49IDE0OgoJCQlsdmwgPSAyCgkJY2FzZSBrID49IDg6CgkJCWx2bCA9IDEKCQl9CgkJYnlMZXZlbFtsdmxdID0gYXBwZW5kKGJ5TGV2ZWxbbHZsXSwgc3Rhcnt4LCB5fSkKCX0KCXdpZHRocyA6PSBbNF1zdHJpbmd7Ii40NSIsICIuNiIsICIuODUiLCAiMS4xNSJ9CglvcHMgOj0gWzRdc3RyaW5neyIuMjIiLCAiLjM4IiwgIi41OCIsICIuODUifQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGA8ZyBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgZmlsbD0ibm9uZSI+YCkKCXZhciB0dyBbXXN0YXIKCWZvciBsIDo9IDA7IGwgPCA0OyBsKysgewoJCWlmIGxlbihieUxldmVsW2xdKSA9PSAwIHsKCQkJY29udGludWUKCQl9CgkJZCA6PSAiIgoJCWZvciBpLCBzdCA6PSByYW5nZSBieUxldmVsW2xdIHsKCQkJaWYgbCA+PSAxICYmIGwgPD0gMiAmJiBsZW4odHcpIDwgMyAmJiBpJTMgPT0gMCB7CgkJCQl0dyA9IGFwcGVuZCh0dywgc3QpCgkJCQljb250aW51ZQoJCQl9CgkJCWQgKz0gIk0iICsgbjEoc3QueCkgKyAiICIgKyBuMShzdC55KSArICJoLjAxIgoJCX0KCQlpZiBkICE9ICIiIHsKCQkJYi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iYCArIGQgKyBgIiBzdHJva2Utd2lkdGg9ImAgKyB3aWR0aHNbbF0gKyBgIiBvcGFjaXR5PSJgICsgb3BzW2xdICsgYCIvPmApCgkJfQoJfQoJZm9yIF8sIHN0IDo9IHJhbmdlIHR3IHsKCQlkdXIgOj0gcm5kLmZsb2F0SW4oNSwgMTIpCgkJYi5Xcml0ZVN0cmluZyhgPHBhdGggZD0iTWAgKyBuMShzdC54KSArICIgIiArIG4xKHN0LnkpICsgYGguMDEiIHN0cm9rZS13aWR0aD0iLjkiIG9wYWNpdHk9Ii40IiBjbGFzcz0iZ3QtdHciIHN0eWxlPSItLWQ6YCArIGZudW0xKGR1cikgKyBgczstLWRsOi1gICsgZm51bTEocm5kLmZsb2F0SW4oMCwgZHVyKSkgKyBgcyIvPmApCgl9CgliLldyaXRlU3RyaW5nKGA8L2c+YCkKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsIHN0cmluZykgc3RyaW5nIHsKCXIsIGcsIGIgOj0gaGV4VG9SR0IoYmFzZSkKCWx1bSA6PSAoMC4yMTI2KmZsb2F0NjQocikgKyAwLjcxNTIqZmxvYXQ2NChnKSArIDAuMDcyMipmbG9hdDY0KGIpKSAvIDI1NQoJc2hhZG93IDo9ICIjNGE0MDM4IgoJaWYgbHVtIDwgMC40IHsKCQlzaGFkb3cgPSAiIzAwMDAwMCIKCX0KCWhpIDo9IGJhc2UKCXNjLCBzcywgc3cgOj0gIi42IiwgIi4zMiIsICIuMTYiCgltbyA6PSAiLjMiCglpZiBsdW0gPCAwLjQgewoJCW1vID0gIi4yMiIKCQloaSA9IG1peEhleChiYXNlLCAiI2M5ZDJkOCIsIDAuMjgpCgkJc2MsIHNzLCBzdyA9ICIuMzQiLCAiLjE2IiwgIi4wNyIKCX0KCXJldHVybiBgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCIgY3g9Ii40IiBjeT0iLjM2IiByPSIuNyIgZng9Ii4zNCIgZnk9Ii4yOCI+YCArCgkJYDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iYCArIGhpICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii40IiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4xMykgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjc2IiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4zNikgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjkzIiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC41KSArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJgICsgbWl4SGV4KGJhc2UsIHNoYWRvdywgMC4zKSArIGAiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgbyIgY3g9Ii40NSIgY3k9Ii40NCIgcj0iLjYyIj5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuMyIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjYyIiBzdG9wLWNvbG9yPSIjZmZiM2NmIiBzdG9wLW9wYWNpdHk9Ii4yIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjg4IiBzdG9wLWNvbG9yPSIjYjNmZmQ2IiBzdG9wLW9wYWNpdHk9Ii4yIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2MzZDNmZiIgc3RvcC1vcGFjaXR5PSIuMTIiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgcyIgY3g9Ii4zNiIgY3k9Ii4zIiByPSIuNCI+YCArCgkJYDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSJgICsgc2MgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iLjM1IiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9ImAgKyBzcyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuNyIgc3RvcC1jb2xvcj0iI2ZmZiIgc3RvcC1vcGFjaXR5PSIuMDYiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAgKwoJCWA8cmFkaWFsR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgbSIgY3g9Ii40MiIgY3k9Ii4zNiIgcj0iLjY4Ij5gICsKCQlgPHN0b3Agb2Zmc2V0PSIuNzgiIHN0b3AtY29sb3I9ImAgKyBtZXRhbCArIGAiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9Ii45MyIgc3RvcC1jb2xvcj0iYCArIG1ldGFsICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgbW8gKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iYCArIG1ldGFsICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+PC9yYWRpYWxHcmFkaWVudD5gICsKCQlgPHJhZGlhbEdyYWRpZW50IGlkPSJgICsgZ2lkICsgYHciIGN4PSIuNjYiIGN5PSIuNzMiIHI9Ii4yIj5gICsKCQlgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9ImAgKyBzdyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz48L3JhZGlhbEdyYWRpZW50PmAKfQoKZnVuYyBwZWFybExheWVycyhzaGFwZSwgZ2lkLCBiZXR3ZWVuIHN0cmluZykgc3RyaW5nIHsKCWkgOj0gc3RyaW5ncy5JbmRleChzaGFwZSwgYCBmaWxsPSJgKQoJaWYgaSA8IDAgewoJCXJldHVybiBzaGFwZQoJfQoJY3AgOj0gZnVuYyhzdWZmaXggc3RyaW5nKSBzdHJpbmcgeyByZXR1cm4gc2hhcGVbOmldICsgYCBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBzdWZmaXggKyBgKSIvPmAgfQoJcmV0dXJuIHNoYXBlICsgY3AoIm8iKSArIGNwKCJtIikgKyBiZXR3ZWVuICsgY3AoInciKSArIGNwKCJzIikKfQoKZnVuYyBwZWFybFN3ZWVwQ29sb3JJbnRlbnNpdHkoYmFzZSBzdHJpbmcpIGZsb2F0NjQgewoJciwgZywgYiA6PSBoZXhUb1JHQihiYXNlKQoJbHVtIDo9IDAuMjEyNipmbG9hdDY0KHIpLzI1NSArIDAuNzE1MipmbG9hdDY0KGcpLzI1NSArIDAuMDcyMipmbG9hdDY0KGIpLzI1NQoJaWYgbHVtIDwgMC40IHsKCQlyZXR1cm4gMC41NQoJfQoJcmV0dXJuIDIuMAp9CgpmdW5jIHBlYXJsU3dlZXBHcmFkaWVudChnaWQsIGJhc2Ugc3RyaW5nKSBzdHJpbmcgewoJbXVsdCA6PSBwZWFybFN3ZWVwQ29sb3JJbnRlbnNpdHkoYmFzZSkKCW8xLCBvMiwgbzMgOj0gZm51bSgwLjMqbXVsdCksIGZudW0oMC4zNSptdWx0KSwgZm51bSgwLjMqbXVsdCkKCXJldHVybiBgPGxpbmVhckdyYWRpZW50IGlkPSJgICsgZ2lkICsgYCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSIxOCUiIHN0b3AtY29sb3I9IiNmZmQyZTYiIHN0b3Atb3BhY2l0eT0iYCArIG8xICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjM4JSIgc3RvcC1jb2xvcj0iI2NmZThmZiIgc3RvcC1vcGFjaXR5PSJgICsgbzIgKyBgIi8+YCArCgkJYDxzdG9wIG9mZnNldD0iNTglIiBzdG9wLWNvbG9yPSIjZDRmZmU0IiBzdG9wLW9wYWNpdHk9ImAgKyBvMyArIGAiLz5gICsKCQlgPHN0b3Agb2Zmc2V0PSI4MCUiIHN0b3AtY29sb3I9IiNmZmYwYzIiIHN0b3Atb3BhY2l0eT0iYCArIG8zICsgYCIvPmAgKwoJCWA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCWA8L2xpbmVhckdyYWRpZW50PmAKfQoKZnVuYyBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBzaGFwZUdlb20gc3RyaW5nLCB3LCBoIGZsb2F0NjQpIHN0cmluZyB7CglybmQgOj0gbmV3UFJORyhzYWx0ICsgIi1zd2VlcCIpCgljb25zdCBwYXNzZXMgPSAzCgl0b3RhbCA6PSAxNS4wICsgcm5kLmZsb2F0SW4oMCwgOSkKCglkdXJzIDo9IG1ha2UoW11mbG9hdDY0LCBwYXNzZXMpCglzdW1EdXIgOj0gMC4wCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCWR1cnNbaV0gPSAyLjQgKyBybmQuZmxvYXRJbigwLCAyLjIpCgkJc3VtRHVyICs9IGR1cnNbaV0KCX0KCWdhcFRvdGFsIDo9IHRvdGFsIC0gc3VtRHVyCglpZiBnYXBUb3RhbCA8IGZsb2F0NjQocGFzc2VzKSowLjUgewoJCWdhcFRvdGFsID0gZmxvYXQ2NChwYXNzZXMpICogMC41Cgl9Cgl3ZWlnaHRzIDo9IG1ha2UoW11mbG9hdDY0LCBwYXNzZXMpCglzdW1XIDo9IDAuMAoJZm9yIGkgOj0gMDsgaSA8IHBhc3NlczsgaSsrIHsKCQl3ZWlnaHRzW2ldID0gMC40ICsgcm5kLmZsb2F0SW4oMCwgMSkKCQlzdW1XICs9IHdlaWdodHNbaV0KCX0KCWdhcHMgOj0gbWFrZShbXWZsb2F0NjQsIHBhc3NlcykKCWZvciBpIDo9IDA7IGkgPCBwYXNzZXM7IGkrKyB7CgkJZ2Fwc1tpXSA9IHdlaWdodHNbaV0gLyBzdW1XICogZ2FwVG90YWwKCX0KCXN0YXJ0cyA6PSBtYWtlKFtdZmxvYXQ2NCwgcGFzc2VzKQoJdCA6PSBnYXBzWzBdCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCXN0YXJ0c1tpXSA9IHQKCQl0ICs9IGR1cnNbaV0KCQlpZiBpIDwgcGFzc2VzLTEgewoJCQl0ICs9IGdhcHNbaSsxXQoJCX0KCX0KCgl0cmF2ZWwgOj0gdyAqIDEuMDUKCWNsaXBJRCA6PSAiY2xwIiArIHNhbHQKCWdyYWRJRCA6PSAic3dwIiArIHNhbHQKCW9mZiwgb24xLCBvbjIsIG91dCA6PSBmbnVtKC10cmF2ZWwpLCBmbnVtKC10cmF2ZWwqMC41KSwgZm51bSh0cmF2ZWwqMC41KSwgZm51bSh0cmF2ZWwpCgoJdmFyIGRlZnMgc3RyaW5ncy5CdWlsZGVyCglkZWZzLldyaXRlU3RyaW5nKGA8ZGVmcz48Y2xpcFBhdGggaWQ9ImAgKyBjbGlwSUQgKyBgIj5gICsgc2hhcGVHZW9tICsgYDwvY2xpcFBhdGg+YCkKCWRlZnMuV3JpdGVTdHJpbmcocGVhcmxTd2VlcEdyYWRpZW50KGdyYWRJRCwgYmFzZSkpCgoJdmFyIG1hcmtzIHN0cmluZ3MuQnVpbGRlcgoJbWFya3MuV3JpdGVTdHJpbmcoYDxnIGNsaXAtcGF0aD0idXJsKCNgICsgY2xpcElEICsgYCkiPmApCglmb3IgaSA6PSAwOyBpIDwgcGFzc2VzOyBpKysgewoJCWFuZ2xlIDo9IGZudW0ocm5kLmZsb2F0SW4oMCwgMzYwKSkKCQlzdGFydFBjdCA6PSBzdGFydHNbaV0gLyB0b3RhbCAqIDEwMAoJCWR1clBjdCA6PSBkdXJzW2ldIC8gdG90YWwgKiAxMDAKCQlyYW1wUGN0IDo9IGR1clBjdCAqIDAuMzIKCQlpZiByYW1wUGN0ID4gNiB7CgkJCXJhbXBQY3QgPSA2CgkJfQoJCXAwLCBwMSwgcDIsIHAzIDo9IHN0YXJ0UGN0LCBzdGFydFBjdCtyYW1wUGN0LCBzdGFydFBjdCtkdXJQY3QtcmFtcFBjdCwgc3RhcnRQY3QrZHVyUGN0CgkJa2YgOj0gInN3cCIgKyBzYWx0ICsgIl8iICsgdWZtdC5TcHJpbnRmKCIlZCIsIGkpCgoJCWNsb3NpbmcgOj0gIiIKCQlpZiBwMyA8IDk5Ljk5OSB7CgkJCWNsb3NpbmcgPSBgMTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvZmYgKyBgcHgsMCk7b3BhY2l0eTowfWAKCQl9CgkJZGVmcy5Xcml0ZVN0cmluZyhgPHN0eWxlPkBrZXlmcmFtZXMgYCArIGtmICsgYHtgICsKCQkJYDAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG9mZiArIGBweCwwKTtvcGFjaXR5OjB9YCArCgkJCWZudW0ocDApICsgYCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb2ZmICsgYHB4LDApO29wYWNpdHk6MH1gICsKCQkJZm51bShwMSkgKyBgJXt0cmFuc2Zvcm06dHJhbnNsYXRlKGAgKyBvbjEgKyBgcHgsMCk7b3BhY2l0eToxfWAgKwoJCQlmbnVtKHAyKSArIGAle3RyYW5zZm9ybTp0cmFuc2xhdGUoYCArIG9uMiArIGBweCwwKTtvcGFjaXR5OjF9YCArCgkJCWZudW0ocDMpICsgYCV7dHJhbnNmb3JtOnRyYW5zbGF0ZShgICsgb3V0ICsgYHB4LDApO29wYWNpdHk6MH1gICsKCQkJY2xvc2luZyArCgkJCWB9PC9zdHlsZT5gKQoKCQltYXJrcy5Xcml0ZVN0cmluZyhgPGcgdHJhbnNmb3JtPSJyb3RhdGUoYCArIGFuZ2xlICsgYCBgICsgZm51bShzdWJqWCkgKyBgIGAgKyBmbnVtKHN1YmpZKSArIGApIj5gICsKCQkJYDxyZWN0IHg9ImAgKyBmbnVtKHN1YmpYLXcqMS4zKSArIGAiIHk9ImAgKyBmbnVtKHN1YmpZLWgqMC45NSkgKyBgIiB3aWR0aD0iYCArIGZudW0odyoyLjYpICsgYCIgaGVpZ2h0PSJgICsgZm51bShoKjEuOSkgKyBgIiBmaWxsPSJ1cmwoI2AgKyBncmFkSUQgKyBgKSIgb3BhY2l0eT0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOnNjcmVlbjthbmltYXRpb246YCArIGtmICsgYCBgICsgZm51bSh0b3RhbCkgKyBgcyBsaW5lYXIgaW5maW5pdGUiLz5gICsKCQkJYDwvZz5gKQoJfQoJbWFya3MuV3JpdGVTdHJpbmcoYDwvZz5gKQoJZGVmcy5Xcml0ZVN0cmluZyhgPC9kZWZzPmApCglyZXR1cm4gZGVmcy5TdHJpbmcoKSArIG1hcmtzLlN0cmluZygpCn0KCmZ1bmMgcGVhcmxSb3VuZChiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7CglnaWQgOj0gInBybCIgKyBzYWx0CglyIDo9IDI0LjAgKiBzdG9uZVNjYWxlCglib2R5IDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBgKSIvPmAKCWNsaXBHZW9tIDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHIqMiwgcioyKQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgIiIpICsgc3dlZXAKfQoKZnVuYyBwZWFybE92YWwoYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJcngsIHJ5IDo9IDE4LjAqc3RvbmVTY2FsZSwgMjUuMCpzdG9uZVNjYWxlCglib2R5IDo9IGA8ZWxsaXBzZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHJ4PSJgICsgZm51bShyeCkgKyBgIiByeT0iYCArIGZudW0ocnkpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgcngqMiwgcnkqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxCdXR0b24oYmFzZSwgbWV0YWwsIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJwcmwiICsgc2FsdAoJcngsIHJ5IDo9IDI1LjAqc3RvbmVTY2FsZSwgMTguMCpzdG9uZVNjYWxlCglib2R5IDo9IGA8ZWxsaXBzZSBjeD0iYCArIGZudW0oc3VialgpICsgYCIgY3k9ImAgKyBmbnVtKHN1YmpZKSArIGAiIHJ4PSJgICsgZm51bShyeCkgKyBgIiByeT0iYCArIGZudW0ocnkpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiLz5gCgljbGlwR2VvbSA6PSBgPGVsbGlwc2UgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByeD0iYCArIGZudW0ocngpICsgYCIgcnk9ImAgKyBmbnVtKHJ5KSArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgcngqMiwgcnkqMikKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxEcm9wKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXcsIGggOj0gMzIuMCpzdG9uZVNjYWxlLCA0Mi4wKnN0b25lU2NhbGUKCXBhdGggOj0gYE0gYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWS1oKjAuNTUpICsKCQlgIEMgYCArIGZudW0oc3VialgrdyowLjU1KSArIGAgYCArIGZudW0oc3VialktaCowLjE1KSArIGAgYCArIGZudW0oc3VialgrdyowLjQyKSArIGAgYCArIGZudW0oc3VialkraCowLjQyKSArIGAgYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWStoKjAuNDgpICsKCQlgIEMgYCArIGZudW0oc3VialgtdyowLjQyKSArIGAgYCArIGZudW0oc3VialkraCowLjQyKSArIGAgYCArIGZudW0oc3VialgtdyowLjU1KSArIGAgYCArIGZudW0oc3VialktaCowLjE1KSArIGAgYCArIGZudW0oc3VialgpICsgYCBgICsgZm51bShzdWJqWS1oKjAuNTUpICsgYCBaYAoJYm9keSA6PSBgPHBhdGggZD0iYCArIHBhdGggKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWQgKyBgKSIvPmAKCWNsaXBHZW9tIDo9IGA8cGF0aCBkPSJgICsgcGF0aCArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgdyoxLjYsIGgqMC45KQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgIiIpICsgc3dlZXAKfQoKZnVuYyBwZWFybEJhcm9xdWVPdXRsaW5lKHNlZWQgc3RyaW5nKSBbXXB0IHsKCXJuZCA6PSBuZXdQUk5HKHNlZWQpCgluIDo9IDEwCglwdHMgOj0gbWFrZShbXXB0LCBuKQoJZm9yIGsgOj0gMDsgayA8IG47IGsrKyB7CgkJYSA6PSAyICogbWF0aC5QaSAqIGZsb2F0NjQoaykgLyBmbG9hdDY0KG4pCgkJcnIgOj0gMjEuMCAqIHN0b25lU2NhbGUgKiAoMC43NSArIDAuNCpybmQuZmxvYXRJbigwLCAxKSkKCQlwdHNba10gPSBwdHtzdWJqWCArIHJyKm1hdGguQ29zKGEpKjEuMSwgc3VialkgKyByciptYXRoLlNpbihhKSowLjl9Cgl9CglyZXR1cm4gcHRzCn0KCmZ1bmMgcGVhcmxCYXJvcXVlU21vb3RoUGF0aChwdHMgW11wdCkgc3RyaW5nIHsKCW4gOj0gbGVuKHB0cykKCW1pZCA6PSBmdW5jKGEsIGIgcHQpIHB0IHsgcmV0dXJuIHB0eyhhLnggKyBiLngpIC8gMiwgKGEueSArIGIueSkgLyAyfSB9CglzdGFydCA6PSBtaWQocHRzW24tMV0sIHB0c1swXSkKCXBhdGggOj0gIk0gIiArIGZudW0oc3RhcnQueCkgKyAiICIgKyBmbnVtKHN0YXJ0LnkpCglmb3IgayA6PSAwOyBrIDwgbjsgaysrIHsKCQluZXh0IDo9IHB0c1soaysxKSVuXQoJCW0gOj0gbWlkKHB0c1trXSwgbmV4dCkKCQlwYXRoICs9ICIgUSAiICsgZm51bShwdHNba10ueCkgKyAiICIgKyBmbnVtKHB0c1trXS55KSArICIgIiArIGZudW0obS54KSArICIgIiArIGZudW0obS55KQoJfQoJcmV0dXJuIHBhdGggKyAiIFoiCn0KCmZ1bmMgcGVhcmxCYXJvcXVlKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXBhdGhEIDo9IHBlYXJsQmFyb3F1ZVNtb290aFBhdGgocGVhcmxCYXJvcXVlT3V0bGluZSgiYmFyb3F1ZSIgKyBzYWx0KSkKCWJvZHkgOj0gYDxwYXRoIGQ9ImAgKyBwYXRoRCArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJY2xpcEdlb20gOj0gYDxwYXRoIGQ9ImAgKyBwYXRoRCArIGAiLz5gCglzd2VlcCA6PSBwZWFybFN3ZWVwT3ZlcmxheShzYWx0LCBiYXNlLCBjbGlwR2VvbSwgNDAqc3RvbmVTY2FsZSwgMzAqc3RvbmVTY2FsZSkKCXJldHVybiBgPGRlZnM+YCArIHBlYXJsTHVzdGVyR3JhZGllbnQoZ2lkLCBiYXNlLCBtZXRhbCkgKyBgPC9kZWZzPmAgKyBwZWFybExheWVycyhib2R5LCBnaWQsICIiKSArIHN3ZWVwCn0KCmZ1bmMgcGVhcmxDaXJjbGVkKGJhc2UsIG1ldGFsLCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAicHJsIiArIHNhbHQKCXIgOj0gMjQuMCAqIHN0b25lU2NhbGUKCWJvZHkgOj0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKSArIGAiIGZpbGw9InVybCgjYCArIGdpZCArIGApIi8+YAoJcmluZ1RvbmUgOj0gbWl4SGV4KGJhc2UsICIjMDAwMDAwIiwgMC4xMikKCXJpbmdzIDo9ICIiCglmb3IgXywgZiA6PSByYW5nZSBbXWZsb2F0NjR7MC40MiwgMC41OCwgMC43NCwgMC45fSB7CgkJcmluZ3MgKz0gYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShyKmYpICsgYCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJgICsgcmluZ1RvbmUgKyBgIiBzdHJva2Utd2lkdGg9IjAuOSIgb3BhY2l0eT0iMC4zNSIvPmAKCX0KCWNsaXBHZW9tIDo9IGA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0ocikgKyBgIi8+YAoJc3dlZXAgOj0gcGVhcmxTd2VlcE92ZXJsYXkoc2FsdCwgYmFzZSwgY2xpcEdlb20sIHIqMiwgcioyKQoJcmV0dXJuIGA8ZGVmcz5gICsgcGVhcmxMdXN0ZXJHcmFkaWVudChnaWQsIGJhc2UsIG1ldGFsKSArIGA8L2RlZnM+YCArIHBlYXJsTGF5ZXJzKGJvZHksIGdpZCwgcmluZ3MpICsgc3dlZXAKfQoKdmFyIFBlYXJsU2hhcGVOYW1lcyA9IFtdc3RyaW5neyJSb3VuZCIsICJPdmFsIiwgIkJ1dHRvbiIsICJEcm9wIiwgIkJhcm9xdWUiLCAiQ2lyY2xlZCJ9CgpmdW5jIHJlbmRlclBlYXJsU2hhcGUoc2hhcGVJZHggaW50LCBiYXNlLCBtZXRhbCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggc2hhcGVJZHggewoJY2FzZSAwOgoJCXJldHVybiBwZWFybFJvdW5kKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAxOgoJCXJldHVybiBwZWFybE92YWwoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDI6CgkJcmV0dXJuIHBlYXJsQnV0dG9uKGJhc2UsIG1ldGFsLCBzYWx0KQoJY2FzZSAzOgoJCXJldHVybiBwZWFybERyb3AoYmFzZSwgbWV0YWwsIHNhbHQpCgljYXNlIDQ6CgkJcmV0dXJuIHBlYXJsQmFyb3F1ZShiYXNlLCBtZXRhbCwgc2FsdCkKCWRlZmF1bHQ6CgkJcmV0dXJuIHBlYXJsQ2lyY2xlZChiYXNlLCBtZXRhbCwgc2FsdCkKCX0KfQoKZnVuYyByZW5kZXJSaW5nKG1ldGFsSGksIG1ldGFsTG8sIHNhbHQgc3RyaW5nKSBzdHJpbmcgewoJZ2lkIDo9ICJyaW5nIiArIHNhbHQKCWJyaWdodCA6PSBsaWdodGVuKG1ldGFsSGksIDAuNDUpCglkZWVwIDo9IG1peEhleChtZXRhbExvLCAiIzAwMDAwMCIsIDAuNDUpCglzdCA6PSBmdW5jKG9mZiwgYyBzdHJpbmcpIHN0cmluZyB7IHJldHVybiBgPHN0b3Agb2Zmc2V0PSJgICsgb2ZmICsgYCIgc3RvcC1jb2xvcj0iYCArIGMgKyBgIi8+YCB9CglkZWZzIDo9IGA8bGluZWFyR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgIiB4Mj0iMSIgeTI9IjEiPmAgKwoJCXN0KCIwIiwgYnJpZ2h0KSArIHN0KCIuMTIiLCBtZXRhbEhpKSArIHN0KCIuMjYiLCBkZWVwKSArIHN0KCIuNCIsIG1ldGFsTG8pICsgc3QoIi41MiIsIGJyaWdodCkgKwoJCXN0KCIuNjQiLCBtZXRhbEhpKSArIHN0KCIuNzgiLCBkZWVwKSArIHN0KCIuOSIsIG1ldGFsTG8pICsgc3QoIjEiLCBicmlnaHQpICsgYDwvbGluZWFyR3JhZGllbnQ+YAoKCW91dGVyIDo9IGA8ZyBmaWxsPSJub25lIiB0cmFuc2Zvcm09InRyYW5zbGF0ZShgICsgY251bShzdWJqWCkgKyBgIGAgKyBjbnVtKHN1YmpZKSArIGApIj5gICsKCQlgPGNpcmNsZSByPSI1Mi42IiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iMS42IiBvcGFjaXR5PSIuNDUiLz5gICsKCQlgPGNpcmNsZSByPSI1MCIgc3Ryb2tlPSJ1cmwoI2AgKyBnaWQgKyBgKSIgc3Ryb2tlLXdpZHRoPSI0LjQiLz5gICsKCQlgPGNpcmNsZSByPSI1Mi4zIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNyIgb3BhY2l0eT0iLjgiLz5gICsKCQlgPGNpcmNsZSByPSI0Ny43IiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNiIgb3BhY2l0eT0iLjciLz5gICsKCQlgPGNpcmNsZSByPSI0OC41IiBzdHJva2U9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuMzUpICsgYCIgc3Ryb2tlLXdpZHRoPSIuNSIgb3BhY2l0eT0iLjQ1Ii8+PC9nPmAKCgljb25zdCByT3V0ID0gNDYuMAoJY29uc3QgY29yZUhhbGYgPSAwLjYKCWNvbnN0IG91dHdhcmRCbG9vbSA9IDAuOQoJZ2xvd1IgOj0gck91dCArIG91dHdhcmRCbG9vbSArIDMKCXBjdCA6PSBmdW5jKHYgZmxvYXQ2NCkgZmxvYXQ2NCB7CgkJcCA6PSB2IC8gZ2xvd1IgKiAxMDAKCQlpZiBwIDwgMCB7CgkJCXAgPSAwCgkJfQoJCWlmIHAgPiAxMDAgewoJCQlwID0gMTAwCgkJfQoJCXJldHVybiBwCgl9Cgljb3JlQ29sb3IgOj0gbGlnaHRlbihtZXRhbEhpLCAwLjI1KQoJZG9udXRTdG9wcyA6PSBmdW5jKGlud2FyZEJsb29tLCBwZWFrT3AgZmxvYXQ2NCwgZ2lkIHN0cmluZykgc3RyaW5nIHsKCQlibG9vbU9wIDo9IHBlYWtPcCAqIDAuMzUKCQltaWRPcCA6PSBwZWFrT3AgKiAwLjcKCQlyZXR1cm4gYDxyYWRpYWxHcmFkaWVudCBpZD0iYCArIGdpZCArIGAiIGN4PSI1MCUiIGN5PSI1MCUiIHI9IjUwJSI+YCArCgkJCWA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSJgICsgbWV0YWxIaSArIGAiIHN0b3Atb3BhY2l0eT0iMCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0LWlud2FyZEJsb29tLTEuNSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQtaW53YXJkQmxvb20pKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgbWV0YWxIaSArIGAiIHN0b3Atb3BhY2l0eT0iYCArIGZudW0oYmxvb21PcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQtY29yZUhhbGYpKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgY29yZUNvbG9yICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShtaWRPcCkgKyBgIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9ImAgKyBwY3RudW0ocGN0KHJPdXQpKSArIGAlIiBzdG9wLWNvbG9yPSJgICsgY29yZUNvbG9yICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShwZWFrT3ApICsgYCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0K2NvcmVIYWxmKSkgKyBgJSIgc3RvcC1jb2xvcj0iYCArIGNvcmVDb2xvciArIGAiIHN0b3Atb3BhY2l0eT0iYCArIGZudW0obWlkT3ApICsgYCIvPmAgKwoJCQlgPHN0b3Agb2Zmc2V0PSJgICsgcGN0bnVtKHBjdChyT3V0K291dHdhcmRCbG9vbSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSJgICsgZm51bShibG9vbU9wKSArIGAiLz5gICsKCQkJYDxzdG9wIG9mZnNldD0iYCArIHBjdG51bShwY3Qock91dCtvdXR3YXJkQmxvb20rMSkpICsgYCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+YCArCgkJCWA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9ImAgKyBtZXRhbEhpICsgYCIgc3RvcC1vcGFjaXR5PSIwIi8+PC9yYWRpYWxHcmFkaWVudD5gCgl9CgoJcm5kIDo9IG5ld1BSTkcoImVuZXJneSIgKyBzYWx0KQoJZ2lkQSwgZ2lkQiA6PSAiZ2xvd0EiK3NhbHQsICJnbG93QiIrc2FsdAoJZHVyIDo9IHJuZC5mbG9hdEluKDIuMTMsIDMuMikKCXBoYXNlIDo9IHJuZC5mbG9hdEluKDAsIGR1cikKCglzdG9wc0EgOj0gZG9udXRTdG9wcygyLjUqMi4wLzMuMCowLjUsIDAuNCwgZ2lkQSkKCXN0b3BzQiA6PSBkb251dFN0b3BzKDguMCoyLjAvMy4wKjAuNSwgMC42LCBnaWRCKQoKCWVuZXJneSA6PSBgPGRlZnM+YCArIHN0b3BzQSArIHN0b3BzQiArIGA8L2RlZnM+YCArCgkJYDxnPmAgKwoJCWA8Y2lyY2xlIGN4PSJgICsgZm51bShzdWJqWCkgKyBgIiBjeT0iYCArIGZudW0oc3VialkpICsgYCIgcj0iYCArIGZudW0oZ2xvd1IpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkQSArIGApIi8+YCArCgkJYDxjaXJjbGUgY3g9ImAgKyBmbnVtKHN1YmpYKSArIGAiIGN5PSJgICsgZm51bShzdWJqWSkgKyBgIiByPSJgICsgZm51bShnbG93UikgKyBgIiBmaWxsPSJ1cmwoI2AgKyBnaWRCICsgYCkiIG9wYWNpdHk9IjAiIGNsYXNzPSJndC1nbG93IiBzdHlsZT0iLS1nbG93LWR1cjpgICsgZm51bShkdXIpICsgYHM7LS1nbG93LWRlbGF5Oi1gICsgZm51bShwaGFzZSkgKyBgcyIvPmAgKwoJCWA8L2c+YAoKCXJldHVybiBgPGRlZnM+YCArIGRlZnMgKyBgPC9kZWZzPmAgKyBvdXRlciArIGVuZXJneQp9Cgpjb25zdCAoCgltb3Rpb25WRHVyLCBtb3Rpb25IRHVyLCBtb3Rpb25SRHVyLCBtb3Rpb25TRHVyID0gMy40LCA0LjY2LCA1LjgxLCA2LjU2Cgltb3Rpb25Sb3RNaW4sIG1vdGlvblJvdE1heCAgICAgICAgICAgICAgICAgICAgID0gNC4wLCA4LjAKCW1vdGlvblNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLjA5CikKCmZ1bmMgbW90aW9uUGhhc2VzKHNhbHQgc3RyaW5nKSAodnBoYXNlLCBocGhhc2UsIHJwaGFzZSwgc3BoYXNlLCByb3REZWcgZmxvYXQ2NCkgewoJcm5kIDo9IG5ld1BSTkcoIm1vdGlvbiIgKyBzYWx0KQoJdnBoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uVkR1cikKCWhwaGFzZSA9IHJuZC5mbG9hdEluKDAsIG1vdGlvbkhEdXIpCglycGhhc2UgPSBybmQuZmxvYXRJbigwLCBtb3Rpb25SRHVyKQoJc3BoYXNlID0gcm5kLmZsb2F0SW4oMCwgbW90aW9uU0R1cikKCXJvdERlZyA9IHJuZC5mbG9hdEluKG1vdGlvblJvdE1pbiwgbW90aW9uUm90TWF4KQoJcmV0dXJuCn0KCmZ1bmMgYXBwbHlNb3Rpb24oY29udGVudCwgc2FsdCBzdHJpbmcpIHN0cmluZyB7Cgl2cGhhc2UsIGhwaGFzZSwgcnBoYXNlLCBzcGhhc2UsIHJvdERlZyA6PSBtb3Rpb25QaGFzZXMoc2FsdCkKCglyZXR1cm4gYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKGAgKyBmbnVtKHN1YmpYKSArIGAgYCArIGZudW0oc3VialkpICsgYCkiPmAgKwoJCWA8ZyBjbGFzcz0iZ3QtdiIgc3R5bGU9Ii0tdi1kdXI6YCArIGZudW0obW90aW9uVkR1cikgKyBgczstLXYtZGVsYXk6LWAgKyBmbnVtKHZwaGFzZSkgKyBgcyI+YCArCgkJYDxnIGNsYXNzPSJndC1oIiBzdHlsZT0iLS1oLWR1cjpgICsgZm51bShtb3Rpb25IRHVyKSArIGBzOy0taC1kZWxheTotYCArIGZudW0oaHBoYXNlKSArIGBzIj5gICsKCQlgPGcgY2xhc3M9Imd0LXIiIHN0eWxlPSItLXItZHVyOmAgKyBmbnVtKG1vdGlvblJEdXIpICsgYHM7LS1yLWRlbGF5Oi1gICsgZm51bShycGhhc2UpICsgYHM7LS1yb3QtZGVnOmAgKyBmbnVtKHJvdERlZykgKyBgZGVnIj5gICsKCQlgPGcgY2xhc3M9Imd0LXMiIHN0eWxlPSItLXMtZHVyOmAgKyBmbnVtKG1vdGlvblNEdXIpICsgYHM7LS1zLWRlbGF5Oi1gICsgZm51bShzcGhhc2UpICsgYHMiPmAgKwoJCWA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtYCArIGZudW0oc3VialgpICsgYCAtYCArIGZudW0oc3VialkpICsgYCkiPmAgKwoJCWNvbnRlbnQgKyBgPC9nPjwvZz48L2c+PC9nPjwvZz48L2c+YAp9Cgpjb25zdCBkb3RYLCBkb3RZID0gc3VialggKyA1MCwgc3VialkgKyA0MgoKZnVuYyByZW5kZXJTdGF0dXNCYWRnZShhY3RpdmUgYm9vbCkgc3RyaW5nIHsKCWlmIGFjdGl2ZSB7CgkJcmV0dXJuIGA8Y2lyY2xlIGN4PSJgICsgZm51bShkb3RYKSArIGAiIGN5PSJgICsgZm51bShkb3RZKSArIGAiIHI9IjQiIGZpbGw9IiM3ZmQ4OGYiLz5gICsKCQkJYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKGAgKyBmbnVtKGRvdFgpICsgYCBgICsgZm51bShkb3RZKSArIGApIj48Y2lyY2xlIHI9IjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzdmZDg4ZiIgc3Ryb2tlLXdpZHRoPSIxLjIiIGNsYXNzPSJndC1iYWRnZS1wdWxzZSIgb3BhY2l0eT0iMC44Ii8+PC9nPmAKCX0KCXJldHVybiBgPGNpcmNsZSBjeD0iYCArIGZudW0oZG90WCkgKyBgIiBjeT0iYCArIGZudW0oZG90WSkgKyBgIiByPSI0IiBmaWxsPSIjNWE1ZjZiIi8+YAp9Cgp0eXBlIGZhY2V0U3BhbiBzdHJ1Y3QgewoJc3RhcnQsIGVuZCBpbnQKCXJpbmdNZW1iZXIgYm9vbAp9CgpmdW5jIHNjYW5GYWNldFNwYW5zKG1hcmt1cCBzdHJpbmcpIFtdZmFjZXRTcGFuIHsKCXZhciBzcGFucyBbXWZhY2V0U3BhbgoJaSA6PSAwCglmb3IgewoJCXJlbCA6PSBzdHJpbmdzLkluZGV4KG1hcmt1cFtpOl0sICI8IikKCQlpZiByZWwgPCAwIHsKCQkJYnJlYWsKCQl9CgkJc3RhcnQgOj0gaSArIHJlbAoJCXJlbEVuZCA6PSBzdHJpbmdzLkluZGV4KG1hcmt1cFtzdGFydDpdLCAiLz4iKQoJCWlmIHJlbEVuZCA8IDAgewoJCQlicmVhawoJCX0KCQllbmQgOj0gc3RhcnQgKyByZWxFbmQgKyAyCgkJdGFnIDo9IG1hcmt1cFtzdGFydDplbmRdCgkJaSA9IGVuZAoJCWlzRmFjZXRUYWcgOj0gc3RyaW5ncy5IYXNQcmVmaXgodGFnLCAiPHBhdGgiKSB8fCBzdHJpbmdzLkhhc1ByZWZpeCh0YWcsICI8Y2lyY2xlIikgfHwgc3RyaW5ncy5IYXNQcmVmaXgodGFnLCAiPHBvbHlnb24iKQoJCWlmICFpc0ZhY2V0VGFnIHsKCQkJY29udGludWUKCQl9CgkJc3BhbnMgPSBhcHBlbmQoc3BhbnMsIGZhY2V0U3BhbntzdGFydDogc3RhcnQsIGVuZDogZW5kLCByaW5nTWVtYmVyOiBzdHJpbmdzLkNvbnRhaW5zKHRhZywgYGNsYXNzPSJmImApfSkKCX0KCXJldHVybiBzcGFucwp9Cgpjb25zdCAoCglmaXJlU3dlZXBBeGlzID0gLTM1LjAgKiBtYXRoLlBpIC8gMTgwCglmaXJlU3dlZXBTcGFuID0gMS42IC8vIHNlY29uZHMgYSBzd2VlcCB0YWtlcyB0byBjcm9zcyB0aGUgc3RvbmUKKQoKZnVuYyBhcHBseUNhc2NhZGUobWFya3VwLCB0aWRTdHIgc3RyaW5nLCBmcyAqZmFjZXRTdHlsZSkgKG92ZXJsYXkgc3RyaW5nLCBjc3Mgc3RyaW5nKSB7CglpZiBmcyA9PSBuaWwgfHwgbGVuKGZzLnJpbmdDZW50KSA9PSAwIHsKCQlyZXR1cm4gIiIsICIiCgl9CglzcGFucyA6PSBzY2FuRmFjZXRTcGFucyhtYXJrdXApCglybmQgOj0gbmV3UFJORygiZmlyZSIgKyB0aWRTdHIpCglfLCBfLCBycGhhc2UsIF8sIF8gOj0gbW90aW9uUGhhc2VzKHRpZFN0cikKCXBlcmlvZCA6PSAyICogbW90aW9uUkR1cgoJYXhpcyA6PSBmaXJlU3dlZXBBeGlzICsgcm5kLmZsb2F0SW4oLTAuMywgMC4zKQoJZHgsIGR5IDo9IG1hdGguQ29zKGF4aXMpLCBtYXRoLlNpbihheGlzKQoKCWthLCBrYiA6PSAiZmEiK3RpZFN0ciwgImZiIit0aWRTdHIKCXNoYXBlIDo9IGZ1bmMoYXQgZmxvYXQ2NCkgc3RyaW5nIHsKCQlyZXR1cm4gZm51bTEoYXQpICsgYCV7b3BhY2l0eTowfWAgKyBmbnVtMShhdCsyKSArIGAle29wYWNpdHk6dmFyKC0tbyk7ZmlsbDojZmZmfWAgKwoJCQlmbnVtMShhdCs0LjUpICsgYCV7b3BhY2l0eTouNDtmaWxsOnZhcigtLWMpfWAgKyBmbnVtMShhdCs4KSArIGAle29wYWNpdHk6MH1gCgl9CglwZXIgOj0gZm51bShwZXJpb2QpCgljc3MgPSBgLmAgKyBrYSArIGB7YW5pbWF0aW9uOmAgKyBrYSArIGAgYCArIHBlciArIGBzIGxpbmVhciBpbmZpbml0ZX0uYCArIGtiICsgYHthbmltYXRpb246YCArIGtiICsgYCBgICsgcGVyICsgYHMgbGluZWFyIGluZmluaXRlfWAgKwoJCWBAa2V5ZnJhbWVzIGAgKyBrYSArIGB7YCArIHNoYXBlKDEyLjUpICsgYDEwMCV7b3BhY2l0eTowfX1gICsKCQlgQGtleWZyYW1lcyBgICsga2IgKyBge2AgKyBzaGFwZSg2Mi41KSArIGAxMDAle29wYWNpdHk6MH19YAoKCXZhciBvdXQgc3RyaW5ncy5CdWlsZGVyCgl0eXBlIGdsaW50QXQgc3RydWN0IHsKCQl4LCB5LCBkZWxheSBmbG9hdDY0CgkJcnVsZSAgICAgICAgc3RyaW5nCgl9Cgl2YXIgY2FuZHMgW11nbGludEF0CglyaW5nSWR4IDo9IC0xCglmb3IgXywgc3BhbiA6PSByYW5nZSBzcGFucyB7CgkJaWYgIXNwYW4ucmluZ01lbWJlciB7CgkJCWNvbnRpbnVlCgkJfQoJCXJpbmdJZHgrKwoJCWlmIHJpbmdJZHggPj0gbGVuKGZzLnJpbmdDZW50KSB7CgkJCWJyZWFrCgkJfQoJCWMgOj0gZnMucmluZ0NlbnRbcmluZ0lkeF0KCQljb2xvciwgY29sb3JPcCA6PSBmcy5mbGFzaC5zYW1wbGUoYy54LCBjLnkpCgkJcG9zIDo9ICgoYy54LXN1YmpYKSpkeCArIChjLnktcGllY2VDWSkqZHkpIC8gKDMwICogc3RvbmVTY2FsZSkKCQluYW1lIDo9IGthCgkJaWYgcm5kLmZsb2F0SW4oMCwgMSkgPCAwLjUgewoJCQluYW1lLCBwb3MgPSBrYiwgLXBvcwoJCX0KCQlkZWxheSA6PSBycGhhc2UgLSAwLjI1Km1vdGlvblJEdXIgKyBwZXJpb2QgLSBwb3MqZmlyZVN3ZWVwU3Bhbi8yCgkJdGFnIDo9IG1hcmt1cFtzcGFuLnN0YXJ0OnNwYW4uZW5kXQoJCWdlb21FbmQgOj0gc3RyaW5ncy5JbmRleCh0YWcsIGAiIGZpbGw9YCkKCQlpZiBnZW9tRW5kIDwgMCB7CgkJCWNvbnRpbnVlCgkJfQoJCWNhbmRzID0gYXBwZW5kKGNhbmRzLCBnbGludEF0e2MueCwgYy55LCBkZWxheSwgbmFtZX0pCgkJb3V0LldyaXRlU3RyaW5nKHRhZ1s6Z2VvbUVuZF0gKyBgIiBvcGFjaXR5PSIwIiBjbGFzcz0iYCArIG5hbWUgKyBgIiBzdHlsZT0iLS1vOmAgKyBmbnVtKG1hdGguUm91bmQobWF0aC5NaW4oMSwgcm5kLmZsb2F0SW4oMC44NSwgMS4wNSkqY29sb3JPcCkqMTApLzEwKSArIGA7LS1jOmAgKyBoZXgzKGNvbG9yKSArCgkJCWA7YW5pbWF0aW9uLWRlbGF5Oi1gICsgZm51bTEoZGVsYXkpICsgYHMiLz5gKQoJfQoJaWYgbGVuKGNhbmRzKSA+IDAgJiYgZnMucHJvZi5zYXQgPj0gMC4zIHsKCQluIDo9IDMKCQlpZiBmcy5wcm9mLnNhdCA8IDAuNiB7CgkJCW4gPSAyIC8vIHF1YXJ0eiwgdG9wYXo6IGxlc3MgZmlyZSwgZmV3ZXIgc3RhcnMKCQl9CgkJZ2EsIGdiIDo9ICJnYSIrdGlkU3RyLCAiZ2IiK3RpZFN0cgoJCXN0YXIgOj0gZnVuYyhhdCBmbG9hdDY0KSBzdHJpbmcgewoJCQlyZXR1cm4gZm51bTEoYXQrMC42KSArIGAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjIpIHJvdGF0ZSgwKX1gICsKCQkJCWZudW0xKGF0KzIuMikgKyBgJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpIHJvdGF0ZSgyNWRlZyl9YCArCgkJCQlmbnVtMShhdCs0LjQpICsgYCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguMzUpIHJvdGF0ZSg1NWRlZyl9YAoJCX0KCQljc3MgKz0gYC5gICsgZ2EgKyBgLC5gICsgZ2IgKyBge29wYWNpdHk6MH1gICsKCQkJYC5gICsgZ2EgKyBge2FuaW1hdGlvbjpgICsgZ2EgKyBgIGAgKyBwZXIgKyBgcyBsaW5lYXIgaW5maW5pdGV9LmAgKyBnYiArIGB7YW5pbWF0aW9uOmAgKyBnYiArIGAgYCArIHBlciArIGBzIGxpbmVhciBpbmZpbml0ZX1gICsKCQkJYEBrZXlmcmFtZXMgYCArIGdhICsgYHswJXtvcGFjaXR5OjB9YCArIHN0YXIoMTIuNSkgKyBgMTAwJXtvcGFjaXR5OjB9fWAgKwoJCQlgQGtleWZyYW1lcyBgICsgZ2IgKyBgezAle29wYWNpdHk6MH1gICsgc3Rhcig2Mi41KSArIGAxMDAle29wYWNpdHk6MH19YAoJCXIgOj0gNy41ICogc3RvbmVTY2FsZQoJCXcgOj0gMC45ICogc3RvbmVTY2FsZQoJCXJheSA6PSBgTTAgLWAgKyBmbnVtMShyKSArIGBMYCArIGZudW0xKHcpICsgYCAtYCArIGZudW0xKHcpICsgYExgICsgZm51bTEocikgKyBgIDBMYCArIGZudW0xKHcpICsgYCBgICsgZm51bTEodykgKwoJCQlgTDAgYCArIGZudW0xKHIpICsgYEwtYCArIGZudW0xKHcpICsgYCBgICsgZm51bTEodykgKyBgTC1gICsgZm51bTEocikgKyBgIDBMLWAgKyBmbnVtMSh3KSArIGAgLWAgKyBmbnVtMSh3KSArIGBaYAoJCXZhciBnIHN0cmluZ3MuQnVpbGRlcgoJCXVzZWQgOj0gbWFwW2ludF1ib29se30KCQlmb3IgayA6PSAwOyBrIDwgbiAmJiBrIDwgbGVuKGNhbmRzKTsgaysrIHsKCQkJaSA6PSBybmQuaW50bihsZW4oY2FuZHMpKQoJCQlmb3IgdHJpZXMgOj0gMDsgdXNlZFtpXSAmJiB0cmllcyA8IGxlbihjYW5kcyk7IHRyaWVzKysgewoJCQkJaSA9IChpICsgMSkgJSBsZW4oY2FuZHMpCgkJCX0KCQkJdXNlZFtpXSA9IHRydWUKCQkJYyA6PSBjYW5kc1tpXQoJCQljbHMgOj0gImdhIiArIHRpZFN0cgoJCQlpZiBjLnJ1bGUgPT0ga2IgewoJCQkJY2xzID0gImdiIiArIHRpZFN0cgoJCQl9CgkJCWcuV3JpdGVTdHJpbmcoYDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKGAgKyBmbnVtMShjLngpICsgYCBgICsgZm51bTEoYy55KSArIGApIj48ZyBjbGFzcz0iYCArIGNscyArIGAiIG9wYWNpdHk9IjAiIHN0eWxlPSJhbmltYXRpb24tZGVsYXk6LWAgKyBmbnVtMShjLmRlbGF5KSArIGBzIj5gICsKCQkJCWA8cGF0aCBkPSJgICsgcmF5ICsgYCIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgcj0iYCArIGZudW0xKDEuMSpzdG9uZVNjYWxlKSArIGAiIGZpbGw9IiNmZmYiLz48L2c+PC9nPmApCgkJfQoJCWZzLmdsaW50cyA9IGcuU3RyaW5nKCkKCX0KCXJldHVybiBvdXQuU3RyaW5nKCksIGNzcwp9CgpmdW5jIHJlbmRlck1ldGFsTGFiZWxSZWN0KG1ldGFsSGksIG1ldGFsTG8gc3RyaW5nLCB4LCB5LCB3LCBoLCByeCBmbG9hdDY0LCBzYWx0IHN0cmluZykgc3RyaW5nIHsKCWdpZCA6PSAibGciICsgc2FsdAoJYnJpZ2h0IDo9IGxpZ2h0ZW4obWV0YWxIaSwgMC40KQoJZGVlcCA6PSBtaXhIZXgobWV0YWxMbywgIiMwMDAwMDAiLCAwLjUpCglzdCA6PSBmdW5jKG9mZiwgYyBzdHJpbmcpIHN0cmluZyB7IHJldHVybiBgPHN0b3Agb2Zmc2V0PSJgICsgb2ZmICsgYCIgc3RvcC1jb2xvcj0iYCArIGMgKyBgIi8+YCB9CglkZWZzIDo9IGA8bGluZWFyR3JhZGllbnQgaWQ9ImAgKyBnaWQgKyBgIj5gICsKCQlzdCgiMCIsIG1ldGFsTG8pICsgc3QoIi4yMiIsIG1ldGFsSGkpICsgc3QoIi40MiIsIGJyaWdodCkgKyBzdCgiLjYyIiwgbWV0YWxIaSkgKyBzdCgiMSIsIG1ldGFsTG8pICsgYDwvbGluZWFyR3JhZGllbnQ+YAoJcmVjdCA6PSBgPHJlY3QgeD0iYCArIGNudW0oeCkgKyBgIiB5PSJgICsgY251bSh5KSArIGAiIHdpZHRoPSJgICsgY251bSh3KSArIGAiIGhlaWdodD0iYCArIGNudW0oaCkgKyBgIiByeD0iYCArIGNudW0ocngpICsgYCIgZmlsbD0idXJsKCNgICsgZ2lkICsgYCkiIHN0cm9rZT0iYCArIGRlZXAgKyBgIiBzdHJva2Utd2lkdGg9Ii44Ii8+YAoJY29uc3QgaW5fID0gMC45CglhcmMgOj0gYCBhYCArIGNudW0ocngtaW5fKSArIGAgYCArIGNudW0ocngtaW5fKSArIGAgMCAwIGAKCWQgOj0gY251bShyeCAtIGluXykKCWVkZ2VzIDo9IGA8ZyBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPmAgKwoJCWA8cGF0aCBkPSJNYCArIGNudW0oeCtpbl8pICsgYCBgICsgY251bSh5K3J4KSArIGFyYyArIGAxIGAgKyBkICsgYCAtYCArIGQgKyBgSGAgKyBjbnVtKHgrdy1yeCkgKyBhcmMgKyBgMSBgICsgZCArIGAgYCArIGQgKyBgIiBzdHJva2U9ImAgKyBsaWdodGVuKG1ldGFsSGksIDAuNDUpICsgYCIgc3Ryb2tlLXdpZHRoPSIuNDUiIG9wYWNpdHk9Ii40Ii8+YCArCgkJYDxwYXRoIGQ9Ik1gICsgY251bSh4K2luXykgKyBgIGAgKyBjbnVtKHkraC1yeCkgKyBhcmMgKyBgMCBgICsgZCArIGAgYCArIGQgKyBgSGAgKyBjbnVtKHgrdy1yeCkgKyBhcmMgKyBgMCBgICsgZCArIGAgLWAgKyBkICsgYCIgc3Ryb2tlPSJgICsgZGVlcCArIGAiIHN0cm9rZS13aWR0aD0iLjUiIG9wYWNpdHk9Ii41Ii8+PC9nPmAKCXNpZCA6PSAic2giICsgc2FsdAoJZGVmcyArPSBgPGcgaWQ9ImAgKyBzaWQgKyBgIj48Y2lyY2xlIGN4PSIuMTUiIGN5PSIuMiIgcj0iMS42IiBmaWxsPSJgICsgZGVlcCArIGAiIG9wYWNpdHk9Ii41NSIvPmAgKwoJCWA8Y2lyY2xlIHI9IjEuMyIgZmlsbD0iYCArIG1peEhleChtZXRhbExvLCBtZXRhbEhpLCAwLjQpICsgYCIgc3Ryb2tlPSJgICsgZGVlcCArIGAiIHN0cm9rZS13aWR0aD0iLjI1Ii8+YCArCgkJYDxjaXJjbGUgY3g9Ii0uNCIgY3k9Ii0uNCIgcj0iLjc1IiBmaWxsPSJgICsgbGlnaHRlbihtZXRhbEhpLCAwLjMpICsgYCIgb3BhY2l0eT0iLjM1Ii8+PC9nPmAKCXNlZWQgOj0gMAoJZm9yIGsgOj0gMDsgayA8IGxlbihzYWx0KTsgaysrIHsKCQlzZWVkICs9IGludChzYWx0W2tdKQoJfQoJaGVhZHMsIHNsb3RzIDo9ICIiLCAiIgoJbiA6PSAwCglmb3IgXywgcHggOj0gcmFuZ2UgW11mbG9hdDY0e3ggKyA0LjIsIHggKyB3IC0gNC4yfSB7CgkJZm9yIF8sIHB5IDo9IHJhbmdlIFtdZmxvYXQ2NHt5ICsgMy43LCB5ICsgaCAtIDMuN30gewoJCQloZWFkcyArPSBgPHVzZSBocmVmPSIjYCArIHNpZCArIGAiIHg9ImAgKyBjbnVtKHB4KSArIGAiIHk9ImAgKyBjbnVtKHB5KSArIGAiLz5gCgkJCWFuZyA6PSBmbG9hdDY0KChzZWVkKjM3K24qNzEpJTE4MCkgKiBtYXRoLlBpIC8gMTgwCgkJCWR4LCBkeSA6PSAwLjkqbWF0aC5Db3MoYW5nKSwgMC45Km1hdGguU2luKGFuZykKCQkJc2xvdHMgKz0gYE1gICsgY251bShweC1keCkgKyBgIGAgKyBjbnVtKHB5LWR5KSArIGBsYCArIGNudW0oMipkeCkgKyBgIGAgKyBjbnVtKDIqZHkpCgkJCW4rKwoJCX0KCX0KCXJpdmV0cyA6PSBoZWFkcyArIGA8cGF0aCBkPSJgICsgc2xvdHMgKyBgIiBzdHJva2U9ImAgKyBkZWVwICsgYCIgc3Ryb2tlLXdpZHRoPSIuNDUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPmAKCXJldHVybiBgPGRlZnM+YCArIGRlZnMgKyBgPC9kZWZzPmAgKyByZWN0ICsgZWRnZXMgKyByaXZldHMKfQoKY29uc3QgKAoJcGxhdGVGb250ICAgID0gYCdESU4gQWx0ZXJuYXRlJyxCYWhuc2NocmlmdCwnUm9ib3RvIENvbmRlbnNlZCcsc2Fucy1zZXJpZmAKCXBsYXRlU2l6ZSAgICA9IDguNgoJcGxhdGVTcGFjaW5nID0gMS4xCglwbGF0ZU1heFcgICAgPSAxMDAuMAopCgpmdW5jIHJlbmRlclBsYXRlVGV4dChsYWJlbCwgZmlsbCwgbWV0YWxIaSBzdHJpbmcpIHN0cmluZyB7CglnIDo9IGA8ZyBmb250LXNpemU9ImAgKyBjbnVtKHBsYXRlU2l6ZSkgKyBgIiBsZXR0ZXItc3BhY2luZz0iYCArIGNudW0ocGxhdGVTcGFjaW5nKSArIGAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJgICsgcGxhdGVGb250ICsgYCIgZm9udC13ZWlnaHQ9IjcwMCJgCglpZiBlc3QgOj0gZmxvYXQ2NChsZW4obGFiZWwpKSoocGxhdGVTaXplKjAuNTIrcGxhdGVTcGFjaW5nKTsgZXN0ID4gcGxhdGVNYXhXIHsKCQlnICs9IGAgdGV4dExlbmd0aD0iYCArIGNudW0ocGxhdGVNYXhXKSArIGAiIGxlbmd0aEFkanVzdD0ic3BhY2luZ0FuZEdseXBocyJgCgl9Cgl4IDo9IGNudW0oc3VialgpCglyZXR1cm4gZyArIGA+PHRleHQgeD0iYCArIHggKyBgIiB5PSIxNDQuOSIgZmlsbD0iYCArIGxpZ2h0ZW4obWV0YWxIaSwgMC41KSArIGAiIG9wYWNpdHk9Ii40NSI+YCArIGxhYmVsICsgYDwvdGV4dD5gICsKCQlgPHRleHQgeD0iYCArIHggKyBgIiB5PSIxNDQuNCIgZmlsbD0iYCArIGZpbGwgKyBgIj5gICsgbGFiZWwgKyBgPC90ZXh0PjwvZz5gCn0KCmZ1bmMgcmVuZGVyU2VyaWFsVGV4dCh0aWRTdHIsIGNvbG9yIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBgPHRleHQgeD0iYCArIGZudW0oc3VialgpICsgYCIgeT0iMTU5LjUiIGZvbnQtc2l6ZT0iNi41IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSJgICsgY29sb3IgKyBgIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLG1vbm9zcGFjZSIgb3BhY2l0eT0iMC44NSI+I2AgKyB0aWRTdHIgKyBgPC90ZXh0PmAKfQoKdHlwZSBuYW1lZENvbG9yIHN0cnVjdHsgaGV4LCBuYW1lIHN0cmluZyB9Cgp2YXIgc3RvbmVCeUNoYWluID0gbWFwW3N0cmluZ11zdHJpbmd7CgkiVE9QQVotMSI6ICAgICJUb3BheiIsCgkiU0FQUEhJUkUtMSI6ICJTYXBwaGlyZSIsCgkiUEVBUkwtMSI6ICAgICJQZWFybCIsCgkiR05PTEFORC0xIjogIkRpYW1vbmQiLAp9Cgp2YXIgc3RvbmVQYWxldHRlcyA9IG1hcFtzdHJpbmddW11uYW1lZENvbG9yewoJIlNhcHBoaXJlIjogewoJCXsiIzJhNWZlMCIsICJCbHVlIn0sIHsiI2ZmNmVhNCIsICJQaW5rIn0sIHsiI2ZmODUwMSIsICJPcmFuZ2UifSwgeyIjZmZkNTAwIiwgIlllbGxvdyJ9LAoJCXsiIzFhYTg4YSIsICJHcmVlbiJ9LCB7IiNhNjU4ZmYiLCAiVmlvbGV0In0sIHsiI2U2ZTlmOCIsICJXaGl0ZSJ9LCB7IiNmZjhmNzIiLCAiUGFkcGFyYWRzY2hhIn0sCgl9LAoJIlRvcGF6IjogewoJCXsiI2Y1ZWRkMSIsICJDb2xvcmxlc3MifSwgeyIjZmZhMzAwIiwgIkltcGVyaWFsIn0sIHsiI2ZmZDEwMCIsICJHb2xkZW4ifSwKCQl7IiNjOTZhMjgiLCAiU2hlcnJ5IEJyb3duIn0sIHsiIzg2Y2RmMiIsICJTa3kgQmx1ZSJ9LCB7IiNmZjk2YmEiLCAiUGluayJ9LAoJfSwKCSJRdWFydHoiOiB7CgkJeyIjZWVmMmY3IiwgIlJvY2sgQ3J5c3RhbCJ9LCB7IiM5YjU5ZDYiLCAiQW1ldGh5c3QifSwgeyIjZjJiMDFlIiwgIkNpdHJpbmUifSwKCQl7IiNmNWI5Y2EiLCAiUm9zZSBRdWFydHoifSwgeyIjN2Q2MjUwIiwgIlNtb2t5IFF1YXJ0eiJ9LCB7IiNhOWQ5YTIiLCAiUHJhc2lvbGl0ZSJ9LAoJfSwKCSJEaWFtb25kIjogewoJCXsiI2YzZjZmYyIsICJDb2xvcmxlc3MifSwgeyIjZmZjNDAwIiwgIkZhbmN5IFllbGxvdyJ9LCB7IiNmZjRmOWEiLCAiRmFuY3kgUGluayJ9LAoJCXsiIzFmOGZmZiIsICJGYW5jeSBCbHVlIn0sIHsiIzE0YzQ2ZSIsICJGYW5jeSBHcmVlbiJ9LCB7IiNkOWE1NjAiLCAiQ2hhbXBhZ25lIn0sCgkJeyIjYjQ1NjFhIiwgIkNvZ25hYyJ9LCB7IiMyYjJkMzQiLCAiQmxhY2sifSwKCQl7IiNlMDI0M2EiLCAiUmVkIn0sIHsiI2ZmN2ExYSIsICJPcmFuZ2UifSwgeyIjOWI0ZmQ2IiwgIlB1cnBsZSJ9LAoJfSwKCSJQZWFybCI6IHsKCQl7IiNmOGY2ZjAiLCAiV2hpdGUifSwgeyIjZjBlNGM4IiwgIkNyZWFtIn0sIHsiIzNhM2EzYyIsICJCbGFjayJ9LCB7IiNjOGNkZDQiLCAiU2lsdmVyIn0sCgkJeyIjZDRhZjZhIiwgIkdvbGQifSwgeyIjZjBkNGRjIiwgIlBpbmsifSwgeyIjZjJjOWE4IiwgIlBlYWNoIn0sIHsiI2Q4Y2JlMCIsICJMYXZlbmRlciJ9LAoJfSwKfQoKdmFyIGNvbG9yV2VpZ2h0cyA9IG1hcFtzdHJpbmddW11pbnR7CgkiRGlhbW9uZCI6IHszMCwgMTgsIDUsIDQsIDMsIDE0LCAxMiwgOCwgMSwgMywgMn0sCgkiUXVhcnR6IjogezI1LCAyNSwgMTgsIDksIDE4LCA1fSwKfQoKY29uc3QgZGVmYXVsdENvbG9yV2VpZ2h0ID0gNQoKZnVuYyBjb2xvcldlaWdodChzdG9uZSBzdHJpbmcsIGlkeCBpbnQpIGludCB7Cgl3LCBvayA6PSBjb2xvcldlaWdodHNbc3RvbmVdCglpZiAhb2sgewoJCXJldHVybiAxCgl9CglpZiBpZHggPCBsZW4odykgewoJCXJldHVybiB3W2lkeF0KCX0KCXJldHVybiBkZWZhdWx0Q29sb3JXZWlnaHQKfQoKZnVuYyBQaWNrQ29sb3JJbmRleChzdG9uZSBzdHJpbmcsIHJvbGwgdWludDY0KSBpbnQgewoJbiA6PSBDb2xvclBhbGV0dGVTaXplKHN0b25lKQoJdG90YWwgOj0gMAoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJdG90YWwgKz0gY29sb3JXZWlnaHQoc3RvbmUsIGkpCgl9CglyIDo9IGludChyb2xsICUgdWludDY0KHRvdGFsKSkKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXIgLT0gY29sb3JXZWlnaHQoc3RvbmUsIGkpCgkJaWYgciA8IDAgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXJldHVybiBuIC0gMQp9CgpmdW5jIENvbG9yUHJvYmFiaWxpdHkoc3RvbmUgc3RyaW5nLCBpZHggaW50KSBmbG9hdDY0IHsKCW4gOj0gQ29sb3JQYWxldHRlU2l6ZShzdG9uZSkKCXRvdGFsIDo9IDAKCWZvciBpIDo9IDA7IGkgPCBuOyBpKysgewoJCXRvdGFsICs9IGNvbG9yV2VpZ2h0KHN0b25lLCBpKQoJfQoJcmV0dXJuIGZsb2F0NjQoY29sb3JXZWlnaHQoc3RvbmUsIGlkeCkpIC8gZmxvYXQ2NCh0b3RhbCkKfQoKZnVuYyBDb2xvclJhcml0eUNTVihzdG9uZSBzdHJpbmcpIHN0cmluZyB7CgluIDo9IENvbG9yUGFsZXR0ZVNpemUoc3RvbmUpCgl0b3RhbCA6PSAwCglmb3IgaSA6PSAwOyBpIDwgbjsgaSsrIHsKCQl0b3RhbCArPSBjb2xvcldlaWdodChzdG9uZSwgaSkKCX0KCW91dCA6PSBtYWtlKFtdc3RyaW5nLCBuKQoJZm9yIGkgOj0gMDsgaSA8IG47IGkrKyB7CgkJcG0gOj0gY29sb3JXZWlnaHQoc3RvbmUsIGkpICogMTAwMCAvIHRvdGFsCgkJb3V0W2ldID0gY29sb3JGb3JTdG9uZShzdG9uZSwgaSkubmFtZSArICI6IiArIHVmbXQuU3ByaW50ZigiJWQuJWQiLCBwbS8xMCwgcG0lMTApCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKG91dCwgIjsiKQp9CgpmdW5jIENoYWluQWx3YXlzQWN0aXZlKGNoYWluIHN0cmluZykgYm9vbCB7IHJldHVybiBjaGFpbiA9PSAiR05PTEFORC0xIiB9Cgp2YXIgc3RvbmVOYW1lcyA9IFtdc3RyaW5neyJTYXBwaGlyZSIsICJUb3BheiIsICJQZWFybCIsICJEaWFtb25kIiwgIlF1YXJ0eiJ9CgpmdW5jIHJlZ2lzdGVyU3RvbmVOYW1lKHN0b25lIHN0cmluZykgewoJZm9yIF8sIHMgOj0gcmFuZ2Ugc3RvbmVOYW1lcyB7CgkJaWYgcyA9PSBzdG9uZSB7CgkJCXJldHVybgoJCX0KCX0KCXN0b25lTmFtZXMgPSBhcHBlbmQoc3RvbmVOYW1lcywgc3RvbmUpCn0KCmZ1bmMgU2V0U3RvbmVGb3JDaGFpbihjaGFpbk5hbWUsIHN0b25lIHN0cmluZykgewoJc3RvbmVCeUNoYWluW2NoYWluTmFtZV0gPSBzdG9uZQoJcmVnaXN0ZXJTdG9uZU5hbWUoc3RvbmUpCn0KCmZ1bmMgQWRkU3RvbmVDb2xvcihzdG9uZSwgaGV4LCBuYW1lIHN0cmluZykgewoJc3RvbmVQYWxldHRlc1tzdG9uZV0gPSBhcHBlbmQoc3RvbmVQYWxldHRlc1tzdG9uZV0sIG5hbWVkQ29sb3J7aGV4OiBoZXgsIG5hbWU6IG5hbWV9KQoJcmVnaXN0ZXJTdG9uZU5hbWUoc3RvbmUpCn0KCmZ1bmMgU3RvbmVOYW1lc0NTVigpIHN0cmluZyB7CglyZXR1cm4gc3RyaW5ncy5Kb2luKHN0b25lTmFtZXMsICI7IikKfQoKZnVuYyBDb2xvclBhbGV0dGVDU1Yoc3RvbmUgc3RyaW5nKSBzdHJpbmcgewoJcGFsZXR0ZSA6PSBzdG9uZVBhbGV0dGVzW3N0b25lXQoJcGFpcnMgOj0gbWFrZShbXXN0cmluZywgbGVuKHBhbGV0dGUpKQoJZm9yIGksIGMgOj0gcmFuZ2UgcGFsZXR0ZSB7CgkJcGFpcnNbaV0gPSBjLmhleCArICI6IiArIGMubmFtZQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYWlycywgIjsiKQp9CgpmdW5jIE1ldGFsVG9uZUhleChtZXRhbE5hbWUgc3RyaW5nKSBzdHJpbmcgewoJdCwgb2sgOj0gbWV0YWxzW21ldGFsTmFtZV0KCWlmICFvayB7CgkJcmV0dXJuICIiCgl9CglyZXR1cm4gdC5oaSArICI7IiArIHQubG8KfQoKZnVuYyBTdG9uZUZvckNoYWluKGNoYWluIHN0cmluZykgc3RyaW5nIHsKCWlmIHMsIG9rIDo9IHN0b25lQnlDaGFpbltjaGFpbl07IG9rIHsKCQlyZXR1cm4gcwoJfQoJcmV0dXJuICJRdWFydHoiCn0KCmZ1bmMgY29sb3JGb3JTdG9uZShzdG9uZSBzdHJpbmcsIGNvbG9ySWR4IGludCkgbmFtZWRDb2xvciB7CglwYWxldHRlIDo9IHN0b25lUGFsZXR0ZXNbc3RvbmVdCglpZiBsZW4ocGFsZXR0ZSkgPT0gMCB7CgkJcGFsZXR0ZSA9IHN0b25lUGFsZXR0ZXNbIlF1YXJ0eiJdCgl9CglpZiBjb2xvcklkeCA8IDAgewoJCWNvbG9ySWR4ID0gMAoJfQoJaWYgY29sb3JJZHggPj0gbGVuKHBhbGV0dGUpIHsKCQljb2xvcklkeCA9IGxlbihwYWxldHRlKSAtIDEKCX0KCXJldHVybiBwYWxldHRlW2NvbG9ySWR4XQp9CgpmdW5jIENvbG9yUGFsZXR0ZVNpemUoc3RvbmUgc3RyaW5nKSBpbnQgewoJaWYgbiA6PSBsZW4oc3RvbmVQYWxldHRlc1tzdG9uZV0pOyBuID4gMCB7CgkJcmV0dXJuIG4KCX0KCXJldHVybiBsZW4oc3RvbmVQYWxldHRlc1siUXVhcnR6Il0pCn0KCmZ1bmMgRmluZFNoYXBlSW5kZXgoc3RvbmUsIG5hbWUgc3RyaW5nKSAoaWR4IGludCwgb2sgYm9vbCkgewoJbmFtZXMgOj0gU2hhcGVOYW1lcwoJaWYgc3RvbmUgPT0gIlBlYXJsIiB7CgkJbmFtZXMgPSBQZWFybFNoYXBlTmFtZXMKCX0KCWZvciBpLCBzIDo9IHJhbmdlIG5hbWVzIHsKCQlpZiBzID09IG5hbWUgewoJCQlyZXR1cm4gaSwgdHJ1ZQoJCX0KCX0KCXJldHVybiAtMSwgZmFsc2UKfQoKZnVuYyBGaW5kQ29sb3JJbmRleChjaGFpbiwgY29sb3JOYW1lIHN0cmluZykgKGlkeCBpbnQsIG9rIGJvb2wpIHsKCXN0b25lIDo9IFN0b25lRm9yQ2hhaW4oY2hhaW4pCglwYWxldHRlIDo9IHN0b25lUGFsZXR0ZXNbc3RvbmVdCglpZiBsZW4ocGFsZXR0ZSkgPT0gMCB7CgkJcGFsZXR0ZSA9IHN0b25lUGFsZXR0ZXNbIlF1YXJ0eiJdCgl9Cglmb3IgaSwgYyA6PSByYW5nZSBwYWxldHRlIHsKCQlpZiBjLm5hbWUgPT0gY29sb3JOYW1lIHsKCQkJcmV0dXJuIGksIHRydWUKCQl9Cgl9CglyZXR1cm4gLTEsIGZhbHNlCn0KCnR5cGUgbWV0YWxUb25lIHN0cnVjdHsgaGksIGxvIHN0cmluZyB9Cgp2YXIgbWV0YWxzID0gbWFwW3N0cmluZ11tZXRhbFRvbmV7CgkiR29sZCI6ICAgICB7IiNhNDhiM2YiLCAiIzZhNTExNyJ9LAoJIlNpbHZlciI6ICAgeyIjOTU5ODljIiwgIiM1ZTY0NmMifSwKCSJCcm9uemUiOiAgIHsiIzg2NWIzNCIsICIjNTIzOTFkIn0sCgkiUGxhdGludW0iOiB7IiNjM2M2YzgiLCAiIzg3OTA5YSJ9LAoJIk9ic2lkaWFuIjogeyIjM2EzZDQ3IiwgIiMwZDBlMTIifSwKfQoKdmFyIE1ldGFsTmFtZXMgPSBbXXN0cmluZ3siR29sZCIsICJTaWx2ZXIiLCAiQnJvbnplIiwgIlBsYXRpbnVtIiwgIk9ic2lkaWFuIn0KCnR5cGUgbWV0YWxMYWJlbFRvbmUgc3RydWN0eyBiZywgdGV4dCBzdHJpbmcgfQoKdmFyIG1ldGFsTGFiZWwgPSBtYXBbc3RyaW5nXW1ldGFsTGFiZWxUb25lewoJIkdvbGQiOiAgICAgeyIjZjRkMDYwIiwgIiMwNDEyMWEifSwKCSJTaWx2ZXIiOiAgIHsiI2RmZTRlYSIsICIjMDQxMjFhIn0sCgkiQnJvbnplIjogICB7IiNjOTg4NGYiLCAiIzA0MTIxYSJ9LAoJIlBsYXRpbnVtIjogeyIjZWVmMmY1IiwgIiMwNDEyMWEifSwKCSJPYnNpZGlhbiI6IHsiIzVhNWY2YiIsICIjZThlOWYwIn0sCn0KCmZ1bmMgUmVuZGVyVG9rZW5UaHVtYlNWRyhjaGFpbiwgbWV0YWwgc3RyaW5nLCBzaGFwZUlkeCwgY29sb3JJZHggaW50LCBhY3RpdmUgYm9vbCwgdGlkU3RyIHN0cmluZykgc3RyaW5nIHsKCXN2ZywgXywgXywgXyA6PSByZW5kZXJUb2tlbihjaGFpbiwgbWV0YWwsIHNoYXBlSWR4LCBjb2xvcklkeCwgYWN0aXZlLCB0aWRTdHIsIHRydWUpCglyZXR1cm4gc3ZnCn0KCmZ1bmMgUmVuZGVyVG9rZW5TVkcoY2hhaW4sIG1ldGFsIHN0cmluZywgc2hhcGVJZHgsIGNvbG9ySWR4IGludCwgYWN0aXZlIGJvb2wsIHRpZFN0ciBzdHJpbmcpIChzdmcgc3RyaW5nLCBzdG9uZSBzdHJpbmcsIGNvbG9ySGV4IHN0cmluZywgY29sb3JOYW1lIHN0cmluZykgewoJcmV0dXJuIHJlbmRlclRva2VuKGNoYWluLCBtZXRhbCwgc2hhcGVJZHgsIGNvbG9ySWR4LCBhY3RpdmUsIHRpZFN0ciwgZmFsc2UpCn0KCmZ1bmMgcmVuZGVyVG9rZW4oY2hhaW4sIG1ldGFsIHN0cmluZywgc2hhcGVJZHgsIGNvbG9ySWR4IGludCwgYWN0aXZlIGJvb2wsIHRpZFN0ciBzdHJpbmcsIHRodW1iIGJvb2wpIChzdmcgc3RyaW5nLCBzdG9uZSBzdHJpbmcsIGNvbG9ySGV4IHN0cmluZywgY29sb3JOYW1lIHN0cmluZykgewoJdmFyIGNhc2NhZGVDU1Mgc3RyaW5nCglzdG9uZSA9IFN0b25lRm9yQ2hhaW4oY2hhaW4pCglpZiBDaGFpbkFsd2F5c0FjdGl2ZShjaGFpbikgewoJCWFjdGl2ZSA9IHRydWUKCX0KCW5jIDo9IGNvbG9yRm9yU3RvbmUoc3RvbmUsIGNvbG9ySWR4KQoJY29sb3JIZXgsIGNvbG9yTmFtZSA9IG5jLmhleCwgbmMubmFtZQoJbXQgOj0gbWV0YWxzW21ldGFsXQoKCXJpbmdFbHMgOj0gcmVuZGVyUmluZyhtdC5oaSwgbXQubG8sIHRpZFN0cikKCXZhciBwaWVjZU1hcmt1cCBzdHJpbmcKCWlmIHN0b25lID09ICJQZWFybCIgewoJCXBlYXJsIDo9IHJlbmRlclBlYXJsU2hhcGUoc2hhcGVJZHgsIGNvbG9ySGV4LCBtdC5oaSwgdGlkU3RyKQoJCW92ZXJsYXksIGNzcyA6PSBhcHBseUNhc2NhZGUocGVhcmwsIHRpZFN0ciwgbmlsKQoJCXBpZWNlTWFya3VwLCBjYXNjYWRlQ1NTID0gcGVhcmwrb3ZlcmxheSwgY3NzCgl9IGVsc2UgewoJCWZzIDo9ICZmYWNldFN0eWxle3Byb2Y6IGZpcmVQcm9maWxlRm9yKHN0b25lLCBjb2xvck5hbWUpLCB6b25lOiBuZXdQUk5HKCJ6b25lIiArIHRpZFN0ciksIHN0b25lOiBzdG9uZSwgdGh1bWI6IHRodW1ifQoJCXVuZGVyLCBmYWNldHMsIG92ZXIgOj0gcmVuZGVyU29saWQzRChzaGFwZUlkeCwgY29sb3JIZXgsIHRpZFN0ciwgZnMpCgkJb3ZlcmxheSwgY3NzIDo9IGFwcGx5Q2FzY2FkZShmYWNldHMsIHRpZFN0ciwgZnMpCgkJY2FzY2FkZUNTUyA9IGNzcwoJCXBpZWNlTWFya3VwID0gdW5kZXIgKyBgPGcgZmlsbC1vcGFjaXR5PSIuOSI+YCArIGZhY2V0cyArIGA8L2c+YCArIG92ZXJsYXkgKyBvdmVyICsgZnMuZ2xpbnRzCgl9CglmbG9hdGluZ1BpZWNlIDo9IGFwcGx5TW90aW9uKHBpZWNlTWFya3VwLCB0aWRTdHIpCglzdGF0dXMgOj0gcmVuZGVyU3RhdHVzQmFkZ2UoYWN0aXZlKQoJc2VyaWFsIDo9IHJlbmRlclNlcmlhbFRleHQodGlkU3RyLCBtdC5oaSkKCWxhYmVsVGV4dCA6PSBtZXRhbExhYmVsW21ldGFsXS50ZXh0CglsYWJlbFJlY3QgOj0gcmVuZGVyTWV0YWxMYWJlbFJlY3QobXQuaGksIG10LmxvLCAyNCwgMTM0LCAxMjIsIDE1LCAzLCB0aWRTdHIpCgoJaW5uZXIgOj0gYDxyZWN0IHdpZHRoPSJgICsgZm51bShjYW52YXNXKSArIGAiIGhlaWdodD0iYCArIGZudW0oY2FudmFzSCkgKyBgIiBmaWxsPSIjMGEwYjEwIi8+YCArCgkJcmVuZGVyU3RhcnModGlkU3RyKSArIHJpbmdFbHMgKyBmbG9hdGluZ1BpZWNlICsgc3RhdHVzICsgc2VyaWFsICsgbGFiZWxSZWN0ICsKCQlyZW5kZXJQbGF0ZVRleHQoY2hhaW4rIiBDSEFJTiIsIGxhYmVsVGV4dCwgbXQuaGkpCgoJc3ZnID0gYDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iYCArIGZudW0oY2FudmFzVykgKyBgIiBoZWlnaHQ9ImAgKyBmbnVtKGNhbnZhc0gpICsgYCIgdmlld0JveD0iMCAwIGAgKyBmbnVtKGNhbnZhc1cpICsgYCBgICsgZm51bShjYW52YXNIKSArIGAiPmAgKyBzdHlsZUJsb2NrKCkgKwoJCWA8c3R5bGU+YCArIGNhc2NhZGVDU1MgKyBgPC9zdHlsZT5gICsgaW5uZXIgKyBgPC9zdmc+YAoJcmV0dXJuIHN2Zywgc3RvbmUsIGNvbG9ySGV4LCBjb2xvck5hbWUKfQoKZnVuYyBzdHlsZUJsb2NrKCkgc3RyaW5nIHsKCWNvbnN0IGVhc2VPdXQgPSAiY3ViaWMtYmV6aWVyKDAsMCwuMywxKSIKCXJldHVybiBgPHN0eWxlPi5ndC12LC5ndC1oLC5ndC1yLC5ndC1ze3dpbGwtY2hhbmdlOnRyYW5zZm9ybX1gICsKCgkJYC5ndC12e2FuaW1hdGlvbjpndC12IHZhcigtLXYtZHVyKSBlYXNlLWluLW91dCB2YXIoLS12LWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LWh7YW5pbWF0aW9uOmd0LWggdmFyKC0taC1kdXIpIGVhc2UtaW4tb3V0IHZhcigtLWgtZGVsYXkpIGluZmluaXRlfWAgKwoJCWAuZ3QtcnthbmltYXRpb246Z3QtciB2YXIoLS1yLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tci1kZWxheSkgaW5maW5pdGV9YCArCgkJYC5ndC1ze2FuaW1hdGlvbjpndC1zIHZhcigtLXMtZHVyKSBlYXNlLWluLW91dCB2YXIoLS1zLWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LWdsb3d7YW5pbWF0aW9uOmd0LWdsb3cgdmFyKC0tZ2xvdy1kdXIpIGVhc2UtaW4tb3V0IHZhcigtLWdsb3ctZGVsYXkpIGluZmluaXRlfWAgKwoJCWAuZ3QtbGF7YW5pbWF0aW9uOmd0LWxhIHZhcigtLXItZHVyKSBlYXNlLWluLW91dCB2YXIoLS1yLWRlbGF5KSBpbmZpbml0ZX1gICsKCQlgLmd0LWxie2FuaW1hdGlvbjpndC1sYiB2YXIoLS1yLWR1cikgZWFzZS1pbi1vdXQgdmFyKC0tci1kZWxheSkgaW5maW5pdGV9YCArCgkJYEBrZXlmcmFtZXMgZ3QtbGF7MCUsNTAlLDEwMCV7b3BhY2l0eTowfTI1JXtvcGFjaXR5OjF9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWxiezAlLDUwJSwxMDAle29wYWNpdHk6MH03NSV7b3BhY2l0eToxfX1gICsKCQlgLmd0LWJhZGdlLXB1bHNle2FuaW1hdGlvbjpndC1icCAxLjhzIGAgKyBlYXNlT3V0ICsgYCBpbmZpbml0ZX1gICsKCQlgQGtleWZyYW1lcyBndC12ezAlLDEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMi41cHgpfTUwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMi41cHgpfX1gICsKCQlgQGtleWZyYW1lcyBndC1oezUwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxLjhweCl9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LXJ7MjUle3RyYW5zZm9ybTpyb3RhdGUoY2FsYygtMSp2YXIoLS1yb3QtZGVnKSkpfTc1JXt0cmFuc2Zvcm06cm90YXRlKHZhcigtLXJvdC1kZWcpKX19YCArCgkJYEBrZXlmcmFtZXMgZ3Qtc3s1MCV7dHJhbnNmb3JtOnNjYWxlKGAgKyBmbnVtKG1vdGlvblNjYWxlKSArIGApfX1gICsKCQlgLmd0LXR3e2FuaW1hdGlvbjpndC10dyB2YXIoLS1kKSBlYXNlLWluLW91dCB2YXIoLS1kbCkgaW5maW5pdGV9QGtleWZyYW1lcyBndC10d3swJSw4NCUsMTAwJXtvcGFjaXR5Oi40fTkwJXtvcGFjaXR5OjF9OTQle29wYWNpdHk6LjJ9fWAgKwoJCWBAa2V5ZnJhbWVzIGd0LWdsb3d7NTAle29wYWNpdHk6MX19YCArCgkJYEBrZXlmcmFtZXMgZ3QtYnB7ZnJvbXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eTouOH10b3t0cmFuc2Zvcm06c2NhbGUoMi4yNSk7b3BhY2l0eTowfX1gICsKCQlgPC9zdHlsZT5gCn0KGmEKC2dub21vZC50b21sElJtb2R1bGUgPSAiZ25vLmxhbmQvcC9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L2FydDNkMiIKZ25vID0gIjAuOSIKIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0zMDAwMDAwMHVnbm90EhIItJvSaRILMTEwNzc0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECZnmjxh8z1An/XbR9f70VPxX5TQTu0HjqzAQDtnm7MVASQFs8f1dNLG5HSsf2H02hZCAb6ehlUAV961ttLbzz9iynVcz5bLIBrRRd4+Hp5lkLSXXO9vSdueE3i1UoNEIFbt8aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=