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
@@ -1,5 +1,73 @@
|
|
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\xe6\x0f\x00\x00\x12\t\x04\x00\x8f\x9e\xdd\x8f\xba8\x0e\x8b\xaf}(\x89\xb0.\x05\x0e\x00\x00\x00\x00\x00\x00\x00\x00\xaa^\n$\x05\xd2~\x1fYa"E\xd0\xb9"Q\xa9\xd1D\x88\xac\x1b\xcc1\xbc\xd8 !\xe6^\x01~\xc3\x83\x93[@\xaf5\xae\x03\x0f\xcff\x7f|\xd4G\xb7\xf9\xb25\xda\x05\xcd\xb3\x0ex~\xbb\x16\xcd\xef\xf8O\xfeTU\xa8\xb8\x81\x85(\xb0$\xc4lo_9\x1f3\x8d>\xdfy\xe0\xf9h`\xbeO\xfa\xe9\x87\xf7\x9bC\x85\xa0\xb8\xbd<\xd6:\xb5\xae\x02\xde\xc6\\\xc2\xcf\x8a\xd7aCeb$\xca\xb8\xf4\x9d52\x84\x02\x8d\xc7\xb1;!;\xe6\x9b2\xdc}_s\x01j&\x10\x80\x1cG\x85\xb3\x16,9+\x0b\xc2%\x8eY\x8a\xa5C/\xe5\x98\x1ch-\xfa\x04c\x9ae\xb2\x10l\xf0\xc7\xf5\x81\xccG\x0e\x9e\xac\xdc\x85Ud\\\xd7\x0c\x99=[,9:\xf9\x003w8\x96\xe3(j\xdb\xcf\xd7L\xb7\x8d$\xcf\x00$\xc5\xee\x12\xf3\xabW\xb2\x91K\xb1\xb2\x7f\x05\x04\x8a\xeb2\x0b\xf0\x85}\n\xb8\xb3\xdb\'\x82i\xbb\xd2O\xc9#\xb9\x00\xfc\xaf{\xcbK\xb9\x94\xcft\xff\xcb\x02\x9a\x02$\xc3W\xd9P\x10+^\x1bo:(\xe1g\xce)\x18Xk\x92\x1dz\x8cs@Z\x160\xdf\xca\xfd\x077\n\xb2\xef07^\x00\\\xd5\xdd\xf7\xd2\xb2e\xd9\x89\x86\xe8\x00\xa4\x00\xabYw0R!\xb1\x07\xf5$\xaa%\xef\xb7`V\x9b\x81@\x7f~\xa1D*L\x90\xd9\x04\x08\xb0\xf1\x1b\xc64\xab\x87\xac\xa5\xfaX\xc3,\x17R\xcf\xca\xab\xb0\x91\x9c\x86\xb2xS0r`\x01hg\xf3A\xee\xfa\xc2[\xcbiEN\x1f^M*\x1a\x07\x91\x1f\xddF\xce\x08"\x0c\xb5\xedA@\x96\x15\x8b\xf0U\xc8]\x9f_\x87O\xa3\xef\xf7\xd0%"a\xa5\n\xd4\xaa\xcc\xa9\x06\x1ai\xa9l\x9b\xa3\xd2\xae\x10m\xd6\xbc\xd7\xd5\xca\x99\x88MF\xe6\xfd\xcd\xff$|\x80\xbfn\xf9\xf6p |>\xb8\xffA\'\x83\xb3\r\xdcEx&\x9ft\\M\xe2\xeehv\xc0\x9a\xe5\xe7=sd,\xbf%\xd5\x0c\x9c<\xabU}\xe8\xa0\xc1+M\xbdo-e(\xd5/t\x05W\x1dW\x0b\'w\xa5\xfd9V_2\x1f\xa7\x94(=\xa2}\xf0U\xe0\xa6\xed\xb6\x14\xf0\xce9EE\xe7\xdb\xe7\xbc7(\xe9y\x8f3\xe8r(\xfe\xf0m"\x82y\xe7\xba\x0f\xc0Cc\x9d7\xa5\xd2\xa1\x0cQi\x03\xe35\xb5\xb4S\x830\xfb\xc2$\x85\xab \xb3S\x05\x96\x07\xa7\xa5+\xf4B\x15\x9f\x08&P\x14G\xach*\x06\xf1DQ]$\xff&E\xc2C\xc9\xebD\x1e2\x0bg\xd8\xda\xa7\xf9\x18 \xfa\xb8\xb1\xf8D\x9f\xff\xffR\xb7\x15O\xa8\x86\x1bp\xa6\x8dE\x99\xaa\x0b\xf5\xb7\xdc\x03)\xf0\xc7\x96\\\xac\x04\xd3\xe4\x06\xcb(?n\x0bQ\xa7\x14\xf1\xab\x07\x7f\xdf\xf03\xa2\xd9k\xcf\x9a\xde\x94\xe7 \xb2\xd5\x06\xd6\xf4\xa0\xee\xf9\\\x12\x87\x88\xa6\x97All\xae\'\x1d\x88\xf2N\x00\xd0\xde\xaa\x87\xb78?!\xd9\xcf\xee\xf2\xf8\xddpXC\x11\\\xc9d\xe1\xfd\x9f\x05\x84-\x91\x17\x19^,\xe8\x9e\x14\xd2Z\xa5%\xee\xf0\xd2\xdc\xb3\x19\x1b\x1c{uI\x99\xdds\xab\xf2.$v\x15\xfb\x85E\xd7\xff)\x18\xf7\xf3\xa55\x9e\xcd\xfa\xfe\xc6x\xa5\x8fg\x02P\x02\xb4\x08\x93\xf7\xf1\xfb\xe9;\xe5c\x1bZ\x87\x84\xfbU\xb4}\x96z\x18".qNq\xcb\xe2\xb5\xc8\x9d\xd6\xea3.\xf4\xf4\x95\xb6.\xc5\xf3?Nr\x0f[\x9f?\x87\xef\xa3H\x85\x19\xc5\x9f\xba\xefY\x8bI@\x9bi\x8b\xb4~\xe6\xa7P9m\xfe\xeb\x1b\xc0\x0fK\x12W\x10C\x1e\xdacakM\x9ex\x19\xce\x08\x00\x18M"L\x08\xc4{\x94\xb1\x97\xb8\xb8qn\x19\x97\xef\xb4-L68\x14yZ\xb6\x98f\xc2\x92U\x82\x0f\x1e\x18\x17c\x7f\xe6\xae\xf4\xf0/\x08%\xf8%\xa3\x9c\x1c\x19\xb2\xfa(A\xe2`Elw4!\xdc\x1c\x19K\x8a\x1b(\xe3\x1ey\xffq\'V\x0e\x99a<\x19G\xfb+\xe5\xfa\x12R\xbc\xad\x132\x0f\xc0\xc5\xc6$p\n%T\xe7\xafI\xc3\xda7f[\xd5\xc53\xc4%\xaa\xf6\x9e-\xc7\xd3h\x8fR\xdc\x11\xbb~\xa75\xfc\x88\xe1\xfep\xf2TE\xdb?n_\xe1\x0cB\xd7N\xd6\x11/\xa8zh\xa6\xbap\xa2\xdc\x8dt\xb2\xa8\xe6\xd2\x1b\xd9\x81\x9d\xbf(\x01y\xc40,L]\xf4\xf0\x84Nx\xeb\xbc\x9c\xe3\x84\xd67ms\x9d\x1c2\xb8o\x18\xfb\x15B\x7f\xf4/\xec\xb1\x17\xb8ZR\xdc6\xa0\xd9\xca\x8c\x7f\x99\xf4v\xbdw\x81\x13[\x1bi<P\x97\x87\xba\x0f}z\r\x00\xea\xba}\xe4\xc3|*\x97\xd5c\x83\xf1E\x00g\xb0\x9e\xf7a}\x9c^@\xa8\xfb\xb27O/>\xb7a\x92\xec02\xdd\xe0\x86\x1f|\xb6\x8d\x03\x07\xd7\xb0\xe4d6\xb1\x9ccs\xb3t\x1ap\x03\x85\xd7\xf7\x03\xf4\x1c\x81\xaa\x12\xf1\x96[\x9e\xcf3\x8c\xd1\x84o8[\xc5qi\xa61d\xa1w\xe2g\xa0Y\xd7\x9d\xb0\xbc\x04w\xd1+]\x83k\xad7%\x86iv\x97\xd8\xa8\x05.\x0e\x89a\xa1\x10&+bQ\xb1\xbb\xd1\xad\xa6N\xf5n\x92\\o\x80\xc1J\xa6\x81\xcdB6\x8d\xcfJ\x8e\xff\xd8\xdfn\xc18b~\t=v-\x90\xc0~+hOzz\x8e\xb8\x02\x00\x14.)n\x1c\xba\xe6\xee1\xa5\xc1\x13i5\xa1M\x02\xaby\xe0\xfe}8\xbc\x82@\x89\xea\xc7I~\xdar\xf9\xdf\x88=\xcaLg\xb7\xa0\xd3\xc9\x87\xe9\x0chN4f\ri\x96\xed\xb7\r\xe9MN\xd4}v\x99\xcf\xec\xaa\x80\xae\x0bA\'\x18\xf9\xc6\x90\x95\xe6\xc0\xb2-\xa4S7LJ\xef\xa7)b\x9bN\xe3N^0\xb5\'Z\xd1\xda\x90\x1eQ\xfaA\xf3Q\x80\xc3\xa13\xc8\xe4\xac-\xd0pK\\\xf9l)\xa3`%Mm\xc3\xcf\x8a\xd3d\xfb\x19\x9dk\x1a\xc5\xa2\x13\x87\x8b}cT^\xa6\xf5\tF\x88\xef\xf7\x93\xe1\xd7\xc9|\xc0\xaa<\xf8\xc6\x9d\x0b\x0f\xcf\xe9\xf4\xda\xa5\xef\xbbo\x88\xe6f\x1aI^\xf1be\xb5\xf9nM\xe2\x87\x81\xb1BF\xe3\x9a8\xb3Wk\x16LP\x8a>\xa9$\x1d\x91~\xbasu#;\xba\xc1\xed\x0cW\x05\xa0\xf3{\x98r\xfd|OF\x00\x1aF\x0e\x18\xbcZ\n\xaa\xe3\xc7M\x953,=}\x12\x8d7\x929\xcbm7\x00 \x9c\x87\x11\x90\x9c\xb9\r\x8c?\x89\xc0\xaeO\xb3,\xd3gJ\xa3\xa6\xe3J_~%\x9f\x0c*\xae\xbc\x0b\xa4ib\xc4\'\xe5\x00\x16\x8a\x16F+\x8c\x0b\xf2\x13#\x1a-\x18u,sH\x0cX\xe2\xe1}\x0e&\xba\xca\x89\x9f\xb6\xf2N\xbfPus\x10\xca\xe3\x808#7\x1d\x14)\xc9V\xf6\xc8H++\xb1\x84\xc3z\xac\xd5\x15\xc1\xb1\x9d,\rD\xcfY\x99\xcb\xdbtt\xf5\xd5\x03\xb1|\xb8\xd2\xc7\xe05F\x1cX.\x19\xf74\xbf\xeb\xec\xdd\xa0,\xa2X\xac\x9f\xa9\x7f\r\xcd\xa6\xf1\xa5z\x96VX\xb8\x99#\xdfb\xe8\x1e\xd0b\xe1<m?\xfa\xe1s>w\x9a7\x0bw\x0b\x1f\x85>\xc5C\xcc\x9d\xe9\xe5\x01anyV\x9e\x9f0\xfa\xd3\x14\xee\xa0\xa5\xdb\x19\xd1\x04Q\xf9i\xd4\xc9\x16\x1d\xa6\x8eg"\xbd\x13\xf3:_\x90_\x11t\x96o\xa8\x9a5\x8c\x89"x\x08\x10hPD\xaa\x10F8\xd7\xc4}n~\x7f\x86F\xaf\x17\xd8\x8f\x1f\xaer\x11\x1d\xbe\x0f\xfc\xb2\xd4\xc4 \x16Mzf\xb3Q\xf4\x8f\xd6 U\x11P|\xafb\x8c\x90b\x92|\xeb\xf3\xbb\x1d\xce\xeaSo\xf3\xe3\xee\tu\x91\xe5\x08\xe2,2O#\x00\xe8\x15J\xe8\x0e\xc2\xc6a\xd6Q\xb8\xf1\x9eD\x1d\x87V\xce\xebB\x9e\xbc!\xc3\xb9,\xbb,y\x8eZ;2\xff\x96\x00\xcaW\x13\xdd\x9d\xe2o\x95\x97w\x86\x03\x15fI\x91^\xe0-a!f\xe0\x00p.E\xc91\x11\x9bZ\xbc\xdbG\xf2\x83\xf5\x06\x81\x07L\r\xf3,\xf53\xce\x9aP\xc1>\xb4f\x08\xb9\xdb\xc6:\x99"&\xc7\xe1\x8f: 74\xcb\xa1\xa1(^\xc9\xf1\xd1\xd5VT\xb2\xcblG%\xec\xf8\x9d\x0eWzE\x00\x0e\x9d\xcc7\xf7\xcb\x80\xf8\\\x18\x96SG\xda\xab\xb9\xc6/7z\xe0\x0e\xe9\x8fW\xa4\xb3\xa2\xdb\xf9}\xa5\xd6\xcd\xff\x9fG\xa2>\x85`\xf5\x0czqp\xde\xf6i\x8fcD\xf1\xef\xfe\xfeOE\xa6\x8b.\xf9\xcak\x17r\xd8w\xd2\x8fJ\x16\xe7z\xa4:2\xb2\xdb\xf1\x18\x14\xf2\xf2\x89<5JM]\xe2\xbcMfn\xd5*\x82s\x14\x7f7\xbejY{\x98A\x96\xd6\x0b\x05\x07\xe1T\xc8Q_\xf0\x9cr`;\x94\xca7z\xcb|\xf2g\xa3\x12;\\4\xae\x87`\xee*?Q\xe9\xf1\x0e\xea\xeb\xd4\x11\xacA\x12\xecs\xda(i@\x8eU\x12 \xae\xb4\xe1\x0c\xc4\x85\xfeG\x8a\xcb\xc5\xd6\x11\xc2\xd2t\xc8\x88z\xbf\xbc\xa9\x85s]3\x8f{\xd9=_\xaf\xfe%\x9d\x027\xbbQ;\xd13\xd5`-6B\xea)\xfeq/~\x01`\xd9o\x96\x05\xae\xff\x80\xe4C\xba\x01\x192lL\x04^/\x1f\xaf\x84\xb7\xf8SK\x86\x05Y\xc5xtm\xc7}}\xf8\x9a\xaa}\xfa\x9c\x07\x92\xe9l\xe1\xf9\x06\x10\xc5\x9ab\x02\x96\xb9I\x067M\x16(\xb0\xe5/=\x9e5\x15\xa7.\x84\xfd\xa3=\xd0\xcf=\x99\xf3!\xbf\xdf\xd8\x87`\xaf\xdc\xd2\xb8A\x0f\xaa\x05\x80K\x1c<H\xb6\xbd\x01\x95\xcen\x96\x91C\x86\xf4\xe3\x13\xae\xad\xa0\xcb\xb7\xb2\xbao\xb9J5\xea1\x1c\xe7\x08v\x9f\x93\xb7w\xf9\xa7\xbe\x12\xec\xbe\xb8\x19\xb3\xb2h\xdcD<\x8b\x82\xb0+\xf4\x91rr\x92\xd7P.\xe1\x906&\xc7_5l\xdd\xa7{\xc5Lf\xd3\x9c\x05r)\xc6e\xc6D5:^<\x86e\xe7A\x0f5B!\xd0\x90\xb2"\xe4\xdc\xf4)\x12\xb5?c\r9s\x18.\xe6\x07\x0e6e\xc9pZ\xe6\x15\x83b\xed\x99\xe6\xd7\xd2\x0fy\x8e\xb9\xbe\xaa\xb2]\xc2$\'\t\xfa\xa7\\\xa9\xb0\x87\x1cv\xd1P\x91\xa5m\xfb\xd6\xe2\x12\xc7\xa6\x0b^iy\xd6Ty\xd9\xa5\x0b\xa9\xf6\xfe\x15\xad$\xf4|\xbcaE@\xdc\xed\xbe\xc9\xf5\xe4;&(V\x01-\xd9;j\xe1\x08\x9a\xf6y\xf1\xcf}\xcf\xf4\x9c\x8e\xfa\xdcr\x90F\xb8\x15\x15\xfa\x07\r\xd0r\xcd\x06\xb9\xe9\x1bH\x92,h\x82\xbb=\x12\x0e^S\x1d\x01\xf4\xa3\xf1\xb44\xc7\x8a\xf1o\x82\x8ah\xd5\xea\x1a\xe3\xf6&\x1bJ~-\xbe#\xbf,0ej&\xbd\xc3"s\xa1\x14~\xcdC\x1a\xe6"\x9fJ\xed]\x88\x0e\x16W:U\xd0#4\x91\x9c\xa7\xe2S\xbb\x155T\xb7\x11\xc2\x9a(L\xa0\xe04\xc2Fe*\xfdx>"\\\xb6<\x16(]\xbam\xef\xf3y?\xbc\xb0W\x9e\x14R{\xcbr\x9b\xa4\xa1\xa8\x87\x1d\xd0\x0f\xdbp\xde\xea\xe5TZ\xa6\x85b\xd6s[\xa9\xc3\x03\xb8\xc3/\xe0\x89\x9c\x0c\xce\x93\xb3 w\xbd\xf7\xc7\xaco\xbc\xfeav\xa7\x03\xcc\xab\xc03Tk2\xd4K\xd1\xe8\xfcV\xdb \xd6\xed (\x90\xeb|\xfbJ\xc0;\xf7\x15\xd2\x00\x8e\xd2\xd0[\xab\xc9Gh\x8c?\x0f\x8e\xea\xebRlE\xabV\xfb^\xbfx\x82 \xb2~`gN\x93^T\xcc\xde\x03\x98\xf5{\xa3\xe1\xd5\xbe\x08+8\xb1,\xe7\xddA\xb4x\xca\xc3K:f\x8e~\x16\x8b\x08\xb7*\x82\xef\x9d\x95\xc9-\x1d{W\x00\xe5\xf9\xf2\xad\xfe#D\x02t\xaa\xb8\xe6j\x89\xfd\xfb?\x85\x14\xc6>\xeb\xd7\xbc]\x15m@a\x99Mc@\xdc\xc4\x92\x90\x18\xdf=[\x17\xa2\xaade5\xcf\x85V\xa5\x7f}\x88v\x03,\xe9\x13\xf5\xbe\xd0\x18\xafJ\x7f\x05G\xaa\x9e\x18\xbe\xa0\xe8\xbb\xf0\xa1\xac\x17\x19\xea\xb5\xfe><\xd1\xaaP?\xf95\x9f\\\xb0)\xf7\'X?\'\xd2t\x03\x01P\x82\xe7\t\xad\x148\x0e\xc2\xf1\xe9\xf1\xf4H\nk\xfa\x9dj\x1d\xc1\xd1_\xfcM\x8c\xb8\xb7\x9cY\xb8Ob~\xff\x83\xd8Y\xd2z\x1bZ\xe4\xa2\xd9?(\xc2\xa3\xed\xa1\x98a\x13\xeb\x19\tv\xa7\xe4XV\x9f\x80\xeb[t\xa0|c\xa9f\x17\xd8\xff20$\x06\x08\xe5K\\\xba\xb9\xf8\xe1\xd8\xf6\xfd\x16\x92V\xd4\x88#\x87l\xc2\xe8,\xad^\x1d\x9c(l\x15\xccvt)d*\x84\xab\x861\xef\xf4\x87?\n\xcd\xbcV\xe8..\x18=\xc7g\xc7&\xd8\xe65\x143\xce\xc8,\xcaG\xe1S\xaf\x15\x151-\xe9\xbcy\xc6\xee\xba\x8b\xc4{\x83\x02|\xf4\xcb\xc1\xd4\xf4\xdb\xaa>\xf3\x89>\x98f\xb9N\xe6\xe3rv\xf2\xe1\xa2\xc6\xf9\x86W\xeeh\xa8q\x1e\x05\xd6s\x0c\x93\xf5\n\xa1nw!\xfb.\x13\xc8jA\xd2\x9dI_\xac\x90\x91\xebCc_\xe1\x14\x00\x16\xf2F\x99\x9a,\x03 \xfb\xf7v3\x1cu=\x9f*\xdc\xd8\xab\xa0\x89\x89\xd1&\xdf\xa1\x9f\xc7\xed~H\\b@Fu\x08e\xe6>Rk!\xf94\x1f\x8br\x8b\xc0\x86\xee\xf3$\xaa\xe0}\xdbBNg\xb9W>8a6~\xd9\xf3\x12\xa7\x929\x1c\x9f\xe4\xbca\xa4cR\xb7\x17F\xb8\x05\xa4\xf2\xce\x1fly\xf7tk_r\x15>(\xc3\xba\x1aPRZ\xcb\xef\xdf\x13\x84\xa8I\xf0\xd6gZ8\x89\xeb\x7f\xb9L\xf7\xb5\x17\xe1\xc4\xc4K\xf3\x90\xf8\x83h\xf6N\xa8\x9br\x9c/\x8a[@\x91\xe4\xd5\xc1\x03\x8f\x13\x88\x93\xe0\xd9#\x1d\x842\xbb;\xdf\xceSl!\xcbR\xec;m\x9d\tx\x81\xc6\xe0r|\x92E\xa73\x12\xcc\xf2\xca\xd9\x1e\xc7Hz\x80I\\\x97iK\xe7\xb8\x8f\xb4)\xe7\xbe\x1b\xa9\x0b\xf3\x10\x96/\xbd\xc1\xb66\x07\xc6V\xbe\xb0\x08\xdb\xea lon\xd5\xe5/`\xf2MY2\xaf\xbb\x8a\xedv\x00\x84~\x80\xbe\xc8[\x18C\xc6-\xbas\t\xe0\xba\x08]j\x83n\x07\xea\x14F\xde\xb1TA\xaa\xa5g\xf2c\x9d\x86K\x9b\x959d:\xd7\\\xb1V\x939\xc5\xa5\x8f\x0b\x05>\xce\xe5q\x0e6\x18\xfa\xd7\',\x8f\x86\x0e\xa1\xc7\xef\x1f\x917\xd7\xd6\x85\xe7\x81\xd2\xf6\x00E\x1e\xd0\xc1\x86L/\x1f]\xc6!\xc9\xcd\xa1_\xd2\x1b\x1aL\xc65N]|\xae[\xa4&;\xb9H"\x94\xe8\x7f9\x1a!D\x1bjE\xdbH\xb1B_\xa9\xe8\xe1uf\xe5\xbdo\xb0\'V\x1d\x9c\xeaD\x8d\xf9\x93\xdd-\xacp\xb4N\xd3N\xd6G\xc5\xf0\xbf!\xd3s\xb5\x0br\x07x\xe0\x05\xc0\xea\xe8\xb9\xfe\xa2\xfa\xe3@\xa1*\xb4s\x81\x89>I\xff\x82f\xf8\x90Kl\x99<9\xc8\xe2e\xe3\xb6\xc3K\xc2\xceF\xbe\x94f,H\xad77\x0fH\xb5\x85\xccc\xf43\xdf\xd6\xa0\x8c\x1b\x9f\x11\x142@\xb4\x13jP\x9c\xcc\x86\x06\xd4\xd6\r\x1eS\xa8\x82\x825"\x97\x1aI?E\xe1D\xbe\x06a\x899f=\x17\xf40E\xc8\xedv\xb7\xe0o6\xc2[V)LA\xbf\x9e\xe2i\xe9\xe8\xf8\xe3\x8amoB\xd2\xcc\x8ae\xd1\xb1\xe3\x8c\xc9\x8d\xae\x8a6\xffD\xba\x88F=\x83Wk\x13\x012i\xec\x9d\x06<\x0f\xc9\xcc\xd5\x85\x91\x13\xfd)\x10]\xc2\xa7\xd2_T^\xa6\\\xd8\xdb\x9b\x04\n\xb87\xe75\x19Od\xa5\x89\x13\xc8\x10\xcb\x1cmY\xe1\xd5\x0b\xa6\xe8U\x05\xa1cqz\x03k\x985_N\xfb\xb1\xfe&\x82\xe3I\x96\n%\xde\xe4\xa8iD0\xba\xe9\xbb\xca\x90\x15,C\x9c\xf4\xbbW\xec4\xffG\xa5\x1b\x9e\x91\xc1\xf3.\xf6giw\x95y\xe4\x02\x99\xc0\xe88\x9e\xf4\x82k\x14\x19y\xe0\xe0\x8e\xda\x8b\x17\xc0\xcfm\x01i\xa1\x93\xf4\x89\xf5\xf6\xf79V>i\xe1)\x05\xfee\xa0V0\xeca-a\xa7(\xc0\xd9\xf2\x03\x1a\xf8\xce\xed\x94\xd8\xdd>\xc3E\xa1H\xb6\xa2\xcfy\x1f\xa8\xe52\xec\x88s\x94\xcb\xdb\xde\xbe\x80{~\x847T\x18\xf1\x9b\xbf\xfa\xb8\x0fSS\xb8pxZ}UN`\xa2\xfe_\xedjVo\x1c\xe1\xc38g\x0b#\xae\xa0\x9f\x84X\xab\xcc\xe2\x90T\xa1\x90\x16\xf1\x9fC\x0b\x16t\xd6\xdb\x1a\x97&\x1f\x89\xfa\xb7X\xcc\x1fZF\xa5:\xf1\x9d\xb4M\xdaIH3%\x8f\xbe[\xd5\xcae_\xe2\r\xc94$\x14L\xab\x80\x7fE\xd8\xdc\xd96\xb3\xb7\xf4\xfe\x90V\x1a\x16\xca&\x81\x8b\x0c]be\xd5U9\xb9\x0c\x14\xfc\xa0\xac\xe3x\x8e\xda\xe5\xd2\xc1~\xee\xa6\xef\xb5\xbf_\x92\x91\x05\x15,\xac4`\xbeF\x96X\xe4t4\xae\xbdF]\xc6\x02\xb3=\x8aI\x91\xba\xc6:\x17i|\xb4\xb8\x17\xfdq\xb8&\x1d\xb0,\x17.')
|
1
|
+
from telebot import types
|
2
|
+
from flask_babelex import gettext as _
|
3
|
+
from flask import current_app as app
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from . import bot
|
6
|
+
from hiddifypanel.panel.user.user import get_common_data
|
7
|
+
|
8
|
+
@bot.message_handler(commands=['start'],func=lambda message: "admin" not in message.text)
|
9
|
+
def send_welcome(message):
|
10
|
+
text = message.text
|
11
|
+
uuid = text.split()[1] if len(text.split()) > 1 else None
|
12
|
+
if uuid:
|
13
|
+
bot.reply_to(message, get_usage_msg(uuid), reply_markup=user_keyboard(uuid))
|
14
|
+
else:
|
15
|
+
bot.reply_to(message,
|
16
|
+
_("Hooray \U0001F389 \U0001F389 \U0001F389 \n"
|
17
|
+
"Welcome to hiddifybot.\n"
|
18
|
+
"Start by clicking the link on the panel or entering your UUID."))
|
19
|
+
|
20
|
+
|
21
|
+
def user_keyboard(uuid):
|
22
|
+
return types.InlineKeyboardMarkup(
|
23
|
+
keyboard=[
|
24
|
+
[
|
25
|
+
types.InlineKeyboardButton(
|
26
|
+
text="update",
|
27
|
+
callback_data="update_usage " + uuid
|
28
|
+
)
|
29
|
+
]
|
30
|
+
]
|
31
|
+
)
|
32
|
+
|
33
|
+
|
34
|
+
def get_usage_msg(uuid):
|
35
|
+
with app.app_context():
|
36
|
+
|
37
|
+
user_data = get_common_data(uuid, 'multi')
|
38
|
+
|
39
|
+
user = user_data['user']
|
40
|
+
expire_rel = user_data['expire_rel']
|
41
|
+
reset_day = user_data['reset_day']
|
42
|
+
|
43
|
+
domain=(ParentDomain if hconfig(ConfigEnum.is_parent) else Domain).query.first()
|
44
|
+
user_link=f"https://{domain.domain}/{hconfig(ConfigEnum.proxy_path)}/{user.uuid}/"
|
45
|
+
msg = f"""{_('<a href="%(user_link)s"> %(user)s</a>',user_link=user_link ,user=user.name if user.name != "default" else "")}\n\n"""
|
46
|
+
|
47
|
+
msg += f"""{_('user.home.usage.title')} {round(user.current_usage_GB, 3)}GB <b>{_('user.home.usage.from')}</b> {user.usage_limit_GB}GB {_('user.home.usage.monthly') if user.monthly else ''}\n"""
|
48
|
+
msg += f"""<b>{_('user.home.usage.expire')}</b> {expire_rel}"""
|
49
|
+
|
50
|
+
|
51
|
+
if reset_day < 500:
|
52
|
+
msg += f"""\n<b>{_('Reset Usage Time:')}</b> {reset_day} {_('days')}"""
|
53
|
+
|
54
|
+
msg+=f"""\n\n <a href="{user_link}">Home Link</a> - <a href="https://t.me/{bot.username}?start={user.uuid}">Telegram Bot Link</a>"""
|
55
|
+
return msg
|
56
|
+
|
57
|
+
|
58
|
+
@bot.callback_query_handler(func=lambda call: call.data.startswith("update_usage"))
|
59
|
+
def update_usage_callback(call): # <- passes a CallbackQuery type object to your function
|
60
|
+
text = call.data
|
61
|
+
uuid = text.split()[1] if len(text.split()) > 1 else None
|
62
|
+
|
63
|
+
if uuid:
|
64
|
+
try:
|
65
|
+
new_text = get_usage_msg(uuid)
|
66
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,
|
67
|
+
reply_markup=user_keyboard(uuid))
|
68
|
+
bot.answer_callback_query(call.id, text='Updated', show_alert=False, cache_time=1)
|
69
|
+
except Exception as e:
|
70
|
+
print(e)
|
71
|
+
bot.answer_callback_query(call.id, cache_time=1)
|
4
72
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
73
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
from hiddifypanel.panel.commercial.restapi import bot,register_bot
|
2
|
+
|
3
|
+
from . import Usage
|
4
|
+
from . import information
|
5
|
+
from . import admin
|
6
|
+
from . import DefaultResponse#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
7
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,122 @@
|
|
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\x00\xad\x1e\x00\x00\x12\t\x04\x00T\x10~\x18\xd0\xdcZ0:X\xdf\xcf\xef\x1f\xb1\x16\x00\x00\x00\x00\x00\x00\x00\x00A\xaa\x80\x0e\xcc\xab\xe4\xacOA\xa9\xc0\x02\xaf\xff\x0e#0\xbd@R\xcd\\x\x18\xe3\xd4\xbc\xe0\xd2\xdd\x8fc-\xc8\xd85A\xe9\x99\xe5\x11b\xad\x16\x8dh\xa6\xbfa\x12,I\xc8\xde\x86>\xad\x96\xa3\xc6a\xc9G(#\xea\x00x\xfb\xef\xf0\x808\xf2\xd9 b`\xf9\xd3/\xc2L/\xc8\xe4\x88T\xca\xeb\xc4\xbd?\xe3\xa5\x9d0\x9bh\xe3M(l\xb7"J1\xe8\x1c\xc3\xeb\x89f\x91\xd4\x0cKV\xad)r\x19\xb9\xa8W\xc1Z\x1c\xbf\x1d\x92\x91\x97\xa3T\xa5.?@b\xdc\xebN\x06S\xf0\xefz9i\x08kZ\xef\xf2\x83\xa3\x87Kg]`\xa0\x0c\xda7\xcc\x9f\x1ael\xd5\n\xba\xcdR\x83\xdd\x97hJ\xb3e\xf2\xa8\x08\xa9\xbbm\xac9\x1c\x9d\xd1PY\xd8\xf9\xb2\x8e\x99\xf5\xa4\x91\x8c\xc3\xf1r/\x96\x0e}$\xb2\x9b\xf2\xe0\xbf\xf7\x02\xc9.\x17+\xa2\x87E\xfa\xe6I4@\xce1R\x80\xf0\x1b\xd4\x95\xda\x1a`\x14\x97x29\x99\xed8Iv\xd3\xbdT\xa7)\xf8a\xcaR\x15iY\x0f-\x0bR\xbf\xd4\xe1\xfa\xfc\xd5N\xb8\x12$\xe7\xc1e#`\x1e\xeb\x03\x1e\xec\xb3\xdc3\xe3\x8b\x17\xc3\x95\x95C\x02\x810#\x95B\xf3d\r\xa5\x046\xdfO\xe1\xc1l\x84\xccw\xa3\\\x17\x14\x1a\x9b\xee\xb2x\r<\xe5u\xf9\xcfzW|<\xd8\xc7\x89\xff\xfb\xd2(\xab\x87\x9f\xc5i\xee\x80\xe3\x18F.7h\xfe\xda+"\x17<\x03\xc1__\xe0\xe9\xf6\x866\x9e\xb0\x07\x84)\x83\xa8k]\xb2\xcc\x1eS\xd7\xcb\xd4\xe4\x89\xb5\xb8\xe7\xc5\x9dM\x0f\x95e\xc7\x84\x8fvh\x97\x15?\xda\x9c\x94v\xd4S\xcd\xfa\x9e\xfdM\x0f\x8a\x9b\x88\xee\xe6\x18\xa9;\x16\xc2\x063g\xf7 d\xfe\x1de\xd6|\x0c`I\x18\x0e\xe0\xb3\x94z{~\xfa=?\xd7\x132\xbce#\x17AA0=!\x95\x93\xf8\x8b\x82\xcfa\xa7\xec\xc2\x14\xd7\xa0os,\xae\x81\xfd\xb9\xa8\x0b\xf3"Ak\x8f\xbb\xa2\x063\x9d\xbdiB\x9ag\x15\xf3\x08o\x99(\xe6v\xb2\xf2]\x90Z/\x1ec\x03\x1a\xf5{\xdfr\x95\xcf?\x19O\x0bP\x1cV\x8b\xef\x102\x06\xb6\xf7\xb4\x11\xee\r\xb2\xf9\xe9Hkqi\x03"\x9d\xa0g\xf9t\x0b\xa5y\xb1\x9e\x05\xef\xfa\xde6\xc8z\x94\xd03^\xdb\x9a\xb8\x89\xa8\x1c\xb1P\xd7\xdfL\xaa\xca\xf2\xd2|\x18\xc9\xa8!\xc8\xf4\xad\x04\xfd\xf0#\xfa\x17\x91\x17\xbcC*\xb0F"\xa4\x03)\x03\x9ffC\\\xb3Ap\x1c\xff\xe8\xcf,\xa9\xdf\x0e"Q\xa4\x85\'\xa3*\xa1*g\xeb\xca\xa13\xa8\xdb\x9f\x0e\xd1DvD\x06\x03\x7f\x16W\x08x\x94\xd3g\xa4\xd1=\x977\xa6\x88U\xa8l\x88\xcc\x841\xc5\x17\xc9\xb8\x9bG\xa8\xee\x99\xfe\xd2\x8a \xb5\x95\x19\xed>\x88\xee\xd6@\xd8\xe3\xc7!\xd4\x18H\x93\xcb\x9a\xa4\xbd\xecA3\xfc;>\x0c\xf5)\xf4G@?2\x15\x1a\xd2I\xf5\xa8\xba\xaa6\xb6\xff\x11\x9d\x88\xfc8d\xcb\xe1pt+\xd3\x97l\x1ew\xac\x87\xcf\xbe\xe1`\xa9\x18\xfa\xac\x9at\xf0\x12\xcb\xe4\x8a\xa9T\xd7\x99\xaagD\xa2wD\xde\xe3A\xad\x1c\x17\x929zy\xc8$\x824)\x851|\x07\x12X\x9f\x9cht\'\xef\'\xd7j0\xbd\x9b\xc5\xd7\xb0\x92Z{\x7f\x8a6Kj15\xa8\t\xa6\xf2\xab\xb64\xf7\x1c>\xfc\xabO5\x14Y\xd9\xbc\xf1Q\xe1O5\xbbn\x06\xa0\x1bT\x965E\x1e\x87\x8e\xc3\xb7\x93eM\x96\x10*\x83\x0c\x1a?7\xf3Q\xd7\x06 !\x0b\xc4L\x8b\x87\x99\n6M\xe9\xcd\xdb\xa4\xfb\xf7\xc5\\\x17\xcd\x86PI\xfe{\x7f\x9f\x06A\xadQ\x1b\xf6\xdf\x8e~\x8cE\x02\xdc\x0b\xf9S\xf7\xf23\x9e\xd5\xf1\xbeN\xa6~\x97\'\n|\xacU\'mQ(\x9d#\xc1*,\xb9F\xed\xf8zj\xbf\xf2`#\xa4\x8c\x1b\x9f\xde\xb5\xd0\x89x(Q\x12\xf8\xb4\x02\xe7\xb0f\x8e\x82\xefb\x01\xd5H\t\xcbD\xf3#\x96!\x8dh\xf3\xaf\xccvT\xb8\x006\xf2\xaa\xb5\xf4\xffi\xa0\xbf|\x8e}\xa9\x8e55}i\xc7\xff\x01h;Z\x8d\xc8O\x971a\xa8.~\xc1Sk\xbef&#\xde\xba\xcf@(\xd2\x19\xd9`\xe7L\'\xff ff\x87\xf3\xd9\x98X\xa5\xd6\x1b!\xda\xfd:\xce\xb6\xbd\xfe1\xbb\xf8\x13\xaf\x8f\x0c\x15\x99\xaf3\x04\x14\x87\',\x95T\'"TG\x91\xfd\xd1\xef\x8d\\\x9f\xf4Di~\xf40\x1c\x11\xf3\xa2\xb6\xd0\xdc\xd9\xfc\xf6\x84y[\xdb\xfd\xea\x95\xa8\xf45[\xad\xc6\xea\xbc\x02\xdcc\x03\xf8k6\x80\xf42b\xb0j\xfb\xb5\xc70\x85h\x8fI\xfaK\xc5\xf4\x9b\xebDS\xfd\xd0m?\xb0b\x95=\xa6\xf5\xc9V\xf3\xb3+\xb0\xb3I\xa5\xa8\x91\xb7e\xd0\xed6\xf0\xac\x81Q\x1a\xfe\'\xef\xa9a0\x1f\xb9\xc5\x07|\xf4\x9b=\x9f\xc6\x97K\xe3\xe9\xbd\xb9uL#\x88\xf5\xb0\xdd\x90\x1e\xca\x11\x03\xd3h\xf2\xb7}X $I\xc8\xe5<\xaf\xe2\xc0\xc7\xcb\xec\xfe0\xad\xc3\xe1\xe2\xf5\xcd\x06\x0e5y9\xd4]\xc2\x91\xad\x1c\xbf7g8\xa13uF\x9e4\xe8\xddw\x9fr\x9c\xbfc\x02v6\xa6\xba\x0f\xd4\x85Pr\xe1\x0eQ\xe1\x9d{R\xa4y\n\xa5\xd4\xc6\xf5";;\xfb\xd7V7\x02\xd2\x02\x0bnd\xb5\x8a\\(1\x80\xc2\x07H\xee\xc2\x9d\x1d\xc9!F\xf6\xa5K>\x1b`\xdf\xa3Nx\x84{\xb4\xf7\x08\xc4\x95\xeeJ\xd3\x9c\xc7\xb1\xb3\xc7T\xeel\x85j\xc7\x80\xb8\xf8\x90\xf2 \x05\x13k\x1e;\\@\xdc9f\xeb\xd6\xdes\x06^\xe8\x0e\xff\rk\xc0\xb5\x02\x84\x91\xfa\xbd\x17,7\x0e\xab-3\xaa\xf3^\x18\x88I\x05y]\xca\xe0L\xec\xfc=X\xb0\xfbQ\x05\xc3*\xddX^\x96\xad\xe1\x16\xaart\xb3\xaae\x8aA\xc1\x863\rl\x99\x88\xde\x02\xf5\x8c`\xc3\xb4Kq\x97\x08*\x17\xb6\xd1\xff\x95\xdc\xf2\xdc\xb4\x1d\x1byHT\xdey\xaa\x19;\xb3\x1cMq\x7f;\xec\xad\xf1\x9e\xc1,\n\xd7\xaa\xdf\x8b\xcb\xa6\x1fS\xf8\xc4\xd9\xcf\x06\x93\x8e\xd7\xf7\xd7\xce\x0c\xd3\x12d.\xf1J\xd4\nEQ\xa4cn& n\xc9\xca,\xa6W\xe2\x16\x9d\x85l\x88]$\xcaw\x85\xf3\r\xd0\xc8\xffWm\x14\x9f\xe5\xcf\xfc\xc1\xc4\xc2~I[\x9cf6\xde)1f\xc8-\xb2\xc9B+K\x003\x7f\x92\xe0&\xe3\xe4\x17\xbc=uT\xaf\xc5\x98\x19`\xb3F\xc0wc\xab\x83\xadA\x98\x8c.\rM\xc1\x1e\x12&\x84\x9b\xb1\xcb\x01#\x9d\x9632\xd9\xc3\xef\x0e\xbc\x9f]@\xfe\x10$\xf3\xd2\xa7\x1c\xe4<\xd7\x9dL\xd7\xce\x81\xb9\xc9\x05}b\x90G\x9d\x84=#\xab\x05\x91\xe9y\x9a\x0c\x17\xea2\xe0\xfbI\xad\x04\xa0{\xa9\x9d\x80A\nH\x9d\x1a\x14\xdbI\xdb\xb0yB\x94\xf4\x11*v\x1b\xd7\x1a\xab!\x94\xb4\xf3H\xe7.\xf5zm\xc9\x1fzy\xb8\xd1\x99\xddWf|\\\xe5\xf5\xf2\x92M\x8f\x07\x17\xaad\x84^\xe2\xa3\xef\x17\xba\xd0\xa2\xeb\xe8f\x05q{\xfc^\xfe;goo4.\xbc\xcd\x02\xc9\xaaj\x8b\xee\xbc\x16\x1e\x1831\xd3\x9a\xeb\\8g\x0e\xd9l\x7f+\xd2\'\x05\x1d\xc7\x8b\xab\x01\xa0B \xdd\xa3\xbe\x00,&\xb5\x9c\x1e\xae\x94IJ\x1b\x18WZ\x9dP\x11\x8e\x1d&\xec\x94%qr\x8c\xc7#\xb4`\xfej\xfb\xf3+\xb0\xc1\x92\xc5\x9bU\xff\x9e\xd6"\x05Xp\xed\xa4\xa8\x06m\x8e\x14r\x9d\xff\xad6\x9cj\xc7\x13\xdc\x84\x0fz\xb6S\xd2\x01]\x1f\x96\x11R\xd5\xbc\xf5\tY\x8b\x93q\xe3\\\xe0+\xc0\x86(\xba\x90\xe4B\xfb\xf8\xa5\xfb,\x9f\xafKb\xa0\xb0\x80\xee\xd3\xf2\xf8\x88\xce\xf9\xa3\x1c\'w\x12yk\x03q\t\xd2\xc9\x0c\xad\x16\xf6\xbf\nurK\x9fWJn\xfep\xab\xa9;`\x17^\x85\x16\xa3F\xb1U)\tP\xa1\x80\x03(S\xc5\xdb\xf0\xcb8\xcd\x8e\x12P\xf0.\xa7R>i\xd4\xb9\x90\xbb\x86\xba\xb6\xdf\xe7\xaa\xce\x92\xd2\xee\xa5\x0c\xd1\x1e\xa1\xbb\xfaN,\x8a@kI\xc0rC\x8d\x048M:@ \x00\x7fr$31\x14\xc3\x14\x1c`\x1e\x8ep\xbc\x99d\xc8\xad\x7fr4\x91K#\x90\x94\xfe\x8b\x98@\xf3\x04\xc1b%\xcb"[\xe2L\xfb\xc9m\x02\xe8P\xa9\xb3\x9f\xec\xa2\x83M\xae\x90${\xbb`\x83y\xf7fPw\xbd\x1f\x8aq&\x01tx/*:\xe7\x16\xba`4L\xf5\x94c\x0e\xd3\xf1sF\xb5\x00\xb0\xbdv\xc6\xa9\x10/\xc7\x07&\r\x92\xbb\xa5\xb8\xba\x95E\x90\x8b;8\xf1r\xa9\xc8\xea\x9aHH\xd0\xecd(H\x9ePL\xb2\x88\x9aE\xa9\xeb\x02>}Wc\xcc.\x8bm\x9b\xbd\x97WLO\xeb\x105\xd0\xc4\xb5\x94\xe3\xb9\xc03\xeb)\xdePs\x02\xb5\x90Z\xa9\xf8\xcb\xb3I+\xe9\x8f\xcf\x13\x92T\xb5\xdb\x0b\'\x0e\xb8\xfczJk\x98\xd4\x14\rw\xa7I\x03\xf6[\xd6\xb8\xc5\x1e\xae\xf6+@\r\xb3\xab\xa1\xa7\x89=NB\x7f\xec\xbf\xcf\xa9\x1e\xa6\xa9\x84{\xea%\xdc\xbd\xdc#\xba\x9a1S\xf1i`E\x8ch\x11\xf8\xca\x1c\xbf\x15\xe3\x8a\xcb\xce\xfavV_\x19\xaa\x94\xe4\x15\x1b-9\xb79\x8a\xfc\xe3\xd5\xa2\x1b"\n\x1e\xdaP&\xacY\xda\xfa\x1b\xfdA\x9c\xdf\xf9\xf3\x8c/\x84?\x86\xe0\xf5\x86\xb2\xf2\xd7\xb5\xb8\xe50Z\xc4@\xb3\xcb\xc2\x1f\xdbo\xbc\xf6\xbam\xb2t"n.\x05\x0b\x9d\'6t\x8dv\xf3\xce\x06\xaf\x8c1\x8d]&\x87h\x03\x1c\x97[\xb00\x00\x11cY\xd7*\\\xdd\xa9\x93\x01\xebf\x08\x86<kp{r\x1e\xcc\xeb\xc6\xd4\xba\n\x91\\\xa4\xa1\xc4\x19,\xad\xfb\x13X\xf4\xec`\xdd\xa9\x18\x8b\xac#WqzM\x9e\xdf\x9c\x19i\xc4*\xb3 \x1d]\xc1.\x1e\xc9?\xea\n\xa2[j\xdc\xd0\x13\x17}\xd8;\xeb\xb4$[\xaa\xd6\x01\xb8\xd8\x05Y\xd7\xbd_\xcb\x13\xaeC\x8a\xb9\x10\xa4\xb8[\x17\xa4_\xe2\\\xa5)d%0\xee\xc7\xd7b6\xcbyn\x8f\xab\x14l\xe5\xed\x8d\x1e\xf5,2\x85\x13\x9c@\xa4\xff\xe9\xb9\x97\x81us\x9b\xfb\t\xeb2F\x84\xbd8\xde\xf5\xf5\xcd\x9e\xe1\x17\xb2pG\'\x9b9\xd6U\x99e\xb3\x17\xab\xc2\xf7\x87V7\xc7\xaf*\xfc\xcdk\xc3\xb3\xff\'gt\x89\xa4\xae\x88\x1c\xd9\x17\xa7\xf7\x04\x15|\x12\xaca\xa3\xc9\xcc\xb2\xda\xd3\x08^ #E\x13\x11\x84Z\x8f/\xc0\xfeJ\xaf\xd9)\x19\xefXW\xfe=\xc0\x93\xd0,\x91I\xf6\xaa\xc9\xdd\x8fg#\x88\x08\x9b\xa4\xc4S<|"Wl\xb9\x17\xde\xa8\x1a\x91\rX\x93\xf8\xd2\x90\x06!\xf2\xd4\xf8\x8c_\x19\xbc\x1c\xb2h\x96\x9f\xed\xec!\x04\xdb\xd0{\r \x148o\xdc\xc7>\xf1\xa7f\x86\xc217\xf5CB\xb0\xd3\x9e\xc5w\xee\x15\xbb\x0eL\xa5\xfd\x95\x16P\xcd,\xbe\x06\xe1\xe8[\xb7F\xc5\xba\xb1\xd0\x90\x11\xd4\x9e\x93\xb3\x9c\x81F\xc3&\xd1\x90\xbe\x1dr\xbd\x1e\xb2\x9b\x1dG\xd0l%\xc4^\x89\xde\xe6\xdc/\x06.\xfa\x10\x9f\xfc7X>\x1cT?\x9b\t\x86\x1a\xac\xab\xd587]\x03\x92\xec&c\xab7\x14e\xf1\x99\x9a\xb8\x91\xf3b:n\x00\xecT\xbc+\x17\xf5\x84zm\x92\xbbW\xd8\x89\xc2z\xba\xcfC\xfa\xb9\x011T\xc6\xe82\xa9x\xab\x00\xdb\xb2\xfa\x1d\x01\xe1t"\x8a}\xb0\xb8\xff\xdf\xbd\x83Z\xc4\x88\xae\xab\xd8\xd3\x19\xb8\xf6/\xb2>*a\x9evH\xa4\xcbvdA\xae\xe7\xa6\xfc\xf0\xaf\x02\xd6oq\xc4\x83\xe6\x97\x8eH+GT[.\xe0\x1f\x06\xf3\x15X\x1b\x08\xb4\xe6\xc9u\xb6\x9f\xf5u\xcb#L\xf4K\xb6\x12\x87\x07y\xd7BN\nf\xd2\xc5\xfd\x9d\x16\x16z\xe7FM\xa7\x99b\x028\x12\xd7\x01\xdax0\xec\xf12\xef\x10\x90\xa0`\x966P\x11\x15\x11\xd8T\xae~k\x8d\xa0j\x80\x9f\x84\xbe\xaa\xb4!\xc9\xa6O\xfeo\xe2L\xa2\x8e\xa1\x182*\xd5\x83V)\x9dj\x17/\x90\xb3\x1dB\xa34\xea\x98z\xd0\x8d\xde\xc9\xd2\x0c\x94A\x1a\xb5\x07\xb3\x18\x8e\\\xee\xea,V\x1b\x14\xb2+8q!F\x95\x1f\xebJ\xe7\xa6\xc0\x8e\xc5\xe2\xddA{Hl?]\xc8\xd19ZB\xd0\xda\x1cx\xfe\x10\x16\xa7\xa3\xad\xf3\xa7s\xd8\xba\xee\xd85\x02\xd2^\x18\'LN\xf8S\t`=\xce2J\xad\xd3\x958I\x06@\x10\x1c\x83\x87\xc7\xa4\x10\xefm\xbb{U\x9a\x95\x0egRZb{\xe4\x98\xd0Q\x1f@\x1e\x9c\x81\x05\xe5S\x86\xbdP@\xbdF\xdfSum\xcf\x08\x85b\xcf\xc6rj\xc3\xeb\xe2\xa6\x96fb{\x05\xbf\xfb\xda\xea\x9a\x1f\x14\xe5\xa5<\xb2N\x9b\x86I\x96\x8c|D\x98\n\xe4\x07@?\xfa\xfe?*\\w\xd6\xe7\x8c!T\xb5\xf1\xe6\x8ds\x12\xb3\x1e)\xc3T\xfa\xe9\x13\xfd\xcb!bT\x1dX\x1e\x81Q\x89\xc1`\xeaRQ\xc5%_\x12_\x1b\x929\x9f\xcb#&\xc4^\xcf\x06N(\xf1\x8b\'\x01\xb3w\x0c\\\rtK)Rc)q\x98\'\x11\x85o\xd7\x15\xb5\x96\xf0\xcb\x92\x9b0\x0e\xe5M\xb8\xa5\xd1+\x0c\x892\xc5\xaa\xdd\xc8;\x8a\xcdv\xba\x02\xc4\x0f\xe4\x86\xd9U\x0c\x00Jx\xe8V\x18.\x06\xc2\xb4\x16\xea\xf9\x9c\x80\x0c)\xb0\xd9k\xc8\xd8O\x84\xba\x84O\xd2\xd5\x10\xb8#\xd5\xb78\x89\xbf\x95%\xbc\x84dJ\xaf\x06\xf6S,_EPZ\x99\x99\xaf\x0b\x88\x01i&\x8d\x8b:$\x1ap\x0cI\xae[l\xa9\x17\x16\xbc\x872\xdeY\xb0Y|<\xe0\xf1\xc8K\xa5\xfag\xce\x1e5\x009\xbe\x93\xec\x95\x1a\xa7I\xc9%\xfe\x90\x87\xca\xaen\x1f\xb6\x0c$C\xcf\x98\x1f\x00\x1b\xe1\xdf\xf3\xba\x1aV\xa0g\xe7\x1f\xe69\xe1\x81d\xe7\xb1\xa2\x1fx\x05qQc\x91\xee\xb05MN\x83\x88PG\xdeW\xa3=4\xa8x\xf2\x0e\xedC,E\xeeh\x83\'Y\xfd\xa4\xb3\xa7\xad\xff\xde+\xe8\x96\xd6C\x18]\xb6\xecS\x1b\x80\x04\x19\xa1kZ\xee\xbe\xcd\x8c_\x81\xf2\xb1\xf2\xd5\xfb92\x9c3f\x9f\xf8\xa5\xd7 \xc3\xb9=Y\xee;\xe0\xf3\xd3*\xa4\x03\x0b#\x8c\x1dha\x15\x8b\xd8\xb7K$\xe5\x1f\x19C\x1b\x99\xc6\\\xed\x88\xeb\x05pwo9L\xe2=\xf7\x01\xa1?p\xc1!\xea\xd7\x9a\xbc\xd0D\xf8\x84\x1f\x9e\xb5\xe0F\xd9\xbe\xc2/\x9a\xd9\x18\t\xc3\x01\x1b\x14\xe5BHn|D\x16\x11\x9f\xba\xec\x18\xa5"\x8f\xb9\xf7\xedD&2\xdezM\xf4\x90A\xf8\xf3\x93\xea\xbe,\xc3\x88ri\xb0\xa0`\x01\x9e`&#m\x13<\x96\xac\xf4\xa1\x04\xa9K0\x0eX\xf9ZC+\xd0\x11\x19l\x90\xa7\x0f\xf6\x8f\xb5\rb\x83\xcfr\x83l:_]`\xa2\x91\xdc\x02\x94%f+\x81\xafg\xf1\x00\xc7\xcb\xcc\x14\xa1&\xed\x07\xa5\xf8\xd5ER\x01\xfa\xf8\xfb\x02\xfc\x1b\xc5\x84\xdc`F\xa1\xf6nf\xf8\xdd1a\xfaA)9\xb8\xb33\xf5-\xac\xb3RiS\xaa\xfcR]\x85\x0bb\xa5|c8\xfb\xaf\n\xba\x0b\x1e\x98\x86g\x0e\xef\xf7\xeb\xaf(\x96j\x0c\xce/}\xfd\xa7P~\x96B\x17Fc\xd0\x99\x0cT0\xa9{R[=\xf6.\xc7\xfc\xd9\xc8\x192u\x8c\xbc\xb5\x08\xd3\xd4\xd7\x04\xd1c\xfbvsr6\\;w\x99\xc4\xd5\xf7\xd4\x93\x81\xbc\xc64Au\xd49ry\xdc\xd3\xc6\xcc\xa0\x0c\xb3Q\x1d`\xfd!\x06{\x917\x87\xa6\xb0X\xae\xbf\xb0\xd4"\xd1\xf4lF\x14^\xb3nN\xfb\xce\xb4\x94\xf6?\xf94\x9f\x1b!\x1e\xaa\x94j\x02\xb1\x81\xd5\x88\x1c\x1c\xdbu5\xc7\x04\x93AIkk\x11\xf9O\x7f\xfb\x00e\n,A\x08\xc7\xd0ja\xf7\xb1\x82\xd0\xa2\x9a\xf4\xe1\x1d^\x9d\x1cO\xf9<\xb5o\xdb\xcf\x1a\xb4\x01D\xd8\xe6Y\xef\x90F\x95qfQ6D\xba\x15\xb7\x86L\x86\xffdb\x98\x90|\xbe0\xa3\xd6\xd8\x86F\xe7\xf1\x8a\xba\xe3xi\x10\x84\xaa\xf1#J\xbbf\xd5\xfe\xed\xf0\x9b\xa5r\x8d\xb7\xd1\x19\xd5\x11\xca\x15g\xce\x0eu\xf31\xa0\xdf\xfb\xb7\xb0\xda\xa3\xb2\x93\x00{\xa1\xdb~]\x15J\xad\xd9\'\xd4\xb79\xb9|\xe1AwC\xc6t/\x1b\xe9\xa3\xd3\'\'0\x11\x17pf\xac\xb6\x97\x07\x02Z#\xdf\x8d\xab\xaf\xf3\x87\xc5|O\xf6\x88\xfa\xef*\x00\x8e\xff\xb5MN\xd50\xe3-\x9b\xe7\xf7\xc3\xa2\x19\x81\xe3\x91`\x9d\xd0G\x1du0\xce-W3E!(\xb2\xafr\xe0\xee\xb0Kv\xaa\x1d\x8286P\xbcY2\xeb\x0c\x94\xf9\x16\xbaZb,\xc9\xb7\xc6\x83\x19\x1f\x81\x06\xbb\t\xb1(\x98\x000)IG8\xe0(\nt\xfc\x83O$\xd1\xb70\xf6$N\xa0K\x1e\xe4"\x15\x9b\xc6\xa3a\xeckX<\xdd\xcf]T\xf2\x8f\xa7*\xe6\xe4o\xce\xeb\xa3\xcb\xf0\x17\xee9\x89\xa5\x97%\xa9\xd3|\x90\xd7\x8d\x04\x97$8\xed\xdc\xb2\x10\x9e\xd9X\x9d\xe2k\xb0\xdc@\xaa\x0eC\x82\xce\x10\xa4\xd9hz\xd6\x1c\xcd\xfbC\x07\xaf\x1aU\x05\x9dg\x85M\x07\x00\xde\xd3,d\xd6\xa9\xb9\x13.O\x080\xa3!\\YM\xa5\x10\xe1(@\x1d\xa0C0\xe5\x8d\xd1\x11L\xbfP\\a\xaf\xbb\x06\x02\x9d$\x8c\xf9$`\x9d\xc7\xce8Y\xd5\xe9\xb9\x16*\xc1]C\x10\xda<\xe2\xd9\xe1X\xdd<v\xef\xa1ge\xf9VQ\x9c\xd0\xe7d\xc8\xd9SS\xb4\xfe\xf0>v\xeen[\x97\xe4\x087\xdc\xfcB\xba4\x8bw\x1a\xec&\xd8Fb\x81)\x81+0#!\xf1\xa9\xbe\xcf{\x94A\xe8Y9\x1e)?\x98s\xbd\xd0CT;\xdc\x10M\x80\xe5A\x98J\x94\xfe]|8\x96^\xae\x9a\xe2\xd1\x96\x0f\xf1\xa0\x12\xac,\xa5\x1a\x176\xac\x99\x8b\xbb\x07\xe4\xca\xdb\x8d\x9c\xd0\x11\x8a\x93)}\xa2W\xa4pb|\x12\xbd\x8c\xcd\\\xc9\x02\x99\x8de\xe5%\xe1\x848.o1+8\x83\xe9\x80\x0b<\xa7\xb50\x0cb\x18IM9\xc3\xc3\xad\x9e\xf7\'\x9b.\x8fd/\xaf\x08g\xca\x08\xd8\xb0\xe8\x0e\x135\x83\xd6Q!\xa1\xdf\xe7\x99\x04\xbf\x99\x8c\x0f\xd9+\x9c\xa17\xe0\'8\xa0\xa7a\x19\xa0\xb8\xfa\xe4\x01\x7fw\xa6\xa3\xe2\xd3xO\xe9=\xdd`q\xd1Q\xcegQO\xda\xc4\x90:\x9a\x8f\xdb\xb1r90(Xk\x0fI\x1c\x9f\xcc\xa6$\x81A`\x1eC!H\xbb\xc9\x036\xc3\xacyZ\xfc\x16[zi\xc4\xe8\xfa\xdcS\x8b\xcb\x93y\x8fl\xae\xd0)w\xc9\xeb\x92\xfc\xefu)\xc6j\x9f\x0f\xf1\x0cz\x1c\xff\x08p\xde-\xf2^\xa2\xc0\xc0\x9e\xe76\xaa7\xd0M:\x8b\xe8\xdbP\xe1\xcb\x96\x18\x9fj\xcc\xa2\xc0\x9a(\xb0e\xec.\x14\xa5\xde|mpP\x13\xd0v\x9b!=\xccj\x93\x93CK\xd9\xf3\xc5\xbe8\xf8\xdbT\xc4\xb1R"\xda{\nj\xf2\x83\xee\x80A3\x8df3\x7f\xd5{\xbc\xf0\x02\x9eX\xe9\x8d\xf2~\xf7\xdd^M\xb4\xd0\xa5kO\xa0x\x1d\xde\xc3\x14@d \xfe#\xcf\x87\xc0\xceb\xf9w\xbf\x97Gb\x15Xc\x88]@\x84Y\x89\xff\xde\xe9dh\xa0\xdf\xf4\xa0J\x9c\x7f\xa0\xdd\xe1\xeb\xc2\xde\xe6j\x9d\xaa\x0b\x84\xb9\xa3\x16\x89g\xfe\xf3\xaaz\xec\xa3\xb2Z\xcf\xe1\x1d\x03\x1c\xe5\xb0a\x84Z(\xda\nm\xc02\x97\xed\x98n"{{8\xe5X6\x86 B\xecPh\xec\x89F=o\'&\x03\xb8o\xe3\xf8+\x1f5\x94\x1b\x1d\x8b\xec\xa6d\xe7\xa7Z5\xa5\xbeM\x11#\xc15\xf5\x9c\x05\x1f\xbal\xfa\xdc\t\xf0\x15\xddW\xf6\x9b\xcb\x1d\x14e\xb9\xa3\x08\xf0\x99\x89\xd2^\xb0D\xa8Y\xfbS]c\xc9p\xe0\xc4\x9d,\xc5\x0e\xce\xb9N\xed\x15\x16\xea\xe5\xf0-\x1b\xc9.\xa5\xe8&\x918\x1c@\xfc\xf5\xf7K\xe6lV\x96\x86\xd4\xa9o\xcd\xdb*\xdaq\x8bW&\x99Bj\x1b\xb7\xf2\xe6\r,L\x01T\x01\xdc\xae\xc1\xd4+C\x8a\xa3\x0c\xeb\xc2J\x90]\x1a\x16p\xb9(\xcb\xf9\x05\x80\x85\x8c\x16\xf3\xb3["J%\xadV\xf7~=,3\x19\xd5\xaf\xa6\xe8\x8e\x05\xcf\xd5\xf5\x17\xb2\xee\x90\xe8/B\x93\x02\xc1\xc4(.\xd7\xae(\x133\xb3\xaf\x1a$\x02\xc7U\x87K\x83\xc2\xbd\xf0\xdd\xf7\xe5\xd5o\x8f\xae|\xf9P\x8a\x95\x8f\xfa\x82r\xa4\xa7S<\x96\x06P\x02\xf4\xf5c*8\xab\xc1RW$Ac"\x9c~C\x1b!T\x9e\x03\x8d\xd4\x80h\xbcF\xea\x81q\xa6:\xa34\x98\xf4\xe2\xeeS\xa7\x0fd\xd7cK)\xc6\xf4\x87\x0c\xd2\xba[\xb1dB\xb3\x9a\xc3\x023\xc2\xbd+\xd7?^\x9aps\xf4Qf\n\x12\x15\xe6\x18s\x02\x9f\xdd\xd6\xf1\r{v4)\xc8\xe9D\xdfp\xb1B\xdcZ\x00\xb5\x03hd\x9e\xe0m\xdeqv\xd3\xb1\x14lV\xfa\xd8-[k-6E"H\xf2`\xa45-\x8c\xef\xfb\xd8$\xa4\x15PV\xb8\xf55K\xa7\x9ba\x80\x86\x11\x8f\x11PSd\xbc\xc8\xd1&\x00A\xba\x81\x04zV[<\x91\xf7\xf2\xe8\xb0D\xdc\xaf\xa1\x15T\xcb\x95\xddk\xa7*\x87\xd5\xfa\x12\xa0\x85g#\x8c\xc9=\xea\xeb\x0b\xaaa\xadh\x84R(\xa6\x84\x89\xa4\xa1\x11\x1d\xcd\xfa{\xc36\x965Q[\x05\xbc\xf8\x19\xbd\x12\xc5\xf7\xf9%\xec\x7f\xc5i\xfb\xcej)\x05npl\xcb\x089a\x93\x80D\x06\xea\xda2\xe1\xa64\xc8\x980p\xb5\xccTo\xc4<!\x80\x97q\x0fg_\xb9\x01\xf0\xf3`#\xc2\x1c\x13\xd9\xb8/V\x9f\xdf\xef)\xfb\x95\xf8\xfb}\xe4\x18x\xadXd\xfc\xea\xa1+\xa6\xdf\xaf\xd5\xb0\xaf|\x0b\xe72m\x1e\xd6\xbe\xf7\x8e\x8c\x11\xdd\x18\xd4*\x05~\\7xZv\xa7 {-\x1b\xf5\xb0\xfc\x9d\xc9\xf2\x01"\xea\x8e\xfd\xf1Oo\xe1},\x1d\xc7\x97\xa2\x9e!4\xf2\xc8\x92\x96\xef\xe2\xd90\xf1\xfdT\x9e\xb4\xdc d\xf1\xd3p\x7f\x10l\x81\xdbQ\xf2\n7\x90&\x8aJSJ\xd8\xfa#=oc\xdd)\xfdT}\xa7H\x81\xd5\xd8\xbc\x1b\x97\xea7\x97.s>\x16\x82*C\xa1\xc5\x9fnr2\tI\x9f9]tl\x0e\x8d\x14\xcf\xcdj\xef\xaf;D\xa1o2\xe8\xba!2\x8c/\xc5\x12\x0f\xa88\x88\x80\x96)\x06\x8c\xef\r@\'KN"X\x0fs\x1b(\xec\xec\n\x90:]`t6\x9f\x97m=\xe6$dR\xacwb\xe2\x9f\x11F,\x11\x11\xe7\x96\x1eY?\x04\x10\x8a\x826~\xd1\x8a\xe4-\xa2\xe6uYR\x9e\x89\xbc\xc4\xbcW\x87\xf7^\xd3\xdcka\x96\xb70!\xa0\xe2`f\xa1\xea$\xd2\r\x03\x03\x07>\x9a#\txv\xeb\xc1D\'\xc8\xf7\x1a\xba\xfax\xea+l\x0b\x077\xed>\xbd\xf5\xd8/\\\xc5^\xdb6\xe2\x17l>I\x06\xf2{\xc8\x9b\x85\xde\xe8\xd67Eo\x0e-\xb2a\xca\x9b\x9e\xcaY\x85,m*\xd0\x11N\xb23\x16\xd8\xb8\xfar\xc4\xfe\x98;\xea\xa8a~/\xdf\xf0|!\xad\xf3\xd6\xcf\xa9\x19\x92\xb0\xe6\xd9\xde#\xa7\x18\x1e\xe7\xeb\x1f<\xc3\x1e\n\xd4\x02\xd8\x1eXVS\x80\xae/\xd3TR\xdeH\x8e]\xd5g\xc0\xa1\xa2\x83}O\xd1(\xba\x9b\xd1\xb5\xc4\xf2\xaa9@\xf6\xccJ\xc7@\x13]>g\x08\xf4C\x1f|\xb8\xbfP\xfb:\xe5\xf1\xe1g\xdc\xb0\x10D\x8d\xe4F\xaf\xd8\xf8l\x9f\'N\xd2\x1e"bM\xac\xa3AF=\x87\xcf/\xd9\xab\x19\xfds\x06\xbc\x19\xb9+\x93\x111Gr\xca\xdd\xd9\xe1\xfc[\x1b\x7f\xc6a\x83$\xdd\x19\x94&h^s\x96\x85\x99K\xc59\xe9\xf2\x0b\xef\x1b2-0\xd0}\xf9\xaaW^\xb6E\x7f\xee\xc4\xd2\x83\x9a\x99\x19$.\xab\x9f\x15\xfbii\x17W\x8c\x051c\xbe\xe6\xd0\xfe\xa0]\x1d\x83\xab\x80\x95\xbc\xea\x1d\x8e\x1dH{+n\xf1\x11\xc7\xa3\xc0\xe09\xbc\xd8\x8b\r\x7f\x85\xf2\xbe\xe0\x80\xa2\x95\x046\xd3\xc1\x03\xcb:\xf4\x7f\\\x15G\xac_\xeb\x8f\xc6S\x9d\xac\xc4\xddp\xc4r\x01\xd5&\x8dU\xcf1\xd5\xae\xd3\xbd\xc9~H\x0fA\xb6\xe6\xbfH\xd0s\\\xc0\x1d\xbe\xf0w\x1b|A!P?\xfa\xb9\xcc\x89\xe5J]\x1c\xa2\x04\x9b\x01\xbd\xb3\x18+\xa7\x15!~\xe0\x9d\x85-E\xca\xa3\xf8F7\xbbe\xf8\'S0_\xbb\xc7\x12\xa9\xe5Y\xb8\xb7\xd5&[\x05\x94\x1f\x01\xb2\x8d\xd7\xc9\xac;\xd6D\xeeE\xb2i\x87V\x11Uh\x04\x80\xa5\x05W\x16\xcdA\x10"\xed\xff\xb1jV\xbd\xb9\'\x92?\xe3y\xce\x1d\xee\xdf(\x07s\xd6-\xa7\x1c\x9a\x02\x94]it\x96\xe7\x1ao\x99\xa8\xd9\xaa\xd0\x90 \xba\xdc\xcfJs\x14\xa2\'r\xad\x07h\x0f,5\xfd\x95X\xcb\xad&\xbba\xc1I@\xb7)S!K\x1a\xb5n\xa7\xde\xc8\'b\xb5-\xed\xeb\xd4\xd8M>\xdf\x08\xea\xfc\x81drE@7\xd6\xcd\x8a0z\xfeuP\x08\x9a\'\x82\xde\xdf0\xd8\x8dA\x84%\x1f\xe2@)3\x84E\xce\xfd\x17\\(]\xc1\xc4\x8d\xfd\xab\xef7\x96~w2?]=\x9an\x8b\xd3\xcd\xb0\xa3+\xf3},\xceg:\xac9>\xdb[R.\xb1c\x88\x9b\xe7\xf8Q\xbc7\x19\\+\t\xafC\x8c3\xe0\xec+L\tP\xfa\x94f\x05\xdc\xfdc@i\x9b\xc1O.g\xe7ux\x9b\x8c\x95\xaa\xd4\x94\xb0\xfa[\xadT\x98h\x7f\xa2fP\x8cL\x87&\xfa\x89<\xde%\x8ba~\x97\xcb\xc0M`~\xd31\xa1\xf1g\x0f\xaf\xc8c\x1f\x1c+1$\xb5+W1\x9a\x8cp\xa9/\xb6\xbd\xc9o\xc2\xa7v\x97\x8e"\xec&NS\xd53\x86\xb6`\xea8\x88\xd7\xddt\x86\x0c]_\x88t?\xf2X\x0fP!/\xbbxW\xda9=\\\xd3\xe8v\xf6\xaa*9\xcc\x8e\xb6\xe9\xdb\x1c\xf8\'E\xda|\xc7\x8fO\x0e\xf5\x1eE\xe58\x1ax\xd0\xfadM\xddk^\xa8\xee\xe4\x87k\r(?\x95\xd0i:\x87\xbf\xf7\\\xb6\x83)\xf2t"p\xc5\xcf\xa4\xb6\x04I4\xa3\x9a\xaa\xe5>(3\xf6\x08\xf2\xd6}\xafk\x9b\x7f\xc9{\xfa\x8d\x06uZ\x9b\x1e&\x0c\x08\x90\xcb\xd1\xa4sItHn\x86]S~I\xc4\x7f\xd4\x12a\xca@n\x87\x88\x9e\xf9c\x96\x12\x18\xc2 \xbf\xf2\xfb\xd5\x16d\xcdf\x82\x8f\x9f\xffM\n\xb4G\x9d2\xe3#\x1e\xacP\xf0\xdd\xe4\x10W\x15\xf1Ua\xe25\x1b\x88\x1a\x83n_\xd5\\}l\xed<\xdf\xfb\xb2\x18\x84\xc3\xe6wR\xb6\xb0\xc1\xdcsN%\xc4\n\x86_0\xf0\xbfY\x0et\xf7\x12\xda\xc5\x11\xb0\x1f\x0b\xaf\x85\x9cwv|\xd9A\t(\x92\xfa\xe1\x15\xc8\xc9\x11\xd8\xe5A\x81\xf5\xad\xed\x05\xb6\xc5\xf4\xc4\x05L\xc9\x05\x1a\xedz1x6\xdc\xe9)\x18x\x96\xaf6\xa4\xdd\x06X@\xe8\x1c\xa3\x15\xd4\xe9\x90Gy\x8dz\x05\x15(\x87\xb3\xd0\r$\xf7\xa1Kp\xf3\xb7\x9b\xfd\xf1\x12\xa2\x0e} Cb\xec\xd8\x85\xdcl\xfc\xc2r\xcd\xed\xba[n\xee:V\x88\xd9x\xc4\x13\x06\xcbb^9G\xc5\xa6$\x0e\xe7\xcd\x1d"\x10\x92?\xbe\xa0\x11\xdeI\xf2Ou\x9c-:\xd7\xa4"2s\xfd\x17\xea\xf8\x86i\x96\x02\xcaqC\x9d\xfc/[\x88\xdf\x84\xa7\xfc\xae\x96\xd4\x11\xf9_{/\xb9^\x8f}\xe94\x98\x8f\x0b\x9f\xcb\'j\xed]\xc5\x12\x98\x7faY\x00|0\x0e\xe4\x87\xbd)\x8c\xba\x1a[\x01\xd2.f\xc5\xb6p|\n\x81\nP\xe5\x95\x07\x17\xa2\xdb\x81\x14J\xe2\xb9o|\xd9\x0e?\xfdo\xd9\x05\xd6!2\x93f\xcb\xa5\xa8\x0b3\xc8O\xb7j\x9e\xf8\xcb\xf9v[\xcd\xc49u[\x0e\xb7>G\xc4>\x06\t\xe8\x90\x8c^5f\xe3\xd6\xa83\xf2\xfe\xd4\x9f\xa3\xf9\x87\x0e\xe8\xd2\xb0\x88_\xca\xc82D\xb8\x97\xbd\xd2[\xe0\x06\xab\xa4\xae\x13\x8al;)\xa12\x03\x8c\x12%\x1d\xb5\xdf\x0b\xf5\x1c&\x05P\xceJ\xbd\xf8\x1c\xcd\xa7a=\xe2\xfc\x9b*\x86$\xfb3\xe7\xd8\x7f\xff\xcc\xf6\xda\x9aQ\xfe\xcc\xd5`\xde\xc1~Ll\xf3lX\xc4\x8f\xf1\xc8\xa3R\x1dB\x9a\xb9\xfd\x85\xf7\xe3$\x1e\x89\xa5\xbf\x0e\xa1f\x1e ?\xa4l\xa9\xb36@\xacZ\xa4\xdaW\xe9X\xc4z\xf9\xff\x9d6\xfe\xd4\xab\x90\x8d\x06\x98\xbbH+N\x06\x8am\xd9\xb7\xcb\xa7E\x01 jk=\x98\x17N\xf9\x00\x88g0\xdc6Qvh\x00d\xa6($\x00\x83\xc3\xcb\xb3\xe8X\xaa\xca8\x9bp\x92\xc9e\xf5\xb2?\x02\xb0\xa3Yg?Sa\xcfy\xaa\xc0\xd9\xb2\xf4eF$T\x1d\xba\xd8=\x00\xbf\t\xa3V\xc4=\x95/\x84\xae\xe7\xff\x96\xc4\xe8\xed\xbeE\x90\xc0\xe2-Wr\x93]"&|lE\rt\xc4H0\x95#x\xf1\xdcC\xe0"\x93\x81\xbc\xdb\x1d\xb7\xaes>\x0f\x0c\x93\xbe%\x7f\xd7I\x8b\xab-h\xbd\x9d\x12\'\x8a\x93P\r\x93\x18<\xb5\xc4\x8a\xc2xV\xe5\xf8\x86\x9af^?\xebo\xa7#\x9e\x1d\x88`\xad\xa9\xb8G\x1a\xda\xf1:\xeb\xba\xf4\xbb\x80\xd8\xb4\x94\xde!\xf5L\x94\x17\x18it2(\xf0\xb9\xc1\xb1\xc9\xe4\x92\xfa\x98O*\x05W\x0b\x9e;\xedJ\xe8\xd6_\x8c\xe5LW\xd8(E\x89\x19\x89\x81\xb0\xe7v\x9bf\x89\x87\x13\x96Om\x14%\x11\x87\xd7\xb4p\xeeS\x07n\ntH\xf7Z\xa9\xce\x05\x05\xe7\x95\xcc\xc9\x94\xfb\xb2\xd8\x81E\xa0z\xe9\x07\xebdr\xfb\xe2\xe6\xe4SW\x93\xdd\x11\x04\x0f+h$&\xdeY\xa4\xa2]./\xb2\xcb\xa1\xba\xad8U5\x14\xa0&\x9aL\xb7\xf5\x0b\xd7\x106(\xc2h\x9c6+\xc5\x99\x9c?\x10\xcb\xa4\x8aD\xe7\xb2\x10\x81c\x81R\xb5_\x06\x8e\x83\x81\xc2\xba\x8b\\\x84\x18E\x9bW\xedi\xf6\xd8]B\xd5V&*\xe7\xa1\xdcJ\x93\xd2\xcb\x86\xd0\xe4\xcb]\xfe?\xeb\x17Ug\xfef\xc8\n\x94\x91\x9f\xde\x11,e\x9d\xbc\xae\xf4Jj\x9a\xa7r\xf5\xe7<\x95\xfbb\xda\x19\x14\x9cP1\x8b\xec\xe2\x1f\xc1O\xbc\xb1U\xda|eN\xab\x9eR\xb7\xf87\x8c\x0b|\x86\x13,\xb6\x8e\x14o\xab\x88\xcd\xcb\xc5\x7f! \x84S\xe3ym?\x8f\xb3\xa4~z\xc0\x8d\xe8\xd4"\x15\xbdC\xee\xf3d\xda\x1a\x1a9%w*\xf73\xbf\xdd!\xa9[,\xa9\xc6\x11}\x1f\xc4\x8a\x1fsB\xe7w\xa5\xf0Mv\x81\xd7^\x87\x15_\xc1\xa7\xad\xb0\x94\x15\'\xd5V.\x87~\xbc\x97\xdf\xba\xd1\xbf\xd5,vu\xcf\x8a\x05\xda\xa8\xdf\x04\xb6\x9d\xf1<%\xf8"#K47u\x98\x1f\x97\xc7\xff\x02zVr\x99\xc3\x05\xdd\xb7t9\x07\x11\x9e5y\x80^\xfe\x96\xc2\x07\x8e\x82{7j\x98e\x15y\xaa>\xe8\x06L\xf8u/\xfa\x06\xc0\x98\xcbM\xebk\xe39o\x08D\x9f1\xba\xe4\xca\xbc\xa3\xc5\x9b\xd9\x83\x1e\xc6\x00\x141\x80\x19"\x97\x9c\x10\x01\x83\xa8w \xfb\xb8\xfa\xe0\xde\xf9\xdf2U\xff;cE\xc5\x835"\x8c#\xc1}~C\x0e\xd8\x94\xb9< \xa3\xce\xc8\xb3\xabH\xf3\xc3\xdau\xee\r)\x1b\x95\x17\x88O`ON\xb5\x85\xf1\xa6\x8a\xf0j\x1e\xbd! yT\xe6\xc8e\xa2"\x0fFQ\xbf\xb2\x91N\xb7z\x05\xff\xb5\x1d*\x1aM]\x1cf\xe5\x8f|\xed\xf4O"\x088L\'\xe6\xf9\xf2L\xa2\x92GN\xf2\x92I\x03\xa3\xfe 5\xeeB\xef\xf3C\xf9$MJ\xd3\xd3!R\x93\xea\'\x95\x99\xba\xbeS\xd7\xb8,\xc0-1\xa0-\xd8\x83\xabIMZ\x06*\xb1\x071G\xd1w\x82\x1f\xec\xfd\x8avJde\x9e\xd5-u\xe5|\xa23{\x9c\xd5\xf6\xae\xce\\7\xd1\xe5\xef\xe8\x02\xab)d\x93\xf7\x9dr<\xb5\xef\x9f\xca\x0f-\xe0\xf8\x1c\x92*\xb9;\xeb\x1d.\xadV\xaf\xd5p\x1cD\xfdT\xbdx\xd3Z\x08\x96#\xf2L\x8d\xb0.\xf5\xf4+\'\x0e\x8b\xb9J\xe1\xbc\x17\xac[\x81J\x17\xbb\xe0\xf4\xe0R\xe8\x0fH\xdf\xab\x07\xe4p\x00,T\xf4\x9e4\xafQ\x11U\x1a\xa2\xd9\x9f\xb11\xa3\xfa')
|
1
|
+
from . import bot
|
2
|
+
|
3
|
+
from telebot import types
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
import datetime
|
6
|
+
from hiddifypanel.panel.database import db
|
7
|
+
|
8
|
+
@bot.message_handler(commands=['start'],func=lambda message: "admin" in message.text)
|
9
|
+
def send_welcome(message):
|
10
|
+
text = message.text
|
11
|
+
#print("dddd",text)
|
12
|
+
uuid = text.split()[1].split("_")[1] if len(text.split()) > 1 else None
|
13
|
+
if uuid:
|
14
|
+
if uuid==hconfig(ConfigEnum.admin_secret):
|
15
|
+
start_admin(message)
|
16
|
+
return
|
17
|
+
bot.reply_to(message, "error")
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
def start_admin(message):
|
23
|
+
|
24
|
+
bot.reply_to(message,"Welcome to admin bot. Choose your action",reply_markup=admin_keyboard_main())
|
25
|
+
|
26
|
+
def admin_hash():
|
27
|
+
return hash(hconfig(ConfigEnum.admin_secret))%100000
|
28
|
+
|
29
|
+
|
30
|
+
def admin_keyboard_main():
|
31
|
+
|
32
|
+
return types.InlineKeyboardMarkup(keyboard=[[
|
33
|
+
types.InlineKeyboardButton(
|
34
|
+
text="Create Package",
|
35
|
+
callback_data=f'{admin_hash()}create_package'
|
36
|
+
)
|
37
|
+
]
|
38
|
+
]
|
39
|
+
)
|
40
|
+
|
41
|
+
def admin_keyboard_gig(old_action):
|
42
|
+
def keyboard(gig):
|
43
|
+
return types.InlineKeyboardButton(
|
44
|
+
text=f"{gig} GB",
|
45
|
+
callback_data=f"{old_action} {gig}"
|
46
|
+
)
|
47
|
+
return types.InlineKeyboardMarkup(keyboard=[
|
48
|
+
[keyboard(i) for i in range(1,5)] ,
|
49
|
+
[keyboard(5*i) for i in range(1,5)],
|
50
|
+
[keyboard(50*i) for i in range(1,5)]
|
51
|
+
]
|
52
|
+
)
|
53
|
+
def admin_keyboard_days(old_action):
|
54
|
+
def keyboard(days):
|
55
|
+
return types.InlineKeyboardButton(
|
56
|
+
text=f"{days}",
|
57
|
+
callback_data=f"{old_action} {days}"
|
58
|
+
)
|
59
|
+
return types.InlineKeyboardMarkup(keyboard=[
|
60
|
+
[keyboard(i) for i in range(1,16,3)] ,
|
61
|
+
[keyboard(30*i) for i in range(1,5)]
|
62
|
+
]
|
63
|
+
)
|
64
|
+
def admin_keyboard_count(old_action):
|
65
|
+
def keyboard(count):
|
66
|
+
return types.InlineKeyboardButton(
|
67
|
+
text=f"{count}",
|
68
|
+
callback_data=f"{old_action} {count}"
|
69
|
+
)
|
70
|
+
return types.InlineKeyboardMarkup(keyboard=[
|
71
|
+
[keyboard(i) for i in range(1,5)] ,
|
72
|
+
[keyboard(i*5) for i in range(1,5)],
|
73
|
+
[keyboard(i*50) for i in range(1,5)]
|
74
|
+
]
|
75
|
+
)
|
76
|
+
@bot.callback_query_handler(func=lambda call: call.data.startswith(f'{admin_hash()}create_package'))
|
77
|
+
def create_package(call): # <- passes a CallbackQuery type object to your function
|
78
|
+
from . import Usage
|
79
|
+
try:
|
80
|
+
splt=call.data.split(" ")
|
81
|
+
if len(splt)==1:
|
82
|
+
new_text="package size? حجم بسته؟"
|
83
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=admin_keyboard_gig(call.data))
|
84
|
+
bot.answer_callback_query(call.id, text="Ok", show_alert=False,cache_time =1)
|
85
|
+
elif len(splt)==2:
|
86
|
+
new_text="package days? چند روز؟"
|
87
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=admin_keyboard_days(call.data))
|
88
|
+
bot.answer_callback_query(call.id, text="Ok", show_alert=False,cache_time =1)
|
89
|
+
elif len(splt)==3:
|
90
|
+
new_text="How many? چه تعداد؟"
|
91
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=admin_keyboard_count(call.data))
|
92
|
+
bot.answer_callback_query(call.id, text="Ok", show_alert=False,cache_time =1)
|
93
|
+
elif len(splt)==4:
|
94
|
+
gig=int(splt[1])
|
95
|
+
days=int(splt[2])
|
96
|
+
count=int(splt[3])
|
97
|
+
new_text="Wait... لطفا صبر کنید"
|
98
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=None)
|
99
|
+
domain=(ParentDomain if hconfig(ConfigEnum.is_parent) else Domain).query.first()
|
100
|
+
for i in range(1,count+1):
|
101
|
+
user=User(package_days=days,usage_limit_GB=gig,name=f"auto {i} {datetime.date.today()}")
|
102
|
+
db.session.add(user)
|
103
|
+
db.session.commit()
|
104
|
+
# bot.send_message(call.message.chat.id,f"Days: {days} Limit: {gig}GB #{i}\n\n https://{domain.domain}/{hconfig(ConfigEnum.proxy_path)}/{user.uuid}/",reply_markup=Usage.user_keyboard(user.uuid))
|
105
|
+
bot.send_message(call.message.chat.id,Usage.get_usage_msg(user.uuid),reply_markup=Usage.user_keyboard(user.uuid))
|
106
|
+
|
107
|
+
# db.session.commit()
|
108
|
+
new_text="Finished..."
|
109
|
+
bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=admin_keyboard_main())
|
110
|
+
bot.answer_callback_query(call.id, text="Ok", show_alert=False,cache_time =1)
|
111
|
+
hiddify.quick_apply_users()
|
112
|
+
|
113
|
+
except Exception as e:
|
114
|
+
print (e)
|
115
|
+
# import traceback
|
116
|
+
# traceback.print_stack()
|
117
|
+
# new_text=f"Error {e}"
|
118
|
+
# bot.edit_message_text(new_text, call.message.chat.id, call.message.message_id,reply_markup=admin_keyboard_main())
|
119
|
+
# bot.answer_callback_query(call.id,cache_time =1)
|
120
|
+
|
4
121
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
122
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,125 @@
|
|
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\x00\x9e\x13\x00\x00\x12\t\x04\x00\xba\xd9\x1aD\xb5\x04\xf0{\xc7\x8e\x9dt\x9d\xb5\xb1\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x7fw\xbc\x04\xa9\x91\xfb\xde\xbb\xa9\x94\xb1\x9cP\x84\x99\x8d\x85\x8c*b\xdc\xff\x14r!ZR\x18pI\xf5\x1a\xe5{\x82\xc0\xdeZ\x92OIa\xb0\xf6\x9e\xfd\xf1\xf5\x07\xba8\x9b\xa8MA\xf0%\xee\xa7\x0c\xa7\xe3<@\xf7\xfa\xcf\x80}\xa6T\x84\x16SfO\xdf\x9cP\xd122J2\x15J\xd6\xca\xd0y{\xd7\xd0\xff\xbcCR\xa1D\xcd\xad\x8dc\xb8f4\x8b\xb6\xe1\xcb\xa7\x16\x1e\xf8\x1e\xc3\x1a\xaf x\xac\x11\xa8\xe6\x8b\x83)\xd7X\xf3\xc0[\xf2\xad\xefF\xe5\xce;+@ \xe56\x97nB\xa5\xd1\xe8\xf94\xe6\x85\x07\x99\xe9D\x83\x10\x8d\xd8\xa4\x97\xaa\xae\xce\x9eq\x9d\xad[\xd1\xdb\x06\x16Ao\x96\xe16\x18\x128\xbe\x1ai}\xacr\x97M/\xff\xa7\x14\xdbF}>\x18\xabM\xa4\xd67\xbc\xe2ZeV\xe9\x87\x85`\xbf\x10Q\x80\xb4\xb3+\xea\xaa\xf6\x92\xc97M\xff\xed\xf2\xea\xbc\xbbD\xc62\xfe\xc9r\x02b\x8b\x828G\x7f\x07:\xaf\xb9&\xe8\xb2\'\xd4r\xa0Q\xe7\xdfR=\xc3V\x05F\xd4\xf2\xcd\xb2Ot_\x98/\xaf\xcf\xa0@\x01YX-\xee\x83@\xd4\xb2\xd6\xa7\xe9<\xec#\xea\xea\x120%\x1b\x05E#\xd2\xd3\x00\n\x81U\x89gp\xd8\x8e\x0e\xb3\xfed\xd9\xa4q\xb9\xdc)J\xb0_M\xf24\x8d\x16\xfd\xdf\x15\xa8\xcc\xd0\xec\x98J\xb0\xcb\x10\x0f\xf9A\x8cA\x07@\x02\xdd\x93\x9f\xf5\x99W\x8d\xbf\x8f\x86c\xac\xc4\x9a*I/\x94\x00*\xee[<\x0c\xc1\xb2>\x1eo7F\xc5\n\xe0\xbe&G\x8cqw|\xcb\xc9\xc0nJ\xc9\x84\xa2S\xa0\x88\x1dE\xd5\xa1k\x92%ap\x1ci\x10\x067t\xb6_\xb8\x11:r\xb7\x14\xe3?F\xbeE\x1f\xfa\xe9h\x12\x9b\r\xd5\xe4\xb9\xd9\x0f\xba\xd8L\x85h^\xbf\xaerI\xa8\xa7\xb0\x0bn\x18vY\xae\xf1\xe7VC\x13\xcc^UR\xaa\xc5W\xb9\x07\xc1\'\xedW\x17)\xac\xd2"\xc3\x90\x1d\x87X\x80\xe5>\xf0f\x9eI\x95\xf2\x87\xf5e\xb9=\xfd\xe4\xe3K\'\xd8\x1b\xdcB\xf7\x91\xd5!\x9c\xcc\x0cy\x04\x02{\x80\x0b^\xda\xb1\x87\xf0|M+d\xee\xa0\xdb\x06\x08\x13\x11\x05\xa6p/\xef\x9e\rP\xb6b4\xfd\xc0\xc6\xe1\x85\x98\xb3\xc7\x1a4\x98M:\xe7\xf9=\xea\xfb\xa5`\xcdiG\x83\x8b\x8e\x08\xb6\xec\xcc\xb1f\x8f\xac5\x06\xa6\xe5\xab\xcf\tc\x1ag$\x8d\xfd\xdb\xc9\x80r|\x99\x0e\xd9M\x12_\x81d\xdb\x1e\xe7\x1eIk\xcc\xffm@~\x1d\xe99\xf6\x0c^\xbf\xe0\xfb\xd4\x1c\x0c\xf5{g1\t\xcf\xa4M\xf3\'j\x93\xf0[\x8e\xff\x86\xe8\xec\x8cz\x1f7\x19\xaa\xe1\xc1s\xa7|\xf0\xc2\x92Pl\xd4~\xf8-\xa0\xbbe(\xadw\x16\x9e\x8d\x94>%\t&\xef2\xe8\r\xdaO\xb7\x0e\x9d9\x8bB1d\x13/#\x8c}\x15\xf0QB\xd8\xe9;\x07\xa2\x1a\x9b\xba<\x81a\x81\xce\xe6\xd1\xe3\x8a\xdc\xa1\x92\xc2^AM\xb3\xda\xea\x7fw\xe4\x01\x92\xfbM\x01\xa1\xad{\x07\x98\x91G#\x1a\x9eo\x04&Y\xf8\x0e>\tDI\t\xf1p\xb2a\x9e\x87\x83\xa8G7K3>\x0c\xa2\x18Ji\x95\x01k\xc3~\xc5A\xb0\xf6j\x92\xac4\xfe\x17\x1a\xfeKm\xe7<\x07\x03\x94>t\xd9\x0f\xa5\xedh\xb6\xe2r\xaa\x83\x81\xe6\xec=\xac6\xa4\x9f\xbb(\xb1\xe1\xd2\xc2\x8a\x7f\x86\x9a\xca\xaa\xc4\xf3MW\xed"\x8f"z9AD\xcc\x08@\xb3\xf2)T\x9aq\xf1\xf8\xbcNv@\xd2\x8c\x1b\xb2\xeev\xcb\xbcTH\x81\xfb\xba_\xd0\x90\xf0*\xed.\xbe{\xec\xf5~\x81n\'\xbdy3\xc3\x12\x8c\xc7\xdd\xb5\xcf\x14\x8dw\xbd\x84\xa7~\x19\xbc\xd6%b\x11%D\x8d\x95\x85\xfd\x0e<\x90\xe0\xfd=\xc1z\x8c\xf7]\xe5\xac\xda\xa2Ko\x1b\x1b\xa4=\xa7\xda\x0e\xbb\x04}4\xa2\xb4\xe6\x1f%\xfa\x7fu\xdbc%\x19>\xb5\xd1fw\xad\xeb\xc5Q\x1aOF\x87\xdd\xbf\x14\xf5\xdc\x96\xb6bn\x94*\x01L\xc3\xd4\x1bvM"\xa6\xc5J\x96$\xbb\x8cF\xce\x8f\x83\x8c\xb2\x14*Y\x8e&I\x7f\xb9C\xf9\xa0UD\x03\xd1\x1b\xd7\xb9\xa0K\xb1\x93\x9f<J,\x16\x85\xc1\x127v\xa5\xd9/\xbf \xd5)\x8e\xb8]\xecdU]\x80l\x11cM&l\xe6{\xa7$\xb8\xc3\xac\xe4\x92K\x89Od\x9a\xdf\x04\x99[\xe4\xb8\xcf\xee\xc0\xd8+\xea:\xfd\x84\x93+\xb1\xfcS\x1f\x91\xec^\xbcO\xfdg\xc7\t:\x82\x10\x16^5D\x0eJ\x8f"\x1d\x14\x1a\\WL\xafI{\xfdx\xf7\xe7\xd6\x7fC\x9c\x15\x1d_\xb8\xaaA\xad&G\xb5\xe2\xce`\n\x13\xe3K\xb3;E\t\xbac\x95\xd2\xb0\xc6[_\xc8y\xeb\xd0\xf3+\xc2\xba#V1\xd6\xe3\xb8\x18jB9\xf5\xc4\xd5mb\xb3t\xbf\xbc}\x9a\x1b\xdd.\x02Im\xef{t;\xf6#\xd9X\xf7\x1b\xd4\xd6\x1f\x16\x89\xe7\xda\x16\\\x17\xf2\xf9\x9be Z\xf9fNN\xc0\x85\x0c\xf9O\xb3{\x8a\xf9$\x92\x97\x9d3\xb5$(y{\xd3\xd7_\xf1\xc5\x14G;v\xd3\x1d\xe9\x95\x1f\x8d\xef\xbb\xc8\xfc\x9c5\x98\x85X\x02\x96\x1d\xc56\xf8\x1e\x0f\x07g\xf4\x9a\x9a.\x8a\xb2\x8c\xe2\x9er$\xbc\xee\x1d\xd8\xec\xa6\xef\x88\xc3VI\xfb,\x10\xd4\xd6\xbb\x17JY\x86\xe4\xd3\x1b\xf9\xcb\xcct\xe4\xabn\xa3d\x88\xfe\x0b x\x05k\xd5\xe4\xf3\xc1\x8f\xea1cm-\xc5g\'\x9c\xbf\xe4\xdb\xaeS\xf3\x8d\x14{Sx\x0c\xa5x\x19\xbbw\x83\xbe=y\xd8|6\xce\x8d\xd0xhV\xed\xd0m\x98\xf6\xcc\x19\x03o\xbbp\xf0\xab\x13\xa4\x88\xc3-B\x11\x82\x0b\x88\x0c>\xc9\x96\x8d\xcd\xab\x0b\xc7\xb5LO\x81\n\xddl\xa0F;T\xec?\x81N"\xb4\xbc\xf9\xea\xebk4\x8fF%\x83\x06\x1b\xab~=;8\x10\xbf\xae\xbb0\xcd2\x10\x03\x13_\x9eCx\xaeS\x99\xcb\xcc,m7\xce\x8f\xce\x07\x00<\x8e\x00\x84\x85\x9e{\x13\xd7\x9d\xe4{\xbe\x99f\xf9-\x8e\xdc\x13\xd6\xd2\xd7\xc6\x05V\xfa\xfc\x1fY, o\xa4\x15B\x90\xcc\x9bx\x93\x0c\x0eO\xd9\xba\xde\xfe\x88\xb7\xa4\x7f\x90zf(2nG|O\xf4\x06\xa2u$_\xf1\xe6\x82`o\r\xe0\xf15\x92\xde\x8d\xf1<\x89\xfa;\x98\xe9m\x9c\xdd\xc9\x02\x95q\xb5\xeb\x13?\x86\x88\xd5b\r\xe0\x07\x01\n\x8f\x1d\xd6\x97c\xa9n+\xe5}\x1ab+h\xd1\xf9\x0b\x1cO\xfeQ\xbb\x18;r\x88\xa8@\x8bK\x14\xc5\x7fl\x93\xc8\x12{\xcaVS\xbd\xd6<\xdd\xe6\nD\x12\x06\xd0 \xd4\xf2Jg\xea\x02\xdfv\xd2\xa2\xda2:\x88\x7f\x8c\xa5#^9\xd2}\nO*\xd4#e\x04\xa3\x005\xec\x98i?b1\xc4,\xc0\x9d\x12`\xeeW\xc8\x03\x7fk\x0f\x16\x1a\xb9\xca4\x08jc%\x92\xbd|\xabCEq\x906\x14q\x99\xd4\x10\xf2|\xdd4\xc0\xa9L\x00\xac\xe4\xe9\xf7\'k\x93\xdf9\xd1l\xfbP-T\x99Y\xc3\xb2:L\xcaQ\xaeD\'@V}\x8c\xe0\xb8"\xc59\xfa?\x12\xb4\xba2@K\xa0\x8a\xff\xe7\xd5%hp\xd1+\x81Y\x9d\xa3;\xf6\xe1Ix\x05\xfb\xebuV\xa8\xd5\x85.i\xe6\x16G\x9b\xe7\x0e\xe5\xdc=\xdf.\xd6\xe2\x0c(\x1a\xfc\x88:@\x13\xeeJ\x0erG\x8f\x1d<0.\xa5\xb3\x86C\xe9\x0c1\xf0B\x1a\x97\xca\x7f\x94B\xd7\xa1\x9bsbA\xee\xa3\x88\xf3\xb5\x0bK\xc9\xfd\xb3\x84\x96\xae\xbb\xc3\xa2@\xe0\xb1V\x14\xed\xff\xd4\x11b\x8cb\x94K\x02\xe46\xbc\x90\xe4{+\x87\xbc\xa4\xb7\xf6\'\x98;\x83\x9b@\x17\x98\xa3fR\xbf\xca<\x97\xa7\x94\x8d\x80\xe2l\xf4T\xcd\xff\xaa&\xc4}\xf0"\xd2\xf8\xe8\xf43\xff\x15\xd4\xe6\xbeS\xb1tk\x95\xe4\x93u\x0e\xb3\xf4+\xd4\xda\xad\x95t\xed\x86\xb2m`\xa8\xfd\xe9\xec\x1c\x9e{\xb7\x7fX\x7f\xab\xcd\xd9n\xe6v\xece\xd4\xbc\x82\x16\xdd\xd4\x13\r\xc8\xe7_QRD\x05X\xb6\x91\xb4\'\xea\xe3\xc5\xd7\xc9A\xee\xfa\xf4\xe9h`\xda+i\x81\xcb\xe2\xd7\xf0\xa1\xcel\xa1\xf8?[\xb7"\xcb\x91m\x880\xe4\x16\xf3\xd1\xc0\x80\xb2\xca\x12b\xdbs\xd6\xb81\x02\x936\xa3\xfd&\xe0\x1e*\x9c5C\xc1?\xf9\xb8}dO\xf4\xca,2\x9e\xa6K\x98\x05p\xb3\xaaL\xa4&\xf8@\xf0|\xd2W\xe6\xb4\x8e\xa6\xdd\xbf\xb1\xa7\x88\xa8(\x98\x8b\x8a.y[;\xa4\xc7\xf9}\x12xy\x96.\xf1\x14 \xd8*~<<\xf2x}\xa3m\xe8\x046\x87\xb5\x85u\x82I\x07F\xcaJ\x0f&X\xa9?\x04\x99\xe7\xfc\x9b\xcd\xf0\xe6\xc7C\xdd\x7f\x8c=\xeb\xb2i!/\xc00x\xc0\xa4\xf4hX\'\xc2\xf2\x9fT\x9d\xfe\xc0\xf5\x88\xd0d\x91;\xa2J\x80\r=\x85\x87\xff\rD\x1b\xd9\xa1\xb8c\n\xa5\xf2o\xd0\xea\xd7c\xef\xf3S,\x1e\xd8\x88\xea\x97f07\x7f}\xe2\xf7N0\x99\x88`\xb12\xa5D(WJiS\x11r\xfc\xa3\xdb~\xd9\xaf\x9e1\xed\xcb\xa9\xf9\x9a\x89\x7f\x13\xfb\xcaJ\xe3\x7f*\x08\xdc{\xeb\x03\xd4R\xaa\x1e\x1a)m\xa0\xd0\x11\xdd\xcfHU\xe2\'\x14\xf4\xc8\xf5yP\xa0\xec\xf1f;\xbc\x98\xf86\xc8B\xd9\x14\xc0\xe5\xef\xacID\xa4B\x02A\xfa\x00\xd7\xb2If\xa9\xed\x93I\xe5@\x0b\xc5\xc9\xcf\xe8\xd3\x8dIw\xb6\x94\xf0\x0eN\xc93q\xf1p\x10d\xfdt\n\xce\x10\x18\x92\x012\x1aI\xe2N\x02;\xb7\x16\xa6\xc35\x97\x11\x18\x10\x94\x1f r$\x88\xa2\xca>j>\x01\xe4\x90\xf2*[w\x15\x8a\x9e|\xf1KF\xa0T\xc0 \x1a\x9f\xcby"\x86\xa5\xc3b\x9e\xa7\xe8tk+k\x08\xbc\xb4\xdf\x12@\x0e6\xbc3\xcaf,td\xb35\xe4\xf3\xd4\x9ej~\xde\xe4\xb3>\xaa\xbd\x1d_\x18\x84\x8a:\x90\x92rScH\xf1\x86G\xab{\xcf\x89\x07\x96RT\x14\x90\x01\x03H\xef\x0eGA\xaa\x1d\x1a\x7f\x1a\x854\xb0e\xf8F\xb94\xc5\x81\xd8\xed\x88\xcfA\x97\xb3\x9d*Z(wS\xaeQ\xe7W\x85\xcb\xf5\x85\xe0W3\x06A\xa8\xe4\xdd\x98\x82&+Tr\xdf\xcai\xf6\xe3\x8a\x15\xca\xcaM\xccX\xcer\xabp:|qF\xbaY\xbf\'V2+\x8d\x07\x113\xf5*\x10\xf23\xc4}@\x11\xe2^\xee\x87\x1c.\xf2\xc1\xa3\xebp\xaa\th4\x9c\xf7CU\x1c\xda\x17\xe1nob\x91\x9f\x1b\x00b\x9f\xf8\xf4\x1cIe\xb1u\xc9\xc2\xf8\xdb\xb6o\xfat\x88\xc7\xe1i\x15\xf3#\xf4\xae\x02\x016\xe9\x8e\xb5\xef\x8c\x92\xd7\x94\xcb\xe0\xf5\xf7\x0c\xb8\x95\x0cns\'\xe2sW\x86\x90\xad\xdd\x1d\x957vH\xaa\xf7.<\x9aQ\x80\xf3\x8d\x19\xd7\xa9$[\xfd\xf3-8\x89fA=%\xa1\xaf\xc3 9\xc1\xfd\xabM\xeb\xf6M\x0e\xf0`\x9cd\x92\xd8\xac\xa2$\xfd\xb7\xb4a\x94\xff\xad\xbd\x0c\xb1\x10\x10\xbf\x03BA\xdf?\xd4\xb5A\xe6\x0e\x9b\xf5\x91\xeb\xd1\xa5\xcf\x7f\xbb&\xbc\xc8\xda\x05\x04\xdd\x9c6P\xac\x9e\xee\xff\x91C)t\x9a\xb9d\x92\x04\x90\x8bG\xb6NV\x8a\xa9eu\x82dq\x84\x9e[\xcfe2\x07P\xb1k\xabBt\xe0K\xcdqEA\xca\x1a\xb4t\x9b\x1a\xdeI\x9a;D\xbf\x92\xa7\x95\x89!>K\x92\xc3\x0b\x9f\xc8\xa7pP\xe8\xd8t\x05r\xb6\x12e>\xbb\xb6\xb9p\xc1\\\xc1b\xbd\x1e\\\xf0\x92\xf2h\x17\x82\x08\x16Si3\xfc\xa4\'\xab\xa9\xd3\xde\xf4ai\x85&\xc6\xf2=\x80\xfe\xc9\xd6*\x80\'4\xc6\xc7A\xee\x9e#\xce\x9b\xcb\x85\xaeA\xc2@\x92\n~M\x87\xe1$\xbc\xff\xebjm\x1bav0\xf5\xb1j\x8aq"8\xf8\xffkoAw\xa1\x16<\xe4\xd0\xbf[\x1d\xa8\xdc\x84\xa7\xe0\xcb\xe0[\xa5\xd4=\x16\xf9\x95\xf9,W\xe03Kg\xab\xaf\xd1Ca>\xf92Nv\x8b\xb9\xcfO\xf0\x0f\xf1\x98\xfdok(\xed!\xf0\ng\xd5\xf9\xa2o9\' 3:T"d)\x07\xe1\xa6G\x8a\xe0X\xc0\x8e\xe2\xb0H\x842|\xf2\xfe\xb1\x18\xdb-\x17\xdeJ\xe9a\xc2\x18\xe1\xac\x1d${\xa2\xd3)/\x01\xd5\xea\xddQb\xa4\xe2\xd6[p\x97a\xec\xc4\xca\xd2;\xe7\x11\x9eY\xfd\xe3P\x8fM\xf1\xd4\xd8\x9a!\xa0X%%\xa0\x13<\x98W\x10mD);\xc8vJ\xcd\xb9z\xf8\x9b\xeb\xbd1\xfeD`\xef\xfa&\xeb=\x85\xf9\'\xb7+\xc2\xa55\xaeiq\xe08\x9daKx\xb7\x84le\t\x97\x85+`\x80I\xe6\x0b\xbf$\t\xa7\x93\xb9s\x9eK\xbc\xca\x19\xe9\xd4\xd9\xdeAz4\xdf"R\xf6\xcf\xa6T{\xd2q~\xf4\x81*w\xa5X\xbe\x8c\xe0q?\x03\xf1\x80\xbf\x97\xf1,\x89\x8c\xac\xc1\xd0\xe5*\x8f\x8c\xa9E\xc6\xfc;\x97(L\xbb\x94 \xfb\xf6\xbcO\x92\x0f\xb7,ML\x06\x81%\xe2[\xa6{wW]\xd8]\xefr`\x1b\x9d\x9d@\x16\x08\xc9\xc1J\xf10\x8a&\x90$&\xe0\xf8\xe9\x1a\xff\x17\xd8\xaac\xcfW@t\xdd\xdc*x\\y%I=\xa4\x12Z\xf7\xe5\x13WV\xdd|\x7f\\x\xa4\xd1\x1a\xe8U\xd8\xec|\xf2(B\x8ar\xe6\xdcvl\xc1\xbdQM$&"\xd8\xc1\xfa\xc7jo,\xd8*a|\xde\x96 \xa6w\xe0\xd6(7\xfa\xb1\xc4DJGw\x87\xb9D\x89/`\'\xf3B8i\xda)\xb3>\xd3t\xbd\x93\x7f\xa0=\x11\xb1\xbf\xec\xcd\xd2\xff\xf0qH\xafn\xaa\xb9\x14\xe9\xf1&~\xa4c\xe4\x8f\xbaF\xf8\x1b\xe7;\xf4{\x0e\x11`\t\x02G\xc1}\xf7\xb6\xe3\xb5\xcf\xee\xe1#7\xddh\xa1\xe4\x15\xf7\xa4\xacuU\xe6\xa3\x9e\xe4CT/@\xfb[5\xc2\xa3w\\\x0f\x8b^G\x18]\x1c\t\x1dL\x054\xb2\x11\xc4a\xe4\x03\x8c\xbe\x1aOt8Q\xe0$[\xef\x12\xd8B\x1c\xcb\xb2V\xb7\xf9g\xfb\xdd\xce\xee\x81v\xc4\xa2\xcd\xc1\x0b\x89\x87\x8f\xc0\xc1D)=/\xceY\x9bxh\xe2SW\x8c-\xcc+\x15\x9c\xe0\xea\xa8\xe1\xa9$\x8d=\x92\x1e\xfc\xab\x93\xf1\x00\xa1\x95\x13<\x1a\xc4E\xa9\x9dQ"\x0clX\x8c\x84o\xe8u\xd9t=\xa9\x14\xae\x03\xd3\xda\xf25FJ\xaf\xe1!\xe8\xa1@\xf5\x14\x12\xb2\xf3\xd6\x97\'jH,8>T\x98E\xee`\x18\x89\xd6\x1e/\xa8f\x14\t\x91\txy\x19\xe5\xb9\x9e Im\xd0\xa6\xb1\xe3\xa0\xfa\x9f\xb6\x90\xd3\xc3\xef\x1fFC\xb9\xdc\xdb\x18e\x9c\x99\x81\x9e\xcf\xb4\x89\xd6\xbe\xaac\x94@Rh\xd70n\xac\xb8Id\xe8H\x9d\xc2\x10\x98$\x97\xe2\x81:\r\xb25\xf0\x9c\xb5/\x84\xa8\xe7#\x95\xe5\xb4&\xa6Y\xaaJ\xcd&\xf8\xe0\xd1c\x06kF\xdbKi\xa0\xa3\\\xa7\xd2\xe2luht\xe9\x92\xfc\x01\xb7\xf6\xb1\xeb\x13\x15\xc1\x9f\x00s\xffB\x08\x8e\xc4\x0b5G\x0f l\xdcz+\xe9\xed\xda\xca\x13\xe6\xee\x9d\x07!\x91\xee\x17\xa8H)\xa3J\x01\n\xba \xb9@c\xc4C\x12\xc7Q\x01\x86\x04\xd9\xf7=\xe6;\x0f\xfb\x9d\x17lu\xe1\xe1\xb1\xbd\xd2\xd3fySr\xfb\xb2\x95\xe0bzR\xf5x\xed\xc1\x1c5}\x15\xd4\xeb\x8b\xb9\x05\xe7\x12;\xebV\x90?\xf7\xa1[\x96\x9cO\xbe0\xc1 8#\x17I T\xd3\xbe\xdc"\x1d\xd3\xfc\r\x81\xdby{s\xdd\xe4\x98\xa3\x9e@QK\xddY/\x17Y\xe2\x9b\x98\xfc\x961\xfd\x9e\xb0\x91\x9a\xff\x94\x0bO\xd0w\xadcf\xfe(e\x9ds\n\xc6\xb1\x80\xb0\\\x8c8\x17\xb4-X-\xc0\x05\xda-b\x7f\xe0F\x96\xb1?h\x0e\xc4\xf2h\x9c\xa0\xca\xd7\x1e\x87\xd0\t\xed\xd3\x852Q\xe1_4r\x08\x19\xef\xad\x19D\xc0\xe3&S\x99\x0f\x17;Y\xda\x05t\x1dl2\xfb\n\xc9\x1b\xf8\xfc\xc7Q\xdei_\xd0b\xd0iYLs\xc2h\xe1\x96\'\xc6Y\x9a\xf5\x82\xf0\xbf@\x8e\xf3\x98\xefi\xc8jk\xa1\x8e%\xd2\x1d\xb2Q\x02\xaezJ\xf7\xf1\x18\xc3=\x8cS\x16\xa7>\x94zS\x8am\x13\xd9\rK=eJc\xaa[\xcb\xc1\xc1MXN$h\xf5\x8d||\x7f\x0c\xe5$\xa6\xf0S\xa0\rm\xef\xc8\r\x93r\xcc-cQ\xfaF!~\xe3\x8d\xf6\xcb\xba9\x8c~\xe3\x1f\x8dPt\t\xb5\xb2`\xe8\x1d\xd3\x93 Mf\xb8\x0f\xdc]\xd2\x9f\xf7\xbfl\x90\x18\xa8\x80\xbe\xe9 :2\rq\xfbO\xefH\xb6\xb5a\xe0\xa0\x93s\xcd%\x8f\xae\x19\xeeYP\x84\xcaPo\x13i\xec\xaac\xa78\x04\xa0eDL\xe0\xee\x13\x95r\x9b\x9b\x84\xc9\x07\xfb\x8b/\x8a\xa7\xe8\x8e\xacT?5\xc6E\xd7^9\xe2$\xb7\x7f\x06\xe9\x14tY\xd3n\xca\x96D\xbb\xfb\xf9\xc9"\xd4+\xd9-\xcd\xe9\x03d\x94\xb1\x02\x91\x05\xeb\xc4&?\x89\xf2\xb8\x94\xca\xeb\xa6/)(n1f4\xed\x96\x08\xa1\x1cw\xb4\xf8\xa0^\xbam\xdb\xd7=s\xa7\xb3\xf9\xe5\xb6\xb6?W_\x9f\xb5\xf2?*\x9a\xca\xa84\xe9\xd7\xba \xc7\x89\xac6\xf0$\xee\x81\xe4\xfez\xdb\xdb.\x8d\xe0\xd0\x07s~_\xe9\xd6\xdf\xef\xed@\x0b0\x08\n\xb1\x08\xd8\xbdl\rw\x8e\xc1( \xc3\xb4=I\xa4\x92\x19\xbc\xa0j5\xa1\xb1\xb2\xbdg\xea\xbf\xce\xed\xad\xbc\x81\xec``\x9e\xb8\x12UZ4|\xb1\x8csS,s\x05\xcd\xe6\x93Z\x81\xa9J7\xdc\xd5f\x08\xcc\x99\xd8\x07\x1f5w~\x1c\x9fH\xfe%\xa1M\xf4:8\xf4"w\xbbX\x0c\xa48w\x8e\xc99\x1d\xd4\xae\x8f\x89\xa2\x7f\xe1E\xea\xb4l!\x9aC\xf4\xb9\x83\x9a\xa4\xae\xd0Y\xeb\x11KoZ\xfc\x14\x87\xe8\xaa\x9c\xf7\xd7S\xf9\xacc\x97\x86\xc2\xc4\x89\x16\xf8\xc3\xc0m*\x16"\xbe\xc7^/m\x01\x8a@\xef\xbe\xa4\xdc4\x8e7\x17\x17p\xdc\xf2\x1f\xc4\xa6\xed\xeb\xf2\xd4<\xb6\x0c\xe6\xac\xd5\xach\x16X\x8fo&\x9b\x1f\xcd\x8f\x8a\x18\x9c\x9aH\xab>\xd5N"@\xf7\x9fem\xb37\xbd\xaf\xca\xbb\x9e\xcb\xef\x97\xaf\x9a\xa6M\xf6\x03J\xc5#\xc3#\x05\x8c\xf7\xad\xe2L\xdb\x14[\x82\x1af#E_\xad\xff\xe9=\x0f\xbd\x03#PU\xc0\xddE\x19R4AD\xbdBZ\xc9\x13-\xf0\x03\xb6\xe9\xf3\xb3\xab-?\xa9\x19k\xc0\xaf\xef[\x95N\x07\xf2:\x8e\x1e\xca\xc7!*\xf1\xc3\xcd\xe9\xc2\xc1\x9a\xb9\xdb\x9b\x00=\x98\x94\xb9]\xad\xaf\xef>\xba\xb4\xbe\xf2<\xe1\x9c\x81\x18\xb8\xb8\xa5\x00,\xa0\xae\xec\xa5\xd0\x8d\xfa\xbe\xad#\xc4\xaf9\xfd\x11\xbf\xe2C\x9a\xd8\x0b\xf8\x7fiL\x8d7|r=\xfe\x9c\xce\xe1U\xa5\x1a\x07\x13j\xbbU\xb5"=X\xa9\xca&\xe8\x06\xee\x85\xc5\xc7\xcd\xceA\xb1+U\xf1i\xd39A\x89l\xaa\xad\xc01\x86\xaf\x94E\x05\x050Nq\xbc\x87\xd9\x82\xbb\xc9S\xdb\xa1\x82\xb6\xf7\xd2\xadY\xf0\xdcZ\xd4ro\xd5c\x027\x9b\xb1\xfaw\xa5o\xd3\xc4\xc3\xa09\x85\xd6\xb6;/\x88j)O\x00}\xee\xf57\x1aFDr\xb2a.\x0f\xfc\xcb\xa7\xa6?~\xf1\x18F\xe0\xb0\x1c^\xa5\xe0\xf8su\xe5\xfb\x12\x16b\x86\xf9\x0e\xf6\'\x8b\x8b\xfe\xb1\t\xaf\xb4b\xe5\xe6.\xf7\x9b\xb6|\x11\xf6\xf0f\x83\xe5y\xe9/<\xe4f6Y\xfa\xc4\x0c\xd4!+\xe7e\xcc\xa5M\xe4\xbc\xc4\x8f\xd4\xaf\xd8\xc9@\x84\xb6\xcb\xe2\xf3\xdd\xa4\xe3\xa4\xb1\xce\x12\xd5p>\x87^\xdd\xf1\xac\xe6\x02R\xb5&-\xe1\xd7l\xc0\x10\xdc\x13\x98\xdd\x88\xc15\xbf\xe8\xd2\x06\xfcc\x8e\xc7\xceLR\x9d\xad\x95\x04\x83\x10\xe03\xfc\x81F\xe8\xb9D\x89LgH\x16Rs\x06\x85/\x1d\x00\xb5l\x1b(\x9a\n\xdaH.\xeb\xc6\xd9\x91t#\x1aa\xfd\xc9\xa6\x8a\xa06\xbc\xc2z\xcb\x13@\x9b\xaa;b\xe0\xa5:\xc8\xc4\x9e\x17K\xdca\xfd\x0b2\xfbF1\xa8FgX5E9\xde\xa7\xaf\xe8\x91\xb5o\xba\x12\xaf[\t!9\xb9\xab#[\nQ<u\xfeO\xc3Y\xf9\x03\xc6\xbf^\x14\x02\x0eW\x04y<\xb0\'35\xfcE\xd0\x8b\xe3\x0e8\x88\xd1\xb3\xc3\xa0`\xd3\xb0U\\\xbfi\xde\x1a\xaa\xa2\xa6\\\xe4\x0b\x06\xec\x98\x82\xabF\xb1\x19\x8d\x8fE\t\xb7\xa90b\x15\xeeV\xa9\xb4q\xb5\xb8j\xe9\xa94\x0f\xce\xb1\x10\xc4\x1c\xcd\xdc\x96H\xe4\xa8\xcd\xecR\xc9\xaf\xa1\xb7\xc4\xaa\xaa\x01\x91\x83.\xdbW')
|
1
|
+
from flask_babelex import gettext as _
|
2
|
+
|
3
|
+
from . import bot
|
4
|
+
from hiddifypanel.panel.user.user import get_common_data
|
5
|
+
from hiddifypanel.models import User
|
6
|
+
|
7
|
+
|
8
|
+
def prepare_me_info(user):
|
9
|
+
"""
|
10
|
+
Prepare response to the "me" command
|
11
|
+
@param user: User instance
|
12
|
+
@return: A text message
|
13
|
+
"""
|
14
|
+
|
15
|
+
response = _("Dear {}\n\n".format(user.name if user.name is not None else "user") +
|
16
|
+
"Your hiddify information is\n" +
|
17
|
+
"UUID: {}\n".format(user.uuid) +
|
18
|
+
"Last online date: {}\n".format(user.last_online) +
|
19
|
+
"Expire time: {}\n".format(user.expiry_time) +
|
20
|
+
"Usage class: {}\n".format(user.mode)
|
21
|
+
)
|
22
|
+
|
23
|
+
return response
|
24
|
+
|
25
|
+
|
26
|
+
def prepare_help_message():
|
27
|
+
"""
|
28
|
+
Prepare response to the "help" command
|
29
|
+
@return: A text message
|
30
|
+
"""
|
31
|
+
|
32
|
+
# command description used in the "help" command
|
33
|
+
commands = {
|
34
|
+
'hello': 'Get started with the the bot',
|
35
|
+
'help': 'Gives you information about the available commands',
|
36
|
+
'info': 'Return information about your usage',
|
37
|
+
'me': 'Return information about your account'
|
38
|
+
}
|
39
|
+
|
40
|
+
# generate help text out of the commands dictionary defined at the top
|
41
|
+
response = "The following commands are available: \n"
|
42
|
+
for key in commands:
|
43
|
+
response += "/" + key + ": "
|
44
|
+
response += commands[key] + "\n"
|
45
|
+
|
46
|
+
return response
|
47
|
+
|
48
|
+
|
49
|
+
def prepare_hello_message():
|
50
|
+
"""
|
51
|
+
Prepare response to the "hello" command
|
52
|
+
@return: A text message
|
53
|
+
"""
|
54
|
+
|
55
|
+
response = _("Hooray \U0001F389 \U0001F389 \U0001F389 \n"
|
56
|
+
"Welcome to hiddifybot.\n"
|
57
|
+
"Start by clicking the link on the panel or entering your UUID.")
|
58
|
+
|
59
|
+
return response
|
60
|
+
|
61
|
+
|
62
|
+
@bot.message_handler(commands=['me'])
|
63
|
+
def command_me(message):
|
64
|
+
"""
|
65
|
+
TelegramBot command "me"
|
66
|
+
@param message:
|
67
|
+
"""
|
68
|
+
|
69
|
+
text = message.text
|
70
|
+
user_uuid = text.split()[1] if len(text.split()) > 1 else None
|
71
|
+
if user_uuid:
|
72
|
+
user = User.query.filter(User.uuid == f'{user_uuid}').first()
|
73
|
+
|
74
|
+
bot.reply_to(message, prepare_me_info(user))
|
75
|
+
else:
|
76
|
+
bot.reply_to(message, "Please enter user_uuid")
|
77
|
+
|
78
|
+
|
79
|
+
@bot.message_handler(commands=['help'])
|
80
|
+
def command_help(message):
|
81
|
+
"""
|
82
|
+
TelegramBot command "help"
|
83
|
+
@param message:
|
84
|
+
"""
|
85
|
+
|
86
|
+
bot.reply_to(message, prepare_help_message())
|
87
|
+
|
88
|
+
|
89
|
+
@bot.message_handler(commands=['hello'])
|
90
|
+
def command_hello(message):
|
91
|
+
"""
|
92
|
+
TelegramBot command "hello"
|
93
|
+
@param message:
|
94
|
+
"""
|
95
|
+
|
96
|
+
bot.reply_to(message, prepare_hello_message())
|
97
|
+
|
98
|
+
|
99
|
+
@bot.message_handler(commands=['info'])
|
100
|
+
def command_info(message):
|
101
|
+
"""
|
102
|
+
TelegramBot command "info"
|
103
|
+
@param message:
|
104
|
+
"""
|
105
|
+
print(message)
|
106
|
+
text = message.text
|
107
|
+
user_uuid = text.split()[1] if len(text.split()) > 1 else None
|
108
|
+
print(user_uuid, text)
|
109
|
+
if user_uuid:
|
110
|
+
user = User.query.filter(User.uuid == f'{user_uuid}').first()
|
111
|
+
information = get_common_data(user_uuid, 'multi')
|
112
|
+
|
113
|
+
bot.reply_to(message,
|
114
|
+
_("Your hiddify instance information \n" +
|
115
|
+
"Domain: {} \n".format(information['domain']) +
|
116
|
+
"Usage limit: {} GB\n".format(user.usage_limit_GB) +
|
117
|
+
"Current usage: {} GB\n".format(user.current_usage_GB) +
|
118
|
+
"Expires at: {} \n".format(information['expire_s']) +
|
119
|
+
"Remaining days: {} \n".format(information['expire_days']) +
|
120
|
+
"\n\n Happy using \U0001F389 \U0001F389 \U0001F389 \n"
|
121
|
+
))
|
122
|
+
else:
|
123
|
+
bot.reply_to(message, "Please enter user_uuid")
|
4
124
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
125
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/common.py
CHANGED
@@ -1,5 +1,100 @@
|
|
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\x005\x11\x00\x00\x12\t\x04\x00\x9f}\x1e\xbb\xba\x04\xca\xf3\xcbX\x86e\xd3,S>\x00\x00\x00\x00\x00\x00\x00\x00#\xb8\x8b\xd3\xc0W\xb3\x02 g\xbd\x84\x1e\x91\x9a\xe9-EO\xb0~\x1ef\xeaq\x0b\xc4\xb5\xc9[z5\xb8\x94\x87\x16\x1f-\xf5%\xbb\xb2\'\xf4\x9ey%\xa8\xe7\xb3\xaenl2\x88E\xd2\x94\x19\x0e\x08CP\xd5 l\xdeKZ\xf7\xfaM\xad\x19\xb3\xd62\x99\xfb\xcfp\xd22\xc4\xbb_^"\xc1\xbd\xc0\x87\xee\x9d\xd5\x99\xac\xf1y\xe40\xfc\x9d\xb8\x14\x89H\x98\x8c\xa7a\xe3J\x8a~H\x84\x16\x80\x975c\xe6\r\x9c\x9e\xfe=\x91R8dx \xf6\xcb\xa9\xa3\x16K\xfa\xa7\x14>e\xb8,\x86:\xccx\x99\xdc\xf9\xdbm\x16\xc1D\xa63\xff3\xdb\xa2\x8cb\x8a\x07\xe9w\xf2\xa2]\xe3\xb5F\x95+:\x99\xfa\x05\xb2}\xbaR\x07\x99\x97\x13\x9c\xd2\xd8`\x18yt\xde_\xef0\x02\xe1\x7f\xff\xdbe\x9cM\xceM\x00\x95:p\xa1\x16\x1f\xb2\xd3xCB2c\xd9;\xaa\x8e[l\xca\x8c\xbeL6\x8c7\xe8\xde\x84\x87\x1ch\xad\x99\x9dQW\n\xd6\xb5~\xf7\xf0t\xbc\x82\xb9\xf7&\xfe\x10\x95/\x17\x93\x11G\xa1v\x91\x9d\xb3\xedC^\xffrjO\x1du\x19M;\xb4\x1a&@YI\xb3\x92\xc8z\x83\xc0\xf7\xe4\x16\xd4\x85\xc76P\xf0*\x02\xeeK\x16\xc9\xddG\xdb\xa0C/\x0b\xd7\xa4%\xefj\xeb\x88\xf1\xb2\xecx\xb2\xc3\x18\xbd\xd3\xb5:@\xf9\xc0\x99\xa2\xf9\x82\x92\x8a\x95\xbb?\x9b\x95v\x19\xd5=\xc3\t\xae9m\x846\\\xa7\x8bs\xfd\x85\x16\xadf\xd2\xce&X\xbaU\xd3\x06\xb0n\x10\xf6\x0b\x16#\xea\x19,\xa8@\xff\x18Ma\xb0<\xf9\xc2\xb66\xe7\xac\xb1=\xab\xfd\xd8K\x1a\x90\xc24\x98Vn\x9d\xe4\x9e\x1e,k\xd1|\x02\xd5\xf9D?\xe3\t\x90\xc3\xfa\xb2+d\x0e\xa0\x9dQ\xe1\xaf\xa2|\xb9n\xfe\x0e(\x95\xfc*\xcc<fx\xf5|I\xb4\xabO\x1f\xbcM\x0c\x90\xc4d1\xac_(\xc8\xe7\x08\x8a\xe7W\xc4\xc0\x1e\x19j\x1a\xbd1*q\xdf\x97\xca\x96\xce\xbeUN\xa0\xe1\xb2o{\xd4\xc9\xfb\xbc\xe8\x1c\xac\xed\xcc\x7fX\xe6p\x94r4W\x8c\xbe*M\x17\xdaN\x165a\xaal\xdd\xea:b\xbaz\xca\xa0So\x8a@\xb8\xc5Qxj\xc3\xff$\xb2\xe6\xbc\x87\x91\xa4xS\xdd\xedMNR\xc4\xbf\xabq\x88\xec\xae/\xaeO>lmh!\xfc\xdd\x95u\xce\xcb\xec~FOB\xf6\x08\xcayj\xf4\xc8\r[\xfb\xff[\xedAS\xf0\xe2 :c(\xcb\x98\x14\x18D-\'\x0e\xb27\x9eh8y\xdd\x91\xc3\x07\x1c\x95\xbf\x8f\xc0\x18\xda\xe05:\xd1\xb5\x1c\xd7\xde\xcc\xde\x0cL\x7f\xb4\xddC\xc8\xf5\x97C\xbb{<\xbc9&\x8b\xbe\xe8U\x1a\xa4X\xb9\x83\xc1z\x8dOT\xbd\xad\xfb\xfd\x01xy\x14\x82\x97_\xe0\xc2\x93g\xd2\xea_}\xc0\xaexT\x8eQIA\x95\xb6\x90\xc0\xa9\xda\x99\xd6\x17J\x97J\x81\xb6\xdc\x9c\x9d1L?\x05a.\xee\xd3C{-\xaa\x05\xb3\x1b\x06\xbe\xec\xd5J\x1c\xdb\xbd}__\x94b|g\x17U\xe1,\xd9\xae\xdb\x1f\xbb\x14lL\xe2)|\x98`\xaa_3.\x98\x98\xf7\xf3\x8aj\x02N\x959\x90b\x8f\xf9t\xda\\\x1dh8\x8cB\x85\x9e[\x8b\x94Z\x0b\xfc}\xed\x84\xb5\x85\x11h\x9cP\'|\xb9\xf6\xc7x\xa6\x0c\xc1\x01\xc5eFT\xd9\xf3\x92\xb9\xe5O\xe4R\xe5\x96\xfd\x83)\xc8\xad\xe7>\xec\x82\x08\x85\xf2\xfb\xc0%\x04\xe8\xe6h>\xd0\xea\x119\xe4\xe5\xfc\xd8\xb1\x00\x11\xf1\x92\x1a\xef\x93s\xfe\x04\xc3\n\xf9\xa2\xf6\x9c\xbfX\x9b\xde/qk(\x96\x8f\x9c\xe2\xf8mS\x86K.\xfd\xc0f\xbb\xbb\xde\x99\x06|\xc5}O%\x81\xfe1\x866\x9e\x13<h\x89\xe2\xe5\xcf\xe3\'\xee[H\xf7E\\+\x01I\rg{\x86\xbe;:\x18\xc0\xf5\x84F\xf1_\xa7\xc6\x9b\x8a\xc6\xc5\xdb\xe1\xffJ\xee<\xcd\x9b\xc8\xc8\xd5\xde\x08\xc0z\xe6\x06\xec\xdf\xcfk\xe1]=\xc3\xd3B\xb3\x05i_\x11\xa3^\'s\xee\xfc\x1f\x0eM\x16\x99\x98Z,\xb5p\xb4*,T\x08\xed\xabRR\r\x83/g\xdb\xe6\xf8\xe2>\xc6\xd63\xf9\x1ay\xe3\xbb\xb7\xca\xf0\xe7\x16\x8e\x8f\xeb\x9cH\xc4f\xe2M\xd3\x96\x9f\x11E\x06\x0fr\xf1\xd1wu\xef\x82\xf4\x06[]\xea\xe0\xcb\x04R\xd5{\n\x130i\xd0\xd0\xcc\xd5UO\xdc(kK\x92\x82%\x914\xd2\xf2!\xd3~\xc8*\xfbC\xfc1\x1f4\x11q\x99\xbe\x83>-\x06\xff\xdf^\x8e@4E\x89l\xfd\xee\x90N\xf5\x92\xbdolF\x9a0\x0f\xc7M\xe8\x80+C\x0b+\xb0\xe6U\xa7^\x9aRKw\\A\xd7\xe8\xc2F\n[\xb7\xf43\xfd)-\x9aY~\xd2\x92\xf1/\xec\xd5\xfe\xe7\x84\x00\xe4\xc7&P\x17\xed{\x82\xc2\x03q.\t\xe5b\xd9\xa9c\xfc@3\xc0e\xf8\xd3\xd4:TO37\xd5d\x83\x82\x07R$\xfb\xa4\x92\xcbC\xcf\x01n\x10\xad\xa5\x8d\xaf]\xd4\xe2\xaf\x8d\x14z\xe9\xbd\xa2\x9e\xbe\x97L\xb0\xb4\x13xz/\xd5\x15\xe5V\x15\x9a\xaf\x0e\'X\xe0f\xef\xf5?\x1d\xbb\x8a\xc4\xf6\x12\xc8\x12\xffk\xdc\xe4\x9b\xa3\xe4\xb6_\xae\xba\xbc;\xe8%\xb3ux)\x0f\xdc\x05\xfb\xab\x00q\xa4\xcb\x16\xa0\xa2\xe8+lO]\xc2\xe2\'\x87\xe9\xc1f\r\xfd7{_\xb6(a\xe3\x18\x07\xe2\xdc\xfdd\xb5\xec\'\xb1RQ\x88\xfe\xc8\xb0\xde\xb8\xae\xffh>4\x16\xb62@x\xe3\x1ft\x9cB\xaed\x07H\xfd?\x80\xa2\xc2\xc4\x07\xaa\xeb\xc8i\x192\x91\xa1\xb1u\x1c\x86\x1f\xe6\x15@\x926\xbe>:d\xf4\x90K\x18\x0b\xe2y\x08\xdby\xf7\x03\xa9H\t\xe7\xa89\xbc\'\x86\x1diT\x88\x13\x9e\x05\x95\xde\x96\x90\x8cjt\xb8B\xee\x1b+\xc3\xa0\xf2\xf4E\x93W\x7f\xb4\xc6\x10\xb5\x03\xb2\x96\xc0V\x90=6#\x96\x939\xcaDV<\x8c\x7f\x91i\xb9\x8a\xc3\xc6\x15\xb5\x1b\x9b\x92\x10\x83h\xd7\x83p\x8f\xc1\x013#\x16\xa7Z\xe1\x1c\xa2H\xe1sb\x0f\xd01\x9an\x14y\xd5*O\xf1\x8e<\x12u\x8fps\xf6\xa0x\nv\xecX\xa6\xc1\xb2\xf3\x88\xc4\xbe\xffXd<*x\xba\x1bN\xe5\xd0{\x03\xd5\xb5n\x1f\xffev\xceP\xd6\xe5\x00\xdd@\x9e\xf7\xcd\x0fg5G\x8e\x1e\xad:\xf42:F\xf2E\x05\xe4\r\x19\xb4\xb1\x0f\x07S\xb2/h\xce\xc6(\x07\xb5\xee\x08\x1e7}E\x00M\xd1Y\xeeV\x92\xd8\xfe\x1e\x88%\x9a\xb9\xc7\x9c\x13p\xfeKr\x8aTH\xca\xfd[.O\xb1\xb8\xb5N\xe8\x89\x08\x19B"^\x8b\x1b%\xae0\xa1\xb5,\xd71\x7fp\xa8\x8a{.j\xb7\x0bZsYg\x1f\x81\xd8\x01[\xb2\xc0\xb02\x86\xa7\xaf\xedE\\\x7fO\xebY\x7fs\xc3\xc9H\xc3\xce\xde(%\x92\xcd8\xb4\x8b;\x0f/\xa9\t%h\x98fd\xfb\xd0\xa8>\xe4f`h\x9bl\x9f\x0c\xfc\x08\xf0kd\xacY\x89\xc1\xb1V<\xce\xef\xa8\x032\xeb}<\x01\x87Bwh\xa7\xff\xc1\xd2\x1fmv\xef\x7f\xd5\x90\xc9I\xa3\x86\x04\xac*\x94q\xa8N)\xb4\xa7|\n\x97\xc5I\x8b\xb3\x809%\x85\x0ff\xf3!C\x1f\x02FW\xa9\xb9\x8e\x85\x9a\'S\x95\xf3\xfc\x04\x8c=\xa2\x82A\xed\xcaAl\xfd\xdbR\xdbK\x1b\xbd\x17X\xb4\t\xc5=\xde\xad\n\x1b\xd8\xfb\xb4)\xca\x9b\xf85\xb7\xb8\xcf\xa1 \x92\xa26g\xb3\\\xc0\xfd\xce\xbb\xed\xa5\xd5|d\x85\x13\x1bB]\xf5\x8f\t\x9c\xc4\xae\x8f\xc9&v\xe3\xf8\xa9{\x9c\xe06\xdfp8\x1b\xe1 ;\xce\xca<\x1f\xef,\x17=\xcd6w\xa7\xc0\xfd\x16O\x97\x86b\xdf\xe4a\xe2m\xe8<3\xfd\xc8h\x86\xb0G\xd3\x95\r\xc7O\x80\xb6N\xf2\xb7\xd6\x94N2\xcb\xf8b_\x03\xfc\xd3\xc5<\xa3\x9bW\xe3\xbdw9w(.\xd98I\xba\xbc@2\xabP\x11!Z\tZ\xacb\xd1\xe8?\xdeV$\xd3D\xfeZ\xd0;R\xc8jH\xda\xe3\xb0\xd8\x19=\x12J\xa2PI\xebr\x04\xe6\x1f\xa9;\x85\xd0\xa9\xe3D\x85\xb3\x9d\xc9T\x84\x13 \xb8\x0b)Ub\xea\xa1\xc3Bf1\x9b\x07T\xb8\xdfl\xf9\xa9\xdb\x12i)\xfe\xf4\x1e"}\xe7<\xb7F;]\x8b8y@,\xf6\x1ag\x03Q\x82\xce+\x84\xe1\x149p\x9b\x08i\xca. \xbe\xc6\x042;\xd2\xcfD0a+L\xf0\x1aX\xb9^u\xb7\xab\xd4At)d7\xe3*\xaf\xacv\xbd*\xa5\x1aQ-\xbd\x03\x98\xf2\x0b\x96\xd2\xa2@+:\x7f\xa8_\xe1\x8f%\xe0=\x18\xa5*pKSF\xd5\x8d\xf9\x15\xe5\xe2\x84/\xcd\x96\x10\xcc\x1e\xcc\xd6\xe0;\x95\xb5"\xb9\xf9\xc8\xb1\xef\x04\xc1[F\xf0\xe2\xa9R\x84\x8b\xb9\xa0\xddH\x8f\n\x1c\x86]g|X\x06\x8a\xfe%\x98:\xf9B\xfe\xc1\xe4i\xc9BO\x82\xa5\x9f\x81?\xac\xbd\xbb\x07\xaa\x92\x81\xd77e\'Iz(\xc4\x98\x81Ai\xcaY\x1e\x80\xc1\xa8\xf9>\x016\x1ap\x11C\xd18g\xf87\xd4>=lsl\xde\xd9\xae\xb4\xb2J\xe7\x05\xefd\'g$\x80X\xbf"\xd48\xb8\xce\xbc@y\xe8S\x8c\x98\xf6Z\x00\xc3]\x05\xcc;\x17_\xc1\xa9\xcfQ\xb3,K\xce]A\xfb\x1b\xc5u\x85\xb1\xf3\x03\xfa\xe5\xbc\xc8o\x04|\xf4K\x7f\xd6\xe8,4d4\xf5\x14\xf7Q!6\x8c\\\t&l\xd2\x0c{\xce\x94l\xcec\xd5\x81\x04\x05\x13\x1f\xceY\xbe\xbe\x04z\x0fj\x98\xea\x90\xe7M\xf0\x7f\xac,\xde\xa9%\n\x9a\xfe1\xa5\xbc\xf4\xe11\xa0\x05.w\x1b\x968&\x1b\xd6\xcb\t\x9f\x1d|\xd4\x0cAj\xf1\xce\xfd\r=\x9b\x97\xa7\x1e\xd9\xa2\xc4s\xdc\x18\xc9`K\xe0\xa6\xd2\x03\xc7\x04\x19pbvG\xda\xa7`\x96Q\x0ei\x16h[\x86o\x87\xaf)\x90\xf2\xb92\xf3\xd6\xb8\xb2\xd3%\xc3H\xdb\xd3)\x98\x06\x0caG[\x05\xb8\xb3\xa0\x15\xccW\xe2\xb3\x11\xe2\x8fU\x85\xc5\xa5\x04\xc1K\x06^\xd29\x9d\xa5r\xe2\xff\x15\x87\xf3\x07\x0et\x7f\xc9\xc0\x1c9\xef\x17\xff1\x15\xb7\xc2n\xf5M\x94V\x84\xe7\x83\xc8\xee\xd6\x08\xff\xe1]\xb7M\xe5\xe8bP\x80T\xf5\xd0\x01p\xdc\x0eu]\xf6\xa1J\x1d\x8a\x85\x98\xe8y\\\xd8:\xfb\x17\xc9\xdf\x8a\x06\xac\xe1b1\xdf\xea~\x9c~(\xe4\x84\xeaN\x88X\xdd\r\xca(6\xa1\x92\xa1,\x9c\x19*;\x1d\xa9\xe0m\xb3K\x85hA\x98u\xc4\x96>\xfa\xac\x97\xc1^\x84\xb7\x01]D0\xfc\xd2\x0f \xa7\xa3FK\xfbp\xed7\x07\x8e\xf9\xef~\xf3\xd6_\xc8\xf0H3\xbe\xb9\xeb\x9c,A"A(\xfc\xc0_\n\xab\x90\xc3\xa5\xfe\xb0\xa1E\x95u\x03|\xc3\xd7v\xe1A_\r\x80\xfeR\xae\x0e\xfb\x1enyf\xd0\x9a\xa9\x91\xda|\xfcz\xc9+\x84\xb8<\xc2U\x8e\xed\x90\xdf\xb8\x83\xe5\x9e\x083\n,\x1b<\xef\xbe\x19=@\xcf\xd8\xba\x0e~\xd2\xd9\x18\xb4rO\x9e6A\xf6EDJ\x82\xee\x89k\xfbo^\x0e\xee\x8fb\x0c\x1c\x8a_\xa7j\xbfYs\x08\x86W\xafQCT\xc3\x81k\xc7e\xbf\x16\xe9U.\xf6\xe6\xec\x9e\xed\xc4\xe7B!*\xec\'\xf3\xa2\xfb\xedK!\xe4\x9c\xd5\xf6\xe3\xe4z\x87\xe4L:\xb7[\x99k\xadCe?@`\xd4+O\xbe\xa3(\x9b\xc0T\x97\x0fk6\xc8/\xc4\xbc\x87\xcb\xaa\xe8H\x19\x9b\t\xf5\xb9\x15\xe4z\xbd\x08\xb5\xf1\x14\xbd\xd3\xc0:7\x9cKX\x88\xc8\x10R7W\x87b\xc37\x96\xc6\xb7mV%\xea\xeb:\x8cD\x1fg\xa9#\x9ezC\x03\x82\xfb\xf0\xda4.\xe1\xdfL\xa5ob\x1c\x08\x15\x9e\xf4zJ\xb9e\x15\x18\xc4\xeb\xa1\x928@p\x96\xf0\x1b\xf0\xf4v\xd7\xab\x18E5\xd0\xf9\xa1\x1a.K\xa1\x08#\xd4`~\xfb\x88\xa0\xfb\xb8_Z\x93\xdb\xa6\xf3\xe2C\xe7\x89\xe9~\xf9\xc9\xe1{\xe2\xd4\xda\x1c\xbd\xa0\n>L\xeb\xcc\xaf\xb7\x07\xafhz\xe5j\xfe\xce\x8a\x9c\xc9PqSp\xa1:\xae\x03j\xc5\xdfw\x86\xba\xd4\xda\x13;ss\x88\xcbp\xebS\x92U\x15\x8d\xb0I\xe7\x9a\x97\xe8\xfe\xdfO%p\x0c\xbfe\xc4\xaf\x1c\xd2\xf7\x14\x9e .\xfb\xe0\'\xa12%P\xec\xff\x03\x13\xe0"5\xd7\xd6\x17\xd7`CP\xa4\'\x9c\x13\x93\xff\x17 .\xaa\xcb\x00w}\n\xb53T\x8eU\xfe\xc4\x86\x8c\xc8\x99-\xe9\xe4(E\x9e\xa4\x19\x93x{\x07\x12\xdf\xbd\x08\xac\xd1j/!\xef\x1f\xff\x0f\xa7\xd3\x96\xf6\xbd\xd6\xff\xbb\xb4\xd8\xe1\xdf3\xc35\xbd\xbe\x1adm\xa5Tl\x0f\xa7bp\xfe\xe0\x1cp\x0c_\x06G\xac\n\x96\xa6\x92lK\r\x9b\xc2\n\x1c\xc4p\xc1\xeb@\x96\xbb\xfe*\xffyQ\xa96u\xe2\xd5)\xf1\xb6\x15\xd7\xf5\xdd\xce\xb9\x8b\xf0\xd5J\x98\xb1&JFV\x92h\x8c\xb8\x94qe\x87\xab8Q\x89\x00\xe3\xb5\xab\xda\x91\x82\xe4\xf4-z\x8d\xab\xc9\x10\x93\x99\xb2\x97r/"\xb3\xb4dx\xac\x86\xc3;.\xdcP\xb1\xacr\xe8\x9b\x17\x9b\r \x1e\x0f{\x12U8\xd7fT\xe1\xf8\xceq\x04~>\xfb\xf1\xb5\'\xd1K\xdcUO+L\x1ac\xbdo\x02\x10\xa4\xc0"\x14sN\xff\xb3\xfb\xc6x9\xb9\x80e\xa5\x07B\xfe\xbf\x16\t\xfe2Ti\x96\x1d28\xa23\x12\n0\x00c6)\xc0\xf5\xa9TC\xb9\xa7\x8c\t\xfb\xdf\xd9\x9f.\x08\x08\x04\xbat\'\x9bj\x8cJ\xfa\xc8\xcc\xc7\xeeHi\xed\xf8\xf4\x10\xd7NU\x01\xe8\xee\x8e-\xe4\x14\xf6\xf9-\x88\x9c\xd3:9\xf21\xc8$\x93\xb1\\\xc8\x1c\xc1\x01\xbe\xe1m\x0b\\\x83$\xe7w\x9d8a\xea\xf3C\\\xf7\xc2:\x08\xec\xab\x19\xa9\x16\xe9\xadU\x9c\x18D\x07\xec\xd5\x9dD\xa9\xbb\xfdz\xb1\x0f2\xa7\x96\xbb\xc6d\xf1\x99\x1e\xbe\xb9\xf0k:\x80\x15\xaa\xb7Y\x8e\xdaF\xe3\xb4\xc8\xa0\x93\xa9\xa5\xc7\xcd\x8d\xc2\xc8S\xd9~4\xcc|\x00D]_\x9b\x1f\xef\x0e\xec\xf6Gw\x9e\xff\x93|k\'\xaa\xf6-\xc7\x0c\xaef\xcf<\xcc\x88\x9b\x1aq3\x14\x9f\xcai\x90\x80\xc3\xea3b\x9bh6&\tHh\xd2\x92\xf6\x1d\x9ed\x08\xf9G\xa0\xca\x94~\x97\xd1\xd5\xed`H\xb6\x81\x8c\x99qWR@\xa6\xc3\x81?y\x19\xfe\xa5c\xa7Ndb0q\x85di\xee\\q\xa9p\xfdzrd\x1e\xbc#\x8e\\?\x1b\x18\xa5I\x0f9\x81\xe0q2 \xf6\x8f\xdd\x8b\x9d\xc2X\xf8j@\xb4k\xa0\xcd\x04\xf81\xa7\x98p\x90\xa1\xd2m\xd6\xf7\xa5v\xdck\xe6.GQ\x84\xfe5\x1a\xf7\xc3\xe9C\xa6\x86\xdc\xa8\x87\xfc\xd1\xd5faVAWU\xc3\x94\xb5\x89\x88\xd02\xe7\x86W\xa0\x92\xceT#\n\xaf\xd5j\xaa\xbd\xc8\xe7ky\xb0\x0f\x14\x8e\xe0`\xae\\\xb7\x18\x12\xa8.\xbc\xf80\x81\x8d\x97\x08\xec\xff*\x1f\x1a9{v\x0b\xe1\xf0Ua1\'\xd4\xdc\x03\xb2\x0f]Sp\t\xc5f\xb0\xd8\x08\t\x0cN\xac\xcbf\xb8u\xe2\xed\xb8\x9f\x11\xfc\xcax\xfb\x0e@x\xddSav\xc5ia|\x07@\xc8\xf9\x06MY\x18\x8c\xf9\xacO\xc5\xc8\x15R\x1b\x87\xa4vD\xdd\x96\xba\x93\xb2$\xd2\n\x10s\xd4\xdf\xa6q7\xff>\xb0,\x9ei\x11S"\xb6-\xa0\x81\xf2*\xcc\xad\xd9\xf8/\'\xbd\x14\xb3\x07D[z\x1a\xb54\xb6\xdf\x1fh\x8b\x1aD\xa1\x14\x1cD\xb2\xbem\xf0;\x88\'BD\xe6\x0b\x05\x94\nG\xb4\x96\xd8\x96\x9e\xae\r}\xc5\x18\xca,\xe3r^\xed\xf8">\xfbG\xb3\xce#K\x0e6\x96\xca\xad\xc9\x0b\xb8#\xad\xe6\xa9\x1a\xac\x8aA\xe3\xabi\xf2\x80\xd2\xb9B\xcb\xb8=\x10\x89\xe6\'\xea\xef\x1d\x0e,A\x84\xab\x9a|\xd5m\x01.\xd2\xf6\xdfCk8\xf2\x9bT\t\x96\x1cp\xca\x00b\xa2\xc9[\xdc\xc9\x1dC+\x01\xb3\x81\xea\x9cV\x02d\xac!\x01\x01\x0cZ\x95\xb2\xec9\x85P\x14lO`N\x08\xcdh5\xecq\x80\xf5\xf8\xd5i\xd3,\n\xc7\xb4\x1f\xb9"\xb2\x8e\t\xa1\nG\x0f||\xb4\xd0\x87\xbf\xcf\xcc\x10\x85_!\xf7l\xde\xca\xa6\x15OZ\xed\x02\n\xbaR\x18E\xa6$\x8b!\x12\x899\xaa@<\x12x=\x9f\xa0\x93;\xc97\xee\xb9b\xdf\xbe\xe0>A\x00s\xda\x8b\xa6\xd6<rh~^>n\x89\xf1\xf3\xbf\x82\xceq\xfe\xe9x\xd7\xca0%"c\xe43\x88\xf6F\xbc\xcf\x0f\x84\x94\x8e4\x81\xa0\x06\xe7Ds3K\xc8<\xc6k\x0f\xae\x9dV\xafX\x9c)\xed\x1e\xaf\xb1M\x7f\x8awl\xd1i\xf4\x98\x99U\xf2\xe2}\x99\xf0\x01>}X\x98\xa5\x12vLU\x83D\xbb#V\xda\x9fI\xc9\xaa\x87_\xc6\x1e\t\xe2\x8bUE\x03\xd1J\xb2\xcd\xa6\xc2\xc3\x87piC\x8d\xc9\xd8C1N\x16a\xeb\xf4{\x99\xbf\xec5\x83t4\xaa\xbe\xb2{\t\xb3\x01\x03\xda\x1f\xd1\x0e\x96\xda6\xc2\x0eJ\x95n!\x1fK\xfc\xf1\x93\x9d\xb2\xa0\x98+4+\x0fm~\xba\xac\x1ct\x00}\xc5\xb1;\xc3\x92\xb8\x87n\xe5\x89\xd8\xbf\xe0\x01\x1b?_H\xa1I\x89\x89\x10\xe8\x84\x7f6G\x88\x1d)\xd1 \xb1\x8a\x17\x89"34R\x8e\x1f\xad\xd1\xfd7\xdf\xb6o\xe8\x9b\xc6\'\x18\xb2\xf6^K\xaf\xc0\xf6d\xdd^g\xcf\xde\xa9\x07\xf2m\x04cZ[\t\x94\xaf\x8b$\x95\x1d\x0fP\xb1;]\xc0#\xf95\xdc\x13\xa5^\x18wi1\x8a\xa9;\x0c\xe2\xaes\xbd\xbf\x1d2\xb0wR0X\xa8\xd1\xe8z\x98\xe2\xa2\xabWLr\x8au\x13Q\'K\xe7\xe9dj_a\xc9%/A\xcbJ6\x0eQ\xa2`\xe0\x86\xa6v\x7fNuN\x81\xc3\xd6\x95\x0e\x16\x1c\x04@\x97\xd1\xcb\xc4f\x15w\xc7`;W\xd6\x80\xa1\xe7\xfa\xb1\xb4H\xf4\xae\x80N\x1b3\x0e\x8e\xa7\xe9\x9a\x9d\xb0N\r\xcdo"\xba\xb9\x98\xcf\xa5=\x17_\xec\xf4(%2')
|
1
|
+
from flask import g, jsonify, abort, render_template, request, send_from_directory
|
2
|
+
from hiddifypanel.models import *
|
3
|
+
from hiddifypanel.panel import hiddify
|
4
|
+
import uuid
|
5
|
+
from flask import g, send_from_directory, url_for,session
|
6
|
+
import traceback
|
7
|
+
import user_agents
|
8
|
+
import hiddifypanel
|
9
|
+
|
10
|
+
def init_app(app):
|
11
|
+
app.jinja_env.globals['ConfigEnum'] = ConfigEnum
|
12
|
+
app.jinja_env.globals['DomainType'] = DomainType
|
13
|
+
app.jinja_env.globals['UserMode'] = UserMode
|
14
|
+
app.jinja_env.globals['hconfig'] = hconfig
|
15
|
+
|
16
|
+
@app.errorhandler(Exception)
|
17
|
+
def internal_server_error(e):
|
18
|
+
if not hasattr(e, 'code') or e.code == 500:
|
19
|
+
trace = traceback.format_exc()
|
20
|
+
import lastversion
|
21
|
+
last_version=lastversion.latest("hiddifypanel",at="pip")
|
22
|
+
|
23
|
+
has_update= "dev" not in hiddifypanel.__version__ and f'{last_version}' != hiddifypanel.__version__
|
24
|
+
return render_template('500.html', error=e, trace=trace,has_update=has_update,last_version=last_version), 500
|
25
|
+
# if e.code in [400,401,403]:
|
26
|
+
# return render_template('access-denied.html',error=e), e.code
|
27
|
+
|
28
|
+
return render_template('error.html', error=e), e.code
|
29
|
+
|
30
|
+
@app.url_defaults
|
31
|
+
def add_proxy_path_user(endpoint, values):
|
32
|
+
|
33
|
+
if 'user_secret' not in values and hasattr(g, 'user_uuid'):
|
34
|
+
values['user_secret'] = f'{g.user_uuid}'
|
35
|
+
if 'proxy_path' not in values:
|
36
|
+
# values['proxy_path']=f'{g.proxy_path}'
|
37
|
+
values['proxy_path'] = hconfig(ConfigEnum.proxy_path)
|
38
|
+
|
39
|
+
@app.route("/<proxy_path>/videos/<file>")
|
40
|
+
def videos(file):
|
41
|
+
print("file", file, app.config['HIDDIFY_CONFIG_PATH'] +
|
42
|
+
'/hiddify-panel/videos/'+file)
|
43
|
+
return send_from_directory(app.config['HIDDIFY_CONFIG_PATH']+'/hiddify-panel/videos/', file)
|
44
|
+
# @app.template_filter()
|
45
|
+
# def rel_datetime(value):
|
46
|
+
# diff=datetime.datetime.now()-value
|
47
|
+
# return format_timedelta(diff, add_direction=True, locale=hconfig(ConfigEnum.lang))
|
48
|
+
|
49
|
+
@app.url_value_preprocessor
|
50
|
+
def pull_secret_code(endpoint, values):
|
51
|
+
# print("Y",endpoint, values)
|
52
|
+
# if values is None:
|
53
|
+
# return
|
54
|
+
|
55
|
+
g.user = None
|
56
|
+
g.user_uuid = None
|
57
|
+
g.is_admin = False
|
58
|
+
|
59
|
+
|
60
|
+
if request.args.get('darkmode')!=None:
|
61
|
+
session['darkmode'] = request.args.get('darkmode','').lower()=='true'
|
62
|
+
g.darkmode=session.get('darkmode', False)
|
63
|
+
|
64
|
+
if request.args.get('pwa')!=None:
|
65
|
+
session['pwa'] = request.args.get('pwa','').lower()=='true'
|
66
|
+
g.pwa=session.get('pwa', False)
|
67
|
+
|
68
|
+
g.user_agent = user_agents.parse(request.user_agent.string)
|
69
|
+
if g.user_agent.is_bot:
|
70
|
+
abort(400, "invalid")
|
71
|
+
g.proxy_path = values.pop('proxy_path', None) if values else None
|
72
|
+
if g.proxy_path != hconfig(ConfigEnum.proxy_path):
|
73
|
+
abort(400, "Invalid Proxy Path")
|
74
|
+
if endpoint == 'static' or endpoint == "videos":
|
75
|
+
return
|
76
|
+
tmp_secret = values.pop('user_secret', None) if values else None
|
77
|
+
try:
|
78
|
+
if tmp_secret:
|
79
|
+
g.user_uuid = uuid.UUID(tmp_secret)
|
80
|
+
except:
|
81
|
+
# raise PermissionError("Invalid secret")
|
82
|
+
abort(400, 'invalid user')
|
83
|
+
g.is_admin = g.user_uuid == uuid.UUID(hconfig(ConfigEnum.admin_secret))
|
84
|
+
bare_path=request.path.replace(g.proxy_path,"").replace(tmp_secret,"").lower()
|
85
|
+
if not g.is_admin:
|
86
|
+
g.user = User.query.filter(User.uuid == f'{g.user_uuid}').first()
|
87
|
+
if not g.user:
|
88
|
+
abort(401, 'invalid user')
|
89
|
+
if endpoint and ("admin" in endpoint or "api" in endpoint):
|
90
|
+
# raise PermissionError("Access Denied")
|
91
|
+
abort(403, 'Access Denied')
|
92
|
+
if "admin" in bare_path or "api" in bare_path:
|
93
|
+
abort(403, 'Access Denied')
|
94
|
+
|
95
|
+
if hconfig(ConfigEnum.telegram_bot_token):
|
96
|
+
from hiddifypanel.panel.commercial.telegrambot import bot
|
97
|
+
g.bot=bot
|
98
|
+
# print(g.user)
|
4
99
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
100
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|