hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev66__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 (77) 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/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/clash_config.yml +1 -0
  58. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  59. hiddifypanel/panel/user/user.py +233 -3
  60. hiddifypanel/static/css/custom.css +6 -0
  61. hiddifypanel/templates/500.html +1 -1
  62. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
  64. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
  66. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  67. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
  68. hiddifypanel/xray_api.py +109 -3
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
  71. hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
  72. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  73. pyarmor_runtime_000000/__init__.py +0 -4
  74. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  75. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
  76. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
  77. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,124 @@
1
- # 2023-04-08T16:23:32.205088
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\xf4\x16\x00\x00\x12\t\x04\x008\xd2\x10\xfa;ju\xa4\xc7<-\xea\x15\xbb\x8a\x86\x00\x00\x00\x00\x00\x00\x00\x00\xd1O\xe3\xc7\x9d\xe5s*e\x87\xa8\xa8\xfa\xc3\x82+\xfcl\xf6qq\xc2\xdfU\x86\xaf\xd2\xd3PV\xdf\xc17\xe7N\xe0}\xd1i\xfc\xbc\xfc!U,8x|\xda\xc2\xb5\xfc\x1aW\xb5\xd2{\x1b\x0b\x83t\xc9G\xdfT\x81\xf7O\x9c\xf8\x0b:\xa1X\x83)Z\x06\xdc\xb9$\xf7\xc0\x06%P\x1bY6i\xe7b,\xfc\x92\xb0\xea\xab\x13c\x05|bxgY\xbd/\xf0\x11\xf2\x92\xd7\xce\x04"\xed\x86[\xfd\xab\xa41:\x05\xe2\x96c40\x08\xf0F\x184\xd8\x04\x88\xaf\xb8\xbd\xef\x8e\xea\xd9@wMV\x1a\xf2K\xb0\x9bM\xce\x1e\xef\x0f\xd9\xb5!Y\x8e\x1f\x19\xa6\xeb\xb7B}Gr\xe8Z\xbf\xb7T\x01 IZ\xe7\xc0\x88\xe1\x7fL\xc7\xf67^\xf0\x99\xcf\xda\xb4\xfa\xf5e\xed\x14\xfc\xfcK\x0c\x0by\x80\xadG\x01[\xef\xf6"c}\x9f\xb5\x85\xfeC\x10\xcb\xa1\xcf\x80=\xbbn\rR\xa3\x0e\xae\xb2\x9e\xbdj\xe7|N\x99K$\xbe\xc4e\xc5=~w\x90V\xd2\xa9\x0c\x9a@\x80\xa4\x87\xfb\x03y\x80\xa0\xd6We\x8c\x95w\xc0\x9a5\x9dt\xc1.\xb4\xf67t@\x86\xfa\xad\x1c\xeb\x9f\xd8\xaf\\H\x1a^v\xfb\x15\xf4\x9a\xab\x8a]\xa4\x90"-\xc187\xd6\xe2 o\x8e\xe7\xf8Y\xca\x8a\xb5\xda\xba\xa1\x00\x9d\'\xa2\x80|/N\xc3\x8b\xaf\xac\xd5\xef\xbe\x12\xca?#\xc9\xa3\x8eW\xa2\xe1\xc1\xaa\xdf\x00\xe8\xf3L\xb0\xea\xdb\xd0\x1cI\xa2\xa5S\x87\x8c\xdc\x10y\xb8"qAp\xc0q\x89\x86\x13)n\xccq\x84\xca\xc4\xd4<\xab\xbd\xe8\xf3\xbe\xb5\xc0:\x90\n\xaf\x08E\xd7\x89\rs\x7f"f$\x8fV\xa9\xdf&\x89\xde\xf3\xa0\xb3%E\xad\x9a\x19\x9alo_&\xb0@&\x03\xbe\x05-c \xd9@\xc1\x9f\x03i"\x0e9&#=\xb4\xe3\xb4\x01\x1e\xa4\xb0 \x81\xcd\xf0&\x7f^\x94\x08\x85\xb7\x9f:\x08v4\xb2f\x9c\x9c\xda\xbf\x9a3#\x98(*$\xf4s\x11\x9d\x0c\xbf\xd0\xd8A\xca\xcbj\xda\xe3\xdbg\x16{\xaf&Mt\x99\xeam\x8eK\xf7\x91\xf4l\xdbM?\xfeofU\x1d\xa5\x9dQ\xe1\xc3Zg\xdfoL\xa3\x87\xa0\xd9<\xc4;\x1dr\xaa\xdciA\x03E-\xd3\x94\xe0|\xcc}\x15\x10Zm\x94>\xc0\xdb~\x03\xb4\xaf1#\x84\xd50J\xa3\x00\x90\xca[\xa8\xed\xf92\x10\x98\x15F\xd7Mem\xf0(0\x16\xec/\x0c\xcfD\xb1h4\xbe!\xc6\x9e\xd5\xae\x02\x04n\x14\xba3N\xc7\xd1\x02C\xed_\x8e\x13\xe7uf%6\xa1M["\\\xc5%F\xbf\xb1\xd9\xd8"V^\x10\xcb\x9c\xe1=@\xc78a\xd8\xf3\x9f8!BV\xe9\xbfj\t\xe9\x93\xbax\xbf(\xb3\xd2\x91\xe4\x0ex\x1e\xfd\xa5\xcf\xf9\xcc\x15\xc9z+\x8a\xd7\x8a\x8a\xe7\xdc\xaf\x11\x83A\xd9R\xdb\r\xd1\xc5m\xc9:@d\xd0O\x8e\xbb\x0fD\xa1\x00\xee\xaaa\xf2\xc7\x8b\x10pD\x83\x85&\x90\xa5\x10\xc6\x17X+\xf8o\xfb\xa0\xfe\x8fJ\xd1/\x0cUGK\xbc\x15L\xab\xd4%\xa6\x06\xdaL\xa9\xe6[\xdcw\xeci\x12\x87\x0f\xdf\xf7\x02H-\xa9\x92j\xb4\x14\xcf\x14\x05\xfc\xf8\x87\xfe\xe9\xbd\xb8\x97:!%`\x8f\xe7\x15y FV\xd06\xca\xc9\xcel\x9d\x03\x9fF\xe5\xc1J\xb1\x95\xdc\xa5\x14v\x8c/\xec\xdc\xc0\r\xb9l\xd7\xd4\xa7\x01\xc9f\x07\x94]A5\x95\x14\xd7\xb0y\x83#\x90\xfe\xe7B7\x81\xff\xc2d\xe7\xdc\x8b\x18\x80\x8d\x91\xbe;\x17\x1d\x191\xba\x91\xc3\x99\xcd\xc91\x02My\xfcA\xf9l\xf9`%r\xc84\xe8=\x03\x01\x14\xc2\xeaU\x0f\x9e\xe3t6\xdb\xb1\xb8V\xc1!*\x14\x01\x10\x0e\xec\xe6\'\r\xe57\xd3Tgu\x03\x99qC9\xda1\xb4<\x93\xb8\xc8\x1e\x9b\x1f\x81e\xc87\xd4\xa5\x8a\xcc#"\xa5B)\x1al\x17\xe2\x85\x0e\xceq\x94h\xf5\xa4\xc5\xf5\x19,\xe9\xf1\xcd\xcb\x04\xf144\x17\x9f\rN,\x1eN\xb6kT\xee\xda\xb1\xbe\x11\xe6\x1c\x14o.\'\xa3\xd8J>\xda\x8a\x85h\x9b\xd5g\x8e\x87\x81\xb73\xdc\x1f\x8d\xae^\xbd\x99\\\xf3PVP\xac\xd4\xfd\xb9\x9b\x00\x15\x82\xb7\x12\x80\x94\x1d7\n\xe9)B\x86\x16\x01\x0e\x1b\x1d\xbb\xe5\x12\x85+\xbcg\xce\xb6\xb0\xc7\x93\xc2\xafIJ\xfd\xb0S\xa4\xe4u\'ZS\xaa\x86*\xdb\x86\xe7\xea\x93\xc5c\xc8\xd48\x82\x07\xfd\xd8\xa9\xbflbb=\x0cnjN(KNC\xfb~`\xe7KZ\x97\x01\xba\xbf`bra;\x00t\xfc\x17\xaa\xd0\xa1\x0e\x16\xd0\xb9W\xeb6T`\x1c\xf8\x15V\xf0\xcd\x83\xe6G\xd2D\x91\xc6:\x06"\x91M8"\x10\xe2\x00\x05Sdr\x8a[\t\xb4jx\xe4FV\xafp&\x06\xb5{8\xeeT\xbf\x84W\xb2\xe5\xda\xe2\x1f\x8clf@6:(y\xbak\x91!\xf7P\x87\xda\x00"\x00\x8a\xe2p\xcbN`\xd9\x85)\x81\x0c\xa6\xb1\x14\x9a^\xdb\x10~4\xa8\xcc\x1cw\'\x9a-\xdf\xf9_\xb0\xa7!\xc4\x0f\xe5\x16\xeeP\x06w\x97\xf5:3\x1e\x17\xca,\xfa\x88\xe8\x94|3\x03\x86}.\xee\xce\xf54\x0c+<yTs5\x86\xb8b\xe6\x03 TYW\x1aia(<\x80\x8a\x95a\x96v\x18Yp>\xd0\x15\x94\xab\xd3\xd90\x1c\xd7\x1e\xfaR\xf5\xcc\xfa2\x7f\x1f\xe5\xa9M\xb6\xbb}\x04\xfdE\xad\xe5\x0e\xfd\x98\xfb{\x96ba\xa2\xae\x9d\x8dn\x83Y\x1a&{\xb4\xa1/8\xbe\xd9_t\xed\\d\xd6dA\x9c\xa3\x14\xd3DX\xa2e\xe7\x1f\xcd\x04\x1aWu\x05\x084;\xc0\xdd\x03\x19\x81\x16<\xbe\nz+\xe14\x1f\xb5\xcd*\x19mR\xcd\x8d?a\xaf\x8f\x1a\x89\x02\x8c\xe0\x8d\xb7\x9f\xd7\x9e\x88\xb9\xceG\xb0\xbbRnF/\x9a\x16\xabQ\xd1h\x94\x9ao\x809\xb8\xa8\xab6e\xc5\x0f\x88j\xa3\x9f\x0e\xec\xce\xe4\x8e[\xf3H\xeb\xb8YW$\xbc\xd8\x06\xc75\xd3\x0f\xf4\xf3{!\x8e\xd9\x0bg\x1cBmy\xa4\x93\xfb\x80\xad\x86\xd9\'\xf2\xb5\xf5\xca\xc5>\xaeZo~\x83\xe8\xe8\\\xb2Y2\xfd`\xbcy\xf8\xc6@"\xd6\x86n=\x08M\xcfG\xdb\x91\x1d^\xe8\xdc.\x89h\xc8\x17O\x98\xcd\x18\x8b*&\x04\x80\xfc\xa1v)\xb9\xbb\x91\xf2\xf9\xe5\xf3\x87\x13X\x15\x12\x94\xf9\xdcJ\xb2\x01\xa2c\xc6\xebQ#|\x18-\xf15\xe1a\xd7\x1aO\x8e\xb7a \x1e\xf4Bic\xc5\xc7w\x81mUJ\x1c\x05\xaf\xbde\x1c\xd6W\xb9G\xcdBO\xc8\'\x7f\xff\xdbf\x05\xb7\xc1\xfa\xe0\x13hE\x1d}\x99\x16\x04\xf9ue\n\xcd\x91\x02\xa0\xdb\xed\xcd\x94C\xe4\x02\xc9 \xfb1|\xc9\x03\xdf<\x8a\xf99\xdd\x89\xea\xb6\xb3\xb4T\xd3L\xee$`\xb8\xcc\xdaq\xef+\xb2\xfax\x98\xb2S3\xc9%\x92\xbfG\x08\x03d\xc2\x02\xa3\xcbx\xe6\x9fz\x14[9b\x13\xda2\x0f|\xd8JY\xbf,\x96\x9d\xf2\x11\x07o\xbe\xe7mM\xdfb7\xf8\x84\x81\xa3R\xb7\x95\xbd:\x80a\x18\xe0[\xeaRcN\xa4\x88D\xbb\xec2\x00\xb7)\x84\x1c\xec\xfc\xa0\xa5D\xa0\x1f\xd58\xc6%\xf2*\x10"\xf4\xc4\xcc\x80\x93\x0b8\xa0\x07\xbd\xa2\xd4#,>\xf4\xaf+\x88\xcb\xb2\x8b/\xc4\xb9\xc4<M,\x08T\xf6\x12\xd0\xc1\x19\xe9\x85,Y\xd4\xf8\xeb\xac\xc8\xd5A\xeb\xd4\xf4\xc2\xfc\x11\x9b\x16\xba-\x13\xab8>\xb4L\x12`\xaeK\x1d\xfe\xb9\xa8G=\xa51[\xb5E\xbdN\x81\xebe\x08\xdb,sVf\x8ahr`\xcb*\xf4\xech\xbe\x1a\xea-L\x05\xa0c\x18p@\x1d\xbe\x89;\xf6\xaa\xfe<\xca\x92\x86\x1cWa\xed6\xe4y\x8e\xd7S\xf8\x02|\xe4o8Q\xbfT\xac\xe5\x06\xaa5w\xd2\xb8\x88\xb2\x84,J\xc5\x93\xe4h<\xfb\xf1\x87\xec`\x8e\xed\xb6^{nt\x17\xea\x1a\x05\x8b"FZn^QM\x90\x03O>|e\xf4\xa6\xf8\xa2\xe0\xb0\x1e\xb3\xf9-.\xa2g#I\xce\xfeb$\xcb\xac{\x0c\x10\x18\xe40eV\xd6\x9a)\x17\xe2yd\xdb+\xf5\x16\xda\x90\xcd\xb3\xb7/\xff\x86Z\xef&\x93\x10\xb4\x1bBl\xdd\xd4.m9\xe6\xe8r\xa1\x9f\x00\xcb\xa46\x0f\x12~\'\xcc\\\x1e`x\x89\'\xd8l\xba\xf3\xb1|T\xc2\x913\xfc\xb5\xe3 2\x9aW}\x04w\xca\x03\xd9.\xd5\x86\x8b\xd5\xd2\xd8\xe1U\xf4@2\x8a\xf3``\xd1"\x12\xee\xf4\x03\xd6P\x1dj\xecO\xb04\x1c\xd4#j\x98\x0f_\xd6\xf1u[\x7f\x13C\xc5\xf8\xb8\xde\x92\xfb\x13\xa1\xf1\xf8\x1bJ_e3\xd7\xd4\'y\r\x9c\xee\x1f\'\xb7v\xb5\x91\x12\xa5\xcem\xda\xef\x1cbm\x84\xef\xa9c:X\x9d\xf3\x88\xec\xc6E\xd8\xb0\x01\xd6\xa7\x00\xbf"\xe7\xfb\x12]\x8b\x16\x0e\x1d\xef]D\x0f\xae\xb1\x0bE\xcc\xbe\x9d9HX\x93\xee\x1f%\x9b5\x1b\x14.E\xda\x7f\'6\xb1y\xb6\xac\x15I\x9b\x0bfJI\x8a\x8b\x03\xe82^\xaat\xf5"\x93\xbeT;\xf5%C(7\x98\xd1WgB=\x02\x182\xc8\xeb0\xdb8\x94d\x97\x8c\x13\x17\xa5p\xbcEj\xfa6paa\x99\xe1\x89\xaf\xbf\xfbS\x18/<\x08\xd1\x95\x16\\\xcd\xd1\xe9\xd5\xb5\xd0\xf7VM\xb9n\x9c7\x84(\xcb\x01{\x86\xc7\xe7\x93w\xe4b4{\xea\xcf\xa7\xe5"\xf4~\x9c\xb3\xee\xbb\xbf\xd2dy\xe7\xe4\xb6\xe1s \x8a\xc6\x8b\xc5o\x05\xfc\xc3\xc7\x03tx\xc0GK\x82\x88\xabz7\xd8\x82[\x89N\xfd\xb6G\xf7vN\xb2i\xcb\xf5\xaf\x98\xd8VW\xda\x9dG\x95|\xc5\x07\xb2\xa6\xdf9{\xff\xb9\xbdz\xcb/\x13\xbc\xda \xbf\xf0\xa0R/C;\xc9\x08T\xa2\xc4\xef\xec\x035]DA\xa8\xd3S\r\xef\xdc\xaa\xdf\'\x90\xc8\xe5\xef\x01h\xb4gE\x01\xc1$S\x9cY\xbe\r\xe6"\xaac\xa1\x17\xce,\x1en\x91\x88\x8a_>\x0f>:\x1fvN\xee\xb4\x89\x04B\x08\xea;0\xe5E\xcc\xe8\x93\xd2\xdc\x8c\x19\xd8\x9a\xdc\x8b\xa5\xf4\xe6\xa0g\x9bn\xa2\x0b\x8b\x1eFk\x8a\x83\xa5d\x1b\xc9\xac\xbbU\x98\x0e1X\xb7P)\xd7\xab`\xc5\x1e3<FE}\xd4Ys\x1e\xc9\xb7`t\x04\xc8L\x8e\x8cC\x98\x86\x019L\xcb,\xad\x95\x174)~n\x8a\xce\x91\x8fxic\xf5\xcdb\x02\x88\xd2\xabP\x05\xbaUk0>g\xc1\x06\x10 \x7f\xa5\xe1t\xe9\x89\xdf\xfc\xcd\xb0\xd9\x0b}\xaa\x8as\xf0D$\x11\xc1\x04\nh\x10\xb3"\xb4b\x19\xc1#\x18\xd4\xef\t\xe0\xdb\xa0\x82\xcf\xc6\xbc\xca\xd8\xbc\xc7\xc9\x07\x8d{4/\xdd\x80&\xc5\x1e\xe45^\xc9\x06\xcb\xdd\xa4\x0c\xac\x00\x0fD\x8bz\xd3\x0e0\xdc\xcf\xbb\xe5\t\xa0\xf4\xdbe\x9b\x0e\x19\x1eNxhT\x96\xf6\xa8\x87\xdf*\xf4\xdf\x93\xc8\xf5\xdbE\xb8\x9bt}\x88\xdb\xdf\x82\xe8\x1a\xde\x03b(}\xe5\x825Z\xcd\x93\xbb\xf9\xe2\xcc\x8b|\xbbfZ\xbf\xd6\x1e\x97\x14O\xe2\x98U\x18\xfb\xae\xd8\xd5r\xe4T\x80u\x82\tLE\xcc\xf2L\x89\x96^\x9b\x1c\xe5\xa1;n$_\xcb\xae\x01Fr\xben\x0c\xeb\xa4\xb5\xfe\xd8+Y.\x8e\xab\x9c:\x9e\x1aa\x1e\x00\xf5V\x91\x08\xc0\xcb\x13v64\xf4\xf4\xb3\x04\xf9\xfb\xc2\xf5\xc2TG\xa3K.x\x9e-\xe5H\xc9\xea\x04\xe3\xd8:\x8f\x90\xe8\xf3f\xc8\x08\xb6`\xaa\xf2\x00R]\xdfJ\xa5~\xcc\xc1\xbeA"\xaf9-\x83\xc0\xc5\x1dP\x85\xec\xf4\x1c\xfb\xf8\xb3\\\x91\x01?\x03\xdf\xf6\xe3\x10U\r\xcd\x01\x85@1yS\xacu?b\x8a\xe9v\x8e\x00J\x07\x00E\xf5\xbb5\xca1\x91\xd0J\xc2\x08\x00F\x92\xbe7\xbb\x1a!a\xd5\xa7\xee\xaea\xf1\xb2\xd6?wfDy \x90}\x86k\xed\xd4\xb6y=\xf7\xad\xda\x06\t\x14\x0f\x9bF*\x81\xf2\xa3A\x8f\x1d\x8e\xec\x18\x06s\xbe\t\xb0|\x0c$\x8d\xdf^j\x18\xa8L\x1f\xff\x1a\xdc\x8cE(\xa5\x08\x07\\\x8c\x8c\xfa\xbb\\\xf4\xe3\xf7\x98\x1d`n0\xfb\x01\x9b\x86\xe2\'\'\xc9\x06|\x9c\xa8\x1c,\x11\x93:\xbd\x9aF\x1a\xc1\x16\xf9\xe9\x84q\xd1\xda\xe9\xdfIU\x1a\xe2N~\xae\x9b\xa2\x80\xef\x19T\x1d;\x8f7\xf0\xbbZi\xe5\x84\xb1\xb0L\xb9x\xcc\xdb:)@\\\x80\xb2\x0c\x8f\x95P\xfa\x04\xd0d\xad\xd7\x1e#\x12\xcc\xd9\xbf\x94\x1e\xc8\xb1\x9e{\xb8\xb8\xf0\xe2t\xa7f/+\xe1W\x80\xf8i$\xa1\x90RC\x1bC\xa9F\xa5\xbd\xf7Y\x80\x7f9\xcbz\xf7\xbb\x01iKL27\xad\t\xc5~\xb5~^-\xcb[@\x00M\x03\xcd\x04\xf3\x8a\x03\xb6\x03\xb2\xe0C\'\x08m\x7fp\xa26\xcb=\xfc\x0e\x90\xe5\xda8\xc0-\x91"0\xbd\xe3\xe9\x87\x9d\x8e\xac\xae\x0e\xbf\\U9\xc5\x89\x03\xd86\x88\x14\xa0:\xa2;#\x11`X\xb0\x05\xa3\t\x0e\x90Pre\xf9s\x0f\xcfg\xd4\xca\x06t%\x16\xc3\xa3\x08\x04\xd0n\xfa)g\x04\xeb\xb8\x8aK\x03\xa3\x9a\'\xef\xd4U\xcd\xe3\xbf\x87\x95\xa1:\xb6\xb5\xe1\xbcHr\xbe\x93&\x91V.\xa4.\x97$5\xed\x90W\xb2W\xd0\x9ew\xdd8\xc2\t\x9f\xf3\tL\x9a\xc6d\xd8\x81\x1d\x8at\x1a\x81\x10Zfr\x8d\n\xe3\xad\xe5\xd1\x85\xea\x07\x0b\x06^w4|\xebw\x8ar\x01/O@\xbf\xf3i\xa6XpC>\x1b^\x91\xfd\xf6\xdc\xce\xaf\xbc\xc4q\xe4D\xfd\xab\x98\x98\x03,-\x0f\x1e\x84h%\xa2\xc6u5\x86$r\x0e44\xef\x88\x1ex\x13\xdc]\xa2F\x8b]1\x0c\x99\xdc\x8fGd#\xab\x94F\x9d\xb0g]$\xd8,\xc1\xd47|\xa0\x8ez\x06\x8b\x0c\x00w4N\xec\xf3\x06\xa3\x03\x8bc)C\xfd\xf4\xdb\x05\xc2\x1e<\xa6\xd3D|\x9c\xb9\xaf\xea\xe8\x16\xb2\x1c\xebx\xfb,\x99]\xbdp\x83\x176G\x1a\x8f\xad\xaf jE\xd3X\xbdg\xb3\xa2\xc4\xce\xae\xc6e"\x01\xe8U\xb9\x96\xa1Y\t\xad\xdf,M\xa8\xc8\xd6\xab\x07\n\xbf\xe7\xa3\x1c\xe1~\x13\xfc\x9e!\xd8Q\x96\xf2m\xb0u\xd4W]\xe9{\x0eDa\x8f\xa6\x99\xc5\x05,\xd8\x82\x8a\xa3\x03\xd3e\x99X\xc9\xacf\x86\xb6\t\x7f\xc9\\\x9f\xaa}\xb8\xc6\x7f8cE\x0ba\xf4T\xe7\xfe\xdd\xcb\x85\x16)u(#\xa3\x19:TQ\x13\x0ft\xa9\xbd\x97\x10\x88\xf0\x82\xc7\xbf~\x1dL\x0f\x08=\xe1\xcd+\xb6d\xc9-2j\n\xe1\xb5-d\x16\x12\t\x94\xb1\x9a\xa8\x06\'-\x15\xd3u\t\xef\x9c\xa2\xdc\xf2f\x16\x85\nN\x06j\xb6`\xa8\x15,\x0e>\xdcm\xb9Z\xb9\xc7\x0eJ\x0er\xdc4\xacEI0\tx\x02!w\x0c\xfcb\xc5\xd0\x90~\x03V\x1e\x82\xd9WP}\xd7}\xa9\x9b\x9b\x1d\xff+\x9c\x06\x11\x94\xfbg\x80\x85%\x98.\xc8\xcc\xb2\x13Uq\xfa\x0b\x8dZD(\xd2\x9b<\xac\xc1\xca~KH\x1c\x9c\x10`A%\xc3\x1ar\x9a\xf2\x96!\xbb\xd2\x02\xc5\xa7\xc2!\x86t \x91[\xf7\x80\xe2yP\x7fC\x85v\xd3\x7f\x98\xe0\x7f\xaf\xbb\xeb\xe5\xa7j\xb1y\xe1\x1f\xb6\xbc8\xf8\xec\x0f\xaf5\xec\x01\xfd.\xa7\x87w\x117\xfaE?~\xc0\xba\x15M\x87v\x98\xda)\xda\xc1,\xf2\x15\x05\xaamco\xe5\xdb$\x95/\x9bG\x88\xb6\xe7a\xe2\xe6\x89\xd1\x90\xc71\x04\n\xc4t\xcf1,r\xa3\x0cA\xd8M\xc1\x97\x1b\x89\x81q\x0f\xe0\xea\x88\xc3\x0cV\xee?i\x9e\x90J\x86\x18[\x8e\x03\xf5\xf2\x9dzv\x17\xeb\x8fU\xfb^\xe5\x16,\xad\xe8\xc3Ax\xdb\xd9\xb5+MK\x0b\x8d\xf7\x01zk\xe9\x15\xc3\xc6\xc7\xb8\x19\x89\xf2\xdbA\xb7\xf6.N,|X\xe8\x8c\xb3\xd4\xe8F[}<\xf7\xd4\rP\xc8P\x06\x1c\xe85A\x9a\x16\x9a\xde}tf%6\xbd\xd5\xbb\xb2Zro?s.\xcc\x04\xbc\xe7\xf9\xee\xdd\x10\x0b\xd5\x8an\x0f:\xcc)\xea\xe5\x02\x19\x80{\xd1vn\x82T\xfb1\xea\x03v\xf9\xd1jfHG*\x9e\x98K\x0b\x9f\xae]\x17\xae/\x91\x19\xcf\xa7~\xf1\nQI\xb2\xde\xdc\x9d\x07\xe2\\0\x18\xed\x1eo\x07Lo(\x07\x8fi7-\xd5\xe0\xf0\xa8\xf4\xcfm\x01\x1b\xb1{Ro\xa8\xebs\xd9^\xc8d\xd4\x93\xf0A\xe6/\x07\xe4\xe25\xc2C\xdcT\xfd \xfdcZ\xb9\x9f0\x8d\xc9i\xff\xb1\xa2\x8b\x81\n\xe2\xbf\x0f5\xf8\xd6w5\xa6T\xeb\xeba\x8bw\xeb\x82\xc2M]\xa0h\xe8m\xaf\x1c\xba\xd5PlzFj\xc2(\xf6t\x8b\x95\'\t\x9cM\x86\xb2\xd5\xc7\xef\x98\x01^\x14k:teq\xb5\xda\xff\xda6\xebb\xd6\x9d\x93\xc8vg\xfb\xa2+\xf1\xa1IS*\xd5ABi\xcd\xb5\xc9\xfb\xcb\xb4\x9as\xd3\r^\x99\xf3\xa6\xb2K\xacq*#\xe1\xc5q\xc8\x1f\x9b\xe2[\xf0Dv\xe0\xff\xc7\xd6\xdd\xaa\xcby8\x97\xc2\x1b\xc3/I\xed\xbfJ\xdbm\x05p\xd5\xe6K\x839C\x96=k\x03-\xed\xa6\xa6$/(B\x1f\xf3\xbck\xbd\xed\xfc\xeeR\xe7\x87v\x16\xd4\xb6|\x85\xd9!\x8a\xe5 x\xf0\x8c\xdd\x1c\xda\x8d\x1f\x92N\x0bT^\xd1\\\x8b)\xaf\x0c\xb4\xda\xd2\x1esP\x94P~^\xe2;\t\x87\xb0n\xdc\xbdY\xba\x92\xae1\x1e@\xbd}6\xb5\xbc\x9dy\xcbH\xd4 \x0fr\xd5\xaf\x9a\xe3\xc1\xb7@G\xaa\xc0R\xf2\xc4\x90H7&\xb4\x12\xeb[\xfe\xba\xf6\xb1a\xe6B6\xa8"\xddT|Qr\xa23[\x9e\xb2\xc7\x8b\xc5K]{\x88\x1c\xa1\\\x04\xae_D\xd8PjCl?dZ!\x85\xe95(\xa9w\xec \xfb\xbbu\xed\x91W\xbap\xbc\x02u\xca.\xf4|\xbfhZ\xf0\xf1A<\x07\x1e)\x1a%\x9du\xfasW\xf2\xa5\xee\x0e~#?\xc7\xfc\x95@`>\x0b0\x14\xee@\x1a\xe9R\x9f$\xe3\xc0\xc7\x0f\x0e\x9d\xcf\xc2\xb1\x87\xf2\xd3\xe2\xd4 \x07\xb1/\xaf\xcd\x90\xc1\x11\xcdB\x1d\ny \\\xb3\t\x16%\x9f\xbaGj\xa9X\x15\x12\xd1b\xce\xec\xb1\x9e\xb2\xec\xf9{\xb2\xf8|\xc0\x8e\x8f\xf2\x83\xd6}\x06\xa7\xc6\x05u\n\x82\xb1\xdc\x85\xac@\xee~I\\?\x00\xe6\x0b\xa0\xa0\xebf\\)D,GM\xe0\xe9d\x83s\xdc89\xce\x02\xd2\xf9\xb8>\xc1\x8f\x9a\xd2\xfa\xbf.\xce\xe6\x9d\xc9\xea\xeb\xfc\x06\xeb\xda\xfe\x01\xf5<z\x1b[\xdd)\xa31\x01\x133\xdfN\xed\x19d\xda\x10\xf8KA\xacZ\xe6\xe2&\x0b\x15\xddi\xd9\x0bf\xd0G.\x9dRGw \x1eE\x01N%\xe4\xfa\xc1\x08\xd0\xf2\x80+\xce\x0c4$\xed\x90MG\x87p\x13U~K\xe8\x80:\xe7\xa2R\'4\xb0\xea\x94\x1a)\xc5\xc1\x9fe\r\x82\x19\xa5\x8aaB\xbbcl\x9cb;m<\xdbupN\xbb\xbcy\xb7`\xf0\xe5\\\xbf\x99\xe5\xdeA\x167gy\xef\x9f!\x1a\xde\xea\xa2!3\x86\xcd\xba&i\x9b(\xf7\x92\x87>\xd9l\x0f\xaf\xe7\x93\x98\xf2\xcb\x8a\x8fO\xbc\x97hWOn\xb3\xf7\xd4\xcc~\th\x9d\x01\xbc6\xc1\xcd\x0b\x00\x05m\x9a\x19s\x9a\x83\x9f)\xbb\xa9\xb1\x00v\xc3H\x12\xd2\xef\xc8\xf9\x00\xc8\xb8\xb2\x07N\x8d\x99\x1f\x9d\xf9/k\x10\xfa\xa0\xf34\xf5\xbf\tFE\xf2_i\xa3+\xf7\xdd\xd8Q{\x08\xfe9\xae4\r\xe7\xfa\\?\xd8ht\xe3\xd6\x98\xb2\xbfC\xa5\xe5>\x1e\xc0\x94\xf9`\xde\x8f\nZaL\xe2\xbe\xaa\r(\xa0\xe2\x00\xf3\xbe\xd3\x98:Z\x06\xd3\x0f\xa3\xac\x13.\xc9\x17\xd6K\xfb?\x10m]\xd4\xd9\xc7\xd24\x89b\xe5U\x1b\xc6\xfe\x82\xb2]\xb5\xa89\x86l2kw_\xa4\x1c\x1b\xc54\xe1\xff\x96X\xfe\x7f\xf7R\xc1\xf5_\x89\x85\x1f|\xc4\xc3\xa3d\xf3\xcd\x1fg;~Y\x96?%4Y\xce\x1f\xc5\x066P\x92\xca\xa8\xe8df>\xb5\xbf*\xc9o]\x16\x93\x85^].\x17K\xb3\xc7\xd4\x88\x85\xad\xa4j\xc5\xee\xf7\n\xfe\xb2\x04\x1e\xd06\x0c\xb4af\xd8vpLwWM_\x8a\xba2\xfa\xa6EZ\x90=]\xe0\xc2}\xe2aR\xa6\xc0+(\xf7\xf3\xec\x9f\x89\x95\xb6d\x88\xe5\xc6b\xd8\x87\xa6[\xd2\x85\xbe\x07\x15\x981\xd5\xf8\x18\xce\x92\x0c\xbdy\x9e\x0b\x00\xc3if\x16Y\x96\xc5q\xab]\xe1WE\xecy\x1bXl\x0e5<\\8\xd5\xeb\xa6\x06\xb5$\xcb`V_z\x13\xd0s\xe5g-\xa02\xa7\x05\x9d\xd1\x0e\xdf<\xcba\x83\xb4\xd9\xfaJ( \xfcj^\xee7l\xd8D\x14\xa1\x97\xeci\x85\xe3)D\xac\xd1\x94i\x81\xc3Z\xd3K\xdc\xa3\xcf\x82\xab\xc3\x8d\xd9\xb6(\xa2\x1b\xbb\x04?\xd2\x891\xbeY\x89\x91sn?\xc4\x9c\xcc\xc6\xdf@\x10\'*\xd9N\xfd\xf8 W\xc3\'\xf9\x15\xc8o%f\xf61\x85\xbb\xf0`\x00\x04\xa4E\xfem!\x01\xe8eI\x85\xc6\x11\x92\x92\xcf\x94\xab\xc9\xd6\xf8\x81\xd0\xb96]\x94\x13\xe2\x1b53\x9e\x05\xdb\xdb\xc5\xc6\xf0\x9f\xc3\xe6\x91X<\xe7\xcb-\xde\xa3Q\xd5!Q\xd7-J\xe4\xdc\xfb\xe4\xd3\xec\x15\x10\x84\xe2\x1aL\xad\x15r\xe8WH\xab\x17\x8b\xaa\xe2\xa5\xd2\x8a\x7fw{\x03\t)\xf2o\xb0L\xae\xdd\x8d\x1b\xdcm4\rOqz\xc3\xf4\xf0\xbd2*i\xe8\x08\xf1p\xd5\xb8\xae\xecI5\x06\xcdr4\x13Q*\x15`\x98\x8e8\x95zQ\n/1\xe8\x12\xcd\xb6d\x80\x0e_\x9a\xca\xa5\xab\xc9\x7f\x9f\xa7>\xeb\xd3\xdfq\xf8\xa9u#\xb3\xf6\xb8\xf7\xb2Fh\x91\xc2\xa4B\x8dW\xd9=\x02GSa\x8c\x9c\x9b\xbb\xc0\x18_\xfdY\x04\x87\xab\xecoT\xc0\x81\xf5\xa9v\xd8\xf74-\x14\x8b\xe4(\x18\xe1\xd0\x98jOf\xfc\x80\xb3\xc8\xd3\x15\x9a\x8a\xc0\xf6\xa4\xae\tD\x97\xf2\xad\x02\x98\xb8/8*\x87\x93\xa4\xbd\xfdwj\xb61\x88\x8b\xc4u\xbe\x06\x16M|\x8bH\xbe\x98$\x96\xa0\x15\x84\xc3\x8e?\xf28\xd3cG\xf6K=wOq\x8dqk\x92\xd0\xc2n\xdc8lQC\xc1\xa7\x0e\x89\x1aH4\x1e\x01o^\x8dLm\xe0d\x10\x93\xc8\x8f\xe3DY\xc4B\xfd\x1b\x84\xac\x99K\xa2O\xb9\xf9F\xb5\\\xc7\x13\xf0\xf9W@\x8c\xb3\xd3S\x15\x00By_\xb7\xf51\xa1\xe4CEAQ\xa1`\x8bY\xc2V\xd7V1\xb5G\x12;\xc9\xd2\xe5\xae\xad\x12Fy\x97nt.\x8a\xb9=kr\x16\xa9\x18`Z\xca\xd9\xb7\xdb\xd9\x8f\x90\xcbK\xd8\xe5\xfc5\x06b]k"\x92N<\x9c\xf9\xc5]\xef\x90U\x84#\\B\xf0\x7f\xa6]W~\x00K\xc1\xbcn\xda\xe2\xc7T\x99\xa8s\xae\xf3\x9fN\x15\x01E\xf5\x03\xd30\xebp\xd6\x1c\x8e\x93\x1dv\xae^\xbb\xff\xd3\xb8\x88\xdbf\'\xc2\x8c\x0f\xfc<^\x08\xe6\xf3\x98m\xff\xc2H _\xc07@Z"Y\xaf\xa6\x18\x82`a\xc3\xa8P\x051\x9f\xebAe\xc0\xd1\xa1%@\xd6P\xa6\xa9\xa7\xc9W#\xc7\x8e\x06"z\t\xc2\xa2L\x9c\xe71\xe0\xc7,\x8a\x98\x1b C\xb7\xf2\xf1\xec\xc86Q\x88\tK\xaeO\xac\x96\xaa\x06\xaeZn\xce\xe6\x9a\xe1\x9c`\xf5f\xa7P\xab\x92n3\xf3\x05\xd3\xd8\xae\xb2\xa9\x195\tPw:\xb6]\xee#QIW\xe5J\xb8hb\xc2u\xf0L\xe4;L\xed$\xfd\xe8V\xb3\xde\xd2\xac@\x90ks\xa0\xa2\\6\x85\x01\x18\xe6e\xfe\xd4\xe4Ya\xa6T\xa7\xa7]\xee\xde!\xe1\xcd\xa3\x83\xaf\xe6,\x128*2\'w\x10\x0cq\xd2\x95\xe3\xcf\xfe\xca\x98\xe0\xb3\xe5W\xa8\x9a\xf8\x96\xf9\xdfM+\xac/Q\xf7Me\x81\\%\x12\xb5\x1c\xd3\x95\x17*\x858D\xb3\xbejl;\x94\x88g`C\xd0\xf04\xa4%f\x0f\xcd\x90\xaf\x9a\x89[\'\xe9\x12l\xb5m4\x03\xc2ll\x8a\x8d\xc2\xd6\xdbZ\xe6\xba\xb7X1\xc1+X\xff\xb5\xb7\xedQ`/k\xc6\x8d\x1c"[}5\xc2\xedk\x043')
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify
10
+ from flask import Markup
11
+ from flask import Flask
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class ChildAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+
32
+ column_descriptions = dict(
33
+ domain=_("domain.description"),
34
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.')
35
+ # current_usage_GB="in GB"
36
+ )
37
+
38
+ # create_modal = True
39
+ can_export = False
40
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
41
+ form_args = {
42
+
43
+ 'domain': {
44
+ 'validators': [Regexp(r'^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
45
+ },
46
+
47
+ }
48
+ column_list = ["domain","show_domains_list"]
49
+ # column_editable_list=["domain"]
50
+ # column_filters=["domain","mode"]
51
+ # form_excluded_columns=['work_with']
52
+ column_searchable_list = ["domain"]
53
+ column_labels = {
54
+ "domain": _("domain.domain"),
55
+ # "mode": _("domain.mode"),
56
+
57
+ 'show_domains':_('Show Domains'),
58
+ 'show_domains_list':_('Show Domains')
59
+ }
60
+
61
+ form_columns=['domain','show_domains']
62
+
63
+ def _domain_admin_link(view, context, model, name):
64
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
65
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
66
+
67
+ def _domain_ip(view, context, model, name):
68
+ dip = hiddify.get_domain_ip(model.domain)
69
+ myip = hiddify.get_ip(4)
70
+ if myip == dip and model.mode == DomainType.direct:
71
+ badge_type = ''
72
+ elif dip and model.mode != DomainType.direct and myip != dip:
73
+ badge_type = 'warning'
74
+ else:
75
+ badge_type = 'danger'
76
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
77
+ def _show_domains(view, context, model, name):
78
+ # return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
79
+ res=""
80
+ for d in model.show_domains:
81
+ res+=f'<span class="badge">{d.domain}</span>'
82
+ return Markup(res)
83
+
84
+ column_formatters = {
85
+ # 'domain_ip': _domain_ip,
86
+ 'domain': _domain_admin_link,
87
+ 'show_domains_list': _show_domains
88
+ }
89
+
90
+ def search_placeholder(self):
91
+ return f"{_('search')} {_('domain.domain')}"
92
+
93
+ # def on_form_prefill(self, form, id):
94
+ # Get the Domain object being edited
95
+ # domain = self.session.query(Domain).get(id)
96
+
97
+ # Pre-select the related domains in the checkbox list
98
+ # form.show_domains = [d.id for d in Domain.query.all()]
99
+
100
+
101
+ def on_model_change(self, form, model, is_created):
102
+ model.domain = model.domain.lower()
103
+
104
+
105
+ dip = hiddify.get_domain_ip(model.domain)
106
+ if dip == None:
107
+ raise ValidationError(
108
+ _("Domain can not be resolved! there is a problem in your domain"))
109
+ if not hiddify.check_connection_for_domain(model.domain):
110
+ raise ValidationError(
111
+ _("Domain is not correctly mapped to this server!"))
112
+ print(model.show_domains)
113
+ if len(model.show_domains)==Domain.query.count():
114
+ model.show_domains=[]
115
+
116
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
117
+
118
+
119
+ def on_model_delete(self, model):
120
+ if len(ParentDomain.query.all()) <= 1:
121
+ raise ValidationError(f"at least one domain should exist")
122
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
4
123
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
124
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,55 @@
1
- # 2023-04-08T16:23:32.050967
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\xea\n\x00\x00\x12\t\x04\x00M\xa5\xdd\xa0\xea\x96\xd6b-?!\xf6r\xa2v\xdb\x00\x00\x00\x00\x00\x00\x00\x00Y\xb0\xcd\x0e7\x02\xcaS3\xd8\xc6\xe5\xe4\xbe\x14\xdfT\xc0\xcf\x1d\xeb\xa9\xca\xb1\x89\xd1\x96\xa8\xf1p\xb7\x10\xd8EXv\xaf\xd6(\x01.L\xf6\xea[\xd0\xe5r\x1fT\x99r\x17@\x16\x07\x99\x0f\xad\x96K\xb1\xdaH\x10sI\xfb\xd9\xe4]h\xbc\x17\x0c\x9a\xe2\xa8,\xd4b\x95Q\nJ_@\x03\xcb\xf0y-\xa3#,\x97k;\xa9\xb4\xbe\x81\xc9q\xe5ydu.6\xa6\xa3\xf6\xd5\xd1\xd6\xc6\xddU\xe57_\xaf2\xd8\xeb\xc1\xbc72*[\xe0$\x97\x168\xe2\x14\xa7?\x895\xde\x88X\xbbS[B.\xfb\x0f\n\xa3\xb3gG\xd1\xe4\xe9^\xadn\x95\xfc\x8f\x8e\xf5<\xb49\xb5\x18?a\xe0\xd3\xb6\x14\xfcb&\xf8o\'\x8cDr\'\xc7\xddi[\x81\xc5\xc1f$\x0c\xf5\xc8\x11}\xaa\xf7\x11\xae:X\x90\xdf|\r\xf9_\x7f\x99\x88b\n6J\xe7\xef.VZ\x7f\xef\xb7\xe1\xa1\x90G\xd3\x96\xfc\xe7\x9f\xc3\n!\x8b\xbb\x8e%\xc2\x9eX\x85`\xea\xa6,e\xa1Q\xab\xce\x02\xfb\xf9\xc93`\xbd\\\xe2\xd3_\x7f\xcb\xd8\xe6\xef~5/)\xe8Y\x1a\xaa4o\x1emG\x06\xe3`\x1an`\x12\x05\x96\x06\x80mO\rlE\x95\x93\xd7}\x0c2\r0\x9d\x81!\xb1Z\x8d\xd85J\xac\xc3/\xe0\x01\xbdOuk\x94q\x7f\x19\xce\xffw\xfd\xc5\xdcew#g"\xd4I\x7fX\xc0\x10y\xc5<)\xe8KGd\x9dPb\xce\xf8\x12\nI\xe2\xaa\xf2\xce\xfa\x8aQ\xc7\x06E>m\xf1o\xdb\x7f\x8c\xaf\xfc>\xea\xe4|\xfdA\x05\xa8Q19\x0c4\xd5[\x1a\x1b5\x7f"\x08I\x93\xf3>\xb8\x1d\xe6X\x82\x13<\xf8\xa9\x0c\xba\xcf\xcfAD\xf2XS.\xca\x86\xf7\x98cZK\x81\xf7BZ\x02c8N\xae\xa2\xe9#:{\xa3\xe4V\xde\xbb\x11v\xa2\xc7\x82\x9f\x8dw\x12,p\x9c6\xaf=\x1e\x1e\x94\xcdH\xbd\x93\xa2\xee\x86\xf9\x86C]\x8c7\xa6"bz\xcb\x15\xc0\xed\xb0Y*\x12k$xvvb\xb8\x80k\xe0\x8e\xdd\x12\xe5\xfdm\xc3$\x97\xec\xcf\xc0\xd8\xfd\xf5\xee$\x191\x83+CE\x0e\xc3\xae\xcb0\x93?@\x13#\x88[0\xf9\x83ne\xae\xd4}\xdb\x1a\xe0\xa9R\x11C\xa8\xe2B\xb3P\xa3q\xc9\xb8\xb0\xaeB\xf8k\x92\xeeQ]0\xd0\x84\xb0\xbb\xdd\xeb\xa8\xa2\xdb\x9ffd\xb6\x0e\xd9\x01\x1da\x81\x96c\xa6\x9bW\xc5\x9b\xfe\xfeNaS\x9b~\xd8X\xd6\xe8#|\xca\xa5\x06[\x14\xcfH\xces_y\x00\x92\\o\xba\xf8\xd9!\x0b\xf8\xaf{\x9e\xa2 \xab\x03\xd6\x10{\x9a\x82\xc9_C\x80\x03=\xd7\x81\xd4k)i\x1eN1B\xdd\x80\x84t\x18\xc1\xbdN\x99\x8a\x05\xe5.\x8fNp\x82\xb88\x06\xa2\x17\xe5\x0eG\x1c\xd1\xaca\xf5g\xd46\xdd\xc1np\xe2\xe4/\xdd\xa5\x91\x0c{\xb2b\xfb*\xa7\x93\xf6 \xf6\x07\xb7,`\x81\x05\xa0g\xac\xf4o\xc5\x85\xa6\x9b\x1e\x11\x80\xb6\xc7\xbd\x1d@\xfd\xc1\x1b~\x12\x84\xc0].UG\x93qq\tn\xff\xbc\x1b\x03\x19\x93-(]\xa1o\xa8\xe1\xab\x85e\xdc_\xc9\xb5QC\xa8\xb4DHG@\xaac\xb1;\x17*\xd0hq\x91\x96^\xecO\xd8C\xe5\xf0\xc4!j\xf08\x86J\x14\x99%i\xedL4\x01\\\x95\x9e\xb5ZuE\xb1s4\x9a:!\x1ec\xcds\x86g\x1cV\x9cx\xd8\xe9\xe4\xd5\x80\xa8#4\xa0}\x14\xa8,\x82\xb4J\xa6\x18\x17)\x04\xee!\xec=d\x15m\xe7\xc1\xb2\x13\xeb\xc1JD\x98\x96\xf7A\xe5s\xca\x85:\x06\r\xef\x860X\x89\xbe\xe6S\x8c\xfa\x9d\xd2\x1e\xd4)\ty\x1ag]\x95hJ\x93\xd9{\xe9\x1b\x057\xd3\xf5_,>Q8Q]_\xb5\x980X\xbf\x1c\x91"\xab1G\xac\x81\x06\x15`s\xd3\xd0p\x98\xe84h\xb7\xe1\xf6j\x80u\x07I\x81P\x16\xd9\xdf9h\xb03:?GD\x8e\xe9\x0f[\x18\xc8\xb0\xb1q\x13y\xc4%\x08(\x98Y\x93A\x9c\xb1n\x82\xb1<\xa1`\xaf\xd1\xe0\x06QD\xb5\x8e\xb5\xecl@+\xa4\xc8\xb5MZz\xa1\xa7\xb0\xf5\r\x07\x1b\xfc$\xe7\xc1\xc7G\xd9C\xef&~\xf2\x00J\xcfMT4Q+N\xfbd\xa0\x04?H\xda\x98"\xe8\xe4)\xd0\xcc\xbf\xd0\xc5\xe3&l\xa7\xfb?\x86h\x99Noa8\x85\x10\xf2\xc85\x0c\x9d,$\xc5B\xc5\x00[(\xb9W\x12C\xbc\x19\x06\xb3 O\xab*\xeb&\x89\x9a_\xe5\xf8|\xd9\xaa\x1a{\xdb\t\xc5\xe7\x8e@V\x06\x8f\xe5\xb0[\x1f\xc4\x13\xd0\xc8\x87\xb6\n7\xb0\xd3\x06\xf2\xd2\xe7\x85R\xa6\xbc?=\xd7\xd9\x17\xf7\x8eQvjIb\x97Z\x84\xc6\xaf%+]F\xfb\x14R\xe8\xf0\x05\xcc\xb1\xc8e?\xb6\x1ff\xbeE\xd6\x8b2\xb9\xbd\xac\x12\x97\x0f\x08\x1f\x1b\xb9\\.I\xd6\x87\xa6l$\xb4\xb0n\xeb|p\x1bz\xd4\x9d\x8d\xf8>i\x19}\xad+\x8a\xc2l(B\xbc\x98\xb7\xb5_K\xd5o\xd6\xf6\xf5\xebWC\xb1\x9fG\xdb\xd0\xde{\x06\x0b}j\x1a?9?\xca\n\xfb!\x8f\xd8\x15\x03\x93R\xc3\x1cu\xf0t \x9d!\xf7\x0f%\xe8\x15\x0c\xf5\xae=\x87(n~\xc0\x015\xa7\x85e\xe9\xcaDc\xa6\xa4\xd9\xc3\xdb\xa3\x9e\xe1\x9e|\xff\xa9C\xa7VDs]\xbb\xe4&Gzv\xa4`\x9f#\xa2cX\xf7\x00FL\x10dw~\r\xbd\xf3K\xd7\x92W\x88\xaf\x0e\x82\xef\xdaP\xdc\xca\xc4\xb3\xb7\xa3\xd7U\xc7yn\x9a\xc9\xea\xdd1\xfd\x8eV\xa7\x0eJ\x88\xca\x19\xf5m\xcc\x0e\xec\xc8\xa9\x96JT$\x8b \xba8]8\xf9[\xffm\x1c#\x9bT\xe1\x0c/\xb4\xdd\xfd\x8eX\xb9\x0e\xec \xa7\xe9\x94z\xca\x0c+\x07\x92p\x10\'>\xdd\xeb\x9b\r\x9b, \x8fr\x14K\xba3\xe1\xcc4y;\xaf\xfd\x11\xec\xab\x86_\xaf4\xce\xbf0\xa1\x8aU\xaeR\x10\r\x88Gt\xf9\xbb$\xfbTw\x94\x95H\x81\xfb\xd6\x19\xdd\x88y\x12\xbdK\xa0\n\xa9\xb2\xb5\xb7\x80\xcb\x87+\xc63M\xc1a1\x05\xb5X\x87d\xa0\xd0\xba\xf2\xffJ_e\xd1\xae\xc9*,\xfe\xaeu\xeec\xaa\'\x17\x06]\xa7\x1d\xdf\xd3x\xae pg\x15\xdb\xd0l4\xdfH\xf0\xd0r\xf1\xa8\x85\xe7\x91\xf7\xc3\xa2\xe8\x9f\xb0\xe75p\x9f\xcf\xeeC\xf52\xe4\x1c~x\x92\xf9\x8c#\x91\x99\x97\xea\x8d\xdc\x9d\xed\x05\xf0Q\xe98\\\xb0\ro\x89\xf4\xb2+\xb2\xd8\x92z/\x8cY\x92\xec\x16\xce\xa0|\xe8:\xecR\xe6[\\\xcf\xf6;\x01K\xda\x8f>,*sD#\xff\x17\xf0\x07Q2\xea\xc1_\x95\x96\x9c\'\xf49Q"\\\xf2j\xdf\x91\x99\xc4\xf1x \x1fDU3\xf0[\x19\x9c\x97\xd8\x93\x01\xa1\xc1uq\xdd\x1d\xad\x9b"\xc0\xd7Vx\xf2\tc\xcc\xacd9\xdc\x0f\x90\xd5\xc6\xebs\xfc\xa1u5bs\x89\x7f.P&{\x80\xaf\xd6\x81e\x9a\xc5z\x96\xf0\xdcY-QO\x935\x17\xab/\x0cT\xf9Km\xd0\xe8z]\xb2\x07\xa6\x941L\x1c\xf27;\xcc\x19\x8cr\xfd\xdd\x1f\x87\x1a`\xa50\x9d\'\x9dEu\x7f\xb0\xa8K\xe22\xcc\x1aW\xf8/\x0c#G\x82\'\x83x\x7f\xe9$:wp\x8c\x03\x81D\xff4\xda\xdf\xea\x89\xcbn\xeb\x1f\xeac\x9cusO\xd0V\x163\x8b\x0e\x8a\xf5i\x8f\xb7T\xb4\xb6%\x05\xa2|y\xa0\xdd8\xfe\xc59Ll\xe4\'!48\x822\xca\xcc\xef`\xf6\x9d\xfc\xe1\xc9\t\xbd\xbb6\x97k\xe8\xd3\x14\x97\xb0\xe3i\xbd\t\x9d|\xd3\x93\xad\xedy\n_\xda\x94\xab\xc3\xc3\xdd\x00\xcd\x8e\xf1B\xc1\xf8\x97\x04\x12w8\x87lq\x84;\x8b%\x08\xc3s\x1b\x13\xe3\x9c\'\xf1lAFS\xae\x90\xe0\xdb\x83\xf7Q\xc0Rh\x17\xba\xf4\x99d\x82\x83>\xee\x81\xe2q\xa5k\xe7\xfe\x00nJny[D5\x01^e\xe8\x05\x1a4/\xbd\x01\x96\xfb\xf2\xeaA!-\xd8\xfa\xb1`Yc\xb4\xe2$\xa0R\xd3\x02\x169\xe2\x97\xf8\xbe\xe7\x93\xf9V\x9ft\x85\xb8\x00(s\xb1\xad\x9c\x8f?\x96\x8d\xefE<)-\x036E\xa5&\x16\xa5U\xc4\xf6\x07\x1b~\xd9L\x92Z}\xfce6\xab\xc1\xe2\xd5U1w\xe9\xfb\x94\xe6<\xf9\xd2\x08\x82/\xfdX\xc7\x02\x00\x93\x18\x9f\x80X\xa1\x0b\xc8\x17 FP\x18Q6\xc5\xe7\x99\\~<\x9f*\xb4t2g \xf6\xad\xccp\x81\x12\xc5\xa0l\xb9!\x94`\xfd\x85\x84\x9f\x0fb\xaf\x02g\x9c\x17\x10Y\x1d4\xc2\x15i\xb5\xf6=\x7fbD\xef\x15\'\x9c\xfc\xfc\xa47t\xe7S}\xcfl\x89\x9e\xb1\x1e\xfb\xa67+j@0Y=\x13,\xc6\xe8\xb6\x9c\xb8I6\xf7\xdf)wgH\xa6\xe1\x96\x17C\xdds@\xf0\x1f\xf1\x1c\x13\x982\x8e\xf8LX. \x0b\xf2\x0c\xeeXq\xb3\x11\xe5\xd2\x03Ph}\xf2\x01.\xda\xa5\xc5R\x82\xd2\xe9K\n\x85\xf5\x93\xea\xeaY\xab\x81{6SGt\xbc\xa1\x17-\xa0\xb1\x99:\xa1\x00\xcc\xa2f\x06%\x9f\xc2\xa3RD\xc8\xf0K\xa7:\xf9\x13\x9e\x11\xd6\xc7W\x1b\x7f&V?\x97K\x98\x94\xe75\xccE!\x00\xe1\xf03\xc5\xb2\xb7\xb8\xe2\x1bc\xb6t\x18 \xec\xcc\xf3>\xb7\x13dg\xae:\xb8\xe2\x10\xd9\xbb5v\x07(\xd0\xf4\xaas\x92\x0e\xb7\x1e\xa7\xbc\xc4\xcf&\xa6\xd7T\xa4C\x00J9}\xdc\xff\x923\xfd@\x88\x1e\x014=7!\x11\xb5\xf3G\xdbM\x9a\x94\xfb\xfap-\xac\xb1\xe8\x1f\xed/\x0b\t9a\xbb?\x9b\x0c\x84\xc0p\xee\x9a\x84\x8e\x18\xf4\x80bM\xf6\x11\x0f\xda/\x94\xe9\x9a\x86`\x15v\xbb\xac\xc7\xe9\xed\x13\xe7\x86\xf5M\xe1\x9f\xd5\xca\xd3\xc0\xf3HB\x01\x9e\xdb\x1bN[=\xc7\x1f\xf7\x87\xb9\x1d|\x83h\xf7},\\\x87z\x89\xd5\xb9\xce\xfc\xe5&hS\xa1a2S!\xe5\xfcC\x86[\xfc\xccA\xb2^A\xb6=\xb1f\xfc\xe9\x16\xc6*\xf6\x96y\xf2qG\xe1\xc5/\xf8F\x82\xb1G\xa3\xb6+^?\xc1[\x1d\xdb2\xd1\xec\xbc\x94}\x8c\x07\xc5\x87\xf2\xcbgLT\xa4\xcf+f\xc6_\x9ae\x15\xd9\xa2\xc1#\'t\xfd\x80\x7f\xc0\xbd\xd0i\x06F^\x9aM=\x97Q\x12\xd6\xe5\x1f#\xb2G\x91\x8eV\x01 Ji"E\x1b*^J\xdfO%dB\xeb\xb2\x86\xd6\xfc^\xa4\x95\x1c\xec\xaf\xb3\xab9\xac\xa9dv\xa7\xc3=\xc9\xd9\xfc\x15O\xf1\xb5\x18:\x81\xab\xb6I\xb2\x15,.\xd6\xcc\x05\xe7\xeb\xd6E#\x0b\xa1+\x1c\x11\xd1N\x9a\x04=n\xef\xc8K\xe9\x87<\xd1\xec\x9c\x05\xbaI\xa34Q\xa6\xedw?X2\xf9\xe9oP\xaa\x8c\xfd!\x8a\xc6\xe9\xf1\xe7\xc5uy\xe6j\xcf\x0f\x92\xdb\xe4n=\x8f]\xec\xea\xf3\x85\xd42\x99a\xb2i\xc6,\xe9\xbb\x8d\xd1z\r\xf4A\xf8\x1cr\xc3\x0bRx\xbe\xa67\xbc\x99\xc7\x9c\x9cD\xe8/}\xa9\xbf+\xc1\x1b\xa6[)\x9b\xdb\xc7\rD\xaeb9}\xb9\x8e\xd6#\x13\n_\xc6T\xcd\x18.Cg\xeea\xb0\xf1\xa9I\x8dT\x90\xdec\xdd\xdd\t\xd2K\xaf\x87\x1e\xb0\xcc\x0c\x8d5\xd88\xf9(j\xc4\xb0a\xd1\x18\xeb\xad-\xf8\xdb\xbb\xa3\xa2~}\x9d7FbA`L\x9aJo\x11G0\xbb\xfaD5i%2\xf6\xeaZ')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from hiddifypanel.models import ConfigEnum
4
+ from wtforms.validators import Regexp,ValidationError
5
+ import re
6
+ import uuid
7
+ from .adminlte import AdminLTEModelView
8
+ class ConfigAdmin(AdminLTEModelView):
9
+ can_export = True
10
+ column_default_sort=('category',False)
11
+ column_display_pk = True
12
+ can_delete = False
13
+ can_create = False
14
+ column_editable_list=["value"]
15
+ column_searchable_list=["key","value"]
16
+ form_widget_args = {
17
+ 'description': {
18
+ 'readonly': True
19
+ },
20
+ }
21
+ def on_model_change(self, form, model, is_created):
22
+ if model.key==ConfigEnum.db_version:
23
+ raise ValidationError('DB version can not be changed')
24
+ # if model.key==ConfigEnum.decoy_domain:
25
+ # if not re.match("http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?", model.value):
26
+ # raise ValidationError('Invalid address: e.g., https://www.wikipedia.org/')
27
+ if model.key in [ConfigEnum.admin_secret,ConfigEnum.ssfaketls_secret]:
28
+ if not re.match("^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$", model.value):
29
+ raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
30
+
31
+ if model.key in [ConfigEnum.telegram_secret]:
32
+ if not re.match("^[0-9a-fA-F]{32}$", model.value):
33
+ raise ValidationError('Invalid UUID e.g.,'+ uuid.uuid4().hex)
34
+
35
+ if model.key==ConfigEnum.proxy_path:
36
+ if not re.match("^[a-zA-Z0-9]*$", model.value):
37
+ raise ValidationError('Invalid path. should be asci string')
38
+
39
+ if model.key in [ConfigEnum.tls_ports,ConfigEnum.kcp_ports,ConfigEnum.http_ports]:
40
+ if not re.match("^(\d,?)*$", model.value):
41
+ raise ValidationError('Invalid path. should be comma seperated integer e.g., 80,81')
42
+
43
+ if model.key==ConfigEnum.http_ports:
44
+ if "80" not in model.value.split(","):
45
+ raise ValidationError('Port 80 should always be presented')
46
+ if model.key==ConfigEnum.tls_ports:
47
+ if "443" not in model.value.split(","):
48
+ raise ValidationError('Port 443 should always be presented')
49
+
50
+ if "domain" in model.key:
51
+ if not re.match("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$", model.value):
52
+ raise ValidationError('Invalid domain: e.g., www.google.com')
53
+ if len(Domain.query.filter(Domain.domain==model.value).all())>0:
54
+ raise ValidationError(f"Domain model.value is exist in domains section. Use a fake domain")#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
55
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,71 @@
1
- # 2023-04-08T16:23:32.181025
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\xb6\x11\x00\x00\x12\t\x04\x00(\xcal\x8f\xec\x9a\xdfLEW@\x0f\xdfn\xe46\x00\x00\x00\x00\x00\x00\x00\x00\x16%\x16\x8c\x8eq\x96\xc5\x98\x02\xd2\xca\x9b#Z^\xda\xc0p?\x06\x10\xdd%\x8c\xa9\x15\xd3\xfe\xcb\xd1+\xa5\xca\xcc\xa2\x8a\x05\x15\xbfh\x9e\xf8\xebsq\xe7\x8c==\xbaa\xb1~4\xd7f\x1b8\x81\xcf[\x94A\x0f\xae\xe1O|D\xeb\xd3\xac,\xbdr&(o\xa2zV\xad\xa5\x81\xa3DB\x9c\xd3\xab:z\xc3\x8e\xe5\xf7\xf6z\xc2\x8d\xbf"\xdcw\xe8\'\x8f\xfb\xab\xe6\x1b\xdc\xfb\xca\xcf\x9f*\xad\xee\xbfp\x12\x03\xc7cRPw\xc1\xa3\x81\xa36\xf88\x9dD\x10\xbc\x1ad)\x81\xfb\x82F\xf4\x90\xe3\'\x9aA\x0c\x83\xc9j[\xcd\xc9\x016\xaf4<\x96H\xc7\xa7\x83\x18\x7f\x06\xae\x96\'\xa6\xc1\xffw<\x7f1\xf5\xc6Q\xb7\x02nP\x1e\xcb \xa28\x0c\x1e\xce\xd2h3\x04\xde@\x8f\xd5H\x92i\xef\x85\xe7\xe4\xedA\x9d\x97\x18\x07Y\x9b\xbd\xc8\xef\xdb\xf1\xe4\xfb\x17\xf8\xeb\xb1i\xcc\x1c\xc6mO\xc2\xd3(\xa7\xe8X7\xfe\xeeT\xac\xe0\x1d\xe1xK\x17V\xdcLK\xd5*\x8dn\x8e\xbcU\xf4\x07\xcfcA\xa8W\xe6\xed\x19\xf9*\xe2\x98n\x93a^\xe4I;\x1a\xceN\xe0\x06\xa9\x14\x9b\x9c\xbbp\xa1\xff\x1866\x08\xb4\x01\xfav\x9cEN\x7f\n\xa0\xf6\x8d\x01\x9a\xb3=\x10F\xea\xd2\x0b\xbby\x11f\xc3\xb1\xb9\x1e\x11\xc5\xa4\xc2L4%\xbebI\xaf\xa5\x89\xce\x84\xe7f\xb6\xb0g-\xab{\xfa\xcd\xd8\x15\xaf\xf3}#@\xc0\x9c\xd9R\xa0\xd0\xb4\x93VE\xfe\xd243\xb1aA\t\x1c\xce\x97\xcb\x06w\x19\x9b\x0c\xc3\xcf\x16:\xeb\x91\xfcK\xc77\xe0u\xd1\xc2:&\x18\xd37\xdb\xe5\xcf\xa8\xc8KM\x8f\x83\xe0\xa7\xd2s\xe6B%"#7\x86S\xa1=\xf2\x98\xb6\x1a}\xeb2o\x89j\x92{\x1c\x97|D[OAY\xad\xc1\xaf\xfc\x18D\xe2U\xab9}&\x81b\xe2\x85i\xf6a\xc9\x10\xe9w\xb7\x9c\x0f\x18\xe0.\xd0\xbb\xd7\xb7\xa5\x8e\xd1\xbd\\\xb1\x18\xfb\xc0{\xb9\xb3\xb6\x9f\xa5 =\xbc\xc4y\xf9\xa4\xccx\x19v\xfd\x96)\x9f\x1d\x97\xc6j\xe9NBp\xdc\xc9\r\xb7\xc0\x85\xac\x0b\x95\x8b\x0b\xf7`\x01\xc1>9\x12}(8*\xf7\xdb\xa0\xe6\x1a\xe1\xa9J\xfc\x13\'\x03\x9d\x1e\x1e\xb5\xd8\xb9\xc0x|\x83"\xc8\xaa\xe3\xff\x8b\xdf\x19"\xd1\xd1\x19\xf3\xa8\x8c\xc2\xc7hY\xad{_\xda\xb7{Te\\=K*\x963\xf6\xc4\x9f\x97\xb0wYq\xe9\x9b\xc6y\x9ew\xea\x91\x04\xc8\x8f\xc5\x8flb\xf4i\xb2\xd2+,\xaf\x1e)W<\xb2\xf1\x8bu\x8bF\x9a\xbd\x98\xce\xc2\xeb\xaf9Q\xa9K\xb6_\x8b\xe0\xf6\xb3e]Q\xdd~r\xa6Fo"\xb6\xe4s\xd2\xf5\x19\xefn\t\x12\xe8\ty\xbf\xe8\x0fT\xb3\xee\x13\xe8h\xe6\x1d+\x01\x92\xc59H?\x8b\xe7\x0f\xe2\x967\x05g\xbf\x1a\xffX<\xae\xbb\x82\x0bp \xd3\x05*\xb4\xa0G\x94P\xda\r\xbcc\x85\xb4\x97\xcc\xd0\xf2\xe4\xc7\xdf\x0b\x14\xea\x01\xe5\x90\xd0\x93\xc7w\xd2J\xa2\xca\xc4 \x12\xd9\xdc2\x83g\x9c\xfe\xeco\xb7\xfcf\xf6\xc0\x83@\xb2g\xa6F\xba\xae?@\x0c\xbb\x0f\xd4\x12\x9e0\xf1\xf5\xdb\xfd\xb9\x01\x1c\n\xde\xbc\r\x06\x9f\x94\xb5\\\xa3\x19\xa2b\x89c\x1c\x80\x9b\x04>^n\xf1o\xe4\x01\xdc%\x12o\x06\xbe08\xdb\x13\x15B\xe1c\xc8\xf0\xbc8\xc68H\xae\n\xf4\x8cl6\x89\xd6\xf0\x11[Y}\xa5\x85=\x0eFwJ\x02\xf1+v\x0e\xacJ\x98+Z4jG\xede\x15\x02\x8cW\x15L\x18\xe1\xc7/\xa5\x0bi\x98\xcd\xddK\x0c\x9b\x8c\xdcX}\x0fI\xc0\xc5\xe1\nn\xc3\xde_\x0b\x06\x8bw\r\xc9\xfe\xde\x12Z\xa3\xd1M\xc1\xac\xe0\x1aDN\xf2\xf1\x8cg[>\x89\xfc\xed\xa5\x1e/\xd2\xf8N[\xc6\xf3=\x16\x18Z\x81\x7f\x90\x8e\x9b\t#\xf4\x8b*!yp\xc4\x884\xfb\xe4\xba\xd7\x85\xbf0Ay\x91U8\x14\xa0$\xcc\xdb\x18?\xcf\xf1\x83\xc2\x91\xb2\xab\xac\xd3\x98x\xa0\x81\xf0\x813\\\xa6\x19gyJk\xb27S<A\xa5:\xd4R\xe5j2\xc8\x08\x0clw\x10\x83\x07\x89g\xe3\xe5@\x11\xe5J&t\xbaW\xa4\xceG\x88M\x0f\x06Jh\xe4\x1e\xf1\x1ef\x81.0y\xeb\xeb\xb4S\x99\x94\xd2\x9c\\\xea\x0ep\x03e\xe4\xf6\x96PD\x83\x12`\xf9\xd6]\xe7g1\xbd\x9bv\xc0\xda\x98\xd4\x9c\x8d\xa8\xf8\xdd\xbf\xec\x9a\xe4\tx\xecO\x9eO\x1d\xf7\x84\x97\xbd\xe5l\x01\xf9\x8d\xe8\x82\xcdO\x08\xa6\xc9m+\x19^\x83FC\xdd>\x02\x83\xf9\xda\xbd\xe6y]\xfa\x82\x94\xaf\xc6\xb1\x17\xc3\n\xf2\xbe\x08*=M\xe8\xb1\xe5L\xf3\xd9\x0b\xdc>O\xb7\xb5(\xfd\xe3\xfd\xbc7\'m\x1f\xba\x11w1S\xfe\x90\x06\x16pR\xfa_\xa2\xa0\xa5\xf9WL\x1an{\xf2\xfa\x8b~=,\x86\x8d\xdf\t\xc9"\x00\xe9\xc9\x8a!\xaf>\xa0R\xf7=\xac\x18 \xaaVUn\xcb\xbd\r_#/l\x8c\x9f\xda4O\x81\xbc}\xa5\x8e~\xa8a9]\xd3\x9as\x02\x1b\x9bw\xda\x94\x14P\xcef>\xbcu\xad_\xd7\xb5\xe0d\x9c\xf6@\xdd\xcd\x8fn\xd8\xa5\x12\x97\xab\xeb\x97yzw\x17\xe9\xd2M[\xa7\x12&\xe9`%\x0b4\xed/\xde\xdab~N\xf5\xe6\xbc\xd9[\xf4\x9c\x1bo\xd6\xd1\xdd\xd3\x82\xc4ky\x1a\xf4\x14yA\xe8s\xc7\x12#\xebww\xb60\tS\x1d\xfd7+Js\x16\x96\x91\xaa\xea\xd7\xe3\xa8\xbd \x9dC\xdb\xbc\xee\x83"\xed\xef\xf4\x8c8\x13\x7f\x1fi\xad\x9d\xd3\x02\x80\x06\x1c\xc6W\xbc\x8b\xd4\xea\xf3mkH\xe4\xf3ns*w\xaa\xb2\xa5J\xd4\x1b[L8dB\xee\xac\xa7/\xae\xad\xcfxZ\x9b\xc7\xfe\x1d\x1a\x92\xf7+.\xf1\x93/#\xd5\x8b9K\x95\x80\xc3\x0e\x0b7\x8b,F\xb7 \xafC\'p\xa9V\x12\xfd\x00\xa4\xc1\xae\xfb\xa0\xce\x01\x8c\x9b\xb8\xa5\x1a>\xf0\xd9\xca\x90U\xb1\x15\x0fG\xc8\x864H\xfeL\x17s8Ns\xa1\xb1\xa4\xba!\x11\x9a\\\x9e\xd6M>h<+g\x9d\xf5\xf3\x15,\x9bx\x03RSq\xcfp\xed\x1bF:\xb9\x08D\xd1\x08/*\x15J\xb9\x8c\xf8\xa3\xa5g\xf1\x80p\x1c\xb1\xc0\xf8$\x9a\xbd)\xb3\xa1\xf5#\x85&QN\xd5\xd5x\xe3-\x00)5\xbf\x01\xb9]L\x95\xbf0\\\xe6,hJ\x8b\r\xdb\xbcPO|uwcd\xf7\x94\x17\xedF\x9c\x9eT\x07\x07T\x1f\xf2\xf1i\xdf\xcb}\r|V\x9co\x85"wa\xe9C?~fL\x91\x13\xd5q<\xd4\xf6!\xaa\x12\xc6>y\x9f\xed\xb0S\xdf.\x83\xfd"\xa3g\x1c\x08\x14\x16`\xa5\x92 \xe7{\x9c74\xf3\x80\xd63\xe4\x8e\xe8\xea\xc9\xfbB\xac;\xb0eg\xccn\x89,B?\x8b(\x9c17\x12i\xc2\xa4\xce\xefs=\x82\xda(\x04\xcfb\xed\xdd\x91Z\x0c\xf8\xda\xb5\xe4\xc2\xcf<\xdd\xd5\xe2\x0f\xc2e\xdf\x93\xd9\x93\x02\xf4\xad\xe7E\x18_\n\xddl\xd0\x1ayIibW\x18\xab\xfd8\xf0\xbf\xc3\xf6U\xf0\xfeS\x80+\xd9+\x81|\xe7\xe3o}\xc2JK`\xe9\xf2\xa4[\x93\xf4\r\xf9_\xe8\xda\xe3B\xb0\x1f\xb1\xc6m;\xf1\xa6!\x94\xbb\xe7\xbc\xf7\x8e_4N"\x0eit\x8b\x7f*,Y\x93\'L\x87]\'\xf3\x17\xf0y\x8f?\xa1\x15l\x86f;\xc8\x8b\xc4|\xd6;\x8a\xb2\x87\x9b\x18\xe5\n\xbb\xd4(\xee\xa8\x8c\x02\xe6(L\xb6\xaf\x04\xc2\xc4\x8f;\xa0\'\xca\xfc!8\x13\x8a\xfc\xbbf\xbaf`\xb5]\x14w\x1d\xaa\x84\xb3\xb6\xf2\xae\x04\xb6\x9f\xa5QW\xf0h\x87E+\x9e\xaa\x80\x1b\x10h\x94\xde\x06\xca_\xbb\xd0P\xdfi\x81\xd2<Lh\xb2~\x8c\xdd\x93?4\x1c\xe3\xc5\xc0(AF\x8cg!\x19\xb1\t\xac\xb2+\x0b\xf9n\xa2;\xca\xd5\xfc\xb7\xfbr\x1d4\xbf{R\x19\x86\xe9-\x9aROB\x8a\xf2JEkQW\xb6\x93\xa1Lc\xeb\xdb\x14\xe9\xb5\xb9\x9eB[\x995EtfZ\xc6k\x92\'\xfa/\x1c\xeb\x129XE3\xceY\x9ch\x91\xa4\xa3)\xbe2\x1c\xd3_\x19\xb87\x83KP\x86\xfa(<\xc6\xca\xfb9\x91 yl\x85\xa0P\xbf/F+i\\\xff\xc3k\xc4N\x0f\xe7\xd5;u3\x98d|\xbc\n\x0cy\xa2\xe5_\x9aK\xa4\xd9\xf7\x89\xe8\xc1\xea<\x11\x07\xf2\x8f7\xe5K\xb8\xe9\x0623\x81\xca\xdbk\x15\x1c\xe7\\\x83\xc9Z`x\xa4\x8c\x92\x9b-\xa4\x0f%.I\xfe\xc0\xdf2\xff\x88\xa2\x82CO\x1aA\xf1\xc1\xb5#\xbd\xe8\x16\x0co\x1d\xe68v\xe3\xdbN\x8e<3\xb3A|\xda\xb7R\xf1`"\xdc\x8e+\xba\xbbz\x98\xdc\'=0\x13,=i\xaa\xaeg\xf0\x14ja\xcd\x00z\x8e\x1d\xd4i\xd1tV\x0bWv\x83r\xf4@\xa46\xd66\xef\x88 Y\x02\'\x0bf\x14bv"\x10\x85\xeb-\xcf\xfc}=\x08y\n\xe9\xcd\x91\xd8f\xebw\xa1\xe9\xcb\xd4x\x01x!~d\xa0\xa9\x88\xab+\r\xbeoM\xca\x8a\x08\xda\x9eI\x07HpL\x95~x\xec\x94\xe9\xaeP\x1ep\x84=R\xbeJ\x0e$\xd7\x85\xcb\xe2\xcc\xa1\x94\n\xa6S\x8aW\x9a\xae\xa7\x80\x87\xc1\xf7\xf6\xf3\x8b\xd4\xc4W\xf4#A.W`\xf6i\x82,\x89\xeem\xa6\xf0$\x82\xee;w\xbe\xd7\x83\xe84t\xdb\x1f\xd3y\xadS\x10\xc8\x88a\x1e\xd0\x91\xb0J\xab\xf1C\xa5\xc4a\xc4\xff9GB\x7f\xb3b\xba\x1c\xe6\x9f\xf4\x0b>j\xd5;Y]rJN\xda\x86[0\xed\xf0%\xba{u\xc2 \x03\xd6t\x992w\xd6\x1d\xfe\xb6d1\xb9S\xb7\xa2v\x86\xbfX\xbaGR\x11;r\x93\x08\x9f\x88\xcb|\xbe\xa9\xc8\x8d\xe8\x08z\x8f\xf8\x18\xeb\x85<\x86\x9f\xa0\x00\t\x89yd \xcd\x8c+\x14\xa2R\xc5(A\'\xbcbN$\xd5\xf6\xf2F\xc1\xf5K\xb7\xf3\x8e\xab\xadC\xe0\x8a[:\xd8\xa3Kvm\xb7\xea\xf1\xda\x8cJ\xae\xf6\xda\x94Pf\x99M%\x91\xaf\xbc\x12\x92\xb7\x87\xfc\xed\x0c\xa2\xdd\xd9\xd0\xf3>g\xa0\xeff\x18\xe7\n\x9d/\x15\x15?\xb2\x1c\xa5\xeb\xd6Td\xca\xfb\x14\t\xa2\xe4n\x08nY\x8c\xf9\x92D\xd3\xee\x9b\xd9w\xe1m]\\\x9d\x81iU\x1d\xfe\xdf\xa5\r\xa6\xaet\xad<\xdf\xf0\xd5Ru[\x7f\xe5\x93T:\xc5z\xe4\x91\xe3\x80-\x02#p\x1d\x9c\xf2<%\xdb\xf6\xa3\x0f\xd6\xaa\xdc\x0e\xe6[?h\xb8\xb1\x8fS\x191\xa0\xfa+\xc8\xcaA\xc3\x88\xce\x18\xfc|X\xa9\xac\xf9\xbe\xf44\x10\xee2\xf9\xbf\xd1v\x19\xf8-\xe42X\xf7/\xc30_\x97\xae\xaa\xc9\xdc\xc8\xbe\xbfk\xa1en-S"Ik\xd6\xfc!\x18\xe9\x9d\xd9\xdc\xb7*Z\xde\xfc\xcf$\'?\xb1\xebj\\G\x16\xfco\xee\xe4\xfe\xae\xf6\x81\xbd\xf3\xe5\xcc\xa8\xd1\xa5\xb7\xf4IO\x9f=\\\x0b\x8f\xca\x9f\x8d\xe7\xaa\t\x8b\xf0\x07\xcd\x9c=J\xdeZ\xfb\xfd\x04\xb3%\x00h^\xf2\t\xa50\xafg\xcdF\x1aRu\xb7\xea\x00\x86K\xa0\xe3\xacwV\xc9\xd7\xd7\'\xbb\x1e4B\x06\x1aU\x02\xf6\x86\xe5\xdfe\xe2\x8f\xce\x9d\\E\xde\xe8\xfc\xfc\x89\x0e\xe2\xf0\x1c\x9b\xa5\x86\xbe\x8a\xb5R\x15\xa7\xfb/\xccw,\xe3\xed\xaf\x91\xf2\xf20\xa4s\xd9R\xc6\xab\xf8\xa1ds\x81\x03\x9d|9xWc\xe56\x88"\xa8\xda(l\x99"\xf1\xba\xf6q3\xf5\xd0g};\x17r+\x08bMI3\xfcJ\x80]\xc7[\x93f\xdb4\xd6K\xd84?\x96\x06\xd3\xd0\x10\xda\x9d\x16\xa1\xfbG\xda\xcb\xd6\rl\x1a8\xa9R\xd3\xa4\xe8^S\xff\xa33me\xa3\xf93\xd3\x17S\x1fu\xba\x96\xc8\xe2\xd0\x90n\x18i\x0f\xef/)\xdb\x95\xe7\xdee?\xb5\xe4\x0cwi\x11i\x02\xc0\xc2\x01\x17\xe4\xc0\xe5\x98`2\x01\xdf\x9b\xc0\xef<\x9bs\n\xc9b\x83\xe9\xfb\xbaGu\xbc\x8fR\x13\x15\xf2\xfa\xff\xd8\xc2\x83>\x88\x9c\x8f\xf4\xbd\x022j\xbc>\xb1=A\r\xdcc\xd3p\xb8\x83a\x02\x7f1\x10\t\x1e1\xfaS\xf5\x9c\xde\x93\x0c\xe2\xb1\xa8\xba\xae\xa3&\x8a}\xc6g=\x01\x978uU\x02\'X\x1f(\xdd\xe9\xdec\xda\x1cC~&\xdb\xe6;w(\x0eB\x82\xbb\x07~w\x08\xb5\x0b\xa9\x00G\x86\x18\xc8\xb2{\xbc\xc1-\xc3\xe2\xa1\xc9-\x1bz\xe1\x05\xa0\xd1N\x9f\x05/&\x12g\xf3\xe3W\x8b\x0b\xee\xca<\xfc\xd6\x06$ \x0e\x88q\xe5\nw\xa7\xe5\xdf8\x9dm\x0b\xf7/\x89Cf\x85\x0cc\xcd\xb3\xcfx\x1dX\x02\xfd\x07^]\xbc\x07\xd04\xab\x98s\xda\x872\xc36\x99\x92\nxt\'\xe4\x97\xfa\xf5F\xa7\x84\xd23\x12\xdf\x9aD%\x95!\x14\xdczT\xf3\x1as\xb0z;"\x14\xa9\x94*v\xb5\t\xfe}44\x89K\r}(\xf9j\x1a\xfe\xe5/\xc6\x17\xd4\xc9\xaa1@^]\xff\xcb"(\x10\xd8p\xdc\x96\x87\x86cI\x86\x14T\xe6\xbb\x00c\xc1y\xea\xeds\x8c\xb6%8\xfc\xd8\xa5\x93\r\x9dd\xd0Q\x04\x1b\xb8y\x14N?\x07\x1a\xdf\xbe\x12+{\xc3\x11\xe2\x1f.\x05\xbd|\x95\xddn\x7f\xd02\x02\xcb\xcf\xa9S1\xeb\xae\x9f\xb32s\x1a\xd5$\x99\xdf\x94\x93\xcb\xa8U#f\x97B\xe6\xec^|\r\xcd%3\x93,\xc0\x00\xab`Gw\xf5\xb6\x18s8\xfdn]6\xce\x1c\xfc\xa3\xf7*w7G\xfb\x8b}\xb7\xd3;\xe1\\4*OH\x1b\x0f!FL\x80\xeaj\x97\x07\xf3-\x10\xf9M\xde\xef\x0c\x89\x9c\x1b:\x18\xc9}x\x02h\x85\xe5}\xa7\t7\xd9\x00\x98\xd4\x9b<\xcdU\xb6\xfa\xac\xe2>\x9b>\xa1\xf1e\xcef\xff\xe0\xbb\x18)C\x818\x08T\x05\xa0\xee\xcb\x9e\xcb\xf0\x15\x80^79\x04\xe8\xb9\x113\x93s\x1f\xd1\rM\x06KLOK\x8c\xa3\xc7\xa2\xdaTO\xff#\xac\x01\xcaV\x15\x0e\xd4\x07\x83T\xff]X\x14,\xc8G\x07p\xc3\xd7\x19\xdd\x00\xb64\x03\x97lS\x92E\xe1cU\x12\xbe\x83\x91\xdd\xaa\xb0\xfbm\xbb\x90\r\tc3\x85*=\xda\x03\xd2\xed\x11g\xde#FFl\x8a\xb1\x11\x8c\xd33#\xe6\x0f\x1aA%\xdcm\x81\xe6\x933\x81\xae\xb0lu7P\x83\xe3 \x98\x9b\x91\xc8{o>\xa3\xcaQ\xbaN\xd7\xad\x02[\'\xf2T\xf0\xc0"\xe1\xc3\xe4w\xbb\xa7K\xf7@s\x08Hv\xba\xb5@Vi\xaa_\xd1f\x9cF\xf4\xd5ym~\xf3`\xd8\xa5\xe1\xf7\x85\xc6\x92b\x1a\xda\x12B\x1ek\x93\x97\xce\xfe\xfb\\\xe3\x14Ck4\x05h\x9dF\xc7\xc0]L\x0e5\x98*TA\xe7\x0fh\xe6\xdaP\xdc\xe5\xbf\x0b\xef\xf1v\xeb\xac!\xeb\xde\xbb\x01w\x16s\xf9n\x9d\x9f\x93NI&\x9f^\x1e\xb8F$H\x13Ak\xa4\xadXd\xc0E\xc0\xd1\xb3\x89\xbb@\x93n\x8b\x17r^\xd2eD?H\'\x9f\xa0\xb9\xeeqJ\xf4\'\x82\x8aeF\xbe\x8dQGzv\xa9\x8a<\xb7}A<\xf2\x16\xd78\xf7\xbd_\xe9\x01xL\x06E\x00\x1at\xfb\x1dh5\\\xd2\xc6\xc5\xb1\x8c\x15?: \xd9\xc63?\xdc\xe1O\xc8\xdc\xad\xc3\x8a\xe2\x90Mt\x12\xd68\xcc\xebg\xbd\xe0aZU`UV\xdfH\x8f\xd9f>H_q-\xd6\x90p\x02\xbe\x92#\xc5\x00\xaf\xba4~!\x16,\x19\x8c\x9b\x92\xfa\xc7\x0b\xce/.U\xed\x01\x0c\x98\xbe\x0b\xe4\x81\xfc\xe3T\xbd1ei\xa0\x99\xa3\x01IH\xf4\xf7A\x1f\x19\xf9\x95\x9eB\x15\xbaj\xe4\x94-\xa9\xad\xb8\xb4B\x11\x86\xd5\x08w\xd3\xb7\x1d\xd4\xa5\xe9\xc8b\x13\xe1\x99;/^\xcb\x8b\x1bQ\xc3\xcb,\xfex\xadl\xbd\x1a\xfdG\xbc\xcfZ_\xf0q\xbe\xb3X\x04A\x8cu\x8b\x1e\xe7B\'V\x111\xa0\xa8\xb9\x9e\x90c~\xcb\xb2,%m\xca\xd2\xe0\x03\xb7\x9d=\xfe\x95\x0e\xc3\x14\xa2|\x88B2\xbe\xaf\x99\x99S\xcd_\xcf\xc1\x86%\xa0H\xc0\xb5\xa4\xe8!b\xf0\xe9\xf8\xe4\xc0\xc4\x0b\x91F\'/\xa7\xb6\xfb\xb8$\xd3>\x92Rs\x19.\xe5\xc2(\xb5\xb5\xdd\x08?\x1bN\x01\x95R\xf4\xc7\x9a.M\xa3\xd7\xf2\x85c*\xd1^\x9f\x02\xdd\x1c\xba\xa9Y\x08A\xbd\x9bV\xaf\x9c|\x05\xf17=\x85#K\x17u\'\xf2Ku\x1f)\xd2\x81\x7fB\xe0\x86\x95\x99\x91D\xfb\xe8\xae\xce\x05\x17\xdf\xf6K\x86\xb1\x8el\xb8\xf5s"\xff\xef\x84X\xa4\x9c\tl\xf4i@\xbd\xa3\xe08\xb0\x1c\x15\x19@^\xfe\xf56\x05C\x11\x11\'8\xc3\xe04\xf5\x856\x9b~)+\x8ei\x8b\x8a\xfe\x81\xd0\xf9\x04;\x13\xca\x055,N\x9c\x1d-s\xa4\x05\xf7\xbe\xa4\x15\x8f\xea\xe2\x14\\9\x9b\xa6 \x99+\x93q4\tI\xf9\x83\x92\xf3t$\x8f\xf2\xda\xc8\xe7zfX\xd5\x95\x98\xf6\xa3\x9b\x8d\xb2tg\xa9\xe7\xdc\xca\x91%\xa0=i\xc6V\x05\x07\xce/\x8f\xd0>s\x11E\xdb\xb7\xa7N\xd2\xda\x98\xe0\xe5\xce\xe2\xe8\x8e\x0f\x0e\x9f\xd83\xb3\x88\nD\x12\xb4\xed\x8e/L\x85PT\x0e\x1a\xaf\x99\xad,#\x91\x9e\x9b\xbf6\x87$\x1f\xf4\xe0\x99\xb326\xd90\x95\x1b%\\\xf6\x88\xa6\xbe=\xe1#\xc3\xb2\x9b\x82h\x8c\x08\xaf\x12\xc5o\x90J\xc1!u\x8c\xfc\xb7U\xe4\x9d\x08:G\x19{\xad|\xcb\xca\xad;8\x0c\t\xd3\x7f\xdf\x80\x1eZ\xa8M\xb7\x7f\xf3\xffG\xbehD\x05\xd6H\x9f*A\xa2\xb1\xd9-L\xe1\xc5\'\xce{\xcd\xbf\xec\xea>Zq\x17>BI\xbd\xc7\x1c^\xacG\xcf\xe2\x9e/\xd6\xae\xa7\xff\x85sk\x9ey\x19d\xde\xdcB\x12\x8f\xe9\xde\xa1\xe6\xa4*\x19\x9d\xd1N\x05\x1994\x9e\xe8\xa2\x0b\x7f@\xb5\x0f\x9f<\xa7\xf2\xf1\xc8\xe8\xdcq@\xb4\\\xb28\xc8\x82!\xeeS\x0c\xaaw\x86\xb6nh\xcdw\xcf\xa9\x10\xfe\xe3^\xdax+6\'\x0f\xca\xb2\xdf\xbe\x15`989\xde\x1b\x85,a\xaf\xdcq\x8b)\x86\t\xd8\xb8\xf5S\xd5G\x07g)\x02\x03\x16^\xf3\x87\xab\xabQ\xdb?\xcf\x90\x06y\xaa\xabM!>a\x9d\xdb\xea\x98`]@\r\xb7\x85\x06\xe6\xa97\x0c\x12\xa8{yv\x0b\xcd1\xdc\xcc\xba\rm\xcc\x04dkc\xe8\x1c-l\x8f\xf8\x98K\x9b\xd5\xfd\x92\xcf\x81\xa2\x1d\x85\xb0\x06\xbdl+\x19\x96a\xe2\x01\x07\x81\xa9\xc6L|f[/rVa\x80\xe8\xce\x83\x0b\nS')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.base import AdminIndexView,expose
2
+ from hiddifypanel.panel.hiddify import admin
3
+ from flask import render_template,url_for,Markup,request,jsonify
4
+ from flask_babelex import lazy_gettext as _
5
+ from hiddifypanel.panel import hiddify
6
+ import datetime
7
+ from flask_classful import FlaskView,route
8
+ from hiddifypanel.models import *
9
+ from hiddifypanel.panel.database import db
10
+ from hiddifypanel.panel.hiddify import flash
11
+ class Dashboard(FlaskView):
12
+ def get_data(self):
13
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
14
+ return jsonify(dict(
15
+ onlines=User.query.filter(User.last_online>h24).count(),
16
+ total_users=User.query.count(),
17
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()},
18
+ usage_history=get_daily_usage_stats()
19
+ ))
20
+
21
+ def index(self):
22
+
23
+ bot=None
24
+ # if hconfig(ConfigEnum.license):
25
+ from hiddifypanel.panel.commercial.telegrambot import bot
26
+
27
+ if hconfig(ConfigEnum.is_parent):
28
+ childs=Child.query.filter(Child.id!=0).all()
29
+ for c in childs:
30
+ c.is_active=False
31
+ for d in c.domains:
32
+ if d.mode==DomainType.fake:continue
33
+ remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
34
+ d.is_active= hiddify.check_connection_to_remote(remote)
35
+ if d.is_active:
36
+ c.is_active=True
37
+
38
+ return render_template('parent_dash.html',childs=childs,bot=bot)
39
+ # try:
40
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
41
+ domains=get_panel_domains()
42
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
43
+
44
+ if def_user and sslip_domains:
45
+ quick_setup=url_for("admin.QuickSetup:index")
46
+ flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
47
+ elif len(sslip_domains):
48
+ flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
49
+ elif def_user:
50
+ d=domains[0]
51
+ u=def_user.uuid
52
+ flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
53
+
54
+ # except:
55
+ # flash((_('Error!!!')),'info')
56
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
57
+ onlines=User.query.filter(User.last_online>h24).count()
58
+ total=User.query.count()
59
+
60
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()}
61
+ return render_template('index.html',onlines=onlines,total_users=total,bot=bot,stats=stats,usage_history=get_daily_usage_stats())
62
+
63
+ @route('remove_child', methods=['POST'])
64
+ def remove_child(self):
65
+ child_id=request.form['child_id']
66
+ child=Child.query.filter(Child.id==child_id).first()
67
+ db.session.delete(child)
68
+ db.session.commit()
69
+ flash(_("child has been removed!"), "success")
70
+ return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
71
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,196 @@
1
- # 2023-04-08T16:23:32.163224
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\xe3\x1f\x00\x00\x12\t\x04\x00\x86\x86!\xe0#_\x92\x01smg\x88\td\xea\x8b\x00\x00\x00\x00\x00\x00\x00\x007\xa0\x0f\x1b\xff\x17\xe3>u\xf0w}\xc6=!L\xb1$w\xfd\xa9\xf5\xb2\xd1g\xbd\xd2-`\xeaC=;\x15\xa4\xf5\x93*\xee\xc2\xfb5\xcb\xd0\x98\xdd\xe4\x07\x13\x18"\xe4i\xa9`\xcb:\\\xae/s\xf6\xfc\x9e(\xf7l\x84\xa6\xc0>E|\te\x83\x17\xfb\x08\xbb[\x85D\x91\xea`N\xfe\xdc/\x7f\xb41\xbcv[9\xa4R\x8ad\xf0\xb2\x13\xd8S#WG\xef@\xff\x0f\x10\xab\xaaG9=\x19@\x17D\xebOu\xafb\x1e\xe0\x103<\xbd\xa06\x14to&^E\xd7(X\xa2\x87\x98\xab\x88\x05\x05\xc6\\\xf5\xfb\x99\xf5\xd31\x87\x94\x8dG\x111X\x1dY\x0e\x1fS\xae\x18<\x1f\x9ei\xf6\x042\x10\x84{t\xf9%`Nx\xa5v\x9e\xaa/;\xa7\xe2\xac\xa1\x7f\xf6\x06cRD\xc7Uv\xc4V\xe7f?\x82\xcbv\x0fK=\xdb\x19\xad3\x93\x01\x0c\x1dNL\x1f\xd1$\xd0\xabMK\\\x1f\xa8\xe1ZG\x0c\x99\xaas\xfc\x0e1.\xe0\xa2\x93\xeb\x88\r\xd6wf\xee4k\x99/w\xe1\xbb \xfe\xadIb;IO\xb9\xee"\xec\xbex\t4\xae\x1ccWV\xa00\x15\x0e<\xbb\xdc\xbd\xf3\xb0&\xf4\'\x1dE\x8cb\x1a\x84kC\xbc"\xab\xfd\x0fX\xb8\xba\t\xe7\x94\x06\x8a\xad-\xb1y\xdf\x8ar\xf5\xedOU\xef\x85\xf1w\x8c\x80\xdf\x8a3\x00\x08\xe9;c\xb2Ev\xb3\x81d\xad\xb5\xa7mO:\xa6\xcd\xfd;O\xb7\xc5 \xb3\x0c|p\x9e\x7f\xc9\x8b\x06\xf1\x99H\xe1\x9b\x10n\xcf\x7f \xd5\xfa\x03\x8f-\xeb\xe5\x7f~\x82\xd1\xee\x8f\x9fd\x8f\r\xad\xed\x06\xe3\xe7\x14\x8e+\xf0\x12\x1e\xaa\rk>\xe76q5k\xb0F\x1e\xb1\xb4\r\xa3h\x95\x9d\x0b\xdf\xbf\xd8B"\x8f\x82\xf1\x98\x064B\xc1\xf1\xaf\xdeKi\xef,~\x04)\xed\xbd\xa0\x93\rB\x01{\x82\x13\x92\xa8\x1eyt\xed\x95Z\x10\xbe\x165\xca\x94\xc6?\x9aQ\x16I\x1e)Dr$\xa1\xb3&\xc7XF\x91\xe0\xe1\xed\x08Y\xab\x01\xf8\x89&U\r4\xb5r\x95\\\xa7Z\xba\n\x1d\xdd\x0by\xe67\xd6\x1a\x9d`\xa7w\xc9\xb0\x1eR\x85\x1aV5\x85\x87\x0cu\x84\xf2\x9f\xe3\xdcJ\xb7\xd1l\x9d|Q\x94\x83\xe3\xaf\xc2\xe9z\xe6\x11\x1c\xeee\xbb\xaa\x92\x03\x14\x7fV\xac\xb3\x87\xea\xde\x1f>\x1f\xd4\xe2\x82\xc0\x93#\xe4\'?2\x85\x96:\x1f\xdc04\x8b\x92\xd2\x99\xf0Q\x1f\xd6\x885\xac\x02!\xd8\xbc\xb3H\xffc\xca\xa6\x96T\x13\x0cGL\xc2\x95RRW\x04JP\x96\xc0\x12\x7fu\x1f\xea\xa8\xfb5\x91\x87\xaf\xf2\xebaM\xec\x17\x87\x8f\'RYB\xcd\x90:\x9f\'\xb6\xba\xa7\x12\xc7\xacxSZ\xcdy\x85y\xd1\x018\x14\xa2\x1e\x176y\xc3O\x03\xd6\xe6:Z\x04\x116&\xe8\xfdI\xd0\x0bg\xf2<$#i\xb7\xb3q+?Z\xb5\x17p\xd4\xd1\xd0\x9b\x8b\x7f\xe7\x889#\x08#\x8e\xbe\xdc\x96]a\x93\xef;<\x1c\xf4\xe8\x82Ds\xc4s\xa9\xca\xb0\x95\x81\xcb\xd0\x1c\xf5\xd49\xa3\x94OQ\x85q\xa7\xac9Ev\x97\x97$3\xd3\x1b\xee\xc1\x95!7\xa6N\x02>*6x\xbe(=\x0c\x14g\xc4\xc4\x04*]\xa5J\xa6\x1ft\x05\xda4\x0e\x1c\xd5g.\x07\x1f~\x97G\xa9<\xb5.\xba>\xef\x05T\xb0O\xab{2^\x97\x9d5C\xc54\xb8\x02=\x95\x85\xe2\xd0H\x07`\xa0\x8e\xe1\x13;\x0c\x94.\x83)\xd1l\xa5\xcd\x0fP\xa9\x92\xf7\x99\x931b9`\x07\xe0Qi\xf0\xe2\xc7r?I3\xe3E\xc3,\x11|\xc3\x1c\x0eX\x89\x8b.\x0bK\xff\x95\x94\xf5~\xe4\xfb\xa1\xbbW\xe8\xde>\xc0\xc7\x05)\xfdhaY\xe2\x16\xd9\xc5(\x8fV\x94\x88a\x8eR\'\xd0\xe9I\x9f\xb0\x07\xe2D\xeb?[\x8a\xbe\x12\xf8=\x0f\xba\x00\x0e\xec\xe6\xa1\xff\xdb\xb7\x8f\x17\x87\xcf\xb6\x14\xc1|\x9e\x11\x85\xbf`\x9fg\xc88\'j1L\xee,7)\xc3-\xe9\xf0\xcdF)c\x94\x91m\x9d#\x84#\x92\xbd\xa1\xe2\x1d\x12G\xb3\xdcW3\xe6\xfe;x\xdd\xcc\xe7_\xfe11<\xa3\x06\xf6\xdc`\x84oC\xd0\xc1ro\x02\x83\xd2\x93\xdeSjOi\xefd\xb7\xc4\x05\xa95\x97L\xde\xbf\xb6B\x19\x0f\x97\xd95"e\xcb\t\x19`=\xcd/\xd2\x85\x1a\xe8\xb0UM%\xf7\xe6\xd0\x1ad\x82\xe1\n\xa0\xeaI\xeb\xab\xa4B\xfd[\x04\x8c$\xbd\x8f/\xb5N\x8d\xb1\xe5W\'\xa7\xf1T4N\xfd\x83\x1cS\xea=\n\xf1!0^"#\xdd\xa8$\xdbR\xabv\xdfi\xc72\xe3<:\xa3v}\xcf\xc9\xf9\xa7\xec\r5F\x03a\xbe\xfd=\x1c\x0b\xc1\x89\x9a\xd5\xa9\xf59Y\xd3V\xdf\xba\x93\xe4&\xa9;\xf1wWn\x13\x15R\x11:\xdeq\xd4M\x7f\x0e\xbc\xf6\xd5\xdf&\xa7\xc0\xe8%x\xed\x9e\x1c\xf7\x8d\x04*UE\x0e#;\x80\xb1h[\x8d\xcb\x01OzdAJ\xf9\xdbC\xa7o\xb3\xa1\xbeD\xa3l\x88\xa9\x16\x19\x04\xa7\x1a\xbcR\xc9\x80\x01\xc3\xfe\x83\x9e\xea\x0b\x88s\xc1\xffr\xbc\x9a\x0f\xf3\x05P\xc8H\xb4\xbd\x8c2\xe4\x19M.}\x18\x16D\xad\xa7\x8b\x868\x1f\xda7[\xfa^\x16\xa2\x11\x88s\t.\x8c\xb8\xb3\xb4\xb7\x1a\x04\xc3\t\xae\xca\xfb\x80\x17\xe4\xbb\xb3FfV\x98T\xca5\x11?r\xa6\xa53\xf9\x8e\xf7\xdb\x82r\xf53\xef\x959\xfb\xdc(l\x95(\x89"\x15\x04\x02\xd0\x84\xad @\x0f\xee\xc2\x06\xb1r~\xae\xb0La\x89\xbd\xda\x128\x801R$\xb4S\xe3\xb0\xf2Ny:\xa0a\xe1\xd4j-`\xa60^xb\xcf\x8eLq\x91\x87\x14o\xba\xf8\x07\xd0F\xeb\x12\r\x9a#a\\f+r(\xd3\x8c\xc9]E#5\xeeP\xcd\xa3\xc7\xd0/\x92i[6\x9e\xd3\x89\x11\x0c\xe4\xae\x9cY\x16wEZ\xeez\x1d\xda\xd3\x1b\xc3\xd3\x89\xeb\xc0\xadu\x9d\xb6\xe0A\xbbj\\\xf5I\nG.;c\xba\xe85@\x03\x05U\x0c\xbdJ\x86\n\xdb\xc9_o\'\xc9\xcf\x07\xb3DR\xb6%\x85\xca6\x13j8\xc0\x00R\x80.\xd6\xf4!\x18\x01\x9c\xc2\x05v0\xfdU\xdc\x9b8l\x86\xfcN\xca?\xb5.\xb6\t\xf5*e\xfa16\x99}B\x17\xab\x87\xf6\x02D\'\\\x1b\x86\xd8\xef\xa4\xd5\xbb-\x9fQ\xf1\n\xbc\x7f\xd6\xa8E\x80\x94\x83\xef\xc6\x9f/-\x8c\xc6c\x8f#\x17\xe4l0=\x84KBd\xa1\xed\xe9\xdcv\xaf\x8e\x1a\xaa\xf9\xab\x17\x9a\xe2 \x0b\xf2\xde\xd2}\xd4\x8f\x19\x90L\n\x02q\xcb\xd0\x0b\xb5\x82D1/\x88\x05\x8a\xc2+G\xe8*\xfe\xd7;\xa0-\xfd-\xe9\x15%\xb1\xbcEuC\xbc\x03\xf5\xa0!\xbf\xa8\xba\xe9\xea\x9d\xe1\xd7\xda\x87b\x87\x86\xb2\x1de\xceK\xc8[\xbd$l\x8d\xbf\x98\xad\xb28V\xdbz\x02\x95XQ\xd5\x12\xa6jK@\xad\xbf(P\xf2\xd6\xe3\xc8f\xde\x01\xbb\xb1\x89S\r|C\xb7\xfd8\x90\xb6m\xad\xd1v\xc2\xff[\xd0F\x8a$7\x9dQ)\xd2"L\xaf\x7fN\x8f\xae\x07j8j\x8a\xc4\xd1[5\xff\x03>G\x84\r\xfeE*\x88\x1e\xe4\x11\rU\x04\xd3\x07\x94L\xf1\x94\xc3\x07M\xc8\xcfl^\xb1\x15\xb72u>\xa1\xda\xe6\x17A\x1c\x97\xa9\xc73*\x93C\xd2a*#A\x9d\x0e\x90\xfc\x12\x12\xd1\xb28\x14\x99P2\x88\t"\x00\xf7^\xe1#\xef\xcd\x98&T\x8d\\\x04\x8d\xa8SX\x1b\xda\n\x01\x87:h\x17\xe4Sg\xeet\x97\xc5\xbcF\x89\xcf\xd0\xae^\xe4\xc0\xbe\x94\xabd\xfec\x8d\x8e\xfd\tt&\x0b&D\x81\x82\x8cn\xe4\xe1\xd4\x8a\x82#6\xa7)\x10\x9e\x0cF\xce\x91`\xe9\xc3\xc6\x06\x8b\xe2\xfd\x0f\xe5\xe7=\xa3b\xd6\xb9\x1b\xd71\x02\xc4\r) \xc9A\xdb\xa6\xbc\xe8\xc9\xce\xc0\x1dI(\xf2\xe9h\x13]\xdf$\x1c\x92s\xf5\xe7z\xe1\xed\x8f\xac\xabQ3\xfdqK\xcc\xb6K\x90\xb0R\xf1\xceBU\x0e\xf6\x01\x15\xa0p\xf0\xd82_>\x0e\x1e\x88w\r\xcb\x93V\x99\x95\x11d\xa3<\x11\xc1\xb5M\x86\xae\x8d\x953-_B\xad\xa3\xdf|\xb3 \xe3\xd4\x90 \x95\xc1Q`\x02\x00A#\xe2\x06\x13\xb5\xbb]\xa3\xee5Y\xa8\x90?S\xedgmU\x83\xb2\xfc\xaf\xacFc\xe6\xc1\tT\xf9+zM\xb3h0\x97\x00\xa8\x04\xc2\x88\xcc)\xf9V>m/\xfc\xc3%\xae\xfc\xc2\x91\xe2 hj\xda*&j\xfb\xf4v\xa7zg\x14\xa2\x9b\xa2\xd9\x84\xad\x8f]\x06xUtS\x9c\x19\xba\xe9\x1cw\xa6\xef\xff6(e\xcdu\xc02\xc2\x1e\xc1l\x92T\xda}sN\x14d\x9e\xed\x96\x14k\xca\xd2\x8d\xe0B\x95\x12\x83\xb1c\xdbWF\xd1\x95\xc33\x969\xb8O\x02\x117\xcbf\xb7]6C\x80\xd2\xaat\x15E\xfb\x85\x9d\xc3\xd3\x85\x7f\xe4N6\xeb\x92\xb2\xdd\x9c\xb5\xef6Z]Gg\xb8\x1c\x84R\x9f\xbf~\x9d\x08\x06Q\xc6\x11\xdf\xd9\xdb\xc0xU\xa5\xccQn\x8d\xa8\x00+\xd4\x1f\x97\xd8\t5\x84\xeea\x10~\x9f\xc8\x7f)9\xf8B/\xac\x91>\x8a\xe1q\xe2\x96\xbc$z\x8e\x9e\x06\xb6\xd4\\X\xadh\xa2\x10\n\xed\xd5\x94\x9fxq_\x08\x966@\xd3\xa8\xf8\xb6\x0ex\xd6\xd9z\xe7\xcc z\xa9,\xc8\xa4Dh4\xf4\x01\xf8\xffY\xc4mv\x8b\xce\xb0\xe2\x89\xeb\xd9I\xde\x17L \xa540\x9c\x90\n\xd6G\xf3\xc79\x1ap\x854\xe89\x8a^\x81j\x81k\x93\xae\x1a\xf4\xc0\x90L8$\xeb\xe8^\xb3\xe0y\x03\'\xf5\x8a\x95\xd7)\xeb\x06M\xd9\x88AX[\xec\xad\xd2\x04\xef\xf9~\xaf\xaa\xfap\xadh\xff\xccna<\xc2\xe6u\x0f\xb8\xa2\x80\xb6Y\x0b\x16y\xc0\x1et\x1b@\xa2\xbb#1\xf6\xf8\x042*\x01\xc62u\xeb\x07\x94\x84S\x07\x1f\x11>\xf6\xed\x9cd\xf6\xa6\n\xa9J,firx\xc3g\x1c\x02\x91\x81\xbdH\xe1nY\xec\xe4\xbc\xa0\x86\x11F\xe4$\xc9\x7f\x0fI\x0c4\xa9\xd13\x99\x18\xfc(\x9a9\x85\x16\x8e\xd9\xc89h\xad9\xb6\xd9\xd1\x13R)\xb7\xb1\x05\x82\xee\xfc\xd6\xda\x0b\x90\xae\xd9\x0c\xc4F\xca*\xab5\xe2U(!\xfc\xdb\x17\xc7\x0f\x90\xc8^\x1c\x87q\xee~5\x9b\xc1\x18\xd4\xe7N\x9a<2\x10Q\x80\x98\x1d\xa0\xbbq\xef\xbf\xf2\x94o\x91\xf3\xa0B3g\x91\xf0?n{\x8b8\x18^\x96\xaf*\xcbJ|^#\xf1a\x03\x0c\xb9Z\x96\n\x9e\xed\xc4=\xbflL\xde\x1dvs\x85\x92\xef\x92\xef:\xbe\xbe\x85]\x82\xa6^z<\xa7\x1ch\xd01P\x18\xbbW\xa3bIG\xc7\xde\x90\xfe`\x00Q\xa31\x1a\xfd\x87r\'\xb0\xd3\x84b\xe2\xed\x99\xe2\x89}\xe6\xbc\xd7)\x16\xd8\xd09\xa5\xec\xe1ac\x86;4\xcd9\xf5$c\xd6\x83M\xabM\x9b\xa48B\x16P\x1e$\x16\xd9%n\xc3\n\xa0\xb3\xbc\x90\x87\x88r\xf6\xe5\xd31L\xa4\x7f\xfab\xdf\xd9\xf3\x89l\xdc\xd8\xfby[{\xd2\x11\xf1\x8b\xbcI\xd6\xbbU\x8f\xdc\x02\xbd\xbf\xc8\xe6\x81O\xb5x\xd4:\x95d\xb0"\x17\x9e\x0bT\xf8<d=\xe0\xd5r\xd9\xfd\x90{\xa7m\x13\xf1K\xf9\x02\xa0\t\x0e\xb8\xc5a_.\x02\x8e\x11\xe2\xb4\xbf#\xa1\xdfh\x8c\xff\x90\xe9G\xb6#\x15f,=A\xe2\xc2\x84\xaa\x11\xdcAL\xb2\xb8\x06\x8a\xf3\x10\xcf\x0b^\xbe\xedt[\x1eY9h\xd5v\x01U{2e\x1dI3\ngG\x1c\t\x03\xef\xacQ\xc4\xe5\xe4\xae\xd5\x96`g\xb5\x1c\x95\x12\x85?B9\x8f7\xbeK\xa1\xf5\xc1\xcfY\xfe*\xcf7\x8b\xab\xde\xa9\xe1\x9b\xeb[\x7f,q\x10\x11\xf4R\xf6\x16\x1a\xe9\x9c\x81Y\x7ff\xe8\xf1\xf4\xe0\x92\n\xaa\x9eC\x1c\xa2\xfbgl0\xf9\xec\xf5]f\xd7\x08\xcbu\xbe\x08\x8b\xce\xd9=7\xb0t\xee\x03\xf6;^\xb7\x12\xe5\xad)\xe8\x8dl\xd1\x87Lij\xfa\xd2\x9bRZ\xd8V`\x05{\\fx`\x02\x01m\xd5\t\x07\x18Q\x8f{\x8d\x00\xa9\x1a\r\xf7\xbdc\xf3\xbe\x1d\xa7\x0c\x04/-\xc5\x8e?\x96\xe3[f0\x05\x92\xa7\x02\r\x8aBX\xd4\x90YW\xe1 \x03QT\xac\xd3I]\xec\xc7\xd9V\xabFq\xe4u\xfa\x01\xf8?\x13^\xe5Qp\xa4\xe5\xd4\xb5P\xce\xc4\xd9\x89KC\xf8\xd0\x8a\x96aM\xa7\x91\xfd\x1b\x92\x85\xb3P\xc4\x01\x91\x94\xd3]\xa1\xf5\x1b\x18\xd2\xa5\x1ao\xd7\xab\x8e5\xdc\xde\x1f\x92,[0\x90\xab\x1dZ\x129\x00\xae\xab,\xeb\x99PI0J\xff\xf4\x9a\x1cK\x9f}IQ\xa6(m\xa9\x88\xbd\x88e%,\x8f9\xbb\x9c\xafD\xa0j\xcb\xb5\xdf\x9a\xae4T\x1d\x06\x16B;\x0c7T\xc0\xdd\xe1\x83\x81\xf9\xa4\x892z}\xa6D\xe7\xd8\x1a\x8a\xd6\xac\xecw\xa8\x0c\x07\x04\x8a\xfc\xddWY\xe6iR\x13c\xba\xf0\x90\x97\xbbh\x87^\x17M\xc5\x00K`[\xd1\x18\xf7\x96\x8a\x1b\xdf\xf21\xe1^\xa6\xb6\xd1>\xa9Ya\x95\xe9\xad\x87\x07\\\x9ck\x16(D\xf9\xd3\x14\x18q\xe1\x91A\xd5\x13\xb5\xf4\x1fV\xbd\xda\x8e~O\xf2\x81x\xab\x88r\xb4\n\xcb(_\xd3\xac\x96\xe9\nv\x8c\xde\xfb\xfa\xa2\xf0\xa5yT\x04\x14\x0b%\x87\x0e,j\x8et_\x0e\xa0\xa9\xbd\xfe\x86\xa0U\x96\x17\xaf\xb9\x03\xbf^V\x19\xed\xa7v\xa8\xdfgx\xca\xb6\xf8BV\x17\xf0E\xef\xa9\xa9\x03D[\t\xcf9\x90%\xd9\xa9_\x96p\x97i\xf4\n\xde\xf0\xf5^\xd8$\xf8\xc2\x84\x1fd\x8d\xf0j\xb5t\x18\xa420\xd1X\x07\xc1\xbe\x90\xa1\xa4\xaa\xdbbS\xab\xc8\xd6\xd2\xdd/\xfeeM=(\xa1l\xc3\xb0\xe0HE?\xb0a,\xbd\xc0P#\xaa\xdc\xde\x1a\xfd\xd3]\xe5\x95\xa9\xa6?%\xa0/\xaem\xa2\x87\r\x01\x97\x952\x0e\xa3\x0f\x88\xf4\xaaC=\x0c\xe5\xa4\xc3.\\\x13e2QL\x94\x14\x97F\x8bP2\xc8f\'9\xdcd\x81\xdb\x98\xa7\xe2"a\x17#_\xb9\x11\xba\x13S\n?q[\xefiW\xdah>)]M\x16\x0e\xb6\xbc\x19\xcb\x19\xf3\xfa\x1dZD-u\xab\x96\xa0}\x16\xbfs\x82\xf4\x93>\xa4\xbeA\xa7\xef\x8fes\xb8\xa0\x14\x8cJ\x9bD\xd4p(\n\xf1L\x9f\xb63\x94\x93E\t\xb1\x1cl*`z=8\xd4g\xd7\xecr=E5\xe1t\x12\xea\xbe\x1d\x8d\xa6\x8a\xd6\x0b2\xfd\xa8\xf5\x82\xf0\x16\x1c\xf7r*\x13\x9f>:<$\xb2\xfew\xd7\xfa\xc0\xd4\x01\xa3\x1a\xa5\xa5\x8c\xad\xbc\xdd\x90\xee\'\xd0j\x91\xef\xb8\xec\x90\r\x80\x9cx|a\xcf\x01q/\x92of\xc3k\x86\x88\x18\x05}C\x99W\x1b\xac\xbf\x16\xf1v8tK\xe9\xfc\xd8\x92L\x17/\x02\x04b\xe5\xba\x9e\xe4S\x9a\xaf\xee,\x1fJ\xc2\xd2\xa6\xfaO\xd6$\x9eOm1\x17\x8e\x9b\x14;\x02\xe0^\xc8\x14\xad$+r#\xe0\xf2\x0c.\x1b\xfa\x1a\xc8\xfdJ_@\x86\xc8\xab\x03\x84\x1dE\x0cp\xed\xdf\xba8)\xff\xb3\xe2\xcf8\xf3:\x1b\xbd\xfd\x9e\xa8y\xec\x14\xc0(<5)[\nQqc\t\xa6\xc7\xe4\x08\x97\x93\x08\x05\xedx\xa2\x8a\xa5\xe4a\r3\x15\xf4\x96\xe7\xf7\xd8\xe6\xbc\xfe\x96\xb0\xab\xc7\x93>\xe5:\xbc_\xa4f\xab~\xf7\x81\x08\xbe\xb4\x17\xa0P] \x9d\xd5\xaebz\xfa\x13\x88(\xdfAK6)\xc2\x80\xd3\xf6b\x9cD\t\xa4H\'\xcb\xf5\xd4.\x0e\x94>:\xec\x89\x95\x85\x1c\xa4 \xa8\xd9T[60P\x04\xc9\xcb\'X\xe9\xe2s=\x8d\\\xd6i\xbb\xb4\xcf\xdc\xeb\x8ff7\xe6\xe5\x8c\x85\'3H\x8e\xaad\xf5oy\xf4\xf5c=\xc0\x0f\xfcD8\xf7A\x83\xa4\x9f\x0e\xeaR,i\x93+\xde\xd8\x1f\x1c`\x94NE_tM\xe4j\r\xd1\x8a\xa7\xbb\x0b\xcd\xf3\x8b\x8e\x01$x\xf5\x15\x04f\x05\xbaO{\xa1\xdf\x06JUxS\x95\x07\xa3 \xff\x1d\xf8\xf3\x9bM\xad\x04\x12\x13\x9b\x90\xcef@y\xa3\x7f\xcd\x95q\xd1\xc0\xd3\x7f\x9d\x8fQNK}[\xdd\xcd\xd1r\xae\xa3\xe7\xf3\xc1;\xfc\xf0\xe9\xd6k\x1a\xf2\xbf\xe6\xfd^\xf7\xd8\x82\x139\xa9\x15\x89\xc2\x90P\xd7\xc1+\x9f\xb2\xf5\x14e[\xde\xf4u\xc1\x11@\x8fq\xc7X\xf7\xb6;\xd2.\x0f\x9a\xec%\xc2eMV\xcf\xfc>\xd9?\x88\x06\xcb\xf1\x99\x04/9\xaf\'9\xf7\x815\x87\xe2N:\xca\xe5\xf4a\xad\x85?\xf1\x85\x96\x89\x82\xd7\xbb\xf7\x14%\xc2\xe2\xfep\x92=\xd4q\x9e\xdfJ\x93\xe7\x91\xcc\x1e\xfd\xad&\xb7\xfb\x82\xc7\x14\xe9/H\xf1Ma\xb4f\xc3\xf3\xe3\xe5+x\x17\x13\x80\xb1Z1\xb9\xb7\x8fi\x8f\xfe\x1e\x86\x18\x0e\xe9\x9f\xd6\xf9}\xa3\xf3\xf2\x9eT&\x95\x05\xe4\x07\xa7w\xb9\x06O\x8e\x0cFQ\xb3\xb4\xc88\x1e\xa0\x84\xf0\xeb\xc8bMG\x08k\xae\x1b\xeb\xab\x17%\x1a\xc9\xc6>4\xcb\xac\x1c\x14\x9dU0\x9dI\x16\x9e\x92\xf9|\xf3\xe6k\xe7\x15q\x0b\x91J[NM\xe8\xc6\xe0\xab\x84\x1b\xady\xea\xaa\x19\xa6\xb0Q\xc12ohqQ\xa7"P9\xe1r\x99\x811\x8a\xe4H\xc1h\x81S\xb6\xd9\xb7\xd6U\x90\xa7;\xa8@z\xb8 \xd7\xf7k^S]\xa8\xa0\xbaX\xaa>H~wYq\xa4\xfc\x8b\xe5\xd8\n\n\xb7\xf8\xf3\x0fa\xab\x07D\xba\xce\xe4\xb7\xd1TA\xed\xcd\xb3MP\tA\x90kQ\xe1\x1e\x9e\xe4G\x06+\xf7\xaa\xc3\x9bP\xfdl\xb4\x15I<r\xbf\xb2V5E\x92S\xe6\xd66\xa5f\x85\x9e\x1c\xc8\xcd[\x1658\xd8\x16B\x1f\x810\xf8\x00Oz\x84\xad\x8f\xb1\xaa\xb4p\x15ZK\xad)9S\xbc1\xdb\x80vv!~\x8e/\x81\x04\xfe\xadU\xe2\xb9`\x9e0O"\x85\xf9\xf1:\x1b\xf9\xd59\x90AM\xa4\x9e\x9a\x93\x9d\xf8\xef\xd1\xf4\xa2\xb2\x194\x8c@]\x05R\xa5\xab\xbd\x1d\xea\xd8\x12V\x81\x85`a\xea\xad4\x968\xac\xa2v\x10\xc0\x1f\xbd\xec\xb7\x05y\'-\xcd\xea\xed7\r,\xf6\xbe\xfc\x87\xf7\xaa\xdf\xdedk\xfb\xf9\xb1S>\x86\xb1\x01Z\x8a\x1a\x07\xb7\xf6cn4E=\xe5\xa7\xbeu\xc5\xb2@\xdb\xb3\x19R\x1b\x89t\xed\x17z\x02\xae"\x1b\x956e\x00\x957\x94\xcf\xdf\xae\x7f\x7f\x94\x00y\x8as$\x15\xcc\xba=-R\xa9NQ\xdb\x9a\x89\x029M\xfd\x9b\xcd\xa7(\\\x9c\xaaM/\xda\x98+\x1d \x0e\xf5-v@\xb4\xf4a|\xae\xd6Lr\xdb\x00\x0b\xa3\\\x8f\x12KHsHT\x88\x95\x8b\x10\xf5&\xa6lx\xf2\rQ\x95\xef\xec\xc5t\xc8\xb81\xe8\xa7\xb9\xf7~_\x12\xfe{\xd0\x0f\xa2=v\x94\n\x9c\x98{-P\xbf\xf4%\xfc\xa12\xa3(\x1e\rE \xe7]/[\xaf{:\xe3]\x90\xcf\xf5\xce\x93\x89\x9a\x7f\xef%^5@P[ws\xfb\x92b\x04\xd1U7\x8e?\x7f\x1e\x90\xa8\x02[\x19\xf6\xa1\x94\xb4\xf8\xbdB\xc8/M\xde\x19\xf8\xb6R^\x8e,|\x96\x983uH[\xa6^\xb8\xdd\x930\x00m\x10Zp\xc3\xf3?\xe6\xc0\x95\xc1f\xed\xee\xf9\xa8\x05\xf9\x17\xc7\xc9Z\xc8o\x9a\xc3\xdc\x8d?+kf\xba\xe9\xd4\xb6\x80\xa0/\t\xa1\xc346Gas.\x91\xb3\x0fT\t\xaf\x87\xcc\xf4\xaf\xb4\xcc\xb4\x92U#\x7f>\x8c\xb5\xccb\x15H\xc8\xcd\x89Ri\x94\x1d/\r%\x8f\xc6\r\x8b\r \t\x1f&c&\x15\xd2.uQ\x9d}\xceL\xbb\xd6\xe2\x92i\xb2\xc9\x97\xd0\xeduc^\n\x00\xee\x9e\x94\xf5\xeb<\xa7\xe1\x88\x8eI*\xf0D\x1e\xdf\xe0\xe6\xca\x11WWH\x1b,\x0c\x11\xf9\xef\xbb20ZP\xfd\x8b\xda\x12r0\xc1\x89\xb4\x1a\x19=nt\xfb\xdb\xc7v\x12\x1ex\xcdjG\x98\x17\xb0\x07\x8e\xd0W5\xd3\x06\xfe\'\x83\xd3\x06\x96?\x98\xcd\x07\xa1\x8f\x177p\x97dJ\xdbz&\xcfgW\x91K\xd9\xe0,\xbb\xdd\xe0\x1b\xfa%\x8d\xc5@B!\xdc\xb1d\xa5\xa2\x01\xee\x01\xf7\x7f\x7f\x0b:\xa0\xb3\x1a\xf7\xf1\xea;9\x9c%\x02\xb4\x9aURd5\x0ctm\xc6Y\xe8\xa3J\nv\xe0\xec\xeeQE\xca}w\xbb\x02c\x98\xa0\xbf\x1bO8\xa9E\x95\xb0k\x9b@{\x16\x93\x1c[\x8f\xe1be3`qQ7\xab\x93 \xbb\x8e\xf3CV\xbb\xd9\x9cYA1v\xc9\x9b\x02\x8dU\xdd\xb9h\x9aAq{\xf3U\x90\xdbn\x1bAJ57r$"\xdc(\x86\xdc\xb0\xd1\xa7L/D\x9e\xfa\xaaJV$\xd4\xc9\x11a$K\xa8\xca\xc9\xa6\x19\xab\x1fx\xea.\xca\x94\xb4c/\xd7`I\xeb\x1c\xec3\x11j\xb6^\xa7\x18\xb9m\xf3P-\x83\x83\x15\xb9\x81\x1f\x0f`\xe8J\xff\x95\x1b\x07\xd81\x19h\xfe\xa6A\xdf\x8d\t\x97\xa2\xbeM\x97_\x82\xd2`\x9e\xf3\xe9\xdb\x1f~/\x95:@+\xad\xb1\x9e\x9f\x9b\x0c_Vb\xc3h\x82\xd54\tc\xe0\xddw\xe4m$\xd4\xdetR\x7f\xe2\x1f\x96(\x12@\xe6\x05\xe9\xd0\xeb\xb2H\xa7\xb3\x88\xdc8\xbd\xddj\x12\x9e\x8f\xb27,\xea.\xa6\x9d\xfb\xbb\x0cs\x8d\xec \xb2Wg\x90\xb4]\x1a>s\xd4C\xa5\xccv\xb4d\xe8\x11\xbc\x06\xe9\x82m\xc1\xc7e\x85\\o\xc2U\x0e\x9f\x05\xab\x11O\xe8\x1c<8&N\x00I8\xae\xd8$\x04/\x0f(i1\xdc\x12ZuVr\xdc\xb5\xb7\xdeH\xaeb\xe6\xf7S`\xc5W\xc2\x1c(\xc6;\x98\xc4\xb3\xf6"\xf3\xbc\x9a8\xe07\x82p\xc9\xac\xb2x\xd0zZ\xcek\x92 <Y\xd2\xaa"\xf2\xc5G\xa6\x14s\xe8\xae\xb9\xd3\x99\xe0\xce]\x08\xde`%\xda\xfa\x04\x8b\xa8X\x15\xa7\xf9(\xde\x1c\xf9\xdba\x10\xcd h\x9e\xf4\xba\xbf\xa0\xf7G\xfe\xd6\xc9\xd1U\x83\xd0}\x86\x8b\xf4.\xfexx\x1f\x99\xc3\x16\x80U\x15,\x0f\x12\x8d%\xbc\xbb,\xb6\xf6\x14\x0b\xd9\x81yt\x840\xa0t\x8f\\\xbb"W\xd7\xc8\xe8B\xe0\xb7\x8e\xe5h\xcc\x89\xf8\xb3\xc9m\xf3g\x106+\x15\x90\xad\xb1Rz\xe1Q\xa1\x885\x96:\xb4\x132r\xf15\x8c\xa5c\x99g\xb7\xe0\x04\xac\xbbV\xa6\xc5\xbd\xc6\x11\xb7\x01a\xf0.2\x97\xf7\x16-\xe7\xeei\xc9A\\\xf9\xa6\x19}G\xa6\x80`\x97\xb2\xde\xcc\xee\',];\xee\xde\x9f\xde\xedFF\xf8^}\x003=M\xf1\xc7\xa5\xe4\x94/\xb1\x11\xcev\xbd\xb9\xcf\xb9\x1c\xeclUdV\xb1uy\'\xf4b/\xa8\x99\xa3\xe4\x12Z\xbd\xf7\xd3yF\x82\xb6\xde\xc9\x91\x16\xd19J\xd9\x8b$5y\x8c\xa5d\x97f=\xbb\x86\xd6h\x8e\x981\x01\xd0\x1ev\xff0@\xf4\x9bo\xdb0-\xafN\xce\x98S&\x17O\xcb\xc4\xf5A\x0f\xf6E_\x16\\\x87\x99\x92\xafI?ivh\xa5H\x96B?5o}\xe6t$"K\x1a\xb1\x1air\x1a\xc8\xfa\x19/\xcdv\x986mJ\x9f\x16\xd818`\xc3\x03\x17\x92ks\x86\xea9\xf2\x1b\x9f\x1b\x0f\x81h\x94\x86\xab\x00\xcd\xac\xfd"d\xf7\x1d\xc6\x89"0L\xb2W\\}(\x1fx\x8c\x84G\xe1\xbb\x9d\xcfW\xfbbun\xc2\xde\x0c\xfbR\xa4\x85\xb1\x0eV\x06*\xd4\xb2\t\xbf>\x94\xdb\x95\x8a\rF\xc7\x85\xf1\xb5\x0b\xa7\xe1\xd8\xb7\xd6\r\xa8\xddB\x0f\xd1!\xd1BUt\xb5\x1d\xd2P\x0b\xe4\nk\xe6\xdc\xeb\xd7=\xe5\xa6=\x99\x81\xfdS\xe2SIi/\xc7\xb5\xdf>\x88\xa0T\x19\xbf3\x8c\xb4z\xb5\xccRg\xb0\x19\xf3\xf7\rT\x9e\x10W\x0ba\x8ad\x18\x92\xa0\xc5\xd0\xb4\xe4<\xd5\xf2s\x15^0\xf7\xe6\xa7A\x1fM\xf6\tVv\x86\x92\x13T;\xb1\x10\xc6\x9c-=&D\xb6+N\x04l\x89\x91j\\\x03\n\xcd\x97L\x1d \xc7\xda\xa7\xff\x15\x93E,\x90\x03\x85\x80\x06-\x80\x80\xce;%+\xb5\x04*\t\x8fl\xe2i\xd0\xfe\xa2E\x90\x95zt\xf2\x1a\xd6\xbfF\xa1\xb9sG\xbe\xe3\xfb\x9e>~y\xc2?0b\xbb\x11\xe0z\x0c\xa3\xe2\xd50\xff\xbe\x11\xe0\x01\xb6\x89,\x90\xec\xf3>\x82\x8d:o^g\xd0\xa6\xe2\xfd\x1f\xc9<\xf7\xb2+\xfce8\xfa\xf1\xa3)l*\xc9\xdc\x13GK\n\xd3\xc9a\xbf\xaa\xd9\xc63\x86u-\r~\x07&\x1f\xef=\xc2\x08>\xc0\xfa\xde\x86l\x01o\xf4\xd1\x98\x10\x1b!\xfd\xd55\xfdV\xf5\x05D\x04e\xf7\xbb\xf7\xe8`\xa4\xc4I\x9c\xa0\x7f=.\t\x98\x8c\xaf\x86\x87X\xef\xc5\xa6J4\x0f;\xf1\x83\xb0\xf0\x19#*\x97O$\x96?\xe8\xbct\xb46H\xb8\xadE\xfd\xd4E\x86\xf4\x8c*\x1dZ\xca\x14\xa5\xff\x8b\xb8\x99\x88\xc7\xb5\x07\\\x7f\x87\xc4\x1d\xd1R%\x10\xe5\x91\xa9Z0\x86X/\x8cY\x9e~/\\\xbfk\x08zx\xcd\x86\xd6\x81\xc8\xd5)\xc6>\x89RL\xd3\x14=\xf0Y\x8cA\xa7\xd7\xfc]95\'\xf20\xa1\xf7#\xe3\xc4\xb4(\xc8\t\x1e\xcb\xc1\x0fO\xa0\x98k\x105R\xc8\x16\x1d*\xb9"\xb5\xb4\xc2\x08\xcc\xc2\x18`\xd4k=\x8b\xcc\x97\x0f\xe2\xcd\x8a\x89\\~x\xfb^\xe6C\xb93pfk\x8a\x93\x02\xad\xad\xb4:|\xbe\x07\x89\xef~\xfd\x18\x00\xfc\x82\x0c\xa1\xcb\xf2\x89,5\xdb\xf2\x02y\xd0\xa9\x84\x0e\xa0\x19m3\xafE\x12\xa0\xea\xdc\x1fgv\x94\xb1\xd0O\xfd\x99\xf7\xfehW!nN\xfc\xbcX>\x83f\x87a\xb6j\xf4S\x08n\xfaf\xbbw\xbc;\xf6\xd5\xb4d\x9b\xaf\xe4j\x16o@T\xb8`\xdf\xb5e<{\x8e\xc7\x1d\xa0\xea\x97\xb7\xa4nJ\x88\x12~\x10Qz\xde\xccq\'m\xda\xe4\x16\x9ej\xa3\x12\xac\xa4\xdf\x99\xdeBT\xd2A;g\xf0\xf5\x92\xb2S)\xbf\x8d\xf7\xff4F\xf8\xe82\x08\xd2\xf1E\xf1\x0e\xb4\xc6r\xeb\xaa\xbcKd\xc0\xcf*/W\x15\xa4n\x02\xcc\n9\xe5\xe9\x91"z\x08\xa0~\xd9\xb1\x85>7JrZ-\xf6\xa5\x9f\xd5\x1c\x17\xc1\x89\xa5\xe9f\x03B\xbcJ\x06\xb9\x96\x8a\xe4\xec\x9fy\xd9\'{6wpV\xcb\x16#\xf9\x85\xabqh\xc2\xaa\xe6\xb1\xa2gn;\x0b\x1c*FS\x83\\\xe3\xde7\xc1\x0cX\x89\x18\x84\x80tg\xe0\xc3\xab\xa8\xca;g]{\xc8\xe8c\xb7md\xa2\xe2G\xe9\n\x1d\xe6\x02#goGL\xf5P\xff&\xacE\x83\xfc\x14\xf0v\xce\xd7L g\x0fq\x08\x05\xb5\x03\xfe\x125\xf2pL\xfd\x9d\x1f\nRc\x97*\xc3~\x87F\xa6 q\xb9\xb7&\xbfs\xc9\x9f\xa3\x83\x8e\x01L\xb0Z\xb1\xe4 \x92\xe9h|)ltiX\xa1\x1c\xfc\x82\xec\xd5\x9a\x0eK\x9dOo\xe9v\xc2\x021\x05S\x0b\xb7\xb8\xb8\xe4\x04}\x0b\xcbWW\xbc\x98\x80\x8b\x8a:\xe4L\x0e\xdc\xa9\x89\x92E;\xef\x9e\x16\'\xfe\xfe\xee\x14\x15\xc2\x91On\xb5\xd6\xab\x92\x87\xe3\xfej\xa6="2?\xd6\x8fc\x0c|l\x17\x8e\x19\x1eC|%\x95\xe3\xb2N\x97N\x8b\xa9Gu\xecz9\xb0\xb4J\xb0\x9d\x9a\x0e\x9bp\xa4\x81Aj2\xf9\x10\x12\xfd\n\x9b\x9d\x91\xaf7\xcf\x9e\xb1\x85\xbat\n\x14E\x1ba\x15\xc8Z\x9e\x9c:5\x83\x86l\xbd\xe6Q\xd3\xfc\xf2:\x854\x99y\xbf+\x11\x9bG\xf5\xa7W\x12\x92\x80yt?\x88.\xb6\xa2\xe1\x02\ts-\x138tS\x93d\xd9\x8c\xed\xe5v\xf86\x0f\xd2"n[*\xfd\x833\xa8\xe2\xb0\xb7\'\x90\x82\xb8J\x9c\xbbi\x99G\xd8\xa3E\x92}r\x95\x9f\xf4(\xc0\xed\x890B /\xc90f\xb0\xfb\x00\xba\xa0\xea\xc5\xe0\x90\x15a\x82\xb1;\x8fo\xb4\x80\xf2L\x97\xeb\x81\xb5\xefB\x16\x16\xf4\xd3\x83\x1a\xdb6D\xb5E\xd2r\xbe,/\xc3[\xd1\xf7&@|\x8a\x1b\xed\xde\\\x84\xab8\xe6\xb0\x8d\xe5\xfb\x18\x99\xee\xa0t\x9a\x0f\xc7/\xacXt\xcf\x17\x17\x0e\x06\xd3\x86\xb4\x10cI.L\x06\xf8\xee\xaa\xe2\xd5\xa7o\xce o\xb2\x03\xcf\x1f\x81\x96\xd1O\xab\x1a+\x97\xe1{\x17\xad\xa7*\xc9 \xec+>\xa2A\xa2%o\xa0\xef\x89ua\x00\x0b\xcb\x93@?\x8ce\x07\xf0\'\x01\xc5\x05\xf8W\x11\xfb\xf8I\xa1\xe4/\x85(&\x0c\xf1|H\x90S\xb3\xc8@\t\xc4\xf0=\xf8\xc8\xec\x93\xb1\xc2=\xa1\xc2\xae \xbc\xf2u\x9dn\xfd\x10t\xeb\x9f\xdd\xb9L\xe9\xb1#\x1a\xeb\x1c,l\xd2\xd1\x90\xa2\x88\xf2Je\xcf]\xf7\x1c\xf5\xd9\xc3\xc2`\x05<\xff+\xef\x16\xbc\xff\x82/\xd4;\x15\xc4\xf3\xa7\xb3"5\xd1x\xae\x03)\x7fq\xa0\n\xc1\x07\x8a\xbd\xbc\xac\x9e\xf3\xe3\xba\x12\xa4\xaa,\xbc\xf7\xdf\xdc\x92\x1fa\x98\xef\xfbL\xc8\r\x1b\x14*\xb6~\x99&0-<\x01\xa6R3%njaL\xa6YzY\xfb\x0f\xf3\xfe\xec\x8c\x90\xeb\x08\xcf\x11\xf9`,\x81\xfeV\xf9\x0c$\x11\xd8F\x91B\x1d\x8f\xbe\x98j\xc5\xbf\x9be\x9fw74\x8f\xf3U\xb82{\x0b\x9f*v\xcb\xa4pD>\x19\x89s\xfeO\x1a\xadV=7\x96\xba{\xa7\x19\'\x97T\x82\xca\xa4@\xe0\xca\xd2\x86\xfb]\xe8\xd8\xbd\xcam\xf7\x17\xfb\x983#\xf3\xa5\xa1w\x9b~\xbd\tn\xba\xea;n\xf9\x1d_L\xe1\xd4\x04\x93\xa3\x9e:\xf2#\xc6\x9fH6T\x8a\xce\xee\xf4\xe0\x8bm\x1ei\xd3F\x84\xc4/\x8b\xa7P<\x12\x99\x89I\x03\x18M\xd4\xa2\xfen\xc2\xe0e/Q\x83\x8f\x9bY\x97`\x84\xb6!\x91\x7fLs;\x82\xa7Y\x9e\xa3^\xb1\xff\xc6\x03\xf5p\x9b\xae*r\xa8\x87\xae\x07\x90s\xc3ic\xab"ji\xd2\xecy\\\x98\xd3\xc3\xa3\xef\xa04\x08AAP\x12\x96\xbf\x0cI$\xed\xaah\xceVYB\x88U\xd3\x0c.\x87\xaa\x91\x0e\xaa\x14e6(kO\xb5\x9b\x8b\xcd\xa7\xce8\xa1J$[\xba\x10[gC\'\x11\x1f\xa5\xa0\xadUV\xbb\x14\xc0\xa0\xb7S\xa2\x1c\x01\x95\x8d\xa0\x06}\xd0\x8e\xffR\x1a\xf3\xfe\xfcya\xc6M\x04M \x93\x1f\xdb\xe5\xe1j\x8e\xec\x11sw2\xef\x82VU\x9bH\xdf\xfc \x97\'\x9b\xfcz\xba\xd6\xb1w\xfaQ\x1b\xf4\xb5\xaa\xb5\x8d$\xf2\xaa\xca2\x0e\x9b[z\xae\xb2\x87\xd9_F\x02w\x18\xeb\x06\x86\xb09\x81\x950u\xa54\x86"\xee\x86\x10\rZ\x84)\xd6\xff\xec\xe3rJ\x9b\xa6\x14U\x82\xf8~\x10\x1ev\xf0\xb4N\xfd\xb8\x98\xdf\xc5\xcd\x92\xf1\xde#E\xa1"\xd4\xe4p\xb5\x194\xb7F\xe9\xaf \xc2\x0f\xcd\x16\xdbEQ\xef\xd0>n)nY\xe4\x14\xe7\xd8\x05\xc7\x88\xae\xb7\xe6t\x12p\r\x02N\xea\x9f\x0cp\xbe\xce|\xb1\x7fa\xcf0\xab\xe8\xd5@\xe6\xa6p\xe9f \xa0\xe3;\x06\x1c\xb8\xde\xa3\x11\xabN\x8f\x9f\xa3\'\xde\x16\xfe\xe4\xe73\x9a#\xf5\x0fR\x96\xfc5\x95\x81\xb7\xd2\xe4\xe7\xf3\xa3\xf1\x1d\xef\xb8m:6\xee\x1d\xde\x9a\xdd\xa8<U\xb4\xac\xcc\x07.X+\xc6xF\x89Nt\x89\x99\xa6OR\xdb\xb5_\xf34\xe3[oQ]%?O\xfe\xc0)\x02m\xde[\xf3\xa0xQ3|\xadK\x87\x9eB\x91\xd5U4c\xfc\x7f=\xf0p\x93Xf\xf7\xf9,\xd3\xcf\xd4)\x9f\xed\xb8\xa7j\x814i\xdcT\x82\x80Z\x07 \xe7!?y\xdb\xe2\xec\x937J\\f\xcd\xb7\xf8\xae8\x9e\xcd\x85\xae\xb9s\xe4\xfe\x91k\xf3\xe3\xe4\x7f\xb2\xc3i\xf8~\x8e\xed-u\xbe(6\xd6\xeb\xde\x9d\xf8\xa1I\x889d\xd6h=\x96"\xf8\x8cq\x1c\xc3J\xef\x8e\x8c7\x934\x88\x84\xe9a\xa8^Y\x08c)O\x16\xff\xb8@\x84\xa1Kk\xfdd_\xdb\xf5B\x021>\xeb\xf8\xcf\xbc\x9c6\t\xa2\xe6q\xebN\x03\xbd\xc1"\xc35\xac\xf5\xdaj\xc8\x9cK\xfe q\x81\x1aZm\\\x0e\x85A\xbd\xcf\xe1In\xa8\x15Xb\x1b?\xfex\x89\xd0\x9c,5\xbf\xfa\x99\xa2\xaae\xcc\xb1\xb9g\xa4x\t\x1e\x86\xc1\x8f\xbd^\x88\x8dm\xbb\xa0\x18Y\x06\x9b\x05\xd9ls\xb5\xa3B\x00T\xfclUu3\xddh\xcf5M@\x0c\x0e\xcc\xd5\x96d\x87\xe3\xf0\xe3Kd\xce\xf9\xfa\xc0\xee\xf1$\x99d\x07\x16Y\xdf\x06\xbb\x85(\xa4=\xee)g\x8b\xd7\xf97pK\xb5\xe3.5!Hs+\xed\xe1\xf7\xd1e\xe1\xd0\xebv\'SSj\xfe\x0633\xbc\xeb\xcf\xa3$\xe6\xc2.+\x9f\xc69\x1a\xbe\xbaJ\x83K\x8d<\x97\x9b\xf5n\x1fF\x9fq\xeb\xe5\x84r_\xd7\xec\xaep\xae\xfb6\xaf\x8f\x92\xc6\x80*\xab_h\x18\xbe\x9b\x1d\x8e\xa7\x90\x96\x19\xad\xc7\xe6 \r\x065\x8f]\xec\x1c\xd3\xdf\xa4T\x86\xd5>\xf4\x1e\x17\x0b\x91\xb4\xc2F\xb4\xe2\x12\xf4#\x9056\x10\x87\x1e\x13nx\xa7g\xe07\xac\xb7\x82\x1d\xa6Q\xd4\x01\x0cN/\xa1\x1e\xbc?6\x05J(t\x12q\xee\xd4Ge\xe4\x93\x1f\xf5\x9f\xc8\xbdt[\xe0\xf8j]x\xe9\x8f\xedL\xae\x1e\xd0\x89\xf0-\x91\x82\x9e\xc0\xd4\x07\x93ukZM\xda@=w\x13,\xed\xb6\xce\x07\xc0i\xf7\xc3\xcc\xd1\xb7y\xaf\xbdXo\x93\xa8\xa1\x19\xc0#\xa7\xaf\xec\xb8\xfe\x82\xce\t\xe9\xf9\xd56\xc7\x84\xba"\xec\x9f\xe3\xe6-\xd0f{\xf4\xb8ll\xd32}\xf2\xa1?\x86H\x8eU\xbcpb\xfex\xe1T")\xe1\x01\x14\xcc\xf3\xbd\xcc\x18')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify,hiddify_api,cf_api
10
+ from flask import Markup
11
+ from flask import Flask,g
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class DomainAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+ form_widget_args = {
32
+ 'description': {
33
+ 'rows': 100,
34
+ 'style': 'font-family: monospace; direction:ltr'
35
+ }
36
+ }
37
+ column_descriptions = dict(
38
+ domain=_("domain.description"),
39
+ mode=_("Direct mode means you want to use your server directly (for usual use), CDN means that you use your server on behind of a CDN provider."),
40
+ cdn_ip=_("config.cdn_forced_host.description"),
41
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.'),
42
+ alias=_('The name shown in the configs for this domain.')
43
+ )
44
+
45
+ # create_modal = True
46
+ can_export = False
47
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
48
+ form_args = {
49
+
50
+ 'domain': {
51
+ 'validators': [Regexp(r'^(\*\.)?([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
52
+ },
53
+ "cdn_ip": {
54
+ 'validators': [Regexp(r"(((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d).){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d))|^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,}))[ \t\n,;]*\w{3}[ \t\n,;]*)*", message=__("Invalid IP or domain"))]
55
+ }
56
+ }
57
+ column_list = ["domain", "mode","alias", "domain_ip", "cdn_ip"]
58
+ # column_editable_list=["domain"]
59
+ # column_filters=["domain","mode"]
60
+ # form_excluded_columns=['work_with']
61
+ column_searchable_list = ["domain", "mode"]
62
+ column_labels = {
63
+ "domain": _("domain.domain"),
64
+ "mode": _("domain.mode"),
65
+ "cdn_ip": _("config.cdn_forced_host.label"),
66
+ 'domain_ip': _('domain.ip'),
67
+ 'show_domains':_('Show Domains'),
68
+ 'alias':_('Alias')
69
+ }
70
+
71
+ form_columns=['domain','alias','mode','cdn_ip','show_domains']
72
+
73
+ def _domain_admin_link(view, context, model, name):
74
+ if model.mode==DomainType.fake:
75
+ return Markup(f"<span class='badge'>{model.domain}</span>")
76
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
77
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
78
+
79
+ def _domain_ip(view, context, model, name):
80
+ dip = hiddify.get_domain_ip(model.domain)
81
+ myip = hiddify.get_ip(4)
82
+ if myip == dip and model.mode == DomainType.direct:
83
+ badge_type = ''
84
+ elif dip and model.mode != DomainType.direct and myip != dip:
85
+ badge_type = 'warning'
86
+ else:
87
+ badge_type = 'danger'
88
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
89
+ column_formatters = {
90
+ 'domain_ip': _domain_ip,
91
+ 'domain': _domain_admin_link
92
+ }
93
+
94
+ def search_placeholder(self):
95
+ return f"{_('search')} {_('domain.domain')} {_('domain.mode')}"
96
+
97
+ # def on_form_prefill(self, form, id):
98
+ # Get the Domain object being edited
99
+ # domain = self.session.query(Domain).get(id)
100
+
101
+ # Pre-select the related domains in the checkbox list
102
+ # form.show_domains = [d.id for d in Domain.query.all()]
103
+
104
+
105
+ def on_model_change(self, form, model, is_created):
106
+ model.domain = model.domain.lower()
107
+ configs = get_hconfigs()
108
+ for c in configs:
109
+ if "domain" in c and ConfigEnum.decoy_domain != c:
110
+ if model.domain == configs[c]:
111
+ raise ValidationError(
112
+ _("You have used this domain in: ")+_(f"config.{c}.label"))
113
+ myip = hiddify.get_ip(4)
114
+
115
+ if "*" in model.domain and model.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
116
+ raise ValidationError(
117
+ _("Domain can not be resolved! there is a problem in your domain"))
118
+
119
+
120
+ skip_check="*" in model.domain
121
+ if hconfig(ConfigEnum.cloudflare):
122
+ try:
123
+ if model.mode==DomainType.direct:
124
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=False)
125
+ elif model.mode==DomainType.cdn or model.mode==DomainType.auto_cdn_ip:
126
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=True)
127
+ skip_check=True
128
+ except Exception as e:
129
+ raise e
130
+ raise ValidationError(_("Can not connect to Cloudflare.")+f' {e}')
131
+ # elif model.mode==DomainType.auto_cdn_ip:
132
+
133
+ # raise ValidationError(_("You have to add your cloudflare api key to use this feature: "))
134
+
135
+
136
+
137
+
138
+ dip = hiddify.get_domain_ip(model.domain)
139
+ if not skip_check:
140
+ if dip == None :
141
+ raise ValidationError(
142
+ _("Domain can not be resolved! there is a problem in your domain"))
143
+
144
+
145
+ if model.mode == DomainType.direct and (myip != dip and dip != hiddify.get_ip(6)):
146
+ raise ValidationError(
147
+ _("Domain IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode", server_ip=myip, domain_ip=dip))
148
+
149
+ if dip == myip and model.mode in [DomainType.cdn, DomainType.relay, DomainType.fake,DomainType.auto_cdn_ip]:
150
+ raise ValidationError(
151
+ _("In CDN mode, Domain IP=%(domain_ip)s should be different to your ip=%(server_ip)s", server_ip=myip, domain_ip=dip))
152
+
153
+ # if model.mode in [DomainType.ss_faketls, DomainType.telegram_faketls]:
154
+ # if len(Domain.query.filter(Domain.mode==model.mode and Domain.id!=model.id).all())>0:
155
+ # ValidationError(f"another {model.mode} is exist")
156
+ model.domain = model.domain.lower()
157
+ if model.mode == DomainType.direct and model.cdn_ip:
158
+ raise ValidationError(
159
+ f"Specifying CDN IP is only valid for CDN mode")
160
+
161
+
162
+
163
+ if model.mode == DomainType.fake and not model.cdn_ip:
164
+ model.cdn_ip = myip
165
+
166
+ # if model.mode==DomainType.fake and model.cdn_ip!=myip:
167
+ # raise ValidationError(f"Specifying CDN IP is only valid for CDN mode")
168
+
169
+ # work_with_ids = form.work_with.data
170
+ # print(work_with_ids)
171
+ # # Update the many-to-many relationship
172
+ if len(model.show_domains)==Domain.query.count():
173
+ model.show_domains=[]
174
+ # if model.alias and not g.is_commercial:
175
+ # model.alias= "@hiddify "+model.alias
176
+ # model.work_with = self.session.query(Domain).filter(
177
+ # Domain.id.in_(work_with_ids)).all()
178
+ if is_created or not get_domain(model.domain) :
179
+ # return hiddify.reinstall_action(complete_install=False, domain_changed=True)
180
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
181
+
182
+ # def after_model_change(self,form, model, is_created):
183
+ # if model.show_domains.count==0:
184
+ # db.session.bulk_save_objects(ShowDomain(model.id,model.id))
185
+
186
+ def on_model_delete(self, model):
187
+ if len(Domain.query.all()) <= 1:
188
+ raise ValidationError(f"at least one domain should exist")
189
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
190
+ def after_model_delete(self, model):
191
+ if hconfig(ConfigEnum.parent_panel):
192
+ hiddify_api.sync_child_to_parent()
193
+ def after_model_change(self, form, model, is_created):
194
+ if hconfig(ConfigEnum.parent_panel):
195
+ hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
196
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product