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
hiddifypanel/models/user.py
CHANGED
@@ -1,5 +1,173 @@
|
|
1
|
-
|
2
|
-
|
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\xd3\x1d\x00\x00\x12\t\x04\x00+\xefN\xdd\xe2\xc3]\xa6}5Xk\x91Q\xd4`\x00\x00\x00\x00\x00\x00\x00\x00B\x1a\r\xcbI*\x95\xe0G\x84\xee\xb4`K\x92\x1bH`\xb7\x97\x01I\x01\x05\xa6\x7f\xf5\t\xccO\xe5\xfab\x1cQ\xb7\\\x11\x95\xe8m\x0b\'p+\xccY\x97\x8c\xf3\xfe\x0ct\x02v\x02\xf5\xbf)\x92\xe6X\xc9\\\xce\xe2\x1c\x8a\x0fV\xb1\x83\xfe\x03\xef\x1f\xd5\xdd^u6`\xd0`/j<p$\xfc\x9dZ\xc8\xa8\x9a\x80\x04\x7f\xe4\xed!b\xbeY\xce\xd8]\xbe\x1d,\x1f@\xd5]\x0c&\x1f)\xdeVA\xe1>\nC)\xb4\xd8E\x8cF"\x92\xa9\x8e\xca1`h\x939 ;op\xcf\xe4\xf2\xb5j\x9e\xa8\x1eXh&yY\xd4\x9ck\xfa!\xd1H"N\xcf|\x94i\x07\xd6\xac*T\x7f\xc3o P\x04\xc7n\x11\xcb9Oe?\x10\x19\xe2\xf5\xe0\xc9`\xd5\xb6\xad\xf5\xd6\x14\xd5jc~w\x9a\x17h\xcd\xc5\xd9\xb6\xea\x04s\xe4\xb1\x96\xf0/\\\xd6\xa0WF\x88e\xe1\rD\xe4\x9d2X\xcf\xe1\x98q\x87\x1d\xc4YC\x14?\xa0\xcb\xc4N\\\xdee\x88.?J\n\xe6?7V\xebTzQ\xdd5n\xb3\x9e-\x8eh\x0cC\x8e\xc2\xd5U?\xd9k)\x8a\xbd\xf1A\xf4K%\x93\x06:\xc1\xbaW[\xe0\xba!\x08\x1a%)\xa2\xf6\xb7\xe9\xcb\xa9\xb4C\xb5\xa0B\xea\x1c\xb4\xb5\x8aR6[\x80.\xdc\xcd\xdd]\t\x97x\x7f\xfdO6\xe2\x1e\xb5_2A^\xf3vuP\x06#,K\xf9y\xae\xbd\xfbgq\xa77\xa8\x8e+Hy)\xfa\x98\\\xb3\x9f\x18\xbf\x8d\xc1X\xec+\xf3\xa5\x04\xa2\xf9l\xda\xb3\xe5p\xb2\xae\xfa\xa2b!\xd7\x99@a\x0c\xfc\xdeI\x19+V.p7\xe1"\xbe%L\xb5\xd9\xd3o\xba~ux\xc7\x03U1\xc4\xf9\xf7\xa0\x7fkIF\xf5\xb1\x8f\xe4B\xf2\x99T~\xf0\xb5oO\x82\xb8\xcc\xec\xa5\x8a\xa4\xa7\xdd\x1d\x03e\x94!\x94Q\x87\xa9\xe1H\x8f3!E\xd2\xc7\xae\x9a%\x98\xe3\x14v\x06"6^\x0c\xcbnor]\x9d\xca\xb5\xfd\x87\xd9\xcfUG\xde\x8d&\xf74\x8co\xa7#G\xa7L+&\x03\xa8\xe1\xe7\xf5m\x12<\xf9\x06\xd8\x11\x8e\x96"8\xb4g3\x8d\xd4:I=\xed6\xab\x88<0\xfc\xab\x83\xeb\x03\xfa\x13\xeaZ\xd9\xe0\x90\x8c\x16\x9f\xf9\xbc\x8c\x18\xf6k\xf4\x8dbx\xbd\xf4\xb1v\xa0\x1d\xf2>\x01\x03Q\x1e&\xd7\x0cTmw\xb5\xef\xfa3\xf7\xc4\'X\xa4\x14\xc3\xa4\xaa\xbf\xf4u0\x99\xae\x0b1\x1b\xfc\xc2i1\x8f&\xef\x95\xb9\xe4\xdf%\xf7Z\x10\xeaY\x8a\r<Ss<upD\x97(`h\x8f\x89~/s\xe0I\x13qQ\xbdt\xb0\x94\x91t\xb0LT\xca\xe9\xbc\xab\xe0=\xb7\xd2\xb6\xb2\xa4\x88\x11\x1f\xdeH\xc8!`\xcf0u"\xdcA\x1d\xb7\xe4\x88\xaa\xf6\x10A\xeb\x15OY=77\xbe\x9f3 \xf7X\x0f\x9fm\x1fq\x89^\xad\xa1$\x87\xc5\x8e\xd7\xe8.\x95\xb2\x8dh!K\x1fTE\x89\xc3\xe5\x1d\xacc\xe3\xd8\xe9p\xceD\x9d\r\xd6\x08\xa8\xe9\x9a\x95\xd3\x12\x136lvO\xf9\x00K\xa3\x1e\x0b\x92\xa4\xaa\xc1\xe7\x0c\x82\xac\xc0\xee[m\xcb\xd1 \x13\xde\xc4o\x96\xb7\xd6\x01m\xd4\x96sE\xb8^\x0e\xe1dM\xea\x8b\xcd\xa0\xa0S\x08e\'{\xfc\xc1\xa6\xa5\xa9\xa2\xa0\xab\xc0(\xf6\xb0\xe0\x0fd9\x1d\x9b\x9dFYE\x87M\xf2u{\x82\xc8\x07\xc8\x91\xad\xf6\xd0\xcde3\xc6M\x15\xf4\xeb\n\xad\xcdr\x96\xf5N\x02\x9e\xc4\x02\xc8\xb6\'|\xf0\xa3\'\xb5\xe8\x18\xf1po\xd1\xb1{\x9d9F#\xab\xe0\xb5\xa9\x8ca\xc0\x1cO\x00Z\xb6{E,0<\xdc\\\xea\x83\xcd\x08e\xf7\xf1@d\x9b\xfe\x17\xe1~\x98\x95\xe3Gc\xaat\xb2*2\xf6l\x93\xbaI.\xee\xa1\xb6Y\xc5\xbe\x89\x99\x95\xa9\xaa\x81\xd3\xc2\xcf\xd5S\n*\xd33\xaa\xea\xcb\xe6\x98\t\xe6\x18\x0b*\xa2\xe7<\x9eR\xcd\xf4\x99\xf3\xcd\xf0\xcb\x1c\x16\xc0\x00<f\x1b\xc2\xea\xd6\xa7\x80\x89\xc8\xfa\xdc\xeck\'\x8f\xb7\xc6\xbb)\xdb\xff\x97\x1c\xe1\x8c\xca\xa5\xef\xe4\x11\xef\xc1|/\rKl\x80\xd4.\xf9\x82\xcd\xd05:\x11\xd0\xb6cb^P\xc23B$\xff\xf5N\x10vG\xca\xd6\x02\x7fT\xc2\xe7\xd0\x19\x9f\x0b\xc9\x9b\x12p?R\xfa\xf8d\xc4=|\xca3\xd3jEU\xc5\xb8\xf2D %Y\xb2\x04\xb5&\xc8\x1f\x196\x13"\x17D_\xfe\xae\xea\x9e*\xc6\xb2]\xe6\x8cd\xd4xp\x01;\x9b6\x82K\x96\xd1;H\xe2\xc4"v>J\xea\xd6\xaa/\x8eJ[\xebM\x97\xda\xc1\xfc\xba|\xc8\xe8\x05HLw\xa4\x03\xe0\x97\xc4\x8d\xec\x010\x83\xd9\xf8\x9d4\xe9\x1e\x14\xd4Tq\xe0\xd1\xfe\x8fZs.&f\x9c?:AV\x1b+\xbe\xc3\xba\xdb\xd0\x9e\x838I_}\xbe\xf1)1\x1aw\xf5\xb6\x98\x03O+\xc2\x89s\xc40\xb9\x96\xbd\xf1?\r\xd0z\x14\x16\xb5\'\xb9\xba\x87\x8a\x9b]\xed\xedm\x9c\xa9\xb5\x9c\xf6k\xa9P\x8d:\xa0\x9e`\xf7\x06\x98ypJ\x85\xf5iVi\x1dj\xd3+`\xf06\xb8a\xba=\xb2\xebl\xd6Aq\\\xeb\x01\x83\x1e0\xe2$\xf0aU)\x9c\xe7\x91|\xee\xceb\x06\x00\xde\xf7#\xe1\xf3\xd3\x9a\xea\xee\xebU\x9a]2\xdd\xc9K\x1e4N\x7f\xc3\xa1\x8c\xc2G\x02\xee\x81\x85qF\x1f\x8c\xdf\'u\xef$}\x9e,\xf1t\xcd\xbckd\xa6\xe0l\x945\xbes\x18\xdd\x15M[\xc0>\xf1V\x87u\x917}\x84\x82D5\xf5\xbdq\xb9\xcd\xfds5L%wb\x8bg\xea)\xe019\xa6\xcf0\xb6$\xc4\xb82\\\xfa\x01\x9e\x87\xcc\xc3\xa0\x07\xbe*\xbc\xf3\xe6\x9c\xa0\x91\xb5"\xbb\xb73\x00\xb4\x89\xd1\x81\x11\x94o\x05\xd1A\njA\x9a\xc6\x88|8\xfaj9\xdb\x17\x85r\r\xd9*\x08g\x84\xf8\xe5\x9b\xa2I\x99\xe91\x8e\xa3\xc9\xb9\xe3\xa4\xc3\n\xcf~V\xfcu\x90\x948\x04v\x10\xe6\x14E\x0c\x88\xe2\xbe\x9a\xdd\xe0\x97\xa70[\xc8I\x9c\x85\'mZ\n\x8a8\xe1\'\x12T\xdd\x98\x933\x14\xa3\x9f\xee\x06T\xdc\x16\xc4?\xc1\x8dA\xf7\xb4\xfdv\xa4!\xb4\xd6e\x12\xc8\xe7\xfaF\x85\x04v\x88\x9c\n\xd8G\x0f\xff\xaa|\xad\x1e}\x8c\x9b"\xb2\xf0^\x00\xf2\xf9}\xe2L8 y\x1f\x1cb\x07\x9d3t\x98\x13.eC\x07\x10\xaf\x12\xb0\x88@\x9e\xb4\xec2=\x1f\x9bW\xf1\xfb\xba8\xa7\x00\x94\xfeE\x84]\xf3%\xcb\x13\xdd0\xd0\x9f^\xabqb\xd0\xf4\x16\x9f\xc8\xe2 \r4OH\x04\x8f\xe6\x0b\r\xd5\xfbw\xd4\xeaS\x9b*\x84\xdf\xd8x\x02\xf5o\n\x083\x99(\xceG~\x8bDq\xc8\x83\xd0\xd8\xe0\xf3\xd2\xcb]\xa8T\xbf\xd3T\xd3\xf5\x00\x97x\x1c\xdb\xe8\x9cV\x0c\xdd\xbb\x99\xe7\xa0\xf0\xa7{\xf9\xd2\x14\x1a\xc28\xb4\xadN\xfe\xa9)\x98\xf0\xed\xa6_\xf8\x1b\x86p\xe4V}b#\'\xafJ\xb9\xaf\xfdO\x87fh\x043&\xdd\x06\xe8\nrI_\r\'\xab\xd4\xa2\x88\x1e\xa2\xa1yq\xd1>\x02\xc8\x15\x19$\xd4\xbd\xef\xb3\x1a\x1d\xb8\xde\xf8\xe1\xb3\xa1\xf5\x9c\xc3\xb5so]\xe9w\x1d\x99\xa6\x8f\x01\x00\xc3\xaa\x99|\xcb\xae\xeal]\xa9(h<\xcbfc\t\x9f\xcd\x9dp\xaa\x94\xe3\xd2\x115N\xff\xea~z\x82\xb8\xa5E\x8d\xb0\x01\xee?\x18\x91A\xe9\xff\xdfI\x0f\xff\xfd\x13^`\xe6j\xac\x9d\xb7<bPl\xdcN\xaf\xd8n"T\xe2Qn\x05\xe8\xbd\x83p\x1c+\x1f\xd1\x00\xd8\x8c\xb1\x91\xcc\xe6\x9dq\x7f\xbbW\x01\xcaUQ\xb8\xf2+%\xae\r\x86\xbd7i\xe3\x02\xd7\x0f\xf2+\xb1O\xfc\xae\xa5\xa9w\x1d\xc8\xacm*A\xa1\xc9C\xd1\xb25\xed\xc57\x14\xb2\x0e\xd8\xc6\x1a\xcck\xf4\xf9\xf78~\x82\xdf\xec\x07\x0ca\xd5\x1ci\xf2\xb9]\xe2\xe22\xecS\xb8\xc3q\xd1\x1d\xb5\x89\xd6\x08>z\xfb\x99\xb9\x15Y\xeb\x8a\x1aMiRx)\x7f[\xe5z\xb9P^\xef;\xaf$\xcb\x1e\xd6"\xbc\x7f\\\n\xfaBu\x00\xa6\xa6\xe5T\xfd`6\xdf\xe3\xac\xbb\x17\xc6\xbd\xcds@\xde\xb0Z\\y\x8d\'.\xa2\x96\x89v\x90\x1b\xa7\xb3\xa3\x94\xbf\x1e\xe6\x0b\xbb@\xa8gl}\x05\x83(-!m_`\x9e\xc37\x8eE\x8bq\x0e\xc0\xdc\xf9j\x9ba1s\x9f\xbd39rw\x91\xa3\x1b\x07b\xe3\x93A\x11\x826\x0ef]\x08\x1b\x07\x8d\xdeN\xe5\x97B\xbb\xadY\xa4\x9e\xc9\xe8N\xef\xa1%\x06d\x94\xd0`j\xfc\x17\xc0{\x83ur\x7f4V\x1f\x97\xfd\x84^\xdf\xdf\xed\xd9!#Nya\xf3!|("\xd7\xc0\x9f\xd7\xac!=D\xfd\x1d{\x17\x00\xd9\xdf\xc9-\xeb\xcd\xe4"\x07\xbe\x7f\x99\xed]\xackc"\xf1\xf0\x86\x88\xb5\x9e\xf4\x8f.\x18\x80w\xadna\t\xfd\xe8cr\xfel\x8e\x84\xc8TQ\xa0\xc7\xc1\x054\x04\x8e>\xdbZ\xfc\xfdM\x92\xf0%\xef\xf1\xdbx\x84HdK\x94x&\xaa\x1c\xc7\x08\xca_1\x828\xb0\x99\x8c\xbf\xc7\xdb\xf3\xbd\xa9Bl&g\x84\xc3P\xba\xfb~\xd2!}\x98\x13\xc4^\xcc!\xddQ\xc6\x058\xf4\xbb\xacf\xfe:M3\xc73P\xf1\xa46|\xd4j\x90;\x96\xb2\xe5!H\n\x07\x1d6\xf6.\xc5m\xedL\xa4\x07_)\x168\xaaC!k$\x0e\r\x93\xdfh "\xa0v19Y\xd1\x9c\x15\x9e\xd7\xd2\xd5\xb8\xac\xdf\x83\xf5\x8b\xbar\xf30\x07\x15\xa0gt\x9aF\x01v\xdc\xae\x89J*p?\xa7\xc4\xa4\xac\xa7sY=\x06=\xc4n-\x04\xb3BJPLa\xc7~\xb5%Vr\xdf\x07\xf2\x89\xa7\xd4_\xb8\x11[8.\x00\xe6\xf3\xd7\xefp\x1e\xd7\xa2\xf8]\xe9I\xdbG,b\x8b6\x9f\xf3\xda\xeb\x87\'\xa6\rKE\x03\xa7\xe4\xfe\x0eV\xdf,F\x92R;\xedu\xa7\xb8\x04#\x9c\x8f)\xe9\xb5?\x1c\xc3\xf5\xae\x9f\x86\xc2n\xdd\xfb\x80\xf2QX\xe4\x18\x8ds\xf2\xb0\xf1\x8b}\xb5\xecyk\xae\xb2\xefY\xf0\xf2\n\xd2\xc6\xd7\x95m\x08\xb5-Y\xd09\xb7\xd3tl\xba\xff\x90\xa1\x10\x8dQFzK\x9d\xe5\xd5\xcc\xfcO\xe3\xdf\xd6I9\x9b\\\xef\xc2\x88%&\xb1\xc6\x07\x9f\xf1\x81l\xf7\xc4\x8chA6B\xb8\xfd\x11\x04\x8b&\x10\x04\xbc\x1d.\xa2\xcf\x93\x1a\x98_\x9c\xb4g\x90\xff9\x84\x1aj\xd1\x16\xc5=7U\xa4;\x1a\xf6\x1e\xec\x03V\xff\xa3\x9d\xdeO\xf0\r1SC\xa0J\xb2\xa1\x1fr\x7f\xbav\xcf-\x8b\x9a\xcc\xc3\x9a}\xa2\xeeL\xbb\xc8\xa6\xb4\xb2El\x95\xfd}\xea@\x84\xbc.l\xc0\xe2\xf9\xedQD\xe6\xba\x07\xec\x8cpXH`\xb4Z\x06OZ\xa0\xf5\xcb\xcf2\x0b9j\xd6\xd8\xa6qR\xda\x19\xe9\x81ymva \x8a\xb7f:\xaf\xce\x89\xdb7\xfe\xb29]V~i:\xe4G"\x85\x01H\x97Kx\xf8\x04\x90\xcea<\xeaL\xc5\xcd\xbfU:;cdp\xfb\xbf\xaf^VX\x99za\xd8Y\xb8^\xa2]R\x8b\xc8LC\xd6Z\xf9\xec\xac\xe1G\xee\r\xaa\xffL}8\x97\xc1\x0f{\xf1\x8f\x01\xbba]\xc5\x96\x97\x96\xb4:\xe9\xf3\xc6\xd4v\x02)\x90\xbf\xafu\xbf?soQ{\x18X\x8d\x02\xa1un(S\x99\x81\xe7\xdbb\xd0\xa4N\xb0\xd1\xd6_VDsH\xbd\xd5\xa6\xf5ZQ\t\xbd\xae\xc8g\x00;\xf8+\x00\x0f`\xde\xb9\xe3\x0b)44j\x03\xafW\x00\x89\x9d\xd8\xd6<\x94\xb0\xdc\xbe\xdd\xa4\xccP5haG3 /u\x05\xd4\xac.1.e\xda\xb7i\x8d$\xec\xa5\xe4C\x07\xb5\xf9\rgYV\xc9ty>\xb3"6WQr=m\xda\xf7*\xb3}L.n:1\x08\x86l\xb8\xa8@2I\xf5?\xd1\x85J\x89/\xe8\x0f%\x1d?\xa6\t\xe7ZB\xed\x93H\xbe\x06\xbc}\x00\x1blC\xa6\xa8_\xc2\x13\xe4\xb2\xf5\x91#Gb\x1a\xc0\x9b\xfb\x107\xaf\xdb\xb2\xb7e\x88\xe3\\\x9cO\x9e\xef\x84\xcdX\x1e`\x9fAA\xc3\x9b\xb4\xb9"\x86\x94x\xd9\xf7\xef\x0c\xf9(\xe8\xf9\x95\xfd\xf7}d\x0e\xb0\xddJ\x9a\\i\xe7\x8d\xa4\xc4\x90c\x01L\xc1;\xc1\xb2N\xbfg\x8c\xbcvrUjNg\xfdR\xa9\xf1\x0f3\'\xeb\xd0\x1e\xd5>R\x90\x82\xee\xe2~2\xcd\x91\xf6\x83\xcbQ\xe2\x92[\xb7}\xef>7\x93D\xc8\xc8\xe7\xc0%\xb5<\xd5\xf2\x9e\xf8\xce\x98\xf3\xd3I\x06\xcd+\xa6\xed\xf2<0-\xa2*\x8bfn\xa3:@\x16\x83\xf5c\xebA\']\x1d\x03\xa5[\x8a\x15\xc1h6cy\xdd\xc6}@\r\x05.\x19\xd0s\xdb\x06\x1dcu|\x8d\x9cg\xf9\x8eo\x16\x07T!\x13\xc4\x84DZ2\x05\xa7\x9aC\xc3<\xf2{\x11Z\x84\xa7MI3J4\x03C\xec\xb4d\x99\xdf\x03\xd5|\xe8\xd5\xff\xe5Q\x84!\x9b\x07h@\x95\xa6\xa7\xa4e\xe2\\\xa3s\xfa\x97\xdd\xd2\x9e:C\xbeH3\x92k\xd7\x9e\xd4\x92\xdd\x7f\xe0W2Mx\xc4\xb1s\xe9\xa7&\x92\x82"a\n]`\x9bu\x05\xb8\xd2/?\xe2\x19\xdc5\x94\x06\xfc)B\x89(9\xc2\x9f\x00\x91j\xd8\xa1fHQ\xc2\xcf\xca\xf7\x98\xdb\x87\x88\xaf-]E\xb5\xc5FZ\xf9]\x85N\xec\xd4)Td\x86}\xce\x1b\xeb\xdf\x88\x1b\xa3\xa11I\xd5&}CqJ\x89fb<-t\xb4j\xbf3\\\x03\xac\xdde\xedq\xc5z\x00\x03fu\x17fu\xca\xd1\xd4\x1f\x8c\xdf\x90\x93\x8ct\x87J\x84\xa0\xf6\xc9x`\x94\x11Xf\xc1\x836\xf2\x8a\xed\xb9\xa4\x9b\x03\xaa\x80f$P6:\x10\xa0\xd8\xe8\x8a;\xa7\x9f\x1f(\x19\xb3{$%Q\xa3\xaa#\xee\xe8\xfdy o68\xbeM\xaa\xc8v\x85O\xdc\xddE\x9ck\xa8\x98\x1bV\xe4Pn@:\x9fJ\xae\x00\x94GY&\xe9\x0e5\n\xdc\xeb\x8b\xf3\n\xab\xe2\xc8d\x81\x7f\x1fm\x11\x93^\x88R\xd9_1u\x9f\xda\x1b\xaf\x08\x92\xc0\x0fp\xecJ\xc5.?T\x18j\x13\xa4\xb5\x00\xfd\x15&\xe5\x8aA\xab\xc6\xda\xf9\xef\xf9k\xa1\xa67f\xd1Jb\xf9\xc7\xd8\xe8@\t\xad\xa0\xe5\xf1\x93#-\x9d\xf0\xd6\xa8}\xc1\xfd\xe4\xde\x19\t3(s\xae\xaa\xa2\xf3\x01\xd8\x19\x10(s\x9b\xeb\x878\xaa\x9a\xf6\xca\x8a\xdf\x03\x8ah\xfb\x88H\xfa\x057\x8b6z^b\x06\xc4j\xd8_P\x10\x88\x14\xaf\xc9N\x9f%y\xda(\xe5\x9d\xed\xf6\x9bM\x0e\xc5\xee\xb6;\xf2\x0flW[\xfa)\x15{yZ\x00\x8e\xa6\xde\xe6h\xf7\xb2\xfa\xd4\x82\xf9\x0e\xafNH\x02\xe2\x94g\xdd\x90\xc7\x98\x9f\xa5\xa6\x98\x18`\xe5\xe7\xec\xc8[e\xae\xf2O\x1feO(\x13\x8c\xef,Iu\xd0u\x02H\x8d\xa4\x0c\x9c\xd5\xb7\xd9M\x7f\x1a^^\x08\xb8q\xc2\x1a\xf1\xe4F\xff#\xd4j\x19\xae+V&\xf6t\xb4E\xf2\x9b\xf9\xde\x195\x13>\xb4~\xe4\xd65;\x10\xd2\x01\xbb\xc6\xdcD\xed\\B\xa2\xdb\xa0\x02\x96\xe0\xceF\xa2\xee\x99\xda\xa5\xa4:\x16\x8f\xd8\xc6\x12UF\x9d\xf8y\x1e\xa0e\x95IT\xff\xb3\xee!D\xfd\xef,d\xed\x0e\xf7\x1d\xda?4\xb2\xd3\xcf\xefb\x86\x01\xc9\x84b\xbd\xb0g\xeb\xee\xfe\xd9;p6\xec\xcd\x95\xc8\xe2\xfe\xf9\xc9\x7f\x80qcn\x88\xb7\xfd]7/\xbb\xdf\x14\xdf\xdaUl\xb8\x809\xfd\x98\xdfm\xb0\x04Q\x89\xd4\x02uh\x1b \xfc\x82\xb4\x0c[I\x82\xb5\x98\xa6\xa30|\x88r\xf9\xe3\xd5\xe3I\x1a\xd3\rL?\xf7\x19#S\xfd\x820\xdf\xda\xf4\xf9\xec\x84\xacf\x9dW\x89\xd3\xf5c\x89{\x94\x06]\xcb0U\x16\xcasnt\xa4/\x1aG\x80\xf9\x93wf\xcc1[\x1b\x19\x1e\xafW\x89\x99\xdb\xb9\xc6\x87\xd7/P\xdf\xda\x9a\xb4\x11\x98y\xbaX`#\xf2a)\xcf\xbca\x90\x05\xb4\x1e\x80\x83\xf0|;ji@\x94\xd5{\xbc;\x88\xf6\xc8\x19@\xbb6s\x81\xd5x\xef@]\x10\x12\x19AeX\x10\xf5h\xe1F\xe2/J\xfd\x8d\x88r5\x14\xb3\xdb\xc1\xcd\xad\x9b].Z/>\xe3t\x9e\xc3l\x8f\xfe\xb5\xbd\x8e\xc4_2\xf4\xd0\x9a\xad\xa0\xc7\x8f\x8fM\x1fU\x08\xed\xb234\xf8\x98\xd5\x9a\x19.\xefc\xe4~\'\x9f!\x8eUW\x07EI\xa1\xe1E\xb7\x17\xd0\xa9\xa9\x1e\x99\xc0\xcd\x1a\xad\x16\n8\xffh\xdb\xd6\xfd\'\x00\x83\xf8A\xe0\x1cFJ\xcd\x0cg\xb9\x19i\xd2\x87\x83\x8e\xaerH\x0c\xc8H\xa1\xd6\xa8\xf9\xb8\xe7\'u\xa3$(\x1bP\x1a\x1d)\xd7\xf8c\xbe*\xb3\xb9\xe4\x8d\xc1\x1a!\xae\x9c\xdb\x8b\xddV{\x14\x90c>\xa8\xc04B\xd9\xaf\xbc\x0c\x1d\xc9\xd2\xd1\x90\xad\x08\xf1\x81\xa1]/Wl\x1f\xdc\xa2l\xca~\x84\xb5\xcb\xc0\xaf\xbe\xdeW\xf0\xc5\xa7ZuU\xdcl\x04|:\xeeL\x06\xaaR}\x92\x12\x83\xca\xfc\xeb\xf9\x10\x1d\x8e\x07!\xc0\x10\xadB\x10(\x10\x05["\n\xb3\xb9\'\x04\xbfw\xfbx\xf1\x16\xc0\xea\xf0\xaa)\xe3\xbc=u\xc6\xc9\x8a\x9acQ`\xc8\x95\n\xec\xe4\xc8\xbaK\x10E\xb7\x89\xf1\x1ej\x14\xa7\\\x08\x94\xefr\xff\xd33w\xb9p\xc4\x1f\xb7N\xc4\xb7\x14\x1a)o\xa5\x08\xd8\xc0\x84\x7fr\x803-\xa9V\x10fJ\x83<\xc0H\x81\x00 \x8e{\x87\x9c\x8f\r\xf1\x81\x19\xcd\xeb\xee\xf5\xb4\xd0@\xd9\x03\x0b\xab\x85\x14\x1ac,:8\x81\x1b$:w\xc9#\x1b\xd8\xed\x7f\xb9&\x13\x12i\x11\x00\x8cnA\xc1\x9c\x06u\x10\x9c\xf2\x98;x\xb6\xb1w\x18\xc65x\xcf\xa35J\xa8\xc5\xc9\x0eu]?\xea\xa5\xa6\x94\x89\x11a"6\xf4m:1\\B\x815\xec\xe4\x9d\xfeP\xc1\x91\x98\xec\xf0N\xf5\x1aju\x0e\xbe\xf4Y\xf0\xce#\xf3a\xb9\xd7\xb5|\xeaV\xe4\xb7\xdc\x002^j\xfa\x92\xa3\x9a\x1a\xec\xd6v\x0c\xda\xd2\xe0\x03\x8e\xae\xef\'\xf3\xcf\xe6d\xbb\x14\x8b\x85i@\xe7\x02\xad\x83w\xd2\xd4\x08\xa7\xa5\xf4\t\xe0\x19\x8d\x84\x137b}\xfab\xcfC\xecw%Udd\xef\xff\xf5\x95=\x13\xb2\xbf\x80\xc0g\x9d\x9b{\'\xd2\xaaM\xd64y%\xa9\x99\t"Q\x17m\x8c\x1e&\xb2\xfb~\x9b\xf85\xe1\x88\x06@\xaa\xe6r-g$\x94\xcb!\xe9l>\xdbm\xadC4O~6\xd0\xf6\xf6}\x94#\xe4Q\x05\x16\xb2\xee\x04+\x073L\xa9\x8f\r=\xcen\x8ew\xd2Og\x8cBo\xa0\x05\xf8\x0c\xb2e\x0e\x0eC\x1d\xbb\xe6\xe9jXE\xbc\xacC.k\x0b\xf4\xd8\xe0\x12\x90W\x8c\x7f\xe3\x98JV\xaf\xc2=\xba\xc4M\x04K\'k_\xcb\xf4\xdc[\x8d\xf3\x0f[}\x15\xa6?\x8a;\xbb\x03\xe0\xaa.\x9c\xbc<\xdb\xd1}\xca\x8ff\x9b\xbaex\x99\xa3O\xdc\x7f wg<Aa\xb3\xf0\x89\xfb\x1b\xdb\xbe_"b\xbb\xf2\xbaD\x1brX\x86*:>\xed\r[bf\xa0O\xa1S\x10a\x17\x1cVMU\x97\xc9\x02eJ/\xc9\xd7Y\x18\x10tJ\xdb`J+\x1a@\xb99\xa5P\xf2\xaeo\xec\xcd\xdc\xb6/\x98\x03\xb8\xa3\x89\xb4Uzi\xb7\x93\x91\x11I\xbf|\xff\xdep\x1c\xd2\xba\xa7\xf6\x9d\x13\xa9\xf4>\xfb\xb3\xed\xbb\x8c\xc7/0\xd2\xcf\x8f\xd7\x95\xe7wG\xc5\xc8\x96\xec\xe8\x10}\x1e\x17+\xe8\xd5B\xbf\xdc\xa7T\x19\x81\xd3\x17\xb6\xb5\xae\xc8\xb1.~\x94Z\xd0\xaa\xc9<\x0f\xef\xda\xbcl\x85d\xe83\x8b\xe35%WE\xb4?B\x9fv\xb9.\x0c}\xd1\xb6m\xd0\xd9\xf66C\xb2\x02\xf0\xf3\x0fU\x13\xa4\xdbe3k\xb9\x05\xd3\x182\xc9\xe8-\xc7/1c\xdf\xc5W\xbc\x1f\xc1\xb6\x0f\xb8\x18C\xb3\xe3:6_4\x14[\xd9=\x99\xeb\xc2\xce\xef\x98\x91Z4\xf7`\xff\tIsu\xc2\x11\x14h\xdcs\xacX\x99\xf7D\x1e\x18\xe0\x87\xe1\x1dw\xd3f\x1e\xb0\xe7\xd7\xa6j\xc8\x8eUl\xf1X@R\xa5e\x11\xb2\xdf\xcf\xce\xe7P\xf9\xc3c\xc6\x17\xb0\xaaB\xc1R\xdc$|\x1e\xca\x1e\x10-U\x89&"\\\xd02g\x85\x1c\xb9y\xb4\xb6\x9c*A\x14\x82\xbb\x86\x9b}O\x19\x9a\xe9h^\xf6\xaf\xcf3\xa9\xf9\xc5a\xeb\x120\xba\x19.Ub\xa8K\xcb\xb1\x1e)\xc8\xcf\xff\x9dW\rA7Oi\xd3l]\x856UE\xf7\x99\xe1\xeb\x00o\xe5\xc4wV\xc6\xd2)\xf8\xc3LQ\xf1\xf2\x89^\x1ep\x7f\xb8\xcc\x07\xfb\xb6\xe3\xb7\xc8\xc8\xfd}l]\x95\xa6\xf7\xdd\xe9\xd1\x9e2&\xfb\x96\xd9\xf4N\xe9\xd1\xa7\xc6PZ!\xa7\xffN/[tvnovFC\xdd~f\x1d\xed\x0b\x0c\xac\x8bga\x02f\xb3\x89R+\x87\x00\x11\x07\x9f\xe0\x90\xc2\x01R\\.\xaaJE\x0b0u\xb3\xaem\xc9\x7f&9\xae\xb5R\xe5\x83\xa7r\n\x14\x8c\xf1&\xfd\x0f\xd0\xe6\x91K\xc5\x1d\xc2A \xd1\xb8\xf5U\xbbp\xfaX\xbb\xca\x9f\'\x87\xbd\x15\x9b\x00\xc9\x81\xaf\x19\xe6\xfbh\x1bL8\x16\x90\x1d\x80\xccE\x02\xf8\xc40Ykj\xd5\xb8\x0ef\xb0\xe1\x89\xb1\xa3L\x1bm\xba\xbcA\xb0\x85\xc5\xa47\x945\xfb\xd7\xdc\xe6\x93S]\xaf1\xb7FQ\xae\xf8r\x9c\xdd\xc6\x89\xa4\xf0\xfbH\x9b\xba\xc8\xbf7 \x18"\x07\x1d\x89\x982\xa7N\xd2\x92\xee\x07\x04\xd6\xca\xac\xa7\xc7I\xf1\xf1*<\xee\x0fr\xf3"\x81\x99h\\\xe5\x85\xf5F\\\xaa8\xef\xfc\xab}\x10zHaT\x9f\x0c\xb9^\xc3\x86+\x8a\xea\x16\x91\x80\xf3\xc7\xa1 \xd6\r\x9d\x89"\x07\x0e|nT\xdfi@\xeb\x85\x88M\x9f\xec\xad\xe8\x05I\x81\xfer\xa0\xa3\xf5FD\xc0\xc7\x86!\'SP\xf3\x04\xf0\x85\x10t\x12d\xe4\x10\xbc\xc9 \xa1\x08\x89&\x0c4\t_N\x8e\xfdb/!n\xe0\xed\xe4\x18\xa6J#\xf8Ox\xa6\x9a\x91\xb2\xef\xf8|\xc7E\x03m\x7f+\xd6!=\xccvu\x9d\x96E\x85\xbbA9\xa2\xfb\xb9\xb5\x90\xfc=\x98\xc7\xa8\xf9\xa81\xc3\xe1\xc0\x8f\xe7f\xd7\xe7p5\x80\x8c\xef\x975}$F\x8abb\xc1\xceG\x9b\xd9\xfe\xc7lCsIu\xa5\x1dP(\x0b\x088\xfb\xd4~j[\xdb\xe4~\x1e\xb35d\xee5\xa1_7zA\x90\xe6\x7fl\xd3}+\x0c\xca\x8c\xbe\xccn\xa0\x0c\xc1\x0b?\xbc\xf8\xe7&\x90\x98\xe9\x02G\x0b\xec\xf2s\xf8\x91\xa9!{\x8e\xee|\xc9K\xe0?E9{\xa9\xa9{k\x99\xb2\xb9Z\x13\xe7\xb1\xab\xa0\xcd\xe1\xdd5[\x96\xb8&&\x9e?\xbcf\x0f\xb4\x8a\xf5\xf4u\x01\xc3#\x80+\xc2\x06\xb23|c\x85U\xeaMW\xdb\xb9\xaf\xed\xd9\xf2zS\x00\x19\x1a\x9b\x10\x06h\xbce\x1d\xfc\xeb\xebI\x02\xb5y=\xed\xd5\x1e\x93)\x99\xce\x06\xa8\x01\xe1\xd9\x0b\x9e\xb8\xeeR\xbb\x02\xc0\xfd)S$X\x85\xf6\x88\r\x93\x8a\xf9,\x1c\rK\xf2\xb5\xd0m\x8e\xf2\xc9\xbf\'\'c\xc6nY\xb7C\xd8^\xd4U\xfc:\xd5\xf1:\xeb\xacRv\xac"6\xd8\xb8t3\x9b\xe1\xf4\x1fD\xd5\xc2\xa5\xc2\xd3_\x8d\x16U|j%\xae\xf7\x8ca5\xbe"\xa2\xa2\x9c\x9c\xd2\xef\x0f\x9b\xda\x8e\xc7\xb2\xbbC1T\xf91\x1cG\xc5\xa4%\x0c\xd6|qD\xd9I][\n?\xa7\xaaW$\x7f\x90f\r\xee\x86\xe2&b\x80-\xb4\n\xe1;\x0c\xd9}\xea\x0f\xbf\x96\xb5K>^\x7f\xa6\x9dZ\x1c\x95\x9a\x1b\xd9M\xea\x97\xd9\xe9Jpz\x88\x91\xc3Xc\x81\x96V\xde\xfa#\xda\xa6&/\xaf\xbb\x9d\xae\x0f\x94\xc3M\xe1E\x93\x0c\xdcq\x86\xc6\'\xd7l\x8c\xd1\xa7\xd9\xdeA\x0e7\x1aFB\xa8\x95\x05jhl;\x1d\x00\x1b:h\xef\x9f\x0c\xd3{\xe5G\x0c \x12\xd8<\xcd\xcf\xa3\x1e\xd9\xa7\x17\xbb\xc8\xf5\x86k\x15\x9aI<\x14\x91\xde/w\x9e8\x86\x1b\xcc\xc2\x9d@j\x9fp\xa95\xb9\xe4\xbd,\xdeJD\xcd\xad\xf4Q\x96\xa7*\xdc\xfe\xdc\x1e\x0f9\x92\xa9X/\xc3\x16\x16\x893\x82\xf7\xe3\xcbVJ\xc9\x86P0\xb9tz\xcba2\xb0\n\xa8\xe2\x85%\xde\x07\xe2\xc0&B\xdb3\x86\x8a\xeb\xd2TqWb\xd5cN\xea~z\xa5\xceZ\x86$l\x82\xbak\x04\x8b\xa6\x04n\xe3W\xf2\xd1\xf3x\xf5A\xd0=\xadI\xad\x96\xac\x8aV\xd5e\xc0\x06|\xc3K\xda$O\xf0GH\xc4 \x1fbe_\xb3g&\xb6}\xf2^c\xa1\xe9O\xd2MO\xcb<\xfdq^\xe1\xe2I\xb0U\xa2}\xcd=3qjJk\x8bQ\x8b\xb4\x9cf\x19W\x0b%{71\xd2\x14\xe8\xaeK\xe3\x1fcs\x04\xb1\x95\xcf\xce:\x04\xc6l\xae\xba\x93\xb2C9\x06Q\xe9\x9bi\x1dfgk\xac\x8a2"2#\x88PV\x11\xa3\xf2r\xe6\xff\xbd\x9b\x82\xf3)!\xf8\x82\xf0?X\xe1\x81\xc8\x97\x1d\x94\x1e\x11\x86\xa0Ki\xe9|MK\xca\xb4\xa0x\x870\x88\x08?\xbe:\x89h\xa2\xc3:\x13\xe3\xb9\x87k\xd0I\x0f\x8aAbK\xcfTMU7\xc1\xa4\n~\x8d\xe8\x9a\xbfp\x13\xd9\xb7T\x11\xd5\xaaK^\xccF\xcd\xe7\r\xc1V\xac\x81\xa0\xb7\x14HR\x1f\nT\xb4\xd25\xdcJ0\x01\x14\xf7\xa8\x12\xb9\xb3\xec\xedYR\xc4\xb9D\xb8\xc9q\r\xa5`\xda\x8c\xdc\x98j\xa8Xr\xf9\x82\xe8\xe8>\xb2\x16\x94\xca\x8eo\xef\x85\xa4\xee\x9c\x0e\x98\xab\xb2\x92\x80P\xb1Q\xeb*\xd9\x94\xfa\xa3M&\x99\xbb\xaf\x86\x81\x92^\n\x1a\x86\xc7\t\x7f\xf56\xf2\xe3\xd5\x98\xb6@`\x9b\xedo\xbb]Z)\x19\x13\xf9\x83\xec\x0b\x91j\x97\xd4\xf9"\xbeT\xef}\xfe)\xf7\xc9X\x1d\x01\xc4\xb2\xec\x8bx\xe1\x84\xe6\xa2\xfd[}\x1f\x05\xcar\xfc\xecI\xe2\xe0\xceue\xff\xc1\xe3\xb98\xf0\xc5\x96KT\xbc\x06\x8d\x90$(x0\x0e\t\x93\\^\x81J\xd2\x89\xf2J\x08\x14\xc6\xc6;\xf0\xee\xfe\xa8\r,z\xd8+?\x19\x9b\xedm\x1e6;\x85\x0b\xab\xa4\\%\xa2\xcdQ\xb4\x80\x1eX\xd2Ir[\xa7\xa2$\xbf\xd5\xa5\x05\xbd\xed\xf8\xd8\x1fk*\xd0\xcb\xf9f\xb0\x86\xd98\xde4a]M\xf6+\xdf\xb6\xf3\x04\x19\xbc\xe4\xa1\xfb=~\xaf\xed\xc0(\xf5\xc6\xd1\xbe\xe2\x9c\xcf\x80r\xf4\xfb\xa0\x1f\\\x05~:\x1e\xf3\xa2.\xb8\x1b\xd0\xa1MuW\xaa\x86\xf5\xafw\\\x96\xe4AjXZ\xb0@\x17*P\x01\xf5\xd6\xa0\xed\x95\xc7(\xb2\xfa\xfcw\x84\x91\x92\xf5\xcc\x8a\xa4\x86\x97\xff\x12\x8a\xe2l\xf5\x00f\x9f\xab\xd5\x06U\x88\xb5#\x93\x18\xfa\xc5\xf8!\xdf\xfb\xfe\x97\xab_+\xc1@.\x08&\x97|o\xba\xfd\xb2\x89L\xc1\x1bL\xa1\xc9\x88p#\xca\x9f \x8c\xe4w*D\x05\x91W\x87\xaf\x9e\xf4\xa5e\xd4KVx\x0bT\x7f\xc0\x97\xbab\r\x7f\xcc\x05\xaf\x1e@7C\x93\xc5\xa7\xcc\x9d\r\xee$\x9d\x9d\xe1\xef\x129}s\xf7q\x00\xfe:\xd2V\xb1\xe2\xf4\x99\xe0\x06\xd9\x91\xd4\xc1a\x18\x1bc\xb3\xda{\xc1\x8e\xb3\xf2\xe0H?P>H)Z\xa2\x1e\xcc\x87\x16\x81\x07\x88M\x90\x84~\xb9\x88"\xf7ADJ!\xef\xa4\xf4Wv\xe8\x8b\x92\xdb=O+\xb4\x19q\x7f\xbb\x1d\xd1Paa\xc6\xdb8\t\xba\xa3\xe1*\xb3\xb5L\x11\xbc\xdc[\x0c\xe2L7\xc8\x91 \xbb\xc8\xe1\xdb\xbdU\xcc\xadF31_\xeb\x02\xf6\xa3\xf1\xe4(\x11\xf3\xb5bA8KL\xd0?\xa1\x87q\xb4\xee1\xb6s\xeb\xff\xf5\xa4a@\x85\x8c\x82;0\xd9\xac\xfe\xd8\x13]fs/\x16@\x9fj\x05\x08N\xf9\xccC\x9c\t\xa9k_\x04\xc2\x1dW\xdd\x19a\x1e\xce[\x1a\x12p\xde_\xbdzt5\n\xbei-?\xfb6w\x93;\xcc\x8f^+\xcf\x1b\xcd\x03\xfe_C;\x8b8j!\xbb\xf5\x97\xaf\xea\x94\x8a\xb3\x11\xfc"[x\x8f\xc8\xd3Q8i\x9d\x1c\xd1Q\xcb\x909\x0cw\xa7L2\xcf\x91\xa3n \x14\xe3\x1dq\xf9_\xd4z\xc1cVe)\xfd\x15\x1f\x12\xdfT\xecL\x0f\x14~2\xf1z\x18\x9b\xaaX\xb6\xd17\x13#\xc6\xbfZ\x0eh\x18\xaaJV\xda_E\x1eA{w\xee\xc7|\x8b\xde\tq\x80oh\x96o\x0e\xceIr\x05;\xae\xf7~|\xb3u\x84\xfe\x0fa\x00\xd1\xa1\npf\x96>Ec\x0cN\r]wzf\xef\xb9d\xc3,k\xe2\xca\xc0\x8a\x81\xd9.\xe3\x8a~\x8b\xfaN\x16\xfe\xb8zSV;\x93@\xaf\xb7\xf2ajA\xb9\xf3<\xb5<\xed\x8c\xb5\xb6\xfa/\xa3~\x05\x10%\xc5\x8d\x01\xdc\xa5\x04S\x1c\xa7"\t\x0cQ\x88\xab\x90\x06\xb4L6n\x81\x94q\x89\x8f\xf6\xbb\xdc\x1e}dr\x84d7-\x88*.cb\xcc!\xc7\x85A\x05R\x1a\x0b\x03\x90\x1e\xdf\x8c\xdd\x91\xc8\xc1\x13^-\xd0\xaa\xabJ\xc1\x92\x13\xb0\x00v\xdbQ\xf2\xc0FGB\x15\x05\x0cw2X\x1b\xf7\x81\x8dpX\x80\x83\xbeJ8G\xe6\xb3\x89\x9b\x9d\x97\x1c\xf4\xa8\xee(\xdak\xa5R\xfd\xbb?\x84U\x85s\x8a\x87\xe9\xe3@\xf2\xd9f\xe3\x9c\x9c2$"?\xc2\xf1\xd5\x8f\xe9\xbb\xd0\xccIXg\x1a\x9e\x1b\xbb\x83]\x82%0\x8c\xd2\xa2\x08;\xb0\xd3\xfe\xaf[\xe9\xa0\x0f\xd3\x15\x98\xc5\x90~\x95\xa3\xf1\x1f% 2\x0e\x0fg\xeb|\x06J\xbbk\x80-rL\xf7\xdb\xf3GTs\xbeJ0\xa2\x9f\x00f\xd4\x9cO\xd2\x82h\xf3\x1c\xaf\xbd\x0c\xca\'\xeb\x03\xd4h\x12\xda\xe5E}\x8c9\x84O\x01k\xd8,\xb4\xb7f/\x98\x08\xa9\xa6\x94\xbfTcS\xbb\xf4\x8f\xd8\xacL\xa4\xea3\xaf\x13\xf0\x16\xf5\x86\xe3\xaeso"\xe5\x12\xf5\x11\xad\x0c\xbf\xfd\x0e\x10\xa9O\xf6\xe6\x1e\x8f% \xfa\xedf~\xc97\xf9\xdfk_\x0bN\xf3\xa6\x0e\x9dcf\xcc\x0c\x8d32\x157C%u\x06\n[p\xb4\x83\t\xccy\x0e\x85\x9f\xe3a\x07\xb8\xa6M\xda1A}\x9bIV\x93\xbc\xe2\xcc\x8f\xa8\x84<\x13\xb6\xe0\xd4\xe3\xb8,\x01Y\xb9\xdc\xd7+\xb2\xae\xa6\xf6\xf5\xdc\xbf\xbc#>\xe3t\x00\x05U\x99\xd3\xbb\xe1jA\xb0\xaf\xec\x01Q*\x9c\xf2\x03[\x0b\x96\rE\xa1v\xf7\x9au/\xf7\xc40\xcc\x10\x8f\x0ed\xce\xaf\x89#`\xf8V\xa5q\x15\xbe\x01B[\x8e\'\x17\xd10\x9c\xd8\xa6Cp@\t=W\x067p\xa5\x89\x8em\x08\x18duekTe\xf4)L.\xf0\xfd\xe5\x7f\xd2\xd4NY\xdf\xde~\x1c/\xd5:\xb3\xff\x9a\xb6\x85\xbe\'eP\xb7\xbe\x9bd\xca\x94FR\xd6_\x05&\xcbJ\xae\xe0\xa2\x81a\xe1\xc4\xc6\x846r\xc2\x10w\xda\x15[\xd7\xb6\xd2DOI\xc1\x1cH\x17\x12g\xa7H\xaf\nT_\xf1\xc3\xb6\xcf#e\xbf\xa7\xb7\xa8?d\xfeeX\xc4k\xa36\xd7j\xed\xf7\xe4v)hJ3\x9e\x9a,\x89K\xba{\xed\xefdy\xd641s:\x8a\xc6\xe0G\n\xc6\x1b\x85\x7fy\x11J}\x1c\xd4\x87~\x0b\xefR\xbb\xb78\xa8\xc5\xdb\xf2\xf6u\xc2\xd7\xb7\xf2a\xec\xbe\x9b\xa5\x156Kp\xf27oN\x17|\t\xb2\x94\xa5S*\xf7\x83\x87\x1f\xa8l\x92\xa2\x84=]')
|
1
|
+
import datetime
|
2
|
+
import uuid as uuid_mod
|
3
|
+
|
4
|
+
from sqlalchemy_serializer import SerializerMixin
|
5
|
+
from dateutil import relativedelta
|
6
|
+
from hiddifypanel.panel.database import db
|
7
|
+
from enum import auto
|
8
|
+
from strenum import StrEnum
|
9
|
+
|
10
|
+
|
11
|
+
class UserMode(StrEnum):
|
12
|
+
"""
|
13
|
+
The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
|
14
|
+
"daily", and "disable". These modes represent different settings that can be applied to a user account,
|
15
|
+
such as the frequency at which data is reset or whether the account is currently disabled. The class is
|
16
|
+
implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
|
17
|
+
"""
|
18
|
+
no_reset = auto()
|
19
|
+
monthly = auto()
|
20
|
+
weekly = auto()
|
21
|
+
daily = auto()
|
22
|
+
disable = auto()
|
23
|
+
|
24
|
+
|
25
|
+
class User(db.Model, SerializerMixin):
|
26
|
+
"""
|
27
|
+
This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
|
28
|
+
account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
|
29
|
+
"""
|
30
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
31
|
+
uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
|
32
|
+
name = db.Column(db.String(512), nullable=False)
|
33
|
+
last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
|
34
|
+
#removed
|
35
|
+
expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
|
36
|
+
usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
|
37
|
+
package_days = db.Column(db.Integer, default=90,nullable=False)
|
38
|
+
mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
|
39
|
+
monthly = db.Column(db.Boolean, default=False)#removed
|
40
|
+
start_date = db.Column(db.Date, nullable=True)
|
41
|
+
current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
|
42
|
+
last_reset_time = db.Column(db.Date, default=datetime.date.today())
|
43
|
+
comment = db.Column(db.String(512))
|
44
|
+
@property
|
45
|
+
def remaining_days(self):
|
46
|
+
return remaining_days(self)
|
47
|
+
@property
|
48
|
+
def is_active(self):
|
49
|
+
return is_user_active(self)
|
50
|
+
|
51
|
+
def is_user_active(u):
|
52
|
+
"""
|
53
|
+
The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
|
54
|
+
"disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
|
55
|
+
function returns a boolean value indicating whether the user is active or not.
|
56
|
+
"""
|
57
|
+
is_active=True
|
58
|
+
if u.mode == UserMode.disable:
|
59
|
+
is_active= False
|
60
|
+
elif u.usage_limit_GB < u.current_usage_GB:
|
61
|
+
is_active= False
|
62
|
+
elif remaining_days(u) < 0:
|
63
|
+
is_active= False
|
64
|
+
return is_active
|
65
|
+
|
66
|
+
|
67
|
+
def remaining_days(u):
|
68
|
+
"""
|
69
|
+
The "remaining_days" function calculates the number of days remaining for a user's account package based on the
|
70
|
+
current date and the user's start date. The function returns the remaining days as an integer value. If the start
|
71
|
+
date is not available, the function returns the total package days.
|
72
|
+
"""
|
73
|
+
res=-1
|
74
|
+
if u.package_days is None:
|
75
|
+
res= -1
|
76
|
+
elif u.start_date:
|
77
|
+
# print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
|
78
|
+
res=u.package_days - (datetime.date.today() - u.start_date).days
|
79
|
+
else:
|
80
|
+
# print("else",u.package_days )
|
81
|
+
res=u.package_days
|
82
|
+
return min(res,10000)
|
83
|
+
|
84
|
+
|
85
|
+
package_mode_dic = {
|
86
|
+
UserMode.daily: 1,
|
87
|
+
UserMode.weekly: 7,
|
88
|
+
UserMode.monthly: 30
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
def days_to_reset(user):
|
93
|
+
"""
|
94
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
95
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
96
|
+
date is not available, the function returns the total days for the user's mode.
|
97
|
+
"""
|
98
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
99
|
+
# if user.mode==UserMode.daily:
|
100
|
+
# return 0
|
101
|
+
if user.start_date:
|
102
|
+
days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
|
103
|
+
else:
|
104
|
+
days= package_mode_dic.get(user.mode,10000)
|
105
|
+
return max(-100000,min(days,100000))
|
106
|
+
|
107
|
+
|
108
|
+
def user_should_reset(user):
|
109
|
+
"""
|
110
|
+
The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
|
111
|
+
user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
|
112
|
+
date is not available, the function returns the total days for the user's mode.
|
113
|
+
"""
|
114
|
+
# print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
|
115
|
+
# if user.mode==UserMode.daily:
|
116
|
+
# return 0
|
117
|
+
res=True
|
118
|
+
if not user.last_reset_time:
|
119
|
+
res=True
|
120
|
+
elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
|
121
|
+
res=False
|
122
|
+
else:
|
123
|
+
res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
|
124
|
+
|
125
|
+
return res
|
126
|
+
|
127
|
+
|
128
|
+
def user_by_uuid(uuid):
|
129
|
+
return User.query.filter(User.uuid==uuid).first()
|
130
|
+
|
131
|
+
def user_by_id(id):
|
132
|
+
return User.query.filter(User.id==id).first()
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
def add_or_update_user(commit=True,**user):
|
137
|
+
# if not is_valid():return
|
138
|
+
dbuser = User.query.filter(User.uuid == user['uuid']).first()
|
139
|
+
|
140
|
+
if not dbuser:
|
141
|
+
dbuser = User()
|
142
|
+
dbuser.uuid = user['uuid']
|
143
|
+
# if not is_valid():
|
144
|
+
# return
|
145
|
+
db.session.add(dbuser)
|
146
|
+
|
147
|
+
if user.get('expiry_time',''):
|
148
|
+
if user.get('last_reset_time',''):
|
149
|
+
last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
|
150
|
+
else:
|
151
|
+
last_reset_time = datetime.date.today()
|
152
|
+
|
153
|
+
expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
|
154
|
+
dbuser.start_date= last_reset_time
|
155
|
+
dbuser.package_days=(expiry_time-last_reset_time).days
|
156
|
+
|
157
|
+
elif 'package_days' in user:
|
158
|
+
dbuser.package_days=user['package_days']
|
159
|
+
if user.get('start_date',''):
|
160
|
+
dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
|
161
|
+
else:
|
162
|
+
dbuser.start_date=None
|
163
|
+
dbuser.current_usage_GB = user['current_usage_GB']
|
164
|
+
|
165
|
+
dbuser.usage_limit_GB = user['usage_limit_GB']
|
166
|
+
dbuser.name = user['name']
|
167
|
+
dbuser.comment = user.get('comment', '')
|
168
|
+
dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
|
169
|
+
# dbuser.last_online=user.get('last_online','')
|
170
|
+
if commit:
|
171
|
+
db.session.commit()
|
4
172
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
173
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/panel/__init__.py
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from . import user
|
2
|
+
from . import admin
|
3
|
+
|
4
|
+
from . import cli
|
5
|
+
from . import database
|
6
|
+
from . import common
|
7
|
+
from . import commercial#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
8
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,172 @@
|
|
1
|
-
|
2
|
-
|
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\x93 \x00\x00\x12\t\x04\x00\x8fN$\xed\xe7\xe9U\x19:\xc0\xca\xcf\x08m@\x17\x00\x00\x00\x00\x00\x00\x00\x00\xda!,\xdb\xc4$z\xc6\xd8\xc07\xd4\xca\xbd\xa8*6\xb8c9YR\x88\x1f\xfe60\xfc\xb4ku{\xc9\x80\xe6\xd8\xf5\x1d\x95\xdf\t]a\x07s\xef>\xf0w\xce\xcc:\xd43cm\xae\x95\x8f\xbf}\xcc\xfa\x0f\x19\xf8\xa4\xea[\x8cK>$\x86\xb5\xfc\xfb\xd3\xbdS\xc3\x00\xd8\x0f\x17\xe8\x10\x94\x9bu\xd0\xe2Y\xd8\xeeq{\xa0\x11m\x918\xae\xa0B\x86q\xf3\xf24\xb8\x0cP\xb0\x1a(\xf7{T\x17\xfeX\x84\xaf\x9d\x8dq\x88>\xb3w\x9f\x07j\x94t\xee\xca\xbar\x15\x18Z\xf6\xf9\xc5\x80\xbf\xe3U\x9bK\xce\x188\xa4=D+\';\xd2y\xef\xe4\x18gq\xdd>\\4\xa9\xf9l\xef\x95?G\xc5\r\xc7\xf5$u\xafp\x14\x1fA\x8f\r\xbc\xe1\xb3T\\:kG\xb6\xb3\xef\x06\xd6A\xccy\x94\xb66Mg\xea\xb2\x06T\x16\x96\xea\x12\x91 \xa3\xd9\x81\xdd\x0cm\xc7\x92T\x8e\xcf\r\x04q]L\xd6\x17\x13{\xfaI\xb7z\x81{\x16N\x81D=\x96\x1eS\xd8\x86\xa2\x1a\xb6\xc6\x00\x80`4\xfc\x8f\xda\xbaj\x14Zk\xf8\xfe\x8b}m\x11\xaf\xdd\xb5\xc5NW\x99\xbff\xb6TO\x94\xd0=\xd5\x97\x9f{P#\xf8\xb8\xad\xd6\\\xd9\xc84A\xd0!W\xb1\xce\xfe\x99\xae\xf9\xe5#\xf8\x1c\xc5\xb7sT\xfc\x8c\xdev\xe3\xa6\xa2\xf1\xf1i\'\xbc\xcc\xbbP\xd1\x7f\x1c\xe4\xda-\x1b\x8b\x1f\x15\x08nk\x17sJ\xf5n\x07VL\xc4\x80\xdcN\x92I@<\xc3\xd4)\xc31w\xa5~!J\xa0\xcew%?h\x95\x01\x93\x8a\xd7G\xde\x9f6\xfd\x8e~\x022i\xa8\xed\r\xdcY\x8a\xa3\xcf\xe0mh\x81\xbd\xb6\x1f\xc3\x92\x93!\xe0\xfd,^\x90l\xc7\xe9\xe8I\x92\x0b\xee\x80]\x1d\xf0i\xdd\n\xa7\x8dG\xbd\x96\xc3O\x94\x06\xee\x98\n\xf8\xddu\xa7\xef\x887v{|\xb9\x16\x06.\xbf\x93\x13@\x16\x0bS\xd4"T\x89aj\xab\\\xba\xe6T\x93\xf0\rl\xe6\xe6\xcd\x10\xff\xba\xbe\xc1\x9a\x84\xdb\xd7\x02(\x02\xff\xa4\xd7\n\x1f\xf5t\x04$5:\xb7\xadR\xfcH\tA\xef\xafAQ\xbf\xea\x00~\xb0~;\xeav\x8d\xcc\x10\x0c0w\xda\x07B\xac\xfd\xee\x13&.\x1bH=WH\xde\t\xc7>\xb6\xe96\xdbIU\xadK\xcc\xe7\xf2\xb8N;\x06\xcd\xce\t\xf3\x97\x01\xd9\x1b\xa0\xf6O\x0c\x91\xe9Z\xb6y\x12V\xf3Y\xc1\xbf\x8a\r\xc5[\xf1\xeeO)\xee\xc6\xd7\xbe\xfd\xa45\x84UlY\xad\xe1\xe8(\xb5\x82\x05\xcd\xe7\xf3.\x82\xf9Tgs\xcf\xd6\\\x801UC\xb8I\xb3\xed#\x1c\x85{\xe5-\xa8\x9d\xcf\xcb\xea\xd3\xe0p+$\x90\x08\x03\xa0\xc8Y\x92K^f\xf8\xc7\x02+\xdb\xa5\x13+\xa9\xc4\xfe\nz\x1b\xecGO\x00\xd8\xa5C\xf7\xb8\xb4\xe9\xf9\x16\xf6\x0f\n6\x14\x89\xa3$\xf0\xe5e\xdcO\xc6j\x0c\x94LA\x85\xa0h<j\x07\xdfF\xb4\xa3\xec\x1a\xb4\xa3`3\x92\xcf\x8a\xc5L{\xe2\x8bc\x19\xf0Q\xa4y:\xa8\xe7*^\xc6\xc8\xe2\x0c\xb1\xb1zYb\xbf`6\xc5\xc1\x92\xce\\\x05\x1a\t\xa8\xce\x0c\x94\x8f\x1a\'_\xec\x84\xd2.l\x99\xe5a/&\xe2Dk[\xfd\xe2O\x82v\x1d\\\xe6\x86\xd0\x15{r\x84\xa8\xdaZqPN\x8ar\t\xd1\xc27\xfb\xdd \x97\xcfQ\xeb\xdd\xfa\xfd\xbc\x90Z\x10\xc4.L\rY\x97mji\x8d\x1d\xf4\xa7\xfeQ9\x10Rsy\xc1?\xdey\xf9\xce"S\x92\n\xb1x\x8c\x18\x03i>\x85>\x1e0\xe1;\xde>Z\xb5\xa4\xae\'l\xd6\xb4\xb9\xf3\xab\x85!\x08v8\xa95\x0e]~\xc8\xd8\xdb\x90G\xce&f\xb3c\xbe~\x10\x0f?``\x05\x01\x99\xf6\x1cL\t\xcevx\xcbe\xafM\xb3\x16\xec\xaew\xe4\xea\xf0\x1e\xa5\x0e\xa0\x12B\x1a\x11\\\xb2\rSGd_\xda\x8f\xe8\xb6Vsj\x15\xd4\xf1\xd5\xce\n@\x91\xd6 \x99oX\xd4=P\xa2\xb9\x8d\x8d=\x8bE\xa5\x1b\xc7^\xdd8e\x8f8\x80\xa24\x8dG|\xfb\xba$<<\x18\x82K#\xf1t\xe3M\xa9\xfe6\xd8\x997\xee\\\xfa%\xb1K\x1eo\xa4\xd8\'H\xf4?)\xc0d\x1a\xe3Q7\x99P\xda\x12\xf6t\xfd\x13t\x03*\xcf\nz\xb9\xb4i\x1c\xd61#\xc0;3 \xdc\xd7\xa1\xf1\xff\xda\xa4\x14=tb\x1f\xb3Bg>Q}7\xb2j\x1d\x85H\x9bT\xc5\x98W\xc9\x0b]\xbf\xe2\n6\xcd@\xb3P\x88\x85\x9f\x02E\x88sS\xbf\xc0\x98V\xd4K\xb4\xd7\x9a\\\'\xa1\x82B\x84\xc5\xd6\xa2\xaa \xffy`\x90`\xa83\xe8R\xf1#\xb5\xfc\x99\x93\x168^\xe7\x88b\xae,\xf7\xcaUv\xa6\x86\x0f5\xaa0\x0f(\xfeV\x80\xcb\x89\x1f\x9e\xa9\x8fq\xc3\x01&`;v\x84\xf8\t9H\xfc\x1d\xccn\x83\xb3\\a\x1b*\xac\x96n\x9fq\x9eH#\x9eJm\xd4\x9f\xf3l\xa1G\xb8)\x19\xcc;\xe4\x80\xab\x80@\xd5\xcb\x87\xc4\x8b\xa2S\'\x9a\x96\xbaC\xc1\x00\xb1\x80\x88\xc1K\xb0\xe7\x05D\xf4\xb8\nw\x0c\x9a\xbbU\x9fc\xb4\xa1X\xb5\n3 \xfb!\xe6;\xdb\xe5\xacKq\x94v\x14\x9e\xe2?\x96\xf3\xd0<N\x91\xb2\x91\xb61\xf9w\xa5\xca(`\x1a\xfc\xfb\'\x9ek\xb8?\xdb\xafb\x93\xe66\x14M&=3\x11{\x01\xc1\t\xd02\x7f\x9bx\xf8\'\xa9\xc0B\xce\xfbk]/\xab\xde|\x9a4\x97c3F#%\xe8#\xd0S\x86\xea\xd5\x91\xa8\xf7\x8e\x17\xfe\x9e\x9d_d\x1c\xa7z\x1b\x8c\x0b\xff_"\xe0\xcb\n\x01\x99u\xd9,\xa1\x9a\xc6J\xe5\x88%\xd8\xc5Y\xe6v&\xe9\xe0\x9d\xe6l\x9f9\x91\xf1 \xd8+\x0b\x04\x84\x04\x08EJ\x9d\xadS:\x9f\x92ZJ\xe7\xcd\x00\x9c\xb3a\xd5\xf2\xd7H\x91\xf7\xc1w@\xed\x12W\xacp4\x98\xce\x15\xe4x9\xda\xecE\xb1\xb0\x8a\xac~\x82\xc3\x93\xd5\x80\x0b2\x05\x88\xadi\rCr\x96\xc0\xcd\x9c\t\xd1\x81\xee\xc9\xf3\x1d{\x93\xf6\xc7\xa2\xfc\xea\xc53\x05\x98\x19r^P\xa7\xa1\xd8\xc7]\x8dWe\xa5\xa8O$\x9fm\x92\xdb\x90\xcc\xde\nM\x1f\xff\xe8\x17\xfb6O$\xe0|s\xbd\x81\x16\xeff\xd7\xc9{\xc5\x94?\x0b\xd0\xa1\xaa\x84\xef3\x13j\x81\xd8\x1c\xbe=\xc0\x99\x923\xfc\xbb\x04(z<\x1a\xa3H\xde\x10V\xd4`\xeaS\x0f\xc1,\'\\\xb9\xfd=\xb97i\x82[jW\x8e@&,+\xe9\xe3\xc0=\xe2\xf8\xe0$\x1f\xc7\x1cy\xaf\x9a\xc2g%\x86\x18\t]\xddg\x86\x847\x82\x9f$\x0es\x17\xee\xc0L\xdf\x8d\x96\x9f(#\xc5\xb9/\x80RF\x03\x0c\xe2_g\xc1\x06*\x19:\xb9*$\r\xa5ys\x7f\xe2\x0f\xab\xa4\xa5P\xb0\xefd\xc9\x18\x0b\x8b\x90Z\xf3\xe1gg\xee\x8b\xd6v}[\x05\x1f\xed\xdb\xf1<W\xe7\xa8\xbf0\x8c\x1b\\M%&\x02\x13\xf6\xd2\xa0\xe7e\xc5\xb9\xd73\xeb\xf2\x18[X\xb6D@PD\xbfa_\x1e\x1d\xd1\x0c\xda\x04\x837\x06\xb0s\x9e\xea\xfdj\x91/\xc0ab\xaeI{SSV\xd1\x1a\x10\x8e\xd7\xaeK\x8c\x8b8\x82\x1a\x16\xdei\xf5X\xeb%\x19\x03\x14(Znss<sM\x1dK\xec\xb5x\x7f\xe0\x03nH*>\x1f\xf0.\x0e?\x0f!\x110\x84I\xa5\xbcm\x82c\xa8\xbf^P5\xdchJaz\'\xac)\xaa\xd8\xfe\xbd\xd4e\x1f\xf4\xf3\xe1\x84m\xe6\xb0\xb5\xa1\x992\x97`\nu\xd7nL/\x1a\xfav\xab\x8f\xe7z\x87t\xd9\x01\xf8\x1f\x84\xb7\t\xaf\x01\xc8\xf1\xd2\x0fa4\xb4\x88z\x18\nF)P@\xdf\xd5\x10\xb9\xea\xa9W6\x91B$+\x94\xe7\xd4\xfe\xcbH\xdb\xc8l=Z\xbf\xae\xdfB\xc0TmBh|F\xb5\xed\xd6\xce\xca\xf65=K\xb1"\x89\xa0X\x88\x8dT6\xb4\xb2\xcc\xe6\x9fI\xfa\xfe\xea*F\xec\xa4g\xeb<ajf\xcb\xb4}\x9ekA\x83N/\x8a\x8b\xdbVL\xf3\x12\xb3\xea_Q!4b\xbc\xa9\x88/y\xac\xcf\xda \xf1\x87\x0f\xc4\xe30\xe6^\x1e\xfe\xb8\xa8/\x07\xf5T7\xfbA\x94\x03\xb95\xa8y\x1cH\x9b\x9d\xc9\xd5/\xd6\x11{\x9a\xbb\xe0\x9a\xd5\xba\x11HpyH\x17\xa7q\x82\x9a\x9a\xe3\xc3\x93\x16\xa9G\x9b\n?\xf3^\xba\x10\xcc\xac\xe4\xc0YE\xd8@J\xa0k\xf5\x0bn\xa9ro\xe1\xb3:\xdaW2I\xbau\x0416\xec\x85\x0c\x19\xbeR\x98\xe8\xb9\x93\x074\xf4\xdbK\xf23D\x8c\xbet\xf8a\xb3\xf6\xaa\x89!\xff2\x079\x02W\xb4\xc0\x9cc\x98\x03(F\x05\x10\r\x1e\xd5f\xf4\xc2\xa6\xce\xde\xe5\xa2\'\xa7\xca\x9b:\xcf\xf4S5m\x04\xfa\x1e\x88\xe9\xfc\xeb\xf1\xea\xe7\xc3~\x96\xc0\xc9\x9c@j\xde]\xbc\xacU\x01\xde!\x07\x1b\xb8\xe5\x91\xba\x9c&\x9d\x8a^\xe5\x9f.a@^\xf5(\xdfQp\x04\x84\xbd\xa0\xdas\x8d\xcd\xe7Y\x85\xfd\xa3a\xf2\xdc\xcd\xbfG\xe5\x87\x986\xd3<\x80\xdb\x95\xfa\x80\xc26b \xe8\x8d\x05\x0f+Fp\xcc,L\xa6\x17\x8c\xc0\xfb\xfd\xe9t\xb4^\xd3\x84\xfd\xc0\xcd\xebM\xf9Y[k\x02\xb0\x82\xc3\xac\x1e\x83\xacl\xaa\x1em\xce>\xbf\x19\xbbA\xffl\xbf\xa4\x8dJzqgU$\xe8\x08i\xdf0\xd0o\x94k\x8a\x1cQ\xa8\xbb-\x84\x94a\xc6;\x9f\x9cV.\xde\x8b\xeb\xd4\xb0\x10P-\xff\xd2\xed\x1c\xd1\xb7\xaf\xa4\xcb\x0b\xa2\x12\x99\xa3\x0b3\xb0\xf0\x17\xd8\x85o0P\x8c\x9b\x81\xc0\xa56\xa4\r5\x9d\xe3\x05\xa1\xdd+*B\x9fM?\xdep\xd35\xa2\xfe\xb1l\xcb\xd4\x961\xe7\xe9\xea\xc3y\xb2k\xcc\xab3u\xd5u\xd8U\xef7i\xc2\xca\xb3\xb6k\xfc\xe1\x82I\xf2\xb9\x19\xad\xce?\x96\x83\xb9`1\r\x8e\xef\xd1\x93RN:\xa9\xac\xb4\x03\xcaev\xe2\x84{\xb2\xf5\xe2\x99\xa0:\x1d\x90\x0e\xca\xbd\x8d|\xbd\x97b\x8a-\x12\xf1\x1a\xd9@\xba\xa3\xa1\xc6\xb3{%_\x003\x06\x0c\x1axF\xd8\x10J\x15#"\x82\x0c\xa2\xe7\x06\x10\xa1y-\x11\xa1\x89*y\xf1\xf0\x02KoS\x07S\xb3\xf7\x19\xef\x0eb<s\xd6Y\xef\xf5\x95L\x14\xc3{\xd4e\x13f\x99\xde\x88\xfa\xeb\x1aS\xfb\xd4\x97\xd8X\xf4F\x856d\x01Y\x0f\x97?y6p\xa6+\xbb\x87\x15}\xff\x90\r\x82\x8d\xb0\x00\xbe\xc0h\x86VK\x1e\x89r\x9b\xd6\xa4\xd2\xec4\xa5\xa5\xfcC7\xb7?u\x05\xb8\x81\x0b\x04\xc5\x02s\x84\x02\xe4_\x06\x8b)\tO.\xd2\xbfc\xe1\xcf\xca\xb71\r=r}h?\xd2\xc2\xd7S\xca\x17\xe7\xdf\xf0\xd1\x0c\x8a\xaf~J{\x93\xfe\x9bc8FS{m\xa6\x0e\xd0\xb6\x0b\xdb`\xf7\xe4\x17T\x1c\xe9\xaa\x86\xc2}!\x99\x9e\x9ac\xbd\xfd\xad\xe3\x91\x0cM\x0c\x91\x13\x83M{\xca5z\xa8]\xf0\xb2\x7f\xeb\x85,\xab\xdd>\xac\x9c\xb8z\t\xe9}\x9aTv\x7f\xca\xd6\xeb\xe1\x1e$h\x14\t\xbb \x1a9\xbc\x9b\xbf\x1cT\xdc\xe0h\x01\xc20\xe3`\x05I\xbe\xd4\xee\x9f\xbf\xfd(8B\x9e\xc58\xf6&\xfeOh\xbe\xea\xb0F\xb6\t\xdb\xeb\x00^\xcf\xa2G\x8dv\x98F\xb3C\xf5of\xe2\x87\x86)\x87=\xe3\xbf\x1e}\xca\x0ee\x98jY\xe8ga\x14=\x95\xeb\x02\xde]E\xa3SVxW\xbd\xa3\x89\x80\x9a\xd78J\x0f\xc1\x96\x9a\xd9\x84\xbcF\xca\x91<\xeag\'\xcbs\xb2W\xf4\x8c\xaf_e)zp\x82\x829\xc0y\x83\xe9\xb9\xdd\xa5$\t\xc0\xf2\x1e\x0b\xc7\xf8\xae\x83\x1c\x00$L\x8dF\xde\x9b\xe8\x86\xb3cJ\x88i\xfa#\xd0+\xb6b\x0b\x031\xa1\xf9\xbc\x03\xd9\xa2\x8f\xfb\x17j\x16\xef9\xae+<\x01#Sa\xe0\x8bC\x87\x0e\xc4b\xb7\x93O\x15ao\xbc\t+\xd6\x0eNH\xa8~\x0f\xda\xeff\xfe\x1f\x90u\x7f\xfc\x05\x0fS\\f_p\xec\xd1[\xee\xe5]\n\x0e\xc6\xcc\x0b\xd5\xb0Yo\xaa\xca\xf0\x10\x8b\x04\xa8\x19\x02\xe9O-\x120U5\x8d\x95F\x8cKY\xce\xdd\x83\xf8S\xd5\xa4\xa7\xc9w\xb07\x88\x0bX\xbe\xb2\xb2\x1d\xb5"eA\xe5\xfe\xa6\xcd>j\xf15\x0b\xfb\x16\xc4\xae]&H]\xed\xf3\x97\xd4\xb3\xa0\x97\xb1\x8c\x88z[(\x7f}\x839\x10\x0fj\x08\x9e+%\x0e9n,Nu!\xcbf&\xe6\xec\xc1\xd1\xbb\x8d\xe5\xdc\xaf\xac:\x86q!\xd6\x9e\x8a\x89\x91jb\x19\\\xf7\xef\xeb\x11;\xfb\xa8B"\xad\xfb\x95\xda\x9f\x8b\xce\xe0\xa4%\xa5\t\xf4bn\xba\x95\xb8QB\x9boC2\x14\xf1c[\xaf\xf7\xb8\xa3\x06\xd4\xfe2-\xa4*\x02\x90r\xf1\xd6\xbbT"s\xd2\x86V\x1b;\x02\x85\xde6P\xa7P\xb3V\xbf\x94T\xf0\xfc\x1c\x1f\xd3\xeb\x12\x1e;\xfe\x8e\xf7\xa4\xfc\xe0A\x82\xca\xea\xe6\x8e\tC\x89\x0b\xceo\xda\xf6\xd0\x9a\xf9\x84u-)+t\xc7/mm[7\xd6}$\xa7\x11\xfa-uX\x89\xe9\xb0O\xb5:Z\x9f\xa0\xac\n\xf7t~\xfb;\x87F\xf1l\xb5\xd1.\xd8\xc4\xc7$b\xfa\xb6\'\xb2\xdc\t\xf3\xfcw9~U\xb5\xb5\xefO\x1ao\xb2\x93\xba\t\r\xa8\xcaS\xdb\x9f;\x05#\xf5*F\x06\x14K\xd6\x18C<UV\x9d3\xa0w\x0b\x11\xb1e\'\xb1\xf0\xb7\xac\xc4\x9f\x92\xeef\'v\xb8\xf6\xd7\x83_ VL\xb6C3\x99\x99\xcc9\x06\x98K`9D\x03\xfdR\xf3U\x05\xa7\x13\r8y\xdb2\xcd\xff\xbb\xe7\xab"\xedS\xd1`\xa3\xd5\xce\xacx\xff\xab\x10q\xf4\xd81\x07\xed\xb9\n\xcb\xa8b_\xc7\xf2\x89\xc7\xe4\xd7\xc1\xfbi\xd8\x8bP\xd7*\xbcFi\x87\x06\xb2{z n\xbc\xaa\x83\x00AD\x86\x8f&\xd0<\xac\xc3i\xa5\xc3+\x88\xb5R\xf3\x80\xa8[[\xab\xddiK\x140\xbd\x15\x94\x0f\x8d\xfb\xbb\r\xa1{4\xc3Td\xce\x83^Wp\x10\xbb\x13\xe43$=F\x07c\xa5\xaa==j\x193\xca\x80\x84P\xa0\xea\xdd\xfd\xecS\x86.~\xa7\x08\x10\xf0\tD\xfc0G\xa2q\xa8\xf0?h$e\x11\x176\x03\x89$V\xc9\x1e\x99$\xa4\x11y\xdd\xc1\x92d\xa5\x0c\r\xab\x9e\x0f$\xdb\xbe\x97\xad\xd8\xfdt\x82\xdc\r\xec\xee\xd4\xb6\x1a\x82\x83\xb1\xf5l\x8a\x1c\x97\xf6x\xc8\xe8\xa4\n\x1b}\x95\x92\xe5\xc9\xa2\xd5\x82\xe1\xa88\xc8\x9dS\xcb`*&3\xc3\x83\x98\x848p_b:\xff\x96\x05\xc7e\xa7\xa0N\xd0\xb2v\xec\x1d~\xe7\xfa\xed/$\xe5\xe5\xed\xc9\x1e\xab\x7f3m\x13\x8a\x96!\t\x9fW,C\xf0\xf5H(\x13ya\xccS\x92\xaf\x14\x14y\x05\xff\xe7W\xcc\xab\xcci\xa7\xe7\x1a\x96\xc8\x08d]N\xba\x8a\xccE\x83\xff\xf4#;\xe8\x17H\x165"\xd1\x7f\xe9\x9e\x8eux\x01Ss\xbc^\x87E\x89\xf5\xc47\x892\x90\xea\xea]\xe3\'\xefk\xee\x93\x1d\xd9\xae\xbb<?\x93\x1c\xf8W\x854,x\xdb\x1d{\x10\'\xdf\x17\xc1<\x96\xe0DR#C\xa9\x005YFG\xcf\xa2\xd3\xbc[\xec>X\xacP\xa5[A\xe3\xe4\xc4\x87Xn2a\xcaU\x9f\x7f\xfbR\xc2]\x95\x98s\n*K\xf9pP\x88\xb4>\xd7\xb8\xc7I\xfc\xec\xc0M\xba\x86\x93\xbb\xed\x10\x85AM=#\x0e\x1c<P\x99w\x0e\x8d\xcc}\xfe\xeb\x7f(8\xaa\x8a\x988\xe6\x19q6\xff\x9a}E}`d\n\x83\xbe0\xa8Z~\x94\xdf\xef`y\xc8\x83~}\xbd\xe4\xc2d\x13\x93\xdfL\x88\xa6\xea\xc1\xbc\xdf\xe1\xca\xd7\x05&\xb9\x86\x86V8\xe9\xc3\xcc\xaf\xa7\x04"s\xec\x9e>c\xdaM\xfer\x12\xb0\xa5nN5\xee2m\x1a\xa3!soj:\xd9\x0c\xc6\xb5\xb1\x1e\xad\xe4\x04\x00=\xe3\xbfO\x13\x04v\x9d\xea\xcd\xcb\xd9~t\x8c\x11\xa0\x03=\x97\xf20HK\x93b\xb9\xa4\xdd\xb8@\x83\xb6\xf2}0;\x15\xf8m\xd3\xd7\x80\x1e\x9euB\xd3\x9a\xff\xe1\x91pa\xcb\t\xf5A\xe6\x18C\xcfT\xc9ma\x19\xa9\xc7"-\xef\x15V\x95\xb6\xba\xb8\xe6\x8c\xd1\xc3\xda\xc6\x17\x8c@\xf9\xbd\x9b\r\xe4\x08\t8\x83\xec\x93\xda\xe5\x98jz\t\x07\xa6\x8c\xf66\xfbP@\x03\xbfs\r\xa1\x9b[O\x1b\xf3\xadO\xdd%B\x96\x1fJ_PP\xa9MA\x98G\xfb\xc7N\xd5\x9e\xf6\x9d\xefS\x15aS\xfbb\xdfMf\x11\xd8\x10\xa6\xad\nD\x8b8\x1e=E\x80\x1dBI\x17\x91]\x91JKD\xa1\xa0\xff\xa8\xa0\xa7pq\x80qs\x0c\xf1\x11s_\xbf\x7f+`,@c\xe8}\x97\t\x0b\xab\xaa\xae\x8dE\xbd\x9f\x8aH\x92\xfa\xb2\xb0RP\xddK\xd0|wGK\x14\xfb6\xc7\x00\xfdLw\xc96\x16\x0f\xd0[\x0bp\xfa!)\xfdIA/<.\x95V\xae%$\xa8\xc5\xaf\xc7\xe2\xb2\xa8a\xa5`F\xf5.\xee\xd1\xf1\xc9$;\x0c^\xfb\xc2\xde[\x9a\x9d\x81\xc1Jn\xa6\xe6\x15\xaf\xb1\xdaS47\x9f\xd6\x08q`\xe3vx\xac)Y\xb5\x87\xb1\xd2\xbd\x9a\xee\r\xb2\xd6b\xdeY\xa1\\\'\xb9\xf8\xe3\'\xa9\x05`3\xe4|W\x8c\xc9\xdc\x05\xa5\xd4-\x06:,%\xeb\xb3\xb6L\x0b\xc2\xda\xe9\x07\xac\x14(\x13\xba1\x94q\xce\xa2"i\x8b\xc09\xc9\xdd\xb5\x97\xfa\xfd\xfa\x15\xe73s\x89]\xfd\x8b\xeb\xc6\x10{!w\x16\xbc\xe45\x92\xcca\x96;\x1b\\\x019\xc9\xa3dQ\xd7\xde\x12\x9f\n[|2\x19\x9dCn\xf7\x93H\x1f\xd4\xa5S8/}\xfc\x16\x8c\x95\xf0e\x96\x88\x81\x9d\xae\x01\xe1\x97\x87\x92\x14\xf1\xb6i\xe8\xf2\xfc\x9b\xa0H{\xado\xc2G\xa4u\xde\x9d\xac\xe8\xa4\x95Yi\x11\x0e\xfe\x07\xdd\xe10\xd6wC\x92B2~?\xb9\x15\xa62\x03\x17\x87\x8d3\xa8m\xf3)&j\xff\xa5FV\xb0\x00\x9cJ\xdc\x98\xfe\x9f>i\xb5#\xcd\x13\x0fn\xf1\xd8\xe1\xaf\xdd\xf9\xbbm\xe4H(\x12\xc5m\x84\x1e>\xff\xd6@d\xe2o\x8cf\xb5s\xf7\x8c\xe4o\xd0\'\xd6\xe4\xe4\xbf\xdf\xdb\x8bm\xe4u\x17$mj\xd9&\xe9\xb2\x07\xc8\x0bQ\xcd\x90\xde\xa7I{%\xbbix<\\Z\xfb{(\x80s\x90\xfc\xb6\x12\xa7\x19ra\xe1\xaeX\x91\xf8\xf3Y\xfe\n\x14\xec\xb1\x82\xb1\xf0\xa3/*J\xb9T\x8a\xc7\x1b\x84B\xa4\xeb\xce\x9d\x82\xb3\xb3K\x888\x1ee\xd16fC\xa9\xe5Y\xce\x13e\xb1\x97\xb6\x16\x8b\x0eb\xfd\x195\xd4\x833?\xee\n^\xac\x06\xb7^\xbd\nkc\xeez+||h\xef.!_0\n]>\xe1\xcf\x1a\x16GT8\x82(\x00\x0e\xfa\x16\x05\x92\x10\x95n&\x16\xc0\x89\xa4\x82\x05H}\xd9P\x11\x93ke\xe2`\x8b:\xc6\x19\x18rW\t\x10\xbc\x0cO\xeb\x9f\xe4\xa1\x14\xe1\xd9\xa5\xfd\xce\xdfz\x83KPc9S\x07\xc1\x1d-\xb8|\xa8P\xa5y@h\x7f\xb5rh\x17<mb\xb2\xe1h@#\x06\xdb\x94!\xdc\xda\xa4\xe2\xee\x88\x8e\xb0\xcfE\x1c\xbfT\xdd>\xa0\x0e"\x99\xb5\xd1l\x95G;\x88\xd9\xe3\x81*\xc7\xd7;\xd2\xcf\xe4\x02T\x12|\x19\x8f\xd7~1\x93j\xac&\x12\xb1o\n\xb0\xbd]\xde\xd5\xb2\xc0\xf9L\xea\xfd\x18\x14\xdd\xbf&\xfb\xb0e\xdc\xe47\xa7\x16\xf9)\xd4\x01\x90hBl\xde\x83\xc2\xca8\x9a\x1d\xe0\xf8\xf6*\x88{"D\xb2\x18\x85\xf6>\x8b\xc3\xbd\x0b.i>t<\x9aD\xbdO\xd9\xca\xb0\xd0Z\xbc\x1f\x99\x9d\xa2\xca\x83\xe8x^\xd0\x95gK3\x0e\xf0\xcb\xf2Z\x03\x80\xc2\x1a:\x00\xbf\xd6\x8e\xe9\xc5n\x887\xdd\xd6\t\xac\x0c\x07\xbf\xbd\xf0\x83-\xda:\xef\x0c(I.no\xf5\xf3\xc6\x8f\x8bFy\x90\xbce\x13\xf5U\xd4E\xa3\xab\xfd\to\x14b\x1bS\x01\xe4\x12\xd95\x11\xf8\xb6&\x1dDP0B\x17\xb5\xce{\xe7\xe9\xc5B\x02(p\xe8\xb5\xb4\xd9\xca\'d\x8f\xb3\xb7\x0f\x8c\xf98\x07;\xca\x0e\xaa@\x8a\xf8\xe1\x8b9\xb5u\xe2\x15\xd8J\xe1m\xe8j\x08\xb4O8\x9c\x14\xe0\xf9i\x1335\xe8\x9aW\xf7\xfb\xf3@Ey\xeb\xdbK\xed\xaf\x13\xb4\xc5d#a\xa4z\xabD\xa2\xd60\x9a\x1c!i[!0\xef;\xd6\xf4\xe3\x13\xef2*\xf3\\\xe8\xb4\xe8\x89\x95\x05\xdb\xb0\x0e0p\xf7\xdf\xd2\xfcp\xc7li\xfb\xbe\xa80m\t\xabq]qQ\t\x80\xf3\x1f\x17am\xd5y\xff \xdd\xff+\x08\xb7\xc2\xbb^\x1b\x0c\x14\xd2\xe0v\xf7\xcb\xaf\xf0\xa6\x01\xaf\xc0\xe0\xd9\xa42\xfa\x80\xd8\xcf\xaf\xbc\xda\x06\x95<w\xbc\x10\xbbO\xe4\xe8\xaf\x8a\x9f\xa9\xa5%\xb9R\xe7\x08\x93U\x10\xf4\x1f\xf6\xd1\xd9|\xb5n\xfbA\xdd\xcc\xc4\xe4\xaf\x867\xc2\xc4\x9c\xa2\xd5j\x81\xe7\xcc\x9fH\xa7&\x866\xdf\xd1\xd6s\x97\xbb{o[O3\x87\xf3T&z\xa9lB%\x93\xad@f\x9c\xb4\xe4\xa9\x8a\x10\x85k\xbd>\xc5\x13a\x0b\xa5E-x\xaf\xbbXF\r\x02\x17 \xa6\x84\xd0U\x87np\xa5e\xa1\x96\xa7c\xcb\xb9\xa5N\x9e\xd2\'\xc0K:\r&\xc6\x94\xa3\x88^\xaf\xdc$\xad\xb1hS\x04\xf4\xbe.\xbe\xd9\xa4\x14\x07\x8a\xb3\x9fm|\xb30\xd1\x15\xa9\xccq \x1f\xa8\xdc\xb1\x98\x93\xec\xde\xb4e\xa7\xd1e3\'\x7f\x13?E\x9b\x17)\x05~U\x7f$4?\xa4.tv\xc87\xe7\xe3d\xd5+\x07\x9e)\x9f\xa9e\x8b\x16\xeag:\xe3\xae\xcc\xa3l\x8f|+\xf0\xba\x18\xb2k\xb0\r9\x07\x16l+\xf66 \xde\xb7\xcf\xe5\x10!\x04\xec\xe6&\xbd\x04\x93\xd2m\xc0\x8e\xeb\x10\x87J;\xd1\x90a\x87M\xf7i\x95\xbb\xc2\x9d\x06j]\xc2\xe5%\xb5\x1f\xfc\x07\xe4\xcc\xbf)\xaa\x16I\x85\xc1\x9aBU7L \x11\xaaB\x14\'ND\x90\xb0\x19?P\xe5\x87\xbah\x0e\x0e\x13\xfa\xed\xefft\x1e+\x82V\xc68\xec\xfa\xc2~\xef}&\xf9Ny\xbaN\xe8\x15T\xb0\xa4<|\x0c\xac\xcc \xed\xb9)\xea\x81\x06X\x81\xf3Q\x8c\x8d\xa9\x0c\xad\xc1B\x028\x8d\xe5\xc8\x8c\xec\xdc\xa7\x11[\x1e\xccB!l\x93\xb9\xf0@M!\x9fcb\r\xb2p\xec\xec\x17h\x9d\x0f\xd7\x88l\x8eL\x84\xf0P\x12\x87\xd5D}\xc0+\x8bS\x13\x18\xc0To\x08\x86xC\x9b9\x16\x83\x7f\x9b3dQhG\xaf\x9a\xe8\xac\xaf\x15\xe7\x98?\xce\xfa\x1a\xaf\x9av/\xca\x83\x927\xbfDZh;\xc3\xd3b\xf3\xb3\x0b\xa0>ou\xdd\x86\xbe\xe7\xc6\xc1\x07\x04\x04\x80)8\xda}\xaf\xee\x0eK\xd3\x8b\xac\xd8\x89Q\xd5\x98\xd8\x15;*\xa5\x95\x8a\x11\xdd\xf8\x8dyY\xa2\xa9\xf3\xe4\xd8\xd32"\x9ad\xc9\x11\xb3[\xf6\x9e\xb0l\xde\xf4\xfd\xb0\'\x0b\x8e\xe6\x1b\xfc\x03\xbf\xe3R\x1d\\\xc0R\xb01A]\xa4*8\xb6\'Ap\xa3\xd7V\\\x97\xe9\xd6\xfd\x93\x86&iV\xca\xb8o\xd6F\x8b+O\xc4\xacX~\x80\xb0o\xe0\x0c\xcc2>\x1a\x9c\xa1\xe55J0\x9cg,\xb6~Z\x1a\x18\x10\x98\x19%W\xc0\x08z\xfb\xff\xbc\x806%4N\xc6\xc6\xe1\x9b\xde\xb3\x15\x86\x9fj\x89(\xbb\xbb\xc0\x84\xb6\x16y6\xaa.\xf4\xcc_\x01\x98\x93~\xc8\x7f\x89.TC\xeb\x03V\'r\x00Q\x01\x1az\xd7\xc9\xf1)Q\xa4\x1c\xe2(\xaa\x02\x1bm\xe0\xd1\x87\xfff\x03@Y\x179\x90-@\x05\xea\xce\xf34\x88]HA\xa0:\xf5w\xd4\xbdf;~\xc7\xb9h\x14\xde\xa8\n\x8e\xca\x81:\xf0SC\xd0G\xd6\xa49\xad\x9fh\xec\x18\xce\x05\xb5~\x96\x03\xb1\x98\x95\x1c\xf1\x15<\x08U\x98\x9d\xc9\xfeRy\xdd\x90^Eu\xb9/\xf9!C*;\x16\xa6\x03\x8bB\xd2q\x94\xd5DE\xec\x15\xcb\x13"\xa0\x10\xf0\x83\x0b\xdd*\x94\xd6\x9f\xbez\xe3\xb0\xbcth; \x83\xdc\xf0x\xact\xa6x\x97\xb5\xe0\xb5r^\x0cX\xd3K\xc10\xc1\\\xa9\xc6.\xc6F\xb9s\x9a*\x11(\xf4[\xf7\tG\x1aZ\xd5%\xc8\xc4?\x83m\xb0\x06\xcde:\xaf\xc2\xa6\xc0.v\x1e\x1f\xb8\x1a\xf9|>rf\xffb\xbb\x15\xb7\x99j\x8dV\xf8\x8fEMcE\x96p\x8a\x18%R\xa1x\x88\x15s\xcb\x0e\xf8\x96\xc4\xef~\x8eOXAg\x8d\x88M0\x89q\xda\xdd\x01EU}\xadv\xc6\xad\xdf\xca\xf7\xcc\xf9\x169\x97\xd16\xb3\x82\x8c\xe7q\x06\xed\x9cFz]\xc2D\x9c\xce\xaao\xf7\xed\x01G\x9a!\x97\x9b\xb6\xdfb\x17>a\x03F\xe4y\x9d5t\xb0\x0fG\x11\xdf\xb6\xff\x04\x8chU\xa2\xbeV\xb7K[\xfbX\x13\xd72\xd3\x8c\\\xea\x8dMn-\xf3\r\xaet\x13\x04\xeb\xad\x8b\xd4\x0f\xaf\xfb%]Z\xbe\x8aoi\xaf\x910R\xdf\x89\xbc\x8c\x8c\xf7\x14\xad\xc3U7D\xc2\xeb)\xcc\x8dY\xf3rK>A\xc7\x0e-R\x11\x80$ \x00k\n\x91\x11\x92\xa3\xa5\x0b\xe6\xb5\x01\xef\xcb\xf0C@k\x9a\x16\xdd\x17m\xa9\x16Jz\x8cw&\xf0~:\x99\xbd\xa4y\xec\x98\xd2{\x11\xaf\xd5%l\xd1x\x9e\xbb\x94\x83\x17_\x17\x0e\xe0\xc6\x14u\x97\xf4\xc0\xf5\xdaz\x96\xce\xf3\xfdh\xdb\xa0*\r\xdc\xf0K\xea\xf3\xc2\xfc\x02\xe3\x042\xa3\x8d\xc90\xa1Q\xe2\xa0\rD\xfa\x11\xb2A\xdf\xd7;NMt7<1W\xe2_\xfc\xf4_\xba\xe5\x88K\xb2\x1d\x07\xac `<\xa4\x9f\xb4\x95\xb0]\x12\x1ae\xb12\xcc\x95\x1c\x03NCT\x83\xd3\xa11\xf3v\xabn\xa5\xd3m\x08^ZK}B\xeb\x14\x97\x17w\xf7\x16w\x84\xf6\xd6U\xedN\x9d\xa3^.\xbb\xcd\xf9\xc0\xc8G_\xa9\xf7%\xb2\xd2\xf8\x16\x10\n\xbc\n\x9e\x03\x9a\x00!8Ai\xb2\xfaR\x96;\n\x0eYD\xebp\xf3\xce\x8f\x15\x15\x8f\x03l\xeanS\x94\xfbDH\xe7m#\x16\x82\n\x17\xce\xdc\xa7\x13=\x97\x1b_\x1c\xd2\xc3g\x90\xf6\x03\x80]\x19@\xe1\xd7\xa0\x88\x1f7t{\x01\xcc\x84\xf9t\xcb8\xebL\xf7y+=\x97>3r\xb5\xb3t\xe9\x17\xdar\x9f\x05O\xfb\x17\xc3\xbea.\xea\xe4"\x15\x8b\x9e<1$\xd3X\xf9\x82\xc9\x89\x93\xf0(\x13\xe1\x88\xbcj\x83\xfa&\xeayU)&]V\x16\xed\xe8\xcb]!\xb4\xe7\xb3\x96\x95e#k\xf5\x1a\x87oI\'\x9cld\xe3\x06\x13b\xe3\x11\xea\xa3\x1cJ\x7f\x03\x8bMN\xd6\'\x91\x84\xf1\x9b,\xf4\x04\x8b\xaf\x8c\x03=\xec\xe6\xe2L\nM_-\x8e\x04\x18\xffv6\x92\x90\x19NX\xa5\xd71\x96\x9f\xa8B\x13\xd4\xbfq\xc2/\xa5\x93\xdc5\xf0=B\x07\xcd)\xee3ks\x80 /V\xea+\xd0\x978If\x10K\xe1\xdf\xa2\xef\xbeq\x07\xd2!!8\xa0D\xa5\xe7\xdb\x81\xce\xdbs+\xa3Lf\xd7\xdd\xf3\xc8\xc5\xc6\xb0\xd0?\x98\xf4{\xee\xd4Y\xa0\x8aYm\x82\x8d\xdbIN*D\xc3Q\x8d\x9f\r\t\x87P\xb4\xa3\xd3\xd5\x97\x91\n\x1a\xda\xd5\x02\xa0]\xa8\x02Bb\xbb\xeaZfs\xa5\xf0\xa6\xad]Y\x18\x96\xbe|,\x8dn\x1d\x1c\x84\xb6\xc3[d\xb1g/\xe3]G\xd1h\x05c\xbe\xe2L\xee\x80]krP\x9b\xbe\xc4Ws\x86D\x8373\xb5\xc2z\xed\x8e\xc4<c\xc4\x0f\x0eMX\x9ac\x14\x04\xb7f\xceE\x17\x92\xa6Us\xc3\xc0\xd5^\xb4o`\x07=\x90\xb4<\x7fd?\x91UZX\xe6q\ti\xf6\xec\x1c\xb0y;\xf3\x18C+\'\xa2-\x99\xe8\x07\')\x18\xf8B\xad\x19(m\xff\'\xc8\x94\xef\xb4{2\x97\x9b\x16-:h\xb1\x98\xcfX9\xc1\xa5\x92P\xee2\xed\xd8\xa9\'\xc23e\xb9\xad\xee\xe7\x976\x89\xf2!8\x8e\xf5\xe6\xb6\xeb\xc0\xfc\xf1\xf25\x90\x9eI\xed\xb3\xb0\xf1\'\x07\x7f\xd6\xa8:\x96/\xf2n\x83V\x15LY\xcf\xab\xd00\xf8\x8c\xd8#N\xed\xb4\t\xc2\xa5\xd7\x85\xa5\x0f\x07>\x9e\xc45!1\xeaE)\xa3\x89\xc5\x1d\xc6\xcd\xdd!\xd0t\xd1\xe9\xb5fky\xfe\xe4/\x0e\xbe\xd9hH5z\xd7\x1c\x0f*\xd4\xa8&\xa4@Z\x88B\xb6\xc7\xa8F\xe3n\x15\xc7"q4\x9f\xa3U\x91\x9d\xdc\x96c\xe7\xb5\xe0j)N:}\x1b\tb]\xfe\xaf6\xf7)4\xd7\xd8\xd7\xcf\x16\x1dR\xd6v\tVE\xf32(\x1f+\x9d,l\xa3\xa3\xfc\x17P\x86\x0cE\xcei\xb0\x03\xbd"\xab\x04sri\xae}L;\xd2=\xf2|\xcc\xea\xcb\xe4\x9b\x14\x93\x9e\xd5\xe8\x9d\xcf\x0c\x8f\xc6+\xe1\x81\x17_\xff"\xef\xf9\x89OA\x86\x14\xd9\xbc\x9a;\x84\xfc\x0eF\xcf\tv\x13\x02\x95\xab\x02\x11\\"Z\x1c}s5y\x11\xfa#.~\xcd \x16\xf4\xff\xc5\xdc\xf9G\xe9\xbc\xad3H\xe8\x80\xa9\xf0E\x8dL1\x1a\xbbA\x93f\x04\xfc\x07\x87\xb3\xa6\xea\x1a5=\x99\xd9\x96\x7f\xb1\r\xbe\x83:\xc1\x84\x97\x06\xb0;\xb93\xf7{6\t9\x9a2|\xdb\x19Q\x06\x18\x0e%w`\xe7\xae\xe6\xad\xa0\xe5\x8e\xe7s\xf5i\x07]\xe3u-}\xbeo\xa3\xc7.)f\xa2j\x06\xeb\xfc\xef\x0b\xa4 \xf5\xe3\xea\x8d\xbb\x96\xc7\x9d\xf7P\xbaW\x82\xa2\x82\xeedL\xdeD\xaf\xe8\xe69\x91\xa9e\x88\x8aJ\xfb\xe4N\x7f\x89I\xba~\xaf\xa6\xf5\xfe\xb7\x03\xf4\x95\xf72(\xd6\x17=\xbc\xcaE\x8b{\x7f\x91Y"\xe6\xf3\x9a8\xb5\xd3NY\tB\x9f\xaaa\x80\xff\xed\xfb\xd9\x89\xbd\x073\xd5n\xd4\xc5\xc0\x0f7\xdc\x91m\x1d\xd8\xb1\xf8\xb2d\x9e\xc2%\xdeIaW"\x19\x9c\x86\xeb\xb2\xb4\xb4\xe9\xddt\xe0b\x7f.\xd9\xa4J\xa7\xe7\xbb\x00\x89\xebc\xa9\t\xebv>\xb7\xc2\xe9\xbcZW\x95\x13\xd3E\xdb\xc4\xa9g\x07in{\x1c\xa6M\xf3\xa1\xbcXB!\\4\xe3\xf2O\x05~\xd90\x85U\xbcd\xf5\x81\xf3%\xa3-\xb2\xf4\x1b\xcb\x1bzl\x1d\x8d<\x9a\xc2\xfb95\xef\xbbQp/\x06\xf8\x05\xe6\xb5\xef\xab{\xf3\x91\xec\xd4-\xd9\\\x1fG\x10Y\x87\x8b\xed_L\x19\xbd\xe4x\xc2\x0b\xaaL\x01\x1eb\x9d)\n\xe8l`\xda\xb7\x03I\x13q/f\x9c;\xaf\xcc\xda D-\xb6dDw\xb6\xf1\xb7\xbc_k\xc3\xbd\x15\xe9%\x9e\xd8\x8e*\xdb`\xc1\xf9"\x16w\x87~\x98\x0f\xb2]\xf5\x94\xb1%\xb4\xf1<\xa4\xa7\x0fZ\xe96\x08\x18\xf5g\x86\xd9v\xdc^\xe9T\x98\xdc\x11\xe8\x10\xda\xf4\xe7/\x13"\xbd\x897biV\'CA\xaa\xae\x9c\xed7\xd4\xc4\xf2U\xb0\x1c\x10\xf7x\xb2\x1c\x13\xa7l<s\xc19\xd4,\x1b\x17\x0e\xf5\x8da\x81J\x83L\x95\x7fo\xb9\xf6\x12${\xdaP\x93\xfa\x08\xe7\x11\t\xf8\xa2\xd0\xa5\ra\xdeI\x19\xfa\x08r"\x1b\x95\xb9\x1aG\x19k\x87j^akN\x98G\'k\xf4\x02\x8c \x86\x1a\xff\x84`yp"<\xe0`\x8e\x86\\\t\xad\xa9\xf9\xdbN\xfe\xa3\x13\x86,\x9d\xb0z\xfen\xd0\x02\xb0\xb7\xc2\xc9\xf7\xd8\xf3\x92~\x1eb2\xd8\xe02\xd8-\xb5\xc0\xed\x1bK\xb3\xf7\x87\xe2\x83\x01U\xc3\xe2\x00\xc8\tP!\xba\xb0\t\x18\xed\x16\xe1\x97lk/ \x83\x8a\xb9\xdeD\x17(\xee\xbe^\x00~\xf1#\x18 y~\x9eK\x06&\x06\xf9\x04* \xdb\x8bA\xf9b\xc8D\x99\xbf \xdf\xeeX\x15\xb08\x03c\xe6\x7fQ\xa1q\x7fd\xe3c\xdb\x86/<2\xf7\xf2\x9f\xa6G\xdcx\xed\xd4>\xc6z\xd5\xea\x95\xca\xca\x9f\xdf\x00Sn\xb5\xfa\xaa}\x8a\xb3\xf9mE\x06\xe8`\xa1\xf0\xa1\xe4\x18}\xe4l}\x02\xe4$]\xefII\x18\xa7\xd4\x90nE\xean"\x1f$\xaa?\xf9\xb0\xa3\x92^\xa7\xf6\xb0\xea\xbb\xdf\xdb\x0f\xc8\x9ez\x10\xf3\xba\xf3F\xa4\x91\xae\x85]j\xa1\xeen\xf2\xedEy\xad\xd0p\xdb\x97zF\xc7o\x86\xa6\x01\x9f{gh\xecl\xec\xc4: \xb3\x04AD2\xf1o\xcd\x054W-\xd5(\x88.\xe9{ImC\xd1+\xda\xcf\\]yF2\x8b/\xa0@\xcf\xf5\\\xeb\x03\xed\xd3@\xcf\x15\xd9\x81^\xc0\xbb\xefz\x1a\xa84a\x01s\xe33\x1c\xc4\xb7\x89\x9b S\xf7\x90&1x\xa7YJ\xdbD\x00\x11\x0e\xce]|aY<8A-tx&h6\x8d\x9b\xe5\x9c\x04\xc4\xa9\x86\xcbvY`\xcc\xc2\xf2\x0b\xf4\x8d\x19x\x84\xaa\xda\xfeV\x8b\xc2W\xf5\x08\xed\x1c\xe5\xf0\x05\xb1\xb3\x00G\x86V\xdf\xff\xf6\x93R\x0e\xe1^\xdaF\xb4\x8c\xb0\x0eU\x89$?/\x19\xd3\x08E\xcbm\x0f\xd2\xd9\x1cR\xe3P\xe3\x8aT\xb6\x9f\x98\xad\xad\xb5\x15\x13\x10\xe4\xb1[(\xd1\xa2\x95\xcd\xad\x91\'Q\rd\xcf1\xf1\x80u\xd9>#\x18\xa7\xf9\x0eF\x8a*4\xa4^\x1fN\xe8\xdd\n{C\xee\x05\x1a\xb4,\x05\xda\xc7\xbb)\xe5N\x80\xdb\xf57\'[:\xfbHu*8\xa6\x9c\x89U\xdc\xea\xb0\xe6\xc9\x88\x89|\xae\x8d\xd1\xfd\x0f\x87\xad\xcc\xe5\xf5\x05\\(\xaa\xfb<\x08X\xa4\x1e(\x194c\x9f\xfe\x97\xd4\xa5g\xc7r~\xeeMR7L6\xfd(\xa9`\xd7\x9e\xbbZ5\xd2\xf1\xda\xd7q\x86\xfc\xe0\xd5\xf6;\xd9\x13+\xc4\x93\x1e}\xec_\xce./\xed\xffF\x8d\xfaaC\\\xf21\xcfv:H\x16\xff\xfbO\x8d\x1c\xe1\xa8S\x12\xabh\xcb\xc0\xa1qg\xc9\x9f;\xdaku5\xfa\x8d\xd8G\x98\xaa}\xa5\xac\x0c\xf4e2F\x9d=b\x98\x0c\xa3\xaf\xc1\xbd-\xdf\xfb\x92-{\x0b\xdaOb\xc7B\x84\x84X\x02I\xd4\xdd\xf9\x00\xa7\xc1\xd3\x9c\xd5F\x7f\xe4&\xf2\xadH\x14\xbaN\xf2\x18\xfb\xebh\xe2;\xd2\x91\xf98\xcc\x9b\x87.e\xbft\x1b\xe1\xc0\t,\x94\x98[b\xf6\t\x88\xe0\x86}\xa2\x8c\xbc8\xcd6&h\xe0\xdc4$V\xd5R\xfa\x1e\xcd\x1dQ\xb8\xec\xa1\xf0\xea\xae\xb4\xe1#\x1d\xdb\xe3\x98\xe4\x86\xf7-xA,[\x1bp\x14\x82\x1f\x1a\xda\x0b\xdcZ\x1a\x7f\xc7\xb0A\xfc\x19\xdf@Z!\x15;\xab\x98\xd4\x9d\xcc\x84\xdek\xcd\x9ej')
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
import pprint
|
3
|
+
from flask_babelex import gettext as _
|
4
|
+
import pathlib
|
5
|
+
from hiddifypanel.models import *
|
6
|
+
|
7
|
+
from datetime import datetime,timedelta,date
|
8
|
+
import os,sys
|
9
|
+
import json
|
10
|
+
import urllib.request
|
11
|
+
import subprocess
|
12
|
+
import re
|
13
|
+
from hiddifypanel.panel import hiddify,usage
|
14
|
+
from hiddifypanel.panel import hiddify_api
|
15
|
+
from flask import current_app,render_template,request,Response,Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
|
18
|
+
from flask_classful import FlaskView,route
|
19
|
+
|
20
|
+
class Actions(FlaskView):
|
21
|
+
|
22
|
+
def index(self):
|
23
|
+
return render_template('index.html')
|
24
|
+
|
25
|
+
def reverselog(self,logfile):
|
26
|
+
if logfile==None:return self.viewlogs()
|
27
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
28
|
+
|
29
|
+
with open(f'{config_dir}/log/system/{logfile}') as f:
|
30
|
+
lines=[line for line in f]
|
31
|
+
logs="".join(lines[::-1])
|
32
|
+
# resp= Response()
|
33
|
+
# resp.mimetype="text/plain"
|
34
|
+
out=f'<pre style="background-color:black; color:white;padding:10px">{logs}</pre>'
|
35
|
+
if len(lines)>5 and "----Finished!---" in "".join(lines[-min(10,len(lines)):]):
|
36
|
+
out=f"<a href='#' target='_blank'><div style='background-color:#b1eab1; padding: 10px;border: solid;'>Finished! For scrolling the log click here.</div></a>{out}"
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
return out
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def viewlogs(self):
|
46
|
+
config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
|
47
|
+
res=[]
|
48
|
+
for filename in sorted(os.listdir(f'{config_dir}/log/system/')):
|
49
|
+
res.append(f"<a href='{url_for('admin.Actions:reverselog',logfile=filename)}'>{filename}</a>")
|
50
|
+
return Markup("<br>".join(res))
|
51
|
+
|
52
|
+
@route('apply_configs', methods=['POST'])
|
53
|
+
def apply_configs(self):
|
54
|
+
return self.reinstall(False)
|
55
|
+
|
56
|
+
@route('reset', methods=['POST'])
|
57
|
+
def reset(self):
|
58
|
+
status=self.status()
|
59
|
+
flash(_("rebooting system may takes time please wait"),'info')
|
60
|
+
subprocess.Popen(f"reboot",start_new_session=True)
|
61
|
+
return status
|
62
|
+
|
63
|
+
@route('reinstall', methods=['POST'])
|
64
|
+
def reinstall(self,complete_install=True,domain_changed=False):
|
65
|
+
if int(hconfig(ConfigEnum.db_version))<9:
|
66
|
+
return ("Please update your panel before this action.")
|
67
|
+
if hconfig(ConfigEnum.parent_panel):
|
68
|
+
try:
|
69
|
+
hiddify_api.sync_child_to_parent()
|
70
|
+
except e as Exception:
|
71
|
+
flash (_('can not sync child with parent panel')+" "+e)
|
72
|
+
|
73
|
+
|
74
|
+
domain_changed=request.args.get("domain_changed",str(domain_changed)).lower()=="true"
|
75
|
+
complete_install=request.args.get("complete_install",str(complete_install)).lower()=="true"
|
76
|
+
if domain_changed:
|
77
|
+
flash((_('Your domains changed. Please do not forget to copy admin links, otherwise you can not access to the panel anymore.')),'info')
|
78
|
+
# flash(f'complete_install={complete_install} domain_changed={domain_changed} ', 'info')
|
79
|
+
# return render_template("result.html")
|
80
|
+
config=current_app.config
|
81
|
+
hiddify.add_temporary_access()
|
82
|
+
file="install.sh" if complete_install else "apply_configs.sh"
|
83
|
+
try:
|
84
|
+
server_ip=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
|
85
|
+
except:
|
86
|
+
server_ip="server_ip"
|
87
|
+
|
88
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
89
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
90
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
91
|
+
|
92
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
93
|
+
proxy_path=hconfig(ConfigEnum.proxy_path)
|
94
|
+
admin_links=f"<h5 >{_('Admin Links')}</h5><ul>"
|
95
|
+
admin_links+=f"<li><span class='badge badge-danger'>{_('Not Secure')}</span>: <a class='badge ltr share-link' href='http://{server_ip}/{proxy_path}/{admin_secret}/admin/'>http://{server_ip}/{proxy_path}/{admin_secret}/admin/</a></li>"
|
96
|
+
domains=get_panel_domains()
|
97
|
+
# domains=[*domains,f'{server_ip}.sslip.io']
|
98
|
+
for d in domains:
|
99
|
+
link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
|
100
|
+
admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
|
101
|
+
|
102
|
+
resp= render_template("result.html",
|
103
|
+
out_type="info",
|
104
|
+
out_msg=_("Success! Please wait around 4 minutes to make sure everything is updated. During this time, please save your proxy links which are:")+
|
105
|
+
admin_links,
|
106
|
+
log_path=(f"https://{domains[0]}" if domain_changed else "")+f"/{proxy_path}/{admin_secret}/admin/actions/reverselog/0-install.log/"
|
107
|
+
|
108
|
+
)
|
109
|
+
|
110
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/{file}",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
111
|
+
import time
|
112
|
+
time.sleep(1)
|
113
|
+
return resp
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
def status(self):
|
118
|
+
# hiddify.add_temporary_access()
|
119
|
+
config=current_app.config
|
120
|
+
# configs=read_configs()
|
121
|
+
# subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
|
122
|
+
# os.system(f'cd {config_dir};{env} ./install.sh &')
|
123
|
+
# rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
|
124
|
+
from urllib.parse import urlparse
|
125
|
+
admin_secret=hconfig(ConfigEnum.admin_secret)
|
126
|
+
o = urlparse(request.base_url)
|
127
|
+
domain=o.hostname
|
128
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/status.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
129
|
+
|
130
|
+
return render_template("result.html",
|
131
|
+
out_type="info",
|
132
|
+
out_msg=_("see the log in the bellow screen"),
|
133
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"status.log")
|
134
|
+
)
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
@route('update', methods=['POST'])
|
139
|
+
def update(self):
|
140
|
+
hiddify.add_temporary_access()
|
141
|
+
config=current_app.config
|
142
|
+
cwd = os.getcwd()
|
143
|
+
|
144
|
+
# os.chdir(config_dir)
|
145
|
+
# rc = subprocess.call(f"./install.sh &",shell=True)
|
146
|
+
# rc = subprocess.call(f"cd {config_dir};./update.sh & disown",shell=True)
|
147
|
+
# os.system(f'cd {config_dir};./update.sh &')
|
148
|
+
|
149
|
+
|
150
|
+
subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/update.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
|
151
|
+
return render_template("result.html",
|
152
|
+
out_type="success",
|
153
|
+
out_msg=_("Success! Please wait around 5 minutes to make sure everything is updated."),
|
154
|
+
log_path=url_for("admin.Actions:reverselog",logfile=f"update.log")
|
155
|
+
)
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
def update_usage(self):
|
162
|
+
|
163
|
+
|
164
|
+
import json
|
165
|
+
|
166
|
+
return render_template("result.html",
|
167
|
+
out_type="info",
|
168
|
+
out_msg=f'<pre class="ltr">{json.dumps(usage.update_local_usage(),indent=2)}</pre>',
|
169
|
+
log_path=None
|
170
|
+
)
|
4
171
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
172
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,81 @@
|
|
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\x00i\x12\x00\x00\x12\t\x04\x00\xa1\x11X\xc43\x12h\x9a\xc5.\x05\xa2\xbe&\xe1\x89\x00\x00\x00\x00\x00\x00\x00\x00^\xb4\xe7\xedU\x8b\x1f\xc6Y\x84uG\xf18\xdf\xf0\x8b+u\xd1"FM\n\x0c+\\\xa0;\n,J\xa4\x0cm\xdd\x89&T\x0b\'C\xb2M\xc7\r\x9d\x90.\x90x\xc1I\xb8\xed\xb5\x95\x0b\xa08rF\x9d\x9a\xc0Y\xac\x85\x11\x99\x8d`\x99AN\x9f\x07"\xaeP\xeb\x94yT\xe2\x9b\x87\x19\xc6/\xf7\x8a\xfe\xe5\x14o.\xb7\x87\xc6I>s\xf7\x9fZ\xbe\x0c6\xac4\x0e\x12\x160\xf5\xda\x02\x83n\xc8$\xfe6\x9c\x84\xffRp\xfb0t\x0etM\x98\x1ce:\xc0\x85.\xa4e8\xc2\xa0UjEw\xff\xcbH}\xe9r\x0cx\xc4\xcc\xf0<\xd8\x86B\x89\x15\xe8\xe8\xa7\x89\xe6>~\xdd!\xa5\x92\x11\xcd\xf6\x89\nh\xdd\xda\x04}2\xd7\xd7\x8f\xcds\x84\xfe\x00]c\x8bD\x08F\xf7=m\x9e^\x8fog\x94\x19\x19\xbb\xeb&\xc6\xa0\xd4A\x81o\xddC\x86\x03Z\xf7\xe5hA\xa3\x90\xf7zn4\xc3\xcc\xbaH9\xad\xa9.\xfas\x12\x18\xaa@\x19\xc6\xd0\x19;\x19?4\xd5\xe8y\xe0\xf07\xdbp\x90\n:\xfdO\x0f\xdc\x06t\xec\x17\xb6\x15\x01\xad\xd8\xd5\x0c+@\xbe\xb6Dj\x95\xc5\xd1\x10\xdd<I&\xa5Ljh\x93P\xa9\xf6\x9fW\x19l\xe8\x11\xab\xbd\xf4UGr\xa60\x07<\xdd`\xab\x08>\xa5!\x12P\xfd;1\xd2\xaf)+\'\xf7:\x10XI\x80\xefa\x87\xf9\xd9/qv\xcaM\x13a\xf05\x844:C\xd3\r\xe5r\xf5\xc3\'\xfe\x12\xb7\x12\xef\xaf[\xbcL\x0e(\xba\x80\xfas\xa6\x99\x96\x95\x18#\xe9\xfb5\x1c\xe1\x07\x94\x02zN\x96Q\xbc\n\xd4\x1cj\x8c\xecM>\x0fm\xe1\xe9^\x93E\xc1\n\x0f\xc5\x06\'\xd0\xd2\xd8j\xc2\x03X\x84\xd3\xbfOI)[\xa8\xd4\xb1\xa6\\<}\xb1\xf2\xbb$[\xd0\x04k\x93\xd3zI\tf\xa3\x02\xff\xc9aca*\x19\xdf\xa7\xe3\xc1\x15\xeb\xbcfa,\x9f\xf2M\xfa\xf4\x1ctWz3\xc5\x1d]l^X\x81\xa1h7\xaf\n\xef\xcf\xd6G\xe1\x9f\xd1\xd1\xdb2\xc4C\xe2\xa5;V\xe6d\xbc\xe0\xe1 x\x98d\x88\xee\xaa\x8d!\xa1\xaa\xdb\xb1y\xc3\x1b=u\xa6&\xa6\xfe]J=\x05X\x86\xd4\x0e\xcd\xf9\x15\xe8]\xfep\xad\x82Gb\xdb^;4\xdb\x0e\xce\x9e:\n\xd8x\xb5\xe9\xa1\x0b\xa6\x8f\xdd;UB\x83!R\xda;\xe0\xd1C*\x7f\rV\x8a\x97\x91\xfb\r\x93\xba\xf9\xa8\x02\xb1\xcb\x84\xc8\x08v\x89\x86G\x83\xb9\xb7UQ\xddC\xddF\x1b\x13\xf0\xfd\xbcvq\xc5w\xf7\xf6\xdb8\x13\x9e_^\x00NX\xaa]\xf0D\x90\xda\xc1\xce\xb2\xba\xe1\xc5\xa2U\xf4\x8d\x9f\xe7\x01pQ\xfa\xbc\xbe2.\xf6\xf7|\xaaE\x80\xe4\x9fs\xcc\xa6\x83\xd6\xdd\x14M\xdf\x9a\xe6\xb8G\xb3\xad\xf3\xa5\xf4ln\xf0a\t\xe0\x8b\x9b\x11\xf3\x83\x85\xa6\x89\x05\x96\xfc)\x15\xc1oj+\x902\r\xd5\x86m\xb8\x94$\xab\x94\xb7\n\x1f/C\x1a\x82\xdb\rj\x8d\x06\xa0>-l,\xeb\xc2L\xe6\xdf\x0e\xf5\x04\x14;ob(\xe7RK\xdb8\x88\xe6Wz\xcd\xf5Q\xda1P\xdaI"\xfb\x83\xa0\xd9\xb3\xe8\r>Q\xcd$\x054\x84\x14$w\x91)\x0b{Bv/m\xaf\xe5%\x851\x80\xd0%\xfc\xed\xcfU\xbe\xfdlII`\'\x98\x95.\x9d\x8e\xd3\xc3{i\xd7\xd7a\xcc\xa9\x80le\xfbs\x9c\xa8d\xe8j_\x8f\x88\xa5nDhy\x0f\x90\xa8\x97\xffB`\x03\x8cj\xd3M\xda\xa6:\x81\x13\xd4\xca\xfb\xe9\xad\th\xf4\xcb\x19\x07\xdd\xee: \x17n\xb2#\xce*\xbd\xf5\x1d\xe0\xe3\x95\x98\xfe6\x19\'\xf9M\xd2M\xb0\xfe\xf7\x1dg\xb9\xd5K\xed\xe4o1@\xa6\xd3\x85F\x1f\xd3\xb6\xb9\x8c\t-\xd1IkmG\xa1\x83\x9c\xf1\xed\x8d}H\xd50\xd0\xd3\x02T\x7f\xbbiB/vJ56&\xce2\x9b\x009)\xcd\xdc\x05v\x0ce\xfe\xb1(:\xafQ\xb4\xeb\xb4\xf8\x1f\xb0\xfe\xb0\x02\xe5A\xf1\x9f\x99\x8a\xc9\xc8\r\xda\xea\xb1c<\x8fE\x06\xff\x96\xec\x00\x80~\x10\xc6\x19\x96A\xcd\xce\x0c\xd8\xba?)\xf3\x19\xcf}\x18\xff\xa1\xba[\xa2\xa8\x8a\xaa\x97\xa9s\x82k\x8c\xba\xaf\x84\n\xd8\xb0\x85\xa7$j~[\xf0\xb9\x0bt`{\xe9\xb7\x8b\xb3\x15\x8b\xa1L\x15\xef\x1es\xd1\xc7;\xbfmE9\x1e\xec\xfcn\x0f\xbb\xb4\xb0;\x11z\xb6\xa0\x04h\xc5\xceD\xdb\x82\xe2\x19b\xe0\xd8O(\xcd\xd5\xd2\xaaj|\xd6\xec\x9e\xe90L\xb8q\xd4\xf3\\\xc2\x8c7U\xe0\x0b\xb17\xb3\x91\x03\xa7\x06S\xe7\x95o]\xc3c\xdc\r\xba\xc7\xadq\xff^\xe7\x0c\xee\x87n \xac\x14b\x01\x90R.\x87\xd4\xec\xfc:\x89}QE\xc2\x9c\xcb\x00\xb9\xb20%p\xe0\xcfR\xf2\xf0\x17k\xad\x8a!/\xf8\x93\x11;Q\xb0\x1f\xa8]\x0e\xd50\x18L\xb7\x1a\x95\x92\xa5\xb9n\x86>\x83\xab\xf9o\xc6\x9b"\x9cB\xf0\x05\x9f\x08\xccH\xbf\xaaa\x8e\xe7*\x1di5\xbe\\R\xbf\x1b\xce\x9cS\xed\xd1j\x92\x86\x93"~\xe5\xed\x94\xeeZ\x98\xaa3Qm\xdf\xc2\x03K\x8fD\x83/\x05i\x13\xc2(;\xa7\x0f1\xc3\x93\xdc\x8f\xc0\xf4\xa3\xcd\x14\x05y\x13\x8f\xca\xff\xbd\x05d\xff\x17\xa8r\xeb\x1b\x94;pC\xf4.\x9d\xee\x8a\tmC\r%q\xbd\xf0\xe7"}\xf6\x05\xf0\xac(\x10\xeasw\xde:\xccN\x94\xb2\x88\x9c\xf2\x13\xabj\xa6\x93\xfe\xad\xc0\xa0\xe9\xb1\xb3=&\xf1*\xc1\xd2\x90\xc0\xb49\x84\xf6\xfaeX={\xf8\xcf\xfb\xcd\x92\xbf\x01t\x1f\xfa_\xc6\x03\xf7\xf5\x0e\xf1\xaa\x0f=\xd3=0\xff\x1b\xe3\xc72\xe3\xce\xb5\x12\xae\xf1\x0e:\x90K\x8d>\xa4\x87\xdd\x87\xd2\xd4\x92 \x9b\xbb\x91\xa6\x91\xc3\x06\x05-\xb9[\x00\xa4]U\x80\x90\xffm\x87:4]\x0f\xeb\xe0\x919\x143/Q\xad\xb9\xdd/\xc0A\xc7\x0c\xaa]l\x8c\x8e\xfb\xc2u\xf1a\xb3\xf6\xb5"\x06\xaa`\x01\xad\x9b\x8b\x0eL4\xb7p\xcd\xa2\x86h\x9f\xd6\x16r\xc7\xe2\xc3n\xb1\xeb\x9b\x0e\xca\x03\x91\x0e\xb7\xef\xbb\x11y\xfc7\x9e\xf1\xfb\x10[\xd8\x81x\xb0\x92\x8bl\xc8\xb4\xea8\x89\xe2EJUwp\xcb\xbdQM%\x91\x91\xd0Y\xfb\x0f\x8e\xf3\xd3\\\xd8R\xd5\x14\xbc\xd6P&d\x01E\xa2\xf2\xe9\xc7}\t\xbb\x1fq1\xe6U\xbbZ \xbb\xaep\x87<\x12?z\x90U\x08#\x1f\x82r\x81\xa1\xadQ\xc5\xf7\x06\xcfJ\x1c\x9b_2N"\xcc\xbfo\xb7PQ\xccj\n\x16\xdcY\xdc\xdfy\xf2K\xabq\x13\xff\xc7?^\xe4\x92y\xads\r\xac\x02\x11H\xaf\xe7\x8b\x80=\xf2U\xe9\x88xO\xe3Q\xcd\xf0\xd1\x17\x17k\njW\x88\xee\xa3\xa8\x11tcP\xe1z\x80\xd0\x81\xe4\x1a\xb7\x935@k\x112d\xa3G\x04\xab\xf9\xc0G\xba\xd5@|V\xbcI\xa2wm\x92\x822\x7f\xdb\xb3\xce\xa3\x10\xa1;4A\x90\xc8\xa4\xf1\x9a\x98\xb0\x16\x14\x88\xb1\xda\x13\xd1\xdf8\x06\xe7i\x11\xfcO\xb8\xfb\x1fb\xe4\xc0Ai\xf7\x04_\x16\xcf-,\x08<\x82?\xc2\xce\x97E!Z\xb9\xf9Z\xd9\xe5\x9c@\xde\xbb0\xcc\x9d\xef:\xa9\xff\r\x94UM\xcc\xd4\'\xfa\x11\x8cxaN=I\xb9v^\x14\xa9v\x88< ,\xdd\x852)R!\x96\xba\xfc\xcd\xc3\xb5r.\xf6\x81 \x07\xefms\x97M\xcc\xea4\x84\xd7\x17\xc4Ua\xe1\xb0\xcfd\x91\xcb\x83g\xe4\xf6\xce\xc2\x8c\x875\x9bF\xb9\xb9\xe0\xee\x99\xdf\xb9\xf5\x0e~\xd4\xa4\xb1jngLRQ\xc7\xdb\x11\xef?\x8dH\xf8\x84\'\xfd\x04\xb0\x07\xe13/\x9b\xdcv%\xbf\xc8E\x94Y\xfa\xfa\xcf?\'\xb1s\xbcV\x96\xb9`\x13\xde\x9eT\x0e\x02\xadrn\x1a\xaa\xb9u\xb7\xe3\x05\xca\xf1\xea\t\xe7\xe4U\xe41B\x9f\x93\xf4Z\xdad\xdd\xf1\xa7y\x10\xb0\x88\x08\x88\r\xc5\x85,\xb5\x86\xf3\x03\x19\xaa\xb2\xa3\x1e\xa0\x1f*\xfb\xf9\x0c\x83q%\xd7\xa4\x8f)\x1aJ4\xab\xbc\x872?=\xbb*\x90\xc5\xa6\xcc\xddb\xdd\x07\x98\x94]\xd6\xf0N\x9e#\xb1\x0bK\xde\xbf\xab_\xd7f\x88\x935\xf4\x8a)Q\x89j\xbd\x1b\xb7\x18\xf4\x7f\x0e\x9bR\xcf\x8a\xa0\xec\t\xdb\xe7w\x95<\r5^\xe5\r\xdb&\xe8\x92\x07O\xa1Z\t\xcbeu\xb7\xcc\x9c=\xa3\xb2\xc0\xab\x80\x16\x9eG\x97;m\x1cl\xbca\xe9\x92-_p5\xceA\xdc\x12rP\xba\xba8\x17U\x06"\x95\xadu\xbe\xf8\xee\xb7\xd2\xe9\xb3\x9a\xc7/\x97\xd4\xd1\x808\x8c\x8b\xc5o%\xeek\x01\xc8aT\xed\x1d\xab\xdf\x1f\xd4\xd8\x90\xf3[\x8f\x86\xa7s\x83\x8e+\xfe)\xda\x1dp\xbb\x1e\x96\xa5$l_M\x95\x16\xc5\x95\\\xfd\xf4\xf7EE=\xc1\xd6u\x98\xeb-\xa8SP<l\xc8\x08\xc6\xb8\xe2\xe4Z\xe7\xab\xd0\xce\x98\xf0\xden\xe4\x1a\xa2\x90\xb0\xff\x0eh\x12\xa4\xa0\x8bmb%"<\xea\x8b\xa2\n\xdd\x8dR!\xb5\xf1\x17\x13\xb3\xc6\x9e\x9e\xc5\xee\xeav\xdc\xfb\xcb\xf6\x80E\x90\x0ej1\xc9(\x88m\x16A\xd9\xca\xb6:`\xf0<Gf\x12p\xda\xb3\x02\xba\x10\xf9\x86\x11\xf2\x8e\xfe\xd2<\xe9\xe9\xee\x0bU.\xd3KA\x19\xbe\xeb\xa3\xe0\x11\\z\xbelfO\\^\x1e\x829\x9dx\xaaO\xc9\x8a\x16,\xc8TS\xd4\\O\xe8\xf9\x8dM\xbc]\x90,:\xdb\x16\r\x13B\xdd\xe4\x0c/\x90\x89\x92\xf4\xbb\xd8\x99\xb0\x01\ru\x15ZBuiW\xe3h\xab\xeb\xe1X\x88o\\\x11\xdd\xa0\xfc\x07\xb0\xa5\x0cB\xd0\xb0~%\xf4I\xe2h\xf6\xdax\x9es\xe0\xc2\xfaR"\xb7\xc3\x1c\x99W.\xce\xe7\x82\xce\\\x91\xa2O\xae\xf9\x91\xcd\xd0a\x17\xc6t\x94\xa4\xe0\xff\x94\xcc[\xeb\xb65\x17s\xc0\xbc\xdb\xee\xcb\x11\x1d\x80\xfd\x1c\x97\x80\x1d\xaf\x0f\xa7\xba\xc5\x8egSlAz\xb26\x936\x97\x08\x1f\xba\xf1\xc2\xe2\xfaD\x0f~G\x1b\x83\xcd,\xeb`\x03\xa3\xd9Vu\xa7\xfd\x0c*\x8d$\x93Rz\xa5w(\xd1IpT(=\xd2\xdc\x86\xcb\xdf\xbcP\xb9\xaa\xb4|Z\x92\x8a\xfb\x91\xd4\xa0N^\x9c\xf9\xcd\x0c\xce7\xf0\xef\xe1\xbd\xda\xd8\xef.\xd4|\x9b\xb8\xf0\xdf\xb5r\xact\x8f6;r\xac\x13EjZ\xe6>XL^<o\xa5I2\xc8\xde6H\xcaR\xf8@\x80\xb9\x1d\xc2\x02\xf0\xd8\x10!$\xa9\x87\xe8$\x85Q\x14Wi\xb3i\xf7\xd8r\xf8\x15\xf7\x9e\xa6p\xf6\xc7\x90!\xc3\x1fR[L!&\xd4\xb8P\xabR0#\xfd\xc5\x94\x8b@\x8a\xe9\xad\x8av\x9b\x82\xb5(\xeb\x00\xf1\xb5@*\xd25\xc3\xa8q\x82q%\xb8\xc3%d\xe9\xd3\x16:o]\x93hNx\xad:\x9c\x8dE\xa7\x9c\xb0{\xa5\x9a\xf8\x1b\xaadmoT\xaf\xb7\xd3\x12(\x9a\x96\xef5t\xban\x98\xa4\xf2\xcb\xda\xee(]\xf8\xb6\xa3\x16\xa1\x96\xc5\xbd\x04|\x07\xf85bN\x99\xc8F\xa3e\x06\xb5\xa5\x05\xe2c\xad\xd4\x0e\x96\x90\x92\x1eo\xf8_\xd3\xf2\'i\xca\xed\xc1%2\x8c\xf8\x86\xc0\xd3\xbd\x03\xc9\xfe\x93\x80\xfe\xde\x99\x87\r\xb3~N>\x01\x9a\xea %\x84\xbf\x9f\xebj6\xf2\xa6?%\xad\xfcv/qiY\xbb\x0fb`\xa2\xd8\x13\xee\xb6\xdcv\xd4?\xbc\xa5T\xa8\x13\xbe\x9a0\xb3BSZ\x12r6>G\xc5\xd0\xde\x7fC\x9d\xca\xe6g\xfb<\xf2\xf3\xf5\xe4\xe6\xd1\x07\x0e\xd2 3<m\xa8\n\xac\xba\x9c\x0e<\xaf\xd3\xf1w\x13\xcbJ\xad\xfe\xb9\xbb\xc9\x9f#\x19\xb3\xedbm|o\x9b\xfa\x82E\x89Ba\x03\xe4\x8a\x9f\xe1\x9f\x0b\x80K\\\x01\x94\x12\xcdc\x85Xk4!c\xfd\xcf\x1aH5\\\xe1\xcb\n%\x19Ma\x8c\xbe\x84\x94\x80A)\xd65\xfbJ\x8b\xe3TA\x0f\x88\xd3e\xbb\xe0x\xa8\xb0\\t\xae\xf4\xb8\x96\xbd\xb8"\x10\xe4\x1d\t\x9am\xb0\xa4\xbb\xbe0}3U\x94W\xd2h\xcf\xf2\xef\xa6\xdcy3\xfav\t/\xa0\x0f\x00b.:\xb3\x8fW-W\xab\xa6\x05\xf6\xa7\xa3\xe3\xa9W\xe8\xe1t\xf7T\x16\xc5\x99\x17[\x9d\x99\x12\xf5P\xa5n\xe1(\x1d%\xd25w\x9dyUl!\xc7\xc4&z\x87\xa9_C\x9d\xeda\xc3\xf9*\xf4\x8e\xa2\xa4\xb4V\x0c\xe4j\x0c\xd4W\x8e\x9eT6\x86\x94d\xd8<\x98\x13\x83$5\x9a\xd7\x07\xaf\x80\xbd1\xad\xe7\x128\xed\xe6\x7fCTy\x1b\x02g\xa3K\x93\x90\x9dS!1\x18\x14"\xd4\xbc6\x12\x83\xe9\xa3\xff\x80s\x92kYr\xb2D\xce\x8e\xe0\xa6\xe8\\\xe2\xac\xe0\xdeA\x1e\x92\x9b\'\x84\xed\xcaF\x01\x18\x15\xe9\x96\xad:\x9d\xe2\xb5"g\xdb0\xbf\x95\xc0<x\x8d\xa9V\xb9_\xce\xbb\xb4\xdc=\x9f\x03\x88j\xa9j\xc2\x13\xbf\x10c9\x93\xa3\xd8\x97\xa1\xa02\x18\xea*WH\xf0\x19\xa45t\xee\x01\xfc\xcc\xffq; ^h\x80mX\x0fz\x1a\x0b\xe8R\x86\xe0\xca%\xd8\x82@\xf6\xa0\xe4Y"w\x91\xc8\xe8a\xb4Td*\x85\xcf\xc9\xc5V\xd9\x02\xeeT\xb8""\xa5D\x94g\xd7T\x92Kc\x8e\x80\xba\xfd*\x86\x10\x18q\xf4<\xc2\xb6\x87\x90B\xf0\xb3\x9c\xd5\xb5\x9f,"i\xcd\xa6\x7f\x99\x0f\xaf\xdd\xb8\xbc\xe2\xd7\xf3\xac\x15\x8b\x8cQ\xc8\xe03\xf7\x9d\x8d\xf2\xb3\nf\xcc\xdf\xea\x8d\xd3ip\x0c\xd8\x94\x90W\x9b\xcf\xd6\xbd\x9e*&ym\x90$\x0b\x7f\x02\xa1pA\x8cW\xb3\x96\x1a\xf3\xce\xad\xe5)\xec\xe5\x00\xdc)\x0fE`\xfb\xcb\xef\xeftS\xf6\x81\xa17z\xeb\xd6\xed\xec\xe4\xb5(\xb7YWDR _R\xae>\xafM\x02\xbc\xb8\xda%\x0c\xb2\xf4WU\xb6#\xe6\xee\xc8\x00\xac\xc9\x14\xe1\x17\x02\x7ft\xfb\xcb<.\xb3\x9c\xdf\xb6\x87`\xf2\x90\xc4\x02Rq\x1b\x8b\x04\x942`\x93$q\xa0s(7\x91\x98\xde|\xdbx\x1aH!\xf3-?\xbe\xde\xaf\xb1z\xa07\x0c\x97w\xad\xa2cn\'<\x02(K\xc1\xeb\xe0aL\x9cy\xc2\x14^\xe9\x80\xbaeY_rL\x0cA\xd8a\xb0/\x11\xfe) v9\xa0\xda\x9c\xca\xfa\xf3%T\xb0\xa9x\xe0\x8d\x0e%\xbc\xb0\xca~|Bu;)\x93Zs\x80[\n\xd7\xbea\xaf_\xf0\x87\xa3\xfa>\xb5\xd0\xb3D\x13$\x97\xadgp\xa1S\x0bd\xc7\n\xa1e\x81\xc4t_>\xc6e\xa3\xb1^Y\x1f\xdc\x94\xde\\\x84mMK\xc7(\t \xaa\xb1\x08\xc45\xf3\x9em\xc1\xf5w\xc2}\xfa\x14\xd4\xd3\xf6\xab\xddD\'\xe5-\xe2\xdc\xa2\xdc\x85\x9eIg\x98\x16\xde\xae\xf9\x9d\xb9\x03?\xa0\x9e\x13l\xbb$\xe4\x81~\x95\x8c\x17\xee\x89o\x86?\x87\xb1\xd5\xa8\xa6\xe9\xb1\xaeqA\x80x_\xad|\\\xd19#\xde\xdb}\x89v\xb1G\xaa\xfd\xa2t\x89a\x9a\xafE\xe2\x96\x07\x99\x8d\xad\x87\xf5\xf6\xd0\xc8A\x81\x0e\xdf\xc07\x1f\xa0Qa\xd1\xb8\xac\x9bF\xed\x14g\x10\x13O\x8f\xc9\xba\x7f\x15^\x10\xe5\x1a\xc8\x0bf\x98\xa7M\xb1\xb3\x82p\xc2\x8b\xc0\x1c\xab\xb2{-|P\xa3\xe5"\x0cw\x1f\xc1}\xed\xee]oP+\x0b\xca\xb7\xab\\\xb2\xb2}\xc4t\xe3y\x1c5\xa6(\xebW\xb2sZhz\x99BB\x8d\x8ad\x12i\xb4\x8ak\x87cf\x87n\xb0qK\xbe\xcf\x7f*]\xbf\xbe#aN\xcc\xa7v2\x1a\x19q#\xb2j\xb2Nn\x03\xd2\xbc\n\x02\xc1\x9dB\xd7\xec{\x0f\xa2\x98\xab4f\xfc6\xd8\xeaI$\x96\xc5_\xd7\x1aI\xabo\xd8\xf4%\xd8\x1b\x92\x98\x19e4\xb1c\xcf\xf12\xbc,\xc1\xe2\x92\x0e\x7f\xcc;V[]s\x92\xd9\xa9\x98\xdd\x04Oc\xd3\xfc\xd67cM\xba\r\xf0\xfe\x99R\xad\xed\xe7\x8dS\xcd^^\xb6Mc\xf7\x1aU\xbb\x0b\x12S\xfe\xea\xed\xbe+\xfc\xa4D"z\xe3\x1e3\xc1\x80\xf4\x03\nx\xd6\xe4\xa1c\xd7\xfc\xa5;\xdbM\x13x\x1b\xa1\x8f.\x13|G\xf9\x06u\xec\xc1\x98Tqr\xff\xdf\x11\x94\xde9T\x14\x8e\x10\xab\x13e\xf7\xb1z\xf3\xc4Yk\xbe\xeed\xed\xf9T*\xcf\x84\xa1\xfa\xbb\xb4&\x13\xb1\x0e\x92\xc1N\x92\x0c\x87\xd2\xee\xce\xd1\xbc\xce\x13\xb5\x1f1\xeda\xc5t\xc8\xee\xb9\xfe{\x0e\x04\xe1\x12#\x9b\x8d\xd2\xb4\x8a{\xab\xc7\xb8q\xb9\x89l\x9f#\x1b\xcbw\xa5\x125\xf4\xe0h\x0b\x0e\x12g\x03|\xa1\x12:\x8dg8\xa2\xf1\xf2E\xdf\x16\xfco@`\xbd4\x0b&\x15\x1b2\x84\xf8\xd6\x18\x17Eor\xe91_\x8ay^_%\xfc\x9e\xb8?$.\x93\xbes\x98SpJ2.n\x8e\xbeRmF\x9b<uY\xceh\xd7\x80=\x88\xc1\xf9a\xb1\xc1?\xd9\xfc\xc4\xdc\x03\xf6\xf8.\xec\xcb\xa3\x93..\xbaj\xf2;\xe9\xfb\xdam\xd4\xdb>\xb8\xae\xdc\xb3\xa0\xa2\n\x9bC\x15S\x01\x8aK\x8fI\xf4u\xb7\xffB\x0c\xf2i\x97\x88\xcei\nO\xa5>\r\xbb\x8c\xa6s\xaaq\x88\xc7\xed}%\x9a\xbc(JP\xee\xcbT\xfa/2]Jw\x84\x1e\'\xac\xaf\xe9\xc0\x0c"\xb4\x1f\x8bo\xa0D=\xaau\xdf\x91\xa9O\xa8i\xd3tp\x0f\xde\xa1\xd5u\'\xc6]7F\x13D3L\x86\x85vo\x16\xfb\x97\xe5P\xcb(>\xd7O3\xbd\x1e\x07\x08\xb4v-/@\xd8\xe4\xac\xc4\xc0A\x93P\xae\xe0S\x0c"b\xd2-\xfb\xf3\x86=\xa8\xb3\xb1L\x9f\xe8q4k\x8b\xdd\x03q\xf0(m^\xb3\xbb\xb2\xa5+Za\x86\x8b\x83~\x8dZ3\xf7\xd8\xbe\xff\xfb\xfe\xdd\x14\xed\xfe\x903uG\x1f\x19.-K\rD\xc8\x93\r\xfe\xa2\x12N\xab\x97\xe1\x88<>T\x12&UCj\xd9\x96XA\x165\x7f\xe6>[@\xf6\x8b\x84c\x92\xb4\x0b\x97\xb6\xae1\xbd\nh\xe0&/\x8e\x18\x85\x115\x94S\t\xa0\x15\xfe\xb4\xf1\xd4\xd3"\xca?\x82ZX\xed\xa9A>U\xf0\x99\t\xe8\xeb\xb71%\x0f!\xd3\xa7\xf2#\x04\x98\xdc\xf9\x1b\r\xcb\xe25\xe8$nJXHP\x8d\xaf\x9d\xba\xb6\xa2`\xa3\xc3l\xba\xd6\xae\xc1\xfb&\xe5\x11<\x0f\xc8\xff\x06tD\xf4\xabF\xb5(*\xf0\x14nn\xd2\xf1\x98fMTJ\x0c25\x80+\x87"\x0b0j\xbfw\x8e\xbd\x11\xf6\x07<^[K\x84\x92I\x82\x8a\x8ba\xf7\x18\x9ek\xc4\xb1\xf0z|\xc5\x1e\xa0\x1c\xa5^\x124?\x9bJ\x12l\xc4\xdb\x1dqf\x84\xa0xj\xfaz\x19\x12\rDXVvU\xb0\xf6\x99\xa3\xca[9{\x98\x15\xd52#\x82{Uv\xc0\x82\xc7\xab\x1b~\xf5\xd70\xe5\xdb\x06R\x08M\xe6\xd1\x8fw(\xd9\x96\x1ezt\xf1\x9b\xa9-\xdbF\x96\x1a\xe5F\x12:2\x95cP\xc4\xa2\x0fe\xefl\xe4\\\xb0\xce\xd0_\x87*g\xc1;{\xfbW\xcey6\x86\xa8\xfaq\xa9:\xcc\xafeX\xd2|\x89F/$})b\xf7\xae\xcaaC\xb5\xcd\xefpS\xb6\t\x0b/\xfe\xbb>\x90\xe0\xa2^?O\xab\xc8\x1d\x85.\xd4-w\xa4\x10\xc3\x14p\x82+\x0f\xa6a\x13\xd5\x8c\xe7H^["^\x10\x02\x11\xd1\x91\xe6%\x95/\xcc\xcaY\x83n\xd3\xd48{\x05\xf6')
|
4
|
-
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
from urllib.parse import urlparse
|
3
|
+
|
4
|
+
from hiddifypanel.panel.database import db
|
5
|
+
import uuid
|
6
|
+
from flask_babelex import gettext as _
|
7
|
+
from flask_bootstrap import SwitchField
|
8
|
+
# from flask_babelex import gettext as _
|
9
|
+
import wtforms as wtf
|
10
|
+
from flask_wtf import FlaskForm
|
11
|
+
import pathlib
|
12
|
+
from hiddifypanel.models import *
|
13
|
+
from hiddifypanel.panel import hiddify
|
14
|
+
from datetime import datetime,timedelta,date
|
15
|
+
import os,sys
|
16
|
+
import json
|
17
|
+
import urllib.request
|
18
|
+
import subprocess
|
19
|
+
import re
|
20
|
+
from hiddifypanel.panel import hiddify
|
21
|
+
from flask import current_app,render_template,request,Response,Markup,url_for,jsonify
|
22
|
+
from hiddifypanel.panel.hiddify import flash
|
23
|
+
from flask_wtf.file import FileField, FileRequired
|
24
|
+
import json
|
25
|
+
|
26
|
+
from flask_classful import FlaskView,route
|
27
|
+
|
28
|
+
class Backup(FlaskView):
|
29
|
+
|
30
|
+
def index(self):
|
31
|
+
return render_template('backup.html',restore_form=get_restore_form())
|
32
|
+
|
33
|
+
@route("/backupfile")
|
34
|
+
def backupfile(self):
|
35
|
+
response= jsonify(
|
36
|
+
hiddify.dump_db_to_dict()
|
37
|
+
)
|
38
|
+
o = urlparse(request.base_url)
|
39
|
+
domain=o.hostname
|
40
|
+
response.headers.add('Content-disposition', f'attachment; filename=hiddify-{domain}-{datetime.now()}.json');
|
41
|
+
|
42
|
+
return response
|
43
|
+
|
44
|
+
|
45
|
+
def post(self):
|
46
|
+
restore_form=get_restore_form()
|
47
|
+
|
48
|
+
if restore_form.validate_on_submit():
|
49
|
+
file=restore_form.restore_file.data
|
50
|
+
json_data=json.load(file)
|
51
|
+
|
52
|
+
hiddify.set_db_from_json(json_data,
|
53
|
+
set_users=restore_form.enable_user_restore.data,
|
54
|
+
set_domains=restore_form.enable_domain_restore.data,
|
55
|
+
set_settings=restore_form.enable_config_restore.data,
|
56
|
+
override_unique_id=False,
|
57
|
+
override_child_id=None
|
58
|
+
)
|
59
|
+
|
60
|
+
from flask_babel import refresh; refresh()
|
61
|
+
from . import Actions
|
62
|
+
action=Actions()
|
63
|
+
return action.reinstall(complete_install=True,domain_changed=True)
|
64
|
+
# hiddify.flash_config_success(full_install=True)
|
65
|
+
else:
|
66
|
+
flash(_('Config file is incorrect'))
|
67
|
+
return render_template('backup.html',restore_form=restore_form)
|
68
|
+
|
69
|
+
|
70
|
+
def get_restore_form(empty=False):
|
71
|
+
class RestoreForm(FlaskForm):
|
72
|
+
restore_file=FileField(_("Restore File"),description=_("Restore File Description"),validators=[FileRequired()])
|
73
|
+
enable_config_restore=SwitchField(_("Restore Settings"),description=_("Restore Settings description"),default=False)
|
74
|
+
enable_user_restore=SwitchField(_("Restore Users"),description=_("Restore Users description"),default=False)
|
75
|
+
enable_domain_restore=SwitchField(_("Restore Domain"),description=_("Restore Domain description"),default=False)
|
76
|
+
submit=wtf.fields.SubmitField(_('Submit'))
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
return RestoreForm(None) if empty else RestoreForm()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
81
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|