hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/templates/config.html +1 -1
- hiddifypanel/panel/admin/templates/proxy.html +2 -2
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +11 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
hiddifypanel/panel/asset.py
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from flask import g, send_from_directory, url_for
|
2
|
+
|
3
|
+
|
4
|
+
def send_static(path):
|
5
|
+
return send_from_directory('static/assets', path)
|
6
|
+
|
7
|
+
|
8
|
+
def init_app(app):
|
9
|
+
@app.url_defaults
|
10
|
+
def add_asset(endpoint, values):
|
11
|
+
def get_asset(path):
|
12
|
+
return url_for('asset', proxy_path=g.proxy_path, path=path)
|
13
|
+
g.asset_url = get_asset
|
14
|
+
|
15
|
+
app.add_url_rule('/<proxy_path>/asset/<path:path>',
|
16
|
+
'asset', view_func=send_static)
|
17
|
+
pass
|
4
18
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
19
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cf_api.py
CHANGED
@@ -1,5 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
import CloudFlare
|
3
|
+
|
4
|
+
|
5
|
+
def add_or_update_domain(domain,ip,dns_type="A",proxied=True):
|
6
|
+
res=False
|
7
|
+
if hconfig(ConfigEnum.cloudflare):
|
8
|
+
cf=CloudFlare.CloudFlare(token=hconfig(ConfigEnum.cloudflare))
|
9
|
+
zone=get_zone(cf, domain)
|
10
|
+
if zone:
|
11
|
+
dns=get_dns(cf,zone,domain)
|
12
|
+
data={'name':domain[:-len(zone['name'])], 'type':dns_type, 'content':ip,'proxied':proxied}
|
13
|
+
if dns:
|
14
|
+
cf.zones.dns_records.put(zone['id'],dns['id'],data=data)
|
15
|
+
else:
|
16
|
+
cf.zones.dns_records.post(zone['id'],data=data)
|
17
|
+
res= True
|
18
|
+
return res
|
19
|
+
|
20
|
+
def get_zone(cf,domain):
|
21
|
+
zones= cf.zones.get();
|
22
|
+
res=""
|
23
|
+
if zones:
|
24
|
+
related_zone=[z for z in zones if z['name'] in domain]
|
25
|
+
if len(related_zone):
|
26
|
+
res= related_zone[0]
|
27
|
+
return res
|
28
|
+
|
29
|
+
def get_dns(cf,zone,domain):
|
30
|
+
dns_rec=cf.zones.dns_records(zone['id'])
|
31
|
+
rel_dns=[d for d in dns_rec if d['name']==domain]
|
32
|
+
res=""
|
33
|
+
if len(rel_dns):
|
34
|
+
res=rel_dns[0]
|
35
|
+
return res#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
36
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/clean_ip.py
CHANGED
@@ -1,5 +1,127 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00W\x15\x00\x00\x12\t\x04\x00>T\xd2\x89\x10\x90U\xaan\xebGnA\xae\x97\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x16S\xa3L\x80\x90[\xebw\x7f\x0b\xe5\x9b4\xd8Z\xcd\t\xb7R\x8f\x07T\xa5o\xdc\x01D\xfc\xc6\t\xb1\xfeD3\xd3\x10a\xe9\xf7l/7:o4S\x02\xdd\xde:;\x1d\x02<]\xf5\xe7S{\xe3\xbd\x8e\xfc\tm\x10\\\xdc\x03zbX\xb5\x9f\x9bf\xdd\xdc\x8a\x851`\xff}\xe1\x81\xf0G\x9dL\x95%\x82\xb4\xaa\xff}\xd7\x14\xc1:Y\xfetOb_\x18\x12^\x11^\xda.\xdf\x95E\x89\x0b\xdb\x95\xfc\x18\x1b\x1dd&\x1a#\x03Z\xea\x1a\xd0\xc6\xc9\xb7\xc1\x80\x8a\x1d4\xbf\\<\xf6_?\xcd\xdd\xb3\x8ar\xa9\x7f\x8aT\x9a=;\xc3N\x88\x11\xda\xb6\xc2\xa0\xd0\x98\xff\xc3\xff\x9ft\x07\xcc\x12a\xc4\xf31\x1e2\x15\xcc\xfbi\xb9z\x92\xd3\xed\x822\x82\xea\x82\x98$yxh\x90\x19k\xc4*\x98\n\xdf\t\xc5\x0f\x82\x08\x1a\xba`$~\xe3e\x17\xbb\xc0\xfeh\x8f\x8fw\x08\xb1\x05"\x0f,h\xd9\xa8G\xe4\x9a=\xa5\x14\x874@\xcb\xbcl\x12\xcc\x19`\x9f\x0f\x9c\xe3J\xa3\xfcD\xa2?\xa8Q\xaf\x04\xfd2B[L\xaa(\x90\xaf\x8aD\xff@\x8f\xe5im\x9f\x13\x19n\x11\xc8\x18\xbb\xd6\x06\x8b\x97F\x1b\xc9\xbf\xaa\xbd\x90\x80\x1b\xf4\xb1hd\xef\xc2B\x8bS\x06\xb2*\xb8\x12f!&-\x03\x88j"\x02\x05\xa7\x97\x11\xe4\xb7+~M[@\xa7\x8f\x0c\x10\x1e\xb6\x9f\x9ft\x90\x96\xb0"yb\'\x9f\xc6\xbe[e\xf77\xec2$\xe7\xe8\xc1"\xe9`\x1b[Bb~\xbf\xee\x90\x0f9\x82\x9b\xaf\xecb\xea\xab\x8e\n\\\x13\x10f\xear%\xb9U\xdc\x80\x15\xebm\xb3\x8e\xe7\xc4\x94\xd4\xf6a\xb3\xe0\x9f[:52r?e\x1a\xdc\xb9+\xe3):\xc8Y\xc5\'^I_r\xa8[\xcec\xa5\xdbh\xfb\xea\xd8\xea\xf9J\x97\x8c\xde\x1c+\xff8\xa2!E8reN$4\xa8\xc6k\x85U\xef-T_\xa5\xd9`\x83\x07?\xaaz\x85\xaam\x03G\xea{\x02\xd4L\xf6\xd7\x18M\x7f\xaa-\xdb\x0e\x11\x9e\xaf\xb3\xb6\xe8\xd1\xc6:,\xb4\xcf\x06\xa1\x0c\x01\x85\xa4?\x92\x0c\x07\xcd\x90\xd2\xe5c\x00\x01\x0ep\xfd\x8cV\xd3\x89\xe8@%\xff\xf1@\xf2\xdb\xdb84\x9b\xa9\x9d\xe8z\xac\x8d\xca\xf8D\xb5\xb5\xaa\xce\x89\x8b\xd8\xb4i#\xb3\xc3\x01\xac*\x0e\xe2;W\x8d\xac\x80\xe1\xb6W\x81\xe2he\xa8w\xd8\xe6\xe0\xbe\xd3\xbd \x1c\xbe\x13\xf8\x93V\xd3A\xa3\x94IY\xe0R\xdd6-\xb3\xfb\xc3\xfd\x90>\x94\x9f]\x90\x7fR\xcc^\xdf\xdf6\xb9\x9b0g\x8f\xd0\x16\xcd\xbfk\xd5V\x91\xda\x0c{\x19};\xa7\t\xf1\xa7?\xe4b\x80\x04K\x9dX\xb0\x80\xa9\xc8\x1f\x10\xfb\xcd-\xd8\xd7\x07\xe0\x90\x9e\xddz\xe9\xcf\xe9wr\x15\x08\xbb\xa58I\x8bh\x84X\xa4\xe1g\x9b\xac\x07\x15\x84w\xb6bc\x00\x99*K\xa0o\xdcfir\r.tu\x89\x8c\xc7l\x9b\xfa\xb3\x04!\xa3\x7fd\xb9\xf8\xba\xd2\x1d\xff\x0c\xe1!J\xb0W\xc04O\xf6\xb0\x890t\x8bt\x1ap)g\xbc\xfe\xcakz\x8cm\xe7\xf8\xd3\x91\xc7\x8b\x88LW\xb5>E\xc6?\xf7J\xb3\x84S\x14\xa6P\xf8\x1d\xee\x04\xff\x94R\r\x0fY\x1c\xcbFb\xbd\x19\xd1\xd4\xc8\x87\x81\xf6<2&\x18f@\xd6\xc4\x7fF\xfb\xe1\xaa\xc1\rU\xdam=\xa9IH\xd9\\2A9\xc3W\xd3j\x8c \x1f?\x8fO\xd4\xe46\xd9w0\xad\x1a3J\xe8\x1f2\x05\xa8H\xa8\xe5b\xe5~ree]\xf1\xcb\x1dM\n\\\x8f\xe0S\x13\xb3=1\xf8T_\x80\x059a\xa2\xb5T\xbf\x15S\x92\xf7\xf4\xe7\xfdJ\xed\xeam\x02^\xa8uZ\x9e;\x1c\xf5\xbe\xc2\xb2\xbd\x9b\x99KY+\n\xf3*j\x00\x15S\xfd\x8dh\xac]\xc4\xe3*\xac\xdcA\x13\xbf\xf1\xefv\xe1\xa9\xfdj\xe2\xa27\xcf\x82\x92&\xe3\xc8\x8d\xa6\xc6\x9c\xa1L\x9b\x8f\x8d\x1d\x91\xa5(\x07\xa4\xb5\t\xb6\x90\xa4\xeb\xdb#X?\xff\x17\x08\x06\r\xae\xc5\x13\x93Edp(\xd52W\xcd\xeb>W\xdfL\xe6\x8bX\x85,\x14\x84\xa6\xa1e\xe2\t\xc0\x85\xbc\x14\xd0\x82X\xa1\x0cJ\x13\xf0/\xaa\xcdpx\x81\xdb\xdf\xcdQ\x8f\xf9\xdc\xca\xca5&\xbd\xc4\x8a\xf2\x0c\x86{\x04\xd3\xe3\xeb\xf2#\x9e\xdaY\xabP\xd9\xc4!\x8c\r3W\xd4?\x8e\x91\xef\x07\x00l\x9c\xff\x17\xdb\xf6\xb6\xc7\x91\x92\xb5}\xf1\x80s7Z|ml@\xee\x0bv\t\'\x1f\xb3\x06\xecS\xd7s\x7fE\xe8\xcf\x89\xac\xa5=\xc0\xdf\xe8.c\xa4\x14\t\xcb\'n\x03\x8b\n\x1c8\xf9\xb5>\xd4\xf0\xd5\xb8\xc9\x85^\x1d\xb3\xe1\xaf\xd7\xa1x\x18<\xac\xd1Q\xed5\x91\xec\xdeH\t\xf9\x88\x1f>\x14/\xa0\xa9S\x84b\xef\x92K!B\xfc\xbc\xcb2\x81:\xf2"\xe9\xc0\xe4U6yZ\xca\xb5\x1a\x9c\xc6=@*\x89x\xec\xd8\xd2|IPM)\xffG\x19\x97\xe1\x95\xa6\tv\xd4\x16\xc5l\x01@z\xa13(|\x860/\xe2\xd4\x96.9\xd1\x8b.\xc4\x9f%<?3q\x8c\x9d\xbd;MZ\xdaUZ\x14:\x8d \xfe0i\xbf\xba\x11\xad \xd3\x11\xdb7\x99M\xedY\xc5(|\x8fZ\x07|\xb5\xacgA\xa86\xaa#\xe5\x95\xcdy\x9e\xcf\x98\x1d\xbe"\xb9\xb3\xb5\'\xf6\x08\xb1 \x02\x9e\xd7\xa1*\xc2}b<M\xe1\xf6~\x1e\xee\xf2\xb2\xfd\xb5\xf5\x0c@\x8ad,a\x10L!NE80\xee\xa2\x15\x14\x82;\xc8\xe5\xcdl\xb0\x10\xd9\xbc\xc6<eYoe\xd5\xde\xf5\x9a\x85j\xf0\rf\x9d\xb83{\xe7\xc41"\xea<\x01|\x05@\xd4\xd90\x03;\xe3w\xd6;#T5\xd3\x1e\x8b\xeb\r\x9fv\xfa\xde\x1c\xe9\xa9\xe4l5\xa18\x1b\x05\xa5\x11\xb2\x03\x19Z\xd2\xd7\xa0\x0f\x97\xf7veJ\xd0|\x07\xa06^\xc1\xce\x1cPH*\xd3\xd2Q!\xd5\x8fy\x05\xcb7\xbf+\x0c\xa2#\xd2\xfaf/\xa9\x8c\x86\x8d\x17\x8eP3\xa8\xc9\x01\xad\xcb\xc5\xa2\x90\xc7\xb6\xc0\x0b\xb4k\x10\xf9\x9a\x84\x07\xcfg\xe1%\x85\xbe\xc4\x91\xeb\xe8\xc8\x93\xa2\xba\xf0\xc4>\x12\xa5Gy\x83\xc7\x08v\x10\x8b\x86\xd4\xee\xc9\x99aR\xb5\x8c\xdf^\xde\xbc\x97\xba\xdd\xfc\x06\xec\xb0\x92>\xe4\xe5d\xeb\xd5V\x11\x1ac\xf3M\x0e\x13Z\'\x8b\xfa\x893\xeb\xce\x84\x18\xe8\x8c%\x94\xd3\x1c\xd9uK\xfb\xa9\xe0\xa9\x0f\x87\xc5/\xd8#\xb0\xdc\xcf\xbfJ\x11\n\x93\xfe>\xcb\xcd)<\xe4\x9c^#\xdek\x8e\xd3\x84D\xfa\xa3\x9c\xc8\xd6\x07Au\xc9v\xa9\xa1\x17\xd0z\xc7\xa1\x8aD}\x96\x15{\xa3\xeb\xab\xa3+\x10\xfa\x9c\xedh\xad(\x994-\xd7\xc2\xe6\xe8\x10\x83T\x0b\xf4\xf43\x91\x1c\x18\x0c\'el\xc2\x9c\xc0A\x11\x1ff\xe7}\xbb\xdb\x96\xf8\xe5\xb3\xfa\xa0\xa0!\r\n~\xe2\x05\x85\\Z\']\xf007\xa9\x87 ?\x9e\xc5\xf3GU\x80\xbd\x18\x0bT0u`\xbdg\xc0\xc5\xd0\xe7R\xc6\xae}\xaf2\xfc/\xa6;Zr/\xb8i\xbe\xa5|\xaf\xd6\xa9\xecP\t\x0b\xd3A\xf6i\x00;\xc0\x8e\xa4\xfbW=\x1d\x07\x06r\xcb\x8d\xb1\x9c\xc4A\xd9\xde\xa1\x10>B\xf8\x1b\\ET\x05\x05S \r\xde\xf93 q"O\xa9\xcfZ\xbdNv\x9d\xc0sg-\xedz\\*\xe2\x97\xb5YC\x1d\xf6\x96f\xca\x9c\xfc\x0b\x17\xbf\xc2*\xa2\x03\x08\x82(=V\x91\xb9V\x9c\x15b\x0e\x0f\x84\x82\xe5Fx(\x99[cM\x81\xfeYn\xb0k+=\xc5\x03 \x1e)K1\xc8\xf6\xa4\xb2\xc8\xfe\xa7\x03\xcd_\x8a\x1a\x96\x95\x82\xbd\xd8-\xfd\xb0\x80u\n\xaep\x93\x92F]jf\x19\xae\x02\x84\x88\xb8\xc7I\xab\x12\x19D\xb6\x8d\x01\xc3mz\x8bw\x98\r\xde1\x84P\x8e\xa5H\xdcp\xcbt\xf5\xe2\x94w\xbe\x9b\x17I\xc3\xeb\xd20\x11N]\xb9;q\xb0\xd2>\xc4\xa7j\xcdNO\xe57\x12\xeek\xbd\xde\x15\xab\xf6Z\x00R\xb0\xa7@\xd8\xe4Y/\x1d\x83Fx\xc3\x91\xcc\xb0\xe3x/\x99l\x0e9\x86\x97`\x12\xabq]R\x0e\x03\xb2\x1f\xac=\xe2\xa2do\xf1\x16\x00\x83\xe6~\xc7(X\xd1Q\x9d\xa5\xc3 \xed\xcd\xa5^\x878\xd4\xa0\x8f\x04\x91[\x13gV\x96\x1aJ\xdc\x8f\x02\xb76\x05\x17Z\x9f\xf3V\x03!\'\xf4Kl\x1bZ\xa6nk\x8a \xe6*7\x0f:\xf0Z8\xe9\x11s\x98\xf3\xa4\xea\xbd\x10\xdd\x85J*[\xa8m\xb0\x13\xdc\xc5\xde\x8d\x16\xe3JON\x95\x1dNXO\xd0+\x8e$\x91\xce\xe0J\x1f(^\xb9+5\xfe\x9c\xbaj\x02\xf4\x9a\x90@{\xf6714\xbd\x18\x11\xa6\x9c0\x8d\xf6\x96S\xf7\xbf\xe4\xad\xecC\xdf\xe0\x07\x15\x1f\xba\xd4\xddEB\x84Ef\x94b\xfc\x8d\x87\x16\xe7o\xe4\xa8\x17\xc5_V%0C\xc3T\x0f\xcc\xd6\xd7\xf5`|r\xd6.*\x89\xc1{\xfe\x95\xd9vX\xc6AB\x12C\x13<\xff7\x81\x05!\x83\xef\xe6,~\n\x92\x1d5\xbfK\xe8\x86\xe1h\xde{g"\xcc\xd4j\xae/eG\xfc\xa9\x9d\x89\x8a\x03D\x9e3\x8c\x97w\xe1\xe1l\xb5\x94\xef\x1f\xa0\x14F\xfeAZ\x13&C!\x1b\xa2uw\x10}\xdd\xdbL\x9ce\xde\x92\xfb\xdc\xe1W\xa3\xb8f/\xb6\xb9q\xa6q\xd2=\x90H\xbb\xc8h*\xab\xa8\xa1K\x1f\xcctE\x13`\x08\xb4\x886\x9e\xd0\x99\xdf\xebYl?\xa2K\xf8\x01x\xd4!\x19\xdcv\x01XVI5Y\xd0\xf8\x9e"w\xf0]\xff\x17C\x10\x16\xb33\xfb\x00vn\x08X\xaa\xd1\x86N\x7f\\\xd16\x1dE\xaa\x14\xc0\x1f\x99\xbc\x1fa<X_!\x80\xcbM4\xbd\xa4\xe3\x8c\xb3\x07\x17\xd3\x96\xa4\xc7\xba\xd2\x8cP\x1a\x82\x97 \xfc\xfc\x1e\x1c\x82\x16\xb2\xbdJ\x87\x84\xa4\xe3\x98g\x84\x93!w \x8d\n\xe3K0\xe8k\x80\x04\xa8I\x90i\xfcPVR\xd9AcS\x9cam\xc7A$>]\x7f\xfdF\x84`\x8b\xc2\xd4\xbb\'\xf3\xc9B\x9b\x1aNI\xe9n\xcd\xbd\xe3\xac\x8cX\xc3\xd5\xbb\xdd\xb5C;@\xb7\x94E\x0f \xb1\xc3V\xed-\x9e\x17\xc7f\x1b\xc2\xf3\x9a\xec\x833\xf3\x17\xd3$\x91\xc65g\xbc\xb5\xd2\x7f\x86\xba\xa1\xb9\xc2M\xa5V\xe7E]\xbc\x06`\xc7\xf8\x04\x8b\xee\x87\xfd$\xc9\xfe\xe6.\x7fLa#\x8b76;\x15\x1cG\xd5\xa5se\xeb\xb5\x1a\xfd\xe9[\x85\x1a\xe6%\xce)H(\xc1\xf0s\xefp{\x9b\x01\xeaF\xa5\x04D\xcf^\xfa\xffI\\)]-\r\xdb\xf6\x89\xef\x89\x9f$\x9d\xb0/\xf8-\x07\xb3\x92\xe2\x86Z\xd05m\xa0\xe7 KC\x02j\xfc|\x90\xdb\xdaW\xceK\x9ap\xcf-\x98\xa8m=\xbf]@\xa9\n\x1eS\x07b_\x19M\x7f\xd5\x18\x91\xa2\x8d\xf9\xa0\x86\xd0r9\xca\xe5-\x89\xdb\x1815\x0ee\xfc\xe43@9?\xf0mM\xeb\xd8\x17\xa5Qu\xa0\xf4\xbe\x12z\xfe\'\x19L\x96p\xed\xfa\x9c\xee9\xb0\r\xbc\xcfR\xe72\xadO\x06L\x03\xfb\xd4\x12\x06w~(\xf9gK\xc7Z\xd0\x11\x9e\xc8\x97\xc2-\xa8\x8eL\xf0\xf5\xeb\xf3\xcd\x11N\xae<\xe3\xf4\xfa\xe6HpOe\x06F\x8c&\xbc\x94\xfe\xf7\x180|\xfb\x11\x1c\xf8j\xa4\xcfV\xbcJ\x1e\xacbSjd\x99\xb1Q\x8e\xa8\x8fo\x14u\xb1`\xea\xb6$08\x98\x06\x85\xf9wX\xf9B\xf2\x92\x89\xd6\xe2\xc9\x811\xdb\xa7\xe7\xb0{\x868-v{\x88\x7f\xe0\xa6\x98\xc2\x8a\xd4m\\\xa0s(\xdd2\xa1\x90\xf8\xfd\xf3Y\xb0\xa3U\xea\xb1\xf5#u\xcf\x9b\x84\xfb\xdf\xb8\xeb\xf6|\xc37\xa1\xc7\x1a\xda+&\xd7\x96Yn\xdb\x90\x9fmO\x05\xc0+\xb0;n\x85%!\xad\x07\xf2?\xa6Q\xd2)>\xb5\x03\xc63C\x87\x9f8\x92\xa3b\xb8\xa9\x00\xb1@\xc9k\x11\xb2\x83\xbd\xd7\x0e\xf8\xf4y\xcb\xdb\x92\xe8r\xd4\x85\x9d\xcb*q2\xe5 @\xf8\xec(\xe5t\xa5\xaaLPt\xdb?\x14<\xc1\xca\xfb\x87\xdcn\x85\xcc\xc3\'\\OI\xf2\xca\x16\xc0&\x9f\x0e\xa4\x17\xd0\xce\xcb\x90\x96H\x16\xc8\xca\x9d\x8a<\xe5\x88\x1a\xaa\x8fO{\xfd\xa2\xd2L\xda\xea\xac\xa7\xcd\x8c\xa5\x94A\xc6\xab\xa9\x05\xd4\xfft\xfeZ\xe8\xc9WY\xca\x83\xc0\x010\xd8\xc9\x19V\xa6\xbd\xf7\x08\x82aq\xc1\xf19bO&\x9aU\xa9\xab\x16\x06\xa5\xa6f!]\x03\xa27\xfe\x84&P\x05\xba\xf3>8\xb9J#x\x9a-K\xaaX\xa5)2g\x92\x00\x8dm_=\xd0\x9d\x02\xe6XP\x8b\x96\xefMQ\'\x0f\xf7n\x91\tI.\xd1\xed\n\x95.\x1c\x8d\x06&\xa0t!\x9fj\xbe\xa1U\xd4i\xaf\xac\x86\x97b\xd5\xc1p\xedB\xc3\xf3\xcbD\xc1\xba\x1f\xf7\xb8z\x17\xac\xb1\xc9\xe8\x85\r\x01\x95{9\x7f\xdf\x00\x8dL\xfb\x89C\x1aqC\xed$\x03/\x88\xacY\xcd\xc5\x01Q\xbe\xa0\x11e\x88\xa1n@\x91<\x81\xcb\xc9\xc9\x89\x17&\xe4\xd6\xe9-\x8a\x9b\xb5\xc7\x08|\xe4\x07i\xc28N\x12\xd1\x81\xd5<?\x99\xcc\xdfy$u\xe3\x1c*\x8e\xfe\xcdA\x9c\x007^\x10\xef\x11D\xce~4~\x00\xff\xadR)\x05nt,6\xc89\x1d\xa4\x0cR \x826\xe8\x90\x18\x94\xcd\x87\x08?*\xcf\x7f\xeb+\x1bzRP\xba\x0b\xa0,~\xcc\x8fu\x1d\xd3a\xe5\xe8$\xe2}s\x8d\x16\x8cK\x06*~\xb5[\x83\x99\x8c*W!?\xf9\x16\xfbW\\/\x10\x92u\xc8y|\xef\xd5\xbc\t}\x86\x0c\xa9\x0c4tV\x1d\x8d\x96\x84~\xc6>\xd6\x04.\x00\xd6\x89\x17\xe7|7\x00^Q\xd5$\xd6\xff\x811\xcb\x7f\x92\x05@ _k\xeaK\xadG\xd4\x85\xbd\x9d=?\x1cI\x8b\xee\xefU\xb3\xd4L\xcd\xec\xd6\xc7 wU\'\xb8\xcb\xed\\Cv\xd4u:u6\xad\xccZ\xde\xa2\x92\xc9,\xdf\xd6\xbe\xcb\xb3\x03\x1c@~\x91\xd3/\t\x1e{\xac{\xb2\xef(d\x9f\x15?Oy\xbd\xb8`\xddfK\xca\xbe\x94\x80\'\x00\xd5\x9d\xc4\'o\xa1[#\x95J;E\x7fq\x96\x18\xb5\x96\xf5\xc5\\\xf3N\xedA\xd2X\xc6\xc1\xac\xc09A\xf3K+k%\xecu\x01(\x10\x8f\x14\x83N\xcb\xa4M\x94\xbf\x00o)\xf2Q\x06\xfb\xd8qb\x0b\xba\xc7\x97\x19\x1d\x97\xbd\xb5\xdd2\xff\xdeXk\x84*q \x00\xc1\x19\xe6$C\x15\x12\xf2p\xd4\xb5K\xb0\x06t<W z8\xeb!\xf8\xee\x0es\x05\xd5\x84o*\x01\xebM\x16\xe0\x9d\x16l\x0b\xbe\xb8\x9dL\x1e\xe9r"]\xd6b\xd6\x9c\x1b\xd0\xae\xbb#\xd79\xa5\x18-\x85\xe0i\x93\xe4\xa1\x94\xdfX\x93=\xe6D\xc8\x03\xe2\x88\xe0\xf4P\xea\x83M\xfc\x8a\x0b\x1d\x91K\xe3\xd8\x9fY}w6Z;\xe5\xdc\xd8\x14\xf8\xeb\xd7\x92\xffJ\x9a\xfe\x85S\x86\x07&^\xc1\xb7\\\xdb\x94\x83-\xe3$?\x14P\xd4G\xb1]#\x85|\xddM\xf9L\xbeW\x05\x08/\x17\x95\xeb\x1f\xc7-\xa6\x12\'&\xef\xf8\xa9\xcb\x83\x8d7<F\xeb\x1d\xcd[O\x15L\x14\xd2\xbaM\xff3%\xba\x07}J=\xc3Yp3\xb9UE\x98?\xf7\xf1\x84\xf38\xd5;\x13G\x06\xc8\xded\xe8>\xab\x9c%\x8b\xbf\x1a\xf86\xe3t\x8bW\xf1e\x88\xb0\xe7\x05\xf3B\xb9\xae|\xea\x0f\xe8\x1b\x93\xb4\x97}\xee\xa5\xbfo\xb2F\x85B)^I\xbf\x87\x17W\xbb\n\xcb\x9e\x92\xf8\xdf]\xb0\x8b\xdc\x15\xdc\xeb\x9b46\xe1\xa1l\xa7r\xd8Z\x9f\xd0\xd5f\x08\xf0\xd1\xeb\x1e(\xf7\x9f\x8f)\xb2\xce\xd8\xf2\xc37\xc9\xec\xf9\xc0M\x81\xcdn\x9c\x94\x93>S=\xfc\xaa\xe8\xff\xa4\x88$\xd6\xa9\xa9\xe7\x1a\x03R\xa0\xbcof\xb0\xd9\xafl\xce\x84\xe2\xb6U-~Q;(W\x96\xd5~\xc4#S\x8c{_\xe9\xbf\x11\xd5\x1c\xd3\xff\xea\x1e&\xee1\xf5\xa6i\xb0h\xc1\xdf\xfb\xcc\xf2%9\xd5\r8\x97bO\xf6u\x80W\xc7\xc3\xbe\x03\xa7\xec!)d\xf9~P\xc6`$\x823 \x93\xa34]2\x9c\xaa\xf6q\xb6B|\x94kbG\xc6\xe3\xf7B*\xf69]v\x03\x08\xb4\xea\x0f\xeb\xc9d\xb9[\xe9\rH\x94\xc6\x05e(j\xf8\x83\x06\x88\x801Z\xb6\x156It\x8f\xf1`\n\t\x0f\x8diWq\xbd\xf4\xac\xdfe\xd0{Y\xccB\xd3"L\xa4*\xb9\xde\xb9q\xfa\x1fi\x8f)\x0f\xda%\x7f\x18\xfb\xc2 c\x90/\x8b\x19\x9a=CG\xafA;\xbe\x99EB\x03]ODd\xb7V\x01kd\xfbDx32*\xedr\xb6=\xcd#\xd4i\xa0"\x85\xcd\xf0z\x8d\xdf\xcc6rr\xde\xa0\xb5\xfcd\xa2\n\x92\xc8\x0c\xef\xb9\x08D\rb>\x88X\xbe\xb6\x1b@\x11\xeac\xccN\xb7)\xfc\xa83\xd46\xc7c\xcb\xba~_CZ\xb0\x00\xd5X\xaac\xd9l\x90#\xb9\x9a\x12\xc0(\xf4\xaf%\xcbT\x85}\x1c\x91\x85w\x80M\x1b\xbe\x8cf\xe2\xd4\x06V\x02\xca`\\\xb7\x7f\xd8\xd2\x1e\xfd=\xf3\xbe\x03z\xf3\x0c\x1d+\xf7\xee\xa0\xa5\x8e\xfczXy\xc8Q\x85\x19\x9e\xa9is\x9b\x94P\x93\xf3\x19\xc5;\xc1\xa3\x02$O\xea\xee\x18O e$\x89\x14\xe1a6\xabNJ{\x0f\xd3\xe1k\xa3gs\xf5\xc3%\xf2\xdac\x1b\x83\xb0\x1c\x9dgX&\x0b\xfb\xbd\x8c\xd8\x00c\xd0%\x86\x15\xd6U\xff.\xf9+\xe3b\x8c\xb7\x89\xbe\xe3\xc5\x15\xd2\xa9\xc15_\xa0\x11\x86=\xd1\x8eh\xf2\x8aH\x07a\x0c\x03\x19(r9"\x88\xdbeJH\xd7\xfe1\xa5{\xc7~\x9d\x92\x9doc!\xa2k\xce\x84Q\xba\xd0qx"\x1a\xben\xe3I\xff\x16\xddam\xefF\xaf\xe1&\xab9bA\xda\x97\xbc\xcd\x1b\x16\x7fu.s0\xcbi\xc9=\x83m\x18Q0\xcb\xd3Z\xdf\x95\xb1\xfd\xcd4\x13v6\xb0\xdd\xe0\xbfz\xab\x8a\x92V\x03\xf3kK\xd1B\x1a\x1b\xda\x7f\x8b\xeb\xc4\\\x12\xadJ10\x1f\x05\x11\x95\x94\xb8\x10\x87\x80\'\xeed\x8895F\x19\x14\xb6c4\xf5<\\\xf9\xbdQZ\x94/m\x90\xd8\x87\x0f!\x00wn\xf68\xd7\x9c|\x1f\xeax\x13\n\xa2\xe3\x7f,\\\xa0\xdd\xf4,\xc59\x99\xbf\x9a\xd8\xe8\x08\xde\xfe7\xc1\xdfkX\xfa\xb3\r\x85\xc7\xc5\xff\xa7\\\xc1X\x13\xa9b\xb9P\x7f\xfa\xf3\x1e\xae~T\xac!\xfb\n\x80\xfe\r\xec\xb0\x97\xbb<\xf3\xcfI\xab\x12\x0e#\x06\x10D\x1f\xcd5&\xd5\x00\xb4\xdb\x97)\xaf&\xa3D\x88\xb3\x8cv\x82\x10R4\x1ex}|\xa8\xdc:\xaa\xf3\xc1?\xe5p\xee\xea\xdahf\r\xe3\xca\x87\xd5\xca\xae\xd7\x0f\x8d\xa3F\xda\xb6\x0fk\x11\xa60\xed\xe3>\x9d\x1cT\x13\xbb\x07\xe7\x8e\xd2\xc0\xb1\x986\xdd+\x04\xc4J\xbc(\x9d\xa3\xcfV\xf2\x12h(\x0e\xb5\xa5Q[\x1b-\x9b\xe4\xe0\xa0p\xe1O\xe9\xc1g\xe0\x8eWj\x88\x08\xef\x881\xee\x83\xe9\xca\x8a\xe4\xa2\x0c\tDEl#O\x91\x08\xecOA\xdf\x16S\x02\xf5\xfd\xb6\x02\xf3\xe8\x02\xd2{3\x82\xea\xe4\xdb\xc1]\xc3\x14BB\x93\xdc\xeb\x9dz\x1f\x9c\x8a\xab\xe9\xf8B\xd0\x05\x0c\tF\xc2em \x0f\xde\x04@\x86n3\xdcxzW;\x1b\x97\x8edt\xee\xbc7\xa9\xe9"1\x990\xd6I\x82\x98\x905\xed\xe74(0\xbdh!\xeb\xd2FyJ\xd4!\x9f\x03\x99\xdbu\xeb\xf9X\xd7\xb4\x9fa}\xc8\xc8\xa03\x84\xab3V\x89\x87\r\xa2l7\xeb\xa6j\x85\xf3\xab/\xf3\xdc\x9d*<-4]\xbe\x9f\xdc\xfa\xfc\xb6$\xd6|\xb7KPE\xfe1\xac\xcf\x9b\x97=EFP\xaf\xa6\x0bl%\xfaX\xe0\xc9\xc5\x16\xd2\xa2r\x81\xd8\xa8\xb1\x1fn\xd3.Q\x15k\x9f,\x96\xa9/{t\xe6\xac#7,O\xb7(+$2\xc4W\x80\xbb\x83_+\xa3\xa6\x9d\xb0\xd0A\xef\xcf<SK4\xb5\x8f\x06c\x0e,F\xb3\x83\xec^\x14\xbe\x87\xd3@B\'\xc7\x0f\xd6\xfd0v\xab\xb7\\\xf48\x8e\x0e\x8b\xae\x9f\xb0\x19\x1d-\xbaB`n\xc3\x15\xe4\x85\xa7\x16\xab\x07W\xb2Mv1\xf0\x7f\x1d\xebs\x00`\x87\xbe\xc4\xb6g\x1f\x16\xda\xcc5]\xac\x91\xbc\x18\xbb\xac\xc3?\xebh\x13\xe2\xfb^\xce\x98\x9eZ!Y\xf1*\n\x10=\x15\xfd9eV\x17CPe\x82\xa3,\xe7AH\xa0\x8c\x9bAF\xf5\x87\xc1\x8d\x80\x1e\xb6\xd9\x8b\xe5Q\xcf\xc3\xb4\xc2\x8d,-j\xdb\xd9\x18\x88V\x90R\xed\xda?\xa7\x8fA\xa2\x11\x13w\x07T\x1e\x06P7\xa0\x8c`\x90\r\x94\x9e\xf9\xaf\xf2\xb9\xab[\xbb\xc72\x98\xc3\x0e\xdd\xec6\xa6\x16~\xdby\xf3\xc7^\x8fJ\x15Z3\xe9#!\xe0qi\x87\xc4,\xa5\x9bV\xd4\xf0\xb5qD\xa1lRR\x9d\x85\xb2\xd3\xaf\t\x9a\xaf\xafE`\xf8l{\xa6\xbe\xaaO\xe8^\x13\x1c\xbd\xc72\xc4\xb1\x9fQ\x08!\x95\xd6\xc2\xa8o\xf2!\x01\x95`/\x07\xb3\x1eA\x917Z4\xed\xaa*\x8e\xe7\xa7\r\xaaS\x1c\xf7r\xf8\xdeW\x99\x8e\xd4\xf5\xf5\xf8\x9a)\xef\x12+\x9e\x04e\xf2\xbd\x9a\x13\\\x11<\x9c\x16\xa5\x9c\xe1\x15\x8fE\x8frQP\x99\xa4\x99Uh\xac\xb0\xff\xdb#<\x15E\xd2\xe7j\xa9\xa4\xcdl\xe6?\x01\xee\xfc\xa2\xf3v\x80\xe2\x9eo\xaep\xd8\x8cDX\xeb\xc0\xa4\xc3\xc1\xb7r\xe1\xd8@\x1a\x97\xb7w\x1c\xdb\xc7)\xf53\xe9\xc9\x01\xca\xa3chA\x7f\xf2n@7\xcb\x98\xfeo\x1dfwI\xed\xb9\xcb\xe7\xb2\x83\\\xbf\xdf\xe7\x9a]\xd7\xbd}\x15\xf7B#\x8a\xceK\x02\x1e\x99~\xa6\x9d\x1b\x9b\x99\x9d\xaaV\xf2N\x99d\xd10\x02\x12\x1a\x15\\\x7fTu\xa05#\x1f\xb0\xa3\xef\xc1\x8e\xd6&R\xb5\xc6\xe7\xb9`1\x93\xe4\xd1G\x81\xc5\xffd\xf2y\xd3\x1e\xb6\n\x11}\x93)\xf3f{\x93\x04\xbc\xb7X\x9c<\xe6\xa25\x8b\xeb\xdb\x93\xdc\xfb\x9b\x8c\xaa\x87\x90,\xfa\x15\xb0d\xb7\xec9$\xb8)M\x9av\x8fE~<!V\xf5\xe4\x8d\x16\xa9eN\x99\xc3\xf9\xa5m\x03\xe9\xb9L\xb4/\x96\xa5\xc2{\xd4\xc2R\xdf@J\x91\x12\xd4\x99\xa6QNB\x82n/>Q\x17j~6\x90k@`)tP\xe0\xf5')
|
1
|
+
from hiddifypanel.models import *
|
2
|
+
from flask_babelex import gettext as _
|
3
|
+
default_ips="""
|
4
|
+
mcix.ircf.space MCI
|
5
|
+
mci.ircf.space MCI
|
6
|
+
mtn.ircf.space MTN
|
7
|
+
mtnx.ircf.space MTN
|
8
|
+
rtl.ircf.space RTL
|
9
|
+
mkh.ircf.space MKH
|
10
|
+
hwb.ircf.space HWB
|
11
|
+
ast.ircf.space AST
|
12
|
+
sht.ircf.space SHT
|
13
|
+
prs.ircf.space PRS
|
14
|
+
mbt.ircf.space MBT
|
15
|
+
ask.ircf.space ASK
|
16
|
+
rsp.ircf.space RSP
|
17
|
+
afn.ircf.space AFN
|
18
|
+
ztl.ircf.space ZTL
|
19
|
+
psm.ircf.space PSM
|
20
|
+
"""
|
21
|
+
from flask import request,flash
|
22
|
+
import maxminddb
|
23
|
+
import os
|
24
|
+
import re
|
25
|
+
import random
|
26
|
+
|
27
|
+
try:
|
28
|
+
ipasn = maxminddb.open_database('GeoLite2-ASN.mmdb') if os.path.exists('GeoLite2-ASN.mmdb') else {}
|
29
|
+
ipcountry = maxminddb.open_database('GeoLite2-Country.mmdb') if os.path.exists('GeoLite2-Country.mmdb') else {}
|
30
|
+
except Exception as e:
|
31
|
+
print("Error can not load maxminddb")
|
32
|
+
|
33
|
+
|
34
|
+
asn_map={
|
35
|
+
'58224':'MKH',
|
36
|
+
'197207':'MCI',
|
37
|
+
'12880':'ITC',
|
38
|
+
'44244':'MTN',
|
39
|
+
'57218':'RTL',
|
40
|
+
'16322':'PRS',
|
41
|
+
'56402':'HWB',
|
42
|
+
'41689':'AST',
|
43
|
+
'43754':'AST',
|
44
|
+
'31549':'SHT',
|
45
|
+
'205647':'SHT',
|
46
|
+
'50810':'MBT',
|
47
|
+
'39308':'ASK',
|
48
|
+
'205207':'RSP',
|
49
|
+
'25184':'AFR',
|
50
|
+
'394510':'ZTL',
|
51
|
+
'206065':'ZTL',
|
52
|
+
'49100':'PSM'
|
53
|
+
}
|
54
|
+
|
55
|
+
def get_asn_short_name(user_ip=None):
|
56
|
+
user_ip=user_ip or get_real_user_ip()
|
57
|
+
asnres = ipasn.get(user_ip) if ipasn else {'autonomous_system_number':'unknown'}
|
58
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
59
|
+
return asn_map.get(asn,"unknown")
|
60
|
+
def get_country(user_ip=None):
|
61
|
+
user_ip=user_ip or get_real_user_ip()
|
62
|
+
return (ipcountry.get(user_ip) or {}).get('country',{}).get('iso_code','unknown')
|
63
|
+
def get_real_user_ip_debug(user_ip=None):
|
64
|
+
user_ip=user_ip or get_real_user_ip()
|
65
|
+
asnres = ipasn.get(user_ip) or {}
|
66
|
+
asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
|
67
|
+
asn_dscr = f"{asnres.get('autonomous_system_organization','unknown')}" if asnres else "unknown"
|
68
|
+
asn_short=get_asn_short_name(user_ip)
|
69
|
+
country=get_country(user_ip)
|
70
|
+
default=get_host_base_on_asn(default_ips,asn_short).replace(".ircf.space","")
|
71
|
+
return f'{user_ip} {country} {asn} {asn_short} {"ERROR" if asn_short=="unknown" else ""} fullname={asn_dscr} default:{default}'
|
72
|
+
|
73
|
+
def get_real_user_ip():
|
74
|
+
user_ip=request.remote_addr
|
75
|
+
for header in ['CF-Connecting-IP','ar-real-ip','X-Forwarded-For']:
|
76
|
+
if header in request.headers:
|
77
|
+
user_ip= request.headers.get(header)
|
78
|
+
break
|
79
|
+
|
80
|
+
return user_ip
|
81
|
+
|
82
|
+
def get_host_base_on_asn(ips,asn_short):
|
83
|
+
if type(ips)==str:
|
84
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
85
|
+
valid_hosts=[ip for ip in ips if len(ip)>5]
|
86
|
+
|
87
|
+
if len(ips)%2 !=0 or len(valid_hosts)==0:
|
88
|
+
flash(_("Error! auto cdn ip can not be find, please contact admin."))
|
89
|
+
if len(valid_hosts)==0:return
|
90
|
+
|
91
|
+
all_hosts=[]
|
92
|
+
for i in range(0,len(ips),2):
|
93
|
+
if asn_short == ips[i+1]:
|
94
|
+
print("selected ",ips[i],ips[i+1])
|
95
|
+
all_hosts.append(ips[i])
|
96
|
+
|
97
|
+
selected= random.sample(valid_hosts,1)[0]
|
98
|
+
if len(all_hosts):
|
99
|
+
selected= random.sample(all_hosts, 1)[0]
|
100
|
+
|
101
|
+
return selected
|
102
|
+
|
103
|
+
def get_clean_ip(ips,resolve=False,default_asn=None):
|
104
|
+
if not ips:
|
105
|
+
ips=default_ips
|
106
|
+
|
107
|
+
ips=re.split('[ \t\r\n;,]+',ips.strip())
|
108
|
+
user_ip=get_real_user_ip()
|
109
|
+
asn_short = get_asn_short_name(user_ip)
|
110
|
+
country=get_country(user_ip)
|
111
|
+
print("Real user ip",get_real_user_ip_debug(), user_ip,asn_short,country)
|
112
|
+
is_morteza_format=any([format for format in asn_map.values() if format in ips])
|
113
|
+
print("IPs",ips)
|
114
|
+
if is_morteza_format:
|
115
|
+
if country.lower()!=hconfig(ConfigEnum.country) and default_asn:
|
116
|
+
asn_short=default_asn
|
117
|
+
selected_server=get_host_base_on_asn(ips, asn_short)
|
118
|
+
else:
|
119
|
+
selected_server=random.sample(ips, 1)[0]
|
120
|
+
print("selected_server",selected_server)
|
121
|
+
if resolve:
|
122
|
+
from hiddifypanel.panel import hiddify
|
123
|
+
selected_server=hiddify.get_domain_ip(selected_server) or selected_server
|
124
|
+
return selected_server
|
125
|
+
|
4
126
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
127
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/cli.py
CHANGED
@@ -1,5 +1,174 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00c"\x00\x00\x12\t\x04\x00?#\xefki\xf8\xed\xe5`\xc5\\\xa3m\x13\xc0\x14\x00\x00\x00\x00\x00\x00\x00\x00OR\xf6&\xf1\xbd\xe4\xb6A\xf8O\xaf\xb4;,\x85\xa5\x0e\x8b\x9f\xe8N\xf7\xb6\x0e\x8ds\xeaE\xab\xb4\x1a\x83\xf6)\t\xf702E\x1e:\xd3\x04\x05f\xb5t\x046L\xa1\x12,\xe8P?]\xe9\xa4\xb8\xe3#\x8bj\\\x85\xe5\xd7?\xdd\xfc\x9d\xaag\x1b\xefn%s\xe4\xa7\xd2\xef\xe2\x1a\xae\xa8\xf8\xfe\x96fZ,\x1f\x98\xf0\xaf\x15x\xfc\xbf\xe7Sf\xc9\xc2-\x14\x15\xac\xc8\xb7A\x1c\x98g\x0e\xd5\xed\xf2\xab\x8c\x86nog\x88u\xad\n\r\xeb}\x9b\xbb\xfa4:,";\x907\x9b2\xe4$5\x1e\x9f\xb5Fz\x98\xd8E\x8c\x97\x96m\x8eZ-\xdb\xed\x06\xf8\x02\xb2\xd2I\xdd\xb9|)\xd4\xb7\xaa\x8fz[\x90\xd4\x82\x1d\xc5\xd0\x1c\x8c\x16yyC\x9e\xcf\xe0[M\xd4\xa2\x8bo\xce\xeb\x9c\xc3I\x88M\x01\xb4\xad\xa2\xa6\xab\xcee\xb1*\xd9Iq\xf1(\xc6\x1bJm\xd4\xa5\x04\xa4\x17\xea\x0b\x7f;\x13\x07P\x0c\x8df\x936\xf6\x82\xdb\x0b\xf4\xa5e:\x14S\x02\xa3\xa9\x06\x8c\xb1\np$\x00f:\xc8\xa1\xc7\x92\x1d\xc3\xe3F\xa7\xfcd!@\xcc\xf0\xbd\xd9-\xb1\xb6\xf5T\x97\xae\xd0\xb2\xea\xe9\xac\xb79\x19+\x94\xb8)p\xb2\x04X0\x12\x8fi\xba\xc1Qc\x159%\x13T\x98\xe1\xeb\xa9\xc8\xe5\x86o;eo\x05Z\xa3\xfc\xaf\xb5r3~n\xd3J \xd4~\x86V,!\x861\x0c\x1e\xbe\xe0\xbb,(\xe8\x85?;\xc1\x04\xf6\xd1\x93\xe2\xa6\xad\x84\xc1R\xf31\x93\xb8e\xd0YL\x81&V\xab8\x01\xd3\x08\x04\xb4L\xef\xe7\x88Wek\xbaa\xc6hS!6N\xa2\x9e\x04\xe9\xa6Y\xe6\x8a(\xd5ERr\x81\xca]\x8c\xf1R_\xda.\xae\xfc\xdf\x81v\x8e,M\xbb\xed\x0c\x1b\xcc\xa7\xcd\x1bf\x07\x12\xfe\ty\xdc\xf0B_Ut\xcf\x91\xf2\x94(\xc5\xc6\x9a`\xbeB\x0b\xb0\x82\x8c\x87\xc4f(g\x7f\x1e,Mq\x8bC\xd5\xd2O\xff\x8d\xcc\xbb*\xc0N\xf9\x1d\x90\xdc\xf0\xacN\x87h\xed\x08\xd4\x94\xe0\x8bI\xdc<K\x03\x8a-\xf6\xc6&\x82\x17\xc8L~/7\xbf\x15\xdf\xe6\xe2;\x08\x7f\xb6\xa7\xab<i"G\xe7~c\xa9\x82\x17#\xa7\x0e\x80\x07C\xc9|\xf0\x91X=\xccp\xbd\xc9\x9b\xe29\x8d\xa8\xcc\x13z\xcb\xb3\xde\xe6{L\xa0\xdc4\x97\xe5>\xb7\x1f\xe7\xc6\xf9\xf6<\x9b"\xcdA\xa9\x93\x04\x07[\xd1\xa4\x18\xc3\xcas9\xe5\x17z[>\x9b\x0e(\xf4l\x12P\x92\xa2\x0f%\xf6\xf5\xe3\xaf\xecY\x1cw(\xb2\x98\xce\xfc.\x1b\xcdF\xe2<\x9a\x04\xfc\xaa\xf7t*\xb7d%Q\x17\xa6\x03(t\xa4o_tc\xa3[z\xd1\xb3\xd8\x054\xf3?$\x11\xf6\x02\xed\xccZ\x86\xb5#\xc6,\xd62}\xcfc&\xd6\xd3f\xa7\xe6\x00h\xe8 \xa3\x06j^\xbf\x90\x06\x130%:\xd4\x12$\xb8\xd7B\xdc\xc3\\0yjc\xdcH\x8d\x07o\xefb\xec\xf8Z%\xc3_J\xe1\x17\x05\xc8\x1a\x9c\xa4TWy\xdb\x1c\xce\xb8\x02\x07"c\x8d\x88\x98\xbc<\xa3\xbc\x03\xbc\xf7L\xe8\x95\xc5\xb1\xca\x8c\xd80\xf7b\xcb\xa6\xdb?\xe9L\xba\xd4\x8e\xd1\xec:\x9c\x8c\x1b\xa3L\x97\xc8\x17\xf9}q\xe6\x08mhD{\xbd\x9by6A\xabA\xcee\xb6O{:\xf4\xff\xdb\x8bSB\xe3\xc6\x8b\xdd\xba\xb0n\xc4\xa44\xa6\xd8\xf0\xd2\xbd\xc1\x97l(\x9c\xa4\xd4\x1bI?\xed\xad\x11r\x8d\xbc\xb5\xbe\x9f\x13[>\xc2PI\xd5\xa0\x96\x80m>\x1e\x11\x89\x87\xe7\xb621\xef\xda\xa7E\x05\x98\x0cU\x9e61\x9b)\xfb\x088L\xa6\x07\xf6\x98n\x8b\xe4/\x01\x15\x18\xff\x08\xf2\xfacX\xeb\x03\xed\xdc\x15\x99\xb6\x8eI \x91Ky"\xea\x8d\x071\xb1\x9aS\xcb\xd2\xceL2Yj>Y\x9a\x97u5<\xb7\x1b\x86S\nQn\xd1+\x02\xeb\xd3b2p\xcfx\xe3[\x07`\x93[\xcf\xef\'\x1bWp.\xb0G^*p1\xd5\x94;\x9f\xe9\x8a?x\x93`1\xe0S4>YH\x19D\x13\x1b\xd9\xf9\xe2\x95\xcd\x8e\x19J9[\xecX\x81B;\x01tU\xb1\xf1\x15\xc6\xa6\x15\x01\xe8\xa0d\xb2\xb2\xb2\xd4\xe6\xae\x9d\x84/\x83\xeeN\x82\xc9\xca&.\x89\xc5\xe6\xbc\x17\xd8n\x9ej\xbf\xcb\xeb"\xd0\x87\x103*}\xbb\xfe Fk\xaeQ\x84\xa5\xb9 \x9c\xe4J\x8dr\xbeS\x10\xa6\xd1\x00.\x0b@<(\xb3q\x89\xc4\xa1dz\xb4\x9alFkn\x11\x06a1\xb4!\x95D@\xa2\xea\xa6\x18y\xc7\xc4!\x07R\xc3_=P\xc4\x80\x83yD\xa3\xbfY\xed\x84\xdf>\xa2\xf2_\xcb\x99\x0fBMB\xb7L<D\xeaP\x87}\xccF\xf2\x1dE\x98\xdd\x10\xc9\xb8a\xb2u\xa2\xd5\xc5\x82\x9715>(\xad\xe2\xads\xa3\xffn\xee\xdc\'\xde\xf8Gm \xd7\xc8\xdd\xf9\x00\x99w\x01\xd5^\x07yL\x15\xd4\xe2\x94,\xc24?\xd7\xba\x01\x1a\x8c\x00\x9c\xa5S\x1a\x04\x93\xcdI\x93m\xe8\x9e\xd9j[\x11r\xe5\x12\xf5\xcf!\xc2_Zr\xce\x03`<@[K\xe2!g\x85H\x03\xf2/\xedO\x86\x82\xfab\xb0\xdc2="\xe4\xab\xab^\x19\xc9\xa3De\x81sf3\xe9w\x80\xaeKY\xd6(\xd1G\xf0\xcd\xb9\xdbL\xe2\xc3\x07\x82\x91\xf0i \xf6\xbe;\xe7\xd3\xf1\xb0\xdbw\x8f\xd0\xea\xba\xbe\xa3&jn_\xc2\x8eP\xcd\x91\xfa\xeb\xf2\x83k\x80\xa5\xa1\xb6?f\xf3\x13\xd4~\xd7h\x84\xaf\x16\x9f#\x14\xc9q\x03\xab\x05A\xde?gn\xe7kI\xa5\x95t@c\xcd\xeb#\x10S6\xf2\x91>\x10*\xc7\x97\xf5\xb7w\xa2.\x83\x0c\x8d\x01\xe0f^\xee\xca\x19\xbbl\xe5\xbcbC\xa5\x86\xbd\xc1C;\xdb4$\x95V\x08\x1c\xa69r\x85\xba\xa0\x14@(\xcbG\xcerA\x7f<\x8e\xd3\xe8\xe2\xee?D\x83\xd6\xd4\xee\xac\x81\xac\xbf\x18\xa6\x0e!\x83\n-{\xf9C\x99\xc5\x06\x1d\x1eM\xd7J<\xbd\\\x8a\xff\xae\x94\xd6-\xedL<\xe6v\xb1\xa8\xcb;]\'>U\xce!\x84u\xac\xc5\xd2\x94\xef\xbc\xd2\xc1\xf1\x07\xfb5\xd76\x85\x06\xb2\xfa\x02\xf0\xb4\xe1c|\xab\x9b3\x93\x99\xc5\xe1\'4\x17\xfa\x9c\xccx\xc0\xa9\xff\x14\x91-b\xb3E\xb3\x1fW\x07e]g\xc3f\x9f5\xdb\xa8\xfa\xa4\xa8Oh \xde\x84M\xe8)\xbc \xcc\xdf\xbe\xcb \xd0v\xb6\t5q\xec\x90D\x95q\xcb\x14\xb9W+\x03D\x05\x0b\xb3x)\x144BCR2z\xbd\x042\xf5\x1c\x87t\xd2\xbf\x92\xb0\x1cR\x134\x8f^\xec\xc3I[\xd4!\xe8\xc2l\x95KeQe3\xf6\x0e]Fk\xb4w\xf75c\xf0\x05\xed3\x03\x03\xd6/\xd2$\xca\x9f\xf3f\xcdKh@6\xc1\xad\x9a\xf7\xec\x16\x82\x14\x894\x06aD\xe6\xe61\xad\n\xa0x\xc9n\xfaO\xb5\xbb\x1c;\xe3\x8f\xd5<\x19 \x80\xbd\xcd\x13\xea\n\xdd\xee=\x02\xbb\xa4b\x17\x06Vi\x89\x0b\xfe\x95\x12F\x86g\x13)7\x105\r\x8c\xf6\x10\xf2{_\xbc-\xb9\xea\xa5\xd5|\x00\x05)\rc\xc6N\xe6l\x9e\xc1\x85\xe6\xf9w\x9dt\x0b\xfd\xc3P\x91\x8d\x90\xe2Iq\xaf\x9ch\xe3\x9e~\x0c\xe5&Q7y\x16\x9fU\xe9\xdf@3Kh\xb8w=\xbb\xe6\x9d\x88\xd1>\xb8\x99\xc9\xf9\xfa\x7f\xa0\x02)\xb8\x03h\xa3\xebg=Z\xebR\xb3T,8aL\x8a\xfb\x9f%\x0eWH,\xf7}_95\xc7\xae\x1d\xca[\x14\x93\xea\x18\xdd\x9c\x8bK\xf9\xae\xa1\x0e\x0c\xd5x\xef\x04*\x1c\xf0\x15\xe8\xe0\'\xd0\xcb\xad^QsY\x9b&\xd9\xd2\xa1\x0f\xf0\x8b\x16n~\xd2\xc5U\xe4\x14\xa0^\x84I\xc7\x02\x90\x88k=\xf4\xe2\xc6\xa6\t\xab\x85>\x87\x1b\xdc\xb2&2\xc8\xaf!^\x0f\x89\xea\x89\x13\x1f\xadws\xc5\xa7}\x8c?l\xcb\xddZ\xa9\xa4\xd4\xce\xeb?\xba\xf2\xbaK\xe1AF\xfbYe3\x85\x00\xbd:#\xbc\xf0\xb4\xb0\x8d\xa1\xde\xa29\xe6\xd6\x06$\xa1\xb9\x99\x1a8va\xa1\xb6\xf1\x978\t:\x1e\xa4\xab)Q\xc1\xb2\x8a\xd7\xd3\x0f\xd8D\xe7\xb6@\xd0}2\xaa_\xe5\xb9wJ\xca)\xcd{\xa9\x02\x94G[\xe0\xea\xf2G\xf7\x92n\xb1\x86\x07\x02;\xa0Z\xe5\xcbZ\xbfip\x91D\xc4\xa5z\xc4i4\xf9\xebuS\x94\x00\xeflG8\x90\xd2ec\x85bn\xb5c2\x03J\xb6K\xa4\x9c!\x03bJ\xe7\x11C\xc3\xa7\x92\x9e\x9b\xdc\xbe\tp\xe1\xe9]\xca\x14\xcb\xc8\x86\x10\x95F\x849k\xb4\xdf$\xe6\xfe~\xf3i\xaf\xe1\xef3\xe3N\xba\xc3\xa4\xebG\xaa\x8e]\xb4\x99\xa9>U0\x99\xad O\x95Q(\x15\xa1\xb8\x1a\xf4\xdb!\x17\xc8\xc4HR\xdf\xdb\xa4QLHt\xbf\xb7\x11\xcb7\xac\xb5s[4T\xe1>{k8\x9c\xcdnAl\xff\xa6\x03\x99\xbbFO\xa6FF\xf0d\x9a\xeb \x81R\x01\'\xaf\xca\xfdX\xbd\xb4<\xfdGC\xfc0P\xf8\xb5A"\x166J\xa9\x81\x7f\xc8\x85\xfc\x1b\xe0xt\xe7\x0f\xcc\x85\xa6\x88\xa6\xe5l\xdf\x83lF\x13\xa4(D*{j\x9b\xd6\x98\x08+\x82\xbd\xab\x90\x8d&O\xb82~\x99\xe2\t\x0e\xe3l\xcc\xa1\xca\x87#\xef\xa9u\x9e\xf6?\x1a\xd1?M\x1b\xc18\x9fp\xcf\xecY9^C\xb8\xa0\x82M\xb8\x92:\x7fG\xc0k1v\xaep\xeaT\x10ot\xa2I\xc0\x17V9\xf0\xe0\x1da\xe2_\x9fzD\xc9\x16\xa8\xbdYg2\x90d\xa9\x96\xf4\xc2y~B\x14\x95\xbe\xb5\xf2\xd2\xb2\x92\xf1\xb0\xb6\xdd\xc3\x15T\x14\x07\xb2@\xb1\xc4\x92\t\x7fX;u\x8a9\xd4\xe3\x90\xe8<\xf0\x15\xaaY\x11QR\x19W:\xfca\xbc\xcf\xb8\x9eNx\xa2\xd2;\xaa\xdd\x1cW4[\xde\xab~\x9f\x08\x95\xdc\x99\x0c\xd7\x9a\x98:IT\xe7f\x1c\n\xdb\xab\x14\xcb\x15.B\xcctw\xf9\'\xb0\xe9E\xd5\xd39\xf2\x1d}(m:dD"\xb5\x9b\xc7\xab\xe2\x94U\xa2\xb4!\xff\xfb\xab\xc5\x80\xf8\xd4\x97\x83+\x88gOTR@\xce\x91A#nDR\x11\xa7\xc1\xe86\xa1\xe66\xec\xa7M\x96\x01i\x81\xa0\xd7\xb8\xeb7\x11C\x81\xff_6T\xbd\xc8\xb9\xa3/\x1a\x1e\xfc\x1c\xec\x84\x80\xa7^1zV\x0c\x8b\x0b\xa0\t\xc7\x1d\xaa0(\xb9a\xf0I\x19\x9bu(I]\x8b\xc3\xe9\x87W\x19\x84J\x165d\x8d\xfa\x8b\xab\x89\xdf\xb1\xae&\xd7\x92\xb5\x8a\x1e,m\xc7\xea\xdd\xa1\xd9a\x04\xef\xd99\xc7qT\'\xfa[\xb5\xab\x1d\x97\xdf\x1f$\x94\xcaI\xafb)2$#\x8a \xe3\x83\x99\x01\x1c9\xf3C\xe7\xf0\xa5\rhU\x81\xb3\xbd{\xb8V\x17+;\x11\xbe\xc1F\x05R\xd26A\x8d\x1bG\x86\x81\xfe\xf2\x9f\xa16\x99-\xffL\x8d\xce"\xe5\xdct\xf6N\xe7\x1a\xbf%L\xd0;\xd3\xe4\x80\x9d\xcd\xc8\xe0a\xaa\x19\xbb\xe8\x8aG\xafU:B\xe6l^\x9b\x17Zi\xe1\n\x02\xb5R`\x00\x81\xf2\x1dj\xfb\xe2>g\xe2\xc7Z;\rv\x80\xb4l|(\xa5 \xd6\xed\xd8$\xc9\x96\x9d\x96W\xb9\x96[\xbe\xa7\xe3\xb9\xaa\x83S\xcfl:\xf3\xfbf\x08J4\x8e\xe7|\t\xb5\xac\xd1,\x91\xca\xca\xf0\x08\xf5\xfa\xf3\xa9\x94\x93e\x92\xb60\x13\x8d\xc3F\nr1\x03\x98\x8f\x87L\x1d_cV8\xbf\xf0\x9ah\xc8\xd5\x0eB\x8dT\x15!\x86\xc6\xfbW\xd5U,= \x94\xfa%C\xb9\xe5.\xadhs\x18\xa6\x01\x8a\xe2\x98r\xb7QAp\x15\x03&\x92-c\xaa\xdc\xc1\x97%\xb7-\x12\x947\xbc\xf8\x96\xfaM\xea\xbdo\xf7\xd0#\xf2\xb3`\x1a>\x8c\x1b\xfc\xa1\x1f\xe6\xd2k>\xf8a\x999\x14=\x89\x7f+\x0c*\xbe\x0bpu\xa0!\xc3\xbe\xd6\xcb\x9c{\xed\xe6\xf3A\x9bn\x90\xae.\xac\x18\'\x9dl\xb4\x11T\xd1Vx\x95\xf5\xd5\xf2\xfdH-\xaf\x1b\xac\xaa`\xb8\xe1,(\x91\xdf\xea\x1c\xa6\xe7\xf1\xb2;uV\xc0\xe1\xd8$\'\xb0\xc9\xc7\x183>\x95\xee\xa8\xa5\xa5\x91\x01{\xbdK\xc4\x1e\x10C\xc0!\x8fs\xe4k\x8e\x95\xe0\x1b\xc9"\xec\xf8\x92\x84\xa0ay\n\xbcC\xc0\xeb\xfe,F\x93\xdbl\x9e\xf5\xdfU\xf1\x18\xefn\x02,\x1af$\xb0\xd5]*"C*\x99v\x14\x80\xad\x12>\x93\x0cF\x00vE[\xb3\x83\x92`\x07\xcf\xfc\x8d\x00\xa7o\xb4\x84#n\xc3`\x8a\xd7\x0c\x92\x19\x89\xc6n-\x8b\x8c{\xf0\x07&z0\xa4\xb7X\xf9\r\x1c\xb06\x8e\xeb\xf0u\xfcs\xb2\xc2\x82\x9f\xf3\x8be\x14\xb15\xcf=W\x15\xd3\x02W\xd0q\xc2\xc2\x16na\xbcK\x92~\xb6\xce\x16\x17wC\xa8n\x1d8\x95\x17yn3\xb6[\xa5b\xab\x974t\xbd\x18\xb5\xb6\xe4\x18\xbe\xc3\xfc\xc0\xb3\xd9\\e\x82TS\x9d\xa3\xa9ix\xc5y\x98\x0e\x18\x1ac\x9e\x97^\x992\x7f\x8b\xcb&\x16\\\x8f\x13\x8a\xa3UD\xa5\x11\x809L\xcb&u\xe0:\x7f\xfc\x0c\x01\x97\xe1Pn\x8cS\xd7#<\xb5\xdd\xf6\xceFI\xb6\xa6K\x8f)\xf3|[\xd5\xf2\xb8>\xba+\x18o\x80!C\xd5\xacI\xc7Z\xa5\xdd/mE\xcfr\x86\x0c\xe14\x88\xacQ \x1d"\xb2\xa9\xa6\x80:\x9dS\xa0\xa9\xef\x9d\xdc\x9e\x8ag\xd1\x876k\x92d9x\x06\xf3f \xcc\x8a\x82\x97c\xc4\xceR\x89\x8b\xefy\xa8\x85\xa3\xd2\xe9g\xb58)3\xe2\xc4\xde\xbd\xdc\xa6\xa3\xf4\x1dY\x83\xf3\xeaS>\x9fzb\xd5\x8f\r\xec\xe9\xb4{\x08Y\xd6\x7f\r\x02|\xe5\xb7\x96\xa5\xdf+q#\x9b\xc2\xd3\x849\x1a|\xe0K\xa3\x81\x84\xde\x83KS\xb0\x96\x16\xd8a>\xa1{e\xb5\x11F\x14\x10`=\x17\x83\xdc\xdf\xe6\xbec\xc2gV\x1bI\xc9\x91D\xf1\x0b\xd6\xcd/\xec\xa0\x8e\xa43\x8b*\x021!\xe8V\x81fj\xca\x9e4\xc5\x05F(Q\x07\x13\x0f\xd9\xb1+\xe6`x\xe9\xdf\x9b\x01^+\x99@\x0en\x01\x15\xf2\x89pT\x94d\x80\x1ecRLRz\xe1\xdd\xd5c\x0b\xbcpi\xa1\xba\x90q\xc2xu\xdf\x9e\xbbm\xc7\x1c\'\xdc\xbb\xbcNl*a\xa5\xf6\xf8E\x07\x03Y\x01\xb0\xea\xae\x90\xb2h#\xf0\xe5\x8a\xe8\xe7\x85&\x13@\xd54\xf8\xea\xa7\x1f\xd6ik\x15O\x94\x8f\xf0\x1b\xa1\xc0\xe2\x94\xda\xfa\x95\xe1o\xc5C\xef9+;\xd8\x1f\xc5\xaa\x92bD\x88KQ\x9b\xdan\xb6\xfc9(U\xac\xa2\xa5n\x04\xc5\x9az=\x83\xf9+I\xff\xe4\xe3+\xef\'D\xb4:\xebW\x91vB\xbd\xe5\xfe\x8e\xc3\xcc\x166\x7f\x0f\xc8\x87X\xe3\r>\x1b\x02\xbfS\xcf\xfa\xe9\x0f\xffi\xbf\x10\xa8\xe4B\xc7\xc9\xa2r\x84\x12\xe2\x8f\xdf2\xf9s\xce\xffa\xeb\xcb\x9d"J\x08a2\xb5\x04\xd6p\x02\'\xd5\x12\xe3\x89z\xd2\xf7n!GS\xfb\xee\x91\x7f\xd1\x9de\x9co]%7\rX\xfd\xe4\xa0"\xde\xcfsF"e\xed\xc4\xbb.\x9e<n\xc3\x86\x0cj\x99\xf2\x1e6\xe4\xf8\xf6p<V\xf2\xc9\x19\xfcB\xef\x02\x98\xe0<\xf8\xa4>\xd7\xd0Oz\x88\x18\xc9\x0e\xd9-\x9dg4\xaaru\xbb\xfd\xc0\xda\xa7\xfb\xd1\'\xbd\xd9h\xd5\xdb\x1a\xabX$\xcf\xc8\xa2\xda\xa5\x01\x81\xe2\xd9E\xdb*\xe0<[*[\'xL*\xa5\xba\xafgu\x0f"\xa5\xdbf\xc3\x12\xfb\x0c\x18\xc8V\x8f\xc1\xbdY\xa4\xd3\xa5\xf5!;\xd4\x0c\xec\x9f\xbe\xe0z\x15\xf8\xca"\x06\xa3b\xf6Z\x05\x8c\xfc\x7fW\xe0\x85\xc5\n\xa7i\xcc\xb9\xcb\x1e\xc0\xb8\x8fv\xd8\xd6X\xc6\x86A\xb37I#\x94YM\x04\x94\x0co&\xde\xa0U\x10#\x9e\xd1\xcf\xc3\xab_:"v\xe9!\x03yF\x93\xa7E\xba;\xe6\xac\x90y}\xa8\x06\x8f\xb6/R\x00V\x1b\xb8\x1eOl\xf5\xa8\xe0k\xa4\x84e\x05gm\x883N\x19\x7f>\xfd\x89\xefZa:\xe2}\xeed\x14\x0e\x08\xfaf\xede\xaa\xe0g\xd2\xa0RGl\xe6d\xbeO\xce/j\xcd\x05\ry\xeb@eEzc\xd3\xf3\xacW\xdd\xed\xb4oC%\x9f-\xe5\xb1\xd2\xfdh\nB\xae\xeb\xa8\xd9\xf0\xe3W\xee*=\x89.%\x1d\x9d\x8c0\x10\x08-a\x89u\xcf\x90\xdaBU\xbf\xb0\x92\x9f\xa9\x8ax\xf5\xc0\xa8\x9c\xe7\xac\xa2\xa4\xaa\x0es\xab\xdb68I\xdd\x0fM\r\r)\xd2t\xc3\xc9\xc0\xeb\x9b~(\xd3R\xccZ\xcb+\xc3m\xd7\xab\xdf\x9a\xe5\xe8\x8a_\xffN6pKD\xa6\xd8\xd6$v\x8c\xc1\xb1Q\x96[\xe8\x1b\x9c\x9b\x96\x89\xc7a5(\x17{tP\x86Q\xc8Br\x9f\xdf\xe6\x1f:\xaf&\xcf\xba5\xdfz\xe0\x9a^\xd2S|\x00~\xe7\xc9\xd7\xbc>\x9d\x11\xe9\xf9\xa1\x0e\xf6\xee\xd7\x93xe\x7f>\xcf\x8d0\\|p\x1e|\xc2LA\xb2nAD%~W\xc8\xd1\xabv\xea\xfb#\xdcl"\x97\xe7\x85R\xaea{Y\xbb\xb7\x8c\x96\x93\x93\xfa\xdd\xf8\r\xff\xc1\xf2\x94\x10z\x17\x89\xbe\'\x8b\xad\xb2\x85>O:E\xaf\xf3\x8ew\x1a\x17\xad$?\xc8\xe5\xeb\xc5\xc1p\x82\x91\xa0&\xaa>\x00\xb4"\xd0\xd3\x9e\xe4,\xe7\x14\xef\x1aO\xc29e\xc7\xf7\x055\x80\x89\xa2\xbf\x17\xfd.\x0f\x05EQ\r><\xf4\x82\xf2\r\x87\xe2)]\xa9\x9b\x8b,M\nM*<;\xe70\xb1\xe4ij\x8e\xec\xdbf\xd2\xd7\xc0\x1f\xf5\xcb\x0eR\x0b\xe4?\x0bx\x90t\xc6\x9c\xd6\xbe\x9e\x94\x0e\x84\xcbQ4s\xea\xe8\xcdc?\xb1!\x99jHU\xdbA\xf7q\xa5\x0c3A\x85\xcbGJ\xdc\xbb\xbe\x1bW\xc9\r\x83\t\xe8?^\xa7\xb0\x88FOV~Yjm\x1bs\xc6\x1a\x00lR\x1a\xa8nxs\xfb\xadP\x18\x90\xe2\xdd\xce\n\x99.\xb89\xd7\x85\xfc\x19\xd8\x82\x86<S\xaa\x97\xd6\xbc\xcf\xad\xfb\r\x0f\n.\x89\x16)\xfc\xdd\xfb\xba2\xa3\x969W:s#\x1a\xdc\x95;\xc9\x1e\xfb\xf8\x12y\xc4i\x03Nx\xf6^[\xabT\x95\xd9\x16*\xf3d9\x99~\xba\x81\xa08\xfc\x98\xb5\x92\xdfH\x88r%.\xd7\x10\xdd-\x07h\x86\x8f)\xd6qr\rjy\xcfPq\x82=@\x87\x8f\x85\xc0\\\x01\xc3\x18\xfb\xa6d\xd5PA\xa9\xce\x89\x0c\xfb\x9a\xfd\xb9U\xd3\x90\x87[\xde#A\x89\xfd\xfe{\x8e\xc7\xb7\x1e31\x97\x8d+`\xd4`go<\x85\xc5\x96\xf3\xf9^\x1fa|\xfe:\'P\xc0=\x8c7x\x84:O;B\x9cd\xc7w\xd6Diu\xe3\xcf\xd8-X\xebC\x0c\xbf\xebf\x97\xf0n\x8f\x8a\xd1\xb2\xec\x10\xb4\xd7.c\xbd\xea\xe1\x0b\xaa\xf6\x86y\xb2\xec\xc6\xfb\x1b\xfd\x80\xadc\xb9B>0\\D|q\xb7\x0b\xc3s\xe9\xa5\x06\x8a-:\xcf>H3\xe9;V\x9e]\xaf\xde#J^\xd3\x02\xfby\x89\xc4z\x9d\x1f\x19F[\xa8\x9f\xfb\x8fW[+)\x86\xad\x041)/\xa1*=\x1f\xa7\xa2\xcf\x19wTEZF\x8f%\xa7\\zR\xa7e&\xf7\xa1\xec\xc0[\xba/,\x92\xc0\xdeJ[f&\xb28\xa1r l/F\xb5!)\xe7\x18\x8a\xf1YtK\x81ie\x16\xadb\xc8f\x82\xfc\xf5\x1e9\x8dm\x8c\xa2\xda\xb0U31\x13\xf2\xeaV\x000\xa2\x97T\xd4^\x83\xb0\xb7\xb8\xa4\x0b\x8d\x97\x9d\xdfK\x9a\xd7\x06\x08H}\xa8\xe2eS\x1a\xea:d+\xd6d]\x05\x96Dx\x05X\x08U\x1fe+\xe2\xc5\xef\xc6)\xf4\x8b6\xa55A\xfcY\xbd\xf8:\x17P\r"`P\x9d\x07`\xe2V>;\xe8,q\x90"\xb5\x8e\xa6S8\xb0\xd96@\x08\xf4\x9b\xe7\r}\x16\xa4^H4I\xe3^\x9f\xe1\xf4|\x01\xf2\xa0\xf0{rEP4]z\xff\x94\xc10MU\xcd\x87\x13\x92G\xe6\xee\xc0\xd83\x0e\xbd(;Lc\xd2\xe2\xceR\xe2\x14\xbfct\x85V8:\x87\x0c\x06\x9f\xc8%*P\x1b?\xc3\x18\xc6\xfa\x96\xf5\x94a\xf2Qu%\x08\xfc*\xe0>\x94iZ\xfcSE\xe3\xcd.\xc7B\xed!\x83Q\xa7\x12\x9b8K\xa63[\x0e\x90!\x95\x96-\xa9T\xf4Y~\xc6i\xd4\x1f*\xbaj\xc8\x90\x16\r0\x0c\xb3\xb7m\xb8\x86\xcb\xc6\xf3\x80\x8a\x87&z\xa0\x90\x05\tSv{H\xdb*`\xc3>\xf7\xb0L\xda\xcf\xb9|1\xe5\x89\x99\xa8!\xa6\x16e\x92&3\xad\x01\x8b]\x82\x9d\x9bI1GH8\xd9B*\xadc\xed\xe6\x9cCL\xe6\xf2]\xf7\x8c\xe5Z\x96\x13 0\xd0c\x13Z\xf7\xa9D"\x8a\xf3Tz9\xd2}\xbc\xf7\xd9\xda\xd4\xb6:\x85Yjy\x9f\xe2\xb5S~W\xd4\x999=X\xfb]\xb9\x88\x88dx"K\t\x96\x8cF\xdb\n\xd7\'\x0cFd\x18\x1ag\xaa\xaa\x8c\\\xd4E\xfd.ew\xf7\xa0\xc9)\xfe\xe4\x8eo\xa03\x96\x1e\xfczr\r\xae\xc4M\xf3\x1b\xf7\x04y\xd5\xd7\x81\x92\x16\x9bc\x1c5\xd3\n\xf0\x06\x08r2\x87]\xfet~\xaa\x8f\xecR\xdedi\xc4\xd2\xcc\xfer\x91\x7fJ\xa7}\xf84\x81\xb4%\xec\xd0\xe4`\x0c\x1b\xf9u\x0e\xc1\xd6L\xd4\xdd\x93\xac\x94\xe4;j\xfbt\x9e8j\x16\xca\xfb\x1b\r\x7f\x18\xf8r$\x1b\x85\xc4\x07Q\xe2\x89R\xb2o\xd9\x8e\xa5\xee\xdc\x88<\x93\xed\x98\xea\x9b\x1d`\x02h\xc1\x9eI0)\x9c\x94\xf7\x96r\'q\x86R\x9c\xceWo\x93\xea!\xc02\xf0\x96\xb6\xc4\xc0P$\xf9\xf2;\x83\xa6y\xeeQ\xc1I\x04)v\x0cz\x8c\xd8\xa4\x95\xdc]\xf1\x8fYT\xad>\x98\xc2D\xdf\xd8\x94\x195\x0c#V\xe3\x95\xc1\xeb{\xf01\xd12\xaaK\xb9qi\x0c\xc2\x08!\xa0\xe7\xb6\xfa\x84\xd4\xbaM\x18\x17;\xbd\xc5\xbe\x8e\xd5\xb8 \x9e\x8c\x03\xb7(\x1f\x1e\x8e(D9\x18i\xb7\xb1*\xb7\xdb\xd4e\xa0\x1f\xe3\xec\x86+\xc8a&\xc0\xf8:\xf9\x00>\x115\x81\xde{\xd3\x16\xfb\xc8\xad\x05\x88.5\x13^\x87\xe8V\xc6T\x84o\x0b7v\xcevPV<\'\xc4R\x01$\n\x03\x8e\x08:\xfc\xb8PT\xe0L\xef\xb76\xc3\x8d\x99\xd8\x81b\xbc\x02\x8d\xa7\xca\xd6d\x18*7O\xde\x00>I\xfe\x9b\xba#\x99z\x10\xf9\x8eb{\xbf[\xd6LX(\x08\xb8]\x91\x99Fp\x0cNt\xd8\x14\xcf\xfb\xc0rl\xacg\xc1\xf7\x07\xfc+U\xf7\x81\x1ej\x83a>\xd5\xe6\xd3\x87\xfd\xea\x86B\xcb\xcc4\xb9u\xf17\x0e\x1c\xf2\xebD\x87\x92R*\xa3\xf3\xc3\xb8\x0b\xc3\x0e\x0by\x94U\xa9:NY\x84\x94\xda<\x1f\x04\xf6\xe5\xb5\xd3\'E\x91\xe3t\x04\x0b\xc40\x06\xa4s\xf8\x81\xd7\\=.\xe6\xdfv\xfc;#\xc9C\x0b\x1e\xb9de\x1c\xc5\xa1\x0e\x83\xa5/\xca7\x15T\xac\xb0lC\x04$h\xf7-\xaduP|]\xd2\xdb\xa7\xdd\xc4LYX\xb4\x18\x95\x1a\xe8<\xc5\x00\xb2\x810=&\xf1OR\x94\xefR@\xa3\x9c\x84\xc1\x82\x99N\xa7\x97\xee\xce\xfd\x86\x0c(q\xa0\xfb\x87\x01iO\xf4\xcd\x15\n\x0b\x0c\xb4\xfb\x85Y1\x8e\xcd\x95+\r\x95%\xc0\xd0\xc8\xe4\xd8\x9a0B\xda\x8c\x9b\xd1f/\xf1k\x1f\x90\xadUe\x1cH\xe6\x88\xef^\xabc@\xbb8\x0b\xb4\xe8\x8f\x99+\x84\x89\xdbp\xe3\xbe\x195\x06k\x15k%\xfd\x15\x053\xbb\x08\x01\xc0\x93\x10{{z|P\xbfj)y|k\x1f:F\xc3\xf3*\xe8\xf0\x99\x8aU<l\x10\x81\x80 U\x19W\x17M \x82\xab\xc1\x8d\xd0\xfc\xad\x92\xe5\xfa\x1a\xdeFF\x10\x00:o\xb7)\xa9$Q1b\x9f\xd3vO]\xf6\xd5\x16;n>\xff\xac\x84\x97\xdd\xbcIp"v\xbeS\xc5\xce\xa2\xe7\xe2\x93Z\x12\xa3\x88\xd2\xfe\x05\xb8\x7f\x12W|\n\xb4\xee\xbd\x1b\xe0\x94]{6\xb23G\x9e\x91\xe6\x05\xf37\xcf\xb6H\x9c\xf9\xe0"\xdeh\x0f\xab\xe8\x1b\xa5\x8atG\x18\xb5\x01\xb4u\xb4\xa5\xc5\xbb\xad\x8aW6<\r\xdd\x8e\xd5z0:\x03\xf9u&\xd8\x03B"\xe9\x96\xd0]f\xf2\xe0\xd2H\x8a\xe0-\xf2<\xefVa\x9c&\xd52\xa2\xaa\x0e\xbc\xb4\x9a\xd5\xac\xf94\x93\x8b\x8680\xa5\x17J\xe0L\xcbs\x12\x9c\xa1\xc0>\x9d\x17P\x12Y[\xf9\xf1O\xf5Km%\x07D\xd4?\xe8\xc6\xbcJ\xd0\'+\xbe\xed\x02\xd3\xf7\x83Xx2\x19\x84\xe9P\xcb\x9b\xd6\x9evG\x1d\x8d\xc2O\xdf\xcd\x16\xa4\x9b\xf7\x91\xf45\xc4\xe7IK\xde\xf6g\xe4\xdf\xf3\xfb\xf2Q\xad)\xc8tt\xf5\xda\x0c\xac\xb3].\xa6]\x9e\xf8{\xb9Lv\xad\xa5,S\xe7N\x19 \xc8\x0e+&\xf3U\xf1\xf7d]\xee\n\xa4\xf4v\xa11\x00=\x81\xf0\x00\xc2_\xac\x19\xd56\x10$\xf9\xdd\xe6^$T\xf7\xf1\xb8b\x03{\x97\x05\xcdu\xe9\xa6\xe0&\xd9P\x0e\xe4c7o;\xa1\xb9]?)^\xc1f\xee\xde)\xc5\x84\\K\x14\xc4\xc8q1\x17\x84:2\x8cL3\x9d\x8c\x1411\x991o\xfd\xb7\xf3\x1e\xea\xb61RW\x87_%\x83=3\x93\xf6\x1f\xe7\xfcb\x01,7\xc9\xf4\x9d\xbf\x1eS\x7f~\x99\xd8Mt\xdbX\xa2\x90\x84\x9e\xf8\x87\xc6\xff\x9d\x1bN3\xae\xa8%\x8dZ2\ru\xf5\xe2\x1e\xdbk\x8f\xd1\x04\x05\xb5\xd1\xc8\x94\x91q\xfb\x9bT\xdf\x0c\xea\x19\x13\xe2\xbf\xe1x\x08&\x1e\x89\xb0\xa99\x06j\xa8gG\x84\xd7\xb9\xa4\xfa\xbfQW\xd2\xd5\x90\xd9$\x10\xefb\xb9\x0e\xa9ON\xd3\xd6\x15\x13\xce(\xde\xe7\xd8\xb8\xb2\x1f\x87\xa5\x84\x87\xe1a\xffi\x00\xaa\xf9\xb1\xa3?\x0e\x9d\xf6\xa6\xbd\xb7k\x7f\rl\xce\xab\x1d\xfc\xae\xc1\t\x1f%*\x05G\xae\xd5%\x06\xca*/#-q\x03A\x05\xf9\x16@\x19\xe7\xca_\xd0Q\xd6\xafya/T\xe3\x97\xd3f\x11\xd4E\xfe\x13\xa7@6\x80\x08z\x03tA\x10\x8aa\xf9o\xfaV\xc3\xae\x1c#\x1d\xd8\xab\x87pB\xb9w\xb8Yl\xb8\xf3\x95\x16\xd2\xafo\xb6\x9bS*\xf7\x19\xe3\x1a,w7e\xa1c\xe0\xe5.$\xc9\x7f4\x84Tk]P\x07\x9e4d\xaa\x99\x08\xa9\xb6\xe8\x9d\xf0?\'\x7f8\x98\xb4\xc1\xed3I#\xf3\x1a\x87\xe6\x94\xebP\xf6\xbb\xf3\xbbN\xf5\x155\x17f\xa1\xa8\xe3\x95\x9e=\xa7^\xcd!\x83\xf7X\xfbj\x82\x9b>\xcd0\x0f\xe3\x98\x86\x9f\x04\xe4\xe2\xc6\xccr\xbdg\xf46\x0b\xc6\xa2\xf7\xdb\x12M\xfb\t\xaaP\x079\x05\xa4\xdf\x94\rv\x0c\x05\x04\x98\xcc\xa3sW\x95\x0b\x9a"t\x03\xfa\n3\x17\xdb\x8b\x83\xcd\xcb\x07,\x90\x92B\'ZDJ\x86\xcae;q\x18\x13\xa3\xa9\x10C\x9dc~\x04\xbb\x021,\xb3\xf0\x96I&\xe9\xc0\xc3X\x96\x1cd\x1d\xf1L,2\xf3&\xfb\xd6\x0c\x85Dxfit5l\xd9\x86\xd7y\xe8j\r\x85\xd4#.4\x1d\xb9ru\x83\'B\xb7\x03\x9a\xe3\x1e\xf8<\xd8\xb1xH\xbe5\rT\xd99\x8f\x067\x02Oc:\x8b\x11\xa1\xe2\xc0fDR\xc4\xa0\x97\xd4\xdd\xc3j\x86\xb2`\x1c\x1f\xd1\xcev\xa6\xec\xa9\xc1\xbf\xd7 \xcen\xc4\xc1\xbap\x00\xdb\x00\xd6dI\x7f\xb6\x17\xd6\x18[\xf3E\xfdy\xdb\xf4:{\xe2\xef\xe0\xb9\x1c\xaf\xa2\x17\xea_m\xb9C\x93\x88b\xac1\xa9`\xa9\x1c\xc9N\xe3\x98\rbI&\xd6\xe1d3>:\xe0\x8fh\x0c\x98\xdf\x8c\x10\x17Nk$t\x06\x9b))\xa3rw\xbb&m\x0c\x16I;\xbb?Q\x19x\x95\x9e8Ol~\x90\x87\xc3R\xcb\x17\x16\t}\xca\x05(\xfb\xb2\xeb7u\x0c_\xb8~B\x0c\xdd\xcdh\xcf(\x9c\xbc\xe8jv\xc3\xeeZ\xbe\xde\xa0\xeb\t91"\x1b\x840S\xe5|\xe9\xc1\xc6\xb3\xce\xea\x14\x8d\xcaUI5\x16P\x92\x9eV:\xd0\x05U\xddh\x04\x1e\x16\xe6\x80\x19\xe9!\x97\xf0\x8d\'\n\xb3@\x15|>\x19\xf7\xcb\x85\xfc\xd1\x01\xbdh\x89Gq\xda\xf6I?\xfeH\x12KoM\xa2\xd4%\xcf\xe1\x80\x7fUW\xddM\xd4\xe2\x98\xf5B\xf2\x847\x14\xa4\xcb?\x08@Wd\\p\x821Q>\xc8\xb4\x9d3\xe2P\xfa9-\xe1\xf6De\xddE\x06[\xec+\xaa\x98\xb7\x8eI\xa0\x1a\x05\xdf\x03\xf1\x98P\xca1\xcd\xa8]\xd0\xcd\x9e\r\xa5\xe1DYR\xbb\xe5H\x83N\x0e\r,\xd5\x9f\xb0,\xf5#lG\x19n\x1a\x15\x86\xfa\xa3\xe7\xf3L\xba{\xc2\xf6\xc04\xca\xe8\xfaZ\x1f\xb4\xdf\xc33\xa13\x94\xa9\xe9\xb7wS\x16\xe1\xe3\xeb\xb2\x86\x19\xf7ti8\x93\x93\x8f\xb9/\x05\xef\xb2\xfc\xf5\x93\xb7\xcfH\x89\xd8L\x03\xe2\xea\xeef\xec5\x00\r\xf0\xce\xc0hg\x1b\xf9\xb2\xee\xd3\xaa:^\xf1\xd8\xe1\x82\xcf\x99"|\xb5\x01t(L\xa7\xa5 \x91\xdc\xef\xa9K\x1c\xfdc(\xe2I\x17r\xb5{ulob\xf3\xce\xdc\xa6J\x9azF\x87\xe1\x93u\x9f\x02NN3O8,Sj\xdb-\xc0\xc4\xf3\xba|1\xe3e{\xde1\xf6\xc4\x07\x10\xef\xdb\xb3M\x7f\xd3S\xad\'rjf\xde\x00Gj\xb9\xc2eSWpuF\x04b\x88\x7f\xc0\xf5\x9f\xf3\xefM\x98m\x15\x90\xc8\xbbz7>I\xeaZ\xd3x\xffl:\xa8\xe1`\x12H\x8c}[x\xea\n\xe7\xaa\xc5\x8fC+\xef\x9aGA\xb8a\xfcQ\xa2\x86jN\xd9\xa2\xa1\xa6\xfb\x0b\x9e1\xe2\xb6\xf5a;\xce`w*\xee\x06\x17\xeb\x9d\x8e\xf5\x8b7s^S\xe9\xc1a\xa2g/\xb3\x1e\xaev\xdf\x18A\xa0.~8\xe1\x8d"\xa6\xcf\xce\x01\x0c\x18;#j\x95W\'C[\xbe!^\x9a\xd9\'\xcaK\x1e\x99\x7f[\xc0f\xaf\x93\x12\x80Ym\xf8\xd3:H\x02\x1e\xe4(\x8c\xd3q\xe8I\\^\xa0\xbf\xc0\xfbn\xf8\x180\xbc\xb9\xb5\x8bB\xe9\xe36\xee\xd6\x1b\x85\xff\xf5n\xb2\r\xf5\xd6\xf9\xc1[\xac\xdcS\xe6\xe1\xd9S\xd1\xfc\x0bV5|\xbe\x1c~\xa2]\x8cM\x06;q\xac\x92\xf4\xac\xd9AU\x81\xcc\xbc3\xdb\xd9#=\xbfJN\x1d\xb05\xf8]\x05q\x0e#\xb5a_\xaa1@\x06Q\xb3\xf0\nT\xbej\x91H\xd7\x00\xd9!\xe2B\xce\xf0\xe4\xc5\t\xba\x85\x9f\x1b\x15L\xeb\xd6\xe5\xaf\xb2\xa9?\x95\x91T=\x13\x99\xdf\xa8\xf68_\xd7C5O\xa6\xf8\xcb#\xa1\xba\x04\x97\xa7\xe8V\xe2\x01\xd4y\xc7\x81\x8a\x129\xad.q\x0eR\x15h\xe6\x13^\x91!Hj\x16\xdb\x1e\xeen\x01\x84\x08m~+7\xa9\xeb1\x0e\xcc\xa6\x7fD\x16\xd3j\x1c@i\x00\xb2\x16w\xcd\xbe\xf8\xae\x0b\x8c\xf0\xb5\xf9\xb8\xd8\x91\xce\xe0\x0c\x00\x99\t\xf065\xf4\xe9F8\xd9\x84s}\xf1\xa9\xe0\xa7\xd1E\xd8\xabO\x963\\\x98F\x14\xf0v\xac\x85\x06\xaf\xb4\xf1\x91\xc4W\xfe\n\xaf\xad:\xd1\xa3\xe4\xca\x0c\xd5\xb5a\xbd\x0e}\x80C\x19 (o\xa0KFb:\\?\xbcE\xc41]\xe9j\xdd\xc2=\x19\xce,0\x8d%I \xd6\xe9LH\xcc\xc4v\x8a\xca\x81\x88\x0f\xa6\x8c\xde/jx\x03\x8etX+\xa7A~T\xe1\x04\xcf\xbau\x84\x15:\'\x00@\x03\x98\xe5g\xa6\xe1\rX2\xf4\'\xf7\xb0\xb4z\x93Q\xf6\x1dz5\xba\xef\xf3\xb4,\xe0\xfc.\x94<\x14\xb4;?\x8bM\x80)pA\xa43\xf0\xe1wu\xe4z\x00B\x9d\x15\x00\xaaG\xf4kjs\x05\x11/\xc53c\x06\x17\x8c\xcd\xafq!_Y\xaf\xb4\x83\xfe\xad\xfe\x1f\xe64\x90\x16J5\x92\xaf\xf1l\xb4&\xd93\xd4\xc3oMZ\xb0U\xb8\x98\xb2\xa9Y\xe8\xcc\xd3*\x18\xa1(\x18,B,VU.\xf1\xcd-\xf9\x8d\xaf|k\x0f4Y\x9eN\xa4\r\xb5\x07]Y\xfc}\x9b=\x16\xf6a\x02\x7f5\x08X~\xbe%\xec\x1d\xdbo\xff\x19]\x8c\xa4fEF\x88\xd3\xf7\x80\xd0S\xad\x98\xa7\xd9ET9B\xe8\xb4\xd0(U\xe6K\xb0\x06\x87\x9a(p&(\x9e\xa0\xa3\xe4\xc3\xff\xeb\x04Y\xa5\xd4\xd9\x14\x99\xc9\xaf1\x07\xe9\xfa\xab\x066\xa8\xc9j\xcb\x13\x10;\xd0\x81\xac\xfe\x8eJ;\xd4\xd23>E\xfa\xf8\xd8\x8ehg\xb8X1s\xc0\xa8|\xb2ph\x1c\x08\xb0N\x93\t\xb1\x95\xa4\x1a;\x86\xf1\xe3\xcf\x1f\xa2\xcf!\xd6\xa8\xca(\xb8W-\xd6\x14\xa3\x15\x99\x03/\x10V\xa1\xffG\x9a\x12\xa8\xd9\xf1^;\xceM\x96\x17\x98\x97s\xc9\x08\xf2|\xbb\t\xbf\x96\xbb\x04lJ\x9e\xea\xb8^\xf7\xd2\xe2^\t\x0c\x9c\n\xf4\xbb\xaa\x99\xd8B\xbf\xceK)\xac\x9d\xff#\xc9d\xdc\xc6\xe2e\xceY\xb2\xa05\xd3\xe4\xabu\xa8\xeb\x99\xc9-\x95\xa9\xa41\xc57\xf2\x8eEOA\x15\xb3\xb7\x81G\'xK\xe6\x0f\x83\x9c9\xae\xdf\x94\xe3<\xee\xcb$\xea\xad\xfc\\\x0f\x1e\xa3\xa8\xc0\xea\xcc\x11\xb9\xac\x83\xc0V\x08I_pV\xd8\x13N\xc0\xfel\x9f:\xceD\r;\x01\x9c\xafS\xcf\x0b\x89<1k\xab$\xaaw\x12i\x89\xdbSc`xBrx\xa9\xcd\xb8\x03\x16\xeb\x9e\x1a\x07\xb9`7\x12\xd5\xd1\x82\x92\xbb\xd0\x88\xaa\xa1\xf3\x84\x9e\x9b\xac\xf8\x9bZ\xc24\x1e9j\x0c.TK\xc6)=\x1ft\xb1)\xb6\xff:\xb8="\xa3\xcaR\xdb\xd1\xbe\x0fIa\x95\xcc\xb4Z9\xe6NU\x7f\x82\'\xcf\x08w@\x10X\xcc\xf9{\xfc\xa0.\x00\xb6\n\xc8\x9c[x\xbb>\xbb\nohf2\xdf\xe8\x17\xb4M\xad\xa9\xec\xd9u\xb5N\xc5\x88\xe0\xde\x87O\x9f\xde\x03\xe1m\xa7\xd9c)k\xe8\xe9.\xfb3\x11\xa5\xfc|\xa5"\xc3\xd0\xbd\xdcpI\'M\xaa\xe6\xb1\xc0\x05\x08\xf7,\xa4\xe6\xde\xd1-*\xbfe\x14\xb4\xcc\x9c\x0c\x06\xfe\xf8\xba\x0b:\xf33\xda#\xa8\xb6\x17H\xb3n3a?\xb4FIG\x80fHpLI9\xf3\x16^\x0e\xf3X&\x08]dL\'\xcf\x90\x80\x7f\xea\xd3\xe3.\x95\xcfNX`\xa0W\x88E\xc1\xa4\xc9\x80`\x84*\xcd&$?\x1d\xbb\x0c\xd8\xd1\x1ce\xc6\xc2io\xee2\x14\xe7\xc5\x02v\x12<\xfd![=\x0b\x9f\xa0\x87\x08\xce\xd9}\xb1\xd5K\x9cQ\x9a\xad\xe5\xd5\x16\x0f\x12\xb7`-:s}\x06\x7f\xb9F\x90\xd1\xfc\x17\xb0\x02\x17\xacE\xe8]\xfc\xcf\xba\x9f)\xe2V\xce#\x1c\x1a\x1bk\x1f\xf3I\xde\xce\xa5y\xdf\x88\x942\x82_x\xfa%\x9a5\xe2{DM\x10\xa6\xdc@\x1b\x9d\xfb\xc12Ey\xbf\x14\xe7\xc1\xdf~\x96\xbd\xdbK\xcb\xf7\xe9\xb9zB\xffk\xdb=\xc6\xfd\xee,\xc2EK7\x8b\xb31\xb8\xb4\x9e@\xd8df\x95\xddtx\xdd>m\x89N\xe0\xe2\xcd\xb3sd0\xcc)?\x88\x0bj\xd3\xe8\xdb\xd0\x0bf\xe1DIX\xfc\xbfrU/\xc0\xca\x15\xca\xea\t\x83\xaa?\xbb\xc4\x9d\xc3\xb6<|\xec\x10\x8f9\x14\xaeY\xdc\x8c\xfcP\x9c\xde\x8b\xa0\x11j\xab\xf3,\xb0\xc0V\xd8]\xec*\xa2P6\x06&\x03\xb8kf\xa8eu\x08\xafv^@\xdbVP\t\xa1\x16-\x879yw\x8f\xe1\x9d<+\xa0O~j\x99Z/$\xcf\xf1\xb1\x08\xbd5v\x837#w\xb0=\xed\xdbcpa\xc2\xd8\xe5A\\-n\xf8-\xd0\xd4\x034.Bg\x8e\x88T\x84\x08(\xf5\xbe\x017\xaf\xea\xad\xa1\xa4p\xcfh\t\xf8Z\xec\x17\xa1\xe3%\r\xb0\xeas\x02#\xbd\xd1v\x7f\x8f\xc6h\xa6j\xf0\xca&\x1ft\x12\xf9y\xb3/jm\xfaV\x05iH\xc1\xfa@t\x8d\x92\xc98\x05\xd8wr\x1c\x18_\x12\x15\x99`\xd0\r\xb4\xea\xd9\xee\xb8\xe0\xfb\x06\x1a\x08X*\xf6%q\x11Ks\x905\xccB\xfa\xae\xfaO&%m\xd7-\x00\n\xcfo\xebW\xcd\x8c\x95R\xd2Rt\xfbi\xc5\x88Rl\xae#\xd9\x8c\xc5Zx\x82D\x8dL\xc36h\xad\x0f\x90\xc1\xaf\x0f\xd1\xf8\xb6\x8d!\x13R\xd9\x13\xc09>R\x84\xe3\x8e:\xeb8=\x02\x0c\xfa\x9e\x88\xf1\x02\x18\x88\xc4\xec\xe2L\x00`!\xfe\xad\xb2')
|
1
|
+
import click
|
2
|
+
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
from hiddifypanel.panel.init_db import init_db
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
from hiddifypanel.panel import hiddify,usage
|
9
|
+
import random
|
10
|
+
import uuid
|
11
|
+
import urllib
|
12
|
+
import string
|
13
|
+
from dateutil import relativedelta
|
14
|
+
import datetime
|
15
|
+
|
16
|
+
def drop_db():
|
17
|
+
"""Cleans database"""
|
18
|
+
db.drop_all()
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
def backup():
|
24
|
+
dbdict=hiddify.dump_db_to_dict()
|
25
|
+
import json,os
|
26
|
+
os.makedirs('backup',exist_ok=True)
|
27
|
+
with open(f'backup/{datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")}.json','w') as fp:
|
28
|
+
json.dump(dbdict, fp,indent=4, sort_keys=True, default=str)
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
def all_configs():
|
33
|
+
import json
|
34
|
+
valid_users=[u.to_dict() for u in User.query.filter((User.usage_limit_GB>User.current_usage_GB)).all() if is_user_active(u)]
|
35
|
+
|
36
|
+
configs={
|
37
|
+
"users": valid_users,
|
38
|
+
"domains": [hiddify.domain_dict(u) for u in Domain.query.all() if "*" not in u.domain],
|
39
|
+
# "parent_domains": [hiddify.parent_domain_dict(u) for u in ParentDomain.query.all()],
|
40
|
+
"hconfigs": get_hconfigs()
|
41
|
+
}
|
42
|
+
for d in configs['domains']:
|
43
|
+
d['domain']=d['domain'].lower()
|
44
|
+
# del d['domain']['show_domains']
|
45
|
+
|
46
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
47
|
+
domains=Domain.query.all()
|
48
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
49
|
+
|
50
|
+
configs['hconfigs']['first_setup']=def_user !=None and len(sslip_domains)>0
|
51
|
+
# configs
|
52
|
+
|
53
|
+
print(json.dumps(configs))
|
54
|
+
|
55
|
+
def update_usage():
|
56
|
+
print(usage.update_local_usage())
|
57
|
+
|
58
|
+
def test():
|
59
|
+
print(ConfigEnum("auto_update1"))
|
60
|
+
|
61
|
+
def admin_links():
|
62
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
63
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
64
|
+
server_ip=hiddify.get_ip(4)
|
65
|
+
admin_links=f"Not Secure:\n http://{server_ip}/{proxy_path}/{admin_secret}/admin/\n"
|
66
|
+
domains=get_panel_domains()
|
67
|
+
admin_links+=f"Secure:\n"
|
68
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
69
|
+
for d in domains:
|
70
|
+
admin_links+=f" https://{d.domain}/{proxy_path}/{admin_secret}/admin/\n"
|
71
|
+
|
72
|
+
print(admin_links)
|
73
|
+
def admin_path():
|
74
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
75
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
76
|
+
print(f"/{proxy_path}/{admin_secret}/admin/")
|
77
|
+
|
78
|
+
def init_app(app):
|
79
|
+
# add multiple commands in a bulk
|
80
|
+
#print(app.config['SQLALCHEMY_DATABASE_URI'] )
|
81
|
+
for command in [init_db, drop_db, all_configs,update_usage,test,admin_links,admin_path,backup]:
|
82
|
+
app.cli.add_command(app.cli.command()(command))
|
83
|
+
|
84
|
+
@app.cli.command()
|
85
|
+
@click.option("--domain", "-d")
|
86
|
+
def add_domain(domain):
|
87
|
+
table= ParentDomain if hconfig(ConfigEnum.is_parent) else Domain
|
88
|
+
|
89
|
+
if table.query.filter(table.domain==domain).first():
|
90
|
+
return "Domain already exist."
|
91
|
+
d=table(domain=domain)
|
92
|
+
if not hconfig(ConfigEnum.is_parent):
|
93
|
+
d.mode=DomainType.direct
|
94
|
+
db.session.add(d)
|
95
|
+
db.session.commit()
|
96
|
+
return "success"
|
97
|
+
|
98
|
+
@app.cli.command()
|
99
|
+
@click.option("--admin_secret", "-a")
|
100
|
+
def set_admin_secret(admin_secret):
|
101
|
+
StrConfig.query.filter(StrConfig.key == ConfigEnum.admin_secret).update({'value': admin_secret})
|
102
|
+
db.session.commit()
|
103
|
+
return "success"
|
104
|
+
|
105
|
+
@app.cli.command()
|
106
|
+
@click.option("--key", "-k")
|
107
|
+
@click.option("--val", "-v")
|
108
|
+
def set_setting(key,val):
|
109
|
+
old_hconfigs=get_hconfigs()
|
110
|
+
hiddify.add_or_update_config(key=key,value=val)
|
111
|
+
|
112
|
+
return "success"
|
113
|
+
|
114
|
+
@app.cli.command()
|
115
|
+
@click.option("--config", "-c")
|
116
|
+
def import_config(config):
|
117
|
+
next10year = datetime.date.today() + relativedelta.relativedelta(years=10)
|
118
|
+
data=[]
|
119
|
+
if "USER_SECRET" in config:
|
120
|
+
secrets=config["USER_SECRET"].split(";")
|
121
|
+
for i,s in enumerate(secrets):
|
122
|
+
data.append(User(name=f"default {i}",uuid=uuid.UUID(s),usage_limit_GB=9000,package_days=3650))
|
123
|
+
|
124
|
+
if "MAIN_DOMAIN" in config:
|
125
|
+
domains=config["MAIN_DOMAIN"].split(";")
|
126
|
+
for i,d in enumerate(domains):
|
127
|
+
if not Domain.query.filter(Domain.domain==d).first():
|
128
|
+
data.append(Domain(domain=d,mode=DomainType.direct),)
|
129
|
+
|
130
|
+
strmap={
|
131
|
+
"TELEGRAM_FAKE_TLS_DOMAIN": ConfigEnum.telegram_fakedomain,
|
132
|
+
"TELEGRAM_SECRET":ConfigEnum.shared_secret,
|
133
|
+
"SS_FAKE_TLS_DOMAIN":ConfigEnum.ssfaketls_fakedomain,
|
134
|
+
"FAKE_CDN_DOMAIN":ConfigEnum.domain_fronting_domain,
|
135
|
+
"BASE_PROXY_PATH":ConfigEnum.proxy_path,
|
136
|
+
"ADMIN_SECRET":ConfigEnum.admin_secret,
|
137
|
+
"TELEGRAM_AD_TAG":ConfigEnum.telegram_adtag
|
138
|
+
}
|
139
|
+
boolmap={
|
140
|
+
"ENABLE_SS":ConfigEnum.ssfaketls_enable,
|
141
|
+
"ENABLE_TELEGRAM":ConfigEnum.telegram_enable,
|
142
|
+
"ENABLE_VMESS":ConfigEnum.vmess_enable,
|
143
|
+
# "ENABLE_MONITORING":ConfigEnum.ssfaketls_enable,
|
144
|
+
"ENABLE_FIREWALL":ConfigEnum.firewall,
|
145
|
+
"ENABLE_NETDATA":ConfigEnum.netdata,
|
146
|
+
"ENABLE_HTTP_PROXY":ConfigEnum.http_proxy_enable,
|
147
|
+
"ALLOW_ALL_SNI_TO_USE_PROXY":ConfigEnum.allow_invalid_sni,
|
148
|
+
"ENABLE_AUTO_UPDATE":ConfigEnum.auto_update,
|
149
|
+
"ENABLE_SPEED_TEST":ConfigEnum.speed_test,
|
150
|
+
"BLOCK_IR_SITES":ConfigEnum.block_iran_sites,
|
151
|
+
"ONLY_IPV4":ConfigEnum.only_ipv4
|
152
|
+
}
|
153
|
+
|
154
|
+
for k in config:
|
155
|
+
if k in strmap:
|
156
|
+
if hconfig(strmap[k]) is None:
|
157
|
+
data.append(StrConfig(key=strmap[k],value=config[k]))
|
158
|
+
else:
|
159
|
+
StrConfig.query.filter(StrConfig.key==strmap[k]).update({
|
160
|
+
'value':config[k]
|
161
|
+
})
|
162
|
+
if k in boolmap:
|
163
|
+
if hconfig(boolmap[k]) is None:
|
164
|
+
data.append(BoolConfig(key=boolmap[k],value=config[k]))
|
165
|
+
else:
|
166
|
+
BoolConfig.query.filter(BoolConfig.key==strmap[k]).update({
|
167
|
+
'value':config[k]
|
168
|
+
})
|
169
|
+
if len(data):
|
170
|
+
db.session.bulk_save_objects(data)
|
171
|
+
db.session.commit()
|
172
|
+
|
4
173
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
174
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,60 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x14\x0f\x00\x00\x12\t\x04\x00\x98\xbbr\xef\xc3 8j4>\x83\t\xc6\x8f\x1c\xf8\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x15\xcc\xf6"#\xc05r\x93\xe1(\xed(\xfbP\x07\xd1?\xd2a\xd0H\xc1\x05\x98\xf0[\x1e\xaa9\xc5\xc5\x1b\xfd\xa7\xbb\xb8\x9b\xa5\xc0\'\xf0\xb3\xc5}\x1f8N\x06\x93\x02\x9a\xd5\tgi\x0f\xe8\xdd\x864=\x87\x9ai\t\xeb\xe4\xf0\xfa\xc4\xfb\xc9\x0452\xf7\x90\xed\xfetU\xba1\x1a\x1c\x0b\x1f\xb6J\x94\xb2\xcc\xe4\xf9\\\xf9\xe2\xb6Q\x17,\xa9\xadUW(\xfcV:\xf7(\xc7\xb4\xae\xfa\x0b\x96\x98\x7f\x0b\x80CA4\xac\x13J\xcc.\xaf\x0c\xe3\xd39\xfd \xe8\x8fe\x1d_\x1a+uQ\x0c+\x15\xbck\xdba\xd7VDK\xde\xd5>9\xd4\x89\xc2~f\xb7c\xd2\xdfK\x85\xccfs\xfa\xb2\xa2\x136#\xea\x047,\xa0\xf3\x0c\xe5G\xa9\x1c \xb6\x8d\x80\xd2\x1b\x1d\xae\xadd=3a\xc4Z\x12\xf7.2\xa6<\t\x90\xf8\xe2\xab!\xd5\x05\xd1 \xa6\xb1w\x914\xef6\x8c\xd0\x01\xd0\x1b\xdc\xdc\xc9\x85\x91\x84\xd8\x84\x1e\x84\xfe\x0f\xd4\x81\x95\x80S\xdf\x99H\xda\x98\x92/7\xc9%7k\xe0bi\xdfh\xb7{3\x1a\x16\xf0\x8a!\xa8\x82\xd3\x8a\xee\x9d\xb2\xd7\x1b\xef\x06\x93iQd\x01\xf7\x82p\xffs8\xc3\xdf\xd3\xcd\xce\x8a\x1b\t/89QF8+\xad\x0cB\xabW\xad\xee\xae.Np\xfd\xc2\xa2\xcf\xd5\xeb\xfcq\xc4\xf2\xde\x15ur\xf5\xb6o\xc7L\xa5\xa9\x940\xa4\xe4\xe5\xa0fM\xe8\xfcc\xf5\xe7I\x18A\xd7\x9b&0\x11\xf2\x04\xd2\xces\x8c0t\xf9\x11\x9e;\x1d\xdd.R\x1e\xcdI\x17q\xb29\xeeX\x1f\xd3\xd3)\xb9\x88\xdf\xe1\xddI\xc8n/\xa1\x10\xbb\x1a\x8c\xf9\xeb\t[\xd5\xda\xfbZ{\x1aMl\xcbV\xe7\x10\xbe=1i\r\x01=\xff\xc1D\x05\x82\xee\x03H/vP\xde\x9d9\xbb\xc8\x19\x1e{\x89\x95\x06X[0fR\xce;U\xb8\xaeRo\xd426>\xbc\xd6*\x19\x10$\xae\xc7\x0b\xd9\x86\xef\xb2\xa4\xe0\x8d\xf9s,YU*K\xef\xcd\xc4\xd5\x11k\x1dI\x84J\xb6\x07\xdag4\x0cI\xee!\xf3l\x9f\xbb\xfb\xd8B\x8f\xdd\xb2fD\xc7\x0cv~e1^\xfd\xc3\xec\xc0P.7\x98\xf5\x8c\x7fX}CB\xb2v\xc7\xa6z?\xfcy\xe6\r\x8e\xc4\x1a\xf8\xba\x1d\xcf\xd9R\t~Y@\xf0\xb2\xc2\x01\xb1Fw\xe1\x08\x8bB\x11\xa3\x9d\x82\xdc\xc0\xe3\xadK4SN\xec\xf4x\xd6\x98\x94\x08\x8be\xe9\x845E7>\xbd\x0f\xa2=`\xb5L\x991\x9ck\x13\x8d\xe6\xa5\xee\x1ee\xa7\x01T>C\x0e\x96\x82C\x11\xbf\xe1\x8bt\x18\xae\x19@\xc5\xfcv\x06\xa0\x0b\x05;\xe1$k`\x05\xf8\xe5\x07\xe4\xe9_$\x1cZ\xc1`\xfdl)\x0e\x03\x00\x10\x11\x16\r\x96\xbc\xcd\xd0\x0e/\xa5\xa4\t|\x9c!\x19^\x86\x03\x87g\x02\x1a\xf5/\xb5\xce\xda\x14\x92\x86V\xf8"\x86\x89Q\xe0Z\xdd\x83\x1dwd\x8dDB\xc8\x998,\xef\x15.3i\x99F\x9e@\xdb\xb2"\x10\x16\xc5`\x04\x03\x16\xe9\xe5\xc0\xe6\x8a\xed\xf5\xad/\xe0\xfdTh\x8aS\x95i\x8a[\x19\xb8\\\x1d=\x94\xfe0\xb8\xf2J\xa3b6\x8ah\x86\\\x9b\x19\xc4\x9c6\xcb\xc5\xd0\xc9\n\xf6\xd01}\xeb\x98_%\xfcSc\x94W\xf8\xb5\xb5 \x91\xf9\xf7\x01\x14\xf7\xafp\x1bCN\x00J\xb9\r\xc8S\x89\x02W\xbc\xdf\x14\xdc\x9aN\xb1V4\x9b\xc5\x1c\'\xa4\x9f\x98\xe5\xc6( \xd1\xa9OeX\x07Z\r\xdd\xcc\x1c\xed\x804C\xccD\'\xeaei\x95\xa0kh\x02\xb5{\xde\x8e\x93\xf5\xe8N\xf1_S\xe7\xd3E\xdal\xa44\t\x0c}\x15-"TNnYDC\x19&\xdd\x80\x10\xdcd\\wc\xe7\x94\xbcloB\x1e[\x84\xd6\xae\xb27u<&KT\xcf$\xd8\'\x1c\xc0\xfe\xd8\xd7\x9c\xf1\xe3_K\x1cp\x8f\xa4\xb7\x93E+\xa7\xd2\x9d\xdda\xc8\x1agg\x07\xa1\x8f\x96[O\x8a\xfe\xff \xbaUy`\xa5\x98\xa6\xac|\xafn\x7f\x9b\xf6\xff\xeac\xce\x81\xd4n!\x93\xa0\xcb\xee\x04\xe3!L\x85\xdd\x00}\xe7\xc7\\\x93\xda,\xe0\xc2PI\x0c\x15\xe2iT\xc0\xdc}V\xdd\xd9<\xd4v\x1e\xffN\xa9G\xc5\xbbG\xba\xf1x\x9c:\x13\xcb!\x1bBs3#\xf0C\xcfN\xac\xad\xa5]g\xca\xec\x0bC[&\xefMM\x8b\xb8\xff\x00Pgmc4\xa7\x9dG\xc0\xbbe\xb8O7\x06H\xde\xacs]\x8b&\xf1\x1c\xa9I\x83\x02\xee2\xdb\xbb\xac\xa7\xe6&\xb5\x07\xf2\x18\xd8\xe2&Z\xa0QCsD\x85T=\x03\x80:\x1c\xae\x8f\x80\x0b\x97\xcb=\xach\x9a0\xd8?\x85\xb2\x1a:\xbf\xa2H\xfe^1\xaf\x88\xed\xf5\xa1\x15\xcb\xe6\xb9\x0e\xb4\x0e\xade\x088l\x98\xe5 \xc1\xf21*d\xd3\xdbO\x05\xaa\xf6h\xa2rFT\x11=O\xd8\xa8A\xcc\x83\x18\x07\x80\x9f\xf96x\x02s[\xb3\xf2.\xca\x08\\${\xed\x9c\xe7\x8d\x1b\xf2y\xd7S\xc8\xc0\x08\xab\x1c@\xc0\xf2\xc8\xb6\x83\x0eO02q\xe6\x1b\xaeG\xc9\xa2\xcf\x94\x98ZIw+\xf9#\xf8\xd8\'\xcf\xa3%_\x12\xec\xae\xb1x\xdc\xe8B\x16\xfd\r!Q\xef\xa0S\'-\xb1\xe5W\x1a-s\x96\xdc\x1a\x97\xf7b\x15\x97\xf5\x86\xbe\xd6\x81e\x88\xe2-\xe9\x13\x07w\xed\x87\x14\x1c\xe8\xb8\xba21P\xb4\xa6\xacV1[\xbc\xaf\xc7f\x1bc3}\x84\x83\x95\x83\xff\xfc\xd1\xeb\xd6\x0c\xe8y\xaeF\xa6r\xc3Wn\xda\xe6\xbfZm\xfe\xce\xc3z"\xfen\xfdJ0\xaat\xdf"\xabt!\xbd\x0f\x9fC\xd1\x07c\x94\x1c\xfb/\x06vm\xf8\x17C\xb5=7\x0f\x96\t\x87c\x8a\xf5\x1b\xbe47}\xf0\x81y\xab\xa72\xf1\xfd.7\x94=\xc3\x89\xf7\xa0\x94\x89\xbe\xd3\xcf\xd5\xde\'\x17`\xd6xg\x07Y\x0fn\xd4&R\x9d\xf4\xd4b\x15~\xf8OI\xd0\xd2e\xa7H\xa90o\xfbC\xa2=7\xecwu\xa5\xbdlRq\xb8iZ\xc1\xd1<\x80Hd\x8d\x9e\x1c|\xfcT\xa8\x19\x9d\x8d\xf6\xae\x16\x81x\x1f\x15<b\xaa\xe81\xea\xde+XS\xa83\xeb\xb8\x13\x13x\x00d\xaf@\x8a\xdf\x8d\x9cJ\x86n\x9e*al\xbeS\xec^\xd3\x1e\x81\xc4\x1a}\x88\xe2\r$4\xc0\x94tt\xf3\xeb\xc0\xba\x0b~\x1c\xd7\x93\xe7}\xa4\xfe\x9d!\xbb\xa4\xfd\xa8X\x93\xb6$v\xd9\xbf\xb89{\xe3\xeaV\xb1\x84\xa6\xa3\xe1\x07\x9fw\xeb\x96\xbb\xd1#7\xee\xfb\xd8\xaa\x86\xd6_X\xd5\x8d\xda\xe9\x88\xc1\xbcl\x17z\xf2\xc5F\xb7\x9d%\xd6;\x0e\x88>\xdf$g\x80\xa6ul\x00B\xcdQ\xbe;\xa6\xd5w\nl\xd8\x15f\xe9Q4\x1fb\x17\xd1\x03\x8cqt\x89\xb9\x9b\xc0\x970\x97\xa8\xb0\xb4\xa2\x95\x94\xc5D\x8b\xe3\xbfM\xf9\xbf\xac\xaa\x00zAht]V\xdc\xd7^\x0c\xff\x9aJUp\r_\xfa\x9d\xeb&\xa6\xa3e\x19\xb1\xc5`\xee\xcd\xa8\x19\x99\'\xf9\x1c\x1a\xc4\xb3\xb3\xa8x\xf6\x1b\xb9\x01\xc3\nX\xfc\xd0\x90a\x1b3\xb8?q\x1cr\xc5\xe7\xa8\x99\xa6uW\xd5A\xbb\x11yM\x8dOqj\xee\xca#3\'gS\x02\xf5\xa1\x02\x0c\xd52C\x93\xbc\x8e\x84U\xa8\xea/\x96\xdaR\xfe\xaf\xaf\xcd\x8d\xcf\xaeQ\x1b\xc63\x9f\xde\x11^\xd0\x81\x05\xd3\x97B\xac\xde\x9f\xf3\xf3( \xa9\xa1\x1f\x7fc\x94\xd9\xa6\t\xe3\x1a&\xd2\x90=\x859\x08\xda<gp\x06\x08m\xd0Fm\xf32\x98b\x8b\x1b\xaf\xa9H\xf5\x89\x92>\xc3\x82n,}\xda\xa8\x1aa\xe3\x91\xa0\xd3\xb9\x94\xcc\tx\xf7\nB&\xeb\xa7\xaci\x01\xb5\n\xb8\xd3\xae\xff\x1d\x0b\xa7\xe8\xaf\xbb\x10\xfdR\xd9\x87\xa1\x04\xa6k\xfaGz-\x9e8\x8c\x05!\xbf\xf4\xcajx\xb6,\x87.\xa9\'\xdd\xf0\xe7\xc7\xaf\xe9\x9d\xac\xc61\x1b\x9dv\x0c\x88^\x8d<I\x02\x94\xaa\x00\xb5En\x05^h\x16Q&\x8e\x8e\x10YSk\xf1Nm\xcf\xab3<\xa1\xffo`Ze\xfbpR\x8f\xf8\x0b\xd7\x8bQ_L\x8b\xef\xb7E>yN7C\xe3\xf7=\xf8h{\xcbj\xc4\xb9>\r\x9c\x7fO\xf3Y\xf8\xec8L\x00\xdeAu\xfb\xd9\x825\xbe\x1d\xc7\xa10\xb7T\x9fZ\x17\xa4]\x12\xd7\xa3u\xab}\xbd\xb5\xf2\x15\xfc\x14\xdb\xdc\x16\xf5\xb5\xb3\xe3\xe4\xa1\xd8\xa4\xd4l\x15G\xd8\xaa\xf1\xe2\x93*\x99B\x01F\x1d\xec\x07\x12\x89c\xefJ\xe2\x08CM\x9eO&\xf8J\xb7_\x82\xf2\xcbI)1\n\xe4\x80P\xa5\xd4{\x8d~\xf41x\x9c\xa59+\x97\xdb<x\xc2>\xbaa\xdeitw \xffO %\x97\xfe[\xfc\xc3\x8fe\x0c\xaeg\x06\xb1\x9a\xb6<m\x81\xb7@\xdd\xcf\x84\x0b\x0b4\n\xf87L)\xf8\xc8\x96K(\x11V?2`\x8a;\xceS\xf0R\xf6?qHJ\x1e\xae\x99mN\xca\x1e\xe5\xea\x1eE\x1dG\xea\xa5y\x1a\xa7\x10\xd0\xc1\xadV\xb9\x0b\x9cOi\x08\xd5\xe7W?\xb3\xb6\x06\xefW\x94z^G\x85V\xe2bRIM\x02\x1f\xbc7\xac~"T\xda\xe1\x9f\xfd\xadx\xa6\x80\xffQ7\xd8\x10\xf2:\xaf\xdbh\xe5C&\xf0\xd8\xda\xe9\x07.,Q\x89\xfa\x7fr\x9e\xf3\xaaU-\xca\x0e\x85\xd0\xbe;\xb1YQzE\xbc\x95\x13\xd3*\x14\'\x7f\xc6B\xf8\xc7d\xbe\x1f\xeaL\x15\x83;\xb37E6\x18\xf2\x1e\xd6\'\xb7\x95\xa8\x87\xa6\x9e\xfb\x93\x05\xec\xd0\xcc\x19cix0b~A2\xe4\xae\xeb\x9cU\xb4\x9e\xb5O\xb4W\x82TD\x17"\x16\x8a\xdb\xcc\xd6DG/"\xb0\xd6\x85\xa5;\x0cta\xcb\xcd -\xec%\xe8w\xd0\x99*CI\x91\x0e\x1fO\xbf\x19\x0c\x1c\xbd\x1c\x02\x8d\x0e\xa1\ry\x00\xd5_T{\xde\x14\xef\xc0H\xec\xc4\xd0h=\x87Q8\tv\xbe~\xe5\xbe\x821\xd9\x8d\x1d\xf4\x0fna\xf9\x896\xf8\xb7N\x7f^\xad\x1a\x88\x8a\xd5\x07\xd5\x00\xff\x80\xa8\xf6\xe0\x96\xd5\x1fp~\xecq<\xce\x90 5\xe2NP\xb3\xef\xbf\xf6\x7f\xeb\xea\xbb\xd9E\xae\xe9"\xd6\xb9\xe6\x8bE\x9aBN\x02L\xfbs\xdd\xc86Y\xb4?)\x84|\xf8\xd6\x0f\xf7\xdb\xce\x92\x1a_$P\xfb\x16b{\xc8\x91V\xd5\xb2sd\\O#\x98\xc9z\xef\x90\xe7\xa7\x89\xd9\xeb\xd4\x13\xfb\xc0;p\xdb\x03\xfdHF\x88O\xcd{\xa2\xf5D1\xd0g,\xc9\x0bj\x9b\xf5\xab_0\xab\xbe-|^<$\x8f\x18\x19\xe7\x87\x04y\xc2iR\xb0\x12\xfd\x90\xd4.i\x8fb<\xd2\xae\xb8\xd3\xb5b\xe2\xfc"\x0f\xb3\xf2\x8b\xbb\xfd\x11<oe\x16\xde}\xbbk\\\xfck\x1bgTvM\xce}|\xde%\x82LV\xb4b\x88\xc5%\x04\xb8\xc5?\xd3\xe1\xe4\xb3\xa7C\xcdGB\x80<\xc6\xff\xf2\rmz\xe8~\x82\x1av\xf5"+\xb6\x10\x1a\x0f\x9d\xb5c\xb6ZM\x87\x84\xc02\xc1\x03\x01\x8d\xcb_\xa3\xae7\xa9OEa2\xc1/\xde\xf5\xa8a\xa6\xf9F\x18\xf0\xea\x1e\xbaX\x8d\xe7\x83`\xf7*\x8a1x\x19\x83\xdb\xa1\x02zMP^3b\x0b\x9b,\x10\xb7\x99\x15\xee\x08\xb0\xc0\x94JA\x85_\xe8UpS\xca\x92X\xef\xc3f\xbd\xf5:)\x1b4o\xa7B\x86\xb0\x9c_\x8d\x80\xeeI\xa6~\x87\xa5@7\x10\xe6\xd4\x11\xa17\xb2K\x9e>\xa03\'8\x97\x0c\xd39\xb6\xabB\xe7\xd9\xffUW\xc6\xa7\xc0s\x00\xa1\x17J\xfa!\x8b>\x91\x0e\xe3S\x9d\xb8[\xb8\x0f\x1d\x84\xf5?c\x16\xf7X\xb6\xd8\x93\xbc"\xe4\xdc$\xd4\xdeMM\x80\xef\xb2\xa8\x0f\xf4\xd3e\xdaBt\x7f\xbf\xd9rc\x95\xa3O\xc4\xca\xa2\xcc\xe6Z\x86\x8d\x07&\xdc\xe9\xee\x00i\x89\xfe\x1d-\xed\xee\xb9\x02\xad\xf3E\x1f\xe4Q\xb8z\\\xb9\xd3\x15\xfa)\x107\xb3\xc9\xc3}\xcc\xcf*\x90\xcc\xa6T\x12\x1a\x89\xdf\xb7\xd1\xbfl"By@\xac\'\xdea\xda\xf0!\xf3\x14\xbc\x03\x05\xca\xa8Z\xf7O=j\xbeZ\xb6H$\xd1\x99-\x90\xff\xa3\x1c\x14\x01\x8d\xa1\xa9%]\xf3\x92#V\xde\x16\xfd2\xa9\xef\xab\xe5h\xf4i\x81\x84\t!u\xbc\x01"|\x8dI\xbfl/\x86\xde\x89\xb7\xf6\xf6o>\xf8/\x85^G\xeb\xcck\x0f3zt\x11\x85\xa5,\x91\xbe#2J\r)\x89Y\x94PnW\x8bJ\xdb\x8a(\xa9\x9a\x07}\xc6\xc8\xfdTd\xc2c\x0cD\xf8u\xbb\x01t1\x07\xa2\xd9E\x00\x9f\xa2\xf5J\x1f\x8f\xbc\xef0J!\xb9\x98\xcc\x08\xe8\x83\x15\x01`\xdeODZ\x1b\xea\xcd\x0f\x82x\xf3^X\xa5\xff+\x06\x91\xcei[\x82\xb4\x7fK\xd4\x98\t\x0e\xa3\xfbC\xde+\xbf\x9ddY\xd4X=b\x81F\xb5\xb9\xbc<\x13\xb2\xd7\xf9\xad\xdf/\xadtf\x11\xd03\x93gY|l\x91\x17q#%>\xe5\x1c=\x8d\x02\x16\x08Hl\x87\xe1V\xcb\xe3\x0e\x1f\xce\x05\x1dV\xe6\x9d?\x83e\x90\xf3}\x80\x00\xc5\xbds\xcc\xc9\x8f\xfe\xc7\xc1\x92\n\xa5j\x1en\x84d\xb0\xdd\x1f\r\xbf\xfb\xd0\x08!\x02F%\x1a\x91\x81\x9f6\x89_h\x8a\x9f\x1f\xe5(\x99\x04\xa1\x0cjL\xa18\x0b[\xd9E\xc0\x8d\x82\xf1s\xeb:\x8d\x04Rq\'CW(6==r,S\xd9\xf2!lW5\xd7\x9d\xee\xfd\x80\x16\xcd\xe1^eq\x12\x8f3\xa2T\x9bK\xb6\x0b\x92\x05S\x1a\xc4\xc1\x1b\xb3\xe3\xa7\xc6\xf55\xbd\x17o\x9b\x04\x07dL\xf1\xd4\x05-\x10\xd5\x0f\x98\x860\x825\\\xf4\x94\x84\x83\x10\x03[\xe9\x87w{\x94A\xca\xbf\\\x93\x97\x9b\xd0\xfaeQ6\x7fJ?\x84\xf1!\x13\x9f2\xb4\xb1\x1a\x95\xfe\xf9\xe3]\x85\xa59Z\xec\xdcc\x8b\xc6th-\xe5;\xf0*\\/\xd7,\xf3\x08(\x89\x9e\x0f\xc1~\xba\xc9\xd0\x0bA\n9R\xcf\xbe\x14\xc2\xac\xc4\xf8*\xab\x0f\xc7\x8c\xe1\x90$"\xd0\xbb\x01U\xa1\xbaGx\xde\x92\x8b~4\xe1+h\xbc\xe1\xff\xa9\xb8C\xb9\xd5\xe6a\xf9\xce\xb0=\x13r\xa6wl\xc7^\x93\xe2\x85\x89L\x02S\xd3\x06\xfd\xb0("d\xcc^S\x81@\'DI\xd8\xc6#\x13\x81\x80\xc1Q\x14-\xae\xc7Y\xc7\x1a\xdd\x0c%\x1d\xb0\xdb\x07\xb8\x10\xeb\xd3C\xae\x9d\x8f\x91_\x1exg"ll\x93\x0e\x90\x99r\x8cn\xb9\xf3\xc1\xe7\xa87I\xde\x08\x026\xfbru\xb2\x01\x89\xbd\xb6\xa8h\x99`\x066\x96V5\xa0\x8d\xfe\x8fc7g\xabi\x0b\xd8\xc0\xfa\xd7\xfb\x0c\x8c\xb3]\xb9\x83\xf8+\xf7\x1f\xbc\x8a\xec\xe4S$.\xaa\x9b\xb5)\x13\xa5pm!F#\xab;\xc7GB\xfd\xe5\xe6\xd3\r\x91\x14H\xa8m\x85\xe5\xc5\xa8\x9e\x80\xf9H\x8aC\xad\xfe\x9b{\xadA\xfc\x8a\xab\xcd\\6\x9d\xbd"\x80\xf3_\x149;\xdb\xdbe\xff\x11\xf6\x15\xd5r\x87`\x92p\x01\xcf)\xaa1i\xfd\xa9\xb8\x8dH\xce\x0co\x8cvX\xfd\xc0\xb8)1\x10]5\xd7\x1dx\x89L\x0c\xcbIG\xfa?\xca\x89\x8aW\x15$\xc0V\xcc\x065\x82\x01p\x03\xb0>\xbb\xde\x91\xc4\xc3\x8eC\xbc<\xc3H\x08\xa6\xd0\xec\xc9\x94\xf5k\x9c\xceP|\x8e\x82M\xcf,\x1e\xd6Z\xc4\x8e\xb88\xe4\xdfx\x9a(\xab>\xc8\x9c\x8b\xeeI\xfc\xe4\x1a\x0fr\xd30\xff\xa6h\x00\xf9\nE\xb6U}:|( <|\x03\xbc\x86\x0c\xdfG\'\xa3x\n\x92eW\xaea%JOf\xc3\xb2\xbc\xa4l\x90\xab\xf2#\x8c\xf1O\xb6Z\x9a%\x9f\xc9k)U\x82^\x88\xd6/\xd5o\x8a2\xbb\xd2\xfe\xef!\xb0;\x8c\x9b"6y\x82+\xb66\xec\xdax/\xc3\'\xf9~\x85\x81\xe7XN\x0cy\x9e\xab\xd6\x8f\x17o\xad\xec\xe1\xa4\xe9\x12\x9b\xc4A')
|
4
|
-
|
1
|
+
from flask_admin.base import AdminIndexView,expose
|
2
|
+
from hiddifypanel.panel.hiddify import admin
|
3
|
+
from flask import render_template,url_for,Markup,request
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
from hiddifypanel.panel import hiddify
|
6
|
+
import datetime
|
7
|
+
from flask_classful import FlaskView,route
|
8
|
+
from hiddifypanel.models import *
|
9
|
+
from hiddifypanel.panel.database import db
|
10
|
+
from hiddifypanel.panel.hiddify import flash
|
11
|
+
class CommercialDashboard(FlaskView):
|
12
|
+
def index(self):
|
13
|
+
return ""
|
14
|
+
bot=None
|
15
|
+
# if hconfig(ConfigEnum.license):
|
16
|
+
from hiddifypanel.panel.telegrambot import bot
|
17
|
+
|
18
|
+
if hconfig(ConfigEnum.is_parent):
|
19
|
+
childs=Child.query.filter(Child.id!=0).all()
|
20
|
+
for c in childs:
|
21
|
+
c.is_active=False
|
22
|
+
for d in c.domains:
|
23
|
+
if d.mode==DomainType.fake:continue
|
24
|
+
remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
|
25
|
+
d.is_active= hiddify.check_connection_to_remote(remote)
|
26
|
+
if d.is_active:
|
27
|
+
c.is_active=True
|
28
|
+
|
29
|
+
return render_template('parent_dash.html',childs=childs,bot=bot)
|
30
|
+
# try:
|
31
|
+
def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
|
32
|
+
domains=get_panel_domains()
|
33
|
+
sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
|
34
|
+
|
35
|
+
if def_user and sslip_domains:
|
36
|
+
quick_setup=url_for("admin.QuickSetup:index")
|
37
|
+
flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
|
38
|
+
elif len(sslip_domains):
|
39
|
+
flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
|
40
|
+
elif def_user:
|
41
|
+
d=domains[0]
|
42
|
+
u=def_user.uuid
|
43
|
+
flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
|
44
|
+
|
45
|
+
# except:
|
46
|
+
# flash((_('Error!!!')),'info')
|
47
|
+
h24=datetime.datetime.now()-datetime.timedelta(days=1)
|
48
|
+
onlines=User.query.filter(User.last_online>h24).count()
|
49
|
+
total=User.query.count()
|
50
|
+
return render_template('index.html',onlines=onlines,total_users=total,bot=bot)
|
51
|
+
|
52
|
+
@route('remove_child', methods=['POST'])
|
53
|
+
def remove_child(self):
|
54
|
+
child_id=request.form['child_id']
|
55
|
+
child=Child.query.filter(Child.id==child_id).first()
|
56
|
+
db.session.delete(child)
|
57
|
+
db.session.commit()
|
58
|
+
flash(_("child has been removed!"), "success")
|
59
|
+
return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|