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.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
1
- # 2023-04-08T15:11:21.609200
2
- from pyarmor_runtime_000000 import __pyarmor__
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
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
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
@@ -1,5 +1,107 @@
1
- # 2023-04-08T15:11:21.584336
2
- from pyarmor_runtime_000000 import __pyarmor__
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
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
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
@@ -1,5 +1,57 @@
1
- # 2023-04-08T15:11:21.619194
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xfe\x0c\x00\x00\x12\t\x04\x00V\xee\xedT~SwI\xc6n\x83\xa878y(\x00\x00\x00\x00\x00\x00\x00\x00n\xa3\xf1\xbc\xf21\xb49\xb3#\xd8\xf3\xfd:\x89\x1fD|\x86/t\xe3\x82\xfb\x08\xbe`\x94\x05\xaf\xf4:\xa2\x10\xa8\xb5\x11\xfd\x9c\x16\xb8.Y\xadG\\\x8e\xdc\x0e\x03\xe6\x93\x06\x82\xe3\xf9\x02\xb5\x01\xd3\xe1\xbf\xeds8\xa8\xae<\xc8L\x1aA\xd5\xc4\xbe\xa3Im\xc7\xefov~\x97\x06D\x9a\x81!\xfdZ\x19\xd7\x9a^\xe4x\xc1\xde+2\x81\x05\xf9Ly@\x9e\x9fi\xf8r2\xee\xc1\xcb\x00w\x88\xda\r\x9eo^\x11\\\x98\xf1r\x90\xac\xffq%W\xc7\xd6\xe0C.\xb0\xd5\xdc\xe2\xbd\x81\x0c\x1d7\x97\xc3k\xa5\xcd\x1b^\x9e\x92M\xa2\xc6l \t\x0e\xcf\xf0\x93\xb1\xf3\xf4\x88j\x8b\'\x88\x85O^ \xcf\xfa\x90y\xff\xea\xbd\x11\x1d\x9f\x83\x85JT\'\x86\x05\xd0s\xc0\xb5\xe2\xb6S\xe5y\xfd\xc7\xfb\xbe:VJYyj\xcf\xe9\xeb\xd7\xedtE*J`\x90)\xef\xa2\r\x0c\x14\x93\x87\xc70\x1aa"\x98\x18\x92\x88]\xcbU`\xc2`\x0e\x85\x02\x90\xeci\xfbf\xe5\xf642v\x15\xd5G\x1e\x8f\xa1\xd6\x8f<d\xffQm\xb55\xeaYp\x81\xc45\xb3\xcb\x1f\xa9\xd6A\r\xdc\x1b\x1c\x9c?)M\x15\xf1\xceg\xd4\xfbI\x81?\xc0\x17\xca\xef02\x84\xf9j\x98\xda\xdc#\xfaQ\x8b\x01\xe0\'X\x9b\x8b\x8c\x80\xc5~\x07b\xce\x85\r"u\xf1\x83\xe8\x10\xcc]1\xd5\n\xad\xc8n\x9f\x00\xc1Q^RQ\xbeQp\xefe\xfe\xf4\xe0Hr\xb3p\xc5\x9b\xc8i\xf8\xb79a\x90\xfa\xd4V\x97\x92\xcb@\xaf\rX\x85YN\x9e\xcb\xd7\xfd,\x94\xf8]R\xff\xd3\xbaQ\xd1\xc0\x95\x99j}G)I\x0f\xd4xl\x87\x99,c\xf0\xe3\xb1\x17t\xd1HF\xe9_\xeb\xb1\xe7\xf1\xd4\\\x7f\xa5\xf9\x80\xaea\x86\x0b\xc3\x9b\xf6\x9a\xd5\x14\xd7\xb7\xde(\x87Q\xec\xe1\x00\xfa\xc2k\xa9G4\xe0\x1c\xbb\xd1{\xb5*\xcarQ\x18\x08JSae\xb0#&\xe9O|\xa2\x80\xe1\xa4\x0e\xa8\xfe\x169\xf5\xa1\x1b\xbf`=\x01\xdc\xef\xdd\xe1\x15\xe8\x1e2\xd1\x19\x12R\x8a\xc5<L\xfe\xaf\x03\xc9K\'\x1cNf\xa4\xa2\xf6d\xb1$\xf0\xbf\x8cG\xd1\xd6\x02^3\x1e\x84\xd2\xf1\xb5\xd7\xcc\x90ArZ\xec\xd4\xcc\xd5\x90\x9f\xc67\x80\x8c\xe7R\x8bE\x92C\xec\xc7\x8bRD\x92\xa1\x9b5\xfc\x10\x06C)\xaa\xbfhSM\x9e\x1c\xa0\xed\x88j\xf9\x05\x81\xa7\x10.z\xee\xc1\x0fcw\xd5%$$\x1e\x0b\x8b\x175WA&r\x1c\xbb\xd3d\x18l#M/\xd9\xa6\x01[\xd2\x80xA\xd5\xac\xb2l\xb1\xde\xc3\x08?\xe8(\xaf\xfa\xc6M\x1a\xd0\xe1.\x93Q\xe2\xda\x07\xcf-P6\xc4\r\xd7\xb6$\x01\xec\x01@\xb9C"\x94\xfeq\x88#;\xc0\xae\xa8=\xfeN\xdc\xa1\xc2\x05\xcb\x93~~\x03\x08\xb6H\xb97\x80\x96\xd9/q\x7f\xe21d\xf2\x1dc\xf1\x07\xf2oO\xb7\xc3\xc5\x91\xaec\x8a\xbb\x14\x02E\xb8\'\xafiN\xf7\xf8~B$n\xdb0\xe2\x9f\xfa\xee\xcd\xce\x16\x19*\xdc\xefA\x9c\x84\x8c\xbd\xd5l\x18N\r\x11h\xad\t\x17Cl?\xb0\xea*\xc6\x18\x08W\xcc\x027\xcf\x16\xaf73YC\xf3\xec:\x8d\x8b\xd0!\xf24\x1c\xb4]V\x00\xe9>q\x8f/C|\xea\xb0\x00*\xbf\x9f\xe0Jf\xc14^>~\xc4\x04i.b0&\xba\x94w\xbf\x10\xccDF\xd2:\xf1\t\n~\xc5I<\x9a\x88l\xe6J\xae>a\xe0\xc9\xe87la\x90\xb3\xd5\xcf\\z\n\xf05g\xb7^g\xd5\xa0\xc6\xbaSW{36d\x03}\xe9N\x08\xef\xd6\xd1\xdf"J&\x80\xcd@\xb2L\x91\x8cuf\x80\x1b#)oD\xcd\x0bi\x89y\x91\xab\xa1\xf7\x03#_\x87\x94\xd7/;|?7\xfe\x9a\xc0\\ut\xd1\xe3\x01\xa4e\xec"1\x078\x974\xb7\xb2\xd9\xbe5\xeaF\r\xd8\xa0\x13\xf2\xf6Y/5d9-T2~\xa0q\x0f\x80/\x1dW\xd1\xd2\x83\xa1\xf2b\x0b\xfd\xaa\x7f\xab\x8c\xbb\x99\xc1X\xe5\xde\x8a\xf1\x1a;spE,Nk;Y\xb3\x04y\x0c\x86Y\x0e\xf9^\xe9\x1f\x02\xf4\x90r\x7f\xf6\xa6\r,\x1c\xb3H\x9c\xad\x1eL\xec\x99\xde\xd5\\\x1a\x99\x1f1\x1c\xe51\x8bJ6\x14K\x9bN8X|\xb6^LiI\xb4yE"E\xdf\x10\xcf\xdd_j\'%r\x80]/\xa0z?>\x8b\x1e6\xe1\xa3\xbb\xb0=\x04\xef\xca\x93\xd8_\xd4Z`\x03~<_\x93\xdb\x8b\x8a\x08\'!\n)\xe7\xf9\xd7\x8c\x1a\xe5\xa9\xcf\xcd\xfe\xf0\xe1\xb6\x06\xf4\xa1m\xd2\xcd\xb7J\xe3\x10h\xe7/\xe7\x1e\xbc\xf4\xb7W\x05X\xc3\xd3H~\xe4\x13B\xf1\xd5f\xc0\x9c\xdc\x1by,\x1a;\x1f%\xa7\x8eD\xbe-\xed\x90\x13\xbco\xe9\x85_$\x171\xb8\xfb\xfb\xf1\x14\xc6\xab\xe6\xe0\xe5#\xa6\xe96\x9a\xcb\xcc\xd7\xcf"\xfc\xd8\x86\xf6\xd8\xda;F\xfc\x96\xa6\xcb@\xa6\xa4\xe9\xe7D\x99\xb3\xb7\x01\xc6|\x90\x02B\xd4Pb\xe8a\x1byR\x171_\x1d\x1f\xe4\xf6\x18\x98\x04\xf3\x15\r\x94m\xf3B\xa9\xbf\xe4\x8c\xc8\xd5\x91\xfd\xe7\xab\xdf\x1c\xbeM`\xc3)\x16%\xdf\x86!&B]\xcd4L\x9f\xf7\xe8\x08\xd2\x9dB\xbc\x96n\xca\xe1\x96\x86\x95\xb3N\xca\xb5,)\xa4\xbf\x8fg\x07\x07\\\xd1g\xa8\xd4M\x88\x9dne|\x16\n\x1d\xd5a\xb7)\xfc\xaa\x1a\xafZ\x9f\xb3x\xf8X\n\x15\x16g)\x1aM\xe0\xe6\xd6gy\xe2X\t^\xec\xc2kF\xf5I\xbc\xd5\x14\xca\xa2\xd9v\x83\xdd\xd4\xe2\x83\xaf\x81\x9bNOf\n^I36\xb7\x8fBd\xa2\xe0\t$\x1b\xbd!\x07\xd9\xde\x90\x97m\xae\x04s\x94\x875?\xa5dmm0a\xc6_\x9e\xbe\xc4#/&\xae)\x04\x9a\xfd\xd9\x95\xac\xb1\'\xd2\xbf\x0c\tX\xcd~\xdcHT\x95C\xbe\xac\xe2\xa5\x93<N,\xb5\x1b\xdc\x08J\x04\x8d\x8b\xf4W-e>R[\xda\x93s\x9c\xf1\x12\xb1,\xc7\xa1}\xe1\x00\xe6\xe5a\xf8\xc17\xa7\xc9\xbf@\xbf\x1b\'\xaf\x0f&vp\xa2\x91\x9df\xf0K\n\xbdr\x18\xbc\x8aFv)G\xf5\x8f\x9e%0\xeb\xfb\xdc\x01\x8a\xcaQ\xe4g\x9eq?2\x93\xa7\'\x10\xbfM>\x1a\xea}\x0c\x9c#K\xd6\xc0ga\xe3\x03\x95+$\xd1>\xb4\xa7Z\x95\n%\x99];\xc4yS\x04\xc3\xc67(\xf1\xab\xf19\xd9\x0c\x9f\x07\xa8H\xfb\xf4\x06\x12<q\xb0\xae\x80\xf1\xe04\xbe9\x07>\xbc\x85\xc8\xc0**pN\xd7\x8f}\xc1\xdc\xa6\x82\xc7\xf9(T\x81h\x1a\x08\xd2\xa5\xdclYeu+\xdb\x15\x97YJ\x9b\x0e\xd9\x83\xaf \x17\xd29\x8ay3\xc6\x0b\x86\xd0\x806k\xf5\x92\xe9$\x9d\xd73\xb9\xab%\xee\xe1\xe0\xea\xccC\xaaS\x1f9\xb7\xeb"|h\x05\xe8\xdc\x85\x05\xefUu\x07.\x12\xcd<$k\xc4\xa3<8Q\x8b\'\x0e\xbd\xfd^c\xde:\x07N$\xbf\xca\x1d?\x1e\x0b\xaa\xaci\xdf\x99!\xaa}:B\xf4\x06\x06\xc3\x81E\x80\x15\xd4\x185\xfa\x9f\xf7\x13n\x15\x18\xce\xc3\xeb\xa4\x94\xcb/J"\x19,\xa9\x80\x7f\x1d\xa2go\x11\x82uI\xc1G8A\x93cb\xad\xdf\x15\xdb\x1bl\x12\xb3\x8fg\xdf\x12(@\xd8\xfeF\x9a\xf0\xfb\x90\xa8\xf8\x03\x1eu\xdef\x98c\xdcA\xc0\x7f\x84\x995!b\x8b,eK\x07\x93$\x13\xbe\xf8Ej\x8f\xdc\xac\xfc,\x190D\xa7\xbcB}\xefC\x12S\x9b\xa3\x8a\xd4\xcfz<*\x99F\xe1\x1a\x81T\xce\x17\x0b\x00\xdf5)\xed~z\xb0\x81\xb9\x1b\xfbqu\x80Z\xf4\xa9\xfbZ\x07\x8d-\xb6\xfa.\xf8\x84\xfc\x83\xdf\xc0\xbcz\xd4R\xa1l\x87\x88<\xba\xb2\xea\xc1vh\x170p\xd5B\x03I\xbam\xb2\x9e\x8e\x93\xbe(\x85-\xadW\x00\x85\xbb\xf1\x18}\xf6\xfc\x02]\x13\xa0R\xbe$\x0f\xacy\'\x82\xa0\xe5\x9d\x01\xdd\xd6\xc9\xb9\x0b\xea\x12\x90\x9a\xe5\x00\xc8\xba\x10+\x81\x02\xaf\x1c$\xae-\xf1\x0f{\xa4j|\x0ed\x9f\x80\x87\xf3`\xeaw\xe6-pSQ\x8dA\xa4\x9b\x83\xb6\xa3\xfb\xd7\xa1\x14H\t\xceA<\xddy\xd1\x88\xdd]2V\x9eL\x10\ryn\xfbTr\xfa\xa1\xc8+eLE\x0c\x8e\x90\x1c\x0b\x94\xfb?\xd5hW\xb6Luh\x8b7\x03\xd1\xf7\x1b%\xea\x04|]`7\xbf\x10\xca\x01\x9c|\x9cCZ\xdapmo~\x08\xd9\xcf\xd9\xd4\xaa\xf1L\x0e\xb1\xaa\xdc\x01i5^\t\xdd\t\x04\xf7h\xdb5\xf6\xe7Y\x96YJ\xc9H\xb5D\x00\x95\xb4Q\'\x8a\xce43$\x08\xdde.\xed\x7f\x9fNtl\xe2O\x94\x85F\xbb\xbb\xbcC\x08*\xd6\xd7l\xc5\xda\xa9\xa8n\xa4\xc6\x89\x91\x13\xaf\xa4\xc1m\x91`\xd4_\x18\x90f#\xe6\xd4e k\xe1l~0Q\xc97\xf2\n8\x08\x92\xe862zU\xa13\xf7\x13\xee\xf1\xf4\x0cS\x97w\xd4Q5\x1c\x81t,\xf6\xcf\x80&J\xdb\x1cW?\xed\x0f\xdaH\xfe\xff\x9e\x94\xe2\xe6q\x1b>K\x94l\x87m\x98\xd1&\xd1\xef$\xbd\xd9\xd2\x92\x9b\x8bmu\x13]\x0f\n3k\xa6\x8faGQ\xd1\xbc\x16\xd9O\xc6\xe6\x11\xfd\x1cl\xd1\x87-\xfa\xaaA;\xd2?\xd2\x87\xa0(\xf5A\x8a\x9bI\xe9\x92\xd8h\xb2\xca\xb0\xa8\xd4,#\x9aN\xb4W\x952\xb0\x84\x9d\x93\xfcz\xf1\x94\xd3A\xc8*\xce\x8c\xf4\x8e\x95\x8b\n\xe5N\xf0\xa7\xea\xc5\xba\xa8\xff\xb9\x14K\xf8\x13\xac\xa2\x96\x18i\x7f\xf0\xf4%\xc7\x90\xad\xcf\xbfDy\x96k\x91\xaf\x88\x8f\x1e\x85\xdfKo\x0b\xd4\xe5\xd1P\x99%:\x87\xfa\xff\xaax\x8f\xd6;\x1cb\xc9`\xa4\xb9\x8f1\xca\xd3H@\x18\xcdC\xc8K\x97;\x1a\r\xfe\xdcy\xf8\xec\x02w9\xf1\xccU\xe8|\x9e\x90\xfbQ\x0c6\xd0\xe5\xb5\xac\xe1\xca\xbf\xf7\xae\xed\x9e\xa9$>\xa9Z\xd10\xda\x8e,h\x9aH/\xa4s\x91\xa1\xfe\xa1_@\x8b\xe6\x7f7?\x96\xfc\xafb\x19\x108\xdd\x8e\x86y\xae\x0c\xde\xfb8q=5\x00\xa1\xd7\xef!\x7f-\xcfA\x08\xe9Z\t\xbb\xc6Tl\xd0\xc2\x8e\r\x079\xc8Z\xa9\x83\xd7\x9dX\r@\xf4\x0b\x8e\xc3\xcd:\x06T)\x98\xa6\x11\xbe\xf5\xd7\xf5_>\x0e\xcb\x94\xcc\xb4\xe4-p\x05\xc2\x02\x92\xa7\x99\xc2\x14\xf1A\'\xeb\x16/\xd27\xbb>A\xe5\xd5g\xf7\xa7F\xe8\xb23[\xf5\x18\x01\x97\x0fX\x160\xd6o\x08\xcf\xc7aPT\xf1A\x05\xe9\x12\x84E*\xd3p\xf1\xc7\x9a\xb1IoZj\xe9|\xd1@\\d\xc2\xa6\xb7<J\xec\xcd0z\x1ei\xa8\x84h\x92+\xe4[\xc0p$\x13\xbf\x816\xfb/~\xc6\x18PK\xe0\xf2y\xf90\xc1?\xf2\x9e\xe7L\xcc\x15V\xcdOB\xa3\xa5/\x0c\xfb\xe1\xeb*h,\xed\xbe\x9cGCV\x90\xb1\x03[\xc2 s\xbd\ntn\xbe\x85\xd9\xf5\x83\x821B\xf9\x81\x0c\x1c\xf4\xc7\xb0\xbc\x9f5\x18n` \x04"\xf9\x14\'*\x97\xd0DK0\xe1\xd4\x92B\xaa)\xceF\xd6| \x8d|\x04\x1fx1\xeb}\xe8\x17\'U\xcf!\xef\xc2\xcf\xef\xcd\\\xe08\xf3t\xac\xfb\x9e[\xad\xca\xc2\xda\xc3\xd5\x8b\x1e\xcf\x16\xbe\xb4\xb9\xfe\x81\x15@~W\xfe\x1b\x7f\xf9\x1c\x01J\x01D\x1b\xc3R\xce#\xa0;\xc4\x97F\xf9\xe6\xa5Lp\xd5O\xab\xf8L\xe9(,\xa1\xd7R\xedU\x80\r\xce0\x80\x13{fa<xFO\n`Oi\\k\x05\xc6A\xe2\x0f\xbe\xc0\xe1\xb0\xcc\x9d^D\x036\xa9\xb8\x9408O\x9a\xaf\xc3\xb4?IM\xc9\xe3\xf1o\xeb\xd9\xa5\xd49T\xe5\x18\xb4w\\V[E\xd6\x84\xb2\x14\x18\xf0N\x14\xa3L\xb7&\x8a\x89]\x16\x88\xe2\xe3\xd0\x90\x17\xaf\xe8\xe9G\x10x\x17\xa4v@L\xb8\x81\xa3\xfe\x0f`\x06\x1a\xa45\xfa)2\x9a}\x1f/\xd1\xe1\xb2\x9e-<\x06\xcc\x10\xe8\xbd>\xca3\x84B\xb0g\xf57~\x9d-b\xd1v\x8c9*u\xf9S\x7f\x07+[B^\x14eQ\xd7\xb1AO\xfb\x87\xefRa\xf9\xdd\xb6\x15\x9df_5\xe0U\xfdB[+_X\x19\xd0\xe1\x05eL\xc1\xd2\xdeM\x9d\x81\\\xff\xff\xa0M\xd9\xd56\xc8R\x1e+\xc3B\x8fe\x81\x0b].\xd1\xccCUE\x97i\x91\x12\x8a\xfc\x17\xfaE\xcc\xd0\xe1E:\xd2\xc4\x06\xd6n\xf0\xb0\x0b0z\xa5\xa2\xda\x17\x9c8\xa6m5\x87\xaf\x0fv\x9d\xb5\xd7\x94\xf0\xd3{\xeaI\xaae\xd7\x7f\x89\x8c\xacxL9\xdc\x8e\x9a\x96\x11\xb2\xb5\xab\xc7\x0b\xd8\xd9t<\xc9\xbd\xb6\xa7\x84\xfe\xab\xf80d\xbbx\xe0\x8a7\xdd\xd2\x02G\xa4\x95\xfbZ\xef\xff\x10@\x0bY\x08O\xca\x80\xa7\x9a@\xf8t\xb36%\xe4\xdb\xba\x19Yg\xd3\x9f6\x9d\x00\x83\x16\xc6R\xe4\x90"B\xcbM\xe5DI\xce\x07\xe0\xef\x16\x8c\x1cUy\xfb\x9ey[\xb0\xac\x98H\x8f\xa4\xc0\x98h\x17\xe2\x87\xac\x00dg\x9b\xba;u<\xf8\xbau\xa9&x\xc7Y\xfbP\xe8\xab>p\xf60\xf5\xffg\x9a\x97I`\x06\xe3\xee\xea\xdd\xc6\xf4\xd0\x10\xca\xa1\xe1\xa5\xb4@^\x00]\x0e\xd5J\xa8\x82\x9c-\x045_u\xb4\'\x9bDT\xe0K\x13o.fO\x0fc!D\xe8\xb6+>\x11\x18\xc9\x1a]yz\x16\xfcD\x14\xf9\x12\xaf\xd1\xf4)aZ\x15s|v\x97#\x13x\xc9\x05\x19\xd4\x08\x99\x11\x084\x0e\xb4\x9c,\xce\xab\x0c\xae\xfe\xad\xb0\x87\xf3Y\x84\x1e[\xc4\x02\xb8\xff.')
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
@@ -1,5 +1,60 @@
1
- # 2023-04-08T15:11:21.645018
2
- from pyarmor_runtime_000000 import __pyarmor__
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\xb7\t\x00\x00\x12\t\x04\x00\xe3\x87F\xc7\xf63\xaf\xcdG\xfa\x1c\xb9\x1f"k\xbb\x00\x00\x00\x00\x00\x00\x00\x006>\xd3\xfayI\xa7@\r\x8d\xf9\xce\x8ek.\x172z\xb5pt\x8c(Z\x87\x82\x13\x01xAQt[\x92~\xee\x8c\x83\xf1\xf6\xfcL\x80\x9f\x94_\x1ag\xf0\xf6\xe0W\x86O\x92\\\xd1p\xe8\xd0W\xd52dXK,*S9\xdd\x86*\xc8\xe2\xf0ts\x9b\xf2\x97\x972vF~\x0f8S)q\x11~R\xcd\x8f\x9b\xdd\xbd\x9c6\xf5B\x13\x18\xcc2h\xa4\xfe\x90aZc\x05\n\x950\x91\xcas\xc8-\x01\xa5x\x00\xed\xbbp\x05\xa1\x9c\xe0\xf2\x82W\xdc\xe5\xa1\x9b^\\\x87\xe2\x14\x14\x88\x9bD,:ef\xa2R\x04\x0cI\x05%\xa7\xdaD\x14\xae\xe0q\xeb\xf8\xdct\x1b\xe0\x9b\xab\xadY\x8a\x90\xad\xa9]~\xa7\xe2%z\xe2\x9f}\x92(\xc4\'e\xbddT\xed\x9a$\xc3!\x95\xac$\xbb\x10YK\xb9\x8a".e\xec|0\xc9\xf7\\<^\xc3\xed_=b\x01\xe8\xe3ur"B\xaa\n\x0e\xe7\xd9n\x0fJ\x9b\xf3vN9\x80\x01z~\xf5\x00\x9f\xf5#T\x85}3hr)U\n\xbd \xc7\'\xfc\xdd\xdal\xe5\x16\x0b\x16ka\xb9\x1dq\x1c\xdc\xc3\x89\xd2\x85\x02\x1b\xb5\xc8\x06\x03N+7u\x15\x82Y\x9e\xa7\xb5\xbc\xea0\xc0\x86X\x18!\xf9]\x98\xdb\x8eq#,W\xd9\xfd\xf6>c\x86\xbaW\xff\xf1[\xe2\xa0\xac\x99k\x1aA\xb8\xed;\t\x1b\xd6\xc0O_\x0016<Q.<}\xe9\xea\x1d\xdb\x9d~0\xc8\xa4F=)X\xd4\xe3\x02\xd1k\xe2W\xbb\xaf\xb6\xd0\xaa\x13\xa2;\xd6<;\xdf \x01N\xb1\xde\xee\x07\xd33y\x1e-\xe1\x9e\xd5a9\x06\xa6%(!]\x11J\xf5B\xa0\x18u\xcc\xe4\xb2\x8c}{[AN\x9a#\'\x02\xb0\xb7jS\xeaX\xbdy\xb0&\xa5?H&\x95\xfb"a0\xd4\xff\x8fA[\xa2\xa6\xf9d\xdc\x06\xe3\x0e\x88\x03Q]\xbd\xb3-\xd0:\xd6\xab\xad\x1ed\xc7`<\x07\xb5\xd05\x14\x1e\x9a\xa4\n;j\xab\xd9y\x05u\x193\'\x19\x1b\xc0\xea\xf8`=\x8b\xc6\xa2\xc6= \xbe\xa0\xc5\x00V\xb4\x1f\x12\x89\x85\xde\xba\x0f\x1e\xf2\x90\xe1I|\x93N\x84\xfc\x99\x8f\xdf\x9a\xf7J~\xc58\x92\xf0\x13\x193\xf7\x19\xb8V\xc2\xeb\x0c\xf60\xe8\xeds\xa47s\xe6d\xc1\xff:\xad\x18ik\xfal\x94|\xc8\xa4gYd\x86\xebc\x9e\xc9\x9d\xa5#\x90\xac?\x9d\xaa0G\xc2vus\xf9\x0e+\xd23pX0\xb6\xa7Ng\xfe\x80\xe3\x90\tN\x05c\x9fU\x91\xd6\'\xf5\xb67\xf7\x91k\xb6\x89"\x8c\xb0\xa6\x9dl[p\xa3\x00:\xa5tR\x86\x06\xc8\x80J\xd8\xd9\xb8\xc4\xc1\x13O`\xd4Z,\x85\xf5\xa8\xf2\x8a\x88\x9e\x8b\xba\x93;\xf0\x92h\xbf\xda\xc2\xe7\xce\xf2\xc5{\xe0\x86z3\x06\x8d\xd7\xc8\x12\xe9w\xb1\xab\n\xa56{ \x80\x0b\x1eh\xa0\x81=o\x7f\x9e\x82\xc39\'\x00"c\x1f3\xebS\xd0~\x0e\x9a\xecp\xef\xd3o\xf3^v.\xddV!b\x8a\xe5\xcb\xd33\xf1\xbbA\xf44\xad]r\x8d"}\xb7o]8\xbf\xe4\xd6\x98\x94\x91F\x8dw\xaa\xe8\x0f\xd8\xa9\xb7\xc4\x88\x82-u\xe9\xbd6#\xfc\x1e\xd6Y\xca<\xcf\x88\x03o[5\xf4PM\x10\xa26\x86=\x0f\xef\xda\xcc\xe5\xbf87\xa0\x18\xb3\xe5e\xa6\x81\xf5$\x99\x9b\x8f\x0c\x9f/2\xf2g\xe3sZ\xf4\x1aA\x8d\xf8FL\x1e\xa7\xd6\xd5\r\x15K\xbc\xc5\xc3/\xf0\xe2\'Na\x8d\xa4\xb1\xec\xa4nc@\xfe#\xbd\xdah\x0c\xb7\xa3\x0f\x1e\x9aH\x97\xb1\xca\xe3\xe7\xee#\xc9c7R\xf1\x82\x9cS\x1d\x9b\xf6\\*\xad\x80\xa1A\x13j\x89>"\x8aq\xb3\xe1\x9cE\x0c1\x1d\xff\xecV\xd1~\x97\xc6\xde\xe8QZ\xcb+2:\xb9\x0f/}\x86\x84\x87\x963\xfcA\x97\xdahz\xd0v\xaa\x84\x80\xb7e\xd9\x83\xfe?5\xf8\xc3\x04\xa6sM9\'\xc6\x89\xb4\xcd\xd1\xe5GpR\xbb\xb9\xdb\x9d\x9d\xa7\xf1h\xe8Vt-3sW\xcej\xf2\xdaq\xcc`+%\x92\x15\xea\x91\x99wPl\xec\xa9\x10h\xed1p\xcd5E6\x1b\xed Q\x92+\x9dt\xf7\xd2\x8a\xf1\xbd@\xc8\x1cF\x9e\xf92V\xf2~\x19\xc9\xda\t\x05\x9b>\n\xc3*`\x84\xd3\xeeM\x84(\x1f\xa0\xb3\'\x00<,\x93\xa9\xf4\xa57\xcc~\x19\x0e\xee\xbbtw\'*\xcd\x85\x08#\x99u\x9f\xc9.\xeb\xc6\x82S\xe6\x0e\x8d\xb6T\xb6w\xe9\x00\x13\xe1)>\xc8\xf8\x1b]\x92\xf2\\\x7f&\xe4r\xb5\xef\x8f\xd7x\x95h\x13\xe8\xbf!\\\xf0)\x94\x81\xcc\xe4\xc3\x99j6\n\x05Q\xfbt\xfa\xa1d\x19}Q6\x8d\xcfv%q\xa8`\x16\xd7\xb3\xa3f\xf3p0;!1\x14_}\xc2H\xef\xf1G_\xea\x01.\xc7@\x9c%\xfd\xe1;\xc6\xd7\xf1\\e\xfd\x1b\xc8y\\T\x8a\xeb\x97\t\x01\x93\x0c\xb6re\x15\x19EXa\x9a`$|\xce\x1f\x07<\x99\x9f\x90P\x8e\x92GZ\x03\x8c\x7f\x11\x0e\x10?\xcc\xabea\xf5\x1d\xad\xac\xc1ov0\x00\xb3\x88W\xd5\xf2\xde\x06\xf2\x9e\x87\xa5TT\x15I\xa6n(W\xd3=G\x18\x86\x05Z\x16\xc8\x1b\x978$\xe9l\x8b\xc3t"\xa0\xba\xc2\x0088\xd8\xb1\xa2\xb2\x170D\x97\xe7\x01\n\xb44h\xd6\x80\\\xb1\x10N\xd5v\xda\x08c\xcc\xa2\x97\x00\xae\x9e(W\xbd\xe7\xf8\xe1Y\x1a\xdd\'_\x92\xbc\x12\x83\xbdi \xae\xa2\xa4\xe7\x84"4b\xad3\xdePz>\x1f\xc3\xc3P2w\xa8\xf68\xccq+\x8e`k\xec\x11\xdb\xf8t?\xfa\x89u\xa3\xcf\x85i\xa3\x82e5#\x93\x81Z\xc3\xe5\x06_\t\xa9l\x026\xac\xe5\xec\x8cxf\xd7\x97K\x1bB~\xce\xe4\xb9\xf7u\xe7\xe6%j\x97\x99\x98\xf1\xca"\x17\x91\x15\r-b\xca\xda\xa4*s\x8a\x92\xc2G\xb6[\x83s\n\x00$:@\xe9\xff\x00\xcb.\xd0\xf0%zi\xa0\xc0\x8a\xe5\xc3\x97<\xfa\x8c\x10\x7f\xce\xa37d\x92\xf8\xae~\xdf\x8c\xf3`o%f\x86\xaaa5\xd1\x87\x87dF\x89 \xb5\x02\xc3\x8e\'<\x9f\xfb\x94J\xa3\xfa\x16<\t\xc0R\xbc%\xe6\xfe$W\xfc>\xc6\xcd6\xf5_7Q\xa2\xaeL\xc9\x19\x1e\x89\x87\x86\xa6\xbcKd\xf5\x1f\x11\tm)\x84\x9am\xc2)\xe7\x1b\x02\xa8\xa1\xd8\\\x01\xce\x9d"}\x16\xf7_t`\xfaVX\xfc\x8e\x8e\x9a\xed\xb1(\xe8x\xf70\xa8\xa3\xb0*"fO\xe74\x83\x1b\xf3\x10j\x15\x859\xf9\xf4\xfc\xee\x04gT\x11\x11\xd4\xd1j-E\xce\x16fdWz"\xe0\xcd\xe9p\xe93\xf5\x1c!\xecG\xbfGc\xa84\x9cH\xb0\xe4A\xaeiKe\xc1\xb4\x1a\xe6\x1bD\x8a\xe9[Y(&\x13\xac75\x16\xec=\x8a P\x84\x00\x1bTR;\xd2#w\xa5\x84\x80&\x95H\xc5\x83Z\xe9\x15\xfd6\xdf\xd09c\xc3\x9c\xb0_\x1e\xaa\xb8q\x90\xc4!imQ\x02\xbb\xa4gG_\xc7z\xf6\x92M,;\xbb.\rs"\xa9e\xac\x84rC\xe5\xcd@\x8f\xba\xdaZ@Z\xf3\xa7\xfc\t8:=\xfb\x916\rBLt:\xaa~\xe5\xd6\xeeAL\x0cEa\xf03\xa0@\x98k\xd7\'\xbd\x9d\x1ba.\x80vc\xe4\'#\xc7\ty^\x89\xfd\xf7\x8eO\x85\xcf\xef\xb3\xc3\xb75\x82y`\xee\xf9\x0c_C\x01a\xbcU\x84[\x9b\xe9\xae\xe2\xd0g\xaa\xdfC\xd2J\xf7zQ\xc7\x18Y6\xd4\xf8\x85 \xab-\x98\x83G\x92\x142\x87\xe3J\x9b\x14\xdd`\xf8\xb5\xce \x9bz\x88\xa1} \x80s\x1bT(\x9c\x87\xc6\xb5\x08\x0c\xe9Fh\xc0\xd9Tx\xedK\x04\x19*LKgI}\xbb\xef\xd1R\xd7\xb2n\x0f\x07\xfc\x008\xa9g?\xdds\xcf\x10\xc8\xd9\x05Z\xf1\x8b\x0b\x14\xaf\x01\n\x06\x86\xbd\xdb\xd4\xcd(\xb1\x93\xe6$\x19_\x04(\n\x9d\xbe\xef8\x1e<\x18\xb3\xd1x&\xe4\x8b\xc4\x18\x1d><\xe2\x1e\xfe\x0b\xcb\xa8\x0c\xd2X\x12(\xae\xc0s-\xee\xe5\xe4.\x02\xd4\x19\xfb\xac\x98\xf4\xa5\xeb\xa0\xb7\xb9\x1f\xee\x19\xd8$\x81\r+q5\x1c\xc3\xc4\x9f\xea\xb2\x8b5\x99\xd3<\x1e~\xc2\x89\x08^\x99\xa1\xd6q<\x8e\xca\xcc\x0e\x85\x7f\xca\xe4\xb72?GH\x14\xed{I\x90\x92\xc5\xee\xa4\x83r\x8e\xa3\x1a\x00\xbc\x9d\xf0\x04\x14dz\x16\x0f\x11\xf5>\xd1W\xd2\x03\t\x12\x16\xc7\x04&\xa57\x86\r\xdb\xaf\x06\x10\x9cn\x91\xeb\xf2\xc2\x85J\xee,\xa4\x8b4\xdb\xf6Bgq\xaea\xdbh\xf0\xc1mI\xc4\x91\xe7\xb5R\x8e\x04\xea2\xcc\xa7?m\xdf2\xbc\x01%)\xb4\xf1!,\x83J\xb8\xef\x18%q\xc9\x8d\xb7\xb8;?\xee\xf0B\xbc\xb9\x91\x96k%\xf5KI\xb4\xfd\xc7\xa5\xd6k\x93\x00cN\xd6<#R@\xa5\xe81\xed\xaa\x9d\xe4u<c\xcd\xfa\xc4o=\xe8S\x81o\xe1+\xf5\xddL*C6G\x0b\x1d\x06%j#%*D\xa5Z5k\xae\xd8S\x95\x89\xe5\xa2V\x8bO\xab\x8f\xa2:\xca\xdcF6\x8b\x039\xd4\xbc\x99j\xc2\xfb\x0b\x93\xc0\x88\xb0<\xb9\xee\x88=\xe0/\xac\x05#\xeed\xefu\x8a\x94\x06\xd2\xed\x0b}\xbb\x03\xd2`K\xb9\x9b\x92\xf2\x01\x05H \n\xe1\x1d|\x95)\xb3\xef\xaf@K\xf6f\xa2\x86)\xd2\xc4g\xf3>\xfd\xe3\xa8\n\x06,W\x83\xabo*\xf3.\xd4@\x11&\xdfJ\x89l\x90t\xbdD\x996\x9e\xf5\x84U\xddD\xdfvs\xf8t\xa7\x0c\xcfw\xf20\x86T\xe9)\x94\xe1\xe0\x84)>H\x9d\x9a\xff\xa5\x82\xe3}\x89\x13\x16??\xc0;2\xf7\xbf\xba\xe2\xbb,Lkd\xa3j\xda\xc5f\n\xdbu\xfc\xf3\x9dXk\x86A@(\xabG\x1b\xa2h\xd4\xc3\xb0\x84\xcbD\xe4\xbdNeWK\x12%\x1e\xd6q\xecW`\x9f\xd8\xee@\x84\xd6\x8f\x91s\x9c\x17\xb3\xa3\xdc\xc1\xa8^\xb5\xba\xda\x9d\xda8tN\xee\xd0fe\x81\xfb\x8f\xb3\x99\x9a\x95\x92c\x9f:hl\xbf\xb1\x1e+\x96jt\xa5c\x8dx\xcdgs\xa9!\x14\x93[C\x93tV\xf5\xca\xa9')
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