├── README.md ├── RegistryTikTok.py └── STikTok ├── __init__.py ├── applog.py ├── device.py ├── gorgon.py ├── log.py ├── solver.py ├── ttencrypt.py ├── utilities.py └── xlog.py /README.md: -------------------------------------------------------------------------------- 1 |

Made By @d7ld & @jackdeloasa

2 |

Credits For The Help xtekky

3 |

TikTok Account Creator

4 |

No Proxy Need

5 |

Sleep Mode

6 |

Accounts Don't Get Banned

7 |

Have Fun :)

8 | -------------------------------------------------------------------------------- /RegistryTikTok.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import random 3 | import time 4 | import os 5 | import ctypes 6 | import threading 7 | from colorama import Fore, init 8 | import STikTok 9 | from urllib.parse import urlencode 10 | init(autoreset=True) 11 | 12 | banner = """ 13 | ╔═╗╔╗╔╔═╗╦ ╦ 14 | ╚═╗║║║║ ║║║║ 15 | ╚═╝╝╚╝╚═╝╚╩╝ 16 | """ 17 | 18 | def Print(text: str): 19 | print( 20 | f" {Fore.LIGHTBLUE_EX}->{Fore.LIGHTCYAN_EX} {text} {Fore.LIGHTBLUE_EX}<- {Fore.RESET}") 21 | 22 | 23 | def Input(text: str): 24 | print( 25 | f"\r {Fore.LIGHTBLUE_EX}->{Fore.LIGHTCYAN_EX} {text} {Fore.LIGHTBLUE_EX}-> {Fore.RESET}", end="") 26 | return input() 27 | 28 | 29 | class Registry(): 30 | def __init__(self): 31 | self.done = 0 32 | self.err = 0 33 | self.sleep = 300 34 | self.run = True 35 | self.device = self._get_device() 36 | os.system("mode 70,10") 37 | ctypes.windll.kernel32.SetConsoleTitleW("Made By D7 or @d7ld & F15") 38 | print(f"{Fore.LIGHTBLUE_EX}{banner}") 39 | Print("TikTok Accounts Creator") 40 | self.main() 41 | 42 | def main(self): 43 | account = int(Input("How Many Accounts Do You Want : ")) 44 | sleep = int(Input("Sleep [20 - 60] : ")) 45 | threading.Thread(target=self.printer).start() 46 | for i in range(account): 47 | while True: 48 | try: 49 | req, birth, username, password = self.register_account() 50 | if str(req).__contains__("session_key"): 51 | sessionkey = req["data"]["session_key"] 52 | self.validate_account(sessionkey, birth) 53 | with open(f"accounts.txt", "a") as accounts: 54 | accounts.write( 55 | f"Username : {username}\nPassword : {password}\nSessionid : {sessionkey}\n") 56 | accounts.close() 57 | with open(f"sessionids.txt", "a") as sessionids: 58 | sessionids.write(f"{sessionkey}\n") 59 | sessionids.close() 60 | self.done += 1 61 | break 62 | elif str(req).__contains__('Too many attempts. Try again later.'): 63 | self.err += 1 64 | time.sleep(self.sleep) 65 | else: 66 | self.err +=1 67 | time.sleep(self.sleep) 68 | except Exception as e: 69 | print(e) 70 | continue 71 | time.sleep(sleep) 72 | self.run = False 73 | print() 74 | Print(f"{self.done} Accounts Has Been Created") 75 | Input("Enter To Exit") 76 | os._exit(0) 77 | 78 | def _get_device(self): 79 | device = STikTok.Device_Genrator() 80 | STikTok.CaptchaSolver( 81 | did=device["device_id"], iid=device["install_id"]) 82 | return device 83 | 84 | def printer(self): 85 | while self.run: 86 | print( 87 | f"\r {Fore.LIGHTBLUE_EX}->{Fore.LIGHTCYAN_EX} Done : {self.done} | Errors : {self.err} {Fore.LIGHTBLUE_EX}<- {Fore.RESET}", end="") 88 | time.sleep(0.70) 89 | 90 | def _validate_account_params(self): 91 | device = self.device 92 | return urlencode({ 93 | "residence": "SA", 94 | "device_id": device["device_id"], 95 | "os_version": "14.4", 96 | "iid": device["install_id"], 97 | "app_name": "musical_ly", 98 | "locale": "en", 99 | "ac": "WIFI", 100 | "sys_region": "SA", 101 | "js_sdk_version": "1.77.0.2", 102 | "version_code": "21.1.0", 103 | "channel": "App Store", 104 | "vid": "7094F26A-EC10-45E4-8854-5D0616167B08", 105 | "op_region": "SA", 106 | "tma_jssdk_version": "1.77.0.2", 107 | "os_api": "18", 108 | "idfa": "D2CF453D-6981-4F32-A0EB-7A200FED8504", 109 | "device_platform": "ipad", 110 | "device_type": "iPad11,6", 111 | "openudid": device["openudid"], 112 | "account_region": "", 113 | "tz_name": "Asia/Riyadh", 114 | "tz_offset": "10800", 115 | "app_language": "en", 116 | "current_region": "SA", 117 | "build_number": "211023", 118 | "aid": "1233", 119 | "mcc_mnc": "", 120 | "screen_width": "1620", 121 | "uoo": "1", 122 | "content_language": "", 123 | "language": "en", 124 | "cdid": device["cdid"], 125 | "app_version": "21.1.0" 126 | }) 127 | 128 | def validate_account(self, sessionkey, birthday): 129 | return requests.post("https://api16-normal-c-alisg.tiktokv.com/aweme/v3/user/info/sync/?"+self._validate_account_params(), headers={ 130 | 'Cookie': f'sessionid='+sessionkey, 131 | 'Content-Type': 'application/x-www-form-urlencoded', 132 | 'User-Agent': 'TikTok 21.1.0 rv:211023 (iPad; iOS 14.4; en_SA@calendar=gregorian) Cronet', 133 | 'Sdk-Version': '2' 134 | }, data=birthday).text 135 | 136 | def _get_random_password(self): 137 | l = "".join(random.choice( 138 | "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") for i in range(6)) 139 | c = "".join(random.choice("@#") for i in range(2)) 140 | n = "".join(random.choice("1234567890") for i in range(4)) 141 | return l + n + c 142 | 143 | def _get_random_username(self): 144 | l = "".join(random.choice("qwertyuiopasdfghjklzxcvbnm1234567890_") 145 | for i in range(7)) 146 | return l 147 | 148 | def register_account(self): 149 | birthday = f"birthday=1986-01-02" 150 | password = self._get_random_password() 151 | username = self._get_random_username() 152 | deviceid = self.device["device_id"] 153 | params = STikTok.Sign(f"aid=143243&device_id={deviceid}&verifyFp=verify_lbtcmozr_SV8EAMJv_poB2_4xJD_9klD_JPCNTTpXYuy2&webcast_language=ar&msToken={STikTok.msToken(None)}", 154 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36") 155 | url = f'https://api22-normal-c-useast1a.tiktokv.com/passport/web/username/register/?'+params 156 | r = requests.post(url, headers={'Content-Type': 'application/x-www-form-urlencoded', "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", 157 | "Referer": "https://www.tiktok.com/"}, data=f'mix_mode=1&password={password}&aid=1459&account_sdk_source=web&language=en&{birthday}&username={username}', verify=True, timeout=3, allow_redirects=True).json() 158 | return r, birthday, username, password 159 | 160 | 161 | Registry() 162 | -------------------------------------------------------------------------------- /STikTok/__init__.py: -------------------------------------------------------------------------------- 1 | ## Made By insta : @d7ld Tele @d7ldi 2 | 3 | from .gorgon import Gorgon, StableGorgon 4 | from .ttencrypt import TTEncrypt 5 | from .xlog import XLEncrypt 6 | from .utilities import Utils 7 | from .device import APP, Device 8 | from .applog import Applog 9 | from .log import Xlog 10 | from .solver import PuzzleSolver, Captcha 11 | from execjs import compile 12 | import requests 13 | 14 | def Gorgon_Genrator(params: str, data: str, cookies: str): 15 | gorgon = Gorgon() 16 | return gorgon.calculate(params, cookies, data) 17 | 18 | def CaptchaSolver(did: str, iid: str): 19 | return Captcha(did,iid).solve_captcha() 20 | 21 | def Device_Genrator(): 22 | return log.Xlog().validate_device() 23 | 24 | def Xor(string): 25 | encrypted = [hex(ord(c) ^ 5)[2:] for c in string] 26 | return "".join(encrypted) 27 | 28 | def Sign(params : str , user_agent : str): 29 | signer = compile(bytes.fromhex("d792d503024696f667c256c2e6769637c2c292d526c256c2c2c2c2b5c222736323531363237326730373630333232323230373632353637373733673035313632373267303731603267373634373467363736673630323232323230316231303562336435633162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343032303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434356336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343132303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434383336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343232303632303562336338333162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343332303632303432313035323130356231303637373733673467343036373667373631673736353037363037363739373137336736303564303630363637303733673136333633333736303736373937313733673834303130363036363730373367313633363730366736673237303734303437346731673136373630343367373638303637333631663736336737363367313633363930373736373467316735373637373734673636393034673367313637363037363736673637383035373365326636373737346731673730363730363237303531363637343633673665336737363260373634673637343732353136363730363636393037363267343731673637326531363637346734673167326037363267343731673637326531363637373636363367326032673736373731673434313636373467346731673160326737363737316734343136363737363636336731603437363631373637313631673537373036373667336730363467336730373730373636373437333036373737336730373536346736373730313636373437343736363137363737373830373630373637393731373365363037373167323031663736313636373336336731363334363734673167353736373737356032623130353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373032363231303030356230303030303039303260303032613832303034613832363032603030326139303260323230303261383230303461383236303260303032613730303036313031313030303160343336303834366230336660393431603260303032613432346230303561323238303260303032613561303037313933326032603030326131623030356134303260303032613930326032323030326138323030346138323031313030303160343333603834366230303036633030303164316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433323138343662303030303366603031643160326030303261343234623030356132323830326030303261393032603232303032613362303034613033303038343530303036313333383038343662366660303934303131303030316032603260303032613432326230303561323234303260303032613561303037313933326032603030326131623030356134303260303032613333303138343662366660303934303131303030316039323030346134323030326134623232393230303561303032613432326230303561323234303260303032613030326130356030373139333030383439323260326030303261316230303561343032603030326133303666663138323030346138323031313030303160366236633834316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433363038343662303366603934316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433336038343662303030366330303031643160326030303261343234623030356132323830326030303261393032603232303032613832303034613832303131303030316034333231383436623030303033666030316431603260303032613432346230303561323238303260303032613930326032323030326133623030346130333662366660303934303131303030316039323030346134323030326134623232393230303561303032613432326230303561323234303260303032613033333338303834366236666030393430313130303031603932303034613432303032613462323239323030356130303261343232623030356132323430326030303261333330313834366236666030393430313130303031603932303034613432303032613462323239323030356130303261343232623030356132323430326030303261303032613136603037313263383233303834326032603030326131623030356134303260303032613932303034613030383430303261383230303461303030303230303032613330303034613931353032603030326137303260303032613030326134603732303032303632303032303730326030303261346035323030323034323030323037303260303032613460333230303230323230303230373032603030326134603132303032303032303032303730326030303261366130303461303031613630303035613331303032613561303034613461303032303030326132316430303030303030303030303030326535663932346230366135383267366831303138323030333432353663303431643664356438343228207d66737a6e3d39226c25682c216b29226825646f63427168634d6f62766e276e696274735b29256825646f63427168634d6f62766e276e696274735e3d39216c226c25682c29256825646f63427168634d6f62766e276e696274735e3d356c2d79267c2c6c657e68297c6070716e25646f63427168634d6f62766e276e696274735c2e6d3d58313b567c297d3d57313b567c296d3d56313b567c207d3d55313b567c246d3d54313b567c286d3d53313b567c247d3d52313b567c257d3d51313b567c227d3d50313b567c287d3d593b567c236d3d583b567c2f5d3d573b567c266d3d563b567c2c6d3d553b567c216d3d543b567c2f6d3d533b567c226d3d523b567c237d3d513b567c256d3d503b56702e62757475627b39293138297162727148347e69655027756e6d367024756c6b7e3d39297c207c286c257c287c2f5c2c6c2f6c237c2e6c296c246c247c227c236c266c216c226c25682c203e3d39282c203024696f667a356471644f3564716440266f656079747d312224656e696665646e65722c292d526c256c2c2c2c2b5c222736323531363237326730373630333232323230373632353637373733673035313632373267303731603267373634373467363736673630323232323230316231303562336435633162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343032303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434356336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343132303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434383336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343232303632303562336338333162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343332303632303432313035323130356231303637373733673467343036373667373631673736353037363037363739373137336736303564303630363637303733673136333633333736303736373937313733673834303130363036363730373367313633363730366736673237303734303437346731673136373630343367373638303637333631663736336737363367313633363930373736373467316735373637373734673636393034673367313637363037363736673637383035373365326636373737346731673730363730363237303531363637343633673665336737363260373634673637343732353136363730363636393037363267343731673637326531363637346734673167326037363267343731673637326531363637373636363367326032673736373731673434313636373467346731673160326737363737316734343136363737363636336731603437363631373637313631673537373036373667336730363467336730373730373636373437333036373737336730373536346736373730313636373437343736363137363737373830373630373637393731373365363037373167323031663736313636373336336731363334363734673167353736373737356032623130353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373032363231303030356230303030303039303260303032613832303034613832363032603030326139303260323230303261383230303461383236303260303032613730303036313031313030303160343336303834366230336660393431603260303032613432346230303561323238303260303032613561303037313933326032603030326131623030356134303260303032613930326032323030326138323030346138323031313030303160343333603834366230303036633030303164316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433323138343662303030303366603031643160326030303261343234623030356132323830326030303261393032603232303032613362303034613033303038343530303036313333383038343662366660303934303131303030316032603260303032613432326230303561323234303260303032613561303037313933326032603030326131623030356134303260303032613333303138343662366660303934303131303030316039323030346134323030326134623232393230303561303032613432326230303561323234303260303032613030326130356030373139333030383439323260326030303261316230303561343032603030326133303666663138323030346138323031313030303160366236633834316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433363038343662303366603934316032603030326134323462303035613232383032603030326139303260323230303261383230303461383230313130303031603433336038343662303030366330303031643160326030303261343234623030356132323830326030303261393032603232303032613832303034613832303131303030316034333231383436623030303033666030316431603260303032613432346230303561323238303260303032613930326032323030326133623030346130333662366660303934303131303030316039323030346134323030326134623232393230303561303032613432326230303561323234303260303032613033333338303834366236666030393430313130303031603932303034613432303032613462323239323030356130303261343232623030356132323430326030303261333330313834366236666030393430313130303031603932303034613432303032613462323239323030356130303261343232623030356132323430326030303261303032613136603037313263383233303834326032603030326131623030356134303260303032613932303034613030383430303261383230303461303030303230303032613330303034613931353032603030326137303260303032613030326134603732303032303632303032303730326030303261346035323030323034323030323037303260303032613460333230303230323230303230373032603030326134603132303032303032303032303730326030303261366130303461303031613630303035613331303032613561303034613461303032303030326132316430303030303030303030303030326535663932346230366135383267366831303138323030333432353663303431643664356438343228207d66737a6e3d39226c25682c2d72702e62757475627b392d56353235292d536b566b2d547b56682b566e592568247145646f63427168636e226825646f63427168634d6f62766e276e696274735d3b227c216d3d536b566c2d536b566d3d547b566c2d547b566d316c26353235292d5635323529213b24782d347b566b23682d33692b2b256b3864776e656c6e226c356b303d356024756c68227f666b303d336b303d347024756c6b316d3d536b566c2d536b566d3d526b566c2d526b566d316c2635323529292864776e656c6e25652268247145646f63427168636e256b2d526b566b23682d33692b2b226b3635323c326b303d326024756c68227f666b356d3d556b56692b2b256b3635323c356b303d356024756c68227f666b32222d327c203d336c2d5b5d366c216024756c6b7e3d39226c25682c2d79216c2c6c657e68297c6070716e25646f63427168634d6f62766e276e696274735c26353235226d3d523b516c26353235256d3d513b516c2635323f256d3d503b51602e62757475627b392338297162727148347e69655027756e6d316024756c6b7e3d39226c25682c2d726a347e656761427563757b7c203024696f667a36326634356438703f5f36326634356438703f5d3d31203024696f667c2d72222a32367f54696265677f54747c22222a34696265677f54747c22222a34696774747c22222a3469647375647f53616f5f5c203a337574716473537d6c22222a3e656b6f64537d6c203a35646f63667e656c2d5b5a3473796c4469616c2d5b5a35647164735566796473616c2d5b5a3473796c4462716f6269756b6c2d5b5a3473796c4b63696c636c2d5b5a3473796c45667f6d6c2d5b5a3473796c4e656b6f6457756e437d6c203a3875646e694375776f626b7c2d703a35646f6362657b7c22267330322e3d39282c203e3d39282c2d70312a376268787c21312a366275607c21312a367c203a35646f6d657c2d7b7a366e6f634e6f696765627c22222a3e6f696765627c21312a34616f6c6e65527567676962747c2d703a3562766c203a347e657f6d6144796e657c203a356d696454796e657b7a3b636162747c21312a3b63616274556c62616e656c21312a34656a796c616964796e696c2d5b5a33756c6572556479627775625c62757f5c2d5b5a33756c6572556479627775625c62757c2d5f24727f6075627f2c5265677f2c5f2b5a38756765625473796c48647160556c62616e656f5c2d5b5a3473796c48647160556c62616e656c21312a3964637c21312a3076646c203a3469616c21312a356f626b7c203024696f667a36656368373138703f5f36656368373138703f5d3d31203024696f667c203024696f667c2c2b5c222032353232303132353232303232353232303332353232303162363232303262363232303432363232303532363232303632363232303732363232303032363232303132363232303232363232303637373733673037363737373630363737373367303731373636363035363130363734323132373232623537303736373262316231623332333232623162363737323332313231373332333235373262316237373037326237373232373237373032333233323332333233323332333233323332333233323332333233323332333233323332333233323332333233323332333233323332333233323332333233323032373532353365366531643235333435633034356535633264336031353634373430343563303435653563326439303736316732663637343036673136363437363136336733363637313639303537346733673035346733673167343736373136316034673367303639373430336535353465316533643635303531653534363537353364313536353434366034673437316730363036323736303567336737363036363630373630363737373367356531663037323735363167313633363260373630363167366537373167323737303735316534363330363733363166373434373036356737303136336731673536323732673637313738303736346736363367356732353736316734673636316030373037323733303637356731673734373631673467363638303837303732373136373635303567373430363330363737363237373630343436336737373467316734363260363737363237373630343637353631673736303732373260373731363237336731373166363738353637313731603736303631673665373731363237336731373166363738373360383730373167366730353637313737303736303631673665383730373167366730373930363735363367356536373137363036373037316736673336303636303736303631673665363735363367356738303267303636363667353735303437346731673467346736363136373031323534373731673137363734343736373639303132353633643737316731373637343633643736373632603737316531373637343437363736373037373167313736373436336437363736383037373167343637363736353030363637316738373367336730353137363734343734373437363637343736603567336737373467323731363630313633673367366735373530333635673237373630363637356731673736393034363367346733303365353534653165303536353034373033323632323036373037316736673036353031623732323032623732323032323332333233323332336734363532393437323135313233323364356034323732323034673367316730363136363735343637353739303532316231323432353231623732316231323732316035323732323037373167373733643037363730363364373736373736316631373364356036323732323037323732323035623737316736363636353336303562373731673137363734363364373637363930356236373567323734673267373632373336393034673437316730363364373736673367303632373160316631363637363632363530303237323230366731363636333035333130356232673036323732673364316637373367313731603136373630363132366732373534316637373367313732603566383632303166353731673437346731673136373630363930316637373367313734303132373232303667323736373136313633673537373032323732323033323732323033323332333233323232323233323332333233323332333233323232356033323130316230323230326230323230366733673037336737363367313633363830343734673167313637363036313736363036393037373167366732373534373633673465356733673737326034323032323036373567316737343736363734373730353230323230363230323230373230323230313233643732353236373036323731373830303230323230323233643732353236373036323731373830313230323230333233643732353236373036323731373830323230323230333230323364373235323137363036373737336730353136323732673035356733673136353733603267303733643732353236373036323731373930346736373267373634303667366732373330326730363636333634303737366736373167353537373467363737363266363732603732333635673237373630363637356731673736316037373165373634673637316736673037383033643364346733673167303631363637353633643364326034673367316730363136363735343336353739303334316530373736313635303267373634373467363736653637353631673736323734673360313633673136313636353266323737363467316630363260356731303737316730373036336437363736373036373167383733673367303531363637353636373160303233363567323737363036363735673167373631603736303631673665303634673167343736363667333632603736303631673665303637363467336735353036393732603367353734673165363633363437373031323336356732373736303636373567316737363160363734673367393636373567316737363830336735373467316532673037363633673736393033363130316631363637373637363237313737303137363630343736303736363737336731363336316033673167373632373134366736373266316733343637303731673536363737373031373635373637366534673637363731363037303631603336336737343467363736373136303730363930346733673167373636363667336730363637313436673167323735363237366034673367316737363636366733673036363731363160363734373237363634373467323736673830316631363367356736373565363730373167353636373737336031663037346736373136313636363037346733673035363731363237343637373136323732673331323233363567323737363036363735673167373631603036363731673736316736673167313732373930373631303637356731673734373631363237373630363930313631303537313034673130373731673237333034633563316232623432353236323732303231323232333239363166326634363536363637363036313632363336336734673567366738373937316732673437353736373737303731373237393431643264343435343634373430343134323433343365346535653665383539353165326534353535363537353035313532353034383733673367326734303567336737363467323732673336373035673367373733303267303737363167343630363630373634673637373630363167303634673367303731603467343731673034373630373637313631673737316034673365326730373736316734363034356732373136323733363364356036373667343733673367343536303136336737373467363735363630333230323230316231323230363731673036356734303363373634673637373731673136373638303363363735673367313632673037373033633736333633673333353033633136333633673333353033633237313636373336336736303363326633673537363731363167353738303262313232303432313232303532313232303632313232303732313232303032313232303132313232303637383731673336343030363367316732663537353030363367316731363037353032323232326633303036336731363037343031633037333631363637343633673336336430373237356733603267303633673736346731673037323735673930323231323230303732373567333033323132323037373367333631673430316232323230373732373336316734303262323232303637346733673267333631673630343232323230326636363467316736673530353232323230373731673367313637373467323737303632323232303467316734363330373232323230303634363367373734673167343637303032323232303132323232303567313633673537373632373667333638303736303633673267366732373037336736673363336339323336373637363267303136373667316735373430353736373136326734303467336731673736323730373367366738303732313031633566343238363163356637323663323238363564316235633332353735633237383439323263356637323663323238363564316235633332353735633237383436663566303238363163356630323663323238363564316235633332383434633664326335663032366332323836356431623563333238343263336336643363366439323362303633363736373632673464316435643166323731363136323534673167343736363667333433333736303736373937313733673834343136373737336730373637353631673736323734673160343731303933303636643330363730373237366733363637313637303665313436343237373632373735336737363930303632373536346732373037363037363467363735673637366736353637373632373637313630373460373634673637353636353136363737363467316733673334303435653560373634673637353636353136363737363467316733673334336031353735373736373266363737373467316739303567363737363165363735363367356736373136316037373637373631663135363731363637326531663637383536373567336730363031356736373736316537363637303637303637343732373136336737363034346733673167303630363637303635603134313436353364373536353735363536353035326436353364323537343365363432343231363737373367303734303136336731363136363734673367373033673736316734673437336730373467316739303736303636373736343034673637333633673430303231303136363730363436336731363135313736373434336536353036316735603037346731663036323537363037363739373137336537373467316731373660313636373267303737363237333630363167373531363637303634363367313631353137363734343367363736313167333632373367363735303336313632373267303435373637303538303336313632373267303435373637303738303637356733673036343033643637326730373237303736303364303737373564393635633237383437333664316033363266363534373637313436303267303737363237356735303036316636373837343037363467363735673636303733673737383031363637373731363367303736373134336436353735316533643567363631673467363736673637303433643631356736363167346736373667363730343667366732373037336035673636316734673637366736373036336439303737363733363336323731363436346736363364313636373536316731363737326635373364336434313737363733363336323731363436346736363364356736363167346736373667363730363364336434313637373632373636366732373536363733643136363735363167313637373364336431313737363733363336323731363436346736363364313636373536316731363737313736373436336433643531373736373336333632373136343634673636336431363637353631673136373733643364323136373736323736363667323735363637336431363637353631673136373732663537336433643331346735373364373633363167313630373036336431363637353631673136373731373637343633643364353130373467363635373364373633363167313630373036336431363637353631673136373731373637343633643364373134673367316737363037346736363537336437363336316731363037303633643136363735363167313637373137363734363364336432613637373632373636366732373536363733643567363631673467363736673637303633643364333136373736323736363667323735363637336431363637353631673136373731373637343633643364343137363037363734673467336730373730363735673167373634673636313637303637356733673136326730373630303636373437323736363437346732373667393030363637356732373465316637363136363733363367313633343467343633653736363734373331313636373536316731363737313736373436393037353132373632663637373634673367303534373467316731363637373734673637313430363237353634673237303538313367316737373636323535303637313632373567373632673437316734673364336432603567336737363467323732673334366736673237303732603567336737363467323732673336336438303036346731673437363636673336373035643166313633673736303631673265333337363037363739373137336738343031356733673737303639373530356431363367373632373437316735363237346533333736303736373937313733673834323137363467363735673636303733673735383035643436336737373467316734343333373630373637393731373367383436603736323531363237326730373630333232323230373632353637373733673035313632373267303731603267373634373467363736673630323232323230316231303562336435633162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343032303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434356336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343132303632303562363730353736303432373037343535343265316232663166313634673935393735353567393636363334336537343164323633673137366534653432316736353667323536343434383336323132313432323165326435323032343635363537356533633332326231353234303638353934373232673437333637373837373531343232303632303562336338333162326234323532363237323032313232323332393631663266343635363636373630363136323633363367346735673667383739373167326734373537363737373037313732373934316432643434353436343734303431343234333433653465356536653835393531653265343535353635373530353135323531343332303632303432313035323130356231303637373733673467343036373667373631673736353037363037363739373137336736303564303630363637303733673136333633333736303736373937313733673834303130363036363730373367313633363730366736673237303734303437346731673136373630343367373638303637333631663736336737363367313633363930373736373467316735373637373734673636393034673367313637363037363736673637383035373365326636373737346731673730363730363237303531363637343633673665336737363260373634673637343732353136363730363636393037363267343731673637326531363637346734673167326037363267343731673637326531363637373636363367326032673736373731673434313636373467346731673160326737363737316734343136363737363636336731603437363631373637313631673537373036373667336730363467336730373730373636373437333036373737336730373536346736373730313636373437343736363137363737373830373630373637393731373365363037373167323031663736313636373336336731363334363734673167353736373737356032623130353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373032363231303030366331303030303036633260303032613563313034613031323030303160343230303230356332603030326136323331326030303261303032613463313034613031333030303160346332603030326132633260303032613361326030303261363232313260303032613030326133633130346130313230303031603363326030303261343032633260303032613131326030303261363233603260303032613030326132633130346130313331303031603933326030303261373332603030326135333260303032613333326030303261313332603030326136623260303032613462326030303261326232603030326139323260303032613163326030303261383332603030326136333260303032613433326030303261323332603030326130333260303032613562326030303261336232603030326131623260303032613832326030303261363230313260303032613030326131633130346136666030393430303261393331303461313339333260303032613133383332603030326131333733326030303261313336333260303032613133353332603030326131333433326030303261313333333260303032613133323332603030326131333133326030303261313330333260303032613133366232603030326131333562326030303261313334623260303032613133336232603030326131333262326030303261313331623260303032613133393232603030326138323260303032613030326138333130346136623666603039343433303038343732326030303261303032613733313034613662366660303934343338303834373232603030326130303261363331303461366236666030393434333031383437323260303032613030326135333130346136623666603039343433383138343732326030303261303032613433313034613662366660303934343330303834363232603030326130303261333331303461366236666030393434333830383436323260303032613030326132333130346136623666603039343433303138343632326030303261303032613330313034613662366660303934343338313834363232603030326130303261313031303461393136603834353232603030326130303261303031303461393135603834353232603030326130303261356660303461393136603834303232603030326130303261326660303461393135603834303232603030326130303261393660303461393136603834366132603030326130303261383660303461393135603834366132603030326130303261323660303461393132603030326130303261316560303461336230303130393431613260303032613030326138356030346132623030313039343161326030303261303032613735603034613461326030303261303032613435603034613031303030303160363236603260303032613030326133356030346132623835633039343031303030303160343235646030356132323030316135603260303032613030326136646030346130313130303031603430343232603030326133303260303032613432313331303561323239303260303032613030326134646030346130313230303031603032303032303332326030303261363234603260303032613030326133646030346130313230303031603132326030303261323232603030326136323360326030303261303032613264603034613031323030303160393132603030326131613260303032613632326032603030326130303261393460303461303130303561316032603030326130303261373460303461303131303030316034303031313030303160383132603030326134323133313035613232393032603030326133303260303032613432313331303561323239303260303032613030326135346030346130313130303031603430303131303030316035613260303032613432313331303561323239303260303032613330326030303261343231333130356132323930326030303261303032613669303034613430363132603030326133303260303032613030326135693030346130343834303032613639303034613261326030303261303032613539303034613230383430303261343930303461383030303561383032603030326130303261333930303461303331303561373032603030326130303261336130313030303031603632363032603030326133613031303030303160363235303260303032613460303037313662313035613430326030303261373032393030346134303731326030303261333032603030326130303261323130303530323930303461323030303230303032613030366137323560303036303330303036343632303037313034303030303230373132603030326133613360303037313232303436323731326030303261336131603030373132323034323032603030326137313260303032613239303034613562313032303030326138313730303030303030303030303030333038343731333663636133303236626660343236613030333432353663303431643664356438343228207d66737a602e62757475627b79226c25682e676963702e6f6964736e65766b3d72316036393538703f5a35646f6365646c24643535636238703f5a35646f636e656b7d36326634356438703f5c2d76602e62757475627b3d592b2b2278247145646f63427168636e256b56383661313538703f5c743c3c3d592b2b2278247145646f63427168636e256b56383661313538703f5d3d5b2b236b56692b316c327b303d327c203d336c292268297162727148347e69655027756e6d366c213c3c326d316c213e3e3864776e656c6e256d326022716678227f666b7925682e6f6964736e65766d32316036393538703f5c2d71602e62757475627b3d5d5b2b266b556b54663669356238703f5d3b21692b326c366b303d366c22222d316c2864776e656c6e256d326022716678227f666b7925682e6f6964736e65766d34643535636238703f502271667b3925646533346338703f5d3d55646533346338703f5b27383b56383661313538703f5a35646533346338703f5d3d55646533346338703f5b28343b56383661313538703f5f30313c35646533346338703f58262626313c35646533346338703f5c2d55646533346338703f5625313b55353433333238703f5b2d553136243e3e35646533346338703f5b55353433333238703f5d3d55646533346338703f5b54663669356238703f592b2b25646533346338703f5b3635323c35646533346338703f5b303d35646533346338703f5c2d5b5d36383661313538703f5c2d5b5d34663669356238703f5c2d5226622c2225622c2224622c2223622c2222622c2221622c2229322c2228322c2227322c2226322c2225322c2224322c2223322c2222322c2221322c2220322b5d35353433333238703f5c2d7d71312d316b31312d316024756c6b79226c25682e6f6964736e65766a37657265646b7d34363661656338703f5c2d70312a376268787c21312a366275607c21312a367c203a35646f6d657c2d7b7a366e6f634e6f696765627c22222a3e6f696765627c21312a34616f6c6e65527567676962747c2d703a3562766c203a347e657f6d6144796e657c203a356d696454796e657b7a3b636162747c21312a3b63616274556c62616e656c21312a34656a796c616964796e696c2d5b5a33756c6572556479627775625c62757f5c2d5b5a33756c6572556479627775625c62757c2d5b5a38756765625473796c48647160556c62616e656f5c2d5b5a3473796c48647160556c62616e656c21312a3964637c21312a3076646c203a3469616c21312a356f626b7d35633665353268703f5022716678227f666d792d556c26656368373138703f5c203024696f667a31613464323138703f5f31613464323138703f5d3d31203024696f667c2c2b5c2225373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537353735373537303236323130303033303030303030303530326030303261373031303030346134303430326030303261323032603030326130303261323130303530313030303461323030303230303032613030366137323560303036303330303036343130303034613030303032303030326132363030303030303030303030303030316132356568356034383531303032616561303038333030333432353663303431643664356438343228207d66737a602e62757475627b79256826656368373138703f502e6f6964736e65766b392d79282d79292d71383734646438703f502e62757475627b79282e6f6964736e65766829203024696f6678262624656664353538703f5c21383734646438703f5d35346d6e29366230373138703f582a31383734646438703f5d3374727f6078756e21383660373738703f5f36626364673138703f5b392827373162683338703f5d31383734646438703f502271667b3d79222d3d322b2d533636243c3c356b55653831336238703f5b2d523e3e3e392d527b536d35682b55653831336238703f582b26602e62757475627b3d516623363b55653831336238703f5b2d59263e3e3e316c723c3c32682623363b55653831336238703f5b2d59243e3e3e326c743c3c35682623363b55653831336238703f5b2d523e3e3e356b55653831336238703f5d3b266c2d5b2b227b536d316c2d5b2b227b536d326c2d5b2b227b536d35692b35313c327b303d327c292829716272716e237968647d336c22222d366c216c226c256022716678227f666b79282e6f6964736e65766d3436356371626e256079747f647f62707e28336738383538703f5c22756666657249716272716e256079747f647f62707e28336738383538703f5d3275666665726e256079747f647f62707e28336738383538703f5c2d756c23386e237968647d3d533b526c22386e237968647d3d523b526c21386e237968647d3d513b526c20386e237968647d3d503b52602e62757475627b39256829716272714233347e69655027756e6d326c2926313822756666657249716272714027756e6d35602271667b3928256a796c616e69666e237968647b79282e6f6964736e65766d32756666657249716272716e256079747f647f62707e28336738383538703f5c2473756769646e256079747f647f62707e28336738383538703f5d39716272716e256079747f647f62707e28336738383538703f5c2d7d5535323624323e3e366c2535323626313e3e366c25353236283e3e366c26662535323c2535323624323e3e316c2535323626313e3e316c25353236283e3e316c21662535323c2535323624323e3e326c2535323626313e3e326c25353236283e3e326c22662535323c2535323624323e3e356c2535323626313e3e356c25353236283e3e356c25662535323b5e62757475627b33386e237968647d366c22386e237968647d316c21386e237968647d326c20386e237968647d35602271667b3928256a796c616e69666e237968647b79282e6f6964736e65766d3473756769646e256079747f647f62707e28336738383538703f5c2875686e256079747f647f62707e28336738383538703f5d376e696274735f647e256079747f647f62707e28336738383538703f5c2d7d55313624323e3e366b52613169316338703f5b2d55313628323e3e366b52613169316338703f5b2d55313626313e3e366b52613169316338703f5b2d55313620323e3e366b52613169316338703f5b2d553136283e3e366b52613169316338703f5b2d55313622313e3e366b52613169316338703f5b2d566625313b52613169316338703f5b2d553136243e3e366b52613169316338703f5b2d55313624323e3e316b52613169316338703f5b2d55313628323e3e316b52613169316338703f5b2d55313626313e3e316b52613169316338703f5b2d55313620323e3e316b52613169316338703f5b2d553136283e3e316b52613169316338703f5b2d55313622313e3e316b52613169316338703f5b2d516625313b52613169316338703f5b2d553136243e3e316b52613169316338703f5b2d55313624323e3e326b52613169316338703f5b2d55313628323e3e326b52613169316338703f5b2d55313626313e3e326b52613169316338703f5b2d55313620323e3e326b52613169316338703f5b2d553136283e3e326b52613169316338703f5b2d55313622313e3e326b52613169316338703f5b2d526625313b52613169316338703f5b2d553136243e3e326b52613169316338703f5b2d55313624323e3e356b52613169316338703f5b2d55313628323e3e356b52613169316338703f5b2d55313626313e3e356b52613169316338703f5b2d55313620323e3e356b52613169316338703f5b2d553136283e3e356b52613169316338703f5b2d55313622313e3e356b52613169316338703f5b2d556625313b52613169316338703f5b2d553136243e3e356b52613169316338703f502e62757475627b33386e237968647d366c22386e237968647d316c21386e237968647d326c20386e237968647d35602271667b3928256a796c616e69666e237968647b79282e6f6964736e65766d3875686e256079747f647f62707e28336738383538703f5c2d79203c3c366b23386e237968647d33386e237968647c203c3c316b22386e237968647d32386e237968647c203c3c326b21386e237968647d31386e237968647c203c3c356b20386e237968647d30386e23796864782a3921312d34737279666e237968647c203c3c3837383333373137323b266d33386e237968647c203c3c343931343835323337313d216d32386e237968647c203c3c3937383333373137323d226d31386e237968647c203c3c333931343835323337313b256d30386e23796864782f34737279666e237968647c203c3c316b2921313e3e3e326c71323c3c392135353538343334333d2d593b547b2929256e7c79203c3c366b2927313e3e3e316c75313c3c392935323738373831373b2d523b547b2929226e7c76682e55682d3b2168282d3168282e59203c3c356b2922323e3e3e366c70313c3c39293733303132303231313d2d51313b547b2929216e7c79203c3c326b2926323e3e3e356c763c3c392037303332353534313d2d543b547b2929266e7c72682e51682d3b2568282d3568282e52682d3b2668282d3668282d3b2268282d326c203c3c316b2921313e3e3e326c71323c3c39293436313531393033313b2d53313b547b2929256e7c79203c3c366b2927313e3e3e316c75313c3c39203833383931303635313d2d563b547b2929226e7c76682e55682d3b2168282d3168282e59203c3c356b2922323e3e3e366c70313c3c3924343731313630333d2d55313b547b2929216e7c79203c3c326b2926323e3e3e356c763c3c39293533333133333738313b2d583b547b2929266e7c72682e51682d3b2568282d3568282e52682d3b2668282d3668282d3b2268282d326c203c3c316b2921313e3e3e326c71323c3c39293937323239343530323d2d513b547b2929256e7c79203c3c366b2927313e3e3e316c75313c3c39233235313530313d2d50313b547b2929226e7c76682e55682d3b2168282d3168282e59203c3c356b2922323e3e3e366c70313c3c39263036363839343938313d2d533b547b2929216e7c79203c3c326b2926323e3e3e356c763c3c39213735353834303037313b2d52313b547b2929266e7c72682e51682d3b2568282d3568282e52682d3b2668282d3668282d3b2268282d326c203c3c316b2921313e3e3e326c71323c3c3925353034333437353d2d553b547b2929256e7c79203c3c366b2927313e3e3e316c75313c3c39253039343533363134313d2d54313b547b2929226e7c76682e55682d3b2168282d3168282e59203c3c356b2922323e3e3e366c70313c3c39253134313938363231313b2d573b547b2929216e7c79203c3c326b2926323e3e3e356c763c3c392434383033363839313d2d503b547b2929266e7c72682e51682d3b2568282d3568282e52682d3b2668282d3668282d3b2268282d326c203c3c316b29293e3e3e326c73323c3c392135363833333539393d2d523b547b2929203c3c366b2926313e3e3e316c76313c3c392032353234373033353b2d55313b547b29226e52782d3b2168282d31682e59256e59203c3c356b2921323e3e3e366c71313c3c392533383531383132343d2d52313b547b2929203c3c326b2928323e3e3e356c743c3c392738343436333034363d2d593b547b29266e53682d3b2568282d35682e59216e526d3368282d3b2668282d36682d3278282d3b2268282d326c203c3c316b29293e3e3e326c73323c3c3929383139323036373b2d563b547b2929203c3c366b2926313e3e3e316c76313c3c392937393132353232373d2d533b547b29226e52782d3b2168282d31682e59256e59203c3c356b2921323e3e3e366c71313c3c392232323733353835333d2d503b547b2929203c3c326b2928323e3e3e356c743c3c392437313937323138363b2d53313b547b29266e53682d3b2568282d35682e59216e526d3368282d3b2668282d36682d3278282d3b2268282d326c203c3c316b29293e3e3e326c73323c3c39203436303337343930313d2d50313b547b2929203c3c366b2926313e3e3e316c76313c3c392233363739343535313d2d573b547b29226e52782d3b2168282d31682e59256e59203c3c356b2921323e3e3e366c71313c3c39233533333938323732313b2d543b547b2929203c3c326b2928323e3e3e356c743c3c39203630323939303335313d2d513b547b29266e53682d3b2568282d35682e59216e526d3368282d3b2668282d36682d3278282d3b2268282d326c203c3c316b29293e3e3e326c73323c3c3926353539303335333d2d54313b547b2929203c3c366b2926313e3e3e316c76313c3c39223635303330393338313b2d51313b547b29226e52782d3b2168282d31682e59256e59203c3c356b2921323e3e3e366c71313c3c39233634343735323230323d2d583b547b2929203c3c326b2928323e3e3e356c743c3c392835353837333d2d553b547b29266e53682d3b2568282d35682e59216e526d3368282d3b2668282d36682d3278282d3b2268282d326c203c3c316b2922313e3e3e326c70323c3c39243337373036363239313d2d52313b547b2929266e59203c3c366b2928313e3e3e316c74313c3c39233734383233353337313b2d573b547b2929256e566826226e55682d3b2168282d31682826256e59203c3c356b2923323e3e3e366c793c3c3924383733303431353d2d523b547b2929226e59203c3c326b2927323e3e3e356c753c3c39273634313836343434313d2d53313b547b2929216e526826266e51682d3b2568282d35682826216e52682d3b2668282d3668282d3b2268282d326c203c3c316b2922313e3e3e326c70323c3c39213035313335333631313b2d583b547b2929266e59203c3c366b2928313e3e3e316c74313c3c392136393336333738313d2d533b547b2929256e566826226e55682d3b2168282d31682826256e59203c3c356b2923323e3e3e366c793c3c39203936333038393130313d2d54313b547b2929226e59203c3c326b2927323e3e3e356c753c3c392833343634343836353b2d593b547b2929216e526826266e51682d3b2568282d35682826216e52682d3b2668282d3668282d3b2268282d326c203c3c316b2922313e3e3e326c70323c3c392834383733353530343d2d543b547b2929266e59203c3c366b2928313e3e3e316c74313c3c392533333837343036363d2d55313b547b2929256e566826226e55682d3b2168282d31682826256e59203c3c356b2923323e3e3e366c793c3c3923383036313038333b2d50313b547b2929226e59203c3c326b2927323e3e3e356c753c3c392139363835353130373d2d553b547b2929216e526826266e51682d3b2568282d35682826216e52682d3b2668282d3668282d3b2268282d326c203c3c316b2922313e3e3e326c70323c3c392230333739383337333d2d503b547b2929266e59203c3c366b2928313e3e3e316c74313c3c392331373731373334363b2d51313b547b2929256e566826226e55682d3b2168282d31682826256e59203c3c356b2923323e3e3e366c793c3c39223336313035393630313d2d563b547b2929226e59203c3c326b2927323e3e3e356c753c3c392031353639373536313d2d513b547b2929216e526826266e51682d3b2568282d35682826216e52682d3b2668282d3668282d3b2268282d326c203c3c316b2920313e3e3e326c72323c3c39293233353335363332313b2d55313b547b2929256e56682629203c3c366b2925313e3e3e316c77313c3c39203932323030323035313d2d54313b547b2929226e55682629203c3c356b2920323e3e3e366c72313c3c3921303131343330343d2d53313b547b2929216e526826256e51682d3b2668282d36682e52682d3b2168282d31682e59203c3c326b2925323e3e3e356c773c3c39223836333036343038313b2d52313b547b2929266e516826226e56682d3b2568282d3568282d3b2268282d326c203c3c316b2920313e3e3e326c72323c3c39223631343034303939313d2d51313b547b2929256e56682629203c3c366b2925313e3e3e316c77313c3c3923363032343d2d50313b547b2929226e55682629203c3c356b2920323e3e3e366c72313c3c39273134343134383539313d2d593b547b2929216e526826256e51682d3b2668282d36682e52682d3b2168282d31682e59203c3c326b2925323e3e3e356c773c3c39263134353330303737313b2d583b547b2929266e516826226e56682d3b2568282d3568282d3b2268282d326c203c3c316b2920313e3e3e326c72323c3c3923383935303735343d2d573b547b2929256e56682629203c3c366b2925313e3e3e316c77313c3c39213433313332333734313d2d563b547b2929226e55682629203c3c356b2920323e3e3e366c72313c3c39263234303830303032313b2d553b547b2929216e526826256e51682d3b2668282d36682e52682d3b2168282d31682e59203c3c326b2925323e3e3e356c773c3c392739383831343637313d2d543b547b2929266e516826226e56682d3b2568282d3568282d3b2268282d326c29203c3c316b2920313e3e3e326c72323c3c39203333353235343430313d2d533b547b2929256e56682629203c3c366b2925313e3e3e316c77313c3c392931383530313630363b2d523b547b2929226e55682629203c3c356b2920323e3e3e366c72313c3c392638353436353938333d2d513b547b2929216e526826256e51682d3b2668282d36682e52682d3b2168282d31682e59203c3c326b2925323e3e3e356c773c3c392633393637383038363d2d503b547b2929266e516826226e5923386e237968647d3668282d3b2568282d3568282d3b2268282d326c22386e237968647d316c21386e237968647d326c20386e237968647d35682a303c3c316b2920313e3e3e326c72323c3c39293032393532363133313d2d533b547b2929256e56682629203c3c366b2925313e3e3e316c77313c3c39253733383734363231313d2d523b547b2929256e5937383333373137323d282629203c3c356b2920323e3e3e366c72313c3c392830373033383731313d2d513b547b292566213730383133343030323e543931343835323337313d282d3668282d36682e5937383333373137323d282d3168282d31682e59203c3c3937383333373137323d2925323e3e3e356c773c3c392733393637383038363d2d503b547d3568282d3568282d3268282d326f34737279666e237968647b337b636f6c626e237968647d347c227c236c266c216c226c25602271667b79282e6f6964736e65766d386371686e256079747f647f62707e28336738383538703f5c2d7d7928286371686e237968647c29323e3e3e33756479726e237968647c733c3c3375647972486e237968647d3d55313b556c233c3c33756479726e237968647d3d54313b556c29203d3d55313b556d3d54313b556d3d53313b556d3d52313b556d3d51313b556d3d50313b556d3d593b556d3d583b556d3d573b556d3d563b556d3d553b556d3d543b556d3d533b556d3d523b556d3d513b556d3d56313b556c2d56313b556d3d503b556c2928286371686e237968647c7c7465686371686e2379686478262626353d3e326c2d5266233b52363535363438703f5d3c7d523e3e326b556b3875646e69456479724473716c6e237968647d326c237b636f6c626e237968647d35602271667b30312d34656a796c616e69666e237968647b7924656a796c616e69666e23796864712826696b79282e6f6964736e65766d356a796c616e69666e256079747f647f62707e28336738383538703f5c2d7d737968647c29263932373639343932343523756479726e237968647d33756479726e237968647c203c3c363932373639343932343f23756479726e237968647d3b2375647972486e23796864782626253932373639343932343e33756479726e23796864702e62757475627d736d34727164737e237968647a3920312d3465686371686e237968647c2928286371686e237968647c24363d236d34727164737e23796864782f34363d3e336c24727164737e237968647d236d3b23756479726e237968647c236d3875646e69456479724473716c6e237968647b392d5b2b2366233b55673332603238703f5c3c39266623363c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c39233636263e3e366c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c3923363622313e3e366c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c3928313e3e366c703432382d3c7d523e3e336b546c2929227b2b28247145646f63427168636e2566233230313c70313c3c3926662332303138282b26333535363d36682a392d5b2b2366233b55673332603238703f5c3c39266623363c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c39233636263e3e366c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c3922313e3e366c743232382d3c7d523e3e336b54682f34343337353d3e366c7c76393235353c366a392d5b2b2366233b55673332603238703f5c3c39266623363c783231382d3c7d523e3e336b546c2d5b2b2366233b55673332603238703f5c3c39263e3e366c723931382d3c7d523e3e336b54682f383430323c366a3d5b2b2366233b55673332603238703f5c3c366d3c7d523e3e336b546f3832313c39292278247145646f63427168636e256d366829227b2b2b34363c336626247c327b34727164737e237968647d3368227f666025637c656b39266623363c7832313d3d5b2b236b596c233636263e3e366c7832313d3d5b2b236b596c23363622313e3e366c7832313d3d5b2b236b596c28313e3e366c7034323d3d5b2b236b596c2929227b2b28247145646f63427168636e2566233230313c70313c3c3926662332303138282b26333535363d36682a39266623363c7832313d3d5b2b236b596c233636263e3e366c7832313d3d5b2b236b596c22313e3e366c7432323d3d5b2b236b59682f34343337353d3e366c7c76393235353c366a39266623363c7832313d3d5b2b236b596c263e3e366c7239313d3d5b2b236b59682f383430323c366a366d3d5b2b236b596f3832313c39292278247145646f63427168636e256d366829227b2b2b34363c336626247c327b34727164737e237968647d3368227f666926683235646238703f5826696025637c656b3d5b2b2366233b55673332603238703f5c3c3d527b556d3c7d523e3e336b5469227b2b2b34363c336626247c327b34727164737e237968647d3368227f666025637c656b3d527b556d3d5b2b236b5969227b2b2b34363c336626247c327b34727164737e237968647d3368227f666926683235646238703f58266969226c29203d3d55313b546d3d54313b546d3d53313b546d3d52313b546d3d51313b546d3d50313b546d3d593b546d3d583b546d3d573b546d3d563b546d3d553b546d3d543b546d3d533b546d3d523b546d3d513b546d3d56313b546c2d56313b546d3d503b546c21312d3465686371686e237968647826262465686371686e237968647826696b792b347c327b383275666665726e237968647d396c237b636f6c626e237968647d346c2864776e656c6e256d347c203d327c236c266022716678227f666d70312d326b36333460353238703f50277f62786479292925682775696653796e2275666665724971627271462626683235646238703f5c7c792568297162727143796e297162727148212826696025637c656b392568297162727148347e69655027756e6d356922756666657249716272714d3d3d327f6473657274737e6f636e25662626683235646238703f5826696b36333460353238703f50277f62786479256d3d3d3c6c657e6c7c716d3d31222473656a626f622826696b79216d3d3122276e69627473722826696b3560266f656079747d316c22602271667b7924656a796c616e69666e23796864712826696b7925682e6f6964736e65766d3564716460757e256079747f647f62707e28336738383538703f5d70312d34737279666e237968647c21312d3465686371686e237968647d34656a796c616e69666e237968647c203d3375647972486e237968647d33756479726e237968647d34727164737e237968647d33386e237968647d32386e237968647d31386e237968647d30386e237968647b3d503c203c203c203c203c203c203c203c203c203c203c203c203c203c203c203c203b5d337b636f6c626e237968647025637c656d79226829716272714233347e69655027756e6d337b636f6c626e237968647c292268297162727148347e69655027756e6d383275666665726e237968647b3928363822756666657249716272714027756e6d32602271667b7926683235646238703f5826696025637c656b36616365383138703f5d383275666665726e237968647c20356935326438703f5d337b636f6c626e237968647c203d3d55313b50356935326438703f5d3d54313b50356935326438703f5d3d53313b50356935326438703f5d3d52313b50356935326438703f5d3d51313b50356935326438703f5d3d50313b50356935326438703f5d3d593b50356935326438703f5d3d583b50356935326438703f5d3d573b50356935326438703f5d3d563b50356935326438703f5d3d553b50356935326438703f5d3d543b50356935326438703f5d3d533b50356935326438703f5d3d523b50356935326438703f5d3d513b50356935326438703f5d3d56313b50356935326438703f5d3d503b50356935326438703f59256826696b79256828336738383538703f502e6f6964736e65766b3d7d79256821616565673538703f5a392228756862282473756769646e292925682d6f62766e20356166366138703f5027756e682564716460757e292225346d6228286371684564716562736e25363436323238703f5f30356166366138703f5d3d3d327f6473657274737e6f636e256c7c7925682775696653796e22756666657249716272714c7c792568297162727143796e29716272714c29292568297162727148347e69655027756e6d3568262622756666657249716272714d3d3d327f6473657274737e6f636e25602e62757475627b36333460353238703f50277f62786479256d3d3c6c657e6826696b392228756862282473756769646e292228366475722c25682564716460757e292225346d6228286371684564716562736e25363436323238703f502e6275747562792560266f656079747d3d32276e69627473722826696b7925682e6f6964736e6576602e62757475627b39222b3d57227566666572472b592722756666657267282562796571756272282c6166756d30356166366138703f5c29222b39272f647079727367282562796571756272282c6166756d35363436323238703f5c20313934313138703f502271667b7921616565673538703f582e6f6964736e65766d39383934373438703f5c2d75602e62757475627d79216820333939356438703f5d3d516b556b3d526b54303633323338703f5d31602271667b79226b2b2b3864776e656c6e24303633323338703f5c326b303d326022716678227f666b3d7922682564716460757e29282564716562736e25602e62757475627b7922682e6f6964736e65766d3564716460757e256c2d78336738383538703f5027756e602e62757475627b79282e6f6964736e65766d3564716562736e256c2929256829383934373438703f5d3568262626373834643538703f5b3922287568622820333939356438703f5d35602271667b79282e6f6964736e65766d37373162683338703f5c2d7d79282d556b5922682564716460757e2920312828336738383538703f5027756e602e62757475627b7922682e6f6964736e6576602e62757475627b7925682e6f6964736e65766d30333939356438703f502271667b392d72756666657249716272714d3d3d327f6473657274737e6f636e2275666665726e2566262275666665726e2566262560266f656079747d3d322473656a626f622e62757475627b7925682e6f6964736e65766d3775696653796e2275666665724971627271482626292775696653796e2275666665724971627271412c7c775549465f53594f5255464645524f59514252514f5f4e4f55344d4f535a4e29366230373138703f58262626683235646238703f5c292d7925682c6c61636e276e696274735f647e256079747f647f62707e2473656a626f4d3d3d322d5971627271402473656a626f6b522e62757475627b7925682e6f6964736e65766d397162727143796e2971627271482c7c797162727143796e29716272714626235a4f55444f4e4f5f4e4f55344d4f535a4e29366230373138703f512d7927333835393338703f5829716272714233347e69655027756e6d30356935326438703f5c2927333835393338703f58297162727148347e69655027756e6d36616365383138703f5b3928363822756666657249716272714027756e6d37333835393338703f502271667b7926683235646238703f5826696b3d5b5d30356935326438703f5c2d522f222c222b222c2229322c2228322c2227322c2226322c2225322c2224322c2223322c2222322c2221322c2220322c222a722c2229722c2228722c2227722c2226722c2225722c2224722c2223722c2222722c2221722c2220722c222f622c222e622c222d622c222c622c222b622c222a622c2229622c2228622c2227622c2226622c2225622c2224622c2223622c2222622c2221622c222a522c2229522c2228522c2227522c2226522c2225522c2224522c2223522c2222522c2221522c2220522c222f422c222e422c222d422c222c422c222b422c222a422c2229422c2228422c2227422c2226422c2225422c2224422c2223422c2222422c2221422b5d35653831336238703f5c2d52243635637162622c222275666665724971627271622c22227566666572622c22247375676964622c222971627271622c22287568622b5d34303633323338703f5c2d54323c26313c283c203b5d35673332603238703f5c2d583436333834373431323d2c283036383833383c28363732333c2832313b5d32363535363438703f5c2d5226622c2225622c2224622c2223622c2222622c2221622c2229322c2228322c2227322c2226322c2225322c2224322c2223322c2222322c2221322c2220322b5d32613169316338703f5c227566666572497162727140266f656079747d312224656e696665646e657226262255464645524f59514252514f5f4e4f55344d4f535a4e29366230373138703f512d36683235646238703f5c21312d34656664353538703f5c2374727f6078756e21383660373738703f5626235a4f5e4f4d4d4f434f5f4e4f55344d4f535a4e29366230373138703f512d36626364673138703f502271667b39266c65637d39366230373138703f58262623326263636538703f5a37336467393338703f5d39366230373138703f5f36373834643538703f5b36616365383138703f5c25646f6e6e237e6f69637275667e237375636f62707626237e6f69637275667e237375636f62707626237375636f627070266f656079747d3d322473656a626f622626235a4f55444f4e4f5f4e4f55344d4f535a4e29366230373138703f512d36373834643538703f5c266c656370266f656079747d3d322473656a626f62262625656166636438703f512d33326263636538703f5c2d7b7d39366230373138703f5c21312d35656166636438703f5c22256079747024696c61667e69602379602475707e69622d36333460353238703f502271667b79282e6f6964736e6576612b7921383660373738703f582e6f6964736e65766824343834636538703f5d31613464323138703f5c2d7b7a366c65637f366c656370266f656079747d312224656e696665646e65722a3c61626f6c676f3c61626f6c6760266f656079747d312224656e696665646e65722a377f646e69677f377f646e69677d3d31203024696f667a337968645c61626f6c676f337968645c61626f6c6760266f656079747d312224656e696665646e65722d37336467393338703f502271667d7374727f6078756e226c292374727f6078756e226c226825602e62757475627b3d7d7b7a3374727f6078756b7d32602271667b79256824343834636538703f502e6f6964736e65766b3d7d7d513b59203c2c6c657e6c227c237c203c216c226c2568205a3d513b59213c2c6c657e6c227c237c203c216c226c2568205f3d526b545c29216a223c226c25682d46262d526b5451262624602e62757475627b3d5e6b566d3d5e6b53792b2b2e6b3f6c3e6b3864776e656c6e266d3864776e656c6e237d3f6c203d3e68227f666b3d596b536d3d5e6b2224222d396b53792b2b2e6b3f6c3e6b303d3e6c237d3d5f6b2224222b5378227f666b303a313b246e236f336d346e237d3f6c2d7b7d337c2e6c29602271667b392d7b7d3d513b536c236d30342e236c203d346e23682626246e23612626236c29237968647d32782626227d3d3c6c657e6b79246c247c227c236c266c216c226c256826402e6f6964736e65766d7d5c6c657e6c203b5e62757475627b39203024696f667d3d535b2b2b5d68262622313c3a6a39277d3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f333c3a6a3c6c657e6d3d535b2b2b5d6f313c392a7d3a6825637c656d7d5d2d235b5d60277f6278647923313c3a6826696025637c656d777d3d5a6b5d5d2d235b5d6c243d3b225b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c2d525b554d324c2d5d2d235b5d6d3778227f666b79293c392a7d3a682826696b79233c3a6826696025637c656b392921482a6d3d535b5d6a392b2b297e2a6c29203c2c6c657e6c234c2a7e2a6c2d514b5c2c6e2a6c236e2a6c2568264d3d535b5d682a39213c2c6c657e6c234c2a7e2a6c2d514b5c2c6e2a6c236e2a6c2568264d3d535b5d6f313d3e397e2a6f305d3d3d387e292d535b5d6d3a682c2d5d2d235b5d6d31482626223e3a6a3d5d513b235b5d6b5d535b5d6d3d513d3d235b5d6f343e3a6a392770266f656079747d3d535b5d6c2d5d2d235b5d6d37782f383e392a7d3a6829223c3a6826696025637c656d79223d224a223d3b225c276d3d535b5d6c286d3a7e276c203d397e276c205d387e276c223d224d3c6e276c243b225d336e292d79203c2c6c657e6c237968647c2a7e226c216c2c6e226c236e226c2568264c2b2b297e226c7c703e397e22602e62757475627b33747e656d657762716d31602271667b792822602e6f6964736e65766d37682c2d525b554d3248262626313c3a6a3929214c2348297c6070716e2a6d3d535b2b2b5d6a392b2b297e2a6c29203c2c6c657e6c234c2a7e2a6c214c2c6e2a6c236e2a6c2568264d3d535b2b2b5d682a39213c2c6c657e6c234c2a7e2a6c214c2c6e2a6c236e2a6c2568264d3d535b2b2b5d6f313d3e397e2a6f305d3d3d387e292d5d2d235b5d6d3a682c2d5d2d235b5d6d334c2d5d2d235b5d6d31482f34313c3a6a39277d312d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f373c3a6a39277a2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f353c3a6b3d5d5d2d235b5d6c213b5e627574756279213c392a7d3a682826696b79213c3a6c223d3e3e3a7c2a76233d3a6826696025637c656b392d535b5d612d3d535b5d682626213d2e3a6a323d292d525b554d32482a223d3b225f313e3a6a39277f2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f333e3a6a39277d3d312d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f353e3a6a307d3d535b2b2b5d6f32313e392a7d3a682a39277d3d535b2b2b5d6c2d535b5d6d3778262623313c3a6a392d2d235c2d523b235b5d6d3d5d513b235b5d6b5d523d3d235b5d6d37782f31313c3a6a377d3d535b2b2b5d6f323c392a7d3a682f333c3a6025637c656b39223d3b225c2d525b554d3d535b2b2b5d68262624313c3a6a39277c3c3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f32313c3a6025637c656d7d5a6b5d535b5d6d3d535b5d6c243d3b225b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c2d525b554d3248227f666b7920313c3a6826696025637c656b3d514b5d5d2d235b5d602564756c65646d377c2d5d2d235b5d6d3149283c392a7d3a6828266969223c3a6826696025637c656d7d723d224a223d3b225d7d2d296c203d3d596b546b37702e6275747562792d503b5929203c2c6c657e6c207c286c2d5b5c2d513b5d503b5d596b546c2d503b5d503b5d596b546c2568205d37782d3d3136262d503b5d596b5466262d596b546826696b797c6c616e69666d77702e6275747562792d503b5929203c226c207c286c2d5b5c2d513b5d513b5d596b546c2d503b5d513b5d596b546c2568205d37782d3d3136262d513b5d596b5466262d596b546826696b79226828636471636d77702e6275747562792d503b5929203c2c6c657e6c207c286c2d5b5c233d224c243b225c2568205d37782d3d313c213d3d523b5d596b546826696b7972747b3d525b554d324b79233e3a6826696025637c656b392929213b224b235c213b23582563696c637e2d68236c2d535b5d68266a3d535b5d6027756e6f324d3d3d303d3d524d3d235b5d6c223d3b225c2d525b554d3249253e3a6826696025637c656b37762d535b5d6d3d535b5d6c2d5d2d235b5d6d3779273e3a6826696025637c656b39293e392a7d3a682826696b79213c3a6c223d3e3e3a7c2a76233d3a68266969203e3a6826696025637c656b39223d224a223d3b225c2d503c2d533d224c243b225b5c203b5d3d5b2b296b546a3d533d224c243b225b5d3d513b5d596b546f3d523b5d596b546126262d503b5d596b546c2d525b554d32482626233e3a6a392d524b2224222b586d3d535b2b2b5d6c223d3b225c2d525b554d32482f353e3a6a39277c7d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f373e392a7d3a6825637c656d7d743d3b225c277d3d535b2b2b5d6b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b27792b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d377c2d525b554d3248227f666b79203e3a6826696025637c656b323d292d525b554d32482a223d3b225a343d3b225f3d5d2d235b5d69223e3a6826696025637c656b37752d535b5d6d3d535b5d6c2d5d2d235b5d6d3779243e3a6826696025637c656b3770266f65636e6164737e696d535b5d6d3d535b5d6c2d5d2d235b5d6d3779263e3a6826696025637c656b31312d3d535b2b2b5d6923313e392a7d3a682826696b79233c3a6826696025637c656b39214d3d535b2b2b5d6c277d3d535b2b2b5d6c2d535b5d6d314c2d513d235b5d6d3778262624313c3a6a39277d3d3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f353c3a6a39277b2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f333c3a6a357d3d535b2b2b5d6f313c392a7d3a6829223c3a6826696025637c656b39277e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782626203e3a6a392d5b5a39214c23582563696c637e2d6f324d3d513d224d3d235b5d6c213b235d314c243d3b225c2d525b554d32482f373e3a6a39277d3d524b586c2d5d2d235b5d6d377c223d3b225c2d525b554d32482f393e3a6a39277e3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f31313e3a6a39243d3b225c2d525b554d3d535b2b2b5d682f33313e392a7d3a6829213c3a6c223d3e3e3a7c2a76233d3a68266969213e3a6826696025637c656b39277d3d513d235b5d6c2d513d235b5d6d3d535b5d6c2d535b5d6d3778262625313c3a6a39277d3d3d3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f363c3a6a39277d2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f343c3a6025637c656d7a6d3d535b2b2b5d6c243d3b225c2a6b2d3a6b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c2d525b554d3248227f666b79223c392a7d3a682826696025637c656b392d756d3d535b2b2b5d6d726d3d535b2b2b5d6b3d5b2b2f4b544d32602271667b79256826696b355c3f4d35602271667b79282e6f6964736e65766d3d535b2b2b5d6c2d535b5d6d344c2864776e656c6e2d535b5d6d355c203d3f482626213e3a6a39277d3d535b2b2b5d6c2d524b586d377c223d3b225c2d525b554d32482f333e3a6a3d535b5d6b2b2d3d535b5d6f353e3a6a3927702e696d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f373e392a7d3a6829203e3a6826696025637c656b3929223d224a223d3b225c2d503c203c2d533d224c243b225b5b5d3d596b2b2b546c2d525b554d3248262622313c3a6a39277e5d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f30313c3a6a3d5d2d235b5d6d377f383c3a682c7c763c392a7d3a6829213e3a6826696025637c656b39283d3b225c2d525b554d3d535b2b2b5d68262625313c3a6a39277e3e3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f33313c3a6a30312d3d535b2b2b5d6f31313c3a6a392d524b5d535b5d6d3d535b5d6c223d3b225c2d525b554d32482f393c3a6a39277c3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f323c392a7d3a6829223e3a6c223d3e3e3a7c2a76233d3a68266969223e3a6c223d3e3e3a7c2921343235294a23313d3a7826233d3a6c223d3b225c2d525b545d39482669692b317c325b38227f6669267826696d7d7a6d3d535b2b2b5d6c243d3b225c2a6b2d3a6b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c29225c2568287d3248227f666b79203e3a6826696025637c656b377d2d535b5d6d3d535b5d6c2d5d2d235b5d6d3779223e3a6826696025637c656b377d3d3d3d535b5d6d3d535b5d6c2d5d2d235b5d6d3779243e3a6826696025637c656b377d3d513d235b5d6c2d513d235b5d6d3d535b5d6c2d535b5d6d377923313e392a7d3a682826696025637c656d7d7d756d3d535b2b2b5d6d726d3d535b2b2b5d6b3d5b2b2f4b544d32602271667b79256826696b355c3f4d35602271667b79282e6f6964736e65766d3d535b2b2b5d6b3d535b5d6d344c2864776e656c6e2d535b5d6d355c203d3f402271667b79213e3a6826696025637c656b377d3d535b2b2b5d6c2d524b586d377c223d3b225c29225c25682f5d3249233e3a6826696025637c656b3d535b5d6b2b2d3d535b5d69253e3a6826696025637c656b37702e696d535b5d6d3d535b5d6c2d5d2d235b5d6d3779273e392a7d3a682826696b79203e3a6826696025637c656b392d5d2d235b5d6d37782626263e3a6a39277e5d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f383e3a6a39223d224a223d3b225c2d503c203c2d533d224c243b225b5b5d3d596b2b2b546c29225c25682f6d32482f30313e392a7d3a6829213e3a6826696025637c656b39277c3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782626203e3a6a392d524b5d535b5d6d3d535b5d6c223d3b225c29225c25682f5d32482f373e3a6a30312d3d535b2b2b5d6f393e3a6a39277e3e3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f31313e3a6a39283d3b225c29225c25682c6d3d535b2b2b5d682f33313e392a7d3a6829223e3a6c223d3e3e3a7c2a76233d3a6826696025637c656b39223d224a223d3b225c2d503c2d533d224c243b225b5c203b5d3d5b2b296b546a3d533d224c243b225b5d3d513b5d596b546f3d523b5d596b546126262d503b5d596b546c29225c25682f6d32482626233e3a6a392d524b2224222b586d3d535b2b2b5d6c223d3b225c29225c25682f5d32482f353e3a6a39277c7d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f373e392a7d3a6825637c656d7d743d3b225c277d3d535b2b2b5d6b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b27792b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d377c29225c2568287d3248227f666b79203e3a6826696025637c656d723d224a223d3b225d7b616562726b323d224a223d3b225c29216a223c226c25682d4c213d367b79203c3929225c25682f6d32482826696b75637c656b343d3b22592d5d2d235b5d68266969223e3a6826696025637c656b37752d535b5d6d3d535b5d6c2d5d2d235b5d6d3779243e3a6826696025637c656b3770266f65636e6164737e696d535b5d6d3d535b5d6c2d5d2d235b5d6d3779263e3a6826696025637c656b31312d3d535b2b2b5d6923313e392a7d3a682826696b79233c3a6826696025637c656b39257d3d535b2b2b5d682626213d2e3a6a39277b2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f313e3a6a39277d3d3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f333e3a6a39214d3d535b2b2b5d6c277d3d535b2b2b5d6c2d535b5d6d314c2d513d235b5d6d37782f32313e392a7d3a6829223c3a6826696025637c656b39277e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782626203e3a6a392d5b5a39214c23582563696c637e2d6f324d3d513d224d3d235b5d6c213b235d314c243d3b225c29225c2568287d32482f373e3a6a39277d3d524b586c2d5d2d235b5d6d377c223d3b225c29225c25682f5d32482f393e3a6a39277e3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f31313e3a6a39243d3b225c29225c25682f6d3d535b2b2b5d682f33313e392a7d3a6829213c3a6c223d3e3e3a7c2a76233d3a68266969233c3a6826696025637c656b392d535b5d612d3d535b5d682626213d2e3a6025637c656d723d224a223d3b225d7b616562726b323d224a223d3b225c29216a223c226c25682d4c213d367b79203c3929225c25682f6d32482826696b79213e3a6826696025637c656b377f2d535b5d6d3d535b5d6c2d5d2d235b5d6d3779233e3a6826696025637c656b377d3d312d535b5d6d3d535b5d6c2d5d2d235b5d6d3779253e3a6826696025637c656b307d3d535b2b2b5d6922313e392a7d3a682826696025637c656b39277d3d535b2b2b5d6c2d535b5d6d3778262623313c3a6a392d2d235c2d523b235b5d6d3d5d513b235b5d6b5d523d3d235b5d6d37782f31313c3a6a377d3d535b2b2b5d6f323c392a7d3a6829233c3a6826696025637c656b392d514b5d5d2d235b5d602564756c65646d377c2d5d2d235b5d6d31482626263e3a6025637c656d7d5a6b5d535b5d6d3d535b5d6c243d3b225b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c29225c2568287d3248227f666b79283e3a6826696025637c656b377c3c3d535b5d6d3d535b5d6c2d5d2d235b5d6d377920313e3a6826696025637c656b323d3b225c29225c2568237d3d535b2b2b5d6922313e392a7d3a6828266969223c3a6826696025637c656b3927762d535b5d6d3d535b5d6c2d5d2d235b5d6d37782626293c3a6a39292929213b224b235c213b23582563696c637e2d68236c2d535b5d68266a3d535b5d6027756e6f324d3d3d303d3d524d3d235b5d6c223d3b225c29225c25682f5d32482f373c3a6025637c656d723d224a223d3b225d7d2d296c203d3d596b546b37702e6275747562792d503b5929203c2c6c657e6c207c286c2d5b5c2d513b5d503b5d596b546c2d503b5d503b5d596b546c2568205d37782d3d3136262d503b5d596b5466262d596b546826696b797c6c616e69666d77702e6275747562792d503b5929203c226c207c286c2d5b5c2d513b5d513b5d596b546c2d503b5d513b5d596b546c2568205d37782d3d3136262d513b5d596b5466262d596b546826696b79226828636471636d77702e6275747562792d503b5929203c2c6c657e6c207c286c2d5b5c233d224c243b225c2568205d37782d3d313c213d3d523b5d596b546826696b7972747b39225c25682f6d324b79253c392a7d3a6828266969213c3a6c223d3e3e3a7c2a76233d3a68266969223c3a6826696025637c656b39203024696f667d3d535b2b2b5d68262622313c3a6a39277d3e3d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f333c3a6a3c6c657e6d3d535b2b2b5d6f313c392a7d3a6825637c656d7d5d2d235b5d60277f6278647923313c3a6826696025637c656d777d3d5a6b5d5d2d235b5d6c243d3b225b392d5b6b507e227e547825646f63427168634d6f62766e276e696274735d3b2a692b2b2b6b3d513b5d524b517e227c3b6b3d503b5d524b517e227d3b6c22222d3a6c29225c2568287d324c2d5d2d235b5d6d3778227f666b79293c392a7d3a682826696b79233c3a6826696025637c656b392921482a6d3d535b5d6a392b2b297e2a6c29203c2c6c657e6c234c2a7e2a6c2d514b5c2c6e2a6c236e2a6c2568264d3d535b5d682a39213c2c6c657e6c234c2a7e2a6c2d514b5c2c6e2a6c236e2a6c2568264d3d535b5d6f313d3e397e2a6f305d3d3d387e292d535b5d6d3a682c2d5d2d235b5d6d31482626223e3a6a3d5d513b235b5d6b5d535b5d6d3d513d3d235b5d6f343e3a6a392770266f656079747d3d535b5d6c2d5d2d235b5d6d37782f383e392a7d3a6829223c3a6826696025637c656d79223d224a223d3b225c276d3d535b5d6c286d3a7e276c203d397e276c205d387e276c223d224d3c6e276c243b225d336e292d79203c2c6c657e6c237968647c2a7e226c216c2c6e226c236e226c2568264c2b2b297e226c7c703e397e22602e62757475627b33747e656d657762716d31602271667b792822602e6f6964736e65766d37682c29225c25682f6d3248262626313c3a6a3929214c2348297c6070716e2a6d3d535b2b2b5d6a392b2b297e2a6c29203c2c6c657e6c234c2a7e2a6c214c2c6e2a6c236e2a6c2568264d3d535b2b2b5d682a39213c2c6c657e6c234c2a7e2a6c214c2c6e2a6c236e2a6c2568264d3d535b2b2b5d6f313d3e397e2a6f305d3d3d387e292d5d2d235b5d6d3a682c2d5d2d235b5d6d334c2d5d2d235b5d6d31482f34313c3a6a39277d312d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f373c3a6a39277a2d535b5d6d3d535b5d6c2d5d2d235b5d6d37782f353c3a6b3d5d5d2d235b5d6c213b5e627574756279213c392a7d3a682826696b79213c3a6c223d3e3e3a7c2a76233d3a68266969213c3a6c223d3e3e3a7826696b3921343235294a23313d3a7826233d3a602271667b323d3b225b3926313c2d513b225b556b2d525b556b222228247e6945637271607d39402271667b792b317c325b38227f666926712826696b316a223b225d317c226d325c224c2a702271667b39297d37782626297b303d335c2d5b5d3d6c234c214c277c27602271667b39237968647d30782626207d3d3c6c657e6b79267c297c207c286c2e6c216c226c256820502e6f6964736e65766b39216c226c2d5b5c223f2d6c235c256826402e62757475627d7d79243d3b266c29266c2568287d3d566b554826262d536b5c4a39243d3b266c29266c2568287d3d566b55482f3d536b5a4a39223d3b266c29266c25682f5d3d566b55482f3d536b5e4a39283d3b266c29266c25682c6d3d566b55482f3d536b544a39243d3b266c29266c25682f6d3d566b55482f3d536b5f4a39223d3b266c29266c2568237d3d566b55482f3d536b555c223d3b266c236d3d566b545b39266c25682f5d33602271667b792b316b226c366b326d366022716678227f666b79216c226c25682d402e6f6964736e65766b3d5b5d354c2d5b5d345c2d713a30323c213a30333c213a39323c213a323b7d3c4c2d713a30313b7d3a4c2d713a31333c213a37323c213a36323c213a34323c213a32313c213a31313b7d3e4c2d713a34373b7d344c2d713a32373b7d355c2d713a33373c213a37333c213a33323c213a32323c213a30373c213a363c213a353b7d3f402271667d792d5864776e656c6e207e227c294b58286375707e217e227c217d386d7d503b5a6a223d3b217c292d513b5a68286375707e207e227b39217c25682e6d3a602271667b792b2b2b6b3d513b525c3b6b303d3b6c2864776e656c6e207e227d394c2d503b525a223d3b286d317c29286c25682e6d325022716678227f666b792b2b224b3a7c324b303d324022716678227f666b3d7d5b5a317c2d5b5a307b7d327c243d3b286c2d513b5a7b39234d3b286c2568287d3a7c283d3b286d335c234d3d6c2926313c2d573b286b556b2d563b286b556b2d553b286b556b2d543b286b556b2d533b286b556b2d523b286b556b2d513b286b556b2d583d3b286b556b222228247e6945637271607d33402271667b36313d3b286d776a223c3c39214623382d3b247b3926313c2d577b556b2d5b2b277b556b222228247e6945637271607d314c276a223b286d37702271667b792b2b276b343c376b303d376022716678227f666b303d347c283d3b286c2926313c2d513b286b556b2d56313d3b286b556b222228247e6945637271607b39207b22202275626d657e60236967616d60227f6272756228227f6272754027756e60277f62786479207d312223425f304a4f4e48422826696d79267825646f63427168634d6f62766e276e696274735d3b207c2926313c2678247e6945637271607d367b3d597b556b2d5b2b297b556b22222d36702271667b792b2b297b36313b286c397b386d397c22222d307c29203c2864776e656c6e25682d386c277f646e69677c7c737968647c7c757d357c2d7926313c2d533b226b556b2d523b226b556b2d513b226b556b2d526b556b222228247e694563727160702e62757475627b79226c25682e6f6964736e65766d387c2d7926313c2d513b226b556b2d526b556b222228247e694563727160702e62757475627b79226c25682e6f6964736e65766d3f5c2d716a316b203f373436333834373431323e31602e62757475627b3926313c2d573b226b556b2d563b226b556b2d553b226b556b2d543b226b556b2d533b226b556b2d523b226b556b2d513b226b556b2d526b556b222228247e6945637271607d31602271667b79226c25682e6f6964736e65766d3c6c2d716a316b26333535363d2f37363732333e31602e62757475627b3926313c2d533b226b556b2d523b226b556b2d513b226b556b2d526b556b222228247e6945637271607d31602271667b79226c25682e6f6964736e65766d3f6c2d716a316b2635323d2f3732313e31602e62757475627b3926313c2d513b226b556b2d526b556b222228247e6945637271607d31602271667b79226c25682e6f6964736e65766d337c2d7d7d546b29283d3c3c34782b2926313d3c3c33682d346c233b5c23363d3623602e62757475627b3926313c2d526b2b2b556b2d526b2b2b556b222228247e6945637271607d346c2926313c2d526b2b2b556b2d526b2b2b556b222228247e6945637271607d34702271667b79233d3d363e3e336826696d7d527b29283d3c3c33682d327c223b5c23363d3623602e62757475627b3926313c2d526b2b2b556b2d526b2b2b556b222228247e6945637271607d32702271667b79223d3d363e3e336826696b3d536c213b5e627574756279203d3d373e3e336826696b3926313c266b216b222228247e6945637271607d336c2d526b556d366c2d5b2b226b556d31602271667b79226c25682e6f6964736e65766d3e6c203d396c2d5b5d346c203d347c2d5b5d327022716678227f666d79282d792225636e6164737e6960256c6261627564796d2e6f6e60246165627073702f647024707d656474716024696c61667e694228227f627275456079745027756e60277f6278647b79282e6f6964736e65766c7c7925682d7925682d6f62766e2971627271402e6275747562792925682c6c61636e276e696274735f647e256079747f647f62707e2473656a626f4d3d3d322d53747e656d65776271402473656a626f6b522c7c7925682473656a626f402e6960227f6471627564796e2c6f626d69735826696b7925682e6f6964736e65766c7c7925682d7d71602e62757475627b3d526b556d3d526b51692b2b226b3864776e656c6e256c326b392864776e656c6e256829716272714027756e6d316c203d326022716678227f666b79292568297162727143796e29716272714826696b7925682e6f6964736e6576602e62757475627b79256823602e6f6964736e65766d7923747e656d657762716c2c6c657e68297c6070716e292d736c29256079747f647f62707e216c23682d79226c2568292d756c226d3f5f5f647f62707f5f5e25602e62757475627b79226c25682e6f6964736e65766c7c766f456079747f647f62705475637e2473656a626f482b79226c25682e6f6964736e6576662621602e62757475627b3929266c2568297c6070716e246e69626e2e6f6964736e65764827756e6d33602271667b39226c2668297c6070716e286375707e266b3d5c6c657e6b5d36602271667b79216c226c25682e6f6964736e65766a3473657274737e6f636e2473656c6665625f39282d7d71312e62757475627b79256828636471636d70312c29292d7b79282e6f6964736e65766c2d5b5c25647164482473657274737e6f636e2473656c666562582c6c61636e276e696274735f647e256079747f647f62707e25647164402e62757475627b7972747b30312e62757475627929787f627050266f656079747d3d322e6f6964736e6576622826696b31312e6275747562792d6168637e2473657274737e6f636e2473656c6665625c7c7473657274737e6f636e2473656c666562512c7c7473656c66656250266f656079747d3d3224656e696665646e65722826696b79282e6f6964736e65766d36682e62757475627b79216c226c256826602e6f6964736e65766b79216c226c25682e6f6964736e65766d307d66737a6c2c6c657e6d377f646e6967702271667"[::-1]).decode()) 30 | return params + '&X-Bogus=' + signer.call('sign', params, user_agent) 31 | 32 | def msToken(proxy : dict or None): 33 | url = "https://mssdk-va.tiktok.com/web/report" 34 | headers = { 35 | 36 | "Sec-Ch-Ua": """Chromium"";v=""110"", ""Not A(Brand"";v=""24"", ""Google Chrome"";v=""110""", 37 | "Sec-Ch-Ua-Platform": """Windows""", 38 | "Sec-Ch-Ua-Mobile": "?0", 39 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", 40 | "Content-Type": "text/plain;charset=UTF-8", 41 | "Accept": "*/*", 42 | "Origin": "https://www.tiktok.com", 43 | "Sec-Fetch-Site": "same-site", 44 | "Sec-Fetch-Mode": "cors", 45 | "Sec-Fetch-Dest": "empty", 46 | "Referer": "https://www.tiktok.com/", 47 | "Accept-Encoding": "gzip, deflate", 48 | "Accept-Language": "ar,en-US;q=0.9,en;q=0.8", 49 | "Connection": "close", 50 | } 51 | jso = {"magic": 538969122, "version": 1, "dataType": 8, "strData": "f75X/G6fZ8vzpt1M6YGDBI9+8QEQcgZ3VSKwWVrGv96GSulTj71NEQ8ua+hFsVwNy8sbIICGk1jdBrMQlIcoOfo3A5+02JfVQz0TxCnRnkgFZtkP+06m0uK5jfTkqG6ujXLN6Xyju0wWOrSPnwDz60GWSnIp2REWHij11Z3GpJHotfSqdAlYgpvJnDAtXnOBwKXej+TrTiG5SKj2onXxB2lZFEaqh4tZc+QXX9wOeUmRuBjDh3jTMQ3kZZU5QIIs0+Ec8PNvkqO12hN081K5xfN34Kgiyn27lGCiIzA1SZ20t1Nj49jELnogql+FngPOe6mVT+g151ZAN5wzBtdRizV+fgewt6/+dyca86Kp3j6DIiQym9doDmIbIV442sYz15okOcB3fVD5gOKlwxkKBpHqqO0wjMybJAqJ8lskppsuBKGC3Kdlm0ZqhCWx1Ls39kkO6y1IROwdM0Oz9OSyl04wuPRs3V3JLjLuwJc7JhPOOYnwjb6SHBQGdcQFvR5Ubna4xw0dPu3ElG/E/e1FahdC/IG9N393vA1r7MXaqRzdfhzXVZTJhYzCV1s3rrtr5ge6v6S2bAU6eFcxV2TNoqXj+w8fDMpHJ3Jw79Jm3e15dsKNkSQE0uPQUkDt0PYFpFkuTL4N3rgrjq0fWymxUq6yygHa7TgXHHNzkbP6K7vHWFqIgw7CfH/T4T1GXK5yV/v0B+4PaQESYDj28iEqbzCxn8+geAaYEXn3c4mQqOi5B5oqHXUou1lTcEy/Mpoen2vd+cVwTfRmB5C+S/06i7f4kj2CbYU4EUp4gGiSxd/mjCRryePPXYbTSe0ZPKV6UWyZqvHZft1PzMUkvB2aZnes5rVs9lk9wEX2hN1t4Ecclv/f5M6pDvSOJon8/I3zXH9RnoA9/LQR57hhV10LGa3NUCDPqpIkhyqszSy2rbIAUNgA+18z2RP5TSjDuHSsHMaONhxIeX6ZvoXX2V6FNr0th5XDD3zmUb36ecCX+spgMNRKt+211iEw+IXMvThPT/p8Aas1P+gnv35LT92U9SsSMcgEwTYRL7WYEamC/B9Mp4RyQYpBm5OSbZWRd4/whWuEpFR/MYMLajDAx0kozi9/fSCjJFOehuXqGRAiOwCpbXbjnz5kefGYj5BtkWsmcPhRS3PK/IVA3ANPseo8a3HxMP0yh+MbS3FxXJyME0kBpvqHU2hyLjTIJkCluBl7rJs+7vD0tZL/mulK4K7Qr7quI29nVHP3U3yJWevqCCJz06Ax8rX++SMxFpzhu69LSlVSIeXlcOrQvFnbSmiYwHZAcwaBQhmZh8X1B0WwKjHyOUFqUqlhvrfQWTHyNxEoWEG/Q9faZvP9TYNtgviGNuEE8c/ueSMHjpE0uh/yeY9ZHV55GLKejEUc3OtVcqjGvxG/SMdE5djDV0TbqUG39cOAonE9Nb/3UCSLpnQRYiDE3vBVKHKGxJ9OjuQl0Btrs4XritqgUdPQuiqL04JK9Cbi2sP/sh1xz7hL3cab81ulha/1DFjT4BocVQQ+f1ExBnIxMaJnVRdO98wabvhO/jI/ZUEZQdgrebplcQCZlI2mpp9u7fg827N8m+wfS+O+pAeiVxz/nwwGi/nBlrlSsJZ/lm0ePbHWlVGVxmSSX/mfczt0J5SEIU0WS18TpdPX07TeObpNGlXFd78rWTitbD6tH5lEUlvr5g6e0lw/IjJgYkz4KB63yYWRNZue0qVKaNFqxSz3POP147yPnBe8uOOhzQcD1lXMkOc5PKgDg5kXEVweG81C06ESYRCGy9v2Izwrur7LqvbDEmoL2UzR8BT3XEyWjw8CwTiEn+9/mAP4wfSxqVXcX4qev+Qe0I08P7XG4a+kIAEZkL7CpKyQOZdsh5HKU2+QteWhg8tAgwVB6k4HMGQ2BMOP+JCVX9CYXXWriR/KyT5xizaoVW2Odcyb3seDX/fpm976D+3JLdV10ZbLAdXkQC6LJs4UqSBg8cd116IPmfndOqs7bfc5kxDBy3B68ek97nXQu2DumE2RXakNMfRc9UajEFSyXaJgykf3lvlEjkyytNxjsBvnwROR9zN9rkKVvSBMT0QhDNbvAe2VtY9T1wYrSF84FkACMyoCJlZOeF+y+NbqLIlYTpHiQQev7OoFkHgP+n3pTTmQUkWFrj9eJYqr7K3JERJk6exIuN4mF7B7ULWivDu8WVPp46uFiea93Up36XSEjbkCp9EJLDZHiNfqvUrL2A2ZCdA50KITfqNEQj5WN5FmBwrfdBlcHoyLUEulDtJJhbFWFaw56zTeCdsoAXYwVGMn42DY+1XewPI9b7qFvrWQfiWONnLnOsThrGyXcK9NDMhbAgOd3htAuEw6fveey1OI5Ah4RK5AXE4nJ+c4V+H9KNsuuhwELHkne6RgwuZgv9y64YYn9IzEMWRAQcPn1VG0SYEtIa9D2fV/XlOhJa5gRNXHQvgx/LB6ThHC5qCp9Fvn6azj1P/5gJNbB2FJi8kKlQE/Z++n5Di4iMkbVZSTE63xsmTor5bFD8l1Gw/livopGRyF7B2oGjHUkgBaPiH9tnE+bKd5F6270SFl+dhlmS8RCXGqLbWSW1EWaSn9N8CTfOZDUt57dgKrvboHdX6z82K1BYxENROcZyoQOtM9CKZg0nE0EO1V52ngb58XrU5eslIIhNsbhmmlffldVSOuK+DGsM/vyfrgSYqXJnppM1YsTvRmOxxWV1c4QNUfcPuXFIP9DkDoPneGuk+NRhNIiLeC1bZyPdKwge59gnHH3N1g510RRLnQaMuN0xQLczbwcvvrO/Rm5+fI3wp+qQ9Yly2sEgHIh9ntifYXj4bct/Vvv/YcZwyal9HY+Tl1JZtqssHHBvm2Y93AsM04VshiK7+JBhtqHWXhozyWwS/vs5s0xft1iU2v2BbZhWcWfFKKQXwKV+EyDqBnbnAx6HJqAIVdmcLR4+O0NrWcq6g9YZGva3aQIVkt5I5t4s0XDnAsVOO7B9duwidPp/mehxjrBV8KKo7DTY9k122B5VmJuaZIyw/wqQZShPmc8Dr56jWuVc0aCsFpl2WH1DNtIDvVhK8AdZDjxBBwXxQrI0ycSQN+N68MfMI5midkndiJuiX7ewweT3M1WmztWy9S5RIxZGvpjVVxL1SfDuaFRgRcSnE72r1osMETyLWjbRIi5kcNO4geWhmHCwdb0s5ozxkkaA/fRykxSTFxrpx0ZP659UA3MwwMxpebH7M4d7AeiNxMCoReFIaYunVYR5E3gdAtMzgcQHZbK3trCw6z+wqVlfjFwznPOOWlvAoI4znH3t//sm4QlNrej0FGAfRAkbv5wHSNfUPIXVbVjJcWbkuarkWP1/P/zuj95DOO7c2BqkG9NzmSZdAxmUtf1HpxcWSyRLVqNDUn38YPBq5pBFF3eGHhFm326M1R5AYOThMtfSC9VJcRwE2HmJVABiwebXYUUzIyNKSmu+/sKzXArCXNnPKuoKwXi7NFZzwBsOtWVMnA+HZ/4mfDxYUwoqGsBA5tbvc4rC1qw3xtKVrf3u4jyklJDy0Bxacg5pigcPll8OcfsamIJsATlnfNtGBfmyJhszF4JVut1Kpj9vgtUsHa5swwl2x9HOJtQ4FC0cgI8GOJYplE+T3TD1/6uvIffOdxZaiyse6AJwKOH+jD8OFqk2MAf6Pi72boKXKV+BG3ExHEjU0lLQcv70BT+cuSN5VpXA61WMa7bjFN9qAmuVW+uTwSOD1fW3ZEO6DGVtB85wh4oazRWKlPws7eauDj1Bl7MD==", "tspFromClient": 1677004216767} 52 | 53 | req = requests.post(url, headers=headers, json=jso, proxies=proxy, timeout=4) 54 | return req.cookies["msToken"] -------------------------------------------------------------------------------- /STikTok/applog.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import requests 3 | 4 | from .utilities import * 5 | from .device import * 6 | from urllib.parse import urlencode 7 | 8 | 9 | class Applog: 10 | def __init__(self, device: dict or None = None, proxy: str or None = None) -> tuple: 11 | self.__device = Device.gen_device() if device is None else device 12 | self.__host = "log-va.tiktokv.com" 13 | self.proxies = {'http': f'http://{proxy}', 14 | 'http': f'http://{proxy}'} if proxy else None 15 | 16 | def __get_headers(self, params: str, payload: bytes): 17 | sig = Utils._sig( 18 | params=params, 19 | body=payload 20 | ) 21 | 22 | return { 23 | "x-ss-stub": str(hashlib.md5(payload).hexdigest()).upper(), 24 | "accept-encoding": "gzip", 25 | "passport-sdk-version": "17", 26 | "sdk-version": "2", 27 | "x-ss-req-ticket": str(int(time.time()) * 1000), 28 | "x-gorgon": sig["X-Gorgon"], 29 | "x-khronos": sig["X-Khronos"], 30 | "content-type": "application/octet-stream;tt-data=a", 31 | "host": "log-va.tiktokv.com", 32 | "connection": "Keep-Alive", 33 | "user-agent": "okhttp/3.10.0.1" 34 | } 35 | 36 | def get_params(self): 37 | return urlencode( 38 | { 39 | "ac": "wifi", 40 | "channel": "googleplay", 41 | "aid": APP["aid"], 42 | "app_name": "musically_ly", 43 | "version_code": APP["version_code"], 44 | "version_name": APP["version"], 45 | "device_platform": "android", 46 | "ab_version": APP["version"], 47 | "ssmix": "a", 48 | "device_type": self.__device["device_model"], 49 | "device_brand": self.__device["device_brand"], 50 | "language": "en", 51 | "os_api": 25, 52 | "os_version": "7.1.2", 53 | "openudid": self.__device["openudid"], 54 | "manifest_version_code": APP["version_code"], 55 | "resolution": self.__device["resolution"], 56 | "dpi": 320, 57 | "update_version_code": APP["version_code"], 58 | "_rticket": int(time.time() * 1000), 59 | "storage_type": 0, 60 | "app_type": "normal", 61 | "sys_region": "US", 62 | "pass-route": 1, 63 | "pass-region": 1, 64 | "timezone_name": self.__device["tz_name"], 65 | "timezone_offset": self.__device["tz_offset"], 66 | "carrier_region_v2": 310, 67 | "cpu_support64": "false", 68 | "host_abi": "armeabi-v7a", 69 | "ts": int(time.time()), 70 | "build_number": APP["version"], 71 | "region": "US", 72 | "uoo": 0, 73 | "app_language": "en", 74 | "carrier_region": "IE", 75 | "locale": "en", 76 | "op_region": "IE", 77 | "ac2": "wifi", 78 | "cdid": self.__device["cdid"], 79 | "tt_data": "a" 80 | } 81 | ) 82 | 83 | def __get_payload(self): 84 | return { 85 | "magic_tag": "ss_app_log", 86 | "header": { 87 | "display_name": "TikTok Lite", 88 | "update_version_code": APP["version_code"], 89 | "manifest_version_code": APP["version_code"], 90 | "app_version_minor": "", 91 | "aid": 1340, 92 | "channel": "googleplay", 93 | "package": "com.zhiliaoapp.musically.go", 94 | "app_version": "16.9.4", 95 | "version_code": APP["version_code"], 96 | "sdk_version": "2.12.1-rc.6-lite", 97 | "sdk_target_version": 29, 98 | "git_hash": APP["git_hash"], 99 | "os": "Android", 100 | "os_version": "7.1.2", 101 | "os_api": 25, 102 | "device_model": self.__device["device_model"], 103 | "device_brand": self.__device["device_brand"], 104 | "device_manufacturer": self.__device["device_brand"], 105 | "cpu_abi": "armeabi-v7a", 106 | "release_build": APP["release_build"], 107 | "density_dpi": 320, 108 | "display_density": "xhdpi", 109 | "resolution": self.__device["resolution"], 110 | "language": "en", 111 | "timezone": 2, 112 | "access": "wifi", 113 | "not_request_sender": 0, 114 | "carrier": "Android", 115 | "mcc_mnc": "42001", 116 | "rom": f'rel.se.{"".join(random.choices("qwertyuiopasdfghjklzxcvbnm", k=5))}.{random.randrange(10000000, 23487690)}.{random.randrange(100000, 999999)}', 117 | "rom_version": f"beyond1qlteue-user 7.1.2 PPR1.190810.011 {random.randrange(10000000, 62994552)}.{random.randrange(100000, 999999)} release-keys", 118 | "cdid": self.__device["cdid"], 119 | "sig_hash": APP["sig_hash"], 120 | "gaid_limited": 0, 121 | "google_aid": self.__device["google_aid"], 122 | "openudid": self.__device["openudid"], 123 | "clientudid": self.__device["clientudid"], 124 | "region": "US", 125 | "tz_name": self.__device["tz_name"], 126 | "tz_offset": self.__device["tz_offset"], 127 | "sim_region": "IE", 128 | "oaid_may_support": False, 129 | "req_id": self.__device["req_id"], 130 | "apk_first_install_time": self.__device["install_time"], 131 | "is_system_app": 0, 132 | "sdk_flavor": "global" 133 | }, 134 | "_gen_time": int(round(time.time() * 1000)) 135 | } 136 | 137 | def register_device(self): 138 | try: 139 | params = self.get_params() 140 | payload = self.__get_payload() 141 | # print(payload["header"]["rom_version"]) 142 | payload = bytes.fromhex(Utils._ttencrypt(payload)) 143 | r = requests.post( 144 | url=( 145 | "http://" + 146 | self.__host 147 | + "/service/2/device_register/?" 148 | + params 149 | ), 150 | headers=self.__get_headers(params, payload), 151 | data=payload, 152 | proxies=self.proxies 153 | ) 154 | # print(r.json()) 155 | 156 | if len(str(r.json()["device_id"])) > 6: 157 | self.__device["device_id"] = r.json()["device_id"] 158 | self.__device["install_id"] = r.json()["install_id"] 159 | return self.__device 160 | except Exception as e: 161 | # print(e) 162 | pass 163 | -------------------------------------------------------------------------------- /STikTok/device.py: -------------------------------------------------------------------------------- 1 | 2 | import binascii 3 | import uuid 4 | import time 5 | import random 6 | import os 7 | APP = { 8 | "version_code": 160904, 9 | "sig_hash": "aea615ab910015038f73c47e45d21466", 10 | "version": "16.9.4", 11 | "release_build": "f05822b_20201014", 12 | "git_hash": "9f888696", 13 | "aid": 1340 14 | } 15 | 16 | 17 | class Device: 18 | @staticmethod 19 | def __openudid() -> str: 20 | return binascii.hexlify(os.urandom(8)).decode() 21 | 22 | @staticmethod 23 | def __uuid() -> str: 24 | return str(uuid.uuid4()) 25 | 26 | @staticmethod 27 | def __install_time() -> int: 28 | return int(round(time.time() * 1000)) - random.randint(13999, 15555) 29 | 30 | @staticmethod 31 | def __ut() -> str: 32 | return random.randint(100, 500) 33 | 34 | @staticmethod 35 | def __uid() -> int: 36 | return random.randrange(10000, 10550, 50) 37 | 38 | @staticmethod 39 | def __ts() -> int: 40 | return round(random.uniform(1.2, 1.6) * 100000000) * -1 41 | 42 | @staticmethod 43 | def __cba() -> str: 44 | return f"0x{os.urandom(4).hex()}" 45 | 46 | @staticmethod 47 | def __hc() -> str: 48 | return f"0016777{random.randint(260, 500)}" 49 | 50 | @staticmethod 51 | def __dp() -> str: 52 | return f"{random.randint(700000000, 900000000)},0,0" 53 | 54 | @staticmethod 55 | def __rom() -> int: 56 | return str(random.randint(700000000, 799999999)) 57 | 58 | @staticmethod 59 | def gen_device() -> dict: 60 | return { 61 | "device_model": "G011A", 62 | "device_serial": "G011A", 63 | "resolution": "1024x576", 64 | "resolution2": "576*1024", 65 | "device_brand": "google", 66 | "openudid": Device.__openudid(), 67 | "google_aid": Device.__uuid(), 68 | "clientudid": Device.__uuid(), 69 | "cdid": Device.__uuid(), 70 | "req_id": Device.__uuid(), 71 | "install_time": Device.__install_time(), 72 | "ut": Device.__ut(), 73 | "ts": Device.__ts(), 74 | "cba": Device.__cba(), 75 | "hc": Device.__hc(), 76 | "dp": Device.__dp(), 77 | "rom": Device.__rom(), 78 | "uid": Device.__uid(), 79 | "tz_name": "Asia/Shanghai", 80 | "tz_offset": 28800, 81 | "device_id": 0000000000000000000, 82 | "install_id": 0000000000000000000, 83 | "install_time": int(round(time.time() * 1000)) - random.randint(13999, 15555) 84 | } 85 | -------------------------------------------------------------------------------- /STikTok/gorgon.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import random 3 | import struct 4 | import time 5 | import json 6 | 7 | 8 | class Gorgon: 9 | digits = {c: i for i, c in enumerate("0123456789abcdefghijklmnopqrstuvwxyz")} 10 | HEX_STRS = [[30 ,0 ,224 ,220 ,147 ,69 ,1 ,200 ],[30 ,0 ,224 ,236 ,147 ,69 ,1 ,200 ],[30 ,0 ,224 ,228 ,147 ,69 ,1 ,208 ],[30 ,60 ,224 ,244 ,147 ,69 ,0 ,216 ],[30 ,64 ,224 ,228 ,147 ,69 ,0 ,216 ],[30 ,0 ,224 ,227 ,147 ,69 ,1 ,213 ],[30 ,64 ,224 ,210 ,147 ,69 ,0 ,160 ],[30 ,64 ,224 ,203 ,147 ,69 ,0 ,150 ],[30 ,64 ,224 ,211 ,147 ,69 ,0 ,167 ],[30 ,64 ,224 ,228 ,147 ,69 ,0 ,156 ],[30 ,64 ,224 ,216 ,147 ,69 ,0 ,216 ],[30 ,64 ,224 ,226 ,147 ,69 ,0 ,205 ],[30 ,64 ,224 ,214 ,147 ,69 ,0 ,176 ],[30 ,64 ,224 ,217 ,147 ,69 ,0 ,180 ],[30 ,64 ,224 ,240 ,147 ,69 ,0 ,213 ],[30 ,64 ,224 ,210 ,147 ,69 ,0 ,216 ],[30 ,64 ,224 ,235 ,147 ,69 ,0 ,192 ],[30 ,64 ,224 ,234 ,147 ,69 ,0 ,193 ],[30 ,64 ,224 ,234 ,147 ,69 ,0 ,186 ],[30 ,64 ,224 ,171 ,147 ,69 ,0 ,136 ],[30 ,64 ,224 ,103 ,147 ,69 ,0 ,166 ],[30 ,64 ,224 ,167 ,147 ,69 ,0 ,15 ],[30 ,64 ,224 ,139 ,147 ,69 ,0 ,182 ],[30 ,64 ,224 ,194 ,147 ,69 ,0 ,84 ],[30 ,64 ,224 ,183 ,147 ,69 ,0 ,170 ],[30 ,64 ,224 ,205 ,147 ,69 ,0 ,125 ],[30 ,64 ,224 ,138 ,147 ,69 ,0 ,175 ],[30 ,64 ,224 ,229 ,147 ,69 ,0 ,12 ],[30 ,64 ,224 ,163 ,147 ,69 ,0 ,26 ],[30 ,64 ,224 ,105 ,147 ,69 ,0 ,35 ],[30 ,64 ,224 ,167 ,147 ,69 ,0 ,24 ],] 11 | LEN = 20 12 | 13 | def calculate(self, params, cookie, body): 14 | 15 | self.hex_str = random.choice(self.HEX_STRS) 16 | hash = self.getGorgonHash(params, body, cookie) 17 | hexEncryption = self.encryption() 18 | gorgonHash = self.initGorgonHash(hash, hexEncryption) 19 | 20 | result = "" 21 | handle = self.handle(gorgonHash["gorgon"]) 22 | 23 | for item in handle: 24 | result += self.hex2str(item) 25 | 26 | hash_1 = self.hex2str(self.hex_str[7]) 27 | hash_2 = self.hex2str(self.hex_str[3]) 28 | hash_3 = self.hex2str(self.hex_str[1]) 29 | hash_4 = self.hex2str(self.hex_str[6]) 30 | 31 | return { 32 | "X-Gorgon": "0404{}{}{}{}{}".format(hash_1, hash_2, hash_3, hash_4, result), 33 | "X-Khronos": str(hash["time"]), 34 | } 35 | 36 | def charCodeAt(self, str, i): 37 | return self.get_bianma((str[i:1])) 38 | 39 | def encryption(self): 40 | tmp = A = B = C = D = None 41 | hexs = [] 42 | for i in range(256): 43 | hexs.append(i) 44 | 45 | for i in range(256): 46 | if i == 0: 47 | A = 0 48 | elif tmp is not None: 49 | A = tmp 50 | else: 51 | A = hexs[i - 1] 52 | B = self.hex_str[i % 8] 53 | if (A == 85) & (i != 1) & (tmp != 85): 54 | A = 0 55 | C = self.ensureMax(A + i + B) 56 | tmp = C if C < i else None 57 | D = hexs[C] 58 | hexs[i] = D 59 | return hexs 60 | 61 | def ensureMax(self, val, max=256): 62 | while val >= 256: 63 | val = val - 256 64 | return val 65 | 66 | def epoch(self): 67 | return int(round(time.time())) 68 | 69 | def convert_base(self, hex, base): 70 | return sum( 71 | self.digits[digit] * (base**i) 72 | for i, digit in enumerate(reversed(hex.lower())) 73 | ) 74 | 75 | def fromHex(self, hex): 76 | return self.convert_base(hex, int(16)) 77 | 78 | def getGorgonHash(self, url, data=None, cookie=None, encoding="UTF-8"): 79 | gorgon = [] 80 | times = int(round(time.time())) 81 | hexTime = self.toHex(times) 82 | urlmd5 = hashlib.md5(url.encode("UTF-8")).hexdigest() 83 | 84 | rang = self.ranges(start=4) 85 | for i in rang: 86 | gorgon.append(self.fromHex(urlmd5[i * 2 : 2 * i + 2])) 87 | 88 | gorgon = gorgon + self.xGorgon_data(data, encoding) 89 | gorgon = gorgon + self.xGorgon_cookie(cookie, encoding) 90 | 91 | for i in rang: 92 | gorgon.append(0) 93 | 94 | for i in rang: 95 | gorgon.append(self.fromHex(hexTime[i * 2 : 2 * i + 2])) 96 | 97 | return {"gorgon": gorgon, "time": times} 98 | 99 | def get_bianma(self, str): 100 | result = [] 101 | 102 | def handle(self, gorgonHash): 103 | rang = self.ranges(self.LEN) 104 | for i in rang: 105 | A = gorgonHash[i] 106 | B = self.reverse(A) 107 | C = int(gorgonHash[(i + 1) % self.LEN]) 108 | D = B ^ C 109 | E = self.rbit(D) 110 | F = E ^ self.LEN 111 | G = ~F 112 | while G < 0: 113 | G += 4294967296 114 | 115 | a = self.toHex(G) 116 | offset = len(a) - 2 117 | 118 | H = self.fromHex(self.toHex(G)[offset:]) 119 | gorgonHash[i] = H 120 | 121 | return gorgonHash 122 | 123 | def hex2str(self, num): 124 | tmp = self.toHex(num) 125 | if len(tmp) < 2: 126 | tmp = "0" + tmp 127 | return tmp 128 | 129 | def initGorgonHash(self, gorgonHash, hexEncryption): 130 | tmp_add = [] 131 | tmp_hex = [] + hexEncryption 132 | A = B = C = D = E = F = G = None 133 | rang = self.ranges(self.LEN) 134 | for i in rang: 135 | A = gorgonHash["gorgon"][i] 136 | B = 0 if len(tmp_add) == 0 else tmp_add[-1] 137 | C = self.ensureMax(hexEncryption[i + 1] + int(B)) 138 | tmp_add.append(C) 139 | D = tmp_hex[C] 140 | tmp_hex[i + 1] = D 141 | E = self.ensureMax(D + D) 142 | F = tmp_hex[E] 143 | G = A ^ F 144 | gorgonHash["gorgon"][i] = G 145 | 146 | return gorgonHash 147 | 148 | def ranges(self, start=0, stop=None, step=1): 149 | if stop is None: 150 | stop = start 151 | start = 0 152 | 153 | if ((step > 0) & (start >= stop)) or (step < 0) & (start <= stop): 154 | return [] 155 | 156 | result = [] 157 | 158 | for x in range(start, stop, step): 159 | result.append(x) 160 | 161 | return result 162 | 163 | def rbit(self, num): 164 | result = "" 165 | tmp = format(num, "b") 166 | 167 | while len(tmp) < 8: 168 | tmp = "0" + tmp 169 | 170 | rang = self.ranges(8) 171 | for i in rang: 172 | result += tmp[7 - i] 173 | return int(result, 2) 174 | 175 | def reverse(self, num): 176 | tmp = self.toHex(num) 177 | if len(tmp) < 2: 178 | tmp = "0" + tmp 179 | 180 | return self.fromHex(tmp[1:10] + tmp[0:1]) 181 | 182 | def toHex(self, num): 183 | return format(int(num), "x") 184 | 185 | def uniord(self, str, from_encoding=False): 186 | if len(str == 1): 187 | return ord(str) 188 | str = str.encode("UCS-4BE") 189 | tmp = struct.pack("N", str) 190 | return tmp[1] 191 | 192 | def xGorgon_cookie(self, cookie, encoding="utf-8"): 193 | gorgon = [] 194 | rang = self.ranges(4) 195 | if (cookie is None) or (len(cookie) == 0): 196 | for i in rang: 197 | gorgon.append(0) 198 | else: 199 | hashstr = hashlib.md5(cookie.encode()).hexdigest() 200 | for i in rang: 201 | gorgon.append(self.fromHex(hashstr[i * 2 : 2 * i + 2])) 202 | 203 | return gorgon 204 | 205 | def xGorgon_data(self, data: (bytes or None or str), encoding="utf-8"): 206 | gorgon = [] 207 | data_md5 = None 208 | 209 | if (data is None) or (len(data) == 0): 210 | rang = self.ranges(4) 211 | for i in rang: 212 | gorgon.append(0) 213 | else: 214 | try: 215 | data_md5 = hashlib.md5(data).hexdigest() 216 | except Exception: 217 | data_md5 = hashlib.md5(data.encode('utf-8')).hexdigest() 218 | 219 | if encoding == "octet": 220 | try: 221 | data_md5 = hashlib.md5(data).hexdigest() 222 | except Exception: 223 | data_md5 = hashlib.md5(data.encode('utf-8')).hexdigest() 224 | rang = self.ranges(4) 225 | 226 | for i in rang: 227 | gorgon.append(self.fromHex(data_md5[i * 2 : 2 * i + 2])) 228 | 229 | return gorgon 230 | 231 | class StableGorgon: 232 | def __init__(self, params: str, data: str, cookies: str, unix: int) -> None: 233 | self.unix = unix;self.params = params;self.data = data;self.cookies = cookies 234 | 235 | def hash(self, data: str) -> str: 236 | try: 237 | _hash = str(hashlib.md5(data.encode()).hexdigest()) 238 | except Exception: 239 | _hash = str(hashlib.md5(data).hexdigest()) 240 | return _hash 241 | 242 | def get_base_string(self) -> str: 243 | base_str = self.hash(self.params) 244 | base_str = base_str + self.hash(self.data) if self.data else base_str + str('0' * 32) 245 | base_str = base_str + self.hash(self.cookies) if self.cookies else base_str + str('0' * 32) 246 | return base_str 247 | 248 | def get_value(self) -> json: 249 | base_str = self.get_base_string() 250 | return self.encrypt(base_str) 251 | 252 | def encrypt(self, data: str) -> json: 253 | unix = self.unix; 254 | len = 20; 255 | key = [223, 119, 185, 64, 185, 155, 132, 131, 209, 185, 203, 209, 247, 194, 185, 133, 195, 208, 251, 195]; 256 | param_list = [] 257 | for i in range(0, 12, 4): 258 | temp = data[8 * i:8 * (i + 1)] 259 | for j in range(4): H = int(temp[j * 2:(j + 1) * 2], 16);param_list.append(H) 260 | param_list.extend([0, 6, 11, 28]); 261 | H = int(hex(unix), 16); 262 | param_list.append((H & 4278190080) >> 24); 263 | param_list.append((H & 16711680) >> 16); 264 | param_list.append((H & 65280) >> 8); 265 | param_list.append((H & 255) >> 0); 266 | eor_result_list = [] 267 | for (A, B) in zip(param_list, key): eor_result_list.append(A ^ B) 268 | for i in range(len): C = self.reverse(eor_result_list[i]);D = eor_result_list[ 269 | (i + 1) % len];E = C ^ D;F = self.rbit_algorithm(E);H = (F ^ 4294967295 ^ len) & 255;eor_result_list[i] = H 270 | result = '' 271 | for param in eor_result_list: result += self.hex_string(param) 272 | return {'X-Gorgon': '0404b0d30000' + result, 'X-Khronos': str(unix)} 273 | 274 | def rbit_algorithm(self, num): 275 | result = ''; 276 | tmp_string = bin(num)[2:] 277 | while len(tmp_string) < 8: tmp_string = '0' + tmp_string 278 | for i in range(0, 8): result = result + tmp_string[7 - i] 279 | return int(result, 2) 280 | 281 | def hex_string(self, num): 282 | tmp_string = hex(num)[2:] 283 | if len(tmp_string) < 2: tmp_string = '0' + tmp_string 284 | return tmp_string 285 | 286 | def reverse(self, num): 287 | tmp_string = self.hex_string(num);return int(tmp_string[1:] + tmp_string[:1], 16) 288 | -------------------------------------------------------------------------------- /STikTok/log.py: -------------------------------------------------------------------------------- 1 | import base64 2 | 3 | from .utilities import Utils 4 | from .applog import * 5 | 6 | 7 | class Xlog: 8 | def __init__(self, proxy: str or None = None): 9 | self.__device = Applog(proxy=proxy).register_device() 10 | self.proxy = proxy 11 | self.proxies = {'http': f'http://{proxy}', 'http': f'http://{proxy}'} if proxy else None 12 | 13 | def _base_payload( 14 | self, 15 | extra: str = "install", 16 | slb: str = "", 17 | hdf: str = "", 18 | acg_m: int = 1, 19 | rebuild: int = -1, 20 | sg_s: int = 0, 21 | sign: str = "", 22 | ): 23 | 24 | __xlog_data = { 25 | "extra": extra, 26 | "grilock": "", 27 | "ast": 2, 28 | "p1": str(self.__device["device_id"]), 29 | "p2": str(self.__device["install_id"]), 30 | "ait": int(str(self.__device["install_time"])[:10]), 31 | "ut": self.__device["ut"], 32 | "pkg": "com.zhiliaoapp.musically.go", 33 | "prn": "CZL-MRP_T", 34 | "vc": 160904, 35 | "fp": f"{self.__device['device_brand']}/{self.__device['device_brand']}/{self.__device['device_model']}:7.1.2/{self.__device['rom']}:user/release-keys", 36 | "vpn": 0, 37 | "hw": { 38 | "brand": self.__device["device_brand"], 39 | "model": self.__device["device_model"], 40 | "board": "msm8998", 41 | "device": self.__device['device_model'], 42 | "product": self.__device['device_model'], 43 | "manuf": self.__device["device_brand"], 44 | "tags": "release-keys", 45 | "inc": self.__device['rom'], 46 | "des": f"{self.__device['device_brand']}-user 7.1.2 20171130.276299 release-keys", 47 | "bt": "uboot", 48 | "pfbd": "gmin", 49 | "display": self.__device['resolution2'], 50 | "dpi": 191, 51 | "wm_s": "", 52 | "wm_d": "", 53 | "bat": 1000, 54 | "bas": [], 55 | "cpu": {}, 56 | "mem": { 57 | "ram": "3185635328", 58 | "rom": self.__device["rom"], 59 | "sd": "9892421632" 60 | }, 61 | "hdf": "", 62 | "slb": "" 63 | }, 64 | "id": { 65 | "i": 25, 66 | "r": "7.1.2", 67 | "acg_m": -127, 68 | "onm": "42001" 69 | }, 70 | "emulator": {}, 71 | "env": { 72 | "ver": "0.6.11.29.18", 73 | "tag": "CZL_LAST_VER", 74 | "pkg": "com.zhiliaoapp.musically.go", 75 | "tz": "GMT+08:00", 76 | "ml": "en_US", 77 | "uid": self.__device["uid"], 78 | "mc": 0, 79 | "arch": 1, 80 | "e_arch": 3, 81 | "v_bnd": 7, 82 | "su": -1, 83 | "sp": "", 84 | "ro.secure_s": "1", 85 | "ro.debuggable_s": "0", 86 | "rebuild": -1, 87 | "jd": 0, 88 | "dbg": 0, 89 | "tid": 0, 90 | "trm": "", 91 | "dbg_st": -93, 92 | "dbg_tid": 2, 93 | "dbg_if": -1, 94 | "hph": "192.168.8.128", 95 | "hpp": "8080", 96 | "envrion": [], 97 | "oem_s": -1, 98 | "oem_a": -1, 99 | "xposed": 0, 100 | "frida": 0, 101 | "cydia": 0, 102 | "jexp": 0, 103 | "click": "", 104 | "acb": 0, 105 | "hook": [], 106 | "jvh": [], 107 | "fish": {}, 108 | "vapp": "", 109 | "vmos": 0, 110 | "ssr": -1, 111 | "mal": "", 112 | "mor": 0, 113 | "mor2": 0, 114 | "ech": "4294967295" 115 | }, 116 | "extension": { 117 | "sg": 1213, 118 | "sp": -1, 119 | "f_clk": 0, 120 | "u_clk": 0, 121 | "atify": "0x00000000", 122 | "notify": 1, 123 | "sg_s": 0, 124 | "path": "", 125 | "bdc": "", 126 | "dp": self.__device["dp"], 127 | "sign": "", 128 | "sha1": "", 129 | "inst": "com.bytedance.platform.godzilla.b.a.b.a", 130 | "AMN": "android.app.ActivityManagerProxy", 131 | "dump": 1, 132 | "dump2": 1, 133 | "mk": 0, 134 | "cba": self.__device["cba"], 135 | "ts1": -1890141920, 136 | "ts2": 0, 137 | "bqq": "" 138 | }, 139 | "paradox": {}, 140 | "gp_ctl": { 141 | "usb": -1, 142 | "adb": -1, 143 | "acc": "" 144 | }, 145 | "custom_info": {}, 146 | "hc": self.__device["hc"], 147 | "fch": "0000000000" 148 | } 149 | 150 | __xlog_data["fch"] = Utils._fch(json.dumps(__xlog_data).replace(" ", "")) 151 | 152 | return Utils._xlencrypt( 153 | json.dumps( 154 | __xlog_data, separators=(",", ":") 155 | ).replace(" ", "") 156 | ) 157 | 158 | def __get_headers(self, params: str, data: (str or None) = None) -> dict: 159 | sig = Utils._sig( 160 | params=params, 161 | body=bytes.fromhex(data) if data is not None else None 162 | ) 163 | 164 | headers = { 165 | "x-ss-stub": hashlib.md5(data.encode()).hexdigest().upper() if data is not None else None, 166 | "accept-encoding": "gzip", 167 | "cookie": "sessionid=", 168 | "x-gorgon": sig["X-Gorgon"], 169 | "x-khronos": sig["X-Khronos"], 170 | "content-type": "application/octet-stream" if data is not None else None, 171 | "host": "xlog-va.byteoversea.com", 172 | "connection": "Keep-Alive", 173 | "user-agent": "okhttp/3.10.0.1" 174 | } 175 | 176 | return { 177 | key: value for key, value in headers.items() if value is not None 178 | } 179 | 180 | def __get_params(self) -> str: 181 | return urlencode( 182 | { 183 | "os": 0, 184 | "ver": "0.6.11.29.19-MT", 185 | "m": 2, 186 | "app_ver": APP["version"], 187 | "region": "en_US", 188 | "aid": 1340, 189 | "did": self.__device['device_id'], 190 | "iid": self.__device['install_id'] 191 | } 192 | ) 193 | 194 | def __get_xlog(self) -> requests.Response: 195 | params = self.__get_params() 196 | 197 | return json.loads( 198 | XLEncrypt().decrypt( 199 | requests.get( 200 | url="https://xlog-va.byteoversea.com/v2/s?" + params, 201 | headers=self.__get_headers(params), 202 | proxies=self.proxies 203 | ).content.hex() 204 | ) 205 | ) 206 | 207 | def __alert_check(self) -> bool: 208 | url = f"https://applog.musical.ly/service/2/app_alert_check/?iid={self.__device['install_id']}&device_id={self.__device['device_id']}&version_code={APP['version_code']}" 209 | headers = { 210 | "accept-encoding": "gzip", 211 | "x-ss-req-ticket": str(int(time.time() * 1000)), 212 | "sdk-version": "1", 213 | "user-agent": "okhttp/3.10.0.1", 214 | } 215 | 216 | response = requests.get(url, headers=headers, data={}, proxies=self.proxies) 217 | 218 | return response.json() 219 | 220 | def __xlog_install(self) -> dict: 221 | __xlog_data = self._base_payload() 222 | __xlog_params = self.__get_params() 223 | self.__alert_check() 224 | 225 | return json.loads( 226 | XLEncrypt().decrypt( 227 | requests.post( 228 | url=( 229 | "https://xlog-va.byteoversea.com/v2/r/?" 230 | + __xlog_params 231 | ), 232 | data=bytes.fromhex(__xlog_data), 233 | headers=self.__get_headers(__xlog_params, __xlog_data), 234 | proxies=self.proxies 235 | ).content.hex() 236 | ) 237 | ) 238 | 239 | def __xlog_coldstart(self, num: int = 1) -> dict: 240 | if num == 1: 241 | __xlog_data = self._base_payload( 242 | extra="cold_start", 243 | slb=base64.b64encode( 244 | "library:EpdgManager\nlibrary:SemAudioThumbnail\nlibrary:android.ext.shared\nlibrary:android.hidl.base-V1.0-java\nlibrary:android.hidl.manager-V1.0-java\nlibrary:android.net.ipsec.ike\nlibrary:android.test.base\nlibrary:android.test.mock\nlibrary:android.test.runner\nlibrary:com.android.future.usb.accessory\nlibrary:com.android.location.provider\nlibrary:com.android.media.remotedisplay\nlibrary:com.android.mediadrm.signer\nlibrary:com.google.android.gms\nlibrary:com.publicnfc\nlibrary:com.samsung.android.ibs.framework-v1\nlibrary:com.samsung.android.knox.analytics.sdk\nlibrary:com.samsung.android.knox.knoxsdk\nlibrary:com.samsung.android.nfc.rfcontrol\nlibrary:com.samsung.android.nfc.t4t\nlibrary:com.samsung.android.psitrackersdk.framework-v1\nlibrary:com.samsung.android.semtelephonesdk.framework-v1\nlibrary:com.samsung.android.spensdk.framework-v1\nlibrary:com.samsung.bbc\nlibrary:com.samsung.device.lite\nlibrary:com.sec.android.sdhmssdk.framework-v1\nlibrary:com.sec.esecomm\nlibrary:com.sec.smartcard.auth\nlibrary:imsmanager\nlibrary:javax.obex\nlibrary:org.apache.http.legacy\nlibrary:org.simalliance.openmobileapi\nlibrary:rcsopenapi\nlibrary:saiv\nlibrary:samsungkeystoreutils\nlibrary:scamera_sdk_util\nlibrary:sec_platform_library\nlibrary:secimaging\nlibrary:semextendedformat\nlibrary:semmediatranscoder\nlibrary:semsdrvideoconverter\nlibrary:sfeffect\nlibrary:stayrotation\nlibrary:vsimmanager\n".encode()).decode(), 245 | hdf=base64.b64encode( 246 | "feature:reqGlEsVersion=0x30002\nfeature:android.hardware.audio.low_latency\nfeature:android.hardware.audio.output\nfeature:android.hardware.biometrics.face\nfeature:android.hardware.bluetooth\nfeature:android.hardware.bluetooth_le\nfeature:android.hardware.camera\nfeature:android.hardware.camera.any\nfeature:android.hardware.camera.autofocus\nfeature:android.hardware.camera.flash\nfeature:android.hardware.camera.front\nfeature:android.hardware.faketouch\nfeature:android.hardware.fingerprint\nfeature:android.hardware.location\nfeature:android.hardware.location.gps\nfeature:android.hardware.location.network\nfeature:android.hardware.microphone\nfeature:android.hardware.nfc\nfeature:android.hardware.nfc.any\nfeature:android.hardware.nfc.hce\nfeature:android.hardware.nfc.hcef\nfeature:android.hardware.nfc.uicc\nfeature:android.hardware.opengles.aep\nfeature:android.hardware.ram.normal\nfeature:android.hardware.screen.landscape\nfeature:android.hardware.screen.portrait\nfeature:android.hardware.se.omapi.uicc\nfeature:android.hardware.sensor.accelerometer\nfeature:android.hardware.sensor.proximity\nfeature:android.hardware.sensor.stepcounter\nfeature:android.hardware.sensor.stepdetector\nfeature:android.hardware.telephony\nfeature:android.hardware.telephony.gsm\nfeature:android.hardware.telephony.ims\nfeature:android.hardware.touchscreen\nfeature:android.hardware.touchscreen.multitouch\nfeature:android.hardware.touchscreen.multitouch.distinct\nfeature:android.hardware.touchscreen.multitouch.jazzhand\nfeature:android.hardware.usb.accessory\nfeature:android.hardware.usb.host\nfeature:android.hardware.vulkan.compute\nfeature:android.hardware.vulkan.level=1\nfeature:android.hardware.vulkan.version=4198400\nfeature:android.hardware.wifi\nfeature:android.hardware.wifi.direct\nfeature:android.hardware.wifi.passpoint\nfeature:android.software.activities_on_secondary_displays\nfeature:android.software.app_enumeration\nfeature:android.software.app_widgets\nfeature:android.software.autofill\nfeature:android.software.backup\nfeature:android.software.cant_save_state\nfeature:android.software.companion_device_setup\nfeature:android.software.connectionservice\nfeature:android.software.controls\nfeature:android.software.cts\nfeature:android.software.device_admin\nfeature:android.software.file_based_encryption\nfeature:android.software.freeform_window_management\nfeature:android.software.home_screen\nfeature:android.software.incremental_delivery\nfeature:android.software.input_methods\nfeature:android.software.ipsec_tunnels\nfeature:android.software.live_wallpaper\nfeature:android.software.managed_users\nfeature:android.software.midi\nfeature:android.software.picture_in_picture\nfeature:android.software.print\nfeature:android.software.secure_lock_screen\nfeature:android.software.securely_removes_users\nfeature:android.software.sip\nfeature:android.software.sip.voip\nfeature:android.software.verified_boot\nfeature:android.software.voice_recognizers\nfeature:android.software.vulkan.deqp.level=132383489\nfeature:android.software.webview\nfeature:com.google.android.feature.ACCESSIBILITY_PRELOAD\nfeature:com.google.android.feature.RU\nfeature:com.google.android.feature.TURBO_PRELOAD\nfeature:com.nxp.mifare\nfeature:com.samsung.android.api.version.2402\nfeature:com.samsung.android.api.version.2403\nfeature:com.samsung.android.api.version.2501\nfeature:com.samsung.android.api.version.2502\nfeature:com.samsung.android.api.version.2601\nfeature:com.samsung.android.api.version.2701\nfeature:com.samsung.android.api.version.2801\nfeature:com.samsung.android.api.version.2802\nfeature:com.samsung.android.api.version.2803\nfeature:com.samsung.android.api.version.2901\nfeature:com.samsung.android.api.version.2902\nfeature:com.samsung.android.api.version.2903\nfeature:com.samsung.android.api.version.3001\nfeature:com.samsung.android.bio.face\nfeature:com.samsung.android.knox.knoxsdk\nfeature:com.samsung.android.knox.knoxsdk.api.level.33\nfeature:com.samsung.android.sdk.camera.processor\nfeature:com.samsung.android.sdk.camera.processor.effect\nfeature:com.samsung.feature.SAMSUNG_EXPERIENCE\nfeature:com.samsung.feature.audio_listenback\nfeature:com.samsung.feature.clockpack_v08\nfeature:com.samsung.feature.device_category_phone\nfeature:com.samsung.feature.galaxyfinder_v7\nfeature:com.samsung.feature.samsung_experience_mobile_lite\nfeature:com.sec.android.secimaging\nfeature:com.sec.android.smartface.smart_stay\nfeature:com.sec.feature.cocktailpanel\nfeature:com.sec.feature.fingerprint_manager_service\nfeature:com.sec.feature.motionrecognition_service\nfeature:com.sec.feature.nsflp=530\nfeature:com.sec.feature.overlaymagnifier\nfeature:com.sec.feature.saccessorymanager\nfeature:com.sec.feature.sensorhub=41\nfeature:com.sec.feature.usb_authentication\n".encode()).decode() 247 | ) 248 | if num == 2: 249 | __xlog_data = self._base_payload( 250 | extra="cold_start", 251 | acg_m=-127, 252 | rebuild=0, 253 | sg_s=1, 254 | sign=str(APP["sig_hash"]).upper() 255 | ) 256 | 257 | __xlog_params = self.__get_params() 258 | 259 | return json.loads( 260 | XLEncrypt().decrypt( 261 | requests.post( 262 | url=( 263 | "https://xlog-va.byteoversea.com/v2/r/?" + __xlog_params 264 | ), 265 | data=bytes.fromhex(__xlog_data), 266 | headers=self.__get_headers(__xlog_params, __xlog_data), 267 | proxies=self.proxies 268 | ).content.hex() 269 | ) 270 | ) 271 | 272 | def validate_device(self) -> bool: 273 | while True: 274 | try: 275 | 276 | # if self.__get_xlog()['status'] == 0: 277 | # print(Utils.sprint("*", 1, f"xlog {Col.blue}get{Col.reset} success")) 278 | # pass 279 | 280 | if self.__xlog_install()['result'] == "success": 281 | # print(Utils.sprint("*", 2, f'xlog post {Col.blue}install{Col.reset} success')) 282 | pass 283 | 284 | # if self.__xlog_coldstart(1)['result'] == "success": 285 | # # print(Utils.sprint("*", 3, f'xlog post 01 {Col.blue}"cold_start"{Col.reset} success')) 286 | # pass 287 | 288 | # if self.__xlog_coldstart(2)['result'] == "success": 289 | # # print(Utils.sprint("*", 4, f'xlog post 02 {Col.blue}"cold_start"{Col.reset} success')) 290 | # pass 291 | 292 | url = f"https://applog.musical.ly/service/2/app_alert_check/?iid={self.__device['install_id']}&device_id={self.__device['device_id']}&version_code={APP['version_code']}" 293 | headers = { 294 | "accept-encoding": "gzip", 295 | "x-ss-req-ticket": str(int(time.time())) + "000", 296 | "sdk-version": "1", 297 | "user-agent": "okhttp/3.10.0.1", 298 | } 299 | 300 | response = requests.get(url, headers=headers, data={}, proxies=self.proxies) 301 | 302 | if response.json()["data"]["is_activated"] == 1: 303 | # print(Utils.sprint("*", 5, f'Device {Col.blue}activated{Col.reset} !! | Execution time: {Col.blue}{round(time.time() - START, 1)}s')) 304 | return self.__device 305 | except Exception as e: 306 | # print(e, "akm") 307 | self.__device = Applog(proxy=self.proxy).register_device() 308 | continue -------------------------------------------------------------------------------- /STikTok/solver.py: -------------------------------------------------------------------------------- 1 | # This is how easy it is to solve TikTok captchas 2 | 3 | import cv2 4 | import base64 5 | import numpy as np 6 | import requests 7 | import time 8 | import random 9 | from urllib.parse import urlencode 10 | 11 | 12 | class PuzzleSolver: 13 | def __init__(self, base64puzzle, base64piece): 14 | self.puzzle = base64puzzle 15 | self.piece = base64piece 16 | 17 | def get_position(self): 18 | puzzle = self.__background_preprocessing() 19 | piece = self.__piece_preprocessing() 20 | matched = cv2.matchTemplate( 21 | puzzle, 22 | piece, 23 | cv2.TM_CCOEFF_NORMED 24 | ) 25 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(matched) 26 | return max_loc[0] 27 | 28 | def __background_preprocessing(self): 29 | img = self.__img_to_grayscale(self.piece) 30 | background = self.__sobel_operator(img) 31 | return background 32 | 33 | def __piece_preprocessing(self): 34 | img = self.__img_to_grayscale(self.puzzle) 35 | template = self.__sobel_operator(img) 36 | return template 37 | 38 | def __sobel_operator(self, img): 39 | scale = 1 40 | delta = 0 41 | ddepth = cv2.CV_16S 42 | 43 | img = cv2.GaussianBlur(img, (3, 3), 0) 44 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 45 | grad_x = cv2.Sobel( 46 | gray, 47 | ddepth, 48 | 1, 49 | 0, 50 | ksize=3, 51 | scale=scale, 52 | delta=delta, 53 | borderType=cv2.BORDER_DEFAULT, 54 | ) 55 | grad_y = cv2.Sobel( 56 | gray, 57 | ddepth, 58 | 0, 59 | 1, 60 | ksize=3, 61 | scale=scale, 62 | delta=delta, 63 | borderType=cv2.BORDER_DEFAULT, 64 | ) 65 | abs_grad_x = cv2.convertScaleAbs(grad_x) 66 | abs_grad_y = cv2.convertScaleAbs(grad_y) 67 | grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0) 68 | 69 | return grad 70 | 71 | def __img_to_grayscale(self, img): 72 | return cv2.imdecode( 73 | self.__string_to_image(img), 74 | cv2.IMREAD_COLOR 75 | ) 76 | 77 | def __string_to_image(self, base64_string): 78 | 79 | return np.frombuffer( 80 | base64.b64decode(base64_string), 81 | dtype="uint8" 82 | ) 83 | 84 | 85 | class Captcha: 86 | def __init__(self, did, iid): 87 | self.__host = "www-useast1a.tiktok.com" 88 | self.__device_id = did 89 | self.__install_id = iid 90 | self.__cookies = "" 91 | self.__client = requests.Session() 92 | 93 | def __params(self): 94 | params = { 95 | 'lang': 'en', 96 | 'app_name': 'musically_ly', 97 | 'h5_sdk_version': '2.23.4', 98 | 'sdk_version': '1.2.1', 99 | 'iid': self.__install_id, 100 | 'did': self.__device_id, 101 | 'device_id': self.__device_id, 102 | 'ch': 'googleplay', 103 | 'aid': '1340', 104 | 'os_type': '0', 105 | 'tmp': f"{int(time.time())}{random.randint(111, 999)}", 106 | 'platform': 'app', 107 | 'webdriver': 'undefined', 108 | 'locale': 'en', 109 | 'vc': '16.9.4', 110 | 'os_name': 'Android', 111 | 'os_version': '25', 112 | 'user_id': '0', 113 | 'orientation': '1', 114 | 'resolution': '575*994', 115 | 'region': 'va', 116 | 'device_brand': 'google', 117 | 'device_model': 'G011A', 118 | 'verify_host': 'https://www-useast1a.tiktok.com/', 119 | 'challenge_code': '1105', 120 | 'channel': 'googleplay', 121 | 'app_version': '16.9.4' 122 | } 123 | 124 | return urlencode(params) 125 | 126 | def __headers(self) -> dict: 127 | headers = { 128 | "sdk-version": "2", 129 | "x-ss-req-ticket": str(int(time.time() * 1000)), 130 | "cookie": self.__cookies, 131 | "content-type": "application/json; charset=utf-8", 132 | "host": self.__host, 133 | "connection": "Keep-Alive", 134 | "user-agent": "okhttp/3.10.0.1", 135 | "passport-sdk-version": "19", 136 | } 137 | 138 | return headers 139 | 140 | def __get_challenge(self) -> dict: 141 | params = self.__params() 142 | 143 | req = self.__client.get( 144 | url=( 145 | "https://" 146 | + self.__host 147 | + "/captcha/get?" 148 | + params 149 | ), 150 | headers=self.__headers() 151 | ) 152 | 153 | return req.json() 154 | 155 | def __solve_captcha(self, url_1: str, url_2: str) -> dict: 156 | puzzle = base64.b64encode( 157 | self.__client.get( 158 | url_1, 159 | ).content 160 | ) 161 | piece = base64.b64encode( 162 | self.__client.get( 163 | url_2, 164 | ).content 165 | ) 166 | 167 | solver = PuzzleSolver(puzzle, piece) 168 | maxloc = solver.get_position() 169 | randlength = round( 170 | random.random() * (100 - 50) + 50 171 | ) 172 | time.sleep(1) 173 | return { 174 | "maxloc": maxloc, 175 | "randlenght": randlength 176 | } 177 | 178 | def __post_captcha(self, solve: dict) -> dict: 179 | params = self.__params() 180 | 181 | body = { 182 | "modified_img_width": 552, 183 | "id": solve["id"], 184 | "mode": "slide", 185 | "reply": list( 186 | { 187 | "relative_time": i * solve["randlenght"], 188 | "x": round( 189 | solve["maxloc"] / (solve["randlenght"] / (i + 1)) 190 | ), 191 | "y": solve["tip"], 192 | } 193 | for i in range( 194 | solve["randlenght"] 195 | ) 196 | ), 197 | } 198 | 199 | headers = self.__headers() 200 | 201 | req = self.__client.post( 202 | url=( 203 | "https://" 204 | + self.__host 205 | + "/captcha/verify?" 206 | + params 207 | ), 208 | headers=headers.update( 209 | { 210 | "content-type": "application/json" 211 | } 212 | ), 213 | json=body 214 | ) 215 | 216 | return req.json() 217 | 218 | def solve_captcha(self): 219 | __captcha_challenge = self.__get_challenge() 220 | 221 | __captcha_id = __captcha_challenge["data"]["id"] 222 | __tip_y = __captcha_challenge["data"]["question"]["tip_y"] 223 | 224 | solve = self.__solve_captcha( 225 | __captcha_challenge["data"]["question"]["url1"], 226 | __captcha_challenge["data"]["question"]["url2"], 227 | ) 228 | 229 | solve.update( 230 | { 231 | "id": __captcha_id, 232 | "tip": __tip_y 233 | } 234 | ) 235 | 236 | return self.__post_captcha(solve) 237 | -------------------------------------------------------------------------------- /STikTok/ttencrypt.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import gzip 3 | import random 4 | from Crypto.Cipher import AES 5 | 6 | class TTEncrypt: 7 | __content = [] 8 | __content_raw = [] 9 | CF = 0 10 | begining = [0x74, 0x63, 0x05, 0x10, 0, 0] 11 | dword_0 = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 12 | 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 13 | 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 14 | 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 15 | 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 16 | 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 17 | 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 18 | 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 19 | 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 20 | 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 21 | 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 22 | 45, 15, 176, 84, 187, 22] 23 | dword_1 = [16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 452984832, 24 | 905969664] 25 | dword_2 = [ 26 | 0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 27 | 1817866830, 1649639237, 1215061108, 28 | 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 29 | 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 30 | 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 31 | 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 32 | 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 33 | 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 34 | 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 35 | 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 36 | 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 37 | 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 38 | 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 39 | 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 40 | 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 41 | 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 42 | 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 43 | 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 44 | 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 45 | 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 46 | 1951317047, 1716890410, 1750902305, 47 | 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 48 | 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 49 | 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 50 | 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 51 | 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 52 | 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 53 | 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 54 | 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 55 | 2203032232, 2370213795, 56 | ] 57 | dword_3 = [ 58 | 0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 59 | 1315723890, 1164071807, 1950903388, 60 | 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 61 | 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 62 | 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 63 | 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 64 | 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 65 | 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 66 | 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 67 | 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 68 | 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 69 | 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 70 | 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 71 | 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 72 | 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 73 | 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 74 | 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 75 | 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 76 | 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 77 | 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 78 | 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 79 | 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 80 | 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 81 | 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 82 | 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 83 | 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 84 | 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 85 | 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 86 | 2411029155, 3198115200, 3046200461, 2827177882, 2743944855, 87 | ] 88 | dword_4 = [ 89 | 0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 90 | 1917742170, 2135253587, 1551124588, 91 | 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 92 | 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 93 | 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 94 | 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 95 | 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 96 | 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 97 | 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 98 | 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 99 | 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 100 | 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 101 | 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 102 | 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 103 | 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 104 | 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 105 | 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239000, 106 | 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 107 | 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 108 | 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 109 | 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 110 | 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 111 | 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 112 | 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 113 | 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 114 | 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 115 | 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 116 | 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 117 | 2744104290, 2159976285, 2377486676, 2594734927, 2544078150, 118 | ] 119 | dword_5 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 120 | 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 121 | 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 122 | 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 123 | 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 124 | 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 125 | 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 126 | 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 127 | 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 128 | 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 129 | 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 130 | 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 131 | 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998000, 865136418, 132 | 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 133 | 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 134 | 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 135 | 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 136 | 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 137 | 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 138 | 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 139 | 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 140 | 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 141 | 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 142 | 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 143 | 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 144 | 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 145 | 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 146 | 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 147 | 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 148 | 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 149 | 1418573201, 1335535747, 1184342925] 150 | dword_6 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 151 | 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 152 | 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 153 | 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 154 | 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 155 | 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 156 | 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 157 | 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 158 | 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 159 | 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 160 | 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 161 | 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 162 | 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 163 | 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 164 | 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 165 | 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 166 | 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 167 | 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 168 | 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 169 | 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 170 | 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 171 | 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 172 | 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 173 | 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 174 | 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 175 | 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 176 | 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 177 | 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 178 | 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 179 | 504303377, 2075177163, 2824099068, 1841019862, 739644986] 180 | dword_7 = [ 181 | 2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 182 | 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 183 | 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 184 | 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 185 | 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 186 | 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 187 | 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 188 | 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 189 | 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 190 | 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 191 | 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 192 | 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 193 | 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 194 | 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 195 | 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 196 | 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 197 | 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 198 | 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 199 | 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 200 | 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 201 | 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 202 | 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 203 | 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 204 | 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 205 | 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 206 | 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 207 | 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 208 | 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 209 | 4238890068, 3597515707, 975967766, 210 | ] 211 | dword_8 = [ 212 | 1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 213 | 16974337, 1739181671, 729634347, 214 | 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 215 | 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 216 | 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 217 | 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 218 | 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 219 | 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 220 | 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 221 | 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 222 | 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 223 | 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 224 | 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 225 | 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 226 | 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 227 | 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 228 | 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 229 | 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 230 | 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 231 | 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 232 | 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 233 | 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 234 | 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 235 | 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 236 | 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 237 | 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 238 | 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 239 | 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 240 | 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126, 241 | ] 242 | dword_9 = [ 243 | 1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 244 | 16843522, 1734846926, 724270422, 245 | 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 246 | 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 247 | 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 248 | 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 249 | 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 250 | 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 251 | 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 252 | 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 253 | 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 254 | 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 255 | 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 256 | 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 257 | 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 258 | 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 259 | 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 260 | 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 261 | 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 262 | 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 263 | 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 264 | 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 265 | 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 266 | 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 267 | 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 268 | 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 269 | 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 270 | 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 271 | 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436, 272 | ] 273 | LIST_6B0 = [4089235720, 1779033703, 2227873595, 3144134277, 4271175723, 1013904242, 1595750129, 2773480762, 274 | 2917565137, 1359893119, 725511199, 2600822924, 4215389547, 528734635, 327033209, 1541459225] 275 | ord_list = [ 276 | 77, 212, 194, 230, 184, 49, 98, 9, 14, 82, 179, 199, 166, 115, 59, 164, 28, 178, 70, 43, 130, 154, 181, 138, 25, 277 | 107, 57, 219, 87, 23, 117, 278 | 36, 244, 155, 175, 127, 8, 232, 214, 141, 38, 167, 46, 55, 193, 169, 90, 47, 31, 5, 165, 24, 146, 174, 242, 148, 279 | 151, 50, 182, 42, 56, 170, 221, 88, 280 | ] 281 | rodata = [3609767458, 1116352408, 602891725, 1899447441, 3964484399, 3049323471, 2173295548, 3921009573, 4081628472, 282 | 961987163, 3053834265, 1508970993, 2937671579, 2453635748, 3664609560, 2870763221, 2734883394, 3624381080, 283 | 1164996542, 310598401, 1323610764, 607225278, 3590304994, 1426881987, 4068182383, 1925078388, 991336113, 284 | 2162078206, 633803317, 2614888103, 3479774868, 3248222580, 2666613458, 3835390401, 944711139, 4022224774, 285 | 2341262773, 264347078, 2007800933, 604807628, 1495990901, 770255983, 1856431235, 1249150122, 3175218132, 286 | 1555081692, 2198950837, 1996064986, 3999719339, 2554220882, 766784016, 2821834349, 2566594879, 2952996808, 287 | 3203337956, 3210313671, 1034457026, 3336571891, 2466948901, 3584528711, 3758326383, 113926993, 168717936, 288 | 338241895, 1188179964, 666307205, 1546045734, 773529912, 1522805485, 1294757372, 2643833823, 1396182291, 289 | 2343527390, 1695183700, 1014477480, 1986661051, 1206759142, 2177026350, 344077627, 2456956037, 1290863460, 290 | 2730485921, 3158454273, 2820302411, 3505952657, 3259730800, 106217008, 3345764771, 3606008344, 3516065817, 291 | 1432725776, 3600352804, 1467031594, 4094571909, 851169720, 275423344, 3100823752, 430227734, 1363258195, 292 | 506948616, 3750685593, 659060556, 3785050280, 883997877, 3318307427, 958139571, 3812723403, 1322822218, 293 | 2003034995, 1537002063, 3602036899, 1747873779, 1575990012, 1955562222, 1125592928, 2024104815, 294 | 2716904306, 2227730452, 442776044, 2361852424, 593698344, 2428436474, 3733110249, 2756734187, 2999351573, 295 | 3204031479, 3815920427, 3329325298, 3928383900, 3391569614, 566280711, 3515267271, 3454069534, 3940187606, 296 | 4000239992, 4118630271, 1914138554, 116418474, 2731055270, 174292421, 3203993006, 289380356, 320620315, 297 | 460393269, 587496836, 685471733, 1086792851, 852142971, 365543100, 1017036298, 2618297676, 1126000580, 298 | 3409855158, 1288033470, 4234509866, 1501505948, 987167468, 1607167915, 1246189591, 1816402316] 299 | list_9C8 = [] 300 | def encrypt(self, data): 301 | headers = [31, 139, 8, 0, 0, 0, 0, 0, 0, 0] 302 | data = gzip.compress(bytes(data.encode('latin-1')), compresslevel=9, mtime=0) 303 | data = list(data) 304 | self.setData(data) 305 | for i in range(len(headers)): 306 | self.__content[i] = headers[i] 307 | list_0B0 = self.calculate(self.list_9C8) + self.ord_list 308 | 309 | list_5D8 = self.calculate(list_0B0) 310 | list_378 = [] 311 | list_740 = [] 312 | for i in range(0x10): 313 | list_378.append(list_5D8[i]) 314 | list_378Array = self.dump_list(list_378) 315 | for i in range(0x10, 0x20): 316 | list_740.append(list_5D8[i]) 317 | 318 | list_8D8 = self.calculate(self.__content) 319 | list_AB0 = list_8D8 + self.__content 320 | list_AB0List = self.convertLongList(list_AB0) 321 | differ = 0x10 - len(list_AB0) % 0x10 322 | 323 | for i in range(differ): 324 | list_AB0List.append(differ) 325 | 326 | list_AB0 = list_AB0List 327 | 328 | list_55C = self.hex_CF8(list_378Array) 329 | final_list = self.hex_0A2(list_AB0, list_740, list_55C) 330 | final_list = (self.begining + self.list_9C8) + final_list 331 | final_list = self.changeLongArrayTobytes(final_list) 332 | 333 | return bytes(i % 256 for i in final_list).hex() 334 | 335 | def decrypt(self, data): 336 | data = bytearray.fromhex(data) 337 | data = list(data) 338 | self.setData(data) 339 | self.__content = self.__content_raw[38:] 340 | self.list_9C8 = self.__content_raw[6:38] 341 | self.__content = self.changeByteArrayToLong(self.__content) 342 | list_0B0 = self.calculate(self.list_9C8) + self.ord_list 343 | list_5D8 = self.calculate(list_0B0) 344 | 345 | list_378 = [] 346 | list_740 = [] 347 | for i in range(0x10): 348 | list_378.append(list_5D8[i]) 349 | list_378Array = self.dump_list(list_378) 350 | for i in range(0x10, 0x20): 351 | list_740.append(list_5D8[i]) 352 | 353 | key_longs = self.hex_list(list_378Array) 354 | decrypted = self.aes_decrypt(bytes(key_longs), bytes(self.__content)) 355 | 356 | decryptedByteArray = ([0] * 16) + list(decrypted) 357 | toDecompress = decryptedByteArray[64:] 358 | result = gzip.decompress(bytes(toDecompress)) 359 | return result.decode() 360 | 361 | def aes_decrypt(self, secretKey, encoded): 362 | initVector = encoded[0:16] 363 | data = encoded[16:] 364 | decryptor = AES.new(secretKey, AES.MODE_CBC, initVector) 365 | decoded = decryptor.decrypt(data) 366 | return decoded[:-decoded[-1]] 367 | 368 | def bytearray_decode(self, arrays): 369 | out = [] 370 | for d in arrays: 371 | out.append(chr(d)) 372 | return "".join(out) 373 | 374 | def changeLongArrayTobytes(self, array): 375 | result = [] 376 | for i in range(len(array)): 377 | if array[i] > 127: 378 | result.append(array[i] - 256) 379 | else: 380 | result.append(array[i]) 381 | return result 382 | 383 | def hex_0A2(self, content, list_740, list_55C): 384 | result = [] 385 | l55cl = len(list_55C) 386 | lens = len(content) 387 | end = lens // 16 388 | for i in range(end): 389 | for j in range(16): 390 | list_740[j] = list_740[j] ^ content[16 * i + j] 391 | 392 | tmp_list = self.dump_list(list_740) 393 | R6 = tmp_list[3] 394 | LR = tmp_list[0] 395 | R8 = tmp_list[1] 396 | R12 = tmp_list[2] 397 | R5 = list_55C[0] 398 | R4 = list_55C[1] 399 | R1 = list_55C[2] 400 | R2 = list_55C[3] 401 | R11 = 0 402 | v_334 = 0 403 | R2 = R2 ^ R6 404 | v_33C = R2 405 | R1 = R1 ^ R12 406 | v_338 = R1 407 | R4 = R4 ^ R8 408 | R12 = R5 ^ LR 409 | for j in range(5): 410 | R3 = v_33C 411 | R9 = R4 412 | R0 = int(self.UBFX(R12, 0x10, 8)) 413 | R1 = R3 >> 0x18 414 | R1 = self.dword_6[R1] 415 | R0 = self.dword_7[R0] 416 | R0 = R0 ^ R1 417 | R1 = int(self.UBFX(R4, 8, 8)) 418 | R8 = v_338 419 | R1 = self.dword_8[R1] 420 | LR = list_55C[8 * j + 6] 421 | R0 = R0 ^ R1 422 | R1 = int(self.UTFX(R8)) 423 | R1 = self.dword_9[R1] 424 | R0 = R0 ^ R1 425 | R1 = list_55C[8 * j + 4] 426 | v_334 = R1 427 | R1 = list_55C[8 * j + 5] 428 | v_330 = R1 429 | R1 = list_55C[8 * j + 7] 430 | R11 = R0 ^ R1 431 | R1 = int(self.UBFX(R3, 0x10, 8)) 432 | R0 = R8 >> 24 433 | R0 = self.dword_6[R0] 434 | R1 = self.dword_7[R1] 435 | R0 = R0 ^ R1 436 | R1 = int(self.UBFX(R12, 8, 8)) 437 | R1 = self.dword_8[R1] 438 | R0 = R0 ^ R1 439 | R1 = int(self.UTFX(R9)) 440 | R1 = self.dword_9[R1] 441 | R0 = R0 ^ R1 442 | R1 = int(self.UBFX(R8, 0x10, 8)) 443 | R6 = R0 ^ LR 444 | R0 = R9 >> 24 445 | R0 = self.dword_6[R0] 446 | R1 = self.dword_7[R1] 447 | R0 = R0 ^ R1 448 | R1 = int(self.UBFX(R3, 8, 8)) 449 | R1 = self.dword_8[R1] 450 | R0 = R0 ^ R1 451 | R1 = int(self.UTFX(R12)) 452 | R1 = self.dword_9[R1] 453 | R0 = R0 ^ R1 454 | R1 = v_330 455 | LR = R0 ^ R1 456 | R0 = int(self.UTFX(R3)) 457 | R0 = self.dword_9[R0] 458 | R4 = R12 >> 24 459 | 460 | R1 = int(self.UBFX(R8, 8, 8)) 461 | R4 = self.dword_6[R4] 462 | R5 = int(self.UBFX(R9, 16, 8)) 463 | R1 = self.dword_8[R1] 464 | R5 = self.dword_7[R5] 465 | R5 = R5 ^ R4 466 | R1 = R1 ^ R5 467 | R0 = R0 ^ R1 468 | R1 = v_334 469 | R1 = R1 ^ R0 470 | R0 = R1 >> 0x18 471 | v_334 = R0 472 | if j == 4: 473 | break 474 | else: 475 | R4 = int(self.UBFX(R1, 16, 8)) 476 | R5 = R11 >> 24 477 | R10 = R6 478 | R5 = self.dword_6[R5] 479 | R4 = self.dword_7[R4] 480 | R5 = R5 ^ R4 481 | R4 = int(self.UBFX(LR, 8, 8)) 482 | R4 = self.dword_8[R4] 483 | R5 = R5 ^ R4 484 | R4 = int(self.UTFX(R10)) 485 | R4 = self.dword_9[R4] 486 | R5 = R5 ^ R4 487 | R4 = list_55C[8 * j + 11] 488 | R0 = R5 ^ R4 489 | v_33C = R0 490 | R4 = int(self.UBFX(R11, 16, 8)) 491 | R5 = R10 >> 24 492 | R5 = self.dword_6[R5] 493 | R4 = self.dword_7[R4] 494 | R5 = R5 ^ R4 495 | R4 = int(self.UBFX(R1, 8, 8)) 496 | R0 = list_55C[8 * j + 9] 497 | R9 = list_55C[8 * j + 8] 498 | R1 = int(self.UTFX(R1)) 499 | R4 = self.dword_8[R4] 500 | R1 = self.dword_9[R1] 501 | R5 = R5 ^ R4 502 | R4 = int(self.UTFX(LR)) 503 | R4 = self.dword_9[R4] 504 | R5 = R5 ^ R4 505 | R4 = list_55C[8 * j + 10] 506 | R4 = R4 ^ R5 507 | v_338 = R4 508 | R5 = int(self.UBFX(R10, 16, 8)) 509 | R4 = LR >> 24 510 | R4 = self.dword_6[R4] 511 | R5 = self.dword_7[R5] 512 | R4 = R4 ^ R5 513 | R5 = int(self.UBFX(R11, 8, 8)) 514 | R5 = self.dword_8[R5] 515 | R4 = R4 ^ R5 516 | R1 = R1 ^ R4 517 | R4 = R1 ^ R0 518 | R0 = v_334 519 | R1 = int(self.UBFX(LR, 16, 8)) 520 | R5 = int(self.UBFX(R10, 8, 8)) 521 | R0 = self.dword_6[R0] 522 | R1 = self.dword_7[R1] 523 | R5 = self.dword_8[R5] 524 | R0 = R0 ^ R1 525 | R1 = int(self.UTFX(R11)) 526 | R1 = self.dword_9[R1] 527 | R0 = R0 ^ R5 528 | R0 = R0 ^ R1 529 | R12 = R0 ^ R9 530 | R2 = R11 >> 24 531 | R3 = int(self.UBFX(R1, 16, 8)) 532 | R10 = R6 533 | R0 = R10 >> 24 534 | R2 = self.dword_0[R2] 535 | 536 | R2 = int(self.parseLong(self.toHex(R2) + "000000", 10, 16)) 537 | R9 = R10 538 | R3 = self.dword_0[R3] 539 | R3 = int(self.parseLong(self.toHex(R3) + "0000", 10, 16)) 540 | R0 = self.dword_0[R0] 541 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 542 | R2 = R2 ^ R3 543 | v_350 = R2 544 | R2 = int(self.UBFX(R11, 0x10, 8)) 545 | R2 = self.dword_0[R2] 546 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 547 | R0 = R0 ^ R2 548 | R2 = int(self.UBFX(R1, 8, 8)) 549 | R1 = int(self.UTFX(R1)) 550 | R2 = self.dword_0[R2] 551 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 552 | R1 = self.dword_0[R1] 553 | R0 = R0 ^ R2 554 | R2 = int(self.UTFX(LR)) 555 | R2 = self.dword_0[R2] 556 | R12 = R0 ^ R2 557 | R0 = list_55C[l55cl - 2] 558 | R10 = list_55C[l55cl - 3] 559 | R12 = R12 ^ R0 560 | R2 = list_55C[l55cl - 1] 561 | R0 = LR >> 24 562 | v_34C = R2 563 | R2 = int(self.UBFX(R9, 0x10, 8)) 564 | R0 = self.dword_0[R0] 565 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 566 | R2 = self.dword_0[R2] 567 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 568 | R0 = R0 ^ R2 569 | R2 = int(self.UBFX(R11, 8, 8)) 570 | R2 = self.dword_0[R2] 571 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 572 | R0 = R0 ^ R2 573 | R0 = R0 ^ R1 574 | R1 = R0 ^ R10 575 | R0 = v_334 576 | R2 = int(self.UBFX(LR, 0x10, 8)) 577 | R0 = self.dword_0[R0] 578 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 579 | R2 = self.dword_0[R2] 580 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 581 | R0 = R0 ^ R2 582 | R2 = int(self.UBFX(R9, 8, 8)) 583 | R2 = self.dword_0[R2] 584 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 585 | R0 = R0 ^ R2 586 | R2 = int(self.UTFX(R11)) 587 | R2 = self.dword_0[R2] 588 | R0 = R0 ^ R2 589 | R2 = int(self.UTFX(R9)) 590 | R2 = self.dword_0[R2] 591 | R3 = int(self.UBFX(LR, 8, 8)) 592 | R3 = self.dword_0[R3] 593 | R3 = int(self.parseLong(self.toHex(R3) + "00", 10, 16)) 594 | R5 = v_350 595 | R6 = list_55C[l55cl - 4] 596 | R3 = R3 ^ R5 597 | R2 = R2 ^ R3 598 | R3 = v_34C 599 | R0 = R0 ^ R6 600 | R2 = R2 ^ R3 601 | list_740 = self.hex_list([R0, R1, R12, R2]) 602 | result = result + list_740 603 | 604 | return result # WORKED 605 | 606 | def calculate(self, content): 607 | hex_6A8 = 0 608 | tmp_list = [] 609 | length = len(content) 610 | list_6B0 = self.LIST_6B0.copy() 611 | 612 | for item in content: 613 | tmp_list.append(item) 614 | 615 | divisible = length % 0x80 616 | tmp = 0x80 - divisible 617 | 618 | if tmp > 0x11: 619 | tmp_list.append(0x80) 620 | for i in range(tmp - 0x11): 621 | tmp_list.append(0) 622 | 623 | for j in range(16): 624 | tmp_list.append(0) 625 | else: 626 | tmp_list.append(128) 627 | 628 | for i in range(128 - 16 + tmp + 1): 629 | tmp_list.append(0) 630 | 631 | for j in range(16): 632 | tmp_list.append(0) 633 | 634 | tmp_list_size = len(tmp_list) 635 | d = tmp_list_size // 0x80 636 | for i in range(tmp_list_size // 0x80): 637 | if (tmp_list_size // 128 - 1) == i: 638 | ending = self.handle_ending(hex_6A8, divisible) 639 | for j in range(8): 640 | index = tmp_list_size - j - 1 641 | tmp_list[index] = ending[7 - j] 642 | 643 | param_list = [] 644 | for j in range(32): 645 | tmpss = "" 646 | for k in range(4): 647 | tmp_string = self.toHex(tmp_list[0x80 * i + 4 * j + k]) 648 | if len(tmp_string) < 2: 649 | tmp_string = "0" + tmp_string 650 | 651 | tmpss = tmpss + tmp_string 652 | 653 | param_list.append(int(self.parseLong(tmpss, 10, 16))) 654 | 655 | list_3B8 = self.hex_27E(param_list) 656 | 657 | list_6B0 = self.hex_30A(list_6B0, list_3B8) 658 | 659 | hex_6A8 += 0x400 660 | 661 | list_8D8 = self.hex_C52(list_6B0) 662 | return list_8D8 663 | 664 | def convertLongList(self, content): 665 | if len(content) == 0: 666 | return [] 667 | result = [] 668 | for i in content: 669 | result.append(i) 670 | return result 671 | 672 | def dump_list(self, content): 673 | size = len(content) 674 | ssize = size // 4 675 | result = [] 676 | for index in range(ssize): 677 | tmp_string = "" 678 | for j in range(4): 679 | tmp = self.toHex(content[4 * index + j]) 680 | if len(tmp) < 2: 681 | tmp = "0" + tmp 682 | 683 | tmp_string = tmp_string + tmp 684 | i = int(self.parseLong(tmp_string, 10, 16)) 685 | result.append(int(i)) 686 | return result 687 | 688 | def hex_CF8(self, param_list): 689 | list_388 = [] 690 | list_378 = param_list 691 | for i in range(0xA): 692 | R3 = list_378[0] 693 | R8 = list_378[1] 694 | R9 = list_378[2] 695 | R5 = list_378[3] 696 | R6 = int(self.UBFX(R5, 8, 8)) 697 | R6 = self.dword_0[R6] 698 | R6 = int(self.parseLong(self.toHex(R6) + "0000", 10, 16)) 699 | R4 = int(self.UBFX(R5, 0x10, 8)) 700 | R11 = self.dword_1[i] 701 | R4 = self.dword_0[R4] 702 | R4 = int(self.parseLong(self.toHex(R4) + "000000", 10, 16)) 703 | R3 = R3 ^ R4 704 | R4 = int(self.UTFX(R5)) 705 | R3 = R3 ^ R6 706 | R4 = self.dword_0[R4] 707 | R4 = int(self.parseLong(self.toHex(R4) + "00", 10, 16)) 708 | R3 = R3 ^ R4 709 | R4 = R5 >> 24 710 | R4 = self.dword_0[R4] 711 | R3 = R3 ^ R4 712 | R3 = R3 ^ R11 713 | R2 = R8 ^ R3 714 | R4 = R9 ^ R2 715 | R5 = R5 ^ R4 716 | list_378 = [R3, R2, R4, R5] 717 | list_388 = list_388 + list_378 718 | l388l = len(list_388) 719 | list_478 = [] 720 | for i in range(0x9): 721 | R5 = list_388[l388l - 8 - 4 * i] 722 | R4 = int(self.UBFX(R5, 0x10, 8)) 723 | R6 = R5 >> 0x18 724 | R6 = self.dword_2[R6] 725 | R4 = self.dword_3[R4] 726 | R6 = R6 ^ R4 727 | R4 = int(self.UBFX(R5, 8, 8)) 728 | R5 = int(self.UTFX(R5)) 729 | R4 = self.dword_4[R4] 730 | R5 = self.dword_5[R5] 731 | R6 = R6 ^ R4 732 | R6 = R6 ^ R5 733 | list_478.append(R6) 734 | R6 = list_388[l388l - 7 - 4 * i] 735 | R1 = int(self.UBFX(R6, 0x10, 8)) 736 | R4 = R6 >> 0x18 737 | R4 = self.dword_2[R4] 738 | R1 = self.dword_3[R1] 739 | R1 = R1 ^ R4 740 | R4 = int(self.UBFX(R6, 8, 8)) 741 | R4 = self.dword_4[R4] 742 | R1 = R1 ^ R4 743 | R4 = int(self.UTFX(R6)) 744 | R4 = self.dword_5[R4] 745 | R1 = R1 ^ R4 746 | list_478.append(R1) 747 | R1 = list_388[l388l - 6 - 4 * i] 748 | R6 = int(self.UBFX(R1, 0x10, 8)) 749 | R4 = R1 >> 0x18 750 | R4 = self.dword_2[R4] 751 | R6 = self.dword_3[R6] 752 | R4 = R4 ^ R6 753 | R6 = int(self.UBFX(R1, 8, 8)) 754 | R1 = int(self.UTFX(R1)) 755 | R6 = self.dword_4[R6] 756 | R1 = self.dword_5[R1] 757 | R4 = R4 ^ R6 758 | R1 = R1 ^ R4 759 | list_478.append(R1) 760 | R0 = list_388[l388l - 5 - 4 * i] 761 | R1 = int(self.UTFX(R0)) 762 | R4 = int(self.UBFX(R0, 8, 8)) 763 | R6 = R0 >> 0x18 764 | R0 = int(self.UBFX(R0, 0x10, 8)) 765 | R6 = self.dword_2[R6] 766 | R0 = self.dword_3[R0] 767 | R4 = self.dword_4[R4] 768 | R1 = self.dword_5[R1] 769 | R0 = R0 ^ R6 770 | R0 = R0 ^ R4 771 | R0 = R0 ^ R1 772 | list_478.append(R0) 773 | list_468 = param_list + list_388 774 | return list_468 775 | 776 | def handle_ending(self, num, r0): 777 | s = self.toHex(num) 778 | r1 = None 779 | r2 = None 780 | if len(s) <= 8: 781 | r1 = num 782 | r2 = 0 783 | else: 784 | num_str = self.toHex(num) 785 | length = len(num) 786 | r1 = self.parseLong(num_str[:length - 8], 10, 16) 787 | r2 = self.parseLong(num_str[2:length - 8], 10, 16) 788 | 789 | r1 = self.ADDS(r1, r0 << 3) 790 | r2 = self.ADC(r2, r0 >> 29) 791 | a = self.hex_list([r2, r1]) 792 | return self.hex_list([r2, r1]) 793 | 794 | def UTFX(self, num): 795 | tmp_string = self.toBinaryString(num) 796 | start = len(tmp_string) - 8 797 | return self.parseLong(tmp_string[start:], 10, 2) 798 | 799 | def hex_27E(self, param_list): 800 | r6 = param_list[0] 801 | r8 = param_list[1] 802 | for i in range(0x40): 803 | r0 = param_list[2 * i + 0x1c] 804 | r5 = param_list[2 * i + 0x1d] 805 | r4 = self.LSRS(r0, 0x13) 806 | r3 = self.LSRS(r0, 0x1d) 807 | lr = r4 | self.check(r5) << 13 808 | r4 = self.LSLS(r0, 3) 809 | r4 = r4 | self.check(r5) >> 29 810 | r3 = r3 | self.check(r5) << 3 811 | r4 = r4 ^ self.check(r0) >> 6 812 | lr = lr ^ r4 813 | r4 = self.LSRS(r5, 6) 814 | r4 = r4 | self.check(r0) << 26 815 | r9 = r3 ^ r4 816 | r4 = self.LSRS(r5, 0x13) 817 | r0 = r4 | self.check(r0) << 13 818 | r10 = param_list[2 * i + 0x12] 819 | r3 = param_list[2 * i + 0x13] 820 | r5 = param_list[2 * i + 0x2] 821 | r4 = param_list[2 * i + 0x3] 822 | r0 = r0 ^ r9 823 | r3 = self.ADDS(r3, r8) 824 | r6 = self.ADC(r6, r10) 825 | r8 = self.ADDS(r3, r0) 826 | lr = self.ADC(lr, r6) 827 | r6 = self.LSRS(r4, 7) 828 | r3 = self.LSRS(r4, 8) 829 | r6 = r6 | self.check(r5) << 25 830 | r3 = r3 | self.check(r5) << 24 831 | r3 = int(self.EORS(r3, r6)) 832 | r6 = self.LSRS(r5, 1) 833 | r0 = int(self.RRX(r4)) 834 | r0 = int(self.EORS(r0, r3)) 835 | r3 = r6 | self.check(r4) << 31 836 | r6 = self.LSRS(r5, 8) 837 | r0 = int(self.ADDS(r0, r8)) 838 | r6 = r6 | self.check(r4) << 24 839 | r8 = r4 840 | r6 = r6 ^ self.check(r5) >> 7 841 | r3 = r3 ^ r6 842 | r6 = r5 843 | 844 | r3 = self.ADC(r3, lr) 845 | param_list = param_list + [r3, r0] 846 | 847 | return param_list # WORKED 848 | 849 | def hex_30A(self, param_list, list_3B8): 850 | v_3A0 = param_list[7] 851 | v_3A4 = param_list[6] 852 | v_374 = param_list[5] 853 | v_378 = param_list[4] 854 | LR = param_list[0] 855 | R12 = param_list[1] 856 | v_39C = param_list[2] 857 | v_398 = param_list[3] 858 | v_3AC = param_list[11] 859 | v_3A8 = param_list[10] 860 | R9 = param_list[12] 861 | R10 = param_list[13] 862 | R5 = param_list[9] 863 | R8 = param_list[8] 864 | R4 = param_list[15] 865 | R6 = param_list[14] 866 | for index in range(10): 867 | v_384 = R5 868 | R3 = self.rodata[0x10 * index] 869 | R1 = self.rodata[0x10 * index + 2] 870 | R2 = self.rodata[0x10 * index + 1] 871 | R3 = self.ADDS(R3, R6) 872 | 873 | R6 = self.check(R8) >> 14 874 | 875 | v_390 = R1 876 | R6 = R6 | self.check(R5) << 18 877 | 878 | R1 = self.rodata[0x10 * index + 3] 879 | R0 = self.rodata[0x10 * index + 4] 880 | v_36C = R0 881 | R0 = self.ADC(R2, R4) 882 | R2 = self.LSRS(R5, 0x12) 883 | R4 = self.LSRS(R5, 0xE) 884 | R2 = R2 | self.check(R8) << 14 885 | R4 = R4 | self.check(R8) << 18 886 | R2 = self.EORS(R2, R4) 887 | R4 = self.LSLS(R5, 0x17) 888 | R4 = R4 | self.check(R8) >> 9 889 | v_38C = R1 890 | R2 = self.EORS(R2, R4) 891 | R4 = self.check(R8) >> 18 892 | R4 = R4 | self.check(R5) << 14 893 | R6 = self.EORS(R6, R4) 894 | R4 = self.LSRS(R5, 9) 895 | R4 = R4 | self.check(R8) << 23 896 | v_354 = R8 897 | R6 = self.EORS(R6, R4) 898 | R3 = self.ADDS(R3, R6) 899 | R0 = self.ADCS(R0, R2) 900 | R2 = list_3B8[0x10 * index + 1] 901 | R2 = self.ADDS(R2, R3) 902 | R3 = list_3B8[0x10 * index + 3] 903 | R6 = list_3B8[0x10 * index] 904 | v_358 = R10 905 | R6 = self.ADCS(R6, R0) 906 | R0 = v_3AC 907 | v_360 = R3 908 | R0 = R0 ^ R10 909 | R3 = list_3B8[0x10 * index + 2] 910 | R0 = self.ANDS(R0, R5) 911 | R1 = list_3B8[0x10 * index + 5] 912 | R4 = R0 ^ R10 913 | R0 = v_3A8 914 | v_364 = R1 915 | R0 = R0 ^ R9 916 | R1 = v_374 917 | R0 = R0 & R8 918 | R8 = v_39C 919 | R0 = R0 ^ R9 920 | v_35C = R3 921 | R10 = self.ADDS(R2, R0) 922 | R0 = v_398 923 | R11 = self.ADC(R6, R4) 924 | R3 = v_378 925 | R2 = R0 | R12 926 | R6 = R0 & R12 927 | R2 = self.ANDS(R2, R1) 928 | R1 = R0 929 | R2 = self.ORRS(R2, R6) 930 | R6 = R8 | LR 931 | R6 = self.ANDS(R6, R3) 932 | R3 = R8 & LR 933 | R3 = self.ORRS(R3, R6) 934 | R6 = self.check(R12) << 30 935 | R0 = self.check(R12) >> 28 936 | R6 = R6 | self.check(LR) >> 2 937 | R0 = R0 | self.check(LR) << 4 938 | R4 = self.check(LR) >> 28 939 | R0 = self.EORS(R0, R6) 940 | R6 = self.check(R12) << 25 941 | R6 = R6 | self.check(LR) >> 7 942 | R4 = R4 | self.check(R12) << 4 943 | R0 = self.EORS(R0, R6) 944 | R6 = self.check(R12) >> 2 945 | R6 = R6 | self.check(LR) << 30 946 | R3 = self.ADDS(R3, R10) 947 | R6 = R6 ^ R4 948 | R4 = self.check(R12) >> 7 949 | R4 = R4 | self.check(LR) << 25 950 | R2 = self.ADC(R2, R11) 951 | R6 = self.EORS(R6, R4) 952 | v_37C = R12 953 | R5 = self.ADDS(R3, R6) 954 | R6 = self.ADC(R2, R0) 955 | R0 = R6 | R12 956 | R2 = R6 & R12 957 | R0 = self.ANDS(R0, R1) 958 | R3 = self.LSRS(R6, 0x1C) 959 | R0 = self.ORRS(R0, R2) 960 | R2 = self.LSLS(R6, 0x1E) 961 | R2 = R2 | self.check(R5) >> 2 962 | R3 = R3 | self.check(R5) << 4 963 | R2 = self.EORS(R2, R3) 964 | R3 = self.LSLS(R6, 0x19) 965 | R3 = R3 | self.check(R5) >> 7 966 | R4 = self.LSRS(R5, 0x1C) 967 | R3 = self.EORS(R3, R2) 968 | R2 = self.LSRS(R6, 2) 969 | R2 = R2 | self.check(R5) << 30 970 | R4 = R4 | self.check(R6) << 4 971 | R2 = self.EORS(R2, R4) 972 | R4 = self.LSRS(R6, 7) 973 | R4 = R4 | self.check(R5) << 25 974 | R12 = R6 975 | R2 = self.EORS(R2, R4) 976 | R4 = R5 | LR 977 | R4 = R4 & R8 978 | R6 = R5 & LR 979 | R4 = self.ORRS(R4, R6) 980 | v_388 = R5 981 | R5 = self.ADDS(R2, R4) 982 | R0 = self.ADCS(R0, R3) 983 | v_398 = R1 984 | R4 = R9 985 | v_350 = R0 986 | R0 = v_3A4 987 | R1 = v_3A0 988 | v_380 = LR 989 | LR = self.ADDS(R0, R10) 990 | R9 = self.ADC(R1, R11) 991 | R0 = v_3AC 992 | R6 = self.check(LR) >> 14 993 | R1 = v_384 994 | R3 = self.check(R9) >> 18 995 | R2 = self.check(R9) >> 14 996 | R3 = R3 | self.check(LR) << 14 997 | R2 = R2 | self.check(LR) << 18 998 | R2 = self.EORS(R2, R3) 999 | R3 = self.check(R9) << 23 1000 | R3 = R3 | self.check(LR) >> 9 1001 | R6 = R6 | self.check(R9) << 18 1002 | R2 = self.EORS(R2, R3) 1003 | R3 = self.check(LR) >> 18 1004 | R3 = R3 | self.check(R9) << 14 1005 | v_39C = R8 1006 | R3 = self.EORS(R3, R6) 1007 | R6 = self.check(R9) >> 9 1008 | R6 = R6 | self.check(LR) << 23 1009 | R8 = v_354 1010 | R3 = self.EORS(R3, R6) 1011 | R6 = R0 ^ R1 1012 | R6 = R6 & R9 1013 | v_370 = R12 1014 | R6 = self.EORS(R6, R0) 1015 | R0 = v_3A8 1016 | R1 = R0 ^ R8 1017 | R1 = R1 & LR 1018 | R1 = self.EORS(R1, R0) 1019 | R0 = v_358 1020 | R1 = self.ADDS(R1, R4) 1021 | R6 = self.ADCS(R6, R0) 1022 | R0 = v_390 1023 | R1 = self.ADDS(R1, R0) 1024 | R0 = v_38C 1025 | R6 = self.ADCS(R6, R0) 1026 | R0 = v_360 1027 | R1 = self.ADDS(R1, R0) 1028 | R0 = v_35C 1029 | R6 = self.ADCS(R6, R0) 1030 | R1 = self.ADDS(R1, R3) 1031 | R3 = self.ADC(R6, R2) 1032 | R2 = v_350 1033 | R0 = self.ADDS(R5, R1) 1034 | R5 = v_37C 1035 | R4 = self.ADC(R2, R3) 1036 | v_390 = R4 1037 | R2 = R4 | R12 1038 | R6 = R4 & R12 1039 | R2 = self.ANDS(R2, R5) 1040 | R5 = self.LSRS(R4, 0x1C) 1041 | R10 = R2 | R6 1042 | R2 = self.LSLS(R4, 0x1E) 1043 | R2 = R2 | self.check(R0) >> 2 1044 | R5 = R5 | self.check(R0) << 4 1045 | R2 = self.EORS(R2, R5) 1046 | R5 = self.LSLS(R4, 0x19) 1047 | R5 = R5 | self.check(R0) >> 7 1048 | R6 = self.LSRS(R0, 0x1C) 1049 | R12 = R2 ^ R5 1050 | R2 = self.LSRS(R4, 2) 1051 | R2 = R2 | self.check(R0) << 30 1052 | R6 = R6 | self.check(R4) << 4 1053 | R2 = self.EORS(R2, R6) 1054 | R6 = self.LSRS(R4, 7) 1055 | R4 = v_388 1056 | R6 = R6 | self.check(R0) << 25 1057 | R5 = v_380 1058 | R2 = self.EORS(R2, R6) 1059 | R6 = R0 | R4 1060 | R4 = self.ANDS(R4, R0) 1061 | R6 = self.ANDS(R6, R5) 1062 | v_38C = R0 1063 | R4 = self.ORRS(R4, R6) 1064 | R6 = LR ^ R8 1065 | R0 = self.ADDS(R2, R4) 1066 | v_3A4 = R0 1067 | R0 = self.ADC(R12, R10) 1068 | v_3A0 = R0 1069 | R0 = v_378 1070 | R10 = self.ADDS(R1, R0) 1071 | R0 = v_374 1072 | R6 = R6 & R10 1073 | R1 = self.ADC(R3, R0) 1074 | R5 = self.check(R10) >> 14 1075 | R0 = v_384 1076 | R6 = R6 ^ R8 1077 | R3 = self.LSRS(R1, 0x12) 1078 | R4 = self.LSRS(R1, 0xE) 1079 | R3 = R3 | self.check(R10) << 14 1080 | R4 = R4 | self.check(R10) << 18 1081 | R3 = self.EORS(R3, R4) 1082 | R4 = self.LSLS(R1, 0x17) 1083 | R4 = R4 | self.check(R10) >> 9 1084 | R5 = R5 | self.check(R1) << 18 1085 | R11 = R3 ^ R4 1086 | R3 = self.check(R10) >> 18 1087 | R3 = R3 | self.check(R1) << 14 1088 | v_378 = R1 1089 | R3 = self.EORS(R3, R5) 1090 | R5 = self.LSRS(R1, 9) 1091 | R5 = R5 | self.check(R10) << 23 1092 | R3 = self.EORS(R3, R5) 1093 | R5 = R9 ^ R0 1094 | R5 = self.ANDS(R5, R1) 1095 | R1 = v_3A8 1096 | R5 = self.EORS(R5, R0) 1097 | R0 = v_36C 1098 | R4 = self.ADDS(R0, R1) 1099 | R2 = self.rodata[0x10 * index + 5] 1100 | R0 = v_3AC 1101 | R2 = self.ADCS(R2, R0) 1102 | R0 = v_364 1103 | R4 = self.ADDS(R4, R0) 1104 | R12 = list_3B8[0x10 * index + 4] 1105 | R0 = v_3A4 1106 | R2 = self.ADC(R2, R12) 1107 | R6 = self.ADDS(R6, R4) 1108 | R2 = self.ADCS(R2, R5) 1109 | R3 = self.ADDS(R3, R6) 1110 | R11 = self.ADC(R11, R2) 1111 | R1 = self.ADDS(R0, R3) 1112 | R0 = v_3A0 1113 | R6 = v_390 1114 | R4 = self.check(R1) >> 28 1115 | R0 = self.ADC(R0, R11) 1116 | R5 = v_370 1117 | R2 = R0 | R6 1118 | R6 = self.ANDS(R6, R0) 1119 | R2 = self.ANDS(R2, R5) 1120 | R5 = self.LSRS(R0, 0x1C) 1121 | R12 = R2 | R6 1122 | R6 = self.LSLS(R0, 0x1E) 1123 | R6 = R6 | self.check(R1) >> 2 1124 | R5 = R5 | self.check(R1) << 4 1125 | R6 = self.EORS(R6, R5) 1126 | R5 = self.LSLS(R0, 0x19) 1127 | R5 = R5 | self.check(R1) >> 7 1128 | R4 = R4 | self.check(R0) << 4 1129 | R6 = self.EORS(R6, R5) 1130 | R5 = self.LSRS(R0, 2) 1131 | R5 = R5 | self.check(R1) << 30 1132 | v_3AC = R0 1133 | R5 = self.EORS(R5, R4) 1134 | R4 = self.LSRS(R0, 7) 1135 | R0 = v_38C 1136 | R4 = R4 | self.check(R1) << 25 1137 | R2 = v_388 1138 | R5 = self.EORS(R5, R4) 1139 | R4 = R1 | R0 1140 | v_3A8 = R1 1141 | R4 = self.ANDS(R4, R2) 1142 | R2 = R1 & R0 1143 | R2 = self.ORRS(R2, R4) 1144 | R0 = self.ADDS(R5, R2) 1145 | v_3A4 = R0 1146 | R0 = self.ADC(R6, R12) 1147 | v_3A0 = R0 1148 | R0 = v_39C 1149 | R2 = v_398 1150 | R0 = self.ADDS(R0, R3) 1151 | v_39C = R0 1152 | R11 = self.ADC(R11, R2) 1153 | R4 = self.LSRS(R0, 0xE) 1154 | R3 = self.check(R11) >> 18 1155 | R6 = self.check(R11) >> 14 1156 | R3 = R3 | self.check(R0) << 14 1157 | R6 = R6 | self.check(R0) << 18 1158 | R3 = self.EORS(R3, R6) 1159 | R6 = self.check(R11) << 23 1160 | R6 = R6 | self.check(R0) >> 9 1161 | R4 = R4 | self.check(R11) << 18 1162 | R1 = self.EORS(R3, R6) 1163 | R6 = self.LSRS(R0, 0x12) 1164 | R6 = R6 | self.check(R11) << 14 1165 | R3 = R10 ^ LR 1166 | R6 = self.EORS(R6, R4) 1167 | R4 = self.check(R11) >> 9 1168 | R3 = self.ANDS(R3, R0) 1169 | R4 = R4 | self.check(R0) << 23 1170 | R5 = R6 ^ R4 1171 | v_398 = R1 1172 | R3 = R3 ^ LR 1173 | R1 = v_378 1174 | R6 = self.rodata[0x10 * index + 6] 1175 | R12 = self.rodata[0x10 * index + 7] 1176 | R4 = R1 ^ R9 1177 | R0 = v_384 1178 | R6 = self.ADDS(R6, R8) 1179 | R4 = R4 & R11 1180 | R12 = self.ADC(R12, R0) 1181 | R4 = R4 ^ R9 1182 | R8 = list_3B8[0x10 * index + 7] 1183 | R2 = list_3B8[0x10 * index + 6] 1184 | R6 = self.ADDS(R6, R8) 1185 | R0 = v_398 1186 | R2 = self.ADC(R2, R12) 1187 | R3 = self.ADDS(R3, R6) 1188 | R2 = self.ADCS(R2, R4) 1189 | R6 = self.ADDS(R3, R5) 1190 | R12 = self.ADC(R2, R0) 1191 | R0 = v_3A4 1192 | R4 = v_390 1193 | R1 = self.ADDS(R0, R6) 1194 | R0 = v_3A0 1195 | v_384 = R1 1196 | R5 = self.ADC(R0, R12) 1197 | R0 = v_3AC 1198 | R8 = self.check(R1) >> 28 1199 | R2 = R5 | R0 1200 | R3 = R8 | self.check(R5) << 4 1201 | R2 = self.ANDS(R2, R4) 1202 | R4 = R5 & R0 1203 | R0 = R2 | R4 1204 | R4 = self.LSLS(R5, 0x1E) 1205 | R2 = self.LSRS(R5, 0x1C) 1206 | R4 = R4 | self.check(R1) >> 2 1207 | R2 = R2 | self.check(R1) << 4 1208 | v_3A0 = R0 1209 | R2 = self.EORS(R2, R4) 1210 | R4 = self.LSLS(R5, 0x19) 1211 | R4 = R4 | self.check(R1) >> 7 1212 | R0 = v_3A8 1213 | R2 = self.EORS(R2, R4) 1214 | R4 = self.LSRS(R5, 2) 1215 | R4 = R4 | self.check(R1) << 30 1216 | R8 = R5 1217 | R3 = self.EORS(R3, R4) 1218 | R4 = self.LSRS(R5, 7) 1219 | R4 = R4 | self.check(R1) << 25 1220 | R5 = v_38C 1221 | R3 = self.EORS(R3, R4) 1222 | R4 = R1 | R0 1223 | R4 = self.ANDS(R4, R5) 1224 | R5 = R1 & R0 1225 | R4 = self.ORRS(R4, R5) 1226 | v_36C = R8 1227 | R0 = self.ADDS(R3, R4) 1228 | v_3A4 = R0 1229 | R0 = v_3A0 1230 | R0 = self.ADCS(R0, R2) 1231 | v_3A0 = R0 1232 | R0 = v_380 1233 | R2 = v_37C 1234 | R0 = self.ADDS(R0, R6) 1235 | R5 = self.ADC(R12, R2) 1236 | v_37C = R5 1237 | R4 = self.LSRS(R0, 0xE) 1238 | v_380 = R0 1239 | R2 = self.LSRS(R5, 0x12) 1240 | R3 = self.LSRS(R5, 0xE) 1241 | R2 = R2 | self.check(R0) << 14 1242 | R3 = R3 | self.check(R0) << 18 1243 | R2 = self.EORS(R2, R3) 1244 | R3 = self.LSLS(R5, 0x17) 1245 | R3 = R3 | self.check(R0) >> 9 1246 | R4 = R4 | self.check(R5) << 18 1247 | R1 = R2 ^ R3 1248 | R3 = self.LSRS(R0, 0x12) 1249 | R3 = R3 | self.check(R5) << 14 1250 | v_398 = R1 1251 | R3 = self.EORS(R3, R4) 1252 | R4 = self.LSRS(R5, 9) 1253 | R1 = v_378 1254 | R4 = R4 | self.check(R0) << 23 1255 | R12 = R3 ^ R4 1256 | R3 = list_3B8[0x10 * index + 9] 1257 | R4 = R11 ^ R1 1258 | R4 = self.ANDS(R4, R5) 1259 | R4 = self.EORS(R4, R1) 1260 | R1 = v_39C 1261 | R5 = R1 ^ R10 1262 | R5 = self.ANDS(R5, R0) 1263 | R5 = R5 ^ R10 1264 | R2 = self.rodata[0x10 * index + 8] 1265 | R0 = self.ADDS(R2, LR) 1266 | R2 = self.rodata[0x10 * index + 9] 1267 | R2 = self.ADC(R2, R9) 1268 | R0 = self.ADDS(R0, R3) 1269 | R3 = list_3B8[0x10 * index + 8] 1270 | R2 = self.ADCS(R2, R3) 1271 | R0 = self.ADDS(R0, R5) 1272 | R2 = self.ADCS(R2, R4) 1273 | R1 = self.ADDS(R0, R12) 1274 | R0 = v_398 1275 | R3 = v_3AC 1276 | R4 = self.ADC(R2, R0) 1277 | R0 = v_3A4 1278 | R6 = self.ADDS(R0, R1) 1279 | R0 = v_3A0 1280 | v_3A4 = R6 1281 | R0 = self.ADCS(R0, R4) 1282 | v_3A0 = R0 1283 | R2 = R0 | R8 1284 | R2 = self.ANDS(R2, R3) 1285 | R3 = R0 & R8 1286 | LR = R2 | R3 1287 | R8 = R6 1288 | R3 = self.LSLS(R0, 0x1E) 1289 | R5 = self.LSRS(R0, 0x1C) 1290 | R3 = R3 | self.check(R8) >> 2 1291 | R5 = R5 | self.check(R8) << 4 1292 | R3 = self.EORS(R3, R5) 1293 | R5 = self.LSLS(R0, 0x19) 1294 | R5 = R5 | self.check(R8) >> 7 1295 | R2 = self.check(R8) >> 28 1296 | R12 = R3 ^ R5 1297 | R5 = self.LSRS(R0, 2) 1298 | R5 = R5 | self.check(R8) << 30 1299 | R2 = R2 | self.check(R0) << 4 1300 | R2 = self.EORS(R2, R5) 1301 | R5 = self.LSRS(R0, 7) 1302 | R3 = v_384 1303 | R5 = R5 | self.check(R8) << 25 1304 | R6 = v_3A8 1305 | R2 = self.EORS(R2, R5) 1306 | R5 = R8 | R3 1307 | R5 = self.ANDS(R5, R6) 1308 | R6 = R8 & R3 1309 | R5 = self.ORRS(R5, R6) 1310 | R0 = self.ADDS(R2, R5) 1311 | v_398 = R0 1312 | R2 = v_388 1313 | R12 = self.ADC(R12, LR) 1314 | R0 = v_370 1315 | R3 = self.ADDS(R1, R2) 1316 | R1 = v_380 1317 | R8 = self.ADC(R4, R0) 1318 | R0 = R3 1319 | R2 = self.check(R8) >> 18 1320 | R3 = self.check(R8) >> 14 1321 | R2 = R2 | self.check(R0) << 14 1322 | R3 = R3 | self.check(R0) << 18 1323 | R2 = self.EORS(R2, R3) 1324 | R3 = self.check(R8) << 23 1325 | R3 = R3 | self.check(R0) >> 9 1326 | R4 = self.LSRS(R0, 0xE) 1327 | LR = R2 ^ R3 1328 | R3 = self.LSRS(R0, 0x12) 1329 | R3 = R3 | self.check(R8) << 14 1330 | R4 = R4 | self.check(R8) << 18 1331 | R3 = self.EORS(R3, R4) 1332 | R4 = self.check(R8) >> 9 1333 | R4 = R4 | self.check(R0) << 23 1334 | R2 = R0 1335 | R0 = v_37C 1336 | R3 = self.EORS(R3, R4) 1337 | v_388 = R2 1338 | R4 = R0 ^ R11 1339 | R0 = v_39C 1340 | R4 = R4 & R8 1341 | R5 = R1 ^ R0 1342 | R4 = R4 ^ R11 1343 | R5 = self.ANDS(R5, R2) 1344 | R5 = self.EORS(R5, R0) 1345 | R6 = self.rodata[0x10 * index + 10] 1346 | R1 = self.ADDS(R6, R10) 1347 | R6 = self.rodata[0x10 * index + 11] 1348 | R0 = v_378 1349 | R6 = self.ADCS(R6, R0) 1350 | R2 = list_3B8[0x10 * index + 11] 1351 | R1 = self.ADDS(R1, R2) 1352 | R2 = list_3B8[0x10 * index + 10] 1353 | R0 = v_398 1354 | R2 = self.ADCS(R2, R6) 1355 | R1 = self.ADDS(R1, R5) 1356 | R2 = self.ADCS(R2, R4) 1357 | R1 = self.ADDS(R1, R3) 1358 | R4 = self.ADC(R2, LR) 1359 | R6 = v_3A0 1360 | R0 = self.ADDS(R0, R1) 1361 | R9 = self.ADC(R12, R4) 1362 | R3 = v_36C 1363 | R2 = R9 | R6 1364 | R5 = self.check(R9) >> 28 1365 | v_374 = R9 1366 | R2 = self.ANDS(R2, R3) 1367 | R3 = R9 & R6 1368 | R10 = R2 | R3 1369 | R3 = self.check(R9) << 30 1370 | R3 = R3 | self.check(R0) >> 2 1371 | R5 = R5 | self.check(R0) << 4 1372 | R3 = self.EORS(R3, R5) 1373 | R5 = self.check(R9) << 25 1374 | R5 = R5 | self.check(R0) >> 7 1375 | R6 = self.LSRS(R0, 0x1C) 1376 | R12 = R3 ^ R5 1377 | R5 = self.check(R9) >> 2 1378 | R5 = R5 | self.check(R0) << 30 1379 | R6 = R6 | self.check(R9) << 4 1380 | R5 = self.EORS(R5, R6) 1381 | R6 = self.check(R9) >> 7 1382 | R3 = v_3A4 1383 | R6 = R6 | self.check(R0) << 25 1384 | R2 = v_384 1385 | R5 = self.EORS(R5, R6) 1386 | R6 = R0 | R3 1387 | R6 = self.ANDS(R6, R2) 1388 | R2 = R0 & R3 1389 | R2 = R2 | R6 1390 | R2 = self.ADDS(R2, R5) 1391 | v_398 = R2 1392 | R2 = self.ADC(R12, R10) 1393 | v_378 = R2 1394 | R2 = v_38C 1395 | R12 = self.ADDS(R1, R2) 1396 | R1 = v_390 1397 | LR = self.ADC(R4, R1) 1398 | R4 = self.check(R12) >> 14 1399 | R1 = self.check(LR) >> 18 1400 | R2 = self.check(LR) >> 14 1401 | R1 = R1 | self.check(R12) << 14 1402 | R2 = R2 | self.check(R12) << 18 1403 | R1 = self.EORS(R1, R2) 1404 | R2 = self.check(LR) << 23 1405 | R2 = R2 | self.check(R12) >> 9 1406 | R4 = R4 | self.check(LR) << 18 1407 | R1 = self.EORS(R1, R2) 1408 | R2 = self.check(R12) >> 18 1409 | R2 = R2 | self.check(LR) << 14 1410 | v_390 = R1 1411 | R2 = self.EORS(R2, R4) 1412 | R4 = self.check(LR) >> 9 1413 | R1 = v_37C 1414 | R4 = R4 | self.check(R12) << 23 1415 | R10 = R2 ^ R4 1416 | R2 = v_388 1417 | R4 = R8 ^ R1 1418 | R4 = R4 & LR 1419 | R4 = self.EORS(R4, R1) 1420 | R1 = v_380 1421 | R5 = R2 ^ R1 1422 | R2 = v_39C 1423 | R5 = R5 & R12 1424 | R5 = self.EORS(R5, R1) 1425 | R6 = self.rodata[0x10 * index + 12] 1426 | R3 = self.rodata[0x10 * index + 13] 1427 | R6 = self.ADDS(R6, R2) 1428 | R3 = self.ADC(R3, R11) 1429 | R1 = list_3B8[0x10 * index + 13] 1430 | R1 = self.ADDS(R1, R6) 1431 | R6 = list_3B8[0x10 * index + 12] 1432 | R3 = self.ADCS(R3, R6) 1433 | R1 = self.ADDS(R1, R5) 1434 | R3 = self.ADCS(R3, R4) 1435 | R5 = self.ADDS(R1, R10) 1436 | R1 = v_390 1437 | R2 = self.ADC(R3, R1) 1438 | R1 = v_398 1439 | R3 = v_3A0 1440 | R10 = self.ADDS(R1, R5) 1441 | R1 = v_378 1442 | v_378 = R0 1443 | R11 = self.ADC(R1, R2) 1444 | R6 = self.check(R10) >> 28 1445 | R1 = R11 | R9 1446 | v_398 = R11 1447 | R1 = self.ANDS(R1, R3) 1448 | R3 = R11 & R9 1449 | R9 = R1 | R3 1450 | R3 = self.check(R11) << 30 1451 | R4 = self.check(R11) >> 28 1452 | R3 = R3 | self.check(R10) >> 2 1453 | R4 = R4 | self.check(R10) << 4 1454 | R6 = R6 | self.check(R11) << 4 1455 | R3 = self.EORS(R3, R4) 1456 | R4 = self.check(R11) << 25 1457 | R4 = R4 | self.check(R10) >> 7 1458 | R1 = v_3A4 1459 | R3 = self.EORS(R3, R4) 1460 | R4 = self.check(R11) >> 2 1461 | R4 = R4 | self.check(R10) << 30 1462 | v_39C = R10 1463 | R4 = self.EORS(R4, R6) 1464 | R6 = self.check(R11) >> 7 1465 | R6 = R6 | self.check(R10) << 25 1466 | R4 = self.EORS(R4, R6) 1467 | R6 = R10 | R0 1468 | R6 = self.ANDS(R6, R1) 1469 | R1 = R10 & R0 1470 | R1 = self.ORRS(R1, R6) 1471 | R10 = LR 1472 | R0 = self.ADDS(R4, R1) 1473 | v_390 = R0 1474 | R0 = self.ADC(R3, R9) 1475 | v_38C = R0 1476 | R0 = v_3A8 1477 | R9 = R12 1478 | R4 = self.ADDS(R5, R0) 1479 | R0 = v_3AC 1480 | v_3A8 = R4 1481 | R0 = self.ADCS(R0, R2) 1482 | R3 = self.LSRS(R4, 0xE) 1483 | v_3AC = R0 1484 | R1 = self.LSRS(R0, 0x12) 1485 | R2 = self.LSRS(R0, 0xE) 1486 | R1 = R1 | self.check(R4) << 14 1487 | R2 = R2 | self.check(R4) << 18 1488 | R1 = self.EORS(R1, R2) 1489 | R2 = self.LSLS(R0, 0x17) 1490 | R2 = R2 | self.check(R4) >> 9 1491 | R3 = R3 | self.check(R0) << 18 1492 | R11 = R1 ^ R2 1493 | R2 = self.LSRS(R4, 0x12) 1494 | R2 = R2 | self.check(R0) << 14 1495 | R2 = self.EORS(R2, R3) 1496 | R3 = self.LSRS(R0, 9) 1497 | R3 = R3 | self.check(R4) << 23 1498 | R2 = self.EORS(R2, R3) 1499 | R3 = LR ^ R8 1500 | R3 = self.ANDS(R3, R0) 1501 | R0 = v_388 1502 | LR = R3 ^ R8 1503 | R5 = R12 ^ R0 1504 | R5 = self.ANDS(R5, R4) 1505 | R3 = R0 1506 | R5 = self.EORS(R5, R0) 1507 | R4 = self.rodata[0x10 * index + 14] 1508 | R6 = self.rodata[0x10 * index + 15] 1509 | R0 = v_380 1510 | R4 = self.ADDS(R4, R0) 1511 | R0 = v_37C 1512 | R6 = self.ADCS(R6, R0) 1513 | R0 = list_3B8[0x10 * index + 14] 1514 | R1 = list_3B8[0x10 * index + 15] 1515 | R1 = self.ADDS(R1, R4) 1516 | R0 = self.ADCS(R0, R6) 1517 | R1 = self.ADDS(R1, R5) 1518 | R0 = self.ADC(R0, LR) 1519 | R1 = self.ADDS(R1, R2) 1520 | R2 = v_390 1521 | R0 = self.ADC(R0, R11) 1522 | R4 = R8 1523 | LR = self.ADDS(R2, R1) 1524 | R2 = v_38C 1525 | R6 = R3 1526 | R12 = self.ADC(R2, R0) 1527 | R2 = v_384 1528 | R8 = self.ADDS(R1, R2) 1529 | R2 = v_36C 1530 | R5 = self.ADC(R0, R2) 1531 | 1532 | list_638 = [ 1533 | self.check(LR), self.check(R12), self.check(v_39C), self.check(v_398), 1534 | self.check(v_378), self.check(v_374), self.check(v_3A4), self.check(v_3A0), 1535 | self.check(R8), self.check(R5), self.check(v_3A8), self.check(v_3AC), 1536 | self.check(R9), self.check(R10), self.check(R6), self.check(R4), 1537 | ] 1538 | 1539 | for i in range(8): 1540 | R0 = param_list[2 * i] 1541 | R1 = param_list[2 * i + 1] 1542 | R0 = self.ADDS(R0, list_638[2 * i]) 1543 | R1 = self.ADCS(R1, list_638[2 * i + 1]) 1544 | param_list[2 * i] = R0 1545 | param_list[2 * i + 1] = R1 1546 | return param_list 1547 | 1548 | def hex_C52(self, list_6B0): 1549 | list_8D8 = [] 1550 | for i in range(8): 1551 | tmp = self.hex_list([list_6B0[2 * i + 1], list_6B0[2 * i]]) 1552 | list_8D8 = list_8D8 + tmp 1553 | return list_8D8 1554 | 1555 | def toHex(self, num): 1556 | return format(int(num), "x") 1557 | 1558 | def check(self, tmp): 1559 | ss = "" 1560 | if tmp < 0: 1561 | ss = self.toHex(4294967296 + int(tmp)) 1562 | else: 1563 | ss = self.toHex(tmp) 1564 | if len(ss) > 8: 1565 | size = len(ss) 1566 | start = size - 8 1567 | ss = ss[start:] 1568 | tmp = int(self.parseLong(ss, 10, 16)) 1569 | return tmp # 3035769959 1570 | 1571 | def ADDS(self, a, b): 1572 | c = self.check(a) + self.check(b) 1573 | if len(self.toHex(c)) > 8: 1574 | self.CF = 1 1575 | else: 1576 | self.CF = 0 1577 | result = self.check(c) 1578 | return result 1579 | 1580 | def ANDS(self, a, b): 1581 | return self.check(a & b) 1582 | 1583 | def EORS(self, a, b): 1584 | return (self.check(a ^ b)) 1585 | 1586 | def ADC(self, a, b): 1587 | 1588 | c = self.check(a) + self.check(b) 1589 | d = self.check(c + self.CF) 1590 | return d 1591 | 1592 | def ADCS(self, a, b): 1593 | c = self.check(a) + self.check(b) 1594 | d = self.check(c + self.CF) 1595 | if len(self.toHex(c)) > 8: 1596 | self.CF = 1 1597 | else: 1598 | self.CF = 0 1599 | return d 1600 | 1601 | def LSLS(self, num, k): 1602 | result = self.bin_type(num) 1603 | self.CF = result[k - 1] 1604 | return self.check(self.check(num) << k) 1605 | 1606 | def LSRS(self, num, k): 1607 | result = self.bin_type(num) 1608 | self.CF = result[len(result) - k] 1609 | return self.check(self.check(num) >> k) 1610 | 1611 | def ORRS(self, a, b): 1612 | return self.check(a | b) 1613 | 1614 | def RRX(self, num): 1615 | result = self.bin_type(num) 1616 | lenght = len(result) 1617 | s = str(self.CF) + result[:lenght - 1 - 0] 1618 | return self.parseLong(s, 10, 2) 1619 | 1620 | def bin_type(self, num): 1621 | result = "" 1622 | num = self.check(num) 1623 | lst = self.toBinaryString(num) 1624 | for i in range(32): 1625 | if i < len(lst): 1626 | result += str(lst[i]) 1627 | else: 1628 | result = "0" + result 1629 | return result 1630 | 1631 | def UBFX(self, num, lsb, width): 1632 | tmp_string = self.toBinaryString(num) 1633 | while len(tmp_string) < 32: 1634 | tmp_string = "0" + tmp_string 1635 | lens = len(tmp_string) 1636 | start = lens - lsb - width 1637 | end = start - lsb 1638 | a = int(self.parseLong(tmp_string[start:end - start], 10, 2)) 1639 | 1640 | return int(self.parseLong(tmp_string[start:end - start], 10, 2)) 1641 | 1642 | def UFTX(self, num): 1643 | tmp_string = self.toBinaryString(num) 1644 | start = len(tmp_string) - 8 1645 | return self.parseLong(tmp_string[start:], 10, 2) 1646 | 1647 | def toBinaryString(self, num): 1648 | return "{0:b}".format(num) 1649 | 1650 | def setData(self, data): 1651 | self.__content_raw = data 1652 | self.__content = data 1653 | self.list_9C8 = self.hex_9C8() 1654 | 1655 | def hex_9C8(self): 1656 | result = [] 1657 | for i in range(32): 1658 | result.append(self.chooice(0, 0x100)) 1659 | return result 1660 | 1661 | def chooice(self, start, end): 1662 | return int(random.uniform(0, 1) * (end + 1 - start) + start) 1663 | 1664 | def s2b(self, data): 1665 | arr = [] 1666 | for i in range(len(data)): 1667 | arr.append(data[i]) 1668 | return arr 1669 | 1670 | def hex_list(self, content): 1671 | result = [] 1672 | for value in content: 1673 | tmp = self.toHex(value) 1674 | while len(tmp) < 8: 1675 | tmp = "0" + tmp 1676 | for i in range(4): 1677 | start = 2 * i 1678 | end = 2 * i + 2 1679 | ss = tmp[start:end] 1680 | result.append(int(self.parseLong(ss, 10, 16))) 1681 | return result 1682 | 1683 | def parseLong(self, num, to_base=10, from_base=10): 1684 | if isinstance(num, str): 1685 | n = int(num, from_base) 1686 | else: 1687 | n = int(num) 1688 | alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 1689 | if n < to_base: 1690 | return alphabet[n] 1691 | else: 1692 | return self.parseLong(n // to_base, to_base) + alphabet[n % to_base] 1693 | 1694 | def byteArray2str(self, b): 1695 | return (binascii.hexlify(bytes(b)).decode()) 1696 | 1697 | def changeByteArrayToLong(self, bytes): 1698 | result = [] 1699 | for byte in bytes: 1700 | if byte < 0: 1701 | result.append(byte + 256) 1702 | else: 1703 | result.append(byte) 1704 | return result 1705 | -------------------------------------------------------------------------------- /STikTok/utilities.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import json 3 | 4 | from pystyle import Col 5 | from .ttencrypt import TTEncrypt 6 | from .xlog import XLEncrypt 7 | from .gorgon import Gorgon 8 | 9 | class Utils: 10 | @staticmethod 11 | def _xor(string): 12 | encrypted = [hex(ord(c) ^ 5)[2:] for c in string] 13 | return "".join(encrypted) 14 | 15 | @staticmethod 16 | def _sig(params: str, body: str = None, cookie: str = None) -> dict: 17 | gorgon = Gorgon() 18 | return gorgon.calculate(params, cookie, body) 19 | 20 | @staticmethod 21 | def _ttencrypt(body: dict) -> str: 22 | ttencrypt = TTEncrypt() 23 | data_formated = json.dumps(body).replace(" ", "") 24 | return ttencrypt.encrypt(data_formated) 25 | 26 | @staticmethod 27 | def _xlencrypt(body: str) -> str: 28 | return XLEncrypt().encrypt(body) 29 | 30 | @staticmethod 31 | def _fch(xlog: str): 32 | xlog = xlog[0:len(xlog) - 21] 33 | fch_str = binascii.crc32(xlog.encode("utf-8")) 34 | fch_str = str(fch_str) 35 | 36 | for i in range(len(fch_str), 10): 37 | fch_str = '0' + fch_str 38 | 39 | return fch_str 40 | 41 | @staticmethod 42 | def sprint(x: str, num: int, msg: str) -> None: 43 | return ' %s{%s%s%s}%s %s %s[%s%s%s]%s' % ( 44 | Col.purple, Col.reset, 45 | x, 46 | Col.purple, Col.reset, 47 | num, 48 | Col.blue, Col.reset, 49 | msg, 50 | Col.blue, Col.reset 51 | ) -------------------------------------------------------------------------------- /STikTok/xlog.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import codecs 3 | import ctypes 4 | import json 5 | import struct 6 | 7 | 8 | class XLEncrypt: 9 | def encrypt(self, inputStart): 10 | inputStart = list(inputStart.encode()) 11 | sourceLen = len(inputStart) 12 | 13 | fillCount = 4 - sourceLen % 4 14 | 15 | fillNum = 8 - sourceLen % 8 16 | 17 | if fillNum == 8: 18 | fillNum = 0 19 | 20 | bytes = [] 21 | for i in range(sourceLen + fillNum + 8): 22 | bytes.append(0) 23 | eorByte = [0x78, 0x46, 0x8e, 0xc4, 0x74, 0x4c, 0x00, 0x00] 24 | bytes[0] = 0x80 | fillNum - 256 25 | bytes[1] = 0x30 26 | bytes[2] = 0x22 27 | bytes[3] = 0x24 28 | 29 | result = "02" 30 | 31 | for i in range(len(inputStart)): 32 | bytes[fillCount + i] = inputStart[i] 33 | 34 | for i in range(len(bytes) // 8): 35 | 36 | sb = "" 37 | for j in range(8): 38 | 39 | r1 = bytes[j + 8 * i] 40 | 41 | r2 = eorByte[j] 42 | 43 | if r2 < 0: 44 | r2 = r2 + 256 45 | if r1 < 0: 46 | r1 = r1 + 256 47 | 48 | tmp = r1 ^ r2 49 | 50 | if tmp == 0: 51 | sb += "00" 52 | 53 | else: 54 | sb += self.hex2string(tmp) 55 | 56 | times = self.getHandleCount("78468ec4") 57 | s = self.calculateRev(sb, times) 58 | 59 | for z in range(8): 60 | substring = s[2 * z: 2 * z + 2] 61 | eorByte[z] = int(substring, 16); 62 | 63 | result += s 64 | 65 | result += "78468ec4" 66 | 67 | return result 68 | 69 | def decrypt(self, decode): 70 | s = decode[2:] 71 | strList = [] 72 | for i in range(int(len(s) / 16)): 73 | input = s[i * 16: i * 16 + 16] 74 | strList.append(input) 75 | last = s[(int(len(s) / 16) * 16):] 76 | strList.append(last) 77 | times = self.getHandleCount(last) 78 | _str = "" 79 | for i in range(len(strList) - 1): 80 | calculate = self.calculate(strList[i], times) 81 | 82 | if i == 0: 83 | tmp = last + "744c0000" 84 | for j in range(8): 85 | xor = self.xor(calculate[j * 2:j * 2 + 2], tmp[j * 2: j * 2 + 2]) 86 | if len(xor) < 2: 87 | xor = "0" + xor 88 | _str += xor 89 | if i >= 1: 90 | tmp = strList[i - 1] 91 | for j in range(8): 92 | xor = self.xor(calculate[j * 2:j * 2 + 2], tmp[j * 2: j * 2 + 2]) 93 | if len(xor) < 2: 94 | xor = "0" + xor 95 | _str += xor 96 | bytes = codecs.decode(_str, 'hex_codec') 97 | 98 | 99 | count = int(bytes[0]) & 7 100 | 101 | resultLen = (len(decode) // 2) - 13 - count 102 | count = count % 4 103 | if count == 0: 104 | count = 4 105 | result = bytearray(resultLen) 106 | for i in range(resultLen): 107 | result[i] = bytes[count + i] 108 | 109 | return result.decode() 110 | 111 | def calculate(self, input, times): 112 | if len(input) != 16: 113 | return "" 114 | s108 = ctypes.c_int(0xBFFFE920 << 0).value 115 | s136 = ctypes.c_int((0x9e3779b9 * times) << 0).value 116 | s140 = int(input[0:8], 16) << 0 & 0xFFFFFFFF 117 | s144 = int(input[8:16], 16) << 0 & 0xFFFFFFFF 118 | 119 | for i in range(times): 120 | r0 = s140 121 | r2 = s140 122 | r4 = s140 123 | r6 = s136 124 | r5 = s108 125 | s = format(self.rshift(r6 >> 0xb, 0) >> 0, 'b') 126 | if len(s) < 3: 127 | s = "0" 128 | else: 129 | s = s[len(s) - 2:] 130 | 131 | r6 = int(s, 2) 132 | r0 = ctypes.c_int(((self.rshift(r2, 5) ^ r0 << 4) + r4) << 0).value 133 | r5 = ctypes.c_int(self.getShifting(r5 + (r6 << 2))).value 134 | r6 = 0x61c88647 << 0 & 0xFFFFFFFF 135 | r2 = (s136 + r5) << 0 & 0xFFFFFFFF 136 | 137 | r5 = s136 138 | r0 = r0 ^ r2 139 | r2 = s108 140 | 141 | r6 = (r6 + r5) << 0 & 0xFFFFFFFF 142 | r4 = (s144 - r0) << 0 & 0xFFFFFFFF 143 | 144 | r5 = r6 & 3 145 | r0 = r4 << 4 146 | r2 = self.getShifting(r2 + (r5 << 2) & 0xFFFFFFFF) 147 | r0 = ((r0 ^ (self.rshift(r4, 5))) + r4) << 0 148 | r2 = (r2 + r6) << 0 & 0xFFFFFFFF 149 | r0 = r0 ^ r2 150 | s140 = (s140 - r0) << 0 & 0xFFFFFFFF 151 | s136 = r6 & 0xFFFFFFFF 152 | s144 = r4 & 0xFFFFFFFF 153 | str140 = format(self.rshift(s140, 0), 'x') 154 | 155 | str144 = format(self.rshift(s144, 0), 'x') 156 | 157 | if len(str140) < 8: 158 | count = 8 - len(str140) 159 | 160 | for i in range(count): 161 | str140 = "0" + str140 162 | 163 | if len(str144) < 8: 164 | count = 8 - len(str144) 165 | for i in range(count): 166 | str144 = "0" + str144 167 | 168 | return str140 + str144 169 | 170 | def xor(self, strHex_X, strHex_Y): 171 | anotherBinary = format(int(strHex_X, 16), 'b') 172 | thisBinary = format(int(strHex_Y, 16), 'b') 173 | result = "" 174 | if len(anotherBinary) != 8: 175 | for i in range(len(anotherBinary), 8): 176 | anotherBinary = "0" + anotherBinary 177 | 178 | if len(thisBinary) != 8: 179 | for i in range(len(thisBinary), 8): 180 | thisBinary = "0" + thisBinary 181 | for i in range(len(anotherBinary)): 182 | if thisBinary[i] == anotherBinary[i]: 183 | result += "0" 184 | else: 185 | result += "1" 186 | 187 | return format((int(result, 2)), 'x') 188 | 189 | def getHandleCount(self, hex): 190 | reverse = self.reverse(hex) 191 | r0 = 0xCCCCCCCD 192 | r1 = int(reverse, 16) 193 | r2 = self.getUmullHigh(r1, r0) 194 | r2 = ctypes.c_int(r2 >> 2).value 195 | r2 = r2 + ctypes.c_int((r2 << 2)).value 196 | r1 = r1 - r2 197 | r2 = 0x20 198 | r1 = r2 + ctypes.c_int(r1 << 3).value 199 | return r1 200 | 201 | def getShifting(self, point): 202 | p = ctypes.c_int(point << 0).value 203 | 204 | if p == ctypes.c_int(0xbfffe920 << 0).value: 205 | return ctypes.c_int(0x477001de << 0).value 206 | if p == ctypes.c_int(0xbfffe924 << 0).value: 207 | return ctypes.c_int(0xfacedead << 0).value 208 | if p == ctypes.c_int(0xbfffe928 << 0).value: 209 | return ctypes.c_int(0x30303030 << 0).value 210 | if p == ctypes.c_int(0xbfffe92c << 0).value: 211 | return ctypes.c_int(0x39353237 << 0).value 212 | return 0x00000000 213 | 214 | def calculateRev(self, input, times): 215 | s108 = 0xbfffe920 << 0 & 0xFFFFFFFF 216 | s136 = 0x0 217 | s140 = int(input[0:8], 16) << 0 & 0xFFFFFFFF 218 | s144 = int(input[8:16], 16) << 0 & 0xFFFFFFFF 219 | 220 | for i in range(times): 221 | r2 = s108 222 | r6 = s136 223 | r4 = s144 224 | r5 = r6 & 3 & 0xFFFFFFFF 225 | r0 = r4 << 4 & 0xFFFFFFFF 226 | r2 = self.getShifting(r2 + (r5 << 2) & 0xFFFFFFFF) 227 | r0 = ((r0 ^ (self.rshift(r4, 5))) + r4) << 0 228 | r2 = ctypes.c_int((r2 + r6) << 0 ^ 0).value 229 | r0 = r0 ^ r2 230 | s140 = ctypes.c_int((s140 + r0) << 0 ^ 0).value 231 | s136 = ctypes.c_int((s136 - 0x61c88647) << 0 ^ 0).value 232 | 233 | r5 = s108 234 | r4 = s140 235 | r2 = s140 236 | r0 = s140 237 | r6 = s136 238 | s = format(self.rshift((r6 >> 0xb), 0), 'b') 239 | if len(s) < 3: 240 | s = "0" 241 | else: 242 | s = s[len(s) - 2:] 243 | 244 | r6 = int(s, 2) 245 | r0 = ctypes.c_int(((self.rshift(r2, 5) ^ r0 << 4) + r4) << 0).value 246 | r5 = self.getShifting(r5 + (r6 << 2)) 247 | r2 = ctypes.c_int((s136 + r5) << 0 ^ 0).value 248 | r0 = r0 ^ r2 249 | s144 = ctypes.c_int((s144 + r0) << 0 ^ 0).value 250 | 251 | str140 = format(self.rshift(s140, 0), 'x') 252 | 253 | str144 = format(self.rshift(s144, 0), 'x') 254 | 255 | 256 | if len(str140) < 8: 257 | count = 8 - len(str140) 258 | for i in range(count): 259 | str140 = "0" + str140 260 | 261 | if len(str144) < 8: 262 | count = 8 - len(str144) 263 | for i in range(count): 264 | str144 = "0" + str144 265 | 266 | return str140 + str144 267 | 268 | def reverse(self, hex: str): 269 | return hex[6:8] + hex[4:6] + hex[2:4] + hex[0:2] 270 | 271 | def rshift(self, val, n): 272 | return (val % 0x100000000) >> n 273 | 274 | def getUmullHigh(self, r0, r2): 275 | n1 = r0 276 | n2 = r2 277 | result = n1 * n2 278 | s = format(result, 'x') 279 | s = s[0: len(s) - 8] 280 | return int(s, 16) 281 | 282 | def hex2string(self, num: int): 283 | s = format(num, 'x') 284 | if len(s) < 2: 285 | return '0' + s 286 | return s 287 | 288 | def fch(self, xlog): 289 | xlog = xlog[0:len(xlog) - 21] 290 | fch_str = binascii.crc32(xlog.encode("utf-8")) 291 | fch_str = str(fch_str) 292 | 293 | for i in range(len(fch_str), 10): 294 | fch_str = '0' + fch_str 295 | 296 | return fch_str 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | --------------------------------------------------------------------------------