hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__cp38-cp38-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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:13.625253
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x93\x1c\x00\x00\x12\t\x04\x00O\xeb,\xdd?\xd0\x81\xaf\x8c\xbe`\xd2\xbeyI\xfb\x00\x00\x00\x00\x00\x00\x00\x00)\xb1\'\xa5\xc5GW\tVIH\x1c\xb3VV!\xf3\xed>\xbe\xc8\x12\x8f\x9d\x1f\x9a"\x9e\xeb\xd7\xd9\xee]\x00\xb8\xb0\xe0.\xd5R\xc8\xcb\xe0w!\x90\xd8\xf8\x85\xa1\x8f\x1au\xd9\x03\xd3\x8b\xcd\xcf\xc5\x10\x91~\xd6\n\xe9\xeb\xe0I\x1c\x04"\xc8\xe7\xa8u>\x04KW\xfd\xd6:\xff\x8c\x92\x9c\xea\xba \x94F\x1b\x96\xf9a\x8e\x99T\xdb\xdbk\x05\x17\xea\x83\xab\x8cA\x1d\x96\xf1\xc7O.t\x18\xe5ou\xc3_\xa0$\xb2r/\xbd+\xd3\xfd\n\xf4@uO\xbc(\x9c0\x7f\xfc$\xacL\xe8\xbd\xaf\x0b\xef\xd72\x80\x1d\xcd\xe9\xdd\xac:\xc6(\xb36@\xa5\x01~q\xd13\x0bN\x17\x10p\x88\xc9\xf7\x05y\x10\xecI\x9eU\xae\xea\x97\xe4u\xf3\xb7[\xe5^T\xa8\x9dc\x8e\x90\xb5\xb5\xc0\xbd\xc7O9g\x80(\x1f\xde\x074l\xddY\x96\xbbx\xc0Q8\x8e\\\xb9A3\x97!s\xec\x808\\ESi\xc4\x1c\xff\xa8\xe3!H\x10/\xb2(\x83\xeb,R4\xbfF\xaa@%_W\x025\xbe\xec\xec[W\xc6\x9c\xf9>`\x93z<v\xb8\xe0\xb0\n\x12\x13:\x9fER\xdbH\x9b\xa6~\x80\x92\xc1\x1eC\x01\x9a\x1a\xfa\x18\xa1\x93\xa51\xea\xbb\x9d\x9d\xa1\xfa\xb4\xd8k\xa8&\xd2DR\x9d\x04\xe0\x94s~\xb9\xb9\x19\xf9o+\x06\x81\xc6\xa8Hsk\xb1\x00/\xfc\xf0\xb9\x12b\x9d\xf0\x1c\xbf\xd4\xdb\x0c\xaf\xc3\xd3\xe3Q\xdag\xef>\x8099\x1c\xf1\xd0\xbd\xf9\x8a\xb3\xd1\xb9\xfb\t\x1a\xff\x9ei\xdec\x8b\x8a9\xd1\x04\xf0\r\x0f:\xbd^\x91\xb2\xbf\x08\x7f\xce\xb0\x9dZ\x8e\\Xy\x0c(oS\xd7: \xf9\x9b\xfd%"j\xf3\xc6\xf6)\xcaK\xeem\x1b\xe7\x9fo\x19[\xfb\xa5m\xeb\x92\x1a\xff\'\x84\xcd?q\xb4\xc3(B]\'\x94U\xfb#\x08\xd2/\x1e\x19y\x1clrd\xc6\x0ej\xd7c89|q%\xad\x15s\xf2"\x13\xbbWr\xeb\x98\x81\xa8\xf3o\xbe\xdamY\xb8\x08\xeb\x02\xa7\x8a\xf7\xad\x03\x063sy\xcdui\xb73\xf5o]\xf3\x1c\xfd-\x949\xb3\xca\x82\x99]\xde\x8e\x89\xdc\x9c\x8e\x81t\x8a\xc4\xf9u\xb9G\xf6D\x8d\x85\x0c\xca;%v\xba3l\xc0\xa2\xe6\x05^J\x8a\x9aM7\x8fS\x16\xc3\xc4\xd6K\x1c1B\x85\x9e\x93\xa9-\x85s;\x14[\x02kZ%\x17\x99P{\xec\xfe\x11\xd0A\x17\xfdQ\xcc\x17E~\x95a\x11\xeb\x98g\xdb\x94|\x98-\xa9\x1c<)\xf3\xc3\x9b\x7f0\x99\xe3[\x13\xe3uW\xa9S\x04\x7f\xed\x9eb\x14}\xd3\xc4\xbc$\xc5\xc0\x93f\xcd\xda\tk?\x1a\xbe\xb5Se\x9c\x92.b\xfd\xe5\x12\x19\xbf\x02\x8a^\xd0\xf9\x17\xc16z\xbbr\xcd\xc3\xeb\xcbJ\t\x0b\xa2\x94\xf3;a&L\x0c\nGX\xdf(:|\x1c\xd6R#Z(\x1a\xd1\xff\xb2\x08Q\xfaOL \xeb\xfbn[\x8dQ;V\xfbIh\x94;E\xcb\xb6\xcb\xad\xc2\x80y\x99;\xd1t\xd2\x84\x8elm1h\xc3\x05d\xbd\xfc\x13_\x84\x1e\x1a\xda-\xfa\xf3\xb3a\x1f\xb1?\x19\xfe^\xd3\x07\xe4/\x80&\xcc\xaeN\x19\xbc<\x0e\x81\x15J\x9d\xe0\xa9\x97\x94%3\xf9X\xbe\xda<\xdc\x94z\xba\x18)\xbd\x83\xf2;?\xf2u\x12\xdc\xf3\x1e+\xf7z\xb3\x12\xd9,cK+\x12U2\x93\x82`\xae4\xaa\xb3"\xc6\x9b\x0c\xd9\x03\xfa\xfb\x8d\x02|h\xf4\xb7\x057\xe3\xce\x89\xf5\xd6\xb7\x84*0*Vs\xa7\xfd\xaf\x06\xef<(\x82#{\x1b\x1c9\xfb\x18x\xbbsXg\xa3<\xce\\\xf2\xac\xfer@\xb5\x9cq\xbd\x8c\xd9\xbf\x07x5Ymx"\xfd\xd7T\xc19y\xe3\x9cw\x80\xa0\xa9[\x8a\x9b\xbd\x00\xbd\xb9e\nT\xa6\x90\x7f\x10\xdb\xc4\x9f\xf0\xaf\'\xf8.\x8d\x15\x97F\x84c\x81!\xddV\x9aF\x10\xf0\xe0nH\xbd\x9fJ\x1b\xfa]\xc0\xf1\xbeCj\xd4\xf1\xf6EC\x90Jqy#\x84\xe0l\x0f\xdd\xae<3v\x97%\xd0\xee\x11\xb4\x08\t\xf1\xf6\x11\x95\xc3\xf4\xec\xd5\x87JB\xee\x96\xe3V\x11\x8f^\xdf\x02&\xed\xb9(\xfd\xa6\x9e\x9ey3\xa1\xb7\xc3\x86R&\xdcx#\x8d\x8b\xae\xd6eB\xaa\xa4\xeb5a\x9e\x9f0\xee\xd9\x8cY!\xfd\xeep\xcf\xcf\xce\x0c\x03G\xff\xec&UC\xf2\x18?\xc8\xf4\x95\x05\xf2\xd8\xa5\x98\x08\xca\x17\xe9\x91Xo\x19\xa4\xda\xb4\xea\xabV\xab\x7f\xd8/g@\xbalj\xde\x81\xc0\x08K)\x98\x7f\xcd\xfc\xdd:\xa1\xe3]\xc9\xf9DV\x91I>\x9f\xa3\x82\xbf\xd0c\x0bk\xb6\x1d\xb4\x0ex2\x00\xce\x19U$\x83\'\xb9\xd4\x97\xf4Y\x00\xdb\xd2\xe0OnSj1\xd4P\xd4T\x95\xf4\x01\xf8\xfc\xc7o\xdc\xcex{)J\t\x99\xfdL\xa7\xfe\xc86\x7f\xe8Dq\xe0(N\xc3\xa0\xbe\x8c\xce~[|j{\x91\x14\xa9\xfbg\x81u\xbdz\x85~\xa6\x98\x1e\xa6\x05#\x16I&hJf\x8c\x89\x060&\xbd\xcb\xc09\xdc\xa8bP\xe9F\x80"\xf2\xc9)\n\xc2\xf8.\xe561\xe1+\r\xf6/\xe7\xca\xad\xc9M6`\x19|-6\xed!v\xe3\xe6\x87\t\xf9d}\x14[!|\xf0\x8c\xdb\x8fz-\x99A\xe1\xdb\xf3@\rG\xa99HO\xd8\xc1\x01\x9f\x8c\xb3\x0c\xd8\xfdZ\xa2Q\x10\xed\xc1\xdc_\x83\xd7\xee{\x12u\x83\x11\xfe\xc8\xa9g\x7f\x82#\x80\xa5O\xf7\xb0]8\xea\xfb\x05\xb4x\xe9\xc3\x0e\xdd\xa6U\xa9\xfd\xdbg}\x88X\x93h\x8f\x95=\xa7\xe6\xe2\xf3\n*\x96\xe0\xc8\x1cw\x80\xccJ\xadg\xe0\x05LO\xfe\xcb_/\x86\xb5/\xef\xb9\x99\xa4Ex\xf0\xe5\x99\x8f\x19\x9f[\xffR\x18\xd7\xe5\x00\njH8l\xda;\x14\x88C\x9d\xe9\xb00\n\xbe\xa9x|\xe5C\x9f\x1a\xa2\xc9\'nJ\xdd\xf5\xe8Q\xc2ZxCc-\x85b\n\xdfe\xe5\xb4\xd9Y0\xd6\xb7T0\x82\x12\xddq\x9f\x95z\xddil\xdf\xed\x80z\xf8GG\xc4_-b\xd1\xe9\x0c\xf1\x93uwU\x87\xac\\\xe8\re\xc82\xf4\x01\xd8A\x8e\xd9z\xa7S\xc1G\xe3f\xa5\xe7\xfb?+\x9e\xb9\xcc\xb8\x97\x8f\x95O\x9d\x07\xf1\xb8\xe1\xb9r6\x177&\xf4$E\x0f\x83\x87\xd4\xadiu\x1a5\x8a\xedJP\xff\xa6%\xda\x9d\x99\xc6\x9f\xeb\xc8\xf4\x19\xcen0\xdf\x13\xc3\xdc\xdf\xc2\xbc\xcd\xd4m\xd3\xd0[v\x84t\x8e\xc9ujX\xcc~K6\x83\xc1\x97\xd0\xed\x0b\xbd\xb3\xc4<W\r\x8cPA\xcb\xb2\xbf\xae\x16\xd1\x10\xf6\xf5z\xac\x03\xa2N\xad\x82\xec\x079L\x0e1?2\x16\x1e\x87\xb3\xf7\xbc\xff\xa3\xcd\x1c\xc1\xeb\xbf\x89y\xcd\xca\xf8>\x89\x837S\x94\x87\x19\xa1hU[\xd5,\x1f\xa4c\x94\xd4]&\x88r\xd7L\xd1\xef\x97%\xb2\x90\x0c\xec\xd5\x83-\x83$\xff\xfbNq;\\\xee\xf2\xec\xb7\xfe\x1cj$\x19\xd3\xe4\xa7\x1a.\xa7\x1a\xd5/\xd4\xb6V\x06\x02\xf7`\x81!\x0e\xb9\xcf\xb1\x13\x12\x05\x8f\x8d\'P\x050\x7f\xfeay\x06\xcd\\\xd6`\x84]x\xb8\x83N\xa3;\xa0\xd4\xbf\xb6h}\x88,\x11\x82\x84\x96\xd2MIl\xba^#\xa4\x04\x9f\x1b\xdc\x1d@ z\xd3,\xe8\xbazj\x05p\xa3\x16\x1bc\xf1\xdc\x90#\xf2m\xf7\xd3\x05\xb0j\x10\xb5\xc0\x1a)%H\xb7\x87\x86\xe4^x\x05\x01\xd3\x7fU\x8c7be"\x95J\xf8"\xc7~\x0b\xa7\x1b\xa5\xc6\x05\x91.\xe6\x85D\x99\x10kCDj\xdf\x15\x1f\x95a\xe9\xd8\xbdy\x99\xb9\x05\xd4J\xe0z\xb5CR\xcckQ\xcf7\xb4\xb7&\xa6\x05\x1d\x17\x1bL\x92n\xa1\x83wl\xe5\x7fV>k\xd5\x0e\xd6\xc7gl\xc0+\xf5\xb8\x10\xb8q\xb8\xf5\xbfj\r\xd9\x9d<\xa0\x01\xd2\xfa5Z(\xa1\x06-a\x87\xf8H\x91\xd9\xe4\\3\x1a\x1b&\xc4D\x8b;\x1d\xe4`qU)\x07\xfb\x13;=\x84\x86\x96\x0e\xe5\x14\x17\x1e\xfd\xe4\xf1\xb47\x18\xc2+Y\xa8\x95\xd3\x89f\xf6d\xc4Y*8\x9c\xe4\xb3\xa8\xe0j\x12\x8f\xa2]-\xfe,Pi!\x1fO\x96\x8d\xae\x0e\xd3z\xc0GyH#\xc4\x980\'\xae\xb9\r\xc6D\x0c\xfab\xc7\t\xad\x947^v\xc0\x92\n4\r\xec,\xfb\'|\xe6\xe8\x7f\x94+\x9e\xd4,D\xf4C\x93\xc2\xc99\xac\xcf\x19\xd0\xb4$(n\x02\x13\x87+\r\xf6\xd0ZF\xdci\xc9\xa4\x94\x10\xd1\xcc\xe6\xd4\xf2f\xf3\xc0\xb6\x81\xb9Y\x9cz7~\xd3W\xf5\x1e\xda\xcdy\x1e\x8c\x9c\xbb\xd8I\xfeI\x0b\x06U\xb8\xfftH\x00?\xcf\xe1|\xba\\q\xc2o.\xed\xeen0\x0eD\xae\x9d\xf6"\xd7\xc6\xe8:\x89\t~\xd6\xc6\x9ac\xfc\xcd\x1a\x8b\xa6o\xaf\x1f\xd6\x80\xb4{J-\xf0\t\xc7\xc7J\xdb.3\x11\xf8[\xd2T\xa4T\xb6{w\x9f\xc2%+\x17\x18=\x94\xcb\xc5\xb7Z\'\x99yn\xc6cu\xa3\x03\x0e\xa4L\xe3\xd2.\'%\x1e\xb1\x94\xaa\xcf0D\xe3&\x9c(9K|\xfd\xc6\x83\x1c\x86\xad`\xd4\x1b\x10w\xc6\x02vw\x98\xa6\x05\x81k\x10dk\x1f\x90\xfd\xcf%z\xae\x1f\xb5\x7f\x08\xfc\xe2\xb8\xf5\x14C\x13\xe3\xef\xd4\xe9\x86\x1d4\xb3\x8f\xdb\xbc\xaa\x81\x7f\xae\xc0\xab\xa2\xd6*Eg=\xfd/\xd4[\xf2-\xf2.#+\r\x13\x8d.\xf1\xfb|\xc1\xfe\xee\x15\x19\xb1PtW\x01\xef*\xff\xfa\x98A1\xe3\x8e\x92\xc5\t|y\x06\xf6\x12\xb7g\xbd\xff\xe4?;=\xf8\xbc\x8e\xae,S\xc6\x1b\x8b\xf8\x1c\xbb\xa2\xc2}QoZ\xff\xdc\xd7\xfb{\x1d\xb1\x88\xa6K[\xa8\xca\xf2\xc2R\xd7\xc4\x8dl\x1f\xado7\x9c\x13\xd1\xcf\xd8\xb3\x8cK\x11\x05va\x14\xe0Y\xd3W\xc2\x05\xbd\x02\xbf1\x8df\x91\x90P\xb3\x9b\xd9t\xd1\xa1\xa9\xbd\x8e\x97\xec\'\x9b\xc3\xdf\x95\xea\xb9\xe4\xf4\xe6\x16\xc3\xbc\xf0\x0c\x97G\xbc\x15\xdb\xa2)4]\x9c/\x92\xba\x1e\xc6 \xb0\xed\xd3<\xf8\xb5\xdeL\xcd1se\xfe\xbb/\x8a\r\xd8\xbc\xbaY\xa1\xb6\x97\xff\xd8^"\xac;[\xfa\xe8\xd081,n/\xcayh\\T\x84\x9f$\xd5D\xd7]\xb8[Nw1\xa1+.R\x19\xd4\x8c<\xb2\xb3\x00\xad6\x08\xbd\xf2;\xdcFI\x02\x0e7\xa7\xbb\x1bR\xb0\xbfU2\xb0(:6\x89\xb8#:*\x93^\xdd\xf6\xa9E\'~\xd8\x9d\xd6\xfc\x0b\x87\xb3r6)d\x19\xe5\x06\xd3\x0e\xcaQ\xdcX-=\x80\xadGM\x0co\xff\xaf\x9e\x01\xa8*\xc3\x9c&z9\xbf\xab\xe4\x08D\xbb@4\xf0&_\xde\xf2A#L%\x00\x93\x00X\x855\x1d)Z\xd4\xab\xcdR`eB\xc1\x92,:\x061]g\x1d\xdb\x0e*\xef\xf1!\n\x85\xf2\x1a\xf7,\xb6h\xe12PRX\x1e\x1a#\x07\xc9Y\xd9w\x11\x7f0\xf8Y\xb9\x85\r\xa0\xae.\x18\x0fom\x93\xd3!\xaf\xf8\xa3\xf4\xba\xff\xba3\xa1\x95\x8d\xe5l\xefI0/\x83%\xe5s\xa4\x97\x06~\xa3mC\xcd\xe7\x9be\xd9\xb6H\x8evX\xe8snv;Aq\x89\r\x10d\xa5>\xa6\xa2\x011\x88\xb4\xbb\x02_\xf0\xa87A<&\xd46\n\x98\xa1xZ\xc9\x83%\xbbN\x94t\xfd\x8fC\x87\xef\x1b\x0f6\xd4O\xa2\xa5\x1aU\x98(\xd8\x1b\xd2\xc8\xcf\xec}\xbbE}\x08t_Q"\x7f)\xd1\xa6\x925\xe5d\xa3\x94d\xd3K\xd8\xcb1&\xe0\x81\x81W\x87V\x07\x13\xbc\x89\x95\xd62\x01s\x16\x1d\x02"pFT\xc8\t\tw9\xbb>\xc7\x89\x02\xaa\xac\x94\xbb\xcd\xd3k\xed\x82\xeaV\x00\x7f\x86\xb9\xb0\xd8\xfe\x8a\xa5\x10\xcb\xd9cEDg\xa5\x1e\x82\xc5]\'\x00Ym\xe6#](xG\xd3tnKX\x1f\xc1+\x11dX\xf4\xb2\x03N\xf7\x15\xc5\x1d\xe6y<\xd73\x15\x87&\x08`\x1c\xd6U\x08\xadu\xd9\xe1\x88\xcaA\xd2_f\xa1R\xdbE\x12=V\xe3\xce\xe8\x1f\xe5\xd3\xf4\x93\xdc\x11\x08\x11\x13\x81[5Z\xac`\x90\xc3]D-3\xc0\xb4\xe2\x13\xbe\xa9.<\x91\xbds\xd7\x1c\xa0E\x02b\xbd\x1c9\xb7\xa1\x18\xb5!\x12K\x96\x99@@\xf9\x91\xe2\xd12~\x85\x98O\x1f\x94o\xdf\xe1\xf8\x1d4\xfe\xad\xbe\xb3\x00\xbdd\xe4\xa3\x10_\xa6\xde\xe3i\x05\xaf:\xc8\x02y\xf3\xeeO*|3\xac\x07\xa5\xc6\xf9\x9a\xf7\xb7N\xf6Sz\x93\x85\x1eI\xa4 t\xd3\x16\xefOsL\x11~\x9d:\x14\x80\x043\xb7\xb86w\x1f\x8b\xb0\t\x96\x83\xa0\xfc_\xed\xf4\xd1\xeb!\xda\x96_*\xa8\x8f\xbd\x08\x81\x9da\x8f\x80\x7fCl[\xc3\xf2\x10}.e7\x98\xecw\xdcR[?\x8f\x01\xe7+jO\x0eAK\x14\xb5\xe7\x9f\xe1\x8c\xeePZ\x90V\xbd\xc1\xd6\x16\xca\xda\x9cE&\x0f=N\x07M\xd1\xe6\\\x08\x1d{2\xff\xff.w(\x87_;[\xcc\x9d\xa6G\xa4t%\xa7\x00\x8a\xa8\x15\xbd\xfc\x168<r\xeb\xd5\x95s)i\xc90\x87M=@\xfd~\x97\xbb\x14\xc9Y\xb0\x10\xca\xb0\xb8\xe0\xbc\xf5\xb4!Z\x1f\x9a\xad.\xb3B\xa3\xdc\x1b]r\x96k*\xb0\x90`\xe01\xdc\xe3\xa5\x1b_p/|\xbfE\x9d\x81\xde\xe9K\x06-\xf2O\x17\x13\xc3\x0eZ%\x17\xbbV\xb9\r\xda}\xb2\xb59]00\xa7n\xc3.\xc7\x0b\xcf\xd0[f\x85]\xe3\x1f\xf6E}\x95\xf7\x8a\xeb\x98\xff\xd3\x1cq\xdd\xde\xe8\x141\xc9B\xad\x06\xa9C&\xf6\xc0\xf2\x9a@\x8d\xed\xc2\x97\xea\xc3\xde\xc5\x84\xeas\xa2\x95V\x11\xfbuU\x06\x80.W\x19\xa84\x10\xdd\x88\xa7\xf0\xc4S\xd55\x00KLI4\x1ap>}"\x9f\xf0"l\xc3\x82\xf6\xbd\xb7\xe4?\xa5\x82\xdb\rM!\xc2\xda8\x0c\xf6\x9a_\x8d\xf7\x10\xd7\x8d)\x9e\n\x97A\x0eL\xe2Z\xb6\x00\x08\x1aM\x1e\xd9i\x98\xaf{?\xacf\x08lkse\xa9aO\xb6\xfd1\xb7\x0f\x9cp\xcf=\x04\xa9\xe6\xc6;\x1a\xf6M\xda\xad\xe6\xb9\x81\xf5$\x8cBY\xd2O"\xc6(\xfbZ\xbaH\xa5\x15<2\xcc\xa1\x88\x89\xec\xd0\xb3)/\xf9^\xdd\x1c&\xb3f\x000p\xdf\xff\x8e\x8besa\xc4#\x89\xcbT^\xfc\xdf\xf6\xdd\x95l\x05%F)\x05\x1d\xafS;\xb0Ro\xdc\xc7\xddi?\xf1\x1c\nP\r<(\x1aEMQ\x00x,\x07\xf5\xb5A\xd1\x90\xc7\xa4%\x80*n Ln\xc1Hc\xcb<5\xf2\xc7r\xcbmp\xf5\x1d\x1el\xf4>\x8c\t\x13u\xa9\xf9\x96X\xe1\xd0t\x81G\xc6\xc8\x12\xab;\xdb5G\x06(\xce7\xac\xf2\xe8\xbf\x80\xb7!:z;\x12%\xd7\xd7W\xca:\x8aO\xf2\xd7\xbf6\x16 6_\xb1\xfb`\x93\x9d\xeaa\x95\xfaM\x14\x04Jbk\xdbQh\xe6\xf7\xce`=\xf1\xe1fAb*\xd2\x0bcvVB\xbe8\xa2\xf9=\x11y8\xb5WV\x83+1\x8a\xf1\x14\xb5\x91l\x1d\xd2\x17\x19\x8fxz\xda\xe4\x82\x90\xf4\x052g\x84d\x1f\x0b\xab\x1a\xda#\x93\x83R\x13d\xfb\xb1\x00\xa1\x80^p]\x91:&\xaa$DBF\xd5=c\x08y\x9c\xc5\x8a\x07\x1e\xa7m/\x01\x1f\'\xba4\x83\'\xc9R\x8c\x1dj\x02r\x85\x93\x9b\x10Um\xe9?\x07W2\xa7\xa0\xf4,\x8f\xc8\x8e\x9f`\xdb\x84\xaf\xe7\xfb\x03t\xac2\xd2T\xe6\x85\x9e\x0f\x94\x85l\xeer\x86\x8av,\x8a\xfaL\xf4\xcdh\xbeA\x8f\xc6\x91<\xc1\xfd\xc13K{g\xda\x84\xea\xbfP\t\x84\nL\x99X\x01\xb3\xd9\x07Wt\x06\xab\x02m\xac\xa1\xfcG\x95i\xb8\x9d#\xd4\xf30\x0e+7\xda\xe3\xb1\xdd\xe4\xc0,a\x15\xcf\x11*\xb3W\x03\xf6)\xa5\xbclum6\xd6L\x91>S+X\x84\x849/\xd8\xcc\x87\xf8\xa0\\L1d\xbdN\x12\x8f\x01\xd4\x8f\xe3< \xa4J\xfd[\xbaih\xf2\xe4\xbb\xd2\x95\x07f\xbe\xf1\xb5\xb7gnb`\\\x1a\xf4\n\xd9u\x8d\xe2\xca\x10\x9bs\xcf\x8f\xf6>\x95\x96\x87W\xaa4\xde,\xab\x17\xbe\xdc\x1c\x8e\x91=\xe4x]\xa7+\xcf9\xc7\x82(%\xban\x15)u\xf7\x1eS\x08y\x81\xde\xdb\xccw\xd2l\xeff\xb3\x195>x\xe6\x8d\xf2\x87M]\x85\x90\xfb\xc7A\xc6\xa0\x91\xd5ca\xd4\x0b\xf3\xe4\x0f\xafR\xa17R\xdb#(JG\'\xec\xef\x13.,\xc7\xbd\xc4\xe9/|\x8dw\xc7\xb5\x01\xef2\x7f\xc4\xcd\xbd\xc7\xe2`Q\x90x.\xc1\xaevp\xb5\xb8\x05l`\x01^\xfc\xec\x865x\x03\xcd\x1b\xbaK2\xe8\x7f\xac\xa5y\xac\xf0\x9f\x01\xb0\'\xa9\x9cK\xa66(\xc3\x87@\x8b\x93Q\x87\x17C/\xc7\x83\xcf2\xe0p\x07\xce\xd7K\xa1\xac\x13V\x12\x1a}Z\xed\x80O\xd9\xbf\xa0\x8b\xc2\xff\xd3\xce\xb5\x01\xf3\xb6\xc1\x17W\x94x\xe6O\x00\x9a\x93\x99\x1f\xe9\xc3W$\xd2Nc\xa3l\xfdbjB;\xf2\xc9\xba\x19jg\xae|\x9bs\xd7+M\x0f&\x83\xebS\xf7\xc5\xda\x14_\xea\xe0\xc3\xa2\x87\x0bhi[\xacj)\x04E\x05\xf4\xef\xe9woy#k\xbd\xacD[G\r\x97\x7f \x8f-\xcc\xa8eXP\x0c\x9a[4\xe6\xd1\xdc\xc5l\xf4_\xf2/@\x0b\xfe`,\xcf\xd1\xee^q\xe4\xa9\n\x84u\xe3|FA\xc5\xcfZ\xe4F\xd5\xa2\xe0$t\x96\xdb"\xc1\x99-\x9c\xe0\xce/\x87\xef|{L\x01Q\xb3_\xc7\x1d\xcb\xc1\x07\'F\x8f9\x86\xfd\x04\xf5\x8dUDq\'R\x03\x19\x8b\x17\xdf\x844\xa9\xbdo\x9cXS\xa4\xb9\xa7\x0c)\x16\x92x\x86\xed\xd4\xact\x9d\xad\xd6t\xd8\x9e\xd7\xea\xdc\xaf\x0ed\xcf\xad\x9f9Q\xa9"\x1af\xc8}jm#"\x8a\x83T<tE*\xb0\xc4|\x12\xd6\xbb\xf1-NJ?\xfd\xc4\x94\xda\x9dH\x172\x19\x9aiZ\x8c\xb0\x12\x11\xa6\x0e\xe7\x1e`gM\xa5\xe5\x88V\xc2I\x08\xfa\x91\x04Dk\xb1\x10\xc3#\x8c{\xdb}\xed\x14\xda\xf7o\xfbgww\xdd\x963n\x90\x02b\x08$\xa7]>\xce\x9ax\x13|\xae^\xde\x8c\x96\x1a\x86J\xadF\xfe\xde\x84\x0f\x04\xb7\x96,\xe9M\x95^\xa6I\xe4P!"\x97\xc6*\xc3%jv\xf6\xcbwv`\xb2D\xe5$\xc9\xf7\xca\xa9\xb5\xbb\x8c\x93u\xb6\x16P\xeeD\x04q\x87v\xc7\\\x83O\xa7\xbb\x98~\xbb\x8d\xd9K<\x02\xad\x91\xc8\xde\xfc\xb5\xf2\xf1\xfdY\xfd\'o\xd9\t;H\xd1\xe9\x9f^\xb4\xc0\x81\x14\x9b\x92$\x90O\x84M\xbce\tn\xd4\xfc\xd9\x19\xbe\x12ia\xb94\xb0\xe9\xe0\xb1\xba\xcd.~%\xeaM\xd8\xfc\x17{\x1d\xe6Gs\xfc_\x99\xa3\xc5\x12\x90\r\x16\x15\xdf\xa3\x8bn\xf0\xe8+\xe7Ir\x7f\t-)\xfc\xfc\xf1\xd39O\xac|\xee\xbf\xe5T\xd6\xca\xe2D\x00\xdf\xd9\xa5+\x99eX\xb6\xee\xaecT=)\x86(O\x92\xe7\x056p\x8fw\xd1B\\\x06\xdc\x1e!\xac8}50=h\xba\t\x82\xeb5\xe4\xfd\xd4\x13\x08Z5\xd1\xb5\xa1\xb70\x11\xa4\xc8\x95\xbe\xf1\xa6R`\x17\xc0\x053\xde\xd5j\x96d\xb0\x8f\xea\xe2\xa4\xda,\x87\xc2\x90\xb6\xca\x04%D\x95\xb7\x9d\xce\x05H\xec\xfa\xbcbL1\xfd2(Tz\xf6T\xa2"\x9dY\xa0\xe7&\x12\x97mm\x07\xb6\x14c\xd0or\xd2\x0bT\xb7\x04\xe4%\x82\x95#i`k?m\x13\xef:\xab=\xed\xfa\x9c\xbd\x0f\xc6r\xc2\xc74R\xc3\xdf\xd8X\x08?\t$\xe4rt\x1bkdwF{Kj\xdc\xe6K\xeb\xe5\xdea@\x946}\xb6hp\xbd\x95\xcd \xa5\xd8\xf1\x86\xf4\xd4\xb5\x9b\xe8\xc6\xd9\xc4\xef\xb1\xea\xa2\xb0\x8eUf\xa5\x1a?\xcdfVzZ3I\x95L\x19\xd1*\\\x14\x0e\xd5lSNs/\xbc\x1c\xcf\xae>\x8b{b\xc7\xcah\x01\x19\xe2\x9a\xea\xe3\x12\xb54\x02\xed\xc96k\xd7%\r\xb4c\xf3\xfa\x0b\xa7\x01\x9e3\xc6\x8b!\xf3\xe2\xac\xbe\x10;E\t\xbfk\x07\xf4\x1a\xe3C\xea\x7f\x88\x8e\xf5\xebQ@Vr\x08\xd7y\x97\x02\xf3\xee\xe6\xda\xb1\xdc\x81\x980r\x1f?\x19\xd3\\\xcf\xa3\x99\xbbg\xe6\xc5nB\xb5K=\xb4I]:\xfa\xbcBHE@UQ\xaba\x83\xe7\xe0\x1e->t\r\xe8\xb2\xfd\xf2\xb9\x9c;~H\xba\x89[}\x80\x10\xf9\xe8\x8eh\x9c<\x19\xd3j\xc1PF\xea"\x8b\x0b\x10\xb3\x89\x8dE@\r\xf5\xd4*\xea\x96\xdc\xb9e\x9e\x170\x84\xc9\x90\xee\x9aq\xc6\xb2 \xfb/\xb002+I\x88)>\x8a\x92\x87\xf6\r\xa4J\xde)\xef\xaf\xda5d\x86\xd0\xb1`?C7\xc4\xb8\x19e=\xef\xd6\xd8\xb9\xfdz\x1c\xa4G\xb1\xf9\xd1\xe8\x1fP\x00\x18a\xf3\x1d\xab\xb3\xb4\xc4\x11\xf30\x05\xe3\xac\x81\xa5\xab\xf1b\xf8\xa3\xde\xae\xf7+)}\xdf\xdf\xbf@i\x89\xceq\x0f\xb0~\x89\x02\xce\x1c>b\xf2\xad\x9b0\xa8\xd9\xc7\xf2\xd7\xf8e\xd3g\xf8\xa1\x9d\xbd\x1d\xf8\xa4\xc7ge_O\xfaJ\xd53\xef^\xad\xa2/\x95j\xfa\xfc\x8d\xfa\xf3(\xf0\xcb\xbd\xb5.q\x7f\xa1\x1dp?\xa8\xbb\xc5b7\x93mxS\xcf\xd7Az\x97.\xbe\x9a\xe1\xc6\x1dq\xc4#v\xfa\xcd.\x81\xfb\xd0:R\x14\x1c^\x1d\xd4]\x80\xcd9\x89r\xb19\xa1\xdd\x8f\xcb\x0c\xf1w\x16\x1e(\xbc\xcd\x90\xce\xaf\xccf\x84=\xa6\x1bS\x92jy\xf6\xad +\xd5\x07Y1\xad\xb2y=\xa7X\x81\xdb\xec\x1d\x92\xb5\xdee=c@\x9c\x16o\xba\xaeXON\xea\xd5\x15\xca\xe4\xec\xc9]B\x19\xffS\x0f\x1d\xeb+\xf1\xcd\xa8Z\xb1\xac\xee\x01>\xd4\x8fMH\x9c.J\x1f\xa64\xd1\x89\xf6\x88\xebuMm\xe9D5\xfaA\xe2&\xcbL\x1d\x9bh\xf7\xd2\x8d\x99fc$C\x0c\xf9\xd5X\x9b\xda\x10\xf2\xdf_\x9d\x92=\x84B/_\xf1\xb9V\x04N\xe2\xed\x88\xe8\xb4\xca\xa1\x0bZ\xf3-!\xe3:\x82gGO$f\xa1\xef6\xa2\x84F\xba1\xe5yF\x12\xa3q\x97\xbf\xcaK\xb4\xf9\x0c\x82\x0f.\x8e\x80\x126\x0b\xf0\x17\x89\x08Y\xd1y<#\xfa\x88\x848.\xd71\r\xdb\x1c[oVsQ\x08\xe9f\xf9Ui\x1fm\xeaW\xda+\xf1 \xb4\xd8\xed\x1d\x00\x91\xad\xbe\xe0U\xc6#\x96\xcf\xb2\t\xc0\x9a\xa6\x1f]\x06=\xdf"\x8a=\x0e\xa5\xdd\xc5\xfa\x90$;\x1c\xa9}oV\xa1\xfd\xccn\xb7q\x94P\'e\xb7#\x05n\x9eI\xf5\xff\xc9}\xc4m\xed\xc1\xdd\xba"\xca&\xc1\x04\x19\x1cOf\xa9eRJ\xfb\xda\xe5\xde\'G>\xfe\rhS\xfb\xa3\xfb\xe4\xcfRQ\xbb\xbc<\x8e\xd9\x96\xade\xb6Y\xb8\x1e\xb7\x13S\x0b\x86W\x00\xe4\xeabN4\xb1\x159:\xe2&0\xbd%p\x85\x10=\x86\xd2\xa5\'\x11s\xdc?\x0b\x9a*\xf5`O\xe9\xda\x88\xc4r\xb2\xa57\xd7g4\xb8\xd6\x1b\xa9+4Vk\xaed\x92\xe0\x9c\xd5\x04[M\x06)\x92\x8b\xcd(\xd8g8\r\x98VB\xac\xfe\x9c\x8c\xaa\xe6&q^5\xd7\xaa&\x04aRv\xf1\xb1\xc4\xd2a\xfe\xb1)d\xdf\xd0|9t\xac\x82\xf2C\xfd\x05%\xd3Zm\x86\x97\xcf}\n\x1e\x0c\xe7\xa4\x1d\x9a\xea\xa2DKX\x81\xa3\xd8G\xd7\xef\xddS6\x83Z\x90G>\xbc\xd4\xacH\x8cW\x10\x0f\x07\x9e\xd0\xf8\xach\x94R\xa6,M\xb2\xbdL\xc7\xba,}\r\x1c\xcd\xea\xa2vh\xedx=\x12\xa4\x9a\x82\xa0A\xba\x12\xb9m\x03:\x95\x1e+\x18yG\x88\xc9\x99\x8e\xa9\n\xf5\x00Ac\x1a\x8b\x80CB\xd5\xcb\xd5\x9cb\x85\xd4\xf3\xac\x9b\x18\xbf\x92\xb2fY;\x89:\x8e\x0c6\x04\xa9g\xe8u7\x9d\xf5\xad\xa18\xa6\xfdh\xcc<\xd0\x07\x82N?l30\xc5\x10\x8bY\x91\x14\r\xcedV\x87\x03[\xa3\xed\xf2x\xf5$<\x7f;\x9c\x06\xd8\xb3\xfe\xbb\t\xd5\xba\x18\x9294\xb4\xbaiVO\xb1\xc1w-\xf7#\xfa\xf9\xd2\xe3\xe6b\xc8\x068\xb9\xa2L2M\xaau,`\x99\xa5sO\xda}/$n\x82R\xe8\xf6\x0c0\x840J\xbdU\xed\x8e\xcb\xc1\xe9\x1f\xbb\xa9\x00\xca\xb1\xc55\x12r\x89\xbcR1/E\xf1\x90\x06\xfd\xa2o\xa1:U\xbbX\xc8\xfc\x82\x94\xdb\xb1\n\xef\xa5\xc4\x96b\xb4th\xfb\xeaX\xb8\xc3\xea[\x91\xff&\x037\x89\xedqM\xe5\x85r\xd5\xdb\xb5\x0f\xf0\xa5\xcbqa\x86\xac\xa7\x1e\xbf\x03\x10g\xe8\xd3zk\x19\xf2u\xb2}\x86\xe2ic\x0fw7G\x829\x88qS\x15\xf3y4\xfd\x13\x11\xa6\x03\xbfb\xc34"\x96\x069\x8b\x07\xc9A\xc9\x07\xc9>\xa6pK\xf95\x11\xb8\x19\x85\x0eLf?\xea\xb3\xaa\x00\xd2\xf4i\x0f\x1f&\x86\xabl\xf9^\x1bg<Q3\xad\x8b\xb9\t\x0b\xebJ\x05O@\xf5\xe2\xd5\x07P\xc0Z\x80@\'\x8c\x9c#\xcc\x14SI\x01\xae\xcef\xdefZk\x8b\xfd\xd9\xecV\x8d\x17\xb9<>\xad=-\xa9f\xe4p\x8a\xedA\xab\xb4\xfex?\xd9\x8d\xdb\xd6rs\x14P\'w\xffu\x10\x88\xeb5\xe4\x9a\xc2\x1a#\x16\xf7\x9c\xacg\xfb\xd7\xb6\x93M"\xb3cPqIJ]\x98\x8e\x04\x1cTld\xb4\n\x9f\xb4\xe9\xd4\xeaZ]\xe3`suzCo(\x8fl\'k\x93\xa4\x85M\xe5\xca\x13\xf2lW\xcd\x06\x94\x84/}\xbb\xbb>\x88\xd3\x05t\x8e\xd2\xf9\xbb\x87\x96\x7fcF\x134\xca<\x95\xfb\x10\x88\xa3\xa9!\x12\x15\xb6\x07\xd1H\x1b\xa2-N\xbd4\x9c\xec\xe5G`&\xa7\x91L:\xa2\x9e\xd2^h\xeb\xf9\xc4\x16\xc2\xc1O\x18\xc5\xfb6\xae\xca\x95\x1f\xaa\xbeZ|\x95\xd5aV4\xbb%\xc3\xa9\xf9\x04\x8f\xddQz\xfe\x17\xbdo\x1eE\x07tl\xcaD\x08\xfb\x8e\x82\xec\x12\xd4\x8fU\xe5\xfd\xfd5\xb1w\x81\xca\xdc\x8dj^\xbb\xe5\x12\xc0\x03?\xdb`\x06\x02\xa2\xf8\x8e\xda\x9ap\xe95\xff,\x9e\x031\xc0:Zf\xe2\x08\xb4\x88\xab0\xfd.\xda\x1fL\x9f\xa8?.(2\xd1W\x96\xeb\xecB\x0c\x9d\xe4\xd6P\xc1j\x11\xd7"\xf4\xaeS\x1bq1\xe3\xf7\xdd\xfeT!5%\xea\x8aX\xe3\x16\xfaA\xa4dO\x8bh\x94r\xe4\x80\xa3&\xbf\x97B\x9aM\xac~\x14oR\xa2\xc1\x04o#\xf2\xf3\x8fYi\x02\xf3<\xee\t\xe51\xddn"\x8b\xe0S\x17\xf8\xe8\xe9\xecE\x8ewE\xea\x1dh\xd2\xa6\x19~\x1f\'\xb6;\x89K\xe8\xf8D\x88&\x93?-a\x97db\xca\x87\xef^+fHE\x03\xabC\xf3\x8ac\xf1\xcfy\x87A\xec\x128S\x19\x19\xf9\xb1\xa2k\xcd\xdc\xf0R\xb5\x007\xaf\x04#\xfc\xfc\x05\xfa\xe0\x9c\xff\xa0\xd9\xbe\x11\xcb\x07o,\x89\xb4\xec\xe5\xc9\x12S\xfct:\x11\xc3\xac\x8c-\xdc\x02^W\xe2\xce\xa4\xac\x8c@\xf6]\xec\xbd\xff\x91~\xa4\x86\x85\xa8\xf7\x1b\xbc\xaeg\xe9\x97G\xac\xbcx\xec\xe8\xafcU\xe3\xca\xd1$ \xbd\x05\xae\xf7\xda\xf6l7\xd3\x88\xbf\x9d\x1a4\xc1E\x97\x02?}\xa9\x87\xfa\n\x99\xdc\x1b\x89\xbf\xec\x99\x8b{V\xf7\xabr\x9a\xbd5\xc9\xc3,\x91\x92|L3*\x85\xfe\x80\xe0\xf0:]\xee#\xbfA\xf7\xfeG\x8f\xca\xb0\xbc\x94`\xc9t\xca\xe8O\xda\xfa\xbd\xce8\x1d&\xd7_\xee_\xac\x93]\xbb\xec\xd0>\xbe\x98lK#\x95{\x0f\x03U\xa1XA\x82|eTj-U\xd8\xab@\xda/\xd1\xfd\xfd\x19\xe0\x0b\x94\xa2qM\x13\xaa\xdd\x18\xaaN\x13\xef\xb9\xd7\x9bX\xbd\x93yY\x83\td\x07\xafJ\x13\x8c&x\x8b\x1b\xa3\x02\xfb\x84M>\x07\x8e\xd9\x97g)\xa9\x84n\x07\xecX\x82m\xfc\x12\xf2\x0c\x0c"\x0c\xc6\x1a\xda\x81\xaa\xfa\xecNy+b>\x9b\x18N\xaf\xe8~2\xab+\r\x87L]\xc1E\xfaB\x06\xd5\xe4\x02\x9b\x99\x93\xb4\x9eT\xdfA\xd8\x1b\x0e\x14\x85\xb8\xe3s \xdff\x81\x15\x90\xf2{\xd3(\xecJ\x0e\x893\x07\xdb\x1b\xfb\xb5\x1aD\x00\x96\x9eSA\xd4\xd1\xfc\x7f\xf9\x14\x0ci\xa56U%;oV\x1f\x89\x94\x8d\x04\x1e\xd4\xca\xc1\x9e\xbav\x8f\x1e\xec-\xfa\xe5\xd01\xb8\xd5\xfa\tx\xb5A\x01\x80\xc4\xd3b\xd8\x95\x87\xd2j\x1eEB\xf0Uz\xe0\xcf?\xdc\xdf\xb6x\x83\x04-\x9a&16\xa5\xc1\xc9\x86\xdb\xb8\xd4[\x90>\xf0\'\x90\x9f\xb1\xbaR\xe5j\x979V\x83\x00\xe0\x98\xca\x13\x17\x8e@\xbf;\x9e\xe1\xbaK-\xa0\x9ek;"0\x95\x9b\xa8\xa9^\xccL\xc4&$!\xba\xea\x1b\x8f\xac\x92K\xc2\xa4eq\x1f\xe4\x89\xcf\\yXdVrx\xad\xc4\xdc\xe6\xccl,\x8c\xf5\xf1\xfe\\|\x1e1\xba\x8ek\xf3wn\xc6o\xc5.\x9c\n\xb10\x05\xde\x0e\xd9\x16)\xd4\xb7)\xa3MP$\x8c\xf7\xb6\x1a)\x9f`1\\\xed,4\xf4k)\xa0\x13\xeaTi/\x84\xf6\x8f\xc1\x0e\xb5vq\xeb\x9ff\x1d\x12\xd3W\x8e\xb5\xf7%\xf8a\xc3\x81\x0f\xe4\xf6\x88\x89\x92H0\xfc\x14\x8f\x8dt3\r\x11\x8b\xc88q\xd4@\xdb7\x81\xb9\xc9\xb8X\x16\x80\x98y4\x9eG\xf4#h\xa3N\xd2\x1bK\x86\xee\xae<\x00\xaf\xb0K$\x11\xdd\xa8\x0f\xcb.Ts\x8b\xbf\xb4g\xbfE\x1c\x0b\xd3\x04}g\xab\xaf(\xa43h9J\xbd\x91\xadj\x87J\xf9^T)\\\x83\xe0e\x9f\xa3-\xcb!\xd2UC?\x06v\x1e\xae1\xc8z\xaed\x17\x91\x05\xbfb\xd9\xab1\xe6\xfci\x14\x9f\xbdd\xa9N\x1e\x80R\xc4\xe8\x8a\xddU\x83\x96fe5\xc4\xb7y@\xdc\x80\' +\xc4\xea(\x85H\x9a\x16c\x8c\xcbv\x14\x19\xd9Gg\xdf]\xff^\x84\xa4lL\xcd\x80\xea\xea\x1a\xeah\x93\xd3\x86\x9e{6\xd4\xd7\xcd\xd9\xda#\xddm\xad\xd3\xce=\xd5\xae\xef\x1a=\x08(P\x83\x9b\xd4q\xdf\xdd\'a\xe7\n\xc5l\xe5}\xe7\xb26')
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:13.602870
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xa1\x19\x00\x00\x12\t\x04\x00\xa3\xb0\x89\xb1\x9f\\bQ\xb9p\xb45\x10\xf7\xe5\xec\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x04\xd8\xe8k|\x9a\x05p\xa0\xa6z\xc2\xd4\x11 \xbcj[y"N\xb3F2\xa1\xc8\x8a~\x0f\xf5\xc0\xd2\xe4\x93Yt)@\x9c\x8a\x06t\'\xd9\xdb\x8e\x9d\xfb\xc3\x1f>\xe1\xedy\x0b\xcdb\xfc\xc6#\xb6\x15G/\x86^\xcc\x8b\xfa36l.8\xb31\x01\x8bi\xa0\'u\xd9_\xe4Oa\x07\x9d\n\xec~\xf0+s\xf3\x88\x89\x8eR\xdd\xac\xca8P\xb1\x90\xc4\xaf\xd3\xfc\x02H\x84\xe2P\xde\x94\xbaMh_\x94\x12o\xd0U-/O\x1d%O\x94\xb3R\xbe\x19\x06\xec\x19O\xd8E\x81\x19\x07j/5,\xb0\xbf\x82\xf2\xae*E\xe8rw\xc4\xa3\xf5\xf9?\xec\x19\x9e\xf9\xc7\xef\x91\x91W\xf10[\xdf\xa6\xa2g\r\xaa\x89\x02/n\x94\x80\xc5\x08\xe1/\xa2X\x85\x99\x10\x99c\xd0P\x95\xeaP;\xe6\xce&\x90\xf3\xe0!\x1e\xf0\xa0m\xef\x9e\x8f\xcd\x0fBX\x03\xfa\xa7\xe4a>\xfc\x17\r<;\x11\xa9\xd8\x0f1\xca\xa7\xff\xfa\x0br\xc3\x9d\xf9cf\xf3i\n\xa6\xebq\xc9\x00_\xf6a\xc7\tl"\x83\x9c76\xd7,R\xbc\x1e\n\x14j~?2\xcf\x126\xd0\xa4\xe8\xee\xeaV\xd3\x8fp\x84y\xc3\xa0\x19k\xaf}#K\x8eH\x11%\x0c\xff\xcd\xc6;\xa4\xe6c\xda\x7fEs3\xdf\x88#\xe6\x8a\xb8\x90\x140Q\x03\xa7.\xc5\xe8\xe7\xbfP7\x82\xf0\xf1\x8b\xaf\xbe*\x82\xf0\xac I\xc6\x03 \xef\x88\x17\xf2d\x99\xb6\x19\xf7\xc1\xa5\xec\xb1\x03\xf9.\xcf\x9f\xfaW\xd0\xb7\xe4\x93\x95.\x97\xfe4W\xca\x91\xd8\xda\xe9@4\xe9^\x00.C\x91\xb32O\xe3\xc9\xf2\x81\xad\xaa\xb5S\xcfh\xe0\x10I&\x87\xd5\x91\x81\xae\xda\x06\xd9\xb9t\x0fE9\x7f>\xc8\xfab\xab8.\x11J\\C\xe7\x86\xd4l\x1f\x8amV\xb7\x03\xc6\xd08! z]\x80\xba\xe8\x953\xfb\xd2j\xba[\xac!\xdf\xb1~\xf6"c\xd4@q\x0c\xd3\xb5\xbdNP\xeae\xf5\n\xa6\x84o\xfe\x8c\x1a\xfe\x18\x8a\xed\xfe/f\xf3{\x9e\xe7\x00\x9e\x91\xce_[\xc2h\xd2\xaa\xdf\xf0S_\xab\xd1sd:\xd0\xef\xb5\x15\xf1\x8e]\x0eX\x0e\xd4Ge\xd0\xb7+Rl\xda\x8fh<\x16\xa0v6\xd8\x89\xda\x046\xe8\x1c\x814\x9aW\xed\xec\x11v~F\xcbg\x94\xcf\\N\xf8\x8b\xfb\xacF/\xe2\x0e\t\x97b\x13\xbb\xd9m\xfe\x89[$U\xf6\x83\x957\xc2L\x10\xfdt\xf5\xdc\xb1\x8f\x08\x88\xf6\x9c_\xd48\xebt5\x16\xaa\xe1nd`\xb5\xac\x06\xe9>\xb4\xb0\xf2z\xe4\r\xe6\xb4pv\xa5\x84\xc2\x19\t>\x1c\xd7\xc7\xbd\x00\xee\x19N_A9\x94\xcc\xb4D#{\xfd\x96C\x98p}2\x9e\xddn\xb6R@\xd4\xb6\xf7\x8b\x97\x05\r\xdb\xe7;\xcf\xbc\xd9\xf5P\x93h\n\xd2\n\xe5\x9b\x8f\x18\xc5\xe4\xbd\x1f\'\xb8\xe2\xc4u\x96\x9a\x84ln\xc7)&l4k\x93r\xb5\xdf\xc1\xc3\xcd\xc4\x9b\xf8\n\x12\x9a\xff\xda\x06\xea\xe5\x9d\x1c\x96\x00\xc6\xbe\xbf!z\xa0\xa3A\xde\xa1\xe3\xdf\xa6\xa1\x9d\xdd\xc4w\xbf\xdfe\x1e\xd6\xe9\xd1Q].\xd6;\xed\x00\xda\xa7o\x12\xa0\xe5A*\xd6l\x97\x01Zl\x85m`k\xf67\x83\xe0|IB\x97@\x1d\x11\x17\xc5pT\xdb\x05d\x9c\xbc>\x16\xae\x03\xeag\xe0\n\x00\xe6\x9a\xa7\xac\xc4\npH\xada!^\xb2ai\xc1\x97w\x91\x19\xd4\x1d\x1cj\x9f\x85L\x89\xee?]\xa4M\xa1\xcd\x8f\xd3C\x0ci\xd8\xa2\xc5\xf4\xc94n\xaf\xac( \xe5\xad\xc3{4\xde\xa6\xf3d_\x16\xf9\xbf\x7fs\x1e12wj\xcd+\x886e\'X\xcf\x1d\x13.Q\xb8\xb3\x1ac\xe0\xae\xa2\xedp\x07,s\x86\xc0\x0f\xf8\xec1\x82 \xf7\x9b\xf0\x0c\x8dZ~\x00[\xcf\xc4+\xf3\x8b\xff\xa2\xd4F\xffn\x9c6\xc2\x7f\xa6\xc9`E\xf4\x96\xa3\xc7l\xb3\x16\xeel\xd2(no\xe6r\xe6V\x89\x02&\xc3\xcfSn\xe8\x80\xda\xaf&\xcc\x05\xc8\x1f{\xcd\xd7#\x9e\xe6z\xfa\xe1\x15L\x8d\x8d6\xac\x85\xdc\xe8\xdd\xc8\xbcC3\xb4lb\x94\xf0\x17\x83\xde\x1c\x18a\xf8^:\xe1\xf5$\xe8\xde\xdaF0ZX\xed\xd7?\x8a0o\x9f("\xa8g\x08\xe4:\x96\x8c\xb6\xbc\xb7k<\x87\xc4\xc0\xe54X\xdc\xc9\xa8\xc07\x18\xc6[\xae~\xfc\n\xd6\x19s\x86\xef\x8b\xba\xca\xfb\x98\x8c\xda\x07\x1cWn\xb6\xb8\xee\x82\x9bf\xac|\xf8\x85\x19\x8a\x1b\x84\x1e\xbd\x8d\xbb\xf4\xc4\xb0\x93f\x1f\xbc\x13^\n\xdf\xe1\xc5)\xef\xc7 \xf5\x1f\xe6\xbeD\xdb\x9f\xa8\xbb\xb4(y\xb8\xba\x9e\x9c\xf3\x9b\xedkxe\x8d\xe3O\x0f\xb6oYh0\xb2\xf1\xfdc\xdf\xb7\xc5S\xfeu\xd0\xac\xae\xc3Q\xb6\xa5\x05\xb2\xdc\xa2[\xb7+\xb72F\x866\x05F\x86#F\x88\x13\xb3\xceg\xe3\xedJ\xb2\x8fwn\x9fD\xcd\x00N`\x19\xdf\x15\xa6xI\x144\xef\x01\x9ci\x92\x0eA\xc3\xce0oV\xb8/\x90\x84\x1e\x7fr\xd5\xc1\xc3\xf4\x8c\x9b\xa9\x15\xea\x08\xcb\xaa\t\xae\xe0\xfd\xd3\xdc\x03\xec?!$\x9b\xc2\xd9kU&\x1a\xed`\xcbW\x98E\xb5\xbe{HKee\x93\xa7\xf9\xe6\x13\x97\xa7\xe0\xb8z\x89\x9eVT\xc9h\x90\xb1\x81\xd8\xf7\x0fW\xacJ\x1b\xc0\xdf\x9a\r\xfb\xec3g?\xee\xa3\xe2\xfb\xcf\xeb\xda\x95\xfe\x91`\xd92C\xf8\x7f\x91\xfc[\xf9\xdb\x95\xb2\x02f\xd90\xd2Z6\xa1n\x18\xe4r@\x86\xea$\xd1\x0cuRU+/\xc2\xc9 \xf0\x9c\xef1\xa9\\\xf93D\xec8\x11%^P@\xfc\xb6\x84&\x92ng\xd0\xc0\x8d\x89\xf6\xd2\x9f\xd9\xba\x87\x89]\xc4,\x15N\x8d\x97W\xac\x05\x80\x05b\xb2\xc9\xc0[\x12d\xf2rb\x89\x11\x9ce\x19{\x07\x91\xeb\xeb=\x85\x9f{! \xac\x1e\x9bE{\x97\xd4\xc6$\xb36\xc0\xe5\x99}C\x9dJN\xdbx\xda4\xc7\xf0!\xfa\xf9\xbe-\xdc\xa9\xcb\xa6\xb5\x91\x08\x93\xae\xc8L"\'\x02$\xe6\xff\xa8P\xaf\x89\x11\xa3\nV\x14oD\xfeV\xa2\x80\x14\xe0\xa18\x00\xa5\x82\xfb i\xef\n\xe4\xdd\x00\x9c=\xc5\x90&\xf1\xb5w\x96]\xfaN\x97bH(\xca\x11F\xb5m\x98l\x8e\x1e\xe8\x9e\xe5\xc5P\xee\xff\xa8t\xa8\xa8\xca\x0f5\x16\xafL{W\xca\n\x88\x80!\xecR\xd0\xcfj\xa6m\r\xef\xe6\xb8Mrk\x8d\xffu\x06\x1d\xff\xb0|o\xd0\x1d0U\x81g\x14\xc3\xe2;UZ\xb6\x86\xb6e\xa3Z\xa0W\xb0]}"\xd5$\x98\xe7\xefQ\xa3\xb5\xf9\xcd\xce\xe2\xecRp\xc4#yV\xe7\xb5\x80\x9d\xc5\xa5\xd8\xe9\xee>\x1f\x9f|<\xa6\xac\xa1\xf6\xb0@\xe0\x03\xc1@_T\x88\xab\xbbU9\xfe\xc8\xb4=\xc0\xe8\xb1<B\x04\x88\xea\x8f/\x8f\xfe\xcd*\x8f8!3\x86\x8b\xdf+^\xc7\x9a\x81\xf9\x81\xe7\xc6\xe6\x94\xc8*\x8d\xfe1\xba\xcb\xa6\xd3\xf8\xf2\x85\x9b\n\xca\x1fr\xd8 \xde\x94\xc3u\xa82\xcc\x04(\x88\xd8\xa5&\x96i\xb3\x87\xe7\x83\x00??\xfd<[\x98\xfd\xacM\xde\x8c\x8bu\x84!\x05\'*\xbcF2\xfd\xd6\xf63\x14\xa9\xed\x0b\xd1j\x83\xfdrl\x0cF\xe4\xae\xca.1\xd9l\xc8\r\x82[\xa7\x9fw\xff\'\xf4\xfel8\x9e6\x8apk\xba$\x1e\xe5\xad\xe4\xc0[t\xe4\xa9FA\xac\x8en\xc7<\xffb\x9e\x8e\xf4\xd9\xd0J(\xee\x13\x12\xb2\xa4\x8e4R\xaft\xb9 \xa5\xe5"?(\xe1\xc8\xaa\xc4\x80\xa8$\x93a\x84\x0c\xd81c\x8cF\x0e\xcc\xf4\x80\xc5\xc1\xdf\x07\xf2 \xba\x05\x84\xb8A!\x93J\x9bD\x0e\xdfsPf6\x06D\xcf.t\x8a\xa3\xa5\x1a \x18X\xd2`\xbc\x8a\xea$\xf7i\x95a\x1c\xab\x0e\xf5Q\x0f\xf7\x8e\x15 \xe5\xbaL\rbv\xed\xc7\xa3u\x87\x02\xc6d\xc4\x1fxQ\xe2\xdd\xa6g\x82\xbf\xca<\x9c\xe0\xc5\xc8\xf8\x0c\x90r\t\x01\x97\xcf\x90F\x8e\xa1\x11e\'\xa8\xa4\xf1\xb6N2\xd8[%\x00i\xd6L\xdd\xe1d\xc3\x94\n\x84\x9d\xb7\xfa\xe4Z~\xcfu\xb9\x86\x0f\xc9C\xad\xcf\x1d\xcc\xae<ttT\xa3<\x94W\x04\x0f\xfa\x00PG\x7f\x81\x84\xba\xe8VEfk\x9f\xbbmVc\xec\x082Z\xeb\x85\x08C\xc1\x99\x99\xa9<\x82\xeeX\xe0\xe5\xd6Fp`\xb2\xf2F\x013p\xfe<\xfaA\xb2\xf4\xcb\xd8\x0e\x9f\xf5C\xbcN\xae9\x06\x1c2}H\xe81\xd1\x8eE\xe31\xf1\xf1\xc0\x00\xe6L\xe5\x82C\x1f\xd1!\x9c#I7t\x17>\xd7\xb2\xef\x93i\x92\xeep\xdbS|\\+\x05\xfe\xff@\x90\x1f\xb8\xcfW\xeb\xcdw\xcb\xef\xab\xe9\xb9\xbf8\xcbj\x8e`\xe0Y\xfa\xb8O\xdf\x93\xb6\x96H8\x81K\rA\xce\x1e\x84\xcc\xb5h[\x83\xa3\x94\x19\xd3R(\x11\xbd\x95\xf9H0\x18l\xc8\x05\xcca\xa5j\x13\xec@\xa9\xca\xe0\xaa\x82\x93\x84>\xca;\xcb\x1a[\xac\xfa\xfc\xd2\x07\xc7Mc?H\xab\xd2c\xba\xe0\xf7(w|\xbc\xc0R\xc6D,mB\x193\x00\xdaNp\x91\xb6%6\xa1\x9bS\x17\xf6\xd5(\xe7\'\x97\xd8\x9d&F\x98\xf7\xd5|.,K1\x82K\xc8H\x0e\xcc\xe5\x9e\xf8dAgA\x98\xb5\xca_\x1co\xc0\x9fo\xc0\xcd,0\xb0\'\xa2 v9\xe3\xdc\x1cvR\xb9E\xf2\xb9<\x00\xec*\xca\x17\xa3^\xa6\xfd\x8b\xee\x1a%[\x9el\x19\xa0^\xfc\xe8\xe9\\\xa2r\x8d\x08\xe9;\x99\xd3\xc2>\x1b\x9d\xcf4Fg\xa6\xe8\'G\xbbo\xbc\x0f\xae\xc7\xb9\x93WA\xcca\xdc\x87\r2j\xcb\xa7{\x9e\xa3l\x1aV\xc1v^\xedc\x1c\xde9\x96\xb1b\xaf\t\xba/\xe2*\x9c\x93\xca\xa7\xc3}c\xa9\x0f\xae\xcfEB\xeb\x7f"^\xa2\xe5\x8a\xc5\x00R\x95\xeb\x10\xd0\xddl\xaf\xc0\xe7\xe1\xd9\xdf\xc8\\:\'\xf4\xe6k\xf5\xe1\\\xf1!\xec\xd7m\xf6G\x8cy]pz\xbe\xa35\x12Jf\x9fzP/\xe2\x06\x83\xcb\xdd\x8e\x86\x93\xb3@\xe6KK\x94\xf0\x14j\x18dP\x9b\x90\x86\xe1\xe3E\xe4\xb4A4\xc0\x92\xe8\xa1\x7f\xd3\r\xde\xc3\x16\xe8(\xafp6\xda\xf2\xd4\xa3\xd7\x15`%P\xe0W\n\x7f\xf6\x8a\x00\xd5&Jk\xb6\x89|\xb5\xb1\xdf\x8e/\xec\xbf\xe1\xe3\xfd\xac\xe7F\xe9\xd70D\xf0&*|\xfe\xfa\xf4j\xe2a=10\x02\xd0\x85\xa2+T\xf1\xa0\x165B\xf1T\xbdptM\xf4N\x8b\xbf0;\x053.Pa\xb0\'\xac~\xa8@F\x06\xf0\x12\xed\x8dVhr\x814D\xe6]<\xa9\xff\xdd\xf9u=\xcb\x89\x9b\xd7T`BE;C\xa0y\xc3S\x1d\xd1\xceeT\x17\xc2<\xd0:X\x0e\xdbG\xb5)\xf7\xbe\x0b\xdd\xa8\xccSuRaC\x83ul\x1dVY\xbbL\xfe\t.\xc0\x929\x86\xd1{\xa3\xe6\x87\x0e\xaa\x89\x7fb\x16\xfd\x1b\x8d\xee0a\xf7\xee\x068\x0b>\xca\xaa\x10\xc6\xf3\xa8\xe4<\x8f\xf7J\xa2\x10\x07\xa5\x16\x80\xec\xe8\xb2+\xc0!q\xe3\\\xa8\xc8\r\xac\xaavaI T\xc7\xab\xe0\xa6\x83\xc2h\\I\xdb\xfd\xc3-q\xc2F\xee\xbd\xe0\x90\t\xd8\xba]\xc8\xeazwJ\xe22\xe0\xc0\x1fZ\xa8\x82I\xad\xac\xdb\xd9\x94\xff\xa2\x8bQ\xac\x00\xbf_\x0bK\xca\x93"\x0c\xfa\xb2\xf3\xc9\xee\xf6z\xb0\x03y\xea\xe8\xa4\x14\xe2\xa4B@\xf7F\xd4\x81\x16V\xe9\x88\xef\xb0\x13\t\xf3\xfc\x96\x8f\x01\xe4\xda\x9c\xdf7\x15\x1dVF\x93z\x8c\xc6\xe8\x8c\x95\xb8Q`\xae\xb0p\xc2\xedl\xc5\xc6W\xff5Wxu\x8e\x02\xb14T!\xbeq+(\xf1C\x9b\xb5E\x0e\x04\xa4\x92C\xdeU\x88%;\x9b\xa2C\xe5\xf1.1\xb0c\xecu\xc5U\xf9\x04\x80\x8e*\x91j\x00$\x9d+\xa2\xd8.\xaf\x19\x16\x89},\x99\xdbz\xcf\xf3\xfe\x11\xddah.>\xf3z\xa5\x18Gz~j=,\x94\x86\x16\xd8\xbf\xfc\xc7\xb0i\xa0\xd0\x9d-\xcbR\xf0\xa3W=\x99\xe1cc\tCG\xb0az\xb0\xed\x8b|TL\x1b\xe6\\\xddU\xbc\xaa\x0b\x17^\xbc\x96q\x11F\xf2\xe8\x87\xcer\xdd\xcd<\xd5\xb8I\x18\xcb\x12\x19\x8fw\xae\xdf*\xf0\xdb\xd9V\x11n\'\xd0\xb5=\xb2H\xe8,\x97\x1e\x14xc8\xe2b\xd4\xaba\xffi\x1dqL\xe7\xa9FR\x1d*\xbf\x02\x16\xdd\xfc\xc1\xe8\xc7K\xa5*>=\x02.Sxm/\xdf\xae\x19j.\xbe\xe3\xbf\x97\x7f\x9b\xd1c\x0e\xa3\x08I|\xa6Z\x07\x9b&9\xad\x1eJ\xab\x0f\x1e\xb6\x82\x9d\xbe;M\xddJ\x80\xc2gugS\xc7O\xff\xf9\xa4\x90\xc2\x062\xab\xa4\\\xd0\x99\xcc\xc3Y\x8aa\xdfQ\x93m\xd8\xa6>\xd9\x1aes\x19\xdb\x10d\xeeg`\x0eKP\x07Y\x05\xca\x0f\x89[\xb2\xf3\xfb\xdf\xa2\r\xc72D\x83\x1c\x9a\x82o\xce+\xd8\xd0\xf0\xf9r\x8bx\x13\xe8\x91\xd5\xa1l\x8c\x82\xb0\xb0\xe6\xe5((\xc7\xd3]5\xd5/\x90\xae\xcc5\xfd|(LK4=\xbd\xa8L\x1egi%\xa1\x19\x18/A\t\xb7hV<\xf1\xe8\xed@(\x0e\xb3\xcf\x12\xe5\x15\xcfy\xf7\xce\xb7\xf7 E\x84\x97\xe5\xa3\x1e\xfcT0@\n\x8b\x12\xf0P\xf4\x15F\xd6\xd7nP;C\x93\xa5\x13\xfcHAW\x8a"\x9e\x96\xf9Y\xeaT\x9bCCH\xb0\x82\xbd\x18\xab\xf6ae\xdc\xab\xdf\xd2\x90q\xb5b\x10-\xdad7DCy+\x84\x9f\xcd\x1d\xb0\xf0\xf2\xa8\xbaUNd\xee\x13hDR\xaa\x15\xbeo\xddQ\xac\xa4@\xc8\xea\xfc\xd0\x97\x9dP\x90N\xac\'T\xeb\xd7\x9fM\xef\x80\x80\xa7\x81L\xae\x15\\\x80vQ\xe17bT\xe9\xb2s\x9cF\x1d\x8d\x87\xb2\xe2\xfb@\xd1\xab\xd8v>\x18u\x8b\xd0\xbf?\xf8\x1a|\xf5rw\xa9e\x9d\xafox:\x9a:\x87\'R#`\x9c/o\xf8\xf8n;\x13"\x9c-W\xc7\xbc\xe3\x04\xc1Z\x10\x87 \xb5#\x83z\xfc\x8e@\xd02\xca6\xb1\x95h\xc7\xb6g\x831\x14-\x9d\xeej\xfa\xd8\xdb\xf6x\xcbq\xb2@l\xcf\x08"\xa3`\'\xe7\x12r\x1co\x96z\x98\x93l1\xb8\xf2\xeb\xe2\xdd\xd9\xebu\x14\xddR\xe3%\xef\xcc\x1b\xc8A\xf9\xa5u}\xe9+\xc2\xe4\x8bH\xca\x00a\xf5\x1b/\xd7\x9cI\x1a\xc4\xfd\xd0YQ\xf0D\xbfE\x1c\x8f\x92LP\xac\xb8\xea\xf8\x1eKF\x01\xc1t\x1bG\x1f\xa9\x12\xa2F\x12p\r]\x944l\xc6\xaa-\xa4\x83o]\x02\xe3\x826\xd0\xf2]\xb2tn\xdb\x1d\xb5\x17\x99\x1e\xe6&\xcf\xa7-C\x8b\xf8\xad\xa7\xa7b\x18\xc5Q\xcf\xcf\\\xd5\xc35cP\xe4[\xaa\xe1(=\xff\t\xcefv\x8b/\xb5\xa2g,\xe6\x08\xbc)\x85\x8d\xe3S*%8)d\x1a[7/.D\x8bU\xe0|\xa1\xd2\xa3\x8b\x17\xc7\xdb\x8c\x1a#\xfb\x83r\'\xee\x90\xe1\xe6+9\x99\xe1\x88\xe6\xf8\x01\xf0zn\x9e]\xfd\xe8\xach\xa1*\xc8\xf9e\xee\xe0\x01bmY\xdd\x94\xb1\xbe\x86\xbc\xcala~b]\x12R\x9dN\xc1\x8c\xa5\xc1\xa7\x84\x84\xf6\xec8<%N\x9e\xb1\x0b\xe4i\xa8\xf1\x94t0mf2\xc7\xde`\xbc\xc0\xc7\xe9\xeb\xa9\xc2\x10\xd3\xa6\x10:\x94\xc8C\'\xfd\x98\xeeuN\xe4C^l\xef\xf2H\xc034\xb2\x17Pg\x9a%\x86\xcf\xd0\x9dw\xc9\xbf)\x1eE\xa2\xdeJ\xa5\xd3\x80\xdf*\xddq)\xa1\xc9\x84\xbb\xd0f\xf7\xc5xZx\xe8E\xa6\xe9\x1bt\xc6&u\x15\xf7K\xe0L\xb7mBY?\x17\xf5^\xf1\xda\xeb\xa2\xc3:f[Qid\x8e\x04\xaa\r\xebA\xfc\xbau\x9ed5Rzr\x9bI7\xc2$\x07\xaf\xe410J\xfd\x81\x8c\xe6\xbfSn\xf4L\x8d\xe9?\x1bt$\xd6\x01\x13\xd7\x91\n\x1d\x1d\xc1\xf1\xcd\xb7+\xcf\xd2pZ\xc5\xdfL\xab\x80\x83c\x12GK\xeb\xc5\x0f\xf8\xb0\xbd\xee\xf2\x1d\x95\xe4\x02\x02\xa0\xe6\x13\x84[H\x08(\x99\xf4c\xa5=\xd6\x10\x9b\x06\x17\xc6X1\xca\x90\xd1%\xaf\xef\xbc\xe2[\xe1F1\xae\xd5\x184+\xff\x15S\xbe\x87\xb3C\x8d?\xb9}\x8d\xb2\x19\xb1\xceY\xee\xd5@\x80\xd3\x16\x19\xa7\xe0x\x95Q\x85Sg\x98\xd9\xc2$4C \x14\x98>\xae\xae=\xd2\x00\x8c\xdb\x06\xc8\xbemm\xba\xb5;\xf9\xec\xeb?\x8c\xc2\xce$\xa4 \x1d\x92\xc5\x94\xa3\x86\xc1K\xe5\x1edO\x05\xden\x01<\x0f8H\xbb\x1f\x91*\x07B%m\x82\xab\xc6gw)\x94,\xc3\xdfRD\x08\x1a\xb8\xc7\xcf\x7f\\(\xcf\xde\xfa\xf8\x1b\x00\x95\xa9\xb5\x9f\xd0\x86\xb4\xf1\x90\\|\xe3\xb7R\xb8\xec\x9cW\xf2%rYa\xd1y\xe5z\xf0b[0P\xe1|\x01C\xf7\xd2\x93Igi\xa1\x08\xba\x15\x1c\xe1=X\xe1\xc3U\x19\xaf\xff\\\xddX5\xa3\xa7_h\xdfO\xbb%\x9f\xa1@\x02\x00\xdb\x85\xc4\x1e\x06\xb1\xfdE?,\xe1\xca\xf0\xa3\xd4\x17 *\xe9\xd6\x96_\xb3\xeaS\xe6\x80`\xfdR\xe9]Y\x98\xa7\xf7\xb7\xf1\xa2\xa2\x14g\xfc\x82\xb5\x0e\x8d\xcb\xe5\xda/.`\xae\x0e^i|\x19\x03\x15\x9d\xa4\x9b\x9dl\x84\xfc\x19\xb3\xcb\xa3\xe3o\x12\x97<\xef\x07\xab\x8a\x14m\xac\x9f\xf6\xefhN>\x9e\'\x92\n5\xd3\xe3Vk\xa5-7\xdc_\x8e\xde\x86f\x10\xd2\xbb\x1d\xf1\xc9:Dc\x0f|BL\x92{s\xa7\x1c \xe0\x1d\x80$&\x00aOw\xb7&\r\xfdV\x05\xfc\x84\x04\x83\xb6}\xd6F\xe4A\xad4\xcd\xd2\x00z\x04\xcf_\xdd\xa6\xabr\xb1\x8f\xe8`f\xf4"n^\x10\x0b8\x13\x04\xd1b-R\x95\x90\xb9\xe8x\x1f\\yw\x91\\\xc58\xfbe\x97b\x9cH7\xd5M\xbb>\xf6E\xae@\x98\x11\x99\xaag<\xa1G\xa0EpN\x8cb7Q\x9e\x82qx4\xd0\xfb\x14\xa3\x16.0\x15\xee\x86\x04d<\x8fccO\x83-N\xb3\xa1)W\x0f\xc1@M\xe8\x99\xe0\xf3a\xbfP\xab\x13<\x06\x03k\xfc\x87\x94\xaa8\xb4[^?\x0e\xe6\x94\x8e\xb4\xb0\xbd\xbf\x81\x13{dx \x8eb\x13\x10\xe6\x1b\ny\x1eXD^\xa0\xcb{ \x87\x01\x0e\xd1\xae\x00\x92\xd08J3:G\xa9\xb6\xd7\x91\x96F\xddx\xff\x86\xc7M\xfd\'\xa9\x8c\xbe{\x13aQ\xea@\xce\x8a5\x0c\xb8\xdf\x88X\xa5QQ\xaa\x15e\rZw\x8cr\xa9\xd8\xd0\xae\x89\xea-\xee\xf7\xbb\xb4(\'\xe94\x07\xa5\xec\xdeY(\xadc\x14;N\xce\x0fN\x06\xf4\x808\xcd\xa3\x87>|\xae\x83[\x84\xaec0\xbf\xd8\xc1$\xe4\xc3\x15\xfb\xca\x11\xc1\xdfF\xc0Z0%$\xb9\x95\xd4\xc0\x8f\x04}\xc2\xf7\xc0k\'0\r\x95f\xc0\xb6\xa3\x10\x9d\x13\xb4\xeaY\xcc\x13B\x13\x81\xebF$\x91\xa4}\xa3\x12\x0f\xb3W"\x0cX^\xd6\x88\x80\x97`\x914\x03\xbb\x15\xde\xa3C\xd7\x85$\xe1]\x9c\xfaR\xc3\xae\x82\xe8bS\x02\xbf\xfd\xbevQ\xf3\xc1aC`l[q\x98x\x82\xd6\xe1\xd7\xe2\xb0\xf9n\xc0\x89<z\xf7\t\x9b\xafM\xe3\x1e\x83\xb2\x0e\xa1I\xc3\xf6\x10\xbf\'\x0c\xc8\xb9R\xd3\x81\xd77\x8b\xfdOZ\xbc\x02#\xc8\xaa5\xf2LR\xd0\xf6\xf3\xbaa\x19rx\xc7\xc9\xe9Vk\x1d\x99h6\xfd\xaa\xab21 \xb98U^\x86\xb34\\\x9dc\x85\xfe\x14\x057\xefU\xe4o\x17\x87\xcb/\x803\x1f\xb9\xc8mF\x82\xbci$\xf8\xa4\xc5<\xc4\xb1\x17[\x9aB4\xddb\xc2\tb/K\xe6r\xb5\x93\xa5cm\xf7\xfd\x9f\x14Xa7\xb7B\xd9\xe3z?\xb4A\xb3\xc42G\x04\x8epN\xb4\xea\xbbZ\x80\x84\x15]3\xe6\xc0Q\xa5\xe3WO2\xfb\xb1P\x89\xc4\xcf2B\xa3\x7ft^q\x95\xecu\xbba/\x95T\xc6G\x17g\x9d\xa9\r\x9d\xc9\\6\xa6j\x1b\xbb&\xf4\xa4\xc7\xaa\xabc\xc4{!\xf6\xff`\xbf\xe0h\xaf\xa1:\x1b\xc8\xc0\x82\x15X~!\x0f\xdb\xdez\xc9\xd4\xd2i\x0f\x9a2#-\x89\xc3\x05$\\\xbb!\x92v\xbc\x98\xb9\xf5\xf3[\xd2h@\xdf\xed\x8b#\x1f\'R\xeb0\xda\x01\xd70\xb9\xafsB\xc6Sr\x81\xed\xea\xdd\xacUx\xd12\x9eb\x08\xcf;\xfduz\x1b\xe1eP\x96\x13`\xafg\xe8\x90\x80\x8a\xf9m~v\x83\x8a)6\x84\xa89!\xa1\xc6c\xf1\xf1\x97b^\xca/zm\xba\xb7\x9c\xd4( \xfe\x132\xe0\xf6]\xd35v\xeb\xa9\xdc\x06\xbfV\x96*\xcar\xc8\x9c\xf9\xbbjh\xfd"\xd6]\xad\xd6\xb4\xb4Y\xd7\x86\xf3\xe5\xde\n\x16\xf4\x86\xb0\x8a\x93\x97C\xf8\x80\xe1\xc5n\x96\xf7\xd0\xc3\x98 \x97:\xc0\xba\xd1\x02p\x08\x08\x14\xebR\xac\xf5\xe0\xfc(U\xe2\xf6\n\xd9\xa8\xa1s\xdc\x12\xf0F o\xf9/\x06\r\x0c\xbc\xd0\xc2AnH\xa7:\xb7\xd7(\x92.\xb5\x90R\xca\xa1A\xed\x12w\xef>Y\xc8E\x18\x03\x16_Ub\xce\xd5\xacF\xa0\xf5,\xe1\xed\x81\xe1v\xec\xe0\x15\xf0\x11\xd6\x04{~ao\xe4\x92\xe1\xf7zh\'FE\x04\xf0-\x19\xae\x15~\xd0n\xf7\xe6P\xf2\xa2n\xcb\xf5\x88\xf8\xd9\x80I\xfbV\x82\x83?w\x1eNl-\x1dA\xff\xd1\x9e\xa3]\x9d\x82\xc9\xe1\xbd>\xd2wU0\xcc\x12\xe9\x14\xc6\x84\xbc\xfdv\x8e\xbf\xd3\x9b\xb0\xc7R\x84\x93?\xac\n\xef\x00\x13\xa7\x10X\x1d\xcf\xd0\xa3\x9cQ\xe8)\xf6,\x0c\xf5I\xd8u\xbf\x19qO\xfde>\x03h_\xf1\x93\xb7\x1bb-\xd6\x00\xc1<\xd3)5\xbdv\x95\xbcbOg\x01\xc6\x1ab\xd3\\VQg\x12\x90*\x9aA\xaa\xe2k\x16A\x14\xbb\xb5`L\x1a-\n\xb2u]g\x0e\xc5b\xd9^\xa5p\xe5\x00\xc6v\xf92<C\xde>\x03\xef:\xe6S\x06\xe6n\xcb}\xf5\xa7r\x14\xeeo\xeb A\xce\x91\x07\xb3 \x08\rE\x10q\xa0%\xd4g\xdbPO\xd0Z\x9d\x1ag\x9e\xd8\xde\x91\xd2\xeeZ!7\xfe,gP\x19\xe2 \xf1)\xc8[\xa0V\xc1\xd9\x03\xa0\x81\x1ez\xafg\x9a\x06\xffWv\x8b\xe6\xbb\xce\x8c\x93\x93\x04.\xf3A\xbeY\n\xeb\x9f&\xc9\xc4`\xa9\xe1 \xb0k\x82>\x88^\x14\x03y\xd5\x07\xb6e\x98G\x0b\xb0#\xcaj\xa4\xbe\xa6B\xc1\xe9X\xc9y"\xe1^A\x14\xd1Z0\xed\xea\xb0{\xf8\xcf\xc9I\x1f>\xf2.\xe5\x10\xbe\x1f\x06\xfb\xca\xe6v\\ Oc\xc4B7\xbc;\xb9\x82\xdb_\x11&\x0b\xa1\xd4\xed-\x01\xe8\xfb$1\xb4"\\\xd7\xdf\xc9\xdaM\x16\xca\x1e\xf5S\xc7 \x15(@\x14\xa1\x8f\x96D\x90rL\x10\x0b\xd2\xc8\xb7\x0bV\x1bDy\x8e\xc9\xcbd\x02\xe5\xfdbhl@\x8a\xf7\xd2\xe4\xd5\x1d\xb5\x91$\xa5\x87\x89\xb4\xefZCN\x9c\xea0\xcc$^\xe3k/\xacFO=\xe0\xa7K\xcf\xa2\x14\x87\x83\xcdw\x9fo\xaco4\xfc\xe5\xf4\xf3\xaf\x7f\xa7\x85\x04Jw\xe0\xb3&\xd7\x8a\t0\xb4\x99\x07\x12\x15\x8d#\xc6\x87\xf0\x9c\xd2\xd4!\x1c\xa0\xd2\x12\xff\x03\xe8\x94)\x8b\x1e\xd2\xad9r\x1f\xc7\xe1#$x*\xeb\x04m\xeb\xa7\n\xf1\xfc=\x8f\xf9BPl\xf4\x89\xa7Q\xe4=\xd3\xeb\x02&Yr\x95\x84J\xcd\x14\xa1\xc5\x15\x99\xba\xbd\x89\xd6a\x91\xe8\x81*\xf5\xbd\xd3\xfd\xdb\x96\xad\xe9TO\xc1\xf9Q\xbd\x9d6\n\xe0\xab\x9c\x12bH\xe2\xf4Ci\xfc\xe5_\xe6A(\xc0\xab<\xfd\xb5\x00\xd0//=q\xc5\xdc\xd2\xf6\xd1\xbaW_!0\xa7\x15\x99\x19\xee\x9a\x8b`lb\xa1a"\xf9?\xab\x8e!\xab\xe9\x1au&\x89\xd2\xcev\x15h"A/`\x08\x9a\xf7L\xdc\xb5\x1d\x8c\xea4\x19\xb9\xf1W".\xfd\xc7\r\xe3/\x1d\xaa\xeb\x9a\x8b\xebP\xf1\x86/\xd3\x07\xb9hD\x8bzQ\xe7\x881&\x8f\xcfR\xf4\x97\xb5\xf2/3\xe2\xdd\xe6%\xc5\xe0\xe4\xf1=\xef\x88\xf8p\x01\xe6c\x12\xf6Y\xb4=\xd2\x12\xfd\x99.\x1e\x83\x93iv\xc1ZLZ\x8b\xbe\x98\x96\x96\x95`\x9d%~R\x98c\x8a\xdb\xbfaY\xf0\xcd\xe0\x18\xe7|\xa2\xfc\x82v\x04>\x1a\xee\x02a\x05\xf2\x90fIC\xd4{,\x97\xf0\x1fEX~\xbeI*\xa5\xc3Hr\xd7qpK\x91\x1b_\x04\x1e\xbe\xc0\x8a\xce\xf4%v\x11\xe1\xf9\xde\x88\x90q\x11l\xd8\xc5\xb7\x00\xbb\xae\x0f\x8eV\xb3x\xbd^\x010\x80\x1b\xe4\xf4\xfc0\xb4\xd7:\x7f\xbc\xb6\xf3\xfd\xae\xc9\x18\xdd\x9b\x80\x19\x94\x18\'\xc2m\x05\xfbv\x8cMO\xb5,;\xd4\x98\x96\xdc\xf0k\xf3y\xf7\x94\x17m\x9d\x15V5\x89\t\x13T+\x83Y#A\x90\xa6<\x0b\xd7K\x8f\xd9m\x85\xd6Z`8T\xe0\x10\x12\x08DM0]\xa5\xbe\xa9\x9b:O\xd4\xcd\x84|\xbe\xa6\x19PF\x853&\xb1\xc1\x17\x97F\xff8\x81KG=\xbd\xa4\xc5\xd9~\xbf\xe2\x07.S\xab\x02\x16~k^\xb4\x9c\xf5!\x9fE\x1duWI{c\x1f\xd3\x03\x10M:\xb5\xc1\xfcR\xfd\x89\x14J)\xb37\xb3\x11\x13\xca\\7\xe5\x16\xd8\xa2W\xf2\x88\x1dW\xcb\xf6\x1f\x0b\xd7W\xdb\x8f\x14C\xdf\xad\x84F9\xcbB\xbb\xecd\xbe\x9a#\xea`\xe64q\xe5O9\xce?\xa9\x8e*\xef\x06s\xdc\x86Z\x0b(\xe0X\xd4j\x7fx\xde\x1ah\xa0X\xb5\xd6\xea;\t\xd6\xf6\xc0NI\xae\xc4\x0f\xba\x9f^c\xab\xe2\x07\xae\x7f\x9dC\xb9\xbbz\xecX\x03\x9a\rY\x0c\xf3x\x91\xe6*|m/\xd8,\xff/\x0e\x8d\xac\xed\xc2\xf7e\x06~\x9f\xabQ\xf7\x98\xac\x9e\xd0\x18^\xaf\xbb\xcc#^)2\xb8\xfch\xc9\x97&P\xd8\x11\xe3\xf3(MU\x82S\x83\xc9zA\xdd\x8e\x06>\xa4\xca,\x8d\xae\xaa\xf0mV\r\x93w\x16\x9b\xfd?\x00\x94\xc3\r\x8d\xe71,\xee\x1c\xc1}\xac?U\x02\x9a\xf6P\xa7\xf7\x00\x16\xa8\xa0\xdcX\x1cs\x11\x0c\x02\x8a\x02F\x16k_\xbd\x1d\xa4\x14\x8d\xb4\xfa\xfa\xa0\x194r!UP\xaa\xf65\xf4)\xa5\xb7>\xf6\xf0L\x17\xcc\xee\'\x9d\xfd-\xbeZ\xb4d\x97\xeeP\x99\xe7\xbb\x19O\xafP\xba\xc2\x8dA\xe9Mr\x87\xbdB?\x1eM[Rt\xae\x9d\x9ciH\x81\xb7}\x80\x94nc\xc9\x05\xf7\xe0\xee\xf5\xc6\x1e\x94_\x16\xaa3na\xc9\x17\x0fn\xfa\x99\xa4\x03\xc2\xbdQ\x9ar)O\xbc\x00\xb1\xff\xb7\xe7\x0e\xdc\xb0L\xe1l\xa1\xa3@|!s\xba\xfc\xb2\x0b2\x1e\xc2\x9c\x95y\xac\xfb\x14\xcb\xd1`\x10\xff\xcc\x7f\xfa$\xab\x91\xcd\x95\x1d\x8cQ\xaf\x80\x14\x8b|\x0e\xc7\xddr\x95J\xa7fD\x93\xe8\xd6\xa0\x8c\xdf\xe7S\xe3d+w\x85\x1a\x85H\x0c\xc7H\xa1TpO\xe3\xc36\xc5\xb1\xd4S\xf6_\x11\x1e\x9a\x0e\x8c\xe1{\x91Kz\xb6[\x9c\x0c\xedV\xde/N\x89j\x7f')
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:13.634103
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd0\x0c\x00\x00\x12\t\x04\x00\x03P&\xdf\xdcv\x10\xf0\x05\x16,\xcew[\xcf\x08\x00\x00\x00\x00\x00\x00\x00\x00\xe03\x1b\xb2 \xd8\x8b\x12\xa9m7\x0b\xba\xa5nM\xee\xebD#\xc3\xc8\xe1\xfbt\x0e\xa7q\x80\x8fg\xf7\xe7n\x8b\x05\x8b\x8d\xc9$QZw\xac\xca3\xb66d\xcc`+\x9b|\x80\x00\xf2S~\xf3\x10-\x07_.!\xd6E\x8c\xbbS=\x18\xa9\xbf>\x95\xa1o\xbaO\x07!r\xb83\x8c\xc5\xcb\xb1\tc\xfe|\x1a\xc5\x13\\;\x9a\xa0g\xd5P\xeaW\xe5q\x0bX\xddr\x9bt\xdbW\xcbx\xb9B\xb9\xaf\xa9\xb3\xa1\x14\xf6\xcc\xc4\x7fpS\xa0K\xa3Y\x9b\xfc\xdfI\x95\x06\x85\x1e@\x94\xf2m\xa0\xe4\xc0\x7fG[\x9c\x0c\xf7&L\x8c\xbf\xef\x03]#M-jC\xbe\'C\xac\x13\xee[\xba\xa1\x83\xd9\x1e\x8df\x0b\x15\xaf\n\x00\x86\x9f\xaa\x86\xc4t$\xdf#\x9dO/E\x10p\xf8\xb4p\xfes{\x9a\xe944y\x88.\x9aq\xf7\xff\x01\xb5<\xaa:\xdd\xd9\x8d\xb9\xbc\xb1\xa5\x04\'\x19N\x90y\x8a\x17\xe1\xc5\x91\xee^\xe2\xd3\xdbY\xa9Bs\xe2\xe8~^\xf1\xb3\xd9\xff\xe3\xa9\x01U\x81{\xd6\x9a\x02+\xe1\xed\xf0\xf9\xa4C\x8a!\x0bQ\xe4\xee\xe9\xb9\xce\xe3\xb8\x8e`\xde\xed&#J)x\xe4\xe6\xefQ\xb3\xcc\xa0\x97&\xdb;\xaf.\xb4R\xedg\x17\x9c\x94\x86J\xf3\x17\xc0\x83K\xcaM\xcc\xcb\x88c\x0c1\xf1\xab\xbf|T\xfd\xd7\xfbu\xbc\xb17\xf8\x18\xc7\xe2\xb6\xaa\x1f\x10\xaf\x0e\x1e\xa2\xbd^\xaa%\xe3G~?\x98I\x81\xb5w\x83\x9f`H\x1bWiB\x0b\xc0AM\x0f\x99\x9e\x88\xe3\xd0\xd5\t*pi)q\xfa\xcc\xb2\x96E_\t^Bt\x9e\x81;\x9di\xbe\x12\x0f\xe5\xe7\xfb\xf8K0\x0e\xd0\x90\x07\x7f\xae\xabF\x18\\\xa7\xdaK6\xbd\x9b\x16X\xb1}\x8a\x99\x98\x7f\xd5\xc3\xb7|{\xce\xed\x97#\x97&\xec\xab/)\xc5or\x85\x94\xb9"\x8b\x93\xcb(\x1ay\x13\xd9Y]\xa5`$^\xc9\xec\x1a\x13Y\xf8n\xac3\x1b\x9eC&\xf2P\x1b\xfb\xbf\x80\x14\xd0\x98S5c\x80\xf9\xbb\xfa\x8c\xee\xd4\xa0\x0f\xd2\x8d\xc6\xab\x85\xec]\x88U}{\x8fR\x863\x1b\x80\x1a~\xbcy`\x91\x0b\x07\x0c\xdf\x13\xf9\x14i\xdd\xe68\x19\x86\xbbB\xc0.\x01y\x93\xb1\x90\x17\xcf\x83\xe9c\x17C\x8e\x86\x18,\xa0{\x9b\xb8\xd1a\xb5\xd0\xaf\xec\xe5^\xb4\xa4\xf1\x0b\x80\xc9#J\x180\x16\x0cV/\x9a\x08\xf5\xb9\x88g\xd6S\x1e\xd7\x02\xef\x0f\x95h\x9f\x96\xfd\x9a|\xc0/GD\x19\x90J\xa6\x10?\xc2XbT3DY6)R\xf7\x1e\xb1\xf7\x8b\x06r\x10\xad\xa5\x1a\xeb\xaa"\x9f2\x14S\xf2K{\xd9\x1f\xec\xef\\\xe8O\xef^t\x8b<}\x9e\xaa\xd4\xacT\xad\xe8\xbbN\xa3\x81\x1ej-\x18Nd=\xa0\x1b\\\xe8\xa1\x0e\xcd\xaf\xd7D\xa3 So\x11j\xdc\xe5w\n-\xe2\xd1h=\x822Q\xbc\xddr(\xb3 \xb5\xb0\xed\x8a\x8f\xd1\xb3.\x81\xc6\x84o\x16[h\x8f\xbb\x8b\x99K\xaf6\xce\xe5\xd2;F\x14M8\x86\xdc\x0f \xe3\xa7$\xab\x925X\x11}\x16O\x99\xcb\xb9\x92\xea4Tu1\x85\xe6l\x9c(\xfe\x9a\x8e\x03\xe2\xda%\xf8\x00|\xa7\x13\x8aI\xa0\x82#\x9d\x0c\xdeS\x02\xfe\xabp\xc5\x80\x83\x1eK\xf1\xc7\xba\n\xdc\x0b\xa6sd\xa6mK\xdb\xfa?]%\xc9\x7f\x04SK\x8c\'\x80\x13\xa1\xeb\x7fnWQsjnO\xd4\xbc?\xb9\xea\xc1\x90Q\xfa\x85\xed\x0f&\x17M\xe30\xf4\x89b\x02t\xb1\xcbB.\xd4\xf6\xe3tl\x96\r\xdc\xd7\xe2\t{jW\xad\x93\xc4\xb9O\x99\x88J\xda\xd9H\xd1\x1e\xe2\xd1s\xe2\xa4>m\xcc:T\x89\xac\x82Af\xca?I\xfa\xc3(\x82\x89-*eW\xaa\x06\x9bs?\x80\xf2\xad\x81\x1b\xed\x9c\'J\xbc\xbf\t\xb7\xb8?p\xccQg/v\xed\x08g\xacV\xa0&9\xa1\xd2c\xc2\xda\xf9d\xc8P\x06p\x94\x19oW\xe6-\xa4O@\xfa\xb1\xae\xb0\x8d\xbe\x95\x00N\x93\x11r\xd7\x8f\x0e\xf9Q\xe6\xef\x84\xfc\xc5\xb8:\xae\xd5\xec\x92\xce\xbfq<U\x90gY\xd1\x02\xdd\x98\x96\xf0>n\x8f\xdb2h\x00}RV\xb1\xbcZ=\t,\x9e(/\x07\x8a\x97\xd3\x17\xa0R@\xd7\x0c\xce\x12\xee:-\xc0\n)\rr\xd50D\xe5\xfc[\xb0\xfb\x86\xbeq\xe0%\xd2\x06\x9c\xc3\xe8\'\x7f\x9e\xfc^V\xf2\xa9\x82 %\xc1\x0f\x80\xce\xab\x02\x15\xfb\xf3m)!2\x06\xa1`8=\x7f|\t\x98Yt\xbb\xe0\x9f&\xea\xeb\xf5\xad\x94\xd3\x15\xfa\xb7,\xdf4\xa2p_83\x0c\x19\x90H\xd1\xc3C\x07b\x03\xbe\xcf\xb0\xe1f~5\xfe\x97\xeam{;{\xac\x11\xa1i\'\x1f\xdfF\x02p\xc7I\x8d0\x08{\x99\xbc\xf8\x97k\xb4\xa5 M.\xa8\xac\xb8+E\x03Z\x82\xb1\xbb\x01\x0e\xba>W\xe6b\x1f)\x17\xec\x18}\x92]\x9fs\xc2\xd4&\xcd/wAv\x02|_\xaf+\xfcgr\x1f7xS\xf0I+\xc50\x85F\x88G\x8e\x94\xd2\xec\x81\xa5\x00\xeaE\x90{U\xff\xc0E\xd9\x14P\xc24\xbaL\xe50\xc0\x1e\xe3\xf1\xe5\x13\x1e\xc2\x18bWL\x81\x1f\x12\x12W\r\xe9\x83z\xc9\xec\xb6\x9e\x8bS`\xf2,\xa6\xf3\x89C\xd9[_\x0b.q\xe7\xd2Q\x93\xc2.\xa0\xffL\x9a\x05\x9b>\x1b\xb7\xef\x13,K\x89\x93\xdc\xe1e\x92\xb6\xc5\xdd5F\x12q\xc2\xfa\x9f\xf7\xe7\xd2:\xb0\xb3%[y5\xfe3s\xa5d\xb3\xd1\x15?\x8a\x15\xcd}\xb1\x0f\xe5\x1d\xaa\xf5X\xa6\xf1\xcc\xe1\xd6\xee\x94I\x9fH\xe9lu\xa3;\xf4\x90&\x9eO\xea.\xbci\xfeON\x90\x01&`\xec\xa6@\xe3\xf1\'(\xc3z\xb6\xbd\xe6sOG\x03^(\xf1\xce-b+\xf3k\x03\xce\x17\xb2Z\x1e\x8e\x98\xa7YM\x00z\x16\xe4\xc4\xee\x91\x8c\x00\xaf\xfd\xb0tA\xf9\xda\x7f\x15\x18]\x83XQ\x0f\xe9\xcd\x88\xe0\xfd&*\x9f\x81\xc6\x13l\x1f(\x94\x94\x14\xd8\xc9\xa2"J\x85\x8f\xbc\x8f\x95\x91\xd2\xc5T\xc1|\x0e\xceY\xdf$\xc6\x02-=2\xa7\xac\xc9\x1a\x84Ou\x1b|\xd6[tF\x03\x05\xca\xb4\x1a)FGsqx\xd1\x01\xe5\x0f[\x14\x13R\x97\xcd1Y\x9d+z\x9cf\xc9\x85\xd9.I9U\x05\xfcc\x90:\xf6\xda\xe7\x04M*{\x13\xd1\xc5\x97\x0f\x87`\x9c\xf2Nd\xb0\x9b\xb4\xfa\x8f&R:\xc86\x97Y\xdd\xdd \x8dhKa\x85\xbbp\x1d\x94\x04?K\xb5\xe7;\x15\x18\x8e\x00|(\xdf\x071\xd8S\x13M=t\xaf\xc5\xe2V\x0f/\xbe\xa1\xd7\xe0[\x04\xe4\x96\x1d\xe7K\xf7\xf2\xd9%\xab\x08V\xa0\xe7b\xa0\x00\n\xc6A\xed\xe1\x01&0\xba\xc5\xb28\x80\xd3sUc\xda\x8b\xeb(\x05q\xcd\xd9N\xfc\xf2\xbb\x1aG\xde\x12v\xb6\x81n(\xae_d"\x86t\xea\xd4G\xda\xc4:\xddN\xd35fa\xb4\x89/m\xf8\xd0\x8d\xbb\x07z.+\x13\r\xd1\xbc,\x0e(\t$\x9e\x1dN\x08\x8f\xdf\xee\xe4\xef\xadF\xd3\xb1\xa9?\x03\x9b\xfb\xb5n\xc4\xd4\x0bPl\\\xd5D\xac\xb7\xa8\xf0]&Y\xbb~,\xe8\xae\x9a\x062\xfa\xf6\xf6\xb3|#D\xc6\xe9\xed\x96\xabp_\x05\xfc\xab\x89\x12\xac \x82wy\x9e\xa2\xea\xf1\x839\xee\x91,\xd4\x7fFQ\xefn\xc1\xc9\xa3\xc0K\x13\xb8\x10\xe7\x9d\xc5\x94\x0b\xbe\xf0;>zg\x8e\xf0\xedg\xc1G)\x95D\x07!\xffA;B\xa17\x98\x12\xf7,\xcfO\xaf\t\xfe\x84Upk\x96\xec\n\xab\xb4\xc2\x14\x98\x96\x88\xf3\xd8\x08k!\r\xed\xf5\x9e\xf4\x18jU\xde\x83\xe1 rX+\xf3~dz\xc5@\xae\xf1\xbc\xce\xf6\xfb\xa3\xd1\xb8PLJ\x95;\\\xadx\xfd\xde\x8c*\xea\xabsC<\xff~\x94\xfc6MnX\xcdXR\x9cR\xecv|\xd2)C\xa4[\xb0r\x9bQ\xd7VH\xe8v\xb6\xc4\x0c"\x04\x80\xb0\xc44G3,\xa5rv\x14Vb\xafKz\xe5uE\x8d\xd9\xdaaT8<\xd7p\xe3T\x04\xe6\xf7*\x04\xce\xb7\x15x\xabi\xdf#\x95\x8a;0\x18\x18\xf2\xd9\x8a\x7f\r\xfe\xc8L&\xe5k;\x86e\x94\x9em\xf4\x90\xa5F\xf9\xef\xba\x89\x1c\x02\x80!\xcf\xc0\xf7C\x19\x92\xdef\x89\x8a\xa9\xc6m|*#\xb18\x14\x16\x1cS\xb5\xcd\x02Z~\xf0\xea*\x13\xd5\xd3o\x1e%A\x00\xe8!`\xb5\xcb\xd2\x00\xab>ef\xa5\x99\x01\xa2\xf6\x98\xee\x86C\x08\xbf\xbd_\x86\x9f\x87\x9fs\xb6%\x80\xbb\xec~\x8c\xae\x1c>b9\x97\x12]6\x92OFp\xa9-P+\x83\xa9L\xd1A\x87\xb5H\xb0X\\\x96X8*g\xfd\x1a\xef\xc2/\x96S1\xc7E`f\xba\xa4\xe1\xed\xe3N,\xcf\x91$\x9d\x92f\xd6\xf2\x18\xc9\x905\t\x81N-\tV\x89`!H\xd7\xeb\xe1\xf5\x02\\\xe77\xa1\xf4\x8c\xbf\xbf_\n\xc7\x15\xacA\xe7\x8abl\x84\xb0x\x84\xd8\x98-\xc2oF\xfa\x8d\xd2\xca\x8b\x02k\xca\xc9)\xdck68\x87s\xec\xa4\x04\xb8y\x83\xdfF\x1e<\xf1\xe4\xfe\xb3b\'v\x99\xdd|\xc7>\x0e8\xf9e\x90qP\xe59\xb4;F\xa1\x956\xb2~\x81h\xf5\xda\xd3(R\x96\x069\x03Q<\xe8J\xba9\xe5\x8c\xc9\xd2<x\x19\xac\x7f\xc1J\xb3\x9chu\xf1\xec\xa9@\x86\xae2\x11dy\x009\x80\xdf\xd3Fi-\xc137\xd3\xad\xd4\xdbB\xef\xa3\xc4Bg\xc2e\xe5\x17/Z\\/+\x8ed\x92:\xbf\xbf\x08\x04\x80\x9d\x97\xee\xc8g\xb1\xa3\xa7\xa9#\xa9\x92\x19\xd9hw\xcc?\xfag&\xfc\x1b\xa9%\xce\xf0Jq\xfa}\xdd\xe6b\xcf\xc9\x82\xfb\xc1\xbe\xa5!\xea\x89\x13\x9c\xae\xe0d\x0c\xe2\xec\xd3\xf9=\xd9\xa9\xe7\xc2\xeb\xddv\x07"N4\x93\xf3\xdd@\x91Ti\xa8S\\\x95\xd8\x8d-.\xff\x1d\x92R\xdfM\x18\xce\xc1#nc\x1c\xa7\xddq\xd4,\x9d\xb2\xa2\xf4\xec\x06\x83\x15z\xe4\xf4F\xbc)~\xc0\x95h\xee\t\x84~\x9a\xa3\xe0\xc2\\\x9b\xd5\x0f\xd55s:`\xf43\xf91"y^\xa0\x01\xd1\xc3\xf8\xe4\xed\x1b\xbdJF4\xce\x10&Z\n\xe9\xffz\xb0\xfa\x10\x17i\t\x98.\x986\xf2d\xbaF\n\xbbF\x17\x88\xd4^\xb0i\tW\x92\xb8: \x04\xa8\xe0~\xbcB\xdc\xf8\x03\xb1\x88\xae\xbc\xd4\xc8\x06\xd0\xad\x1a\xfde\xde\xa1~\xab\xa64\xbeodC\xf6oQ\x11\x8b\x83\xde\rh\x9b\xe6V\xeb\xff\xe6n~X\x01q\x96\xbc\xf1\xa7_\xfc\x1a\xd0k\xf6Hf l2B\xaa\xba\xbe~e\x17\xb9\xa8\x91Fh \xcc\xdc&\xc6Jn\x0e\x18\x8e-\xd5?Zgz\xe2\xecZ\x87\x98\xd0`v)\xd8\xff\xec\xe2rQ*\xb4\xcbYf\x8c+\xb3:\x11u\xcb/\xd9\x04\x89\xf6.\x80N\xe6[\x13\x83iLp\xa3E\x90\x0ck\xac\x90\x1b\xac}qa\xa5W\xf5\xc2!\xfd}\x088\x9b\xbc\x19\xae\x0f\xd3gA\x84k\x03\xc3=\xc7\xe0E\xa4v\xbf\xf5\x7fP\x06i\xf9\xab\x81\x1e\xe8b\xf3\xb3\xb3\xea\xde\xef\xb0_\x9e\x8c\xd8\x8f\x1bKPu\x1a4\xff\x17z\x0f\x8e\xa2\xc6(\x96gMWZ3\xf87\xc6\x8bo\n\xf9j\xca\x88s\xa1\xb9\xdc\xb2\xb0\x13\xef\x86I^#\xe9b\x8f\xdc\x7f\x02\xe9\xc0W0i\xde\x8d\xd7\x96d\x12\x84\xd2\xe3`\xf4;\xa5.\xadF\xa7Q\\\x16\x07\x9a\xdc\xc6\xd1\xdcHN b\x14L\x89mw\xa6!8\x12\xd1\xf3\x14\xa6\x9a\xbc\xeax7%W\xbb|\x83\xd6\x05A\xf0\xf6\x00\xd6\x0f5\xbf\xff\xb7\xf8\x82\xf3\xfb\xdc/\xbcCx\tt\xa48\xe4W\x07\xef\x84{\xa4\xe1o2S\x13\xea\x93\x9e4\xea`\xc5\xda0]\xea\xd8\x8ap9Ub\xcc\xfd`\x92\x8f)\xf2%\xde+\xde\x97\xd3\xab\xb5\xefC\x8d\xc4$+\x05V\xd8]\xb4^k\x00\x05y\x14\xc4\x1bD\xc39\xbd\x97\n\xc0!|\xbe\x96 \xaf\x01=u#\x9d\x1awJ\xdf\xd9O\xc4M\xe4\xa2\x0f\xb4\x9a\x1eN\xc4\x9b\x03oW]\x92\'e\x83\x17\xfd Wf\xaeN\xdb\x1e\xd8/s\xc4\x07\xc3\xcd\xd7z{\xbaeO\xd7\xf2\xd9f#\xa7\xf7:\x00\xcf\xce\xb5\x0c`y\xd0\xbe\xe1\xe77\xad\xfcf\x95\xdf\x17\xdd\xd0Zn\x8b .\xa5Z\xdb\xebS\x18FM\x0e81\xac\xde\x13Jz\x89\r\x138\xf9\x93\xb1=\xaeN8\xfdO\xafRC\x93\x87\x7f\xaf\x1f\x00\xdf:\xf9I|\xf1@\x1fS+P\x8au\x08\x00z\xd6\xe4\xf3\xa4\xc9\xa2\xc1$f/\xec%kPOU\xbf@\x07A-\xc2\xefS\xf0\x83\x94e\x1d\x00\xc9\xe1\x07\xe3\xb8|\xb5\xf5ks\xf2\xe9\x95q\x9d\x10<\xb4\x92\xd1\r\xec\xc1\xa3\x89\xdcR|o\x89\x9c\x17`\x92\x13Ei\xcc\xbf\x82\xed~\xfbWq\xc7\xa1\x8c\xf1\xe5$\xd5R\xf8(\x92\xc9\xe7\xdb\xabC\xb3o\xa0n\xa7\xf7\x12\xb6p"\x8f#\xe4\x90\\}I\x8b|Xu5ULy\x0fb\x13&\x1d\x95\xa3\xcdI2+c\xefxh\x11\xe9\xd3\xbc\xcf\xfc\xe9G>\xa7`\xea\xc8\n#\xe6\xe3\xd9\nhV,\xee,\x03|\xbd\xe4\x0eg\xa7>\xf2\xf9/\xd3\xc0VS\x83\x8eR\xa7oH\xa2\x9bV\xe7\xde\xa2n\x0b"\xc1\xec\x91\xb7v\xcc\x10\xbb:f=\xb8\xe3')
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:13.658781
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9f\t\x00\x00\x12\t\x04\x00lq\x83\nN\xd9w\x1c\x13-\xf9\xab\xaf04/\x00\x00\x00\x00\x00\x00\x00\x00T\x04Xo\xed\xce\x01\x06\xdc\x84\x8b\xa9\x93Y\xf3\xfbV\x1d \xe4\x9c0\xb1I\x92\xa2\xb65\x89\x8b\xc1\x9f\xf6\xe7\xaf\xb3\x06\x02\x85\xaab\xd7\xf2\xa6\xbe\x8aQ_\xf9\xbc\x07p\n\xc7\x1e\xa1\xa6\x9c\x9e\n\x00\xc8qE\x97\xd8\xb6\x92\xe2\x13\t\xbck\xef$ZT\x08\xac\xcf&\xb8\x18\x98\xd1\xc1\xee`\xe0\xe1\x03\xf8u%[\xd1\xa3\xe2\\6\xe4\x01(\x9e\x1b\xe0\xf5\xa6\x1e}\x9a\xb7\xf0\x94\xe3\'\x1f\x04\xdb\x9aXnG\x06\x80\x01\xcc\xaf\xb06\x95\x04\xbcM\x8eP\xc1\x8bD\x98\xca&e\x01\x02\xaa\xa9\x05M\n\x81\x83\x81>\xe0\x14\xfa\x17\xc0\xc7#\xe5}\x04\x1a\xc3\xc5X\x96\xbd?\xff\xbb1\x1d!\x82\x97\x92\xd7St\xa9\xfaG\x1d\x83\xe1\x93\xe6\xee~;\x1a\x02\\\x88\x10\xdf(\x82\xce\xf0\xe2\xdaA+\xae\xe9H\xf3I\xe7\x18\x01\xc2e\x85\x7fD\x03\xae\x1b\x97\x86R`Y\xed_\xb3W\x11\x15r\xef\xc9*HCK\xe4$\xa5\xc7\x8a\xa0u T\x12\x84\xc9\x1e\xcd\xb9\xbfhj\xcaiZ\xd1\xf1\x17\x0b+\xd0|3\xd2"j\xc3&\xcd\x89CzS\x85\xc6w\x90\x88K\x03\xf6\xa3\xbc\xa6\xbc\x12\xb8\xd2%Q\xd8\xcfFYK\x12\xaap\xf8\xbc|\xd1\xe0\xe8jjW7G{!W?<\xf4\x99\xc4|}7\x8d\xfe\xfdT=\x81P\xea\xe9\x8c\x01\xb6\xabC\x0fr\x10\xad7\xfbu`\xe3\xac\xd3\xe9\x18T\x99@\x17\xe6\r\x80\xed6\xfb$\xd5N\xc3\x83\xe6y\x98{\x12\x9a\x86\x05\xc4cv\x10\xbav$\x98\x1f\xc1\xf6\x8f\xb4\xf7\x85\xdd\x9c\x13\xcc\xa5K\xd4~\xac\x9eQ\x9b\x85\xfe\xa3S\x81\xeb\xfb\xbd\xd2xn\x05\xe4\x06\x1a\xdb;\x01=\xc86\xafN\x96^\xd2V\xb4z\x89\x7f\xb61\xf7\xfc\xe8\x80rQ\x81\x91+\x13\x8br\xd8\x7f\xfb\xa2G\xfcc\xf7\xfc-uURO\xac-\x8a\x85\x87\xa7\x16\xdd\x8b\xff\xcf\xc5\rYz\x00\xdd\xf0\x0fB\x0cP\xb8\x9f\xd2Q\xafa\x96\xe8&P\xc9\n\x08\x93\x92Z\xe2\x0b)\xdb\x13\xd3\xaf\x8dY\xda\x99\xa0\xe5"\xfbY\xcdaM)\xcbl\x83 \x0c\xc8\xe4\x1eA\xd3Z\xfb1\xd6\x8dS\xd5\xd4\x99\xd5\x84)ti\xa8|\xd7`\xf3\xb6\r\xa0\xff%\xca\xa1,\xd6G\x81\xfat\x00\x81\x1ey\xce\x92\xdb\xfa\xec\xbf;\xf9eZ\x85\x140\x01?\x802\x85\xf4\xa8\x9b\x85\x80\xcf5\xc8\xdf\x91V\xae\x95 \xc0\xa7\xd6ro[\'\x10\xc2\x0e\x9d\\6\xefh_C\xf4\xe8\xe7\xbfOZ*\xc2(Ac\xd6\xce\x92\xe9\xdc\xef\x93\xedu\xf91\xc2 \x0bu\xba\xdd\xb6\xaa>\x82e\xb2H:\x06\x0f\xef\xef#\x10\xa1T\xcf\x85W\x80g\x83\x84\xc2\x19\xd9\xcf\x8f\xf5\x9c\x87|\xcaW\xfe\xf3d\xbd\xb1\x81\xd8H\xbe5\xc5/\xcc&\xe5\xca\x01+@V\x0f\xe0\x00{c3\xc6?\x8b\xf0\xb0\xe0\x08\x14\x02\xec\xa8\xac+\x96&\xb8\xa6\xde\x7f\xc8\r\x08$0_>t\xe1gc\x901^\xf6\x83\x01\x96\xfc\x7fD\xd0\xb7\x92\xbf\xb5\xa5Z\t\x1aB\xf9?[V\xc7o\xe7j\xe3\xb3\xdc\x83{k\x87\xec\x17\xab\xb07o\x13\xb4\x86;\xfa\x9b\xb9\x81\x16\x82\xe7\xde\x84l\xd7\xa6\xc8\xec\xf0\xf0$\x12\xaf\x98\xb4\x81\x953K\xa8o`o}\xf0@\xc3\xbb\xa2T\xfc\x90\xe4\xa3\xd7j\xfc`Y#.\xb1\xf6\xb5\x80n$}\xedl\xe8\xd0\xf8\x90\x92[\x83\xa4\x83\x89\xd6G~\xd1\xc1\xe1\x10\xbd\xf8\xddGJ\xfa\x10\x1eQ\x0b1\xe7\x1c"\\Y\xd8p\xdf\x8e&Q\xbbA%\xec/r\x86\x0f\xa0\xcf\xf2$\xdf\xe3\x93\xa1\x03TxX\xf5nB/\xb3@\xff\x12W^Ab\x00\x0c5\x0c\xabg&\x84v\xae=\x80\x0cJ\xf8\nu8\x876\xe4p]\x02\n\xa6H]C\x01\xe04sL\xdf[Q\xec\x8f\x19\x82_f\xc2\xd17\xc65\xd9\xdb\x98\xf0\xa0\x05\xb7U\x18T\x9a\r\xb5%\xe6\x8ekM\xcb`\x0fh<\xb8\'/D\xb8\xb6\x179\xcdZ\xe19\x9c\x8f\xe7\x033\'\xd4\x1f3N\xd3\x88\x90m\x10\xd5\xd1J\x95\xba=\x0b!\x00\xd2\xf3pH{6\x9bG\xacT\x9d\xa2\xf6\xf5\xcb=\x954N\xfb\xba\xf0!\x81\xa6~\xfb\x12\xe5\xe1A\x026\x0cn\xf1\xa9A\xd2\xb3\x1a\x0b\x7fu\x9ee~\xf10r\x81\x9fByF;\xc0{\x125\xbe\xd7$\xc9\xfer\t\x02{&Z\xc3\xb3\x9d_\xd4j\xfao8\x0cJ\xf0mjR\x80\x86\xf9\xd4\xd9\x0f\xffH\x0cM{\x1f\xac\xf8\x07p\x1f\xe5ka\xf6\xc0F\x82\x8d\x90 \xd0\xe9\t \xf2b\xefn\x1c+e\xce\xf6\x82\x88d\x85D\xb1\xf0v\x1d\x83\xa3\xec&eDi-\xb2\xb1h&\xab[\x0f]\xa4\xb2\x8f\xfa\xac\xa8\x15\x88\xbf\x1e=\x96\xd0\x1b\xc7\xf7~\xfbeKx\xcf\xc87\x16 6\xd2\x15\xe9\x7f\xc2\xf0s\x9a\xd8c[\x85\x90U\xf4=x\x04\xe7\xedmy\tD\xe6\x1e\xd4V\xe8 4\xc7\x91\x8d\x13:b\x9f\xff9\xb4q\xef\xbd\xd4I\x05\xa9\xad\xff\xa2\xbd|\xf9\xc2\xd9\xba\x89\x870@W)\x8a\x01o\xd4\x1c\xa1\xa4\xceY\x00\xf2\xd7\xa5\xd4\x82k\x05\xa6\xcf\x05M\x85\xb1\xe7\x80\\\x0eD\xb4\xcf\xbf`C\xaf\x8a\xc8\xab/\xea\xba\x91^\t\xdb*\x1a\xc8j\xf4\x11S\x80\x87\x1f\x8a\xa1\xb1w(\xab~1\xc5\x82\xedd\xf0i\xc5V\xfb\x12\xf3gG\xda)\x19o\xcd\xfb(\xd5\x9f\x18}\xb2+\xb8\xb6\xe8\xd5\x02\xaf\xb0\xedC2*\x94\x9b\xba\x8b\x9a\x9d\x18\xc4\x04\xdb\xa0\xf8\xf9^\xc8\xf2W\xe3\xa4\xdb$~3\xea\xe4\xc9\xe0X\x97\x15?\x11UE=%\xec $\xf5\xd4\xbd\xfdB=\x05\x93\x9c\x85la\x0fN\xa4\x00\xef/\xe7\xfeJ7\xd2R\xdcd\x1d.\xc0\xf5\x853\xadV"~s\xa9\xf3\x9e-en\xda\xa6;\x94\xed\xf1\xf9,p?E\xf2\x8f;\xd4(xQZxV\xf3a\xda&[w\xba?\xc8\x0c\t\x1b\x83\t\xa2\x0c\\\x81\x94u\x9e]Q\xe0\xb1]\x81\xa7\xddM1\xee\xe0A\x92l\xd4\x9f\x81\xd5#\xd4\xb9\xe5\x83\xfa\xf0\x8e\xd5\x84\xef\xe0\x11\x13=WSMq3\x9afr\xbb\x8b{\xe83\xfe\x9d\xa4\x8a\xbaE\x92\xa4\xb0I\xb5\xc7\'\xbf(\xee\x92\x91\x11\x81\x7f\x0e\x99gLj\x1e0G"bK\x8f\x9c\x04\x19\xdf\xa6\xbe\xa3\x85D\x13\xa3\x8dC4\xa6H\x9e\r\xee\x01\x13\xe4qO\xe3\xd1\xf8\x98\xe8\xdc&\x80\xae\xe5\xe4\xc3\x16\xf3J\x04\xa6m\xb8Bk@\x98\x10\xc3It\xa6\xefZ\xa6\xcd\xf9p\x00wOy\x14/\xc6\x98+\xb5(q\x86\xba;M\x80\xf7\x01\xc3\xf5\x84\xff:\xce\xc1A\xc4\xc4\r3\x83v\xa6\xb4\xfd\x13\x98\xc48\x9aI+\x89:\x89\xb3\xfeD$\xd4K\xd5!\xdb\x1d\x01 \x14\xb5\xd4\xb0\xa4\xccL\xe2b\x95\x14\x12\xcd\xdfD\xe9\xa3\x083Z\xe1\xe3\xbf\tW\xc6=W\xd8\xfc\x01\xf2\xd1\xd3\xa5\xfdkJK\xe1V\x16\x04\xe0\x11E\x17\xa8\xf8\x96fRDj\xd0(;"\xf4\xffZ\xc9\x8fn\xb1*Af\x7f\xa5\x1e\xf0\x1aJ\xa9\xc9e^-\xf1i\xb2\xa0z\x00u\xe4\x98\xb2\xb3>b)EgA\x92\x8d%\x83\x8f\xb2\xb8\xbeC\x88a:+\x91P,\x80$G\x9a\x16\x12\xb6\x87y\xeaOg*2\xca;\xb9\xa9\xe6\x0f\xbb\xe7\x1e\x0f\xb5\x90Z\xe8U<\x17N3}\xa8\xd2\xf7,\x03\x0b\x1d7\xca\xa0f\xd3\x12\xc0H\x03\xab\xea@\xe2\xbc\xf2\xa5q\xbc\x04\x1d\n\xe0\xa6I}\x1c\xca\x16\xfd\xac\xc7\xa9\xa9\xcal\x82g4%\xb6\xc5\xa4$*N\xf8i\x8c#\x99\xd1\x1c\xd3\x8eC\xad\x831\x8f\xd9\xefg\xadQ\x15+\xbfY\xb0m\xe1e^)\xd3\x8d\xdb\xe5\xcb\'\xdd^\xc9\xb1\xbbN\xea\xdey=\x8b\xe9\xe8\xc7\x8cz\x81\x80\xb5tt\xa4\xec\xe0jB\xde\xc2JZ\x1d\x96\xe1-\xc7\xfd\x08\xb1\xf2\xbf\x8b\xb6\xda\r\x98\x1a\x06\x0b\xbdP\x84\xdaW\xe7 y\x80\xd1\xcf\x15\xb8\xbd{,-\x88v\xf6\xf0b{\'\x15\xa1%\x1e\xd6\xeb+|\xd7\x1b\xbf\xd5\xa7\x14\xad/I\x87\xc5\x03\xb7B\xb2\xa8C\xc6\xff/\xd6e\xbe\x1e[\xfe\x0f\x9d\xee\xa1M\x00\x95\x13Y\xca\xc3S3\xd1\n\xff-"\xe1\x9a\xd1p\xc2\xd8\xd3T\x8f\x951p\xbdq\xb3\xb4\xe6\xf9\xd3B_\x0e\xf4\x9eL\xec\xe0\xaa\xec!<\x1d\xdd\xe3R3\xa3(\xd3P\r\xae\xf6\xeb\xeb\xa6Y,\x8d\xb6\xf6r\x19bJL \x15\x120\x07\xf7R\x8f\ri\x9a\xecb\x9a\xd4\x07\xc2\xe4{\xcbe\x86\x84\xeb\x9e\xf4\x85\xa3Q\xf8\xda\xd1\xd7\xb40\xcbu\xbd\x91mmY4p\xe6\x91\xc6\t\x15\x17\xcbVzh\n\x7f\xaf\x0c\x11\xe7\xb9\xe0%\xe12\x83\xc3QgN5\xbcR\xf6\xd5\x80\xa0V\xe7\xbd~~$\xb6>\xa2\x11\x07\xb9W\xab\x86\xf5Wa\x90\xcb\x94\x9c\x07(\xb2hPZ\xeb"\xaf\x93\nO\xea\x8a\xa2JmD\x01\xff0\xc3F\xe7\xc0\xeca\x8d\xe1\xab\x90\xc8)\xea\x16\x16Vc\x99#\x8a\xae\xf5>3\xdeU\xd2\x05 \x96\xbb\x1d\xd8pR0\t\xfd\xa0\x12\x024.\x92\x90\xf6\x0cu\xac\xa3\x1f\x97\xc7~\x90T{\x82\xaf\x18,U\xac~\xcf=\xc4 \x8c*\xdc\xe8\xdal\xa1\x1c\x1ch\xca\x8b\x10\xa2\xbb\xf6N\x87\xf0y^\xfdJFy\x7f\xf0pIO@\xfew\x81\xdf:y\xd6\x1b\x05\xd2\x8f\xa1}c0\xcaMO\x86\x05\xb9\xaa\xe9\x10\xe8\xe7\x9bEp+$4?\xf5\xdd\xd4\x99\xa0<\xa8s\xb1\x07\xc1\xe6\xb9\xbbL\xd8\xa49p\xff>g\x87\xf2\xbb\xa9\xb6\x01#\xdd\x81\xd7\x17]\xaa\xcf\xdff\xe9\xd7\xb4\xad\xfe\xc1\xe3\x93\xcb\xa7F+\x8e\x0f\x15$\x8b(v\xe6\xe0\xfdr\t\xb0`L+-\xca\x0b\xfe\xb4~\'\xc4E\x9aVy\xc7\xa4ZX\x87\x10\xc4\x0f\xd8Y\xa2k[\x08\x02\x81\x19\xc1\xb6f\x15\n]F\xe5\x90\xa4\xdb1\xa1_\xa6\x9fjsnu\xc9\xfc[\x88IJ\xea8\xa0\x93')
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