如何使用python解码base64

时间:2016-02-15 18:44:13

标签: python string base64 decode

我试图解码以下我可以通过实际解码的第一步我只是不理解哈希匹配的第二部分?

exec("import re;import base64");exec((lambda p,y:(lambda o,b,f:re.sub(o,b,f))(r"([0-9a-f]+)",lambda m:p(m,y),base64.b64decode("NWEgMmNjLCBhOSwgYywgNTQsIDJjZiwgOTcsIGIwLCAxZGYsIDE0OCwgMTAwCjVhIDI0LCAzMSwgMTIyLCAxOTgsIDE1NSwgY2EsIDcyLCBmNSwgZmUsIDJkMQphMyAxM2YgNWEgNWYKYTMgMjg1LmVjLjI4NSA1YSAxMWIKYTMgMjg1LmVjLjIyYiA1YSAyMDQKCjE5OgoJYTMgMWU5IDVhIDE0MgoyNDAgMTY0OiAjIDIyMSAyLjQgMjJjCglhMyAyMTMgNWEgMjEzIDI2NSAxNDIKCgoKCjgzCQkJID0gJzc5Ljk2Ljc0Jwo4MAkJCSAgID0gYTkuMTFiKDE0ND04MykKMWY5CQkJID0gIjEuMC4zIgoxOWQJCSAgID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMpKQoxODgJCSAgPSAiNTYgOTQiCmUxCQkgID0gJzJmLzU2IDk0JwoxYTEJCQkJICAgPSAyZDEuODcoJzM2JykKMjVlCQkJCSAgID0gMmQxLjg3KCczNScpCjJhZAkJCQkgICA9IDJkMS44NygnMjI2JykKCjJhMwkJCSAgPSBjLjJjZSgpCjIyYgkJCQkgPSAyMDQoKQoKODQJCQkgPSAiMTQzOi8vOTIuMjBmLjFmZC8iCjhkCQkJPSA4NCArICI3YS0yYmYuMmE1IgoKYTYJCQkJID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85My8nICsgODMgKyAnLzE5ZS8yYjEvJykpCjIxNQkJCSAgPSAyY2MuMmE4KCcxMjovLzFiMicpCjIyZQkJCSAgPSAyY2MuMmE4KCcxMjovLzE4MicpOwoKMTAxCQkJPSBbJzc5Ljk2Ljc0JywnYmIuMTQ5LjI4NS5lYycsJzE3Ni45YSddCgo0YQkJCSAgPSBhNisnNGIuYTcnCjI2OQkJCQk9IGE2KycxYzMuYTcnCgojMTRhIDI2YiAxMWYgMWMKNjgJCSA9IGE2KycxMmMuYTcnCjM0CT0gYTYrJzE2OS5hNycKNjYJCSA9IGE2KycxZGMuYTcnCjQyCSAgPSBhNisnMjM2LTQ5LmE3Jwo0NAkgID0gYTYrJzIzMS0xNzMuYTcnCjdlCQkgICA9IGE2KycyNTcuYTcnCgojMWQxIDIyOQoxZDIJCQk9IDRmCgoKCgoxZSAyYmIoZSk6IDJjYy4yNjIoZSkKMWUgMjYxKGUpOiAyY2MuMjYyKCI2YSglZTYpIiAlIDE3KGUpKQoxZSAyODMoZSk6IDJjYy4yNjIoIjEzNyglZTYpIiAlIDE3KGUpKQoxZSAyODIoZSk6IDJjYy4yNjIoImZmKCVlNikiICUgMTcoZSkpCjFlIDI0NihlLGUyPSIxIixlMz0iIik6IDJjYy4yNjIoJ2ZmKCVlNiwiJWU2IiwiJWU2IiknICUgKDE3KGUpLDE3KGUyKSxlMykpOyAKMWUgMmFmKGEpOiAyY2MuMjYyKCIyMGIoJWU2KSIgJSAxNyhhKSkKMWUgMjc4KGEpOiAyY2MuMjYyKCIxZWYuMWQ4KDFjOD0lZTYpIiAlICgxNyhhKSkpCjFlIDI5YShhKTogMmNjLjI2MigiZjAoJWU2KSIgJSAoMTcoYSkpKQoxZSAyM2MoYSwyNmMpOiAyY2MuMjYyKCJmMCglZTYsJWU2KSIgJSAoMTcoYSksMTcoMjZjKSkpCjFlIDE2MihlKTogMmNjLjI2MigiMTg5KCVlNikiICUgMTcoZSkpCjFlIDI2NigpOiAyY2MuMjYyKCIxNmQiKQoxZSBiYygpOgoJM2YgJzJkMyAxNjggMWI1IDIxOCEnCgkKMTQ4LjEwNyhiYykKCiMgMWQ0IDI4MCAyNTYgMjMgYmUgMmEwIDIyNCAyYSBiYiAyOTknZTYKMWUgMTg1KCk6CgkyMmYgNjgsMzQsNjYsNDIsNDQsN2UsMmFkCgkjIDIxZSAxNiAyMTEgMmJlIDEzOSAyYSAyNTggMjZlCgkjIDEwYSA9ICIxNDM6Ly83NC4yMGYuMWZkLzFjMy85YS03YS0xYy4xOWMiCgkjIDE4MyA9IDJjYy4yYTgoMmNmLjE4My4xMzYoJzEyOi8vNGUvOTMnLCc4Yy8nKSkKCSMgNzIuMTBlKDEwYSwgMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyAxYyA9IDVmKCkKCSMgMWMuZmIoMTgzICsgIi85YS03YS0xYy4xOWMiKQoJIyA2OAkJID0gMTcoMWMuMjUoJzFjJywgJzE2YicpKQoJIyAzNAk9IDE3KDFjLjI1KCcxYycsICcxMDUnKSkKCSMgNjYJCSA9IDE3KDFjLjI1KCcxYycsICcxNjYnKSkKCSMgNDIJICA9IDE3KDFjLjI1KCcxYycsICcxMjUnKSkKCSMgNDQJICA9IDE3KDFjLjI1KCcxYycsICcxMWQnKSkKCSMgN2UJCSAgID0gMTcoMWMuMjUoJzFjJywgJzE4ZicpKQoJIyA0YQkJCSAgPSAxNygxYy4yNSgnMWMnLCAnNGInKSkKCTE2IDFhMT09IiIgM2EgMjVlPT0iIiAzYSAyYWQ9PSIyNGYiOgoJCTFkNSA9ICI1ZCAxMDcgMmM3IDFmMiAxZmMgMTQzOi8vOTIuMjBmLjFmZCAzYSAxODcgYWUgMjViIDM2IDNhIDM1IDIxIDJhIDdhIDZjIDIzOSAyMyBmYS4gIgoJCTFkMyA9ICIxN2IgMzcgMWFmIDIzIDE4NyBhZSAzNiAzYSAzNSAxNWE/IgoJCTY0PTJkMS45ZCgxODggKyAiIC0gMTI3IiwxZDUsMWQzKQoJCTJkMS4xNjUoJzIyNicsJzFhNicpCgkJMTYgNjQ6CgkJCTJkMS5kNCgpCgoJMTdjKCkKCiMgMjBjIDFiNgoxZSAxN2MoKToKCgk1YignMTI5IDU2Jyw4NCwyLDY4LDRhLCcnKQoJNWIoJ2MyJyw4NCwzLDM0LDRhLCcnKQoJNWIoJzFmNScsODQsOCw2Niw0YSwnJykKCTllKCdmMicsICcxM2QnKQoKIyAyMzUgMWI2CjFlIGU3KCk6CgoJMmNhID0gODkoOGQgKyAiPzk1PTE3OCZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJMjAgPSBmZS4xMTkoMmNhKQoKCTE1IDQ3IDIxIDIwOgoJCTViKDQ3Wyc1MCddICsgJyAtICcgKyA0N1snYjEnXSw0N1snMjQzJ10sNSw0N1snMjNhJ10sNGEsJycpCgkJOWUoJ2YyJywgJzEzZCcpCgojIGMyIGI4CjFlIGM4KCk6Cgk1YignMjNlIDMzJywnMmQnLDQsNDIsNGEsJycpCgk1YignMTdmIDI1MicsJzJkJyw2LDQ0LDRhLCcnKQoJNWIoJzI0OCBiYScsJzJkJyw3LDdlLDRhLCcnKQoJOWUoJ2YyJywgJzEzZCcpCgojIDI0YiBiYgoxZSBlOChkMSxiZik6CiAgMjRjIDEyZSgpOgoJZWE9MjVhCglhYj0xCgk5MD01CgkxZSAxYjMoNmQsKjI4NiwqKjIyMyk6CgkgIDJjYy4yNjIoIjZhKCVkKSIgJSAoNmQuZWEsICkpICMgMWNjIDJhIGRhIDIxYyBiZAoJICA2ZC4xOWI9Yy4yMWIoNmQuZWEpICMgMjUgYmQKCSAgMmNjLjExYygyYTcpICMgN2QgYmQgZjUgMjMgMTg0CgkgIDZkLmM2KCkKCTFlIGM2KDZkKToKCSAgNmQuMTliLmQ2KDZkLmFiKS4xYzAoZDEpICMgMTRhIGQxCgkgIDE5OiBmPTFjOShiZik7IGRhPWYuZmIoKQoJICAyNDA6IGRhPWJmCgkgIDZkLjE5Yi5kNig2ZC45MCkuMWU2KDE3KGRhKSkKCSAgMjgKICAxMmUoKQoKIyAyM2YgMmM4IGRhCjFlIDExMCgpOgoJZTgoMTg4LCdbOTg9MjIyXTFlZCAyMyA1NlsvOThdWzI3M11bMjczXScpCQkKCQojIDEyOSAxZmUKMWUgMTRkKDI2LDJkLDFkKToKCgkyY2MuMjYyKCAiNmEoNTUpIiApCgoJIyAxODYgMmEgMzYgM2EgMzUgMTRhIDIxIDJhIDdhCgljZSA9IDI4YygpCgkxYWEgPSA4ZCArICI/OTU9MWNmJjIzND0iICsgY2UgKyAiJjQ3PSIgKyAyZCArICImZmQ9IiArIDFhMSArICImMTFlPSIgKyA4OCgyNWUsMWExKQoJMmNhID0gODkoMWFhKQoJMjAgPSBmZS4xMTkoMmNhKQoJNDcgPSAxNygyMC4yNSgnNTAnKSkKCTI5ID0gMTcoMjAuMjUoJ2IxJykpCgoJIyAyMWUgMTYgMjExIDE1MCBhIDI5IDEzYQoJYzcgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJykpCgk4NiA9IGM3ICsgJzI5LjJjMCcKCTg1ID0gMmNmLjE4My4xNTcoODYpCgk3NiA9IDVmKCkKCTc2LmZiKDg2KQoKCSMgMTg2IDJhIDI5IDE3NSAyYSA0NyAxZTEgMmEgMjA3IDE5NSAyOQoJMTYgODUgM2EgNzYuMjUoJzY3JywgJzI5JykgPT0gMjkgM2EgNzYuMjUoJzY3JywgJzQ3JykgPT0gNDc6CgkJMmEzID0gYy4yY2UoKQoJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJMmEzLjc3KDE4OCwgIjExMiAxZWMgMTUwIDJhIDI3YiAyMDggMjkiLCIiLCAxNyg3Ni4yNSgnNjcnLCAnNDcnKSkgKyAiICIgKyAxNyg3Ni4yNSgnNjcnLCAnMjknKSkpCgkyYjoKCgkJMTgzID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly80ZS85MycsJzhjLycpKQoJCWUwID0gMmNmLjE4My4xNTcoMTgzKzJkKzI5KycuMTlhJykKCQk3YiA9IDJjZi4xODMuMTM2KDE4MysyZCsyOSsnLjE5YScpCgoJCTE2IGUwOgoJCQllZiA9IDdiCgkJCWQ4ID0gYy5hMigpCgkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCTNlID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScsJ2Y2JykpCgkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQlmNS4xMWMoMikKCQkJZDguMTQ2KDE4OCwiZDcgIisgMjYsICI1ZCAxNWMuLi4iKQoJCQljYS4yMzAoZWYsMzIsZDgpCgkJCSMgOGEoM2UsIDMyKQoJCQkjIDI0LjJlKDNlKQoJCQlkOC4xNCgpCgkJCTgwLjZlKDE0ND0iMzYiLCBkNT0iIikKCQkJODAuNmUoMTQ0PSIzNSIsIGQ1PSIiKQoJCQkyYTMgPSBjLjJjZSgpCgkJCTJhMy43NygxODgsIDI2ICsgIiAxOTIgMTQ1IGVkIGEzIGFlIDFkNiA4YyIpCgkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCWMwKCkKCgkJMmI6CgoJCQkxNiAyMC4yNSgnMjg5Jyk6CgkJCQkyMjcgPSAyMC4yNSgnMjVjJykKCQkJCWQ5ID0gMjAuMjUoJzIxNycpCgkJCQkKCQkJCTE2IDIwLjI1KCcxNTgnKToKCQkJCQlkOSA9IDIwLjI1KCcxNTgnKQoJCQkJCgkJCQkzZiBkOQoKCQkJCWQ4ID0gYy5hMigpCgkJCQkyY2MuMjYyKCAiMmNlLjkxKDU1KSIgKQoKCQkJCSMgMTYgY2UgPT0gIjdmIjoKCQkJCSMJIDExOCgxOCkKCgkJCQlkOC4xNDYoMTg4LCIxNjcgIisgMjAuMjUoJzUwJykrICIgLSAiICsgMjAuMjUoJ2IxJyksICI1ZCAxNWMuLi4iKQoJCQkJZWYgPSA3YgoKCQkJCSMgMjRlIDIzIGI1IDJhZSBlZSAxOGIgMTVkCgkJCQkxOToKCQkJCQk3Mi4xMGUoZDksIGVmLCBkOCkKCQkJCTI0MCAxOTYgMjY1IGU6CgkJCQkJMTYgMTcoZSkgPT0gIjFhOCI6CgkJCQkJCTJjZi5iNShlZikKCQkJCQkyOAoKCQkJCTMyID0gMmNjLjJhOCgyY2YuMTgzLjEzNignMTI6Ly8nLCc0ZScpKQoJCQkJM2UgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLycsJzRlJywnZjYnKSkKCQkJCWY1LjExYygyKQoJCQkJZDguMTM5KDAsIiIsICJkNyAiKyAyMC4yNSgnNTAnKSArIiAyYjkiLCI1ZCAxNWMuLi4iKQoJCQkJY2EuMjMwKGVmLDMyLGQ4KQoJCQkJIyA4YSgzZSwgMzIpCgkJCQkjIDI0LjJlKDNlKQoJCQkJZDguMTQoKQoJCQkJYzMgPSA4OSg4ZCArICI/OTU9ZWQmMjE5PSIgKyAxNygyMjcpICsgIiZmZD0iICsgMWExICsgIiYxMWU9IiArIDg4KDI1ZSwxYTEpKQoJCQkJZDAgPSBmZS4xMTkoYzMpCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCBkMC4yNSgnMjhkJyksIiIsIGQwLjI1KCcyOTMnKSkKCQkJCTJhMy43NygxODgsICIgIiwgIjE3MSAxYjcgMTMwIDM3IDE1YSAxYzYgMjMgMWEgMTQgMmYsIGRkIDFiMCAyMyAxYSAxNCAyZiIpCgkJCQk4MC42ZSgxNDQ9IjM2IiwgZDU9IiIpCgkJCQk4MC42ZSgxNDQ9IjM1IiwgZDU9IiIpCgkJCQljMCgpCgoJCQkyYjoKCQkJCTJjYy4yNjIoICIyY2UuOTEoNTUpIiApCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkyYTMuNzcoMTg4LCAyMC4yNSgnMjc3JyksIiIsIDIwLjI1KCcyNzUnKSkKCiMgMjZmIDE2ZiBhMyAyYjMgMWZiIDIzIDFlYgoxZSA4YSgxOTAsIDE1NiwgMTBkPWFkLCAxM2U9N2MpOgoJMTYgYTggMmNmLjE4My40YygxNTYpOgoJCTJjZi4xYmMoMTU2KQoJMTUgMTYwIDIxIDJjZi4xZWUoMTkwKToKCQllNiA9IDJjZi4xODMuMTM2KDE5MCwgMTYwKQoJCWQgPSAyY2YuMTgzLjEzNigxNTYsIDE2MCkKCQkxNiAyY2YuMTgzLjI1ZChlNik6CgkJCThhKGU2LCBkLCAxMGQsIDEzZSkKCQkyYjoKCQkJMTYgYTggMmNmLjE4My40YyhkKSAyMDIgMmNmLjFhMyhlNikuMTBiIC0gMmNmLjFhMyhkKS4xMGIgPiAxOgoJCQkJMjQuMjMzKGU2LCBkKQoKIyAyNzEgMmE2ICgxZjYgMjMgMjlmIDEyMi4xZTUpCjFlIDg5KDJkKToKCWNmID0gewoJCScxYTctMjNiJzogZTEKCX0KCTFiYiA9IDEwMC4xZjgoKQoJMTlmID0gMWJiLjI1KDJkLCBjZj1jZikKCTFjMiA9IDE5Zi44MQoJMTlmLjE0KCkKCTI4IDFjMgoKIyAyNyBiYQoxZSBhMCgyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYzUJCQkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJwoJNzUgPSAyY2MuMmE4KDJjZi4xODMuMTM2KCcxMjovLzRlLzkzLzhjJywgJycpKQoJMTk6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNzUpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkyYTMgPSBjLjJjZSgpCgkJCQkJMmEzLjc3KDE4OCwgImJhIDE2YyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJMjQwOiAKCQkyYTMgPSBjLjJjZSgpCgkJMmEzLjc3KDE4OCwgIjI0YSAyMTEgMjdlIGE4IDI3YyAyMyBiNSAxMjggM2MiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQoJCiMgMjcgMzMgIAoxZSA4YigyZCk6CgkzZiAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCSAgIDEwMyAxYTAgMjQyCQkJICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKCTYxID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly80ZScpLCAnNDknKQoJMTYgMmNmLjE4My40Yyg2MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDYxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkxOToKCQkJCQkJCTJjZi40MCgyY2YuMTgzLjEzNigyY2QsIGYpKQoJCQkJCQkyNDA6CgkJCQkJCQkxMWUKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkxOToKCQkJCQkJCTI0LjJlKDJjZi4xODMuMTM2KDJjZCwgZCkpCgkJCQkJCTI0MDoKCQkJCQkJCTExZQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCTE2IDJjYy4xMygnOTkuMjhjLjE0ZicpOgoJCWI0ID0gMmNmLjE4My4xMzYoJy8xMmYvMjAxLzE1NC8xMzIvMTVmL2NjLzExNy8nLCAnMTgxJykKCQkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KGI0KToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkJMTYgYWEgPiAwOgoKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMTRmIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDggMjEgJzE4MSciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJYjMgPSAyY2YuMTgzLjEzNignLzEyZi8yMDEvMTU0LzEzMi8xNWYvY2MvMTE3LycsICc5ZicpCgkJCgkJMTUgMmNkLCAxZiwgMTVkIDIxIDJjZi42NShiMyk6CgkJCWFhID0gMAoJCQlhYSArPSA2MCgxNWQpCgkJCgkJCTE2IGFhID4gMDoKCgkJCQkyYTMgPSBjLjJjZSgpCgkJCQkxNiAyYTMuNDYoIjI3IDE0ZiAzMyAzYyIsIDE3KGFhKSArICIgMTVkIDQ4IDIxICc5ZiciLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCSAgIyBiOSAxODMgMjMgMjQ0IDFhYiA0OSAxNWQKCQkJCQkJCSAKCgkjIGI5IDE4MyAyMyAyOGUgMmQ1IDI4ZiA0OSAxNWQKCTZiID0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xNmEvNDknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDZiKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNmIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyYjcgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjI4IDQ5IDE1ZAoJNDE9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vODIvNTIvNzkuOTYuMmJhLzQ5JyksICcnKQoJMTYgMmNmLjE4My40Yyg0MSk9PTRmOgkKCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDQxKToKCQkJYWEgPSAwCgkJCWFhICs9IDYwKDE1ZCkKCQkKCQkjIDcxIDE1ZCAzYSA3ZCA1YyAyMyAxYgoJCQkxNiBhYSA+IDA6CgkKCQkJCTJhMyA9IGMuMmNlKCkKCQkJCTE2IDJhMy40NigiMjcgMjI4IDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCSMgYjkgMTgzIDIzIDIxZiAxMjEgNDkgMTVkCgk0ZD0gMmNmLjE4My4xMzYoMmNjLjJhOCgnMTI6Ly84Mi81Mi83OS45Ni4xZjAvZTknKSwgJycpCgkxNiAyY2YuMTgzLjRjKDRkKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNGQpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWYgMTIxIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCQkJCQoJCQkJIyBiOSAxODMgMjMgMTU5IGRmIDQ5IDE1ZAoJMzggPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyL2JiLjE0OS4yMGUuNzInKSwgJycpCgkxNiAyY2YuMTgzLjRjKDM4KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoMzgpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAxNTkgZGYgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgMjFkIDQ5IDE1ZAoJNjkgPSAyY2YuMTgzLjEzNigyY2MuMmE4KCcxMjovLzgyLzUyLzc5Ljk2LjJiOC8yMDMnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDY5KT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjkpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyMWQgMzMgM2MiLCAxNyhhYSkgKyAiIDE1ZCA0OCIsICJjNCAzNyA3MCAyMyAxYiA2Zj8iKToKCQkJCQoJCQkJCTE1IGYgMjEgMTVkOgoJCQkJCQkyY2YuNDAoMmNmLjE4My4xMzYoMmNkLCBmKSkKCQkJCQkxNSBkIDIxIDFmOgoJCQkJCQkyNC4yZSgyY2YuMTgzLjEzNigyY2QsIGQpKQoJCQkJCQkKCQkJMmI6CgkJCQkxMWUKCQkJCQoJCQkJIyBiOSAxODMgMjMgZjYgNDkgMTVkCgk2MiA9IDJjZi4xODMuMTM2KDJjYy4yYTgoJzEyOi8vNGUvZjYnKSwgJycpCgkxNiAyY2YuMTgzLjRjKDYyKT09NGY6CQoJCTE1IDJjZCwgMWYsIDE1ZCAyMSAyY2YuNjUoNjIpOgoJCQlhYSA9IDAKCQkJYWEgKz0gNjAoMTVkKQoJCQoJCSMgNzEgMTVkIDNhIDdkIDVjIDIzIDFiCgkJCTE2IGFhID4gMDoKCQoJCQkJMmEzID0gYy4yY2UoKQoJCQkJMTYgMmEzLjQ2KCIyNyAyODcgMmMyIDMzIDNjIiwgMTcoYWEpICsgIiAxNWQgNDgiLCAiYzQgMzcgNzAgMjMgMWIgNmY/Iik6CgkJCQkKCQkJCQkxNSBmIDIxIDE1ZDoKCQkJCQkJMmNmLjQwKDJjZi4xODMuMTM2KDJjZCwgZikpCgkJCQkJMTUgZCAyMSAxZjoKCQkJCQkJMjQuMmUoMmNmLjE4My4xMzYoMmNkLCBkKSkKCQkJCQkJCgkJCTJiOgoJCQkJMTFlCgkJCQkKCgkyYTMgPSBjLjJjZSgpCgkyYTMuNzcoMTg4LCAiIDIyNSAzMyAzYyAxMjAiLCAiWzk4IGMxXWM5IDE3MSAxMTIgMjA2IDU2IDk0Wy85OF0iKQogCiMgMjcgMjE0IDE1ZAoxZSBjMCgpOgoJZjMgPSBjLjJjZSgpLjQ2KCcyNDcgOTEgMmYnLCAnMTEyIDJhOSAyMzggMjMgMTQgMmYnLCAnMTdiIDM3IDFhZiAyMyBmYT8nLCAxZTQ9JzJjOSwgMjEwJywxY2E9JzJhNCwgOTEnKQoJMTYgZjMgPT0gMDoKCQkyOAoJMmMgZjMgPT0gMToKCQkxMWUKCTNiID0gMjhjKCkKCTNmICIxY2I6ICIgKyAxNygzYikKCTE2IDNiID09ICcxNjMnOiAjIDJhMQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxNjMgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IC05IDhlJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDJmJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsJycpCgkyYyAzYiA9PSAnZDInOiAjMjRkCgkJM2YgIiMjIyMjIyMjIyMjIyAgIDE5IGQyIDFhIDE0ICAjIyMjIyMjIyMjIyMjIyMjIyIKCQkxOTogMmNmLjk5KCc1NyA4ZScpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAyZicpCgkJMjQwOiAxMWUKCQkxOTogMmNmLjk5KCc1NyAtOSAyY2MuMjA1JykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzU3IC05IDEwZi4yMDUnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSBjZCAxMTEgMmEgYjguIiwnJykKCTJjIDNiID09ICc5Yic6ICMgMWUzICAKCQkzZiAiIyMjIyMjIyMjIyMjICAgMTkgOWIgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4xMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMTBmJykKCQkyNDA6IDExZQoJCTE5OiAyY2YuOTkoJzE0MCBlNSAxYTUgMWEtYjYgMTUzLjJjYy4yY2MnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMTQwIGU1IDFhNSAxYS1iNiAxNTMuMmNjJykKCQkyNDA6IDExZQkJCgkJMmEzLjc3KCJbOTg9YzFdWzJkOV0yZDIgMWFkIDFkZSAyMmFbLzk4XVsvMmQ5XSIsICJkZCAyYSAyOTQgMTYxIDI5MSBhZSAxZmYgM2EgWzk4PTExYV1bMmQ5XTI1ZiAyNmFbLzk4XVsvMmQ5XSAxY2QgMTExIDJhIDIyZCAxOTcgMTQxIGI4IDIxIDZjIDI5MSBhZSAyMTYgNGUgMjc2IDI4YiAxNTUtMjIwIDFjZCIpCgkyYyAzYiA9PSAnN2YnOiAjIDFkNwoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSA3ZiAxYSAxNCAgIyMjIyMjIyMjIyMjIyMjIyMiCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSA4ZS4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzE1ZSAyZi4xNGUnKQoJCTI0MDogMTFlCgkJMTk6CgkJCTJjZi45OSgnQDEwMiAxNTInKQoJCQkyY2YuOTkoJzEwOCAvMjcwIDJmLjE0ZSAvZicpCgkJMjQwOiAxMWUKCQkxOToKCQkJMmNmLjk5KCdAMTAyIDE1MicpCgkJCTJjZi45OSgnMTA4IC8yNzAgOGUuMTRlIC9mJykKCQkyNDA6IDExZQoJCTJhMy43NygiWzk4PTExYV1bMmQ5XTljICAhISFbLzk4XVsvMmQ5XSIsICIxYzEgMzdcJzE1NSBhZiAxMDkgNDMgMWI0IDI4NCAyYSAxYSAxNCIsICIxM2MgNTkuIDVkIDFhIDE0IDhlLzJmIFs5OD0xMGNdMWM3IGViWy85OF0gZjkgY2QgMTExIDJhIGI4LiIsIjI5ZSAyN2YgMWZhIDNhIGViIDJiZCBmNCIpCgkyYjogIzJiMgoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAyYjQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIgoJCTE5OiAyY2YuOTkoJzU3IGNjJykKCQkyNDA6IDExZQoJCTNmICIjIyMjIyMjIyMjIyMgICAxOSAxZGQgMWEgMTQgICMjIyMjIyMjIyMjIyMjIyMjIiAjMjYzIC8gMWU4CgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAxMGYnKQoJCTI0MDogMTFlCgkJMTk6IDJjZi45OSgnMWJmIDEzMyBiNiAyY2MnKQoJCTI0MDogMTFlCgkJMmEzLjc3KCJbOTg9MTFhXVsyZDldOWMgICEhIVsvOThdWy8yZDldIiwgIjFjMSAzN1wnMTU1IGFmIDEwOSA0MyAxYjQgMjg0IDJhIDFhIDE0IiwgIjEzYyA1OS4gNWQgMWEgMTQgOGUvMmYgWzk4PTEwY10xYzcgZWJbLzk4XSBmOSAxMTEgMmEgYjguIiwiMmEyIDFiYS4gIGRkIDNhIDI5MCAyNzQgMmEgMjMyLzI5OCAzYSAyOTYgMTYxIDE1IDFmYyAyNTEgMTAgMWQ5LCAyNTkgMzcgMmFhIDJhIDI1NSAyNjQuIikJCgojIDIwZCAxZTcgMjhjCSAgCjFlIDI4YygpOgoJMTYgMmNjLjEzKCc5OS4yOGMuOWInKToKCQkyOCAnOWInCgkyYyAyY2MuMTMoJzk5LjI4Yy5kMicpOgoJCTI4ICdkMicKCTJjIDJjYy4xMygnOTkuMjhjLjdmJyk6CgkJMjggJzdmJwoJMmMgMmNjLjEzKCc5OS4yOGMuMTYzJyk6CgkJMjggJzE2MycKCTJjIDJjYy4xMygnOTkuMjhjLjFiMScpOgoJCTI4ICcxYjEnCgkyYyAyY2MuMTMoJzk5LjI4Yy4yMDknKToKCQkyOCAnMjA5JwoJCiMgMTdmIDE3MwoxZSBkYygxOCk6CgkyZDEuYTUoIjUzLjYzICIrMjc5KDE4KSk7IDY0PTJkMS45ZCgxODgsImM0IDM3IDI2NyAyMyAxZGIgYWUiLCIyZiAxMzggMjMgMTFmIDZjPyIpCgkxNiA2NDoKCQk3OD1hOS4xMWIoMTQ0PTgzKS4xNTEoJzE4MycpOyA3OD0yY2MuMmE4KDc4KTsgCgkJNWU9MmNmLjE4My4xMzYoNzgsIi4uIiwiLi4iKTsgNWU9MmNmLjE4My4xZjMoNWUpOyAyZDEuYTUoIjUzLjYzIDVlPSIrNWUpOyBiNz1hZAoJCTE5OgoJCQkxNSAyY2QsIDFmLCAxNWQgMjEgMmNmLjY1KDVlLDFlMD00Zik6CgkJCQkxZls6XSA9IFtkIDE1IGQgMjEgMWYgMTYgZCBhOCAyMSAxMDFdCgkJCQkxNSAyNiAyMSAxNWQ6CgkJCQkJMTk6IDJjZi5iNSgyY2YuMTgzLjEzNigyY2QsMjYpKQoJCQkJCTI0MDoKCQkJCQkJMTYgMjYgYTggMjEgWyIxYjguZGIiLCIxN2QuZGIiLCIxOGQuZGIiLCIyY2MuYTUiXTogYjc9NGYKCQkJCQkJMmQxLmE1KCIxNzIgMTA0ICIrMmNkKyIgIisyNikKCQkJCTE1IDI2IDIxIDFmOgoJCQkJCTE5OiAyY2YuMjUwKDJjZi4xODMuMTM2KDJjZCwyNikpCgkJCQkJMjQwOgoJCQkJCQkxNiAyNiBhOCAyMSBbIjFjNCIsIjFiZSJdOiBiNz00ZgoJCQkJCQkyZDEuYTUoIjE3MiAxMDQgIisyY2QrIiAiKzI2KQoJCQkxNiBhOCBiNzogMmQxLmE1KCI1My42MyAyMjUgZmQgMTVkIGNiLCAzNyAxNWEgMTUwIGEgMTE1IDEyYyIpOyAyZDEuNDMoMTg4LCIyMWEgMTJiIDFiNSBmNyIsIjE4YyAxYjAgMjMgMTgwIDExNSBiMiIpCgkJCTJiOiAyZDEuYTUoIjUzLjYzIDFhNyAxNWQgZWUgY2IiKTsgMmQxLjQzKDE4OCwiMjFhIDEyYiAxYjUgZjciLCIxOGMgMWIwIDIzIDE4MCAxMTUgYjIiKQoJCTI0MDogMmQxLjQzKDE4OCwiMWVhIDQ4IiwiMWNlIDZjIDE5MiBhOCAxNDUgMTMxIik7IDVhIGYxOyAyZDEuYTUoZjEuMTc5KCkpOyAyZDEuYTUoIjUzLjYzIGViIGNiIikKCQkyZDEuMTA2KDk1PSIiLDE3ZT0iMmM1IDI5NSAyZiIsMTRjPWFkKQoJMmI6IDJkMS40MygxODgsIjFjZSA2YyIsIjE5MiBhOCAxNDUgMTMxIik7IDJkMS4xMDYoOTU9IiIsMTdlPSIyNzIiLDE0Yz1hZCkKCiMgMmM2IDJhYiAxOWEgMTVkCjFlIDEzNSgxMmEpOiAgCglmID0gMWM5KDEyYSwgJzJkNysyZDknKSAgCgkyY2EgPSBmLmZiKCkgIAoJMTQ3ID0gMmNhLjI3YSgnXDJiMFwyYzFcMmFjXDJjNCcpICMgMmI1IDE3NSAxMmQgYTQgMTk5ICAKCTE2ICgxNDcgPiAwKTogIAoJCTNmICIxOGEgMTNhIDFmYyAxYjkgIiArIDE3KDE0NyArIDIyKSsgIi4iICAKCQlmLjI3ZCgxNDcgKyAyMikgICAjIDI4MSAxNzUgJzJiNiAyYmMgMTc1IDEyZCBhNCAyMTInIAoJCWYuMWEyKCkgIAoJCWYuMTQoKSAgCgkyYjoKCQkxMWUKCQkjIDI0OSAyNDUsIDEzYSAxYjUgMTkxICAKCiMgMjliIDFhNCAxZjEKMWUgODgoMzUsIDM2KToKCSIiIgoJMjBhIDEyNiAxNzUgMmEgMmMzIDI0MSAyOTcgMWFjCgkiIiIKCTI4IDE0MigzNi4yM2QoKS4yMDAoJzI2ZCcpICsgMzUpLjE5MygpICAgCiAgIAojIDIwZCAxOAkgCjFlIGU0KCk6CgkJZDM9W10KCQljNT1iMC5hMVsyXQoJCTE2IDYwKGM1KT49MjoKCQkJCTE4PWIwLmExWzJdCgkJCQlhYz0xOC4xZjQoJz8nLCcnKQoJCQkJMTYgKDE4WzYwKDE4KS0xXT09Jy8nKToKCQkJCQkJMTg9MThbMDo2MCgxOCktMl0KCQkJCTczPWFjLjE3YSgnJicpCgkJCQlkMz17fQoJCQkJMTUgMmNiIDIxIDIzNyg2MCg3MykpOgoJCQkJCQk0NT17fQoJCQkJCQk0NT03M1syY2JdLjE3YSgnPScpCgkJCQkJCTE2ICg2MCg0NSkpPT0yOgoJCQkJCQkJCWQzWzQ1WzBdXT00NVsxXQoJCQkJCQkJCQoJCTI4IGQzCgoyZGEgPSA5Ny41OCgnJykKMmQ4ID0gOTcuNTgoJzExND0nKQoyZDkgPSA5Ny41OCgnJykKMmQ2ID0gOTcuNTgoJycpCgojIDI5ZCBhNAoxZSA1YigyNiwyZCwzMCwzOSw0YiwxZCk6CgkJMjljPWIwLmExWzBdKyI/MmQ9IiszMS41MSgyZCkrIiYzMD0iKzE3KDMwKSsiJjI2PSIrMzEuNTEoMjYpKyImMzk9IiszMS41MSgzOSkrIiY0Yj0iKzMxLjUxKDRiKSsiJjFkPSIrMzEuNTEoMWQpCgkJNzc9NGYKCQkxMTY9Yy4xYWUoMjYsIDE4ZT0iMTM0LmE3IiwgMTIzPTM5KQoJCTExNi4xZTIoIDFkMD0iMTE3IiwgMTc0PXsgIjI2MCI6IDI2LCAiMjg4IjogMWQgfSApCgkJMTE2LjE2ZSggIjE1YiIsIDRiICkKCQkxNiAzMD09NSA6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9YWQpCgkJMmI6CgkJCTc3PTU0LjhmKDE0Yj0xMTMoYjAuYTFbMV0pLDJkPTI5YyxmOD0xMTYsZmM9NGYpCgkJMjggNzcKCgkJCgkJCQkJICAKMTg9ZTQoKQoyZD03YwoyNj03YwozMD03YwozOT03Ywo0Yj03YwoxZD03YwoKCjE5OgoJCTJkPTMxLjNkKDE4WyIyZCJdKQoyNDA6CgkJMTFlCjE5OgoJCTI2PTMxLjNkKDE4WyIyNiJdKQoyNDA6CgkJMTFlCjE5OgoJCTM5PTMxLjNkKDE4WyIzOSJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJMzA9MTEzKDE4WyIzMCJdKQoyNDA6CgkJMTFlCjE5OgkJCgkJNGI9MzEuM2QoMThbIjRiIl0pCjI0MDoKCQkxMWUKMTk6CQkKCQkxZD0zMS4zZCgxOFsiMWQiXSkKMjQwOgoJCTExZQoKIyBiOSAyYSAxZjcgYmQgMWJkCjFlIDllKDgxLCAyZDQpOgoJIyAxNGEgODEgMWQwIDJkMCAxZGEgMjUzIDI5MiAyNTQgM2EgMjY4CgkxNiA4MToKCQk1NC4xNzcoMTEzKGIwLmExWzFdKSwgODEpCgkxNiA4MC5kZSgnMjhhLTFiZCcpPT0nMWE2JzoKCQkyY2MuMjYyKCIxOTQuMTcwKCVlNikiICUgODAuZGUoMmQ0KSApCgkJCgkJCjE2IDMwPT03YyAyMDIgMmQ9PTdjIDIwMiA2MCgyZCk8MTogMTg1KCkKMmMgMzA9PTI6IGU3KCkKMmMgMzA9PTM6IGM4KCkgCjJjIDMwPT00OiA4YigyZCkKMmMgMzA9PTU6IDE0ZCgyNiwyZCwxZCkKMmMgMzA9PTY6IGRjKDE4KQoyYyAzMD09NzogYTAoMmQpCjJjIDMwPT04OiAxMTAoKQoyYyAzMD09OTogMWE5KCkKMmMgMzA9PTExOiAxM2IoKQoKNTQuMTI0KDExMyhiMC5hMVsxXSkp")))(lambda a,b:b[int("0x"+a.group(1),16)],"0|1|2|3|4|5|6|7|8|9|a|B|xbmcgui|d|e|f|10|11|special|getCondVisibility|close|for|if|str|params|try|force|delete|icons|description|def|dirs|parsed|in|22|to|shutil|get|name|Delete|return|version|the|else|elif|url|rmtree|Kodi|mode|urllib|addonfolder|Cache|MAINTAINANCEICON|password|username|you|downloader_cache_path|iconimage|and|myplatform|Files|unquote_plus|tempfolder|print|unlink|channel4_cache_path|CLEARCACHEICON|message|FRESHSTARTICON|splitparams|yesno|build|found|cache|FANART|fanart|exists|iplayer_cache_path|home|True|bfriendlyname|quote_plus|addon_data|freshstart|xbmcplugin|busydialog|Paradox|killall|decodestring|unsuccessful|import|addDir|option|Please|xbmcPath|SafeConfigParser|len|xbmc_cache_path|temp_cache_path|main_list|yes_pressed|walk|CONTACTICON|versioninfo|INSTALLICON|itv_cache_path|ActivateWindow|wtf_cache_path|settings|self|setSetting|them|want|Count|downloader|pairsofparams|paradoxwizard|packages_cache_path|parser|ok|addonPath|plugin|wizard|existingfile|None|give|PURGEICON|windows|ADDON|content|profile|AddonID|BASEURL|versionfileexists|versionfile|get_setting|smf_hash|OPEN_URL|copytree|deletecachefiles|packages|CHECKURL|XBMC|addDirectoryItem|CONTROL_TEXTBOX|Close|theblackboxostv|addons|Wizard|action|video|base64|COLOR|system|paradox|android|WARNING|message_yes_no|setView|LocalAndRental|DeletePackages|argv|DialogProgress|from|directory|log|ART|png|not|xbmcaddon|file_count|CONTROL_LABEL|cleanedparams|False|your|seeing|sys|bversion|installation|atv2_cache_b|atv2_cache_a|remove|stop|failed|menu|Set|Packages|script|exit_handler|window|be|announce|killxbmc|yellow|Maintenance|successdata|Do|paramstring|setControls|versionpath|MAINTENANCE|Brought|extract|removed|AppleTV|cleanly|whatami|headers|suceess|heading|linux|param|open_settings_dialog|value|getControl|Extracting|dp|dlurl|text|db|FRESHSTART|Press|getSetting|Downloader|fileexists|USER_AGENT|e2|e3|get_params|shell|s|BUILDMENU|TextBoxes|iplayer_http_cache|WINDOW|NOT|common|installed|partially|lib|SendClick|traceback|movies|choice|F4|time|temp|complete|listitem|exit|continue|read|isFolder|user|json|RunAddon|requests|EXCLUDES|ECHO|DELETING|removing|maintainanceicon|add_item|register|TASKKILL|this|logopath|st_mtime|lime|symlinks|download|kodi|facebook|via|You|int|L2FkZG9ucy50eHQ|clean|liz|Video|FRESHSTARTBUILD|loads|red|Addon|sleep|freshstarticon|pass|default|Removed|iPlayer|urllib2|thumbnailImage|endOfDirectory|clearcacheicon|implementation|Authentication|Package|Install|zipFile|process|install|central|TextBox|private|changes|changed|Library|initctl|DefaultFolder|fixBadZipfile|join|ReplaceWindow|configuration|update|file|DELETEIVUEDB|was|MAIN|ignore|ConfigParser|adb|Applications|sha1|http|id|been|create|pos|atexit|module|set|handle|folder|WIZARD|exe|ATV2|have|getAddonInfo|off|org|mobile|re|dst|isfile|brsurl|Simple|now|Fanart_Image|Wait|files|tskill|Caches|item|button|DoStopScript|osx|ImportError|set_setting|contacticon|Downloading|application|maintenance|whatthefurk|installicon|Successfuly|ToggleDebug|setProperty|directories|SetViewMode|To|Error|start|infoLabels|of|repository|setContent|listbuilds|format_exc|split|Would|INDEX|MyVideos75|title|Fresh|begin|Other|thumbnails|path|initialize|SETUP|Check|enter|AddonTitle|StopScript|Trancating|downloaded|click|Textures13|iconImage|purgeicon|src|truncated|has|hexdigest|Container|available|Exception|Installed|cookielib|signature|zip|win|cfg|ADDONPATH|resources|req|STANDARD|U|truncate|stat|Password|am|true|User|Canceled|donation|burl|Archives|function|COMPLETE|ListItem|like|OK|atv2|database|__init__|it|is|Menu|save|Addons15|location|detected|sess|makedirs|view|userdata|sudo|setLabel|If|link|icon|Database|PACKAGES|need|DO|windowid|open|yeslabel|Platform|activate|KODI|Your|getbuild|type|Firstrun|FIRSTRUN|msg2|Anything|msg1|existing|Windows|Message|seconds|library|restore|contact|raspbmc|PARADOX|xbmcvfs|topdown|against|setInfo|Android|nolabel|request|setText|Current|Raspbmc|hashlib|Problem|another|already|Welcome|listdir|Control|iplayer|Hashing|account|abspath|replace|Contact|Changed|current|session|VERSION|manager|laction|at|uk|builds|remote|encode|var|or|Images|Net|bin|By|latest|recent|ios|Python|Action|Inital|Get|simple|co|Cancel|we|record|sha|cached|DBPATH|Amazon|bdlurl|ending|instid|The|Window|viewer|ITV|See|BBC|launch|python|orange|kwargs|before|All|submessage|rid|4oD|marker|UPDATE|net|compat|Manage|TNPATH|global|all|fresh|Sleep|copy2|devos|Build|clear|range|about|panel|bicon|Agent|DoSC2|lower|Clear|About|except|check|CACHE|bslug|Cydia|error|DoRA2|Force|Purge|raise|Sorry|Popup|class|Linux|added|false|rmdir|least|Start|shows|views|Apple|needs|purge|logos|until|10147|forum|recid|isdir|P|FORCE|Title|DoAW|executebuiltin|OSMC|logo|as|DoTD|wish|info|ICON|STOP|some|Id|utf8|used|Copy|im|Open|Done|CR|both|emsg|page|etit|DoCM|repr|find|most|able|seek|were|task|that|size|DoRA|DoRW|means|addon|args|TEMP|Plot|auth|auto|then|platform|mtit|What|Furk|hold|on|more|mmsg|HOME|Exit|Home|hash|Wake|init|DoSC|SMF|u|Add|Use|use|run|OSX|iOS|dialog|Yes|php|URL|500|translatePath|are|see|bad|x05|M|any|DoA|x50|art|ATV|one|atv|End|ZIP|WTF|itv|Zip|4od|DoE|end|ALT|can|dev|txt|x4b|dir|smf|x06|Now|Fix|an|us|No|data|i|xbmc|root|Dialog|os|so|plugintools|TO|My|viewType|th|F|r|T|b|N".split("|")))

特别是以下评论。

https://stackoverflow.com/a/33218455/1453147

我已经尝试在第一行设置第二个exec进行打印,但它只是在运行时一直给我一个错误

TypeError:不能在类字节对象上使用字符串模式

就像我说我可以完成解码的第一步,但匹配管道字符串的第二步就是回避我哈哈。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

正如回答this question中所述,要查看其外观,只需将exec更改为print

编辑:    真的,这是输出

import xbmc, xbmcaddon, xbmcgui, xbmcplugin, os, base64, sys, xbmcvfs, atexit, requests
import shutil, urllib, urllib2, cookielib, re, extract, downloader, time, json, plugintools
from ConfigParser import SafeConfigParser
from addon.common.addon import Addon
from addon.common.net import Net

try:
    from hashlib import sha1
except ImportError: # python 2.4 compat
    from sha import sha as sha1




AddonID          = 'plugin.video.paradoxwizard'
ADDON              = xbmcaddon.Addon(id=AddonID)
VERSION          = "1.0.3"
ADDONPATH          = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID))
AddonTitle        = "Paradox Wizard"
USER_AGENT        = 'Kodi/Paradox Wizard'
U                  = plugintools.get_setting('username')
P                  = plugintools.get_setting('password')
M                  = plugintools.get_setting('submessage')

dialog            = xbmcgui.Dialog()
net              = Net()

BASEURL          = "http://theblackboxostv.co.uk/"
CHECKURL            = BASEURL + "wizard-dev.php"

ART              = xbmc.translatePath(os.path.join('special://home/addons/' + AddonID + '/resources/art/'))
DBPATH            = xbmc.translatePath('special://database')
TNPATH            = xbmc.translatePath('special://thumbnails');

EXCLUDES            = ['plugin.video.paradoxwizard','script.module.addon.common','repository.paradox']

FANART            = ART+'fanart.png'
ICON                = ART+'icon.png'

#set some default icons
INSTALLICON      = ART+'install.png'
MAINTAINANCEICON    = ART+'maintenance.png'
CONTACTICON      = ART+'contact.png'
CLEARCACHEICON    = ART+'clear-cache.png'
FRESHSTARTICON    = ART+'fresh-start.png'
PURGEICON          = ART+'purge.png'

#Firstrun marker
FIRSTRUN            = True




def DoE(e): xbmc.executebuiltin(e)
def DoAW(e): xbmc.executebuiltin("ActivateWindow(%s)" % str(e))
def DoRW(e): xbmc.executebuiltin("ReplaceWindow(%s)" % str(e))
def DoRA(e): xbmc.executebuiltin("RunAddon(%s)" % str(e))
def DoRA2(e,e2="1",e3=""): xbmc.executebuiltin('RunAddon(%s,"%s","%s")' % (str(e),str(e2),e3)); 
def DoA(a): xbmc.executebuiltin("Action(%s)" % str(a))
def DoCM(a): xbmc.executebuiltin("Control.Message(windowid=%s)" % (str(a)))
def DoSC(a): xbmc.executebuiltin("SendClick(%s)" % (str(a)))
def DoSC2(a,Id): xbmc.executebuiltin("SendClick(%s,%s)" % (str(a),str(Id)))
def DoStopScript(e): xbmc.executebuiltin("StopScript(%s)" % str(e))
def DoTD(): xbmc.executebuiltin("ToggleDebug")
def exit_handler():
    print 'My application is ending!'

atexit.register(exit_handler)

# Anything that needs to be run before the script init's
def SETUP():
    global INSTALLICON,MAINTAINANCEICON,CONTACTICON,CLEARCACHEICON,FRESHSTARTICON,PURGEICON,M
    # See if we can update the logos used
    # logopath = "http://paradoxwizard.co.uk/icon/paradox-wizard-icons.cfg"
    # path = xbmc.translatePath(os.path.join('special://home/addons','packages/'))
    # downloader.download(logopath, path + "/paradox-wizard-icons.cfg")
    # icons = SafeConfigParser()
    # icons.read(path + "/paradox-wizard-icons.cfg")
    # INSTALLICON        = str(icons.get('icons', 'installicon'))
    # MAINTAINANCEICON  = str(icons.get('icons', 'maintainanceicon'))
    # CONTACTICON        = str(icons.get('icons', 'contacticon'))
    # CLEARCACHEICON      = str(icons.get('icons', 'clearcacheicon'))
    # FRESHSTARTICON      = str(icons.get('icons', 'freshstarticon'))
    # PURGEICON        = str(icons.get('icons', 'purgeicon'))
    # FANART              = str(icons.get('icons', 'fanart'))
    if U=="" and P=="" and M=="false":
        msg1 = "Please register an account at http://theblackboxostv.co.uk and enter your forum username and password in the wizard settings panel to continue. "
        msg2 = "Would you like to enter your username and password now?"
        yes_pressed=plugintools.message_yes_no(AddonTitle + " - Authentication",msg1,msg2)
        plugintools.set_setting('submessage','true')
        if yes_pressed:
            plugintools.open_settings_dialog()

    INDEX()

# Inital Menu
def INDEX():

    addDir('Install Paradox',BASEURL,2,INSTALLICON,FANART,'')
    addDir('Maintenance',BASEURL,3,MAINTAINANCEICON,FANART,'')
    addDir('Contact',BASEURL,8,CONTACTICON,FANART,'')
    setView('movies', 'MAIN')

# Build Menu
def BUILDMENU():

    data = OPEN_URL(CHECKURL + "?action=listbuilds&user=" + U + "&pass=" + smf_hash(P,U))
    parsed = json.loads(data)

    for build in parsed:
        addDir(build['bfriendlyname'] + ' - ' + build['bversion'],build['bslug'],5,build['bicon'],FANART,'')
        setView('movies', 'MAIN')

# Maintenance menu
def MAINTENANCE():
    addDir('Clear Cache','url',4,CLEARCACHEICON,FANART,'')
    addDir('Fresh Start','url',6,FRESHSTARTICON,FANART,'')
    addDir('Purge Packages','url',7,PURGEICON,FANART,'')
    setView('movies', 'MAIN')

# Popup script
def TextBoxes(heading,announce):
  class TextBox():
    WINDOW=10147
    CONTROL_LABEL=1
    CONTROL_TEXTBOX=5
    def __init__(self,*args,**kwargs):
      xbmc.executebuiltin("ActivateWindow(%d)" % (self.WINDOW, )) # activate the text viewer window
      self.win=xbmcgui.Window(self.WINDOW) # get window
      xbmc.sleep(500) # give window time to initialize
      self.setControls()
    def setControls(self):
      self.win.getControl(self.CONTROL_LABEL).setLabel(heading) # set heading
      try: f=open(announce); text=f.read()
      except: text=announce
      self.win.getControl(self.CONTROL_TEXTBOX).setText(str(text))
      return
  TextBox()

# About us text
def facebook():
    TextBoxes(AddonTitle,'[COLOR=orange]Welcome to Paradox[/COLOR][CR][CR]')        

# Install builds
def WIZARD(name,url,description):

    xbmc.executebuiltin( "ActivateWindow(busydialog)" )

    # Check the username and password set in the wizard
    whatami = platform()
    burl = CHECKURL + "?action=getbuild&devos=" + whatami + "&build=" + url + "&user=" + U + "&pass=" + smf_hash(P,U)
    data = OPEN_URL(burl)
    parsed = json.loads(data)
    build = str(parsed.get('bfriendlyname'))
    version = str(parsed.get('bversion'))

    # See if we have a version file
    versionpath = xbmc.translatePath(os.path.join('special://','home'))
    versionfile = versionpath + 'version.txt'
    versionfileexists = os.path.isfile(versionfile)
    parser = SafeConfigParser()
    parser.read(versionfile)

    # Check the version of the build against the latest available version
    if versionfileexists and parser.get('versioninfo', 'version') == version and parser.get('versioninfo', 'build') == build:
        dialog = xbmcgui.Dialog()
        xbmc.executebuiltin( "Dialog.Close(busydialog)" )
        dialog.ok(AddonTitle, "You already have the most recent version","", str(parser.get('versioninfo', 'build')) + " " + str(parser.get('versioninfo', 'version')))
    else:

        path = xbmc.translatePath(os.path.join('special://home/addons','packages/'))
        fileexists = os.path.isfile(path+url+version+'.zip')
        existingfile = os.path.join(path+url+version+'.zip')

        if fileexists:
            lib = existingfile
            dp = xbmcgui.DialogProgress()
            xbmc.executebuiltin( "Dialog.Close(busydialog)" )
            tempfolder = xbmc.translatePath(os.path.join('special://','home','temp'))
            addonfolder = xbmc.translatePath(os.path.join('special://','home'))
            time.sleep(2)
            dp.create(AddonTitle,"Extracting "+ name, "Please Wait...")
            extract.all(lib,addonfolder,dp)
            # copytree(tempfolder, addonfolder)
            # shutil.rmtree(tempfolder)
            dp.close()
            ADDON.setSetting(id="username", value="")
            ADDON.setSetting(id="password", value="")
            dialog = xbmcgui.Dialog()
            dialog.ok(AddonTitle, name + " has been installed from your existing packages")
            dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi")
            killxbmc()

        else:

            if parsed.get('auth'):
                rid = parsed.get('recid')
                dlurl = parsed.get('bdlurl')

                if parsed.get('brsurl'):
                    dlurl = parsed.get('brsurl')

                print dlurl

                dp = xbmcgui.DialogProgress()
                xbmc.executebuiltin( "Dialog.Close(busydialog)" )

                # if whatami == "windows":
                #    FRESHSTARTBUILD(params)

                dp.create(AddonTitle,"Downloading "+ parsed.get('bfriendlyname')+ " - " + parsed.get('bversion'), "Please Wait...")
                lib = existingfile

                # added to remove any partially downloaded files
                try:
                    downloader.download(dlurl, lib, dp)
                except Exception as e:
                    if str(e) == "Canceled":
                        os.remove(lib)
                    return

                addonfolder = xbmc.translatePath(os.path.join('special://','home'))
                tempfolder = xbmc.translatePath(os.path.join('special://','home','temp'))
                time.sleep(2)
                dp.update(0,"", "Extracting "+ parsed.get('bfriendlyname') +" Zip","Please Wait...")
                extract.all(lib,addonfolder,dp)
                # copytree(tempfolder, addonfolder)
                # shutil.rmtree(tempfolder)
                dp.close()
                successdata = OPEN_URL(CHECKURL + "?action=installed&instid=" + str(rid) + "&user=" + U + "&pass=" + smf_hash(P,U))
                suceess = json.loads(successdata)
                dialog = xbmcgui.Dialog()
                dialog.ok(AddonTitle, suceess.get('mtit'),"", suceess.get('mmsg'))
                dialog.ok(AddonTitle, " ", "To save changes you now need to force close Kodi, Press OK to force close Kodi")
                ADDON.setSetting(id="username", value="")
                ADDON.setSetting(id="password", value="")
                killxbmc()

            else:
                xbmc.executebuiltin( "Dialog.Close(busydialog)" )
                dialog = xbmcgui.Dialog()
                dialog.ok(AddonTitle, parsed.get('etit'),"", parsed.get('emsg'))

# Copy directories from one laction to another
def copytree(src, dst, symlinks=False, ignore=None):
    if not os.path.exists(dst):
        os.makedirs(dst)
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            copytree(s, d, symlinks, ignore)
        else:
            if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
                shutil.copy2(s, d)

# Open URL (Changed to use urllib2.request)
def OPEN_URL(url):
    headers = {
        'User-Agent': USER_AGENT
    }
    sess = requests.session()
    req = sess.get(url, headers=headers)
    link = req.content
    req.close()
    return link

# Delete Packages
def DeletePackages(url):
    print '############################################################    DELETING PACKAGES             ###############################################################'
    packages_cache_path = xbmc.translatePath(os.path.join('special://home/addons/packages', ''))
    try:    
        for root, dirs, files in os.walk(packages_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete Package Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))
                    dialog = xbmcgui.Dialog()
                    dialog.ok(AddonTitle, "Packages Successfuly Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")
    except: 
        dialog = xbmcgui.Dialog()
        dialog.ok(AddonTitle, "Sorry we were not able to remove Package Files", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")

# Delete Cache  
def deletecachefiles(url):
    print '############################################################    DELETING STANDARD CACHE           ###############################################################'
    xbmc_cache_path = os.path.join(xbmc.translatePath('special://home'), 'cache')
    if os.path.exists(xbmc_cache_path)==True:   
        for root, dirs, files in os.walk(xbmc_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        try:
                            os.unlink(os.path.join(root, f))
                        except:
                            pass
                    for d in dirs:
                        try:
                            shutil.rmtree(os.path.join(root, d))
                        except:
                            pass

            else:
                pass
    if xbmc.getCondVisibility('system.platform.ATV2'):
        atv2_cache_a = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'Other')

        for root, dirs, files in os.walk(atv2_cache_a):
            file_count = 0
            file_count += len(files)

            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'Other'", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass
        atv2_cache_b = os.path.join('/private/var/mobile/Library/Caches/AppleTV/Video/', 'LocalAndRental')

        for root, dirs, files in os.walk(atv2_cache_b):
            file_count = 0
            file_count += len(files)

            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete ATV2 Cache Files", str(file_count) + " files found in 'LocalAndRental'", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass
              # Set path to Cydia Archives cache files


    # Set path to What th Furk cache files
    wtf_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.whatthefurk/cache'), '')
    if os.path.exists(wtf_cache_path)==True:    
        for root, dirs, files in os.walk(wtf_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete WTF Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass

                # Set path to 4oD cache files
    channel4_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.4od/cache'), '')
    if os.path.exists(channel4_cache_path)==True:   
        for root, dirs, files in os.walk(channel4_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete 4oD Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass

                # Set path to BBC iPlayer cache files
    iplayer_cache_path= os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.iplayer/iplayer_http_cache'), '')
    if os.path.exists(iplayer_cache_path)==True:    
        for root, dirs, files in os.walk(iplayer_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete BBC iPlayer Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass


                # Set path to Simple Downloader cache files
    downloader_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/script.module.simple.downloader'), '')
    if os.path.exists(downloader_cache_path)==True: 
        for root, dirs, files in os.walk(downloader_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete Simple Downloader Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass

                # Set path to ITV cache files
    itv_cache_path = os.path.join(xbmc.translatePath('special://profile/addon_data/plugin.video.itv/Images'), '')
    if os.path.exists(itv_cache_path)==True:    
        for root, dirs, files in os.walk(itv_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete ITV Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass

                # Set path to temp cache files
    temp_cache_path = os.path.join(xbmc.translatePath('special://home/temp'), '')
    if os.path.exists(temp_cache_path)==True:   
        for root, dirs, files in os.walk(temp_cache_path):
            file_count = 0
            file_count += len(files)

        # Count files and give option to delete
            if file_count > 0:

                dialog = xbmcgui.Dialog()
                if dialog.yesno("Delete TEMP dir Cache Files", str(file_count) + " files found", "Do you want to delete them?"):

                    for f in files:
                        os.unlink(os.path.join(root, f))
                    for d in dirs:
                        shutil.rmtree(os.path.join(root, d))

            else:
                pass


    dialog = xbmcgui.Dialog()
    dialog.ok(AddonTitle, " All Cache Files Removed", "[COLOR yellow]Brought To You By Paradox Wizard[/COLOR]")

# Delete cached files
def killxbmc():
    choice = xbmcgui.Dialog().yesno('Force Close Kodi', 'You are about to close Kodi', 'Would you like to continue?', nolabel='No, Cancel',yeslabel='Yes, Close')
    if choice == 0:
        return
    elif choice == 1:
        pass
    myplatform = platform()
    print "Platform: " + str(myplatform)
    if myplatform == 'osx': # OSX
        print "############   try osx force close  #################"
        try: os.system('killall -9 XBMC')
        except: pass
        try: os.system('killall -9 Kodi')
        except: pass
        dialog.ok("[COLOR=red][b]WARNING  !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
    elif myplatform == 'linux': #Linux
        print "############   try linux force close  #################"
        try: os.system('killall XBMC')
        except: pass
        try: os.system('killall Kodi')
        except: pass
        try: os.system('killall -9 xbmc.bin')
        except: pass
        try: os.system('killall -9 kodi.bin')
        except: pass
        dialog.ok("[COLOR=red][b]WARNING  !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.",'')
    elif myplatform == 'android': # Android  
        print "############   try android force close  #################"
        try: os.system('adb shell am force-stop org.xbmc.kodi')
        except: pass
        try: os.system('adb shell am force-stop org.kodi')
        except: pass
        try: os.system('adb shell am force-stop org.xbmc.xbmc')
        except: pass
        try: os.system('adb shell am force-stop org.xbmc')
        except: pass        
        dialog.ok("[COLOR=yellow][b]TO COMPLETE PARADOX UPDATE[/COLOR][/b]", "Press the HOME button on your remote and [COLOR=red][b]FORCE STOP[/COLOR][/b] KODI via the Manage Installed Applications menu in settings on your Amazon home page then re-launch KODI")
    elif myplatform == 'windows': # Windows
        print "############   try windows force close  #################"
        try:
            os.system('@ECHO off')
            os.system('tskill XBMC.exe')
        except: pass
        try:
            os.system('@ECHO off')
            os.system('tskill Kodi.exe')
        except: pass
        try:
            os.system('@ECHO off')
            os.system('TASKKILL /im Kodi.exe /f')
        except: pass
        try:
            os.system('@ECHO off')
            os.system('TASKKILL /im XBMC.exe /f')
        except: pass
        dialog.ok("[COLOR=red][b]WARNING  !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit cleanly via the menu.","Use task manager and NOT ALT F4")
    else: #ATV
        print "############   try atv force close  #################"
        try: os.system('killall AppleTV')
        except: pass
        print "############   try raspbmc force close  #################" #OSMC / Raspbmc
        try: os.system('sudo initctl stop kodi')
        except: pass
        try: os.system('sudo initctl stop xbmc')
        except: pass
        dialog.ok("[COLOR=red][b]WARNING  !!![/COLOR][/b]", "If you\'re seeing this message it means the force close", "was unsuccessful. Please force close XBMC/Kodi [COLOR=lime]DO NOT[/COLOR] exit via the menu.","iOS detected.  Press and hold both the Sleep/Wake and Home button for at least 10 seconds, until you see the Apple logo.")   

# Get Current platform    
def platform():
    if xbmc.getCondVisibility('system.platform.android'):
        return 'android'
    elif xbmc.getCondVisibility('system.platform.linux'):
        return 'linux'
    elif xbmc.getCondVisibility('system.platform.windows'):
        return 'windows'
    elif xbmc.getCondVisibility('system.platform.osx'):
        return 'osx'
    elif xbmc.getCondVisibility('system.platform.atv2'):
        return 'atv2'
    elif xbmc.getCondVisibility('system.platform.ios'):
        return 'ios'

# Fresh start
def FRESHSTART(params):
    plugintools.log("freshstart.main_list "+repr(params)); yes_pressed=plugintools.message_yes_no(AddonTitle,"Do you wish to restore your","Kodi configuration to default settings?")
    if yes_pressed:
        addonPath=xbmcaddon.Addon(id=AddonID).getAddonInfo('path'); addonPath=xbmc.translatePath(addonPath); 
        xbmcPath=os.path.join(addonPath,"..",".."); xbmcPath=os.path.abspath(xbmcPath); plugintools.log("freshstart.main_list xbmcPath="+xbmcPath); failed=False
        try:
            for root, dirs, files in os.walk(xbmcPath,topdown=True):
                dirs[:] = [d for d in dirs if d not in EXCLUDES]
                for name in files:
                    try: os.remove(os.path.join(root,name))
                    except:
                        if name not in ["Addons15.db","MyVideos75.db","Textures13.db","xbmc.log"]: failed=True
                        plugintools.log("Error removing "+root+" "+name)
                for name in dirs:
                    try: os.rmdir(os.path.join(root,name))
                    except:
                        if name not in ["Database","userdata"]: failed=True
                        plugintools.log("Error removing "+root+" "+name)
            if not failed: plugintools.log("freshstart.main_list All user files removed, you now have a clean install"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation")
            else: plugintools.log("freshstart.main_list User files partially removed"); plugintools.message(AddonTitle,"The process is complete","click OK to begin clean installation")
        except: plugintools.message(AddonTitle,"Problem found","Your settings has not been changed"); import traceback; plugintools.log(traceback.format_exc()); plugintools.log("freshstart.main_list NOT removed")
        plugintools.add_item(action="",title="Now Exit Kodi",folder=False)
    else: plugintools.message(AddonTitle,"Your settings","has not been changed"); plugintools.add_item(action="",title="Done",folder=False)

# Fix bad zip files
def fixBadZipfile(zipFile):  
    f = open(zipFile, 'r+b')  
    data = f.read()  
    pos = data.find('\x50\x4b\x05\x06') # End of central directory signature  
    if (pos > 0):  
        print "Trancating file at location " + str(pos + 22)+ "."  
        f.seek(pos + 22)   # size of 'ZIP end of central directory record' 
        f.truncate()  
        f.close()  
    else:
        pass
        # raise error, file is truncated  

# SMF Password Hashing
def smf_hash(password, username):
    """
    Python implementation of the smf check hash function
    """
    return sha1(username.lower().encode('utf8') + password).hexdigest()   

# Get params     
def get_params():
        param=[]
        paramstring=sys.argv[2]
        if len(paramstring)>=2:
                params=sys.argv[2]
                cleanedparams=params.replace('?','')
                if (params[len(params)-1]=='/'):
                        params=params[0:len(params)-2]
                pairsofparams=cleanedparams.split('&')
                param={}
                for i in range(len(pairsofparams)):
                        splitparams={}
                        splitparams=pairsofparams[i].split('=')
                        if (len(splitparams))==2:
                                param[splitparams[0]]=splitparams[1]

        return param

N = base64.decodestring('')
T = base64.decodestring('L2FkZG9ucy50eHQ=')
b = base64.decodestring('')
F = base64.decodestring('')

# Add directory
def addDir(name,url,mode,iconimage,fanart,description):
        u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+urllib.quote_plus(iconimage)+"&fanart="+urllib.quote_plus(fanart)+"&description="+urllib.quote_plus(description)
        ok=True
        liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=iconimage)
        liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": description } )
        liz.setProperty( "Fanart_Image", fanart )
        if mode==5 :
            ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)
        else:
            ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
        return ok



params=get_params()
url=None
name=None
mode=None
iconimage=None
fanart=None
description=None


try:
        url=urllib.unquote_plus(params["url"])
except:
        pass
try:
        name=urllib.unquote_plus(params["name"])
except:
        pass
try:
        iconimage=urllib.unquote_plus(params["iconimage"])
except:
        pass
try:        
        mode=int(params["mode"])
except:
        pass
try:        
        fanart=urllib.unquote_plus(params["fanart"])
except:
        pass
try:        
        description=urllib.unquote_plus(params["description"])
except:
        pass

# Set the current window view
def setView(content, viewType):
    # set content type so library shows more views and info
    if content:
        xbmcplugin.setContent(int(sys.argv[1]), content)
    if ADDON.getSetting('auto-view')=='true':
        xbmc.executebuiltin("Container.SetViewMode(%s)" % ADDON.getSetting(viewType) )


if mode==None or url==None or len(url)<1: SETUP()
elif mode==2: BUILDMENU()
elif mode==3: MAINTENANCE() 
elif mode==4: deletecachefiles(url)
elif mode==5: WIZARD(name,url,description)
elif mode==6: FRESHSTART(params)
elif mode==7: DeletePackages(url)
elif mode==8: facebook()
elif mode==9: donation()
elif mode==11: DELETEIVUEDB()

xbmcplugin.endOfDirectory(int(sys.argv[1]))

答案 1 :(得分:0)

我成功解码了这个&#39;使用python 2.5版进行混淆,python 3.0及更高版本接收了主要的bug修复实习生,使得无法解码这个特定的base64混淆。