├── 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 |
--------------------------------------------------------------------------------