hiddifypanel 3.0.0.dev63__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-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,208 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00#\x1d\x00\x00\x12\t\x04\x00(9"\x08\xc2y!$\xd7qVr\x9cJd^\x00\x00\x00\x00\x00\x00\x00\x00\xdeJ\xdb\x91Q\x7f\x0f\xea\xbf\x1b\xf8\'\x85\x1d2\xe5\xb3\x90va$v\x96\x1a\xfd\x94\xaa@\x08.\xe5z\xdc\xae\n\x9foH\x9b\xc8\xd2\x84\x94\xeb^\x81E\xf7\xea\x8dp\x02\x1e\xdc\xb6a\xbe\xe1z\xcdlL\xbc\x85<R;\xd03!!\x18\x00k\x8f\x1d\x03%\xa5\xb2\x98)h\x89\xc2\xef\xba]\x86\x0fJ\x9dv\xbc\x02v\xd7&\xbb\xdeDUeE6\xf6aV!\x16Z~V\xac\xf7e\xedA!\xdeN\xa0s$\xc2\x98\xd1\xa8\x90k\xe0\xe2?\xde8A\x86\x01O\xe7\xd8\xe8\x18\xb3]\x18\xeb\x15$\xca\x95\xc1i\xebnP\xc9g\xa5\xe7\xba\xb2\xdb.e0\rQ#A;mDHf\x17\xf2;([\x0f\x0e1\xf6x1\x8d>\xed\xfa\x92;=\x16m\xe9`\x0e[\xd13\xfaa\xbe\x8a\x00\xa0B\x0b\x04\xf3j\xfa\x93\x84\x84N\x81\x95\xe1b\xd7\xd8\xfd\xa1\x91\xb1\xcf\x8c\x04\xf4\xe0\x13/*\x81\xbf\x9aN\xda\xab\xed\xb9\x17\x12\xe4\x9d2\xac\xb0\x03\x1e\xc1.\xce\x83<\x9b\x91\x07Tz\x97\x14\xf5\x1c\xe4\xa4_\x8c\xd9y\x8ea\xdd\xf7\x9c\xce3\xec\xe37m\xc2\x14\xbd\x7f\xa0eG\xf2m\xc4\xb0\xca\x8e\x88|\xa1\xf3}\xc2\xe7!\x16\x9f\x9b\x9b\xbc\xd1\xda\xde|\xea\xdb\x04\xd9\xc8~T\x94;\x07"[5\xa6\x8a\xe5\xec\xab\xd8^V8\xec\xb9(\xd7m\xee<\xf8\x0b\x97\xc09\xb1\x93\xe0vEG\xc2\xd0\xc3\x0c-\xb9auK\xb1D\xffzc\xa0\x91\xf8r:\xcf\xa2\xbe\x01\x962\x1dO\xdd\xfft\x03\xde\x90a\x9b\xf0\x80\xb9\xd9\xf7\xcd\'t\xc0\x91\xf6\xe3as\xdf\x1f\xd4P\xaci!\xcf\x83\xf7\n\x0eL7\xf6{;\xf1\x1e\xfd\x01*n\x0c^K\xb7\xa7\xe0\xe9% \x0f\xd4\x8d\x13\x13B:}L|~\x1f./\xc12m\xf6\xbfVQ\xf5\n\xb6[\xe0k\xd2;\x14\xa4gM<\x15\x06\x94,\x8b\x848\xb7\x07=\xd3\xe5M\n\x19\xb18\x02\x8e\xf1\xce\x12\r\x01\xe8^w\xaf\x1c\x17bf>`\xc5\xb1~.\xed\xad\x0c\xfa\x93\xa32jR\xb1\x93\xfe\xe4i\xd3\x8e\xec\xfeu>E\xc5\xd4\x9d\x8d\x94\xa48\xf4\xe32\x14/\x8c\x1ez\x99\xca\x834H\\UH\x0f\xb2-\x8c\xb1^K7\xf8\x9b\xcexbh\x90D\x02V\xc7\x03+\xdd\x1dt\xffwU\xf5\x99\x97q\xd66\x82\x01\xf9\xf5\xa1\x10\x8a\ne\xd7\'\xd5\xb0\xfe0\x80D]\x10\xc8\xfa2\x89jW\x9e\r\xd2\xfd\xdf\xe4\x07\x02\xf0\t\xbf\xe4\xba\x1b\xe7@\n\x81:\x98\xf8\xfeM\xd2Be\xc1c\rkG\xdf\x0b\xd9\x14\xfb\x07\xd2\x8b\xe0S\xa3q\xc4\x11\x94\xd0\x8a[x\xb6\xc7\xd2\xd3\xe8\xa4\x1c\x96\xa7q\x12\xd8\xbc~&\xb3\x96\xaa\xc7\x98\xcb\xf0\xe1|n\xdbQ\x11\xa7|X\xdf\xfa"\x9a\x9f#\xed\x9d\x87\x88s\x9ei\xf5\xf6\x96]\x8f\xe26\xd2\x7f\x810?>z\x15\x03\x1b\x06\xce\x1a\xe9\x08\xdb\x97n}K{\\\x8e:\xce\x17\x1f\x1e\x97\xa1e\xc6\xa9\x9d\x7f\xf0\xc9\xd4\xf7\x0b\xbej:\xf3\xd3?\x06p\xcd\xec\xa1O3\xda\x94c \xa1aS1\x9d\x86\x1d\xd2\x81\x19h<Q\xc7\x0f\xf8\x90\xa0\x8f\x8bL7\x8ax\xa7\x19\xd0j\xd1\xd5\xd8w\x07]\xdf\xe3>.B\xf8\xa3\xa3\xfb-\xc3.\xa8\xb7\x1a\xfe\xf6\xe2\x92\x99\xf7]L\xd7\xc8\xbe\x8d\x88&\x01\x84\xd2\xba\xc20/K\x12\x14f\xcc\x91\x1a-\xf9\x04\x121\x12\x96\xb7`E\x8ac\x13\xd1<\xf1\xd3\x7fC}\xcfj\xaeWK\xf0A\xd8g\xca\xd9\xa35\x8c\xf9\x10z>\xa6\xc2X\xb7\xaf\x82\x18\xffg\xeb$#\x00\x00\xd8\x1f\n\xf6h"&\x1cK1\xcd\x1d\xe6\xb4m9q\xd3\xef\x90C\xe6\xd9O\xb7oqW\x93\xa9\x0b\xb4WQ\xae\xf3fZX\xe2 \xb2}q\xb0m\\qB\x8fp;g\xce9\xccIh\xe3\xd9\xb2\xd5\xcd\xa4w\x19\xbd\x97v\rl\x96\x9d_\xc4\xb8\x12\x88\xc3\xd3]0\x85\x9e\xe5)wA\xc4\'j\x8d\xb8\x0b\xb9\xf4f\xf5\xab\x88Ve*<\xd0\x19\xb5\x8fx\x92\xd3\xd4\x05N\x14\xf03\x18\xf7>\xcdE\x1d6B\x9f\x08\xff\xdb\xf5\x08\x93n\xf6d\xcau\x87\xae\x7f5\x99\xad\x07\x7fZ\x8c\x83\xa9\\\xadL\xc2\xcf\x18\x0c\xda\x91\x12\xf1:\xd6*+\xfa\xc2&\x15D\x7f\xc4~\x95\xb8\xc6]\xee\xac\xc7\xb9y\xbd\xec`e\x9b\xdd\xfa\xdf\xc7J\x1ed\xd6\x85_lI\xf3@\xc7\x0f\x0e\xd1\xbd\xd1\xd2\xa2U(\xf2\xae\xc1R\xa4\x99e\xc8\x17\xc3\xf8X`\\\xa3\xbc\x12[p\xb5G\xfe\n\xccW\xf5Sz\x0b/\x8b\x17\xd9\xf7\x1f\'R\x1d\x9a\x1f\x85\\s\xb9y\x8cy\x14\x9e\xfc\xbe#\x9dvBY9\xfc4ol~T\xa5\xe3$\x03\xbb\xa7O\x0f\xe9\x8fD\xb9?\xc9}\x06\x18\xe6\n\x12\x10\xcf"4\xce\x0eN\x1f\x8e\xb1\xc1\xd5\xc0\xc2\x18\xe8c\xdc\x95\x1a\xa8\x8b\xfc1\xb6%\xf5|\x19\xefkw\x0c%x%\xd6\xde\x14\xcb\xe6\x84\x12\x99n\xb6\xd7Of.\x8fI\x80\xfe\xa2\x95G\xef\xeb^a\xf7\xd8\x87\xcc\xb5Yf/\xcb7\x0ce\xd4\xc1\xb8Il<%=^X\xdb\xdc\xea\xf6F\xea+\x15\x1c!\xda&P\xd7?$\xe5\xdd]\xce\xc02^W\xe35\x0b\x95\xf86i\r\xa1\xcf\xaa\xfc\x9dw\x872\xdak\x8c\r\x1c\xdco\xa43\xf9a@?\x8f\x9cVM+\xb3`SUg\x91y\x17\x98Vl"\xb3Hr\xd0\xec \x0f)\xcbF\xfaa\xcb\xfb.\x8e\x130\xeb\x93\x9c\xb8\xee\xba\xb8\xae\xb6\xadm\x91\xacK\xa8\x91\xaa\x91\xf5\xdb,\xad@\xe4P\x08\x97n\x12\xa5G\xd1\x18\xa5\x83\x1b\x12\xa6o7\x13\x9a\xd4WG\x94\xe5#\x86>\x9c\x8c\xc5\x94\xdb\xcb\x81w\x91\xe1e\xf2M\xf8k\t\xb9c\x9a\xce\x8f\x13\x96\xf6\xbb\xf1\xc0\xff\xe5\x8f\xe5.\x1b\xfa\xa9\x1e\xf8\xec\x19P56\x84\xa1X9B\x92\x15Qe\xedI0Rc\x87P\xa2\x16\xc8Nl\x88r\nLG\x93|\x08eY\xb0\xe6\xe3\xdb\x19\x0cyk\xcd|t\xb5\xee=\xbb\xc2\xc8\xe6\x83\xf0\x11\xb2\x8d\xb2R\xd05N\xa5\xdb\xe7\xdc\x1f\x95\x95\xdf\x13\x86\t\xc2@\x1f\xf84\xfb\xf6\x96\xda\xe0\x10\xf9{\x81\xfe\x86\xda\x8b\xe0%\x95\xcd\xe0\xce%\x84\x8e\xd7\x04\r\x81)\x9b\x02Q\xc2SS\xd9\xea\x9d\x86\xf7\xde\xd9\xffC\xe2}\xf0\xa6\x1cJ\t\xaf\x10\x8a\xf6\xd4\xa4\xe0LV~\x03\xca\xbd\x8b\xbbWf\xff[\xcc\xe4=\xfc\xffxQ\xb5\xfbd\x8b\x0f<\xf3\xad?X\xddCd\xbe<\x88i\x8dAX\xc4\xf2b\xcb\x97\x88X\xa7\x83t\xdb\t\xb6\xdf_\x9bY\xc3S\xde\xff\xf5\xa4\xf3`p\x1a\xc2\xb4,\xa6\x08o_\xf59Z\x9be#)\xe7#\x82\n\xfd\xed\xa2e\xca\xad+\x0f\x99R"\x80\xa6\xcb\xc1\xcf\xec!\xf6p\xae\xa4>p\xaf\xbe7du^=#n\xb1\xf5\x9a\xfe,\xb79U\x12C\x1eQ\xb2V\x0e\xb4\xa2lH\xe8\xce\xae\xe0J\x0c2 \x96\xdf\xb8#\xed\xecgQ\xbe\xb2\xd2k`\x8f\xc2\x8b\xddx\xc8`Z/\x92C\xf4\x9b\xc6\xbb\x07\xc0,\xf6\xba\xcbRy5G9\xe9\xd8q\xb4\x08\x19\x7f\xdf\xb4\xf0P\x0e\xe3\xd0\xeeb\x92r)\xff\xd7\x98O\xed\x10\x05\xcd\xa0\\\x03\xf3\x1d?i\xd5z\xf2-\x88\xd7c\xefji\xd3\x01\xc1/P\x92\xb3\xf6\x9dNi\x14\xebg\xf7\x02`=\x16\xfdR\x95\xd4\xd0R\x0f\xb2\x9bS7$\x8fy\x14\xd2!\xbf\xc4\x1f\xd4\xbf{\x1br\xaehqh6X.|\x7f\xe1\xbd\x8d\xa0%\xa0\xce\x0f\xdc\x006\xc1\x1f\x92\xe0Ym\x80w\xf5\x14>\xa1\xbfj\x83G\x84\x13\xec\x0cm\x9ab\xab9\xf3\x16\xd6;dt\x0f<\xab,\x96\x9e\x80\x87m\xf6\xb7\x9b\xb7\x0ceB\x93\x169\xae\xfb\xbb\xd9\x19\x89\x1ei#\xbf\xa7\x86J{r\xe4\xa9\xe6\xdf\x01\x1bMv\xd4B\x98\xb6\xd1\x1a\x91P\xb68\x14\xd3F\xd9\xb9\xce\x84\x15\xe7\x1fu\xf6\x95\x00_\xcb\xc3\x0erB\xc0\x96zN\'z\xa4\xfc\xdb\x82\x87\x80\xef\x1f\xe3\xe1\x861*\x83\xc2\x85\xb2\xa9\xdb\xe4\x11\xee\x9c\xb6\x129\xbctp\x10\xb54\xac\x1a<\xf5\xd3\x07<\xc4.\x91\x17o\x90\x8d\x94w`\xdf\xe7\xc9$R#>\xa2\xcck\x82\xc9\x10@a\xf7e\xcbq\x1e\x1c\x8c\x85\x87\xb8\xe9\xed\xc8\xba\x96=:6A\n.\xb4\xc3I\x8b\x05\x92>\xcc\xee?,\xd3d"\x17"\xf3(\x84}\n\xf1\x87/\xa8kz\xd7q\x05qL\xce\xc5!\xad5\x84\xc1~}pt\xa8\xdb\xeb|\xc1\x1d\xabC\xcf\xa8\xa24\n\x98\xc4\xc9KTg\x9f\xfa)\xcd\xae\xd9\xea\xe4C\x98\x009\xc4E\x9a\x02?\xc1]\xee\xc3\xb2\xf3\xb3Q\x1bc\xae0\x07"\xc7\xae\x00\x18\xf4j\xab\xe0_y/\xb7\x89\xca\xc2\xa9\x80\xdc\x937\xaa\x0e-\xcc\xa2M\xbbe\x19\xfe0\x16\xa0\x05\x80<\x90\xc6\xcaGa\xdf\x03\xaf\xf4z\xc4\x11\xde\x02E{\xf7\xd8Ze\x8b\xdb\xac\x1eV\xbf1`\x8f\xad\xc5\xbd\x94\xbe~R\x1c86\xcf\xda\xf3\xffn\x1c\xba\xc2RA\x947\x1e\'\xed%\xd1\xb6\x82\xd62\n\xfa\xca\x1a\xd9\xe7\xc1(\x04\xdb\xb3\xe3\x0b.~\x04!2KK\xeb[\x0f-\x8a\x891\x9eg{\xc5\xfaj\xbdeTa\xf6\x8f\x86\x13t\xa3y\x08\xfc\x9f\x15\t=\xba\xbe\x10\xd1\xdf\x95\x051"\x88\xbbg\x84\x95\xb6\x83\xb2\x98\x93/\xd8<}iD\xf2R\xb7\x0er4\xc1)\x91\xb6\xc3\xa4\xebC\x9665\xf1\xb8@\x99o\xa4\xce\x81O<Z\x05a\xfdKzlB/\xaeoEWR\x05\xe9m\xdf\x8c);\x87k\x90w\xda\xa8\xb7K\xc5\x17\x1f\xa5,#\xad$i+y\x05q\xf0|\xab\x90\x9f\x84>\xe7)\xceCj\x11\tw\xae\x10\x81\xa5\x18is\xc7\xdd9\x01\x17S\x99H\x9cb`4\x8c\x95g\xe5x\xe9,MJ\x13\xaa\xd3dR\xb2\x10D\x97\xf1\\/\xec\x95|\xec\x80\x9d\x16Z/\xc3\xc0x\x1f\x8d\x1b|\xb1m"V\xb4\x86M\xce\xe8>\xd1m\x8d\xa4\xb1\x85\xed@\xc81K\x91\xe4>]\xdf"\xa5\xae\x00{\x8a\x03\xd7\x19_\xd5\xe0/\x84}\xaf\x8b`\x85\xac\x97\xb0\xe5\x9f(\xf7\xce\xdcg:J\x0e\xe2%\xa9\x17\x10\xc7\x162\xda\xfa\xee\x94\xe17\xcf!\x03\x06\xeck\xfa\x89 ?\xb9*[CN%Z\x18\x04|R\xdf\xda\x85\xc3\x11\xe4\xa4UD\xa2\x99\x07\x83\x93o\xec\n\x1b\xd4$C/8\x05\xe4C\x8f\x83\x9ft\x88L\xef\xb8P\xfc\xe4\xc3\x8f\x92\x03\xa7\xb3~\x82Q^\xb7\x1b\xacn\x87o(\xb7i\xaa\xc0\xa7\xb8\x909\xa1pn\x15\x11F;\xa7\xa4\xacE\xc2\xdc@\xae\xb6\xd4\xfc\x12W\xc5F\xab\xb3\x1c\x83l\xe4\xcd\x14\xdf\x929E\xd4\xdd`\x8b\xd5\xeb\x0f\xab\xdc\xd9\x87\xb4\xd8\xf2gx\x12r\'\x87A\x078B\xc4\xaf{\xf9\xc3\x07h\x0c\x17 \x95\xdc\x88dL\x9e8\x04\x1765\x89/\xefJ[n(\xffY;kW\xfa \x80\xc2\x1d\x946AG?\xa2\x1dw\xa9\xf8\x1c\xeb\xf4\xb4P\x91\xcd\x18\xfb\x18P\xf4\xc2v6SE\x06\x8b\xf6S"\xc7i\xf4\x1d\x8d\x7f\x8b\xc5\xd0-n\xbf\xca\xc4\x0e\x99l$v\x15C\x0f\xcc\xd0j\xf6\xf4\xf0\xed\xaf\xd1!:\xe7\x8d\x0c>\x9c\xa9\xfa\xb0\x1a3\x08?\xa0!\xc9\x1eZ v\xc7\x93W\xd9\xbe\xfem\xcc\n\xf9Y\xa5\xec\xc5\x8d\xc2[Y\xac\x8f\xf7\xbbc\xe0\x9c\x1c\\\xaa\x0e\xb9\x0f!\x07\xa3\xc5\x16\xff\x06\x1f\x9aY29\x12X\xaf^ \xfe\x1du\x98\x04,\x15\xf3\x1f\xef\xec\xabo\x853\xd2\xc1\xbbD}q-q\xc5\xb1\xcc\xa6\xe2!\x05,\xefd\x01\xa7h\x00|\xfe\x9ck\xc9\xff\xd8>\xeb\x1a\xe5_\xbf\xa1\xcf\x08\xa8i\x7f\xbfX\x1a\x1f\xd4r\xa0\rh3+\xaa\n3\xc2v5\xb6\x16\xa4\x110\xd7m>\xc2\xffK\xc2\xf3>\xcf\xe3\n\x84\x89\xba\xbbGHN\x97\xda^\xdf\xe8Tr\xf2\x03\xcc\xcd\x8d\xe5\x12K7\x07\xfc\xcc|\x8d\x99\xd8]\xcf\xde\x17\x1a\xee\xa8\x86\x1d\xa8X\x99\xe1\xae\x0fc\x05\xd8\xdc\xd9\xb4\xc5\xd7\x006\x8c\x9b^t$g|5\x02\xa0\x1f\xb2\x87\xa8\xaa+$V8\x97\x17\xa3\xc2h\xcb\xfbh\x18\x00\x8b\x97\xd6`cL\xaa{\xb0\xd6\xd7\x1cT_\xcf\xdb\x1c\x19\x9aw\x8b\xf8r\xef!X\x9c\xa1"\x02\xe8$\xda\x16\xc5+\xfcIoOB\xbc\x88\x98]\xa1g,VX8\x02\xcb\xf6\xcdC\xd3\x1e\xcddB\xbcO<0\xeb\xe7\xf4\xb0\xb4\x9c+\xbb\xa7a*\x0b\x08\x14\xa2\xf3\xc6\x18\xc7\xcbM\xc3eTZ\xac z\xdc\xc2\x89\xd8\x06\x84u\xb8\x80b.\xb6\xf4=}W\xfc(\xbaU\x89\xe6I\xe9\xca\x83q\x03g\xe1-\xf8\xa23#\x08\x0b\xdf2\xa1)\x8eA\x03\xfa;\x93\xc7\xd4\xec\xe7K\xe8\xf8\xdc/\xcc\xbb{\xc6Wap\x9c\xdc\xa7nI\x88HM\xad~\xb8;&\x15?A?\x02\x94\xdc%\xd5\xfe]\xf4\xcc\xaa\xe6f\x1d\']\xa2\xd36\'\xfc1\x80J\xc0\xd9\xc0\t\xb9\x18\x89`\xe1\xfc\x8e\x1cXF7%\x18l$\xe0\xcb\xa2\xc1\xf6\xd4\xcdH\xe12r\xab"J\x10~\xa4^S\xa0\xb6&\x95\xa7\xc6d1"\xae\t\xc6\x90M\r\x16\x19\xbc\xdd\xd7\x84\xbd\x83vM\xa3Vzi\xcc\xfa\x16\x94\xba-=e\x17\x15\x80x9\x95\xc1\xad\xef\xae\xd9\xb9\xb8\x92\x11\x9a\x1c\xf8\xe2\xdd\x80\x0e$\xeaT)\x9a\x8e;$\x14E\x1ai\xe3\xbe\xf7Kp\x89a\xaa\xd5\xa8\xd6k\xc0M\x18\xbb \xf3\xf7\xaa=\xf0\xf8\xb5\x02\xc2+\xb0d\xaf\x8b^\x0b\xc0\xfcY\x92\x03\x01+E\x1f-\x9a\x1e4\xee{\xd9\x8fK\xc14\x7f%?\'~\x19\xbcNm\x00\xf2\x91\xbd\x91\x94D\x87-\xf4\x7f\x94\xf05\xf2\xe5\xf3PX\x85\xb0\xd2\xf7\xedSN\x05J\xc4.\xf6\xed\x9a\xd4&\xf8\x96\x05\xb6 gc\xce\x9c\x9f\x7f6\xeb\x06\xa3op\xe4\x818p\xe1\x97>A-5\x0b0n\xce}\xfcP@\xae\xaa\xbf\x85\x9aifq\xd77\x04\x02D\x92M\x11\xe6\xc0\x04\xea\x1a<\'\xae\xaf\x9d\xf0\xc5@\xef\xbb\xe5\xedH\xa6!\xbc\x84\xa0^\xd7\xa7 \x8c\x0e\x0c\xa3\xc4\xb4\xa3klT\xb0\x16\\\x08b\x15\xde\xdd\xbclZ\xc1\xff\xd79\xfa\xbd=w\xc6h\xe6\xba\x01I\xe7,b\xc3\x8fRUaI\xd0\xd5\xa8\x9e\xfe\xa0\xce\x9ei\x88\x94\xda\x92\x8a\x01\xe5\x8d\xd8\x00\x1b\xecT\xd4\xfe\x89C\t!\xea]\xa4\xe2!|\xf1\x9a\xa1\xcbJ\x0c#\x19\x92\xc7_\xcd3\xd6\x9e\x98\x1e\xa6I\xb3QT\xdf]mi\x80\xf0X\x1c\xe8Q\xbdZD\xe8\x86\xb6\x02\x86\xc9\xd4\x9f\xf4\xd9\\\xbf\'d\xb3g<\x04\x8c\xdb\xe91\xeb \x8a#\x94\x12\x12\x98\n\xa6\xcf\xc2\xe99U|\x85\x84\xa1\xe78\\0\t\xf8\x80\x88Z\xf9\x18\xf6i\xa7\x85\xd4V(\xdbl\xa9\x9f\xa2VGh\x9f\x17\xce\xf3\xcbh\xfe\xca\xd4\xb8\x9f=9\xb6A\xdb\xed\xd2A\xcdaL_6\xe7`4/\xe3s\x0b\xdd\x8b\xe0\xdd\xbc\xab\x06\xb1\xd3\xa1\xde\x81\xc7\xff0\xb3(\xb2\xb5^\x0e1\xc6\xda\xaa\x81\xab\t\x07\xf1!c\xaf\xae; .\xe2\xbd\x13\xee\xda\xac\'\x96K\xae\xe0u\xbf\x96\x81h\x98\x16\xf3x\xb6\x12\x8daL\x006\x1d\x82$oz\x901\xdb\n#\xf9IF\x0f\x1b\xd5\xf6b\xd9>\x12\xb4p\xca\xab$\xae\xbe\x81\xdc\x93\x08\x00p\xc4\x86\x04t\xe9\xb2\x12>p\x87\xce\x16\x056\xf3\xd8m]\xc4\x12ZX\x95xJ\x9f\xe2HH\xf8\x95\x0c\xbd[g\xb8\xb7\xa9\xde\x911\xc6\x92\xf4\xc8%\xd3\x1aTX\xfd\xe7@\xff\'\xb9n\xd70\xef\xe6\xccX\x1a\xcfI\x90\xf56\x9d6s\xae\xce\x8b\xcag\x933\x01\x1d\xe7\xa3Q\xaa>{~\xb8\xa1\x0ffe\xfb\x9e\xb4t\xb6\x89{sM\x89N\xfdA\x99S\x11%\x19\xb3\x8fH\xad\xfd\x10\xdd\x13$\x03W\xf5\xda\xca\xb6P\x1c\xa9\x00\x91\xaa\x94\x04\xe4\xe1\xfe\xb6o\x9a\x9fh\xb3#\x1c\x9c\xa3\xb1ZdG)\x8e\xb2\x855\xed\xe1z\xba\xc4}\xc0\xb7\xbd\xf6r6\x97K\x03\xa8\xa81\x1c]\x05\xac\xd7\x80\x8fkY\xba\x17l\xad\xe4j\x83\xaaA~\xcc"L\xb8\x97\\\r\x12\x06\\\xbbm\x0b\xbb\x0ff\xddI\xd2\xb4\xb4\xa3Du\x05``7\xa6\xb2\xed"\xda\'\xe26\xe8\x91)\x040\xb9\x05\xeb\xbc\xf4\x99xl\xc5l\xf0\x93\x9b\xe4\x04\x97\xd4\xe6\x13&u;dd\x9f\x18R\xf6s7\xb4h\xc7\xc2\xfb\xde\xd1Y\x07~\xf7\x07\x17\xaa\xbb&\xad\x8am\x99\xc8\xdfO\xc3\xd5{\xf5x\xd7\r\x19\xa2j\x9a[\xf7\xb0x\x11tJq\x91v(\xe7T\x06K\x98\x9b}\x99-:@\xfd\x90\x1a\xce\xaa\xda\'\xae\xe2I\x9e\xb5;\xc0\xf0 8\x9d\xe8\xd3Z\x17\x17\xe5\x10A\x7f\x1e\x8a\t\x05\xb3;\x8e\xda\xcf3\x7f\xfa\xac\xa0\xd9H\x93\xd4\xeaN\xad\xd3\xbf\x9d\x1b\xdd\xd4\x159\xc4o\xfe\x91\xff&D\x17\x04\xa5\xfd\x91\xb4\x80#\x0b\x81\xc4\x19\x15\xdc\x0fo\xbd\xd6<"m8\x81\xb6\xb7\xfb\x8bYl\xb4RGA\x10\xe1\x08\xcc\xdd\x9c\xe6\xedii\x08{\xf5Q\xb1\xecT\xcd\xe1\xd7\xd8\x08\xbc"\xcf\n\xf3\xf9\x9c\x17\x86z\x00m\xa9\x9a\xda\x83Eb,\xb0\x9e\xc9\x9b\x1d%\xd7\xd4F\x98L\xa0\x8a\xbbF\xd6.\x1a\x17\x0f\xb4\x19K\xd8[*x\x12\x86\xf9\xc9*.\x96\xe3\xbe.\x13\x9e+\x01\xaa\xea\'\xe5\x87\xb2\x15\xb1\x19\xb8\xa73\xd5\x95p\x08\xfa\x9b\xb0\xb3\xb7\x9c\x0bXl\x0ej\xcd\xbe\xad\x14W\x1d\xdb\x16\xf1\x05\xc7"\x1c\x1f\xe3\xe3\xc9U\xad\xaeY\xf0Dg7\x19mgE\xbfJL\xbb!\xe0\xa5\xa4\x9b\xcb\x13]\xa8\x01\x93/\x04\x1c\x93\xfe\x08\xe3\xd3\xb9(\xa8\xaf\xb3$\xe4\xe9 \xae\xcb\xc6\x86\t\xdcdB\x8c\xb9\xd0\xa5A\xd8\x87\xda\xd45|z\xa3\xa2\xd9\xb1\x00\xb7T<#=y\x06\x89?\x83d\xe4\xb6y\x04>\xf8\x84\x90\xff$<h\xa66\xdc\xd3Z\x9c\xe1Sj\xef\x9a|\xeei\x17~ I\xb1/l\xd2#F\x7f2_\xaaGE\x82m\x92\x8a\x8a\xf7"p\xfa5\x10c\x979\x0c3\x9dL\x92:i\x08\xdar\n\xf9\xec\r}@:H\xc14\x8d\x9b\xb9\xae\xa4e\xa0FL\xe7\xcf\xc2]+t\xea,d\xff\xe2t8\xb3\x80\xa5\xcb\xd4e\xf2\xd9\xd4{Gc\xce\x8d\xdaK\x84\x02\xcdW\xef\x0f\xb0\x16}D\x8fft\xff\xe2)\xd2gIu~?\xe7\x16\xff\x87\xf9\xf5\xba\x82v\x1eW\xc1\x9a\xba\x01\xc3\xca\'7L\x12\xd45\x13\'\x17o\xbe\x8f\xec\xd7H\x99W|0$t8\x0e\xb0\x9c9\x1e\xbe\xbb\xb7h\xc4\x8a3\x03\x97VN,a\x1b+\xf7T\xa4\x83\xaf3\xd2n\x89"\xf1\xe4D+\xecC\x1f\xec\xe1\xcbz\x83P\x93\x90\xf9\xd8\xfe\xcb\xc6\xd0\xd3y\x86\\\xc8^V\xa47\x94\x13\xfd\\\xaa\x08\xbd\xb0D\xcb\x1c?7\xfaL\x0bQ\xc7\x91\x84~_H\x9b4T\xd08\x83V\x15\xed\xf6q\xa8E\xb2\xcb\\7\xf2\xcc\x0b\x89\x0b\x05w\xd5/\x05\r0\xf2\x81s\xf2x\xd7\xa2jhM\xd92\x15\x81\xfe\x16\x94$2\xfb\xa9\x06\x15\x16\xdc\xab]\x90l\xc2\xdf4\x0f\xe2?Mf\x940S\x9e\x8fln\x979\x8dDgy\xa5\xa5\xebv\xf2\xf0\xfc\xfeC\xc3 aR\xc3\xfa\xa8\xb8\x1e\x9d\xf5\xc5\xd9Jh\xb0ov;\x80\xcc\xe9\xb4\xf6S\xc3\x0b3\xe6\x8e-R\xd5\x84;+\xfcj\r\x80(r\xd6P\xae<\xeb\x9f1=8\x8a\xc8=\xe0\xa9{\x8cso\x1d\xb0{\xb5fE\x8d\x9c\xb6GR\x1b\x87C\x15\xb12\x08\xca \xbd+!\x9c\xf5G\xeeq\n\xeb2fBT\xe3w\x12\xd8w\xc1\xc4\xaeQ:\xf1\x026=\rb\x8c\xe54\xed\xe0vf\x1b\xe1,\xccx\xd8\xc2\x1cG\x9b\x9a\xf9\x11\x93\xc3\x02\xb7\xe7\xd0\xa06\xa29\xe5o\x8e\xa1\xd37\x8d=\xcc\xe7\xc1w\xe0;\x10\xe9\xea\x05\x12\xc2\x1c\x96\x00|\xb9W\xca \xed\xf1K\xaai7N\xd6\xa5\x81\x1c\x1e\x04f\xec\xd9\x1ck\xd3\xaf\xa2ejK\xbc\x06%>^\x96\x89\xbc`cPV\x03\xdb\xf1d\xa1\x02\x92OSI@\x92w=\xc3\xa3\xb7a[\xd9\xc6\x9b\xcb\x16 \xdd\x03\x80*\xe6Z\x9f1\xb3\x1e\xc3\xa1*l6^\x9b\x13(#M\x9f@\xdd\x15V\xf0r\xe23\xe4=yr\x14\xe9\xea\x0c$|\x90\xed\x1a\xae\x19\xb8\'g\xbd3\xe1MJB\x08\xad\xf6>7I\xeeV\xb5\xf1M\xb1\x982+\xd9J\xcc\x0f\xaep\xce\xd9=5\x80\x9f\xa5\x1a=\xa1\xef\xe2Wt\xdc\xf6\x17\\\xa0\x85\xae\xb2SF\xbe\xd8\xe6\xfbu\x9c\xee\xd5s\xadk\x0ch\xc3*\x1b\xe7\xe69?\xd9\x17\xb4\xb8\x80\xeb\xd8\\\x06\xc4b:\xd9\xb1\x85;\x9b\xcf\x13\xd9>\xb9o\xf4\x9c2\xa12\xd1\xa4jL%8\x8a\x82~\x9eR\x1b\x05t\xc0Nj\xe0\x88F~\x8d\x827\x9b\xbf\xa5\r\xa8\xb8\xff \xf4\x85v\xbe\xc7\xb4\xf9\xf5w\x87gr\xf3\xc1\x9d\x1d\x02`\x8d\xcd\xd6}l\xc3\tL\x9b"\xfa\x12z\xee\xf0\t,\xd5\xcce\x87\xd0z\x90\xb6\xb5J\xa13-(\xb1aks\x9b0-\xf6\xde\x05\xdf\xac\x8a?\xe4\xcc\xe0\x8euN))|\x86\xc5\xaa\xc0\xbc\x82\xc4H\xee\x90\xb6\x05g\x08\'1\xad0zmj\xb2\xa7`\xaaDq,\x17\xe5sx\x82\xc72\xfbeik\xc6\xa9L\xf8\x1c\xb4\xec\xf3`\r\xce\x12\xa8krV\xd2t\xd3\xd1\xf3\x88\xf9\xcft\xb5\x86\x05\xaf\x94\xfcpQ\x03s\x1a\x85\xb3\x99{\x92\x0c\xf6\xf6C=\xc0\x97\x00\xf2\x0b\xd8\x16\x85\xb1\x08(\xbfy+??\xc2}\xf4\xf5+h\x99\x13\xc2g\xca\xb7\xe3\x0c\xc2)\xa5l\x12p\xbce\xe9\xe8\xa3\x05\xad\x88x\x84\xa9\'\x19\x8a~\xa3\xab:Re\x1d\xe2\x81T%$\xc7\x1c\xf9\xd1g-\xc5l\x80\x11v\xcb\x97\x89\xea\x10/\xa6a?ZJ\xafNb\x00\xd4l\xf5\xf4\x1f8\x05\xb74\xee\xfe\xd85\'\x93\xc1\x1aVT\xa3$\x8d\xf3\x1a9t\xa3\xa8\x18\xd3\x14{)_\xe6\xcbK\xb5\'\xec\r\xf03J\xaf\xe9L\xe3d\x8c\xec#)\x80\x81\xc5X]\x81\x92\xcd\x13<\xb8&v\x14\x9a\xa2\x90\xaf\xc8\x9b\x1e\x99\xae\x92\x1a\x85\xb8\xc2M\x15\x0c\xcc\\H\xba\xf6\x98\xac\x07\x80\x08d\xc9`H\'\x99\xbb\xd3\xcb&\tF\xad\x96\r \xa9W\xa5\x1e\xe0\x890\xcb(\xbec\xf5H\x05\x1d\xec\n~ \xea\\\x04\x98\xaesR]\x93C\x9c~\t\xcc=P\xcc1Q\x94y\xf03\xcc\x84\xa8\x10\xaa)\xde\xa7\xeb8\x7fQ\x80\xc4}\x03*\x89\xcf%\x84p\xcaM\xde\x94o\xceK\xac6}\x94/\x1e|l\xa1\xd6\xed\xe7O\xd2]\x86O\xf8\xa3\xb1\xd0[c\xefj\xff\x08\xa6\x05\x9fq\xa8"\xd9\xd0\xdf\xe1&\xddS\x8d\xcb\xf8\x12\x01\x98\x18\xed\xb1\x99\xc0Y\x85\xf3\x96H\x9d\x01\xd3\xcb\x1f\x9b\xac\xeeg2\x92e\x11\xb4\x11\n\x1d\x1a6\xa6~\xf1b\x88\xcc\xc0lO(\xf9[\x10^\x0bz\x9f\xc3\xfd\xf1\xb5_\x0f\xc9\xfd\x02\xe7I\xf0\xde\xb8\x19j?\x94\xc9\xcb\x89\x06Y$\xf9\xd13\xb8\x10<\x9fB\xf2_L\xbd\x89\x02\xbaZ\x9c\xffc\xfe\x85\xcer+l:\xcd\x13\x1d\x13\x1b\x8b\x1aNh\x1b\xf7|\xad\x82w\xd1Xj\x9a\xff\xd8\xe6\xf3\x1a\x06}\x9b\xb6\xbe\x89\x1f\xe6\xb4\x00\xd3\xff\xa4X\x83\x1d=\xd6\x8d?d{$\xd3i.pD\xb8\x94\x05\x0e\xff\xb7;\n\xee \xd6\x8a\xdb\xc9?g\x04\xfb [\xddXC\x1e\xbb\xfa\xef\xc6lP=;\x0fb\x8e\xc7\xd2\xdfw=\\\xf4\xa8\xa8\x0f\xc1\xef\xe4n\x03\xfb%[\xf31\xbc\x1cj\xe8Mtz\xb2<\xa6v\xa3V\x9bpZ\x0fE\xccc\xad\x02(1p\x81E\xf9\x99\x88/g\x89\xb8\xe2\xc1\xf8P\xe8\xa0z\xb2\x82\\_\xd0;\xd4\xdf\x138^\xbbK8\xa3\n\x7f\xd4\x13a\xb8\xf6:\xc3\x0b\xc0\x9d\r.\x85\xe5\xedZ%\xf9x\xbb\xe4\xd0\x845U=i\x92\xd4\xdb`\x97:\xd1rwp\xda\xeb=]\xe3T6n\x841\x05\xb7\x17V\xeaU\xbb\xa5\x18\xb4L/_\xa1\x1fh\xa1\xea8Sdc\x07&O\xc1XP\x07\xcc\xd2\x16\x04u\x16\x80\x90\xbau\xe2/\xbf\x83\xcf\x0e5\x9e\x0f\xe8uW\xd7\xacJU\xe2\xe7\xeb\xf4\xa9\xcepq5\xce\xc1k\'\x90\x12\xfcR\x97\xd2\xc2k\xaay\xea\x16\xae\xacUr\xc6\xde\x9d\xef\xc9>\xbcA\xf7W+\xbd.Z\x9ff<\x06+1&m\x01\xee\x86\xa1X\x9a\xa0L\xf7\x93\xc8\x02\x9dw\x9a\x0c\xd7\xd1\xb2\x94\x97<9\xbb\x83\x15h\xba\xef\xef\xf1\x1f\x17\xf8o&\x9b\xc6\xcf\x13\xc5\x9a\xe6\xb1\x1d\xfe\x12\x10\xc4\xcf\xff\x16\xa6D\xf4\x0c[o\xf9\xc5\x07#\x89\xa7\r\xd1*\xec\xa3\xfdY\x19\x1d\x9c\xed)\xe4\x19op\xbf)\xbeM\xdc\x97\xbfa\x88\xd21\x82\xc3+9r)\xf0\xe26\x16\x9e\xa9u\x173\x92\xab\xbb,\xe6\x7f\xfaC\xe0\xcf0\xef\xf8WW\x91\xae\x84\x13Zz\xa30K8\xbe!%hq\xf4\xf9!\xa7D\xa1h\xc5\xa0N\x8a\xe0\xeb\xf9\xc4\x01u\xb9\x03\xf4\xea\xa0\x0f\xc1\x05\xd4\xf2\xd4\x06O@\x82\x80\x0c\xd6Q\x01\x8c\xf7\x1cm,F\x97\xc3<>J\xca\x87?\xb9\xd6\xb2:]]N,3\xcaxr\xa2A\x8b9\xc3M\x86J`\x9aH\x8e!\xa8b\xdcd\x12d\xe1%\xc8\x03\x9a\xc4Z\xc1-\xbb5\x85\x15I]\x1ff\x8a\xablY)\xfe\x02w\x92w"B\x98"*"u-|\xfb lC,\xd7\xf8?\xb3\x83L\x17(\x16\xae\xa0\xde1\xcf\x18\x85\x08\xfc^\xe4\xe8\x97\xe2mh\xcf)\xc8Q\xedo\xf7\x15\x15\xcaY\xeeS\x9aa\xfe\x9a \x89\x08\x17\x10\xbf\xbf\x13jH\xbc\x98\xf5\xfa\xac \xa2\xe1\x036\x92bsk]F?\x88\xfbY\x07V(\xb1Ag\n:=O\x9a\xd2v\xa9\x9b`\xb2\xef7\xe4^\x8b\xc8I\xee7\x05>5\xd7\x1b\xeb<N\r`k\xcc\x06>\xfc&H\xc2=\x9f\x06e\x8e\xe9\x89\xebX\xc4\xf0\xbcQ]\x9a\x84\xa3=\xdb\xac| \xca%qe\xc1\x9a\xf5\xca\xbe$\xa4\x1d\xa1\xd0Dl\xea\x119\xdf=\x02M\xf0\xbc\x0ez\xfc\x05\xca\x03\xb5\t\xff\xda\xc2a\xd4Ct\x85\x9c\x04\xf5a\xe2\xee\\\x8c\x89\xee\xee\x88\xc2i\x91\xe1;\xd6\xacIZ\xe2m\xa1\xdf\x8d>\xb3\x8fn{\r\xb6[ oR\x1a\x1e\t\x02\x11\xcf\x1e\x10\xe3\xbb\xebkE\xd0\xb0\xe2j~\x1e\'\xb4\x96\xcd\xe2\xf5c\x08\x99\x9a\x9c\x9d\xbc\xde\xb3\xa9pug\xef\x1bZ\x9c\xb2\xb1\xff\xf2\xf1\x9f\xd20XA\xf7(\x85\x96\xe1S\xd1\x9d\x88\x1b\xeb\x8b\xb5\x9f\xaa\xdf)\x9a\x05\xe0P\xeeL~z7\x9a}+\xc6\xf6\xaeM\x16\xe5\x89\x9c6=\xcb+\x93\r\xc3\xcbM\x82\x16\x92\xa4\x19J\xd1\xaa\xc1L\xe9\xe4\xb7L!\xaf\x11:\x1c\r\xd3\x1b\xdb\x06d\x1dY\x85\xf4\x07\xc4\x11\xdeD5zK>\xa6\x98\x00\x99q3\xd2\xd0s\x84\xda\xca\xbb+\xb7<0\x8aBt\xc8(\x18[\xf4WEe\x92\xddg\xd3\xf2Q\xd5\xbb;\xd3\xb2\x81\xd6D\xb5K\x92\xf90\xae:`\x8f\x0fb\xe7\x0b\x82p8;\x9a\xf4\x94G\xb4\x0e\xd7o\xda\x08W\xef\x87\x8e\xa4\xd0\x12l\xe63\x1f\x07\x02\x14\xfe\xf5\xdfNAR\xba\xe0\xf3\x87\x08P\x96,q\xd3~\x0bKq\x90\x8f\xd8\xeel\xa6\\\xbbA!\x0b\xb4\xedc\tW]\x1c<\xfc\xaf\xf3\xdd\x10C\'\x9fn2\xa9\x86\x08\x8d\x98\x8d\t\x95sy\x04\xa5RxNDJ\xf2\xcejx\xf2_\xe3\xac\x04\xcb\xbf\x8b|GF\xf7\xf0\xb7aM@\xe8\xb7\x11i\xbd\xd4w\xb92T\x13%z\x11\x89\xa1d\xe5I-Tj\xd2s-\xca\xf2=!\xc4\xa8\xea\xae\x04\xb7s\xf5k\xc4\x95\xc6DH\x85\x96\x18\xb1\x06\xa2\xe9\x17\x81;O+\rm\xda1\x1e%\xa9:\xcc\xde\x1d\xc9\x99\x0e\x12\xc4\xf3\xb0\x98\xc3\x13\xed9l\xff\xd0\xfcmo\xe4\xe7x\x16:\\&C\x91\xcdf\xbe\x18\xbe\x01V\xbb\x11\x8f.\x94\xf8~\xe3\x83\xd0\xd3\xe9\xfb\xd5\x86\\\xb16\xb8\xdfp\x8a!\xc3}\xa5$\x16\x11\xf6:8\xc7\x95\x8e\xe3\xf51\xf7\x0f\x1e\xdd=\xde;*F\xb5\xedH\xa47V\xaby\xd4\x00\xb14\xb5L\xb1mt\xb6\\3\xd4\x1b6\xa9\xab\x07\x06\xba@\x02\x84*JC\x88\x89\xb1\xac\xc4l;\xa4O\x0eH\xc5\xf35N\x92\xfa,\x05\xe4\x0b.~\x9f\x1b-\xa2x\x07\xad"I\x13\xf9\tPFZ\x9fw\xf9\xc0]\xed\xa9\xac\xdd\xf5\xa9\x95\x06\x06Z\xd9e\xfb\x1b\x02}n\x10\xed\xaf)\xd8\xef\x93\x18\xd31\xa4\x0c\x06\x08H\xcd\xc1\xf3\x02\x88\x1c\x01\\^J\x00\x82\xde~\x9d\xe0\xcc\xaf\x184\xf2\xab\xd7*"\xbc\xdeT\x88Ni\x1bEP\xde\xe2\xbb.7jG\xb0\xb88N\x88&\xa2\xd4I\xe9P\x93\xaeXd\x04e\xa9\xbe\x03\x10\'\xfaZR\xdaz\xaf7=\x9b\x86\x14\x1e\x11\xdf\xd6\xf6\x0c2\xd6\xab\x13\xc7\xd2\x03\x8e"\x05\xf8W\xce\xe9Hj\x8b\r\xe1`\xc6\x1bkE?q\x9e7\xc3[;\xa3\x90|\x85d\x83{\xd9$\xe1\x87\xc4\xd4(\xb9\xc6X\x1a\xa5\xfbFN\xfc;\xe3\xbd\x00\x99\x1bzB\x03\xe7\t\xc4\xc4@\x9f{I\xd1\x8e\x82F\x8b1\xb1U_\xd1\xa3k8\x1e\x85\xa5\x80\xcd\xf0>\xed+\r\xde\xc2\xa6\xbb\xef?\x89\x058)g\xeb\x06\x05\x0e*\x97M\n\x84\xd9\xd7p\x10\x1f\xcc\xb2\xa6\xe8\xdd!\xf4\xd8\'\xbf\xa0\xca\xb2\xbd\xb1\xa7\x1d\x10\x91V\tS\\SgX\xee\xc3\x07~\xda|\xcakj\xfe\xec\xd00GP\x89\xb5\xe1\xe4\x90O\x92\xe6lB~\x96\x1f\xf4\xab\xf1}\xba\xcaev\xb6\xd5VV\xb5\x1f\xfb|\xe6\x98/\xf6Bt\xa1\x82!\xe7v4\x7fc\xda\xebG\xb3\x0e\x90d\xdeK\xe1\x98:M\xc6\x12\x92\x1b\xdd&F\xed\xdd\xb4\xd9w\xf3+=*\x8f\x17\x8a\'\x8c\xbe\xaf?\xa6\xf0R\xd9w\xd4\xb4\xd9\x8f\xfe\xe6\xf2\xe6L]x\x8d\tB\xba*Y\xfd')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
class ConfigCategory(StrEnum):
|
20
|
+
admin=auto()
|
21
|
+
branding=auto()
|
22
|
+
general=auto()
|
23
|
+
proxies=auto()
|
24
|
+
domain_fronting=auto()
|
25
|
+
telegram=auto()
|
26
|
+
http=auto()
|
27
|
+
tls=auto()
|
28
|
+
ssfaketls=auto()
|
29
|
+
shadowtls=auto()
|
30
|
+
tuic=auto()
|
31
|
+
ssr=auto()
|
32
|
+
kcp=auto()
|
33
|
+
hidden=auto()
|
34
|
+
advanced=auto()
|
35
|
+
too_advanced=auto()
|
36
|
+
|
37
|
+
class ConfigEnum(StrEnum):
|
38
|
+
cloudflare=auto()
|
39
|
+
license=auto()
|
40
|
+
country=auto()
|
41
|
+
package_mode=auto()
|
42
|
+
utls=auto()
|
43
|
+
telegram_bot_token=auto()
|
44
|
+
is_parent=auto()
|
45
|
+
parent_panel=auto()
|
46
|
+
unique_id=auto()
|
47
|
+
last_hash=auto()
|
48
|
+
cdn_forced_host=auto() # removed
|
49
|
+
lang = auto()
|
50
|
+
admin_lang = auto()
|
51
|
+
admin_secret = auto()
|
52
|
+
tls_ports = auto()
|
53
|
+
http_ports = auto()
|
54
|
+
kcp_ports = auto()
|
55
|
+
kcp_enable = auto()
|
56
|
+
decoy_domain = auto()
|
57
|
+
proxy_path = auto()
|
58
|
+
firewall = auto()
|
59
|
+
netdata = auto()
|
60
|
+
http_proxy_enable = auto()
|
61
|
+
block_iran_sites = auto()
|
62
|
+
allow_invalid_sni = auto()
|
63
|
+
auto_update = auto()
|
64
|
+
speed_test = auto()
|
65
|
+
only_ipv4 = auto()
|
66
|
+
|
67
|
+
shared_secret = auto()
|
68
|
+
|
69
|
+
telegram_enable = auto()
|
70
|
+
# telegram_secret=auto()
|
71
|
+
telegram_adtag = auto()
|
72
|
+
telegram_lib = auto()
|
73
|
+
telegram_fakedomain = auto()
|
74
|
+
|
75
|
+
v2ray_enable = auto()
|
76
|
+
torrent_block = auto()
|
77
|
+
|
78
|
+
ssfaketls_enable = auto()
|
79
|
+
# ssfaketls_secret="ssfaketls_secret"
|
80
|
+
ssfaketls_fakedomain = auto()
|
81
|
+
|
82
|
+
shadowtls_enable = auto()
|
83
|
+
# shadowtls_secret=auto()
|
84
|
+
shadowtls_fakedomain = auto()
|
85
|
+
|
86
|
+
tuic_enable = auto()
|
87
|
+
tuic_port = auto()
|
88
|
+
|
89
|
+
ssr_enable = auto()
|
90
|
+
# ssr_secret="ssr_secret"
|
91
|
+
ssr_fakedomain = auto()
|
92
|
+
|
93
|
+
vmess_enable = auto()
|
94
|
+
domain_fronting_domain = auto()
|
95
|
+
domain_fronting_http_enable = auto()
|
96
|
+
domain_fronting_tls_enable = auto()
|
97
|
+
|
98
|
+
db_version = auto()
|
99
|
+
|
100
|
+
branding_title=auto()
|
101
|
+
branding_site=auto()
|
102
|
+
branding_freetext=auto()
|
103
|
+
not_found=auto()
|
104
|
+
path_vmess=auto()
|
105
|
+
path_vless=auto()
|
106
|
+
path_trojan=auto()
|
107
|
+
path_v2ray=auto()#deprecated
|
108
|
+
path_ss=auto()
|
109
|
+
|
110
|
+
path_ws=auto()
|
111
|
+
path_tcp=auto()
|
112
|
+
path_grpc=auto()
|
113
|
+
|
114
|
+
# cdn_forced_host=auto()
|
115
|
+
@classmethod
|
116
|
+
def _missing_(cls, value):
|
117
|
+
return cls.not_found #"key not found"
|
118
|
+
def info(self):
|
119
|
+
map = {
|
120
|
+
self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
|
121
|
+
self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
122
|
+
self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
|
123
|
+
self.license:{'category': ConfigCategory.hidden, 'commercial':True},
|
124
|
+
self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
|
125
|
+
self.path_vmess:{'category': ConfigCategory.too_advanced},
|
126
|
+
self.path_vless:{'category': ConfigCategory.too_advanced},
|
127
|
+
self.path_trojan:{'category': ConfigCategory.too_advanced},
|
128
|
+
self.path_ss:{'category': ConfigCategory.hidden},
|
129
|
+
self.path_tcp:{'category': ConfigCategory.too_advanced},
|
130
|
+
self.path_ws:{'category': ConfigCategory.too_advanced},
|
131
|
+
self.path_grpc:{'category': ConfigCategory.too_advanced},
|
132
|
+
self.path_v2ray:{'category': ConfigCategory.hidden},
|
133
|
+
self.last_hash:{'category': ConfigCategory.hidden},
|
134
|
+
|
135
|
+
self.utls: {'category': ConfigCategory.advanced,'commercial':True},
|
136
|
+
self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
137
|
+
self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
138
|
+
self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
|
139
|
+
self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
|
140
|
+
self.unique_id:{'category': ConfigCategory.hidden,},
|
141
|
+
self.cdn_forced_host:{'category': ConfigCategory.hidden,},
|
142
|
+
self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
143
|
+
self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
144
|
+
self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
145
|
+
self.not_found:{'category': ConfigCategory.hidden},
|
146
|
+
self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
147
|
+
|
148
|
+
self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
|
149
|
+
self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
|
150
|
+
self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
151
|
+
self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
152
|
+
self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
|
153
|
+
self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
|
154
|
+
self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
155
|
+
self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
156
|
+
self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
|
157
|
+
self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
158
|
+
self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
|
159
|
+
self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
|
160
|
+
self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
161
|
+
self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
162
|
+
self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
163
|
+
|
164
|
+
self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
|
165
|
+
|
166
|
+
self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
|
167
|
+
# telegram_secret:{'category':'general'},
|
168
|
+
self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
169
|
+
self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
170
|
+
self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
|
171
|
+
|
172
|
+
self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
173
|
+
|
174
|
+
self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
|
175
|
+
# ssfaketls_secret:{'category':'ssfaketls'},
|
176
|
+
self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
|
177
|
+
|
178
|
+
self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
|
179
|
+
# shadowtls_secret:{'category':'shadowtls'},
|
180
|
+
self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
|
181
|
+
|
182
|
+
self.tuic_enable: {'category': ConfigCategory.tuic,'type':bool,'apply_mode':'apply'},
|
183
|
+
self.tuic_port: {'category': ConfigCategory.tuic,'apply_mode':'apply'},
|
184
|
+
|
185
|
+
self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
186
|
+
# ssr_secret:{'category':'ssr'},
|
187
|
+
self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
188
|
+
|
189
|
+
self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
|
190
|
+
self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
|
191
|
+
self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
|
192
|
+
self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
|
193
|
+
|
194
|
+
self.db_version: {'category': ConfigCategory.hidden},
|
195
|
+
}
|
196
|
+
return map[self]
|
197
|
+
def commercial(self):
|
198
|
+
# print(self,self.info().get('commercial',False))
|
199
|
+
return self.info().get('commercial',False)
|
200
|
+
def category(self):
|
201
|
+
return self.info()['category']
|
202
|
+
def type(self):
|
203
|
+
return self.info().get('type',str)
|
204
|
+
def apply_mode(self):
|
205
|
+
return self.info().get('apply_mode','')
|
206
|
+
def show_in_parent(self):
|
207
|
+
return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
208
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/domain.py
CHANGED
@@ -1,5 +1,107 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x05\x1a\x00\x00\x12\t\x04\x00>c\x98F\xa5\xd7\xc8\x82E\xd8\x9c\xe63D\x91t\x00\x00\x00\x00\x00\x00\x00\x00I\xc6q\xecsO\xce\x94k\x8e>\xa8\xda&i\xdby)%\x16r\xd3i\xc2\x14,\x8aQ8\xa4\xfb\xc8\xc6:+\xed\xf5\x07\x1d\x88P\xad>\xc4\x01wu\x8c\x92\x86Z\x0e\x04\x01t\xefq\x9c\xb7\xbcJ\xb0\x9c\x7f\xe4R\x87\x80\xe2\xa0k\xf0\x833\x18[\x90\xc3\x06B\xc5y\x9e\xf1eva\xed7\xae\xe2\x7f\xbaI\xe9m\x8f\xba\x91\xcb\x13R\xcd\xbe\x80\x92P\x16e\xe5\xb1\xdd\x80\t\xdb\xe2\x9f\x05\xc4\xbb\xa6\xef\xaeP\xd6\xfc\xe9Q-!\xa9\x06\xa6\xfd\xbe`\xccM\xdc\xf6\xf9\x19\x94\x06\x96\xcb\xfa\x0b\xa9\x128\x86\xaef\x8f\xa6:\x8a\x7f\xf7i\r\x03%)\x16\x84\xe8\xa4~\xc7\xd9\xac\x13\xb2\xf2\xd6\x1e\x88\x1f8%\xa6-\x17\xbd\xf9\xa1Y\xad\x97\xb0\x89\xb0H.\x8e\x15[\xa7\xfe\x93\x11\x9eA\xcc\x84\x1b _4\xc9\xc8\xcc\x10\xe6\xd51F\xabk+2\xb0\xcfq\x16,\x0bp\xbf\xe2\x18\xa6^\xadu\xcbK?\xf6lb\x1e\xc547\x147)\xc2\xf3Ba\xad\xfc\xa1g\x97\x0bd\x1c\x92\x1c\xf9aP\xbd\xa6\x9e\x962D\x13h\xeccJ6\x9f\xfbK\xb2_<\xd7\x16k\x0e\xbbd\xf4\x9e\xe5\x80\xa8\xbc\xa3?\x0f\xc5k\x85>\xaf\xa8\xa9\xaa\xe8\xb2\xeef{\xc1\x8de\x96~\tO"$N\xe0S\xa1\xfc\xf3\xe0\xdc/3Lz\x8a8Iit6\x83%m\xac\x84\xb3C\xa9\xad\x90i.8\x10cdM\x91:\xd8SQc\t\x1aN\x7f\x88\xdd\x86\xa4=W\xb8\x90`\x94~\xcc\xe8\x1d{\x0cD\xf0H\x87\xc1}\n;\xc2_\x9d_3\x9a\x18Xm\x18;+~\x14\xdd\xd7\x84\xff\xaaX\x7fm\xd3g\x9a\xbb\x01y!\x05c\x1f\x0b\xb9Y]\x17\xed=\x9b]\xe5\xf3\xaeO\xaa\xde(\x08/\x14\x19\xf8^\x183\xdc\xf3\t@\xe9a\xc7\xd1\xbck\xfe\xe8\xe4Y\xe4\xf5\\4\xfe:\x11\xb4D\xf6J\x05\x04_\x85\x0f\xf3}\xe1\xf2\x91\xad\xff\xe1\xab\x10U\xfd\xf1J\xc67:\x97\xfbC|y\r+\xf2eH\x9a/\xa1ZR\xc6\xb3R\xf9\xb6V\xc0\xc2\x02U\xaf5X<\xbd\xc7\xa3\xd5r\x1f\x92xZ\x81\xb2e\xac\x7f\x7flh-DDqy\'\xc0\xf6Ze\x8eP~\xd0\x07\xc1\xe2\xbe\x00O6\t\xc8h\x0e`\xa8O\x88\xaa\xde82\xb2X\xaa\x13\xa2\xcf,,\xfc\xcc\xc2\x01\x8crg\xaf?\x15\x88\xa7\xa0\xea+U\xdd\x86\xdd?\x86\x96\xdapN$\xa2\xf8R\x9e/9\x92\x0b\x90t\xf6\x93\xd4Z\xa2\xd8n6\xb5\x85\xd3;\x9b\x8d\xe9\xaf\xf4\xbd\x91\x8b\x94\xb2gi\x8d\x19\xd6\x1eG\xd9\xd6\xceL1\xf1\xe9X\xf4\x08\x05\xab\x0c#*]\xf8\xe1z8\xf0\x07\xf2P\x1f\x07\xd5K[\xa5\xe3\xc8\xa1\xee%\xcc\xf7*\x91\xa856}\xbc\x01\xf4\xa3\xb6"Q]\xcae\x19\xee\x8e\x1a\x7fy\xfe\xf7\x9d\\\xca|Yx\xb0(\x06\xf4\xec\xa0*\xd4\xcb\x8bJ;\xd7\x8c^\rU\xd4\xadZ\x02\xd6|\xe0e\x8d+\x19\x9c\xd5\xa5\xab;\x0e\xb7F_\xbbZf\x9d\x8d\x93\x07\t\x8f}j\xb5/\x1c\x08\xc8\xb14\xaa\x14\x93\xa3\x14\xe1\x97\xb0\xe9\xd2@Y\xfd\xa8\xde\xb7\x85\x00\t\xb8\x82\x0f,\xb8t`\xe3\xca\x93=\xc8\xaf0\xe9\xd8OT\xf5\xb0\xce\xab\xb8\xf4P\xe3t2\x86\x12\xff\x8f\xbb\x81\xefZ=\x94-5z\r\xf6\xbd\x01G\x84aL\xcexL\x00G\'\x82\xef\xd6\xcf%\xfe\xea\r\xe0%\xf9n\xfb\x01 \x18gk\xcf\xfdS\xd5mt[D\x0cx\xd1m$!\xa8\x8a\x96\x01\x9b\xc6F\xb4\xa3\xc56\xd0Y\xc3\x17\xa9\\\xad\xc8n\xe4\xd1\xdc\xfe)Y\x17\xffV\x0f\xb9\xa9\xc5\x87gn\xdd\xdf\xa4\xd9X\xb5d#*\x17\x92\xf7\xbb\x9e\xeb\xf4\xec\x11rR\x83\xc5\x16Dp\x94\x8f(.$\x94z\x95Q9\xef=\xff=\x96\xeb\x85\x96\xa5`\xe5FJd\x17s\xc1IH\x1e^\xecv\xef\xc4\x1a\xed{\n-\xe7\x9c5\x9b\xc4}\x92+OH\xcaG\x92\x00]\xa1\xee\x1a\r~\xd9^,?\x19s\x13\xa84=\xf7\x83\x02\xf7$\xe8\xc3t\x10\x94\xc8\xc6Y\xa6v\x91\xfeL@\xfap)t\t\x98R\xa5\xd0\xdb+"\x10<\xe8/\xfb\xefy\x8fL\x95y.\x1e\xc4\xdd\xe5m\xf3D\x99/6|\x80\xc0\x15A\x15\x96\xe4\xf3\xaaR\x8b\xe0s\r\xaa\xf0\x895\xa69\x85\x94~X(\xb8l\x86\xf8\x15\xd1\xe6Q\xc7\x8bK\xb5\xeeRf\x80\x08d \x7f\xc2{X\x1b\xd2\t\xd9\xa5\x81jG\x11\xecEP\xda7\\\xbe"\x062\x8d5]4\xf6\xe1T\xfdn\xd4>\x9e\xfc\x0bZ\x0e\xc58T\x9f\xf9_a\x9a\xdd>\xe5)u\x86\x15Dq\xeb\xd7\xc6\xa8X\x0bj>\xfd\x05\x12\x85\xaf};\xa1\xf9\t\xd0\xb7\xf8v\xf7\xc7\x845U\x81\x08cy\xbe\xbc\xc8\xfa\xe6\xb7B\x8bw1B\x87*H\x89M\n\xbd \x95d\xc1C\xfb}@|\xfd#\xab\xc1\xf8^\xd2\x91\xa0&i\x1f\x8d8x\xedk\x9dx[\x05\x00\x9c\x7f\xdb7\xe0z\x7f\xccW\xd5y\xefxB\x98\x08xG[t\x17\xb4t(^\x9d\x00\'!\xec\x19\xb4\xfa\xbf[r\xf4\rf\xed\x10\xd1\xb0\xef\xbf\xf3\xd5\xdc\xe3\xf7\xe3H\x0cv\xc9\xb4\x1bTX\x99\x97\xac\xbe5\xc8Y8\xbd\x91\x80a\xbf\x86\xab\xde\xe8h\x19;\xa4\xbbo\xb1\x0f=k\xc6Ic\x9e\x07w\xf9Y\x81\x95\xe4>y\xb6%D\xdfv\xdf\x99<#\x18s\xd0\xed\x04{\xcc\xc9\xb5=)\x87\xbe\x11\xe9ny\xfc\x82w\xa5(G\x90t\xae\']\xbe:\x0f\xd07_\xe6\x10W\xbbA\x04\xe2\xb8\xe5.\x8d\xb2:|\x1cf\x8a2\xd1C$*m\x0b\xd5\xf7L\xa1\x1b\xfa\xed\x8a\x84A\x8dX\xa6\xb0s_\xc8\xefQ\xe0B\xd1C\r\x1c]D\x7f\xe3\xc01\x86\xfd\x95y\xcc!\xca(\x1dza\xc5\xda\xc9CJm\xa2\x83\xecpv9\xd1F3v\xa2bdD;jV\x99\xd7\xdaV\x84\xd2\xc8|\xc5@\xeb+c\xa8.\xedeh&\x92\xf1H[\xfb\xf8x\xd3\xd7<\x82y\\>\xe1\xc3 X{\x8e\xe7U\xe97|Ce\x0eR\xd2\xf7\x913\xc7Z/u\xdc!\xea)8\xb2?\xbc9E\x1f,\xd0\x12\xc6\xec\xc8\xf7\x16\xbe\xeb\xc8\xa2\x02\x06\xa8_\xda\x97\xd0\xc3\xdaA?]\xa8]Z\xe7\xd7\x03:\x9b\x9e+\xdaX?\xab\xd4{Tf\xbf\xbfE\xea\xad\xf2\xb1\x1c)P\xbf\x85\x05\x17\x05\xa6\x97%R=\\\xe8\x9fG\xd9\x91\x1a\xdfg=D\xb0\xcf\x00p\xda\xcb\x92L*7F\t\xa0\xf1Ro\x9b\xb6\xcb~\x85\xa2\xe8y\x13\xdc\xfe\x10\xb2\xb0\xafJ\xac?h8\x15\xc2\n\x12\xb5Q)LH\xcb\xa6\xe6\xc8\x07e\x02\x86%j(\xadLJ6\xa1\x8f\xbf\xe7\xa8\xa7)\x0b\x0f2\xf8\xa50\xe2\x96\xc5h\xa5\xb3\xa8\xeeeI\xb6h\xbf\xfc\x11}%\xc8\x84l0\xb2l*\xf6\xd5\x0c\xa6L\xa0>\x92\xbfzk\x04I{\t\xf1\xed\xdf\x117w]\x80\xaa\xc3\x06P\x9a\x84\xfe@E\xbd\x17\x17\xbd-\x14\xef\x12\xcfP\xcb\xc6\x9bJ\xbf\xc7\xf5L\xcf\xb5S\x8a\xe8\xe0\xb5\xa4A\xef[9\xdc\x14\xd8\xd4\x07\xe4\x1a\xd0 \x90\r\xf4~J\r\xea\x1dp\xbc\x0e\xb5x\x9b#yD\x9f\xfc(g\x11\xfe? <i*\xf7\x005-x{\x0c>\xa1 \xc0a~\xfc)\xd6j\xfa\x8c,\xc4"-\x11\xbcS\xf5-\x87\x85\xb6\xa5o\xf4-Z\r:K"{\x0e\xd7\n\xb5}\x08\xaf\xc3\xafi\x8c\xd1\x15\x82)h\x01D\x01\x00\x1d\x14\xf3O\x7f\xaf\xce\xe6\x9dM\xd0Q\xad\xd9\xf5Ueb\x91t\xdb\x9b\xee\xd0\xe3y\x9631\xa2\x82\x15H\xf7-i\x04\xcc]\x9d\xcf\xeb\xbc\x02(\x127\x91U\x16\xeb0\xcb?2o\x9cQ\x9b\xe7\xbf\xf2460\x8a@\xde\xf7\x0eP+\xc0\xf8"\xf3nA,\x96\xbdm\xab\xfb)$0\xc3\x0f=\xbd\xb9\xfa\x95\x17\xe0P\x16d\x81\xda\x06\x10\xb0\xdb\x03!\xe59N\xcf\xfbxV\xd8\xda("kzI\xe6\xe0\xe3\xbe\xec\x06\x8c\xdd3\x16\xd9\xe9\x85gt\xec\x8a\xc6[$\xf7\x0b\x86\xff\x168\x8c\x8d\xf8\x002Q\xf9v|\x9a:\x0f\x93\xa4UX\xe0l\xf1f\xdfW\xa6r/.&e\xdb\xfb=5`\xde\xc7\x7f]\x9al;\xc9z\xa5\x80\xeb\xd2t\xc5\xb9)\x7f\x80\xde\xbb\xe2\xb8i\xd9\xc9\xf6e\xa7G2=\xac\x9e+\x13ra\x8c\xbf\xcc\xa7\x18\x17pb\xc1\xf1=\x1c\xcef\x0b"3\x1d\xf1@\xde\xf5?R\xd4\xefs# 5U|i\xad\x87t\x8e\x87o\xbe\xc5\x94\xdb\xb1\x85\x10\x8d\xd6b\x83(\xc5\xf9m\xfb\xfa\x90MF~e\x1f\x97Go\xf61|\xd37\xb5\'\xc4\x1a\xdf\xf6$\xd9#\xa7\xff\xb2\xa3\x92_\xf9"\xa4\xf7E\x17)\xa2\xe3\xc7\xb6\x0e\xca9\x94\x17P\x0b\x82\x88\xe3<?\xcfz\xd1;\xb0\x88\xe8\xcd\xbfW\xb5\xf6\x98\xde&c\xfdD\x01&\xb3\xb4\x9bX\xc6\xf6\x00\x93\x9e\xb8\xfbM\xa3\x14\xfe\x9e\xedX\n\xb6\xf8\x11B\xa8\xe3s-#/\xeb\x8b\xb4\xa8\x04*\xa0q\xd4\x04$\xc4m\xe8\x81"\x8a\x01\xc9\r\xcdA\xc7i\xf1\x12\xf8mu\x94$\xac\xc0|\xdc\xe6}\xe2\xb7\xe2\x88\x1dl\xbc\xee\xe4i\xb0{\xfd\xe9)s=j+\x92{\xea\xa5\xe6\xcf:\x01,T\xb4]\xf8\xbd\xe0\xb7\xd7\xe7B\xec\xdc\xf2\xcc\x12 ]A=\xc8\xd0\xa3k~\x8f\xc1\xee\x96l+\xa8\x93\x94\x9d\xdd_[H\x13[i\x0cy\xd2\xfa\x8f\'\xb1\xc1\xd7\x82;\xd6k\x00\x88\xf1+\xeemM[\xaa\x99\xd5\x8f\xc0\x99\x0eA\x1a\xd3\xeck\xdfZ[\xd6\xdbR\xab\x98\xc3\xeb\x81\xfb\xd1v\'\x00\xff\x8b\x97\xcba\xb4\xb3\xe8\xb3\x84`S\xb5\x0c\xaaX\xca\xfdp\xdb\xa9KJP\xb5\xbdJs\xa6\xc1\xa1Z@\x06\xc7\xa2\xfe \x94\xaf!\xce\xd8\xf1\x06\x91r\xa4N\x12\xb2\xa0x\xd0\x02\x08G$\xd2\xee\x96l\xd1\x1b\x91\xbc;\xdc\xb4\\\x8f\xa7tF\x15\x1e\x93c\xb4\xad\xa9\xad\x18s\x1d\xdb\xbfN\t\x7f\x00I\xaad\xe0^\xa7\xa3*7\x99P\x07\xd3_\xd2\x03\x9b\x8d\xa6\xdd\xfb\xe8[St\x0c\xe7TB\x9d\xf6\xaf\x0b\xb32Y\x8c\xf2}j<\xe7\xad\xcf\xfc(\xf2\xb1l`A\xddt\x10\xef\x99M\xe1\xec\xadUY\xe8\xa2\xe3\xa5\xb5\xdeb\xa2N\x99\x0b\x08\xaa\xaa2\xa7\x10\xa7\xf3\xef\x1cV\xb3\x7f\x89!\xd8\x8cy\x91H\x8fU\x9b\xe9\xba\x93\x86~\xcb9\xd1\xac@\xbf1F*\xfar\x14\xb6\x08\x81\xbb\x14b\x9d\xc0\xe8\x97\x8a\x89\x0e\x7fT\x94yG\\\xb1\xa7\xc2\x84{r\xf559\xb1\xfa\x8a\x1f^\xbd\xee\xca\xad\xea\x92\xb0\xf4\x88\xff\xf7\xac&\x07\xdcN|\x8fF\xa9\x1cG\xe86TE\xc7\xd6\xa6I\xe7\xa7\xe3\x1b;\xfb\x12\x8f\xa2\x90\xd7\xe0\x86T\xc7\xe9N}\xbc\\\x89Ru\x1a}H\xe8\x9d/\x9b\xa7\rUGu\xcfQy$=(\xc1\x98\xde\x8c:\xe3\x0bg\xb3\xc9\x1c\xd14Z=\xe5\x93\x83k\xf0\xea\xd1\x0eWd\x0bB\xbd\xd3\x14\x92\xb2\xde>\x04\xd5\x80\xf4z[/\x9a\xa0\xf8h\x07\xbfI\\\x04/\xdcY\xc8\xed\xee\x14\xfa:E\xdc\xb9\x0c\xf0\x8d=N\xed8\xb8R\xc6\x0b\xbc\xa7\xed\x85\xfd\x8chT\xe9\xc8\xbfL\xf4G\x04\xc8\x16\x11n\x87\xa7$+\x9d\xaa{\x93.`\xdd\x85b\x1b\xf8\xacAq\x8aS\x89W\r[\xe0C\xcc*\x1e\x96M\x19\x9b\xc6|\xf6\xd4\xcb0\x89\x8a\x8dkj\xf8\x9euC\x90\x96D\xe7\x8e)\x9f\xf4\xb8\xd04\xb6\xdb#\xd0sF\x8d\xdd,]`\xce\x14m\xa2B\xe8Js\xf7\xf5\xa2\xb4\xec%}\xbb?\xa2\\\xab\xab.m\x1d\xfc\xc0W\x8b\xe9\x9fh\xf3\xa5 9"\x9e,\x04\xf17\xe9:F\xc0\xe3\x8c\xa6CJ\xb7\xc1ulW\xdb\xfe!{r\xf1i\xb0\x10Km\xc17\xfc\x80\xb1\xf9\xd8]\x02Nn\xd8\xbf\x8e\xd2#7\x0e\xd4\xd3\xa7N\xa4\x1b\xd9Z#0\x91\x90v[\xe2 \xf6BY\xdf9\xfe\x14\x92\xa64\x9d\xb0\xa8\xfa77\xef^X\xe18\xbc\x9f\x99\xc3\xef@r\x89~\x944\xdd\x1em\xeb#\xed|\xc0\x03\xd7\xa9\r\xf0\xe3L\x04\xf8?\x8a#\x9a \xf0\xfb\x97\xccKm\xf5y\xa69=\xedvRb@\xcf\x16\xbc\xb5_\xecm\x18\x9b\xd9\xc1VG\x1c7\xef \\\xec[R\x89\x86\xe22\xfd\x06\xda\x9bD\x85\x803x\xf2!\x89\x98\xe4\xcarT\xf5\xd5n\xa3\xd15\xbd\xc7nh\xc0\xed\xf0\xd0G\xd7\xb6\x7f\xe4\xe9H\x02#D\xf0\x82\x91\xcd\x92\x19\xa0/\xa5q\xb1\xd3\x81\xac\xe4\xae\xbbw\xd6\xf3\t\x92w\xa3\xcc\xa8].L\xf7>\xc9\x0e"o\xe0\x9e\x00 |\xca\xbb\x96\x9a\xd6\xfe\x9a\xe0\x82l\x8dt\x99\x81\x19;\xfd\x0e\xba\xb8\xd9\x08O\x89\x91e\x83\x19Kv\xee\x80\x96\xc7\x0fA\xcf\x82:\xa5\xa5\x99m\xa2\xc2\\\x11\\\xd0"p\'\xc8#\xa2\x98&\x9b;\xb9\xf8\xb0Q\x03ko]{?\xf0\x7fd\xe2\xe6\x12\xe8\xde\xf9\x12Pt\xe8\x926\xde\xe7\xff\x14\xf5i\x88N\x8a\x89\xac:\x99\x02\x96R\x99/$\xf4^4\x16Q\x96\xe6\x9evh\xb0*\x95\x819\xf3\xb9\x96\xb0+T\xc9M;\xa6I~_\xc9I\x19\xb0\x9dB\xfb\xcd\xbb\xec\xf8\xeeK\x8b.\x83\x84\x86\xf2\xe5\x81>9\xde\xcffJ~\xcc2\xc1\x9bCT\xfa{Y\xcb\x95\x98\xd3#\xa6\xb8\xc4\xd6\xa0\'NK\x19\x1eX\xda\x1d\xcc{\x02yS\x13\xa3\xe8c\x1e\xde\xd2\xbd\xd4\x897\x9e\xa5u\xae\xfc\x17\xd4{r\xcaiN\x80\x19 =\x15\x12\xd0"\x03\xde\xa7\xab\xf8\xd9\x08-]\xc9:{r\xeb\x9c\x1fm~ \x15\xfb\x0bxJ\xb7\xc7\xed<Ak\x05\xc8\x81\xa5OB!\xed\x04C\xe4\x97\xc6.\x9a\x1a\xd2q\xd3\x90\x0e/\x04\x94/\xd9\xc2\xf9?^\x9f\x98\x04\xa6U\x0cn\xa0\xc5i\x80\x08#\xd9\x84VX~7\x0f\x0c\xc9\x93\xd7\x8fng\x11\x14\xfe\r\xaa`\x08\xb7\x86}\xd4$U\xf5gq\x9a{\xbe\x87\xbc"\xfe\x1eS\xdc\xec\x9f\x7f_\x03C\xdc\xb5\xba\xdcx6|f\x82g\xcf\x1e\xccZ\xe8\xda\xe6\xd1\xb96\xf3(\xd71\xb8\x18T\xea3\xf8\\\xf7\x04H\xa3\x02M\xa8?=\xb1\x8dG\xc9\x00\x91\xdf\xdb\xc2v\x1a\xf5\tt\x14\xc2\x03\x92\xa6\xbd\xa4]\x1f\x8d\xd0\x14x\x93\xe7`b\xe9\xd6\xbba\xfc\xdc\x16\x9f\x00\x18K\x1b\xea`8\x1a?\x12\x15\xd9\n\x08\xcd7TJ\x96X\x9e\xc2>\x02j\xa5\x19H\xf0a\xdf?\xb4a\x0bFL\x96\xc5u\xe42\xfe\x80\x8e\xfe\xf6\x7f\xf3\xe2\x1cu\xd0-\xb8\xdc93{\xa7;Rf\xde\xd4\xb73\xc7\xee\xd9\xdb\xc8\x00\xc8\xd1\xa7\xebv\xdfI\x08\x06\x16%\xeb\x959\x85B\x99{\xcb\x06\x95\x96\xf4\xfc\x15/\xc8\x12\xbf\xd9M\xeb5Vl\x91\x9fh>u\x85\xa4hN\x9ey\xab\xe4\xc8\x90\xc7\x88\x7f-\xe5M\xc1R\xa3\x16\xb7Y\x83d\x11\x03\xb6i\xae\xff\xdfA\x91\xf4\xc7\xe2\xddj\x92(\r\xd0\x11e\xd1\xb9\x11\x04\xc3\xf7\x16\r\xfeS\xec\xae\xdf;a\xc0.\x14\xc3o;\xa8\xe8X-\xa8`\x82&\x95\xd6\x8cgqV%\x1b\xae(\xaf\xf0\x07J,$\xa6\x0c4W\x1d=\xb5\xb5?"C\xe7\xce\x85\x9b\xdb\x81\t]\x8fL\xf5\xa2\x16\xba\xe1\xadm!\t~\x85r\xc7\x0b_\x81\x87\'\x05\xa6\xde\xf4\xbc\xda/i\xcdb(\xe57\xb7K\x0fV\x9c\xd9\x89*\x0e\x1d\xcc\x0f*\x08\xae\x93W\x9c\x16Z\xbff\x9b\x83#\x01\xdf\xbd@\'D\xcc\x80\xe2\x9dY\xa8\xbe\\\x19|\x96\xdeu\xbe\xa2\xa2\xa4\x85\xb6\x7f\x10\x02\x0f\xb7\xd0\x84v\xc3r\xd3MN\xc8\xeb6\xedu\xbb\xd15*\xca\xc0\x87\xd6\xe3\xda{f}Jbi\xd0\xc6n\x95D\x1e\xc4\xa1\xad\xb6:)\x9d@\xfaL\xe4\x1f\x9a\x1aX\xf0\xc5\t\xde\x08\xc8G\xc6\xbe~\xce\x14\xc5\xaf\xdaf\xce\x8at\xd3aG\xaa\x14\xa00(\x01D3\x0e\x92bw\xe5\xa1H\xd7:\xab\xc4\xd5\x07\x15&GZ\x1a\xb6/<\xd3\xf9\x82\xa9\xfe\nh\xcc\xf1\xddS\xd5\x90\xd7!C\xf3\xa6,\xd2a\xaaxoE\xa3\xe7M\x00\x9a\x80\xf0Q\x9f2\x119\xecO\xb4v\xf4\x9f]G\x1c\xc3\x0c\xc4\t\xa9cW/\xac\xeaM\xe4\'\x19C\x87\xcc\xb5Xi\\"\xa5\x1c\xcc=\x8b\xe4L\xc5N\x85p\x92\x95M\xf0K\xdd\xde\xd5\\\xb9\xad\xf2\x96\\\x9a\xb2M\x8cU\xd8~\xfe\xab\xd5*e\x92\xef\xfeW0\xa5\xf7\x1d\x994\x13!\x0b\xbeC\xc8?=\x17\xc96\xe7ie\xe6.\xef\xda\xa5\x0f\xcc7Nl\xe26}\x99\xac\xac\xb2\xa6\x95\xeaP\xd3yF\xf8\xf8\x80\xe1D\xca\t4"S[E\x98\xe0\x94\xc1\xaf\xc6-\xcb\xa1\xeb\x1d\x89\xff\x1f\xdb\xed\x0c\xc0\xcb\x1a\xf3\xd4\x1e(_\xf4\xfe]\xfbZM\x9d7\xfeJ6\x19\ro\x0b\x92Q\xe0\xe8L\xe1\xbbY\xc9b\x85\x89\xb5\xe7_Q\t\xf9\xc4\x99\x13\xe1\x17\xe7np>3\xb5\xdb\x01\xbcz\xf8(\x89\xb4\x06[\xb1\x93\'\xad\xf1\x15\xa2\xf8\x8b\x1e?\x8d\xbf&\x80\xc5\x99\x13\xd8\x1ep~\xaf\x0e]\xca\x0e\x96\xed\xef\xeb\x1a\xcce\r\xd9\xff4\xb7\xfa7\xd0\xfeX\xf6\x91\xc4\xfa\x9e\xc4\xb2Z\n\xc4\x06\x1dC\xbe\x89\xd1h\xe0R\xa7\xc9\x87\xf55\xbeQ\xf4w\x7f\x882\xf1\xc3\xfeR\x1a\x1c\xdb\x97\xd62Y\x8c\x88\xddA\xa7_\xc0\xf0\x97\x08\xac\xc0\x908\x17\x82i\x95\x0c\xf8t\xc4k\xba0\xbd&aNw\x19&a\x8e\xd9\xcc\x1a\xdd>\x8b:\xb5EM\xcdI\xf4`\xa5\x15\xccIG\x0e\xb9\x81\xa5 \xd1\x17E\xb10\x0fn\xe1\x00\x12K\x8dl\xaa\xa2\x12(-B7\x85\xa9\xaej{4l\xe5\xb8\x16\'\xf6\xde6\x84]\x8c\xa7\x1ebZ\x97\xe5\x11\x9c\x85\x99\xc6\x9f\xbfbl\xb1\x88\xc7\'\xb3Y\xbc\xfa\xb1\xba\xa7\x90\x17\xdd.p\xbf\xfe\xf3S#\xe43!\xb8 ?w\x9b\x88\xf4\xb7>\xd6\xa8\x10^pj\x82i\x1bbf[]\x82\xb5v\xe6\t\xf3\xad\xa8\x9d\x12]^\xcb\x10;e\xf1\xd9\x86v\x17we\xd0O\xc7\xb0\xe7\x06n\x00KV\xffk\xfa\xb3\xad\xad\xe7ger!\xc0l\x05y\x01Q\x97\xc0\x1d\xd5\x0f\xc2\x9c\x90H\xb2\xc9H\x9bR\xf8)\xce\xc0g\t\x04\xfc\xc1\xc0\xbf\x88\xfa\xa18x\xdc\xd8\x0b5\xe6\xad\r5\xca\x98%\x17\x05\xd6\xf6\xd9\xc7\x0b\x17\x01\x8a\xc9FI\xa5cj9\x1a\xd4NtS\xd9\x94j~\x03\xdc4\x02\xcb\x13\xe5\xb9\xb1\xf3*\x86=\x80\xc5\xe6\xb3\xb7\x99$y\xf0\xbd\xad\xae\xc1j\xf9\x04A\xd4\x1d=\xfe\xd9\xc6-\xbb\xa9\x98(f\xe0\x0eth@Q|H\x15\x1a\xaf\x84\x91\xd0X\xc8\xe2\xcc\x12\x90#\xe3W\x17g\xd5\xb8\x8cq\xf7\xce\xfeut\x11\xba\xe5W\xb1\x12L\xec\xb47w\xb8\x00\xc9\xe4N3\xb4\xe7j\xb1\x1f\x0fY1\xcc.\xd7&CQ\x88\x9d\x94\xed\xca\x964\xaf\x16Gv\xb6v\xdd\xd2\xf1\x0e\xb6\x9c\xe5"\xfe\xa5p\x1c\xa4\xd38\xf6O\xb6\x85j\xc8\x84\x1b$\x12\x7f\r\xfc,\x93#\x82\r\xe0\r\xfd\tM\xd3\x9c;\xa8X[A\xec\xc6\xc9\xa5\xaa\x0b,\x86\xf8\xf8\xfdv\x86\xbeP\x0c\xa1\xea\xc7\xef\xb5)\xf5\xa3\x9b\xfc\x0c\x9c\xaa\x0e3\xa1\xe4\x920\xb6<\x1f\r \xa1\xe1\x8a#\xd0w)9_f\x91\xc0\xdb@\xef\x9e\xea@\xd6I\x0c\xaeh\x0cf\xfb\xac\x93\xe7\xdd}yu|\x82\x9c\xe1\x0f\x06t\xbd\xc1\xed+=;b\x9a\xf8\xb8Z\xba\xd6\xf6\xcf\x1fE\xe3\xd4j\x140\xd6=;\x9a\xd1\x87\x14\x18\xe3\x91}Z\xba\x81\xb9r\xf5$8.\xb2\xb5\x1f\xdd\xca\xac\x9fqGa\x93\x15\xdakK\xd7\xd7\xf0\xfa\xbd\x82\x1f\x84\xd6\x9d\xf6Z\xeb\xe3\x92Y\x95\xbe\xf5\x94\xcb\xf4\xfd\x06\xb8\x84\x88\xa3\x12$ \xdf\xad\xac\t\xe8\xed$H\xf1s\xa3l\xea\x0b\x8a\xb11\xf6[\'\xbc\xc3P \xbf\xe6\xf5^\x07LKze|\xbb\xb4h>A\xed\x8d\x10\x0c\x01\x9a\x84\x03\xe8"\xdcO"\x86bMw\x8a\xc2\xa5\xae\x0c)^+\xdf>\x89\xe1\x15Q\xfd\x9c\xc63\xd6\xde\x03I\xeb\xfaJs\xaf\x1d\xdd\xcf\x85\xad\xfb\xd6n\x9a\xc3\x8b\xfe\x13f\x1a\x85\xf4\x9c\xf3\xa0\\Z\x06y\xea\xe7Ep\xd4\xefI\xb1\x9a*s\xe4\xfe^\xdc\xfc\xfb3\xde\x03n\xee`\xd5y\x90h!\x11E\xc9\xcc\x15\xb8l\n\xa9\x15+\x0eF\x07W\x94nq4\x8e\xf9mY\x1a\x8b\x93\xc0#\x07\xbf\xd4DF\xad|\xb04\x08\x19\x03\xca\xb1A?\xa7\x7f\x95\xe2r\x7f\n~\xe3\x10w"\xa2\x1eL\xf4\nq\x1a\xcdg\x8e\x12\x08\xa0D\x0c\xf8I\xfe\x07\x95&n\x18\xa6\x98\x86\xeb\x896Q\x89\xc3\x13r\tS\x92O\xfbS\xa24\xf4\xf8\xab1n\x1f\xcd4\xcf\x17\xde\x91\x07\xea.P\xa9\xd4\xd0a\xfei\x99\xf1g\x05U\xe1QSQ\r\xd3,\xa2"\xf5\xdc(`\x01\x9a4\xbb\xd6\n\x1e-\xba\xd2\x82v\xac\xf57\x07\x1cP\xfa\xfdx\xc2\xc5\x83Y\x07`L\x87\xc1k\x99\xf6\x88dN)\xc4R\x18\xddW\xc9\x16\x91-b\x9f v\xb1p\x8b?\xee\xf9\xd2\xce\xb1\xe4$/\xeaVJ\xbe\x98\x1aNG\xde\xa9\xfa\x0b\xd1-v\xbdoB\x9b\xc6\x84\xf1\x86\xf8\xa2\x87\x96a\x08\xb3\xb5\xa6\xe7Y\xd4\x00\xb4\xcf\x93rwm&\xd3)^\x8f\x11\x91\x1c\\\xab\x19)62\xea\xffFhF\x1dq\xf3,iT\x0b\x97l_lI42j\x1f/\xb0\x9bt\xaf\xe7\x83\xd2\x9b\xae\xfeZ\xf0\xc4\x01\x92rp\xb5\x0b8c~\xba\x95\xc5\xfc\xc7\xfa\x98\xca6\x00\x8eT<\x87$k\xac\xbeNf\xb6:\xec\ti\\\x1d\x0c\xd3E\xf0S\x82\x90\x93J]`\xf0\x80\x18\x9c\xd0{9&\x81\xbc\xa2\xdc\xaep\x8b\xbf\n\xadpH\xd0\x12i\xe3)\xde\xb8w\xdb\x82\x1e\xedk~\xb4\x9b\x0b\xa5\x14\xd2\xc0\xf130\x94\xb2\xf8\x0f\x92\xc7\xeb\x86\xa7`\xd8k2_\x84\xbf\xeeU\xaaR\xf51\x9b\xa4DT\xef\x8c\xe7\x89k\x9d\xd2\xd4\x89\x7f,\xf7\xae\xc6\xff\xa7\xe5xc\xcc\x96\xe6\xd4<\\]e\xe1\xd6\xc2z\xb2\x08\x92X\xd4\x9c\x9cB\xd8\xfc\x02B\xa1\x000\xa9\x17\xcf?\x12\xd5!\xbe\xa3a\x86z\xfa\r\x9br\xfa\x13\x0c/\x98\xa4.\xfa;\xcf\xba\xcb\xb9\x86\x97\xa6\xcd\x8e\x8a\xb3\xb7\xa73\x17\x86\x16H\x81\xdap7T?j\xe0y\x15\x00\xd3\x06\xf3\x1d\xd3>\xfc7}%\xf0H\xdb\xd0\x91C\x10\x95W\xdc\xcdV\xcd\xe8\x0f\xc9c\\\x8e8\xb4z\x08\xfb\x02u\xcf\xfd*$~ j\'\xb4\xf5k\xbe;)\xbf\xf4O\x00_\x062\xa5\x0f+\x00\' \xaa-\x19P\x02<z\xfb\xef<\xaeM\x03\xa6\x96)>A\n\x91\x8c:#<h_\r5\'=\xc5\xfdar\xd9\xa0F/\xf7\x18>5\xa2l*6\xd1H&w\x9b\x99\xfd\xa26\x80\x8b\xcaG\xa5\xe6\xb6\xbfp\xaf\xa3(\xafSf\xf4\xace\xc2a\xf5\xd3\xac\x01\xc1r\x03\xd9\xd5 \xc9d\xae=\xcd\xa5\x06m\xf00\x1f\xccXy\x84m6d\xe5u\xea\xb3\xfd\xf0\xc0\x03\x98\x81\xff\x94d\\d\x13#Y\x12\n\xccY\x11\x9f\x0c0\x0f.\xdb(h>\\\xd5d\xef\xf7\x07\xccn\xeeLB\xbd\x93\xa87\x9b\xca\x9aC\xe9\xb5\xdf\x13\xb6\xa1\xd5\x1dh\xfe\xbb-D\x98\x00\x00/L\xa2: n\x9e^\x06\xb5\xd1\x13\xf5j\x95yT\xecG\xcf\xdc\xe3\xb8IA\xa9\x0f\xa8\xca>\xa9#pz\x05g\xc5\xa9<\xc3\xc6\xe9\xe9\xb9(\x91\x7f#\xf4>\x0bON\x125\x89\x1blF\xd5\xeb\xc6\xd6\xf8t\xb1\xa1\x0f\x16V\xe3h%\x08Mz4\n\x82\xe1\xbe\xc8^\xda\xb2,"\xb8\xdf\x1b<:z\x9e\xd0\x01\x98\xa4\xba\xed\x16\xc3\x90=\xac\xed\xe2~M[\xe0Z;=C\xc8\x845\x0e\xaf\xa1aw}\xe7\xcb\xb5\xa2\xea\xd4\xcf\x87\xefM\xeaj\x8et|\x19\xa4\xea\xa6a\xdb\x13\xfc%\xe7\x1di\xcdOy\\Wb\x11\xebt\xc8\x82\x80\xe9\xd9\x83,U\x8b\x88rg\\\x81\xbaE\xbd\xb22[*\xb0\xb8Y0\xaa\x81\x16:9r{\x8a%\xa4\x90\xb2\xdd\x01\xcf\xd6\x96\xa3\xa5\x1c\xff\xfd\xb7\xcdV\x1at\xcb\xe2\x98[\xf2\xf8d(|\x8dj\xa3\x0c(\x8c\x1c\xa2"\xed\x14\xfd\xcc\x15\xa9\x1b\x05\xe1\xbb\xf58\xb0\xdb\x06\xf8=\x02s<\xcd\x97}uyO\xe8~\xe3\xb8#N\xd0i\xddW\x0e/\xa1\xef\xbaUU\x03g\xe7\x08\xecd\xfcs\xaa\xbe\x9d\xe9<\xdb7\x08>\xdf\xc0\xe9\x9a\x11\xa3\x085&\xc2\t\xfd6\xb3\x7f\xdcg\x0c\'\x01\xe3\x04Nq\xbbSh\x15\x1ca\xc7\xeeK\xdbey\xfc5\xefw\xe738\xe5\x8c\x89\x0b\xe9\xf4\x00\xc0\x83\xc2\x88F\xf0O\x95\xc0\x06\xbe\xc2\x1b^\x85eH\x0e\xe5\x94f\xda\r\xe4\xc4a\'\xe3\xfa\xa9u~,\xc1S\xfc\xdf\xd0\xe9\xd7\xb7\xc2{\xf7\x90E\xfc\x08\xd2\xcfSf\x1a\xdbjx\xabZ\xbfv\xc5S?\xfe\xb4U\x17\xaf\xffoj\xd6z\xe9v\x07\xd7\xa4\xc4kI\x8fTS\x92aw/\x7f!\x02\xb8\x07\x0e\xf8\xbc;\xd9\x9f\xee\x97\xa0\xc39 \x89n\xff\t\xbb\xebll\x85\xfdhZ\x11\x8b^\x07t\x92%\xa4\xa1\x1c\xa9\xec\x185\xb6o\x96\xf7\x7f\x17?.Q\x8d\xc4\xeb\x93\xe8\xc5\xe9\xbck\x0b>\xdf%F%\xe5\xaa\xf9\x0b\xce\x99MW\xed\xc8\n\xb4A\xbaV\x03\x94Abs|\xe3\xac\xe0\xdc@\x8f\xfd\xe00K!\xfc\x1f2EtDo\xbaA=\xb5\x9a\x05\x90\xcbZ\xb0\xf72\xea\xf0\xfe\xda-\x8b\x0c\xcb[\xd0\x04\x0e\xac\xf3\xe0E9E\x81!\x8b\x91\xc0\x1d\xc6\xec\xb1\x8ao\x14;\xd4\xaa\xb6\x0eJ\xcc3}\xd2\xea\xa8\x9ab\xd9\x84\\r\xe2G\xbbC\xf8H\x15t\xc5_\xad\x80\xbe\xb6?} b"\xbf\xf1\xa1N\xb0\x83\xb3\xdf\x94\xc9\x07\\\x84sL\x84?\xf9\x16\xf9\xc4\x9du\xd5\x9e\xaf\xee\xe6\xfc#\x94\x96D\xac~\x19%E\x02\xf0\x8d\x88N8i\x96a\xfb\xb6\x16\x84\xdb\x01\xe1\xeae\xee\xa4\xb21\x94\x06"5\x81\x8fp\xc6\x99\xe5\x7f\x17\xfaL\xae\x85\xf3\xc3\xdbD\xfa\xe1~\xd8me\xe2i\xdcR\x04\xefO\x1a\xb9\xc6\xb5M\x19\x99*&\x03xx\x8f\xa8P\xde@\x12\xd5\x8c\xcf\xcb\xd7\xd9/\x1f\xb1Se\x0f\xf3"\x94\xcf\x04D\xcc\t\xb7\x1eEeG!\xf0\xbc\'bL\xa0\xfbP\x99\xc1\xf6d\xde\xc5h\xa4\\h\x0cQE\xaa\xed\xe5Dn%Qs \xe3.\xdf\x88\xbdy2\x8f\xd3\x86\x9c\x90\\\xcb\xca\xdb)\xb7\xa6\nWo9\r[\x8d\';\xe2A.~<\x8fZ\x11\xf9\xa35o~\x9d\xa7\x14\xefB\xfe&\xee\xcc\x84\xba>\x18&\xb0\x17x\x92\x92\'\xc2\xbe\xcd\xa1\xc3\xccK\\\xa65ld\x90\x852Hv6\xd1\xb8\xf1\x8f%T\x8d\xa44RzW\xfd\xe9y59')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask,flash,request
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
from urllib.parse import urlparse
|
8
|
+
from .config_enum import ConfigEnum,ConfigCategory
|
9
|
+
from .config import hconfig
|
10
|
+
|
11
|
+
from sqlalchemy.orm import backref
|
12
|
+
|
13
|
+
from flask import Markup
|
14
|
+
from dateutil import relativedelta
|
15
|
+
from hiddifypanel.panel.database import db
|
16
|
+
import enum
|
17
|
+
import datetime
|
18
|
+
import uuid as uuid_mod
|
19
|
+
from enum import auto
|
20
|
+
from strenum import StrEnum
|
21
|
+
|
22
|
+
class DomainType(StrEnum):
|
23
|
+
direct = auto()
|
24
|
+
cdn = auto()
|
25
|
+
auto_cdn_ip = auto()
|
26
|
+
relay = auto()
|
27
|
+
fake = auto()
|
28
|
+
|
29
|
+
# fake_cdn = "fake_cdn"
|
30
|
+
# telegram_faketls = "telegram_faketls"
|
31
|
+
# ss_faketls = "ss_faketls"
|
32
|
+
|
33
|
+
|
34
|
+
ShowDomain = db.Table('show_domain',
|
35
|
+
db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
|
36
|
+
db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
|
37
|
+
)
|
38
|
+
|
39
|
+
class Domain(db.Model, SerializerMixin):
|
40
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
41
|
+
child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
42
|
+
domain = db.Column(db.String(200), nullable=False, unique=True)
|
43
|
+
alias = db.Column(db.String(200))
|
44
|
+
mode = db.Column(db.Enum(DomainType), nullable=False)
|
45
|
+
cdn_ip = db.Column(db.Text(2000), nullable=True)
|
46
|
+
# show_all=db.Column(db.Boolean, nullable=True)
|
47
|
+
show_domains = db.relationship('Domain', secondary=ShowDomain,
|
48
|
+
primaryjoin=id==ShowDomain.c.domain_id,
|
49
|
+
secondaryjoin=id==ShowDomain.c.related_id,
|
50
|
+
# backref=backref('show_domains', lazy='dynamic')
|
51
|
+
)
|
52
|
+
def __repr__(self):
|
53
|
+
return f'{self.domain}'
|
54
|
+
|
55
|
+
|
56
|
+
def hdomains(mode):
|
57
|
+
domains = Domain.query.filter(Domain.mode == mode).all()
|
58
|
+
if domains:
|
59
|
+
return [d.domain for d in domains]
|
60
|
+
return []
|
61
|
+
|
62
|
+
|
63
|
+
def hdomain(mode):
|
64
|
+
domains = hdomains(mode)
|
65
|
+
if domains:
|
66
|
+
return domains[0]
|
67
|
+
return None
|
68
|
+
|
69
|
+
|
70
|
+
def get_hdomains():
|
71
|
+
return {mode: hdomains(mode) for mode in DomainType}
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def get_domain(domain):
|
76
|
+
return Domain.query.filter(Domain.domain==domain).first()
|
77
|
+
|
78
|
+
def get_panel_domains():
|
79
|
+
if hconfig(ConfigEnum.is_parent):
|
80
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
81
|
+
return ParentDomain.query.all()
|
82
|
+
return Domain.query.filter(Domain.mode!=DomainType.fake).all()
|
83
|
+
|
84
|
+
def get_proxy_domains(domain):
|
85
|
+
if hconfig(ConfigEnum.is_parent):
|
86
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
87
|
+
db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
|
88
|
+
else:
|
89
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
|
90
|
+
return get_proxy_domains_db(db_domain)
|
91
|
+
|
92
|
+
def get_proxy_domains_db(db_domain):
|
93
|
+
if not db_domain:
|
94
|
+
domain=urlparse(request.base_url).hostname
|
95
|
+
db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
|
96
|
+
print("no domain")
|
97
|
+
flash(_("This domain does not exist in the panel!" + domain))
|
98
|
+
|
99
|
+
return db_domain.show_domains or Domain.query.all()
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
def get_current_proxy_domains(force_domain=None):
|
105
|
+
domain=force_domain or urlparse(request.base_url).hostname
|
106
|
+
return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
107
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/proxy.py
CHANGED
@@ -1,5 +1,57 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
|
20
|
+
class ProxyTransport(StrEnum):
|
21
|
+
grpc=auto()
|
22
|
+
XTLS=auto()
|
23
|
+
faketls=auto()
|
24
|
+
shadowtls=auto()
|
25
|
+
# h1=auto()
|
26
|
+
WS=auto()
|
27
|
+
tcp=auto()
|
28
|
+
|
29
|
+
class ProxyCDN(StrEnum):
|
30
|
+
CDN=auto()
|
31
|
+
direct=auto()
|
32
|
+
Fake=auto()
|
33
|
+
class ProxyProto(StrEnum):
|
34
|
+
vless=auto()
|
35
|
+
trojan=auto()
|
36
|
+
vmess=auto()
|
37
|
+
ss=auto()
|
38
|
+
v2ray=auto()
|
39
|
+
ssr=auto()
|
40
|
+
class ProxyL3(StrEnum):
|
41
|
+
tls=auto()
|
42
|
+
tls_h2=auto()
|
43
|
+
tls_h2_h1=auto()
|
44
|
+
http=auto()
|
45
|
+
kcp=auto()
|
46
|
+
|
47
|
+
class Proxy(db.Model, SerializerMixin):
|
48
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
49
|
+
child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
50
|
+
name = db.Column(db.String(200), nullable=False, unique=True)
|
51
|
+
enable = db.Column(db.Boolean, nullable=False)
|
52
|
+
proto = db.Column(db.Enum(ProxyProto), nullable=False)
|
53
|
+
l3 = db.Column(db.Enum(ProxyL3), nullable=False)
|
54
|
+
transport = db.Column(db.Enum(ProxyTransport), nullable=False)
|
55
|
+
cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
|
4
56
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
57
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/usage.py
CHANGED
@@ -1,5 +1,60 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask_sqlalchemy import SQLAlchemy
|
2
|
+
from sqlalchemy import func, column
|
3
|
+
|
4
|
+
import datetime
|
5
|
+
from flask import Flask
|
6
|
+
from datetime import timedelta, date
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from sqlalchemy_serializer import SerializerMixin
|
9
|
+
|
10
|
+
class DailyUsage(db.Model, SerializerMixin):
|
11
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
12
|
+
date = db.Column(db.Date, default=datetime.date.today())
|
13
|
+
usage = db.Column(db.BigInteger, default=0, nullable=False)
|
14
|
+
online = db.Column(db.Integer, default=0, nullable=False)
|
15
|
+
|
16
|
+
from sqlalchemy import column
|
17
|
+
|
18
|
+
def get_daily_usage_stats():
|
19
|
+
from .user import User
|
20
|
+
# Today's usage and online count
|
21
|
+
today=date.today()
|
22
|
+
today_stats = db.session.query(
|
23
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
24
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
25
|
+
).filter(DailyUsage.date == today).first()
|
26
|
+
users_online_today = User.query.filter(User.last_online >= today).count()
|
27
|
+
|
28
|
+
|
29
|
+
# Yesterday's usage and online count
|
30
|
+
yesterday = date.today() - timedelta(days=1)
|
31
|
+
yesterday_stats = db.session.query(
|
32
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
33
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
34
|
+
).filter(DailyUsage.date == yesterday).first()
|
35
|
+
users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
|
36
|
+
# Last 30 days' usage and online count
|
37
|
+
last_30_days_start = date.today() - timedelta(days=30)
|
38
|
+
last_30_days_stats = db.session.query(
|
39
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
40
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
41
|
+
).filter(DailyUsage.date >= last_30_days_start).first()
|
42
|
+
users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
|
43
|
+
|
44
|
+
# Total usage and online count
|
45
|
+
total_stats = db.session.query(
|
46
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
47
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
48
|
+
).first()
|
49
|
+
ten_years_ago = today - timedelta(days=365*10)
|
50
|
+
users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
|
51
|
+
|
52
|
+
# Return the usage stats as a dictionary
|
53
|
+
return {
|
54
|
+
"today": {"usage": today_stats[0], "online": users_online_today},
|
55
|
+
"yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
|
56
|
+
"last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
|
57
|
+
"total": {"usage": total_stats[0], "online": users_online_last_10_years}
|
58
|
+
}
|
4
59
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|