hiddifypanel 3.0.0.dev63__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,130 @@
1
- # 2023-04-08T15:11:22.202592
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\x8e\x1d\x00\x00\x12\t\x04\x00%\xa6\x17su\xa9\xc9\x89d\xf3\xe6 qL\x88\x99\x00\x00\x00\x00\x00\x00\x00\x00\xa7l\xabz6$\x82\xd5\x17\xf4\x1f\x10[\xb4E\xb6Jx\x04\xd6\xa4\xee\x85(\x9b\x97\xa6\xea\xe3Z\xd0\xa5\x8d\xb5\x00\x9cW\x86\xf3\x82i:y\x85V\x97\xfc\xce\xab$\x14o\x87Il\xeb\x13\n\xfe\xe8\x1a\xd2\x89<\x00*\x0e7H\xce\xd5L\xf9\x8ar\xf4\x83B&%j~\xb5\'\xb6A\x16\x9c\xe1t\xfb;%\xbe\xdb\xb9\xd2\x97\xe6\xb6\xdbLq\xfd\xb4\x0bT\x8b\x04g]0\x1fD\xf6\xdeY\x9e\xfa\r\t)\x07\xe9\x92Mp\xa4o!\x15\xe8Eu\xe5\xadOL\xe9y\'K\xce\x11zcP&\x89\x8f\xde\xc2\x1c\xe7\x984\xe1\xfb\x82J\xaaeV?s\x98\xf3\xd5-\x84l\x07\xd9\x06\xa4\xd5\xaf\xf1\xec{\xa2C^\x12\xad\x8c\x9b=ga\x00\xd8\x15\x17c\x8e\xdfJ\x13\xe1T\x88B\x8a\xd3C\xb1\xd9\x95C_\x96\x1fU\xb5\x85~\xb7e\xe2\x93f/C\x7f\x19\x9dW>\x87\x8d7Z\xac\xa8\x98]\xd7=\xf6:*\xac\xeb\x8e\xe6\x9a\xe6\xde\xe8\xa5Q^\xffq~`T\x1c\xa7\xf3z@\xc1v@\x9c\xb4\xacF\xc4\x10?8\xb9O+dk\x82\xf2\xf0T\xfe\xe4\xa8\xf9\x9bI;\xef\xad\xd2\xdf\t\x92/\x0e\x8c\xd4\xeb\x7f\x9bj\xa3\x16\xa1}mC\xf3\r\xe7\x0cAS\x9b\xc3\xe9\x04\x89\xa0\x18\x18\xfb\xee$\xde@.V\x85FY\xb0/[b\xae"+ro\xa0_\xd67\x04x\x0c\xe4\xb2\x9b\xa4\xdb\xcd\x9a7\x0f&\xbd\xa8\xbd\xc4\x9fj\x96M^\xdbY\xb3\xed\x97\x7f\xecUm\x9bH\t\x1fc\x19\xc2L\xe5\xd8\xacfc\xabC`\x00\x01\x89\xd3w<\x97F\xc6\x04\xfb\xd1\x99\xb0\xe8\xec\xd1)\xcb\xd7\x9fb\x1b403\xf7G\xc7\xa8ko\x8a\xdcv\xa2\x18\xa8\x7f\xc5\xc5\x04\xcbS@\xed\xa28\xbe\xc5\xfar\xa9\x95\xb9\x0e\xd8W\x87\x8cK\xd3\x84\xa3\xc6d\xf3\x97s\x1b!\xe4\xaa]ltV\xfd\x9f\x8f\xa3\xe8\xa9)N\x87\xe8z?\xfb\xeb\xf0\x13>\x7f\xb8\x18\xc5fg\xd6b\xc1\x19\xd6\x84\xb5\xe1\xc4BLV\xc0\xb7k3\xed\x0c\xd0W\x9a\xb2\x0e\xc0x(\xa6\xb7\xa0\x10\x06Q\x9c\xf4\xda\xc3j\xb0Z\xe81?\x96-\x13\xfb\x84\xf4Y\x0e\xb7P\x8a\xb6\xf0\xc1\xf1\x86\xd7L\xf2\xdf6\xc7\xdf\xc7o\xf7C\xc3R\x19\xe9\xf1\x93\re9%\xce\x1325\x1b>\xb0\xaf\xc0>\xf8\xe5,c\xfc/%*A\x8c\x83\x81\xd0z\xc4/\xfd\x83\xe5\xb0\x15\xc3R?_m[I/\x1bTe\x15`wBiO\x18?q\xcd\x16v\xf3\xe3\xc6<O\x08\x89\xf4Y\x0b7\xd87\x1f\xe5/\x00.\xcd\x05y\x8cx\x9b\xf4X\xfa2v\xcf\xa7\x14\xb6\xaeP\x88\xe0\xa0q\xd5\xd3\x0ef\xeb\xeak\xa0w\x08Z\x85\x80\xc1,\x15hIp\x15\xe8\x02oa\x97w\xad\x9b89gx\xbe\'P\x19\xc8\x8b\xb5\xf8\xdbI\x85\x9a\xbc\x9d\xd6TB\x08\xdf1\x96\x1f\x15\x96\xa7k}\xb6\x07\xc8\x00\xae\xeb\xd0>\x13%b\xd8I\xc7\x00\x86OD\xfc\x1c\xf9\xdd\xd8\x82\xc9\xdf\x91%\x99\x03\xb1\xe6q\xe8\x11\xcafBs\xe8~X\xc0\xbf%#\xc5\x05\xa2/to\xca\x08\x19\x98\x84P\x074\xab\xd74UZ\xad\xc5\xfaA\xc8\x03_\xe0w\x93:35\x1a\xe8\x8d\xb5:\xe7\xbe\xa6\x0f\x01\xd0\xado\x8a\xd7\xfa^\xab\x16Fb\xdd\x95\xa9R\xdb}\xed\xb7\x165\xf6q\x0bW\xa7\xa7\n\xfc\x1a=A|;l\xeb\xc5\xf0#G\x99d\xce\x95\xbe)\xca\x1ej\xac\xe1Q\xfa\x84\x0b\x8a_9\xe7\xaf \x95\x01\x16\xc8A\xac\x06\x0bt\xb5\x15W]\x07d\xb6\x90Y\xba\x06\xef\x1bw\x18/p\xf3\xf7\xebj\xe2}%\r\x8b\xcbB\xe5T\xa6O8\xff\x0f\xe3\xa87\xc5]\x9e]\x8a\xfc\x11\xb5ttJ\xe7\x12\x96\x11\xfe\x05\x81\xca\xbc\xd7\xb0^n\x9d\x929\x1ff{\xc7j\xb8\x8eN\xc1\xc3\x00,\x12\xd0{\x03\xca\xc3\xf1W\xaf\x1d&\x0cM\xc9\xf1\xd5\x86\xf9\x9c\xec\xa0\xf0\x92n\xf1\x0b\xcfD\x8e\xb7\x1e<\xa5\x91\xe9\x01@\xe9\xff\x1c\xfcY\xe4\xf5\x8b\x04\xa4\xf9\x10\xac\xde\xb3]\x1e\x9e\xb7\xedy\x8d\x19\x03I\x00\x99\xa4\x83\xb8[\x8c\xa3\x16\x9e\x84\xf3\xc9^\xf7U\xeb\x1a\xe3\xdb\x91;\xe5P\xed\xb2\x81\xa3\x0b4d\rS\x04\xa7I*\xa0p\xfdk\xc0\xbf\x02\xdc?\x9a\xf1\',\x92C$\xb0\x0f\x19\x04\x96GG\x15\xac\xfd[\xbbG\x8d\xfb7\xd6;\n\xbd\xeb:\x0e\x1a\xf6\xfb\xd5cLi\x8dj&\xd4H4\xa8\xc7\x7f\xd6\xfb\xbeJ<F\x0b\xd1372\xe4\xe7\xb9\n@\x82v\xaf\xee\x9aZ\x05\xdd\x96bR\x01\x9a\x91*\r\x1c\x06\xe5^\xfeS\xecH_=\x81\xae\xaa8\xaa\xe5Z\xfd\xbd\x9b2pn\xe1o\xe4\xf8\xae\xacXsA\xb7\xa0\xcf\xce\t\x91\xc9\xeeD\xfb\xdb\x85\x1a\xfd^\x0f\xe1+\xe7\xe3\xb3$Z\x9c\xb2\x14\xab\x0fE\xca\xdf2<\x85q\xc9\xb4\xbb}\x00\xa6\x97D7\xb5\xaeP\xb5d\xde\x8c\xb0*\xafB\xb0Ac\xda!\x93\x0b\xa2\x10\x91\xa7\xb5\xe5\x8d\xb4\xd2\xfe\xd6\xc4\xe2\xb5\x91\x0e\xe5\x08j\x8e_\xdd\x89\x92\x9b\xd4z\x0f\xf3\xaeW\xd3\x18\xa0q\xde\x04\xb1\xbf\x92\x8b\xa9\xba)dM\x1c`\x8cfq\xfclR1\xf3\x1dd\xach\xa7\x06\xa2\x0b\x10\t\xe9|;\x07\xef@\xac/\xaf\x9f\xaa5\xac\x1d\x14\x88\xfd\xad\x83[\x13\x1e\xbe\x9c\xf8\x06\xff5r\xdc\xac\xd5\x11\x87t\x9d-d`\xf1\x936\xf1\x1d\x0e\x87V\xbc\xcez\xfc\xe2\x966\x00\xef\x006\xecU[\x1fsd\xc2\'Abr\x1f\xb7N]y\xdc*\xac4\x8e\xf90n<\x85\x94\x11\xe0\x19\x8e\xaf\xa1\x18\xc3Dgq;\xc1-G&\x81\xa6\x9e\x9a\x97\r\x15\x9d\x1eu\xfcL\xd1\x1d\xbeMC~\xab\xa7\xb2]\xf6\x9f\'[\xbbp\xde\x14e\'\x9cvp+\xb5\xe2\xbd\x8f\xc7{j\xf0tE\x9a(\x1e\x14\x02\x1c\xb79\x95\xd1\x85{ \xe1\xc4,/r\xf5S\xfd\xdep\xe9\x93`HYx5\xe1"A\xa7\xb4\xc4\xe9\x0f\x87#\xce\xaaG+\xfa,p\xea\x13\xa4*\x1c\x10\xe0\xfd:\xa8\x8b|\x80\xd3\x19\x9a/\x8fM\xf5\x9f+\xc2\x12>\x81\xaa\xfe\xe3\x97$\xeb\x0e\xca\xd8\xa6\xab\xf8\xc8\xdd\x85\xbb\xe9z\xd5\xf3\x0eF\x9a\xd6\x14\xb7\x14\x179\x83\xc1\x8c\xa9\xe2\xaa\xd04z\x934a+\x9b\xcb\x81\xdcU\xbd\x05\xcdm\x95\xa0\xb3^,\x94\x06S\xae\xab\xd1,$j\'\xaf6\xe2_fr\xdb\x15M\x95\xd2\xbd\xdf\x19\x95\xcf\xfda\xcb\x08k\xf7\xe4d&\xcf\xa0\xa3\\\xfc\x0f(\t\xb0%\x009\xdb\xdcw\xacE\x96\xdauu\x9e/;\xf1F\xf6\xf8t\xba\xb1\xd3i\\\xb8Y\xc8;\xb4\xc3?\xc1"\x91#\xb6T\x8f\xdb\\=H\x11h\xf2\xae\x15>\x88`\xd4b\x87<\xc2\xa6\x0c\x11\x8f& \xd9\xa8Z?_19\x88\x93\xd7\x952\x17\xce\xd6\x06q\xaf\x1a\xa6\xff\x864>B\xadb\xf2i\x7f\xbc%&\xdfW\x1d\xcc\xe1M\xac*\xa4\xab\t\x18A\xa5n\xce\x10v\xd6\xd1NA\xf8\x1b\xb4\xee$\x106\xaf\xb4\x0e\xd0\x9c\xb6!\x14\xf5\x19\n\xc2\xaf0\x90\x0e\x90q\x0c5\xcf*\x82\xf5\x1b\xae\x81\x11\xe57d~\xe0A\xf1^\xfb0(\xe5\xd3d\xe1J\xa6\xe8t\xfb\xd8\x7f\xd3i3 7\xa8\xee\xa7(\x9a\x1foX\x86\xeb\xf4F\xbeH\xa7:qi(\x0e\xca\xba\'\x91\x14\x92\xe5\xcfe_9S5%\x0c\x81{E\x8fi\xfeF\x16\xc9F\x1f,\xabF\xa5\x82\xa4\x96h\xe3_\x95\xc9C\xc3RrZ\xda+R\x93\x00J\x8e\xb0\xca\xebQ<{T\x92\xbe\xe5\xd7d\xa60\x1b\x0c\xd1Rp=\xb8\xb4\xfb\xa7\xa3\\J\xfa\x97\xc4\xd8N\x95\xae{)\xea\xb5\xe9,\xbe\xe5y)`\xf3y\xe5\x8dLu\xaa\x04sp\x8b\xfc\x1ctx\xae\xe8\xcaxk\x91\x8a^]\xb8\x98\x93r\x83\x8b\xa8T\x0c\xb6\xe6\xa2S*\xf4\xe1\x17\xd2-i\xd4u\x90A\xb5y\xccM\xe4\xd2Jv\xe6=\xa2\xacY54yx\xd8\xc7n\x9a \x8c4\xf4Y-\xfeG@\xcaw9 \xa6\xa1sL\xfb\x0f\x06\xc8\xc3\xe3D\x9e\r@\x87\x8f*\xeaO\t\xc3\x9fI\x06O\x80\x82\x83\xd8\xed\x8c[A,d]\xe5\xf3P F[\xdbS\xd9iX\x1d\x8fS\x9e\x01\x99\xda\xd7\x0cC\xabv\xd6.\xda\xadyB\xc1\x90\xed9\xda\x91\x91m\xb5>(\x0e\x9a\xf4h6\x1f\xfc\xb0\x19U\xd5\xee\x97;\xb8\xc7\xbc\xb4|n\xc8\x86\xed\xdeozA\xe3XU9l\xa3P\x95#\x83\x94\xd2\xf3\x9dL\xe5\x85\x13\xde\xc4\x9c\xa8\xb2\x8d\x9d\xb5\xf5\xb5\r\xe3\x98\x8a\xacb\xd5N\x176\x90\x13f\xbb\xf5\x10\xb3J\xedQ1qO\xc5\xb6\xf4\xb0\xb6\x19\xae\x88\x14[\x81\x97+\xa0\xf8\xfa\x84\xa4\xec\xe3\xa4\xd4\xcem\xe0\x83,\xc4\xc6R\xc2\xa7\xfc\xc3\xb0\xde\x9f\xd5\x81\xd5\x8b\xcfK\x14\xaa\x00\xc9\xa0\xf5\xc88+3~\xb2\x15\tn\xa3\x8d\x88\xf4\'\xd8<wI|b\x87\xfb\xff\x99[!R\x8a\xf96\x85\xddC\xe18\n\xdeP\xaa\xe9r\x1d\x8c\x86*\x82\xccr\xb3\xd415V*\xcd\x19\x18\rYmm\x80\xde\x99(\x8a;\xc8\x96\xadz)\x82\x91\xc0\xb5c\x1e\xed\xb3\xd7U\xab\xd0\x99r\x9cC\x84\x15\x95\x88\xa1\xe9&2c\xe6\x19\xf4\xf8\xc64\xd8GC\'B1S\x08\xbf\xbdp)\xcdZ\x050uU"A\xd7\xd6\xbc`V\x89yU\x15\xe7/\xfa}\xef\xbd\xf0\x9c\x11\n<\xf6C\x97\xdf\x17+\xae\xa9\xa9V\xfd\xe9\x97\x95\xb5\xbbH\xda\x1d\xbb\x1d\xe1\xac\xea\x9b5zo\x82\xfc\x9fA+\xd0\n\xf9J\xcd\x0b\xbd\x9b\x92\x7fd\xbf3\x98\x8d\x8fu\xaekr\xe7.\xbd\xb1\x1c\xc0\xcbs\x0f\xc4]\x8b\xbc\x08\x05\x98\xa1\xfa\x11\xe7\x86o\x96\x19\x1e*\xba\xa1\x14\xb5\xdcN\xd5\xb40\n\xac=S\xb9\xf0\xa6\xd6\x8e@\xb12\x14\xd3\x02\x8eXhS\x92>\x99\x9a\x9dD8\x80=\xcd\xa7\xf5\xa3\xa4U\xc1\xd4FmH\x15\xba\x1d/\t\xb2\x00\xa4\xb4\xfe\x1bF\x9c~-\xa8\xa2\x9a-\xc6\xc1\xfa\xa7\xd8E[\x13]REV{\x0f\xb9\xd9\x01\x98\xd0\x0f\x8c\x95u\xe0e\xf5`\x1c\x89Cf\xe4,\xbc8\xa7\x978\x0eI\x05\xc9(\xe1\xc7\x9b3\x88H\x0c\xfch\x8e\xbc\xc6\xef\xf3\xea\x8at\xdc\xf2l\x8fy\x1f?\xd4\xfc\xb9V\xa8\x85l\x86\x9cb\x8f!\x81/J\t;\'\x02K\xfb\x96\xba\xee\xe8\xaa\x0f\x12;i\'\xd4\xa2\x9a\tH82}\xc2d?\x0f<)o\xc9#\x10\x94\x17\x00\x9dV\xffFp\xa3K\x84Nl\x0eX\xc9{\x08\x16y\x02$\xc4mU\xd3\x8a"\xcd\xc5X\xd0\x0fm\xd9\x7f`\x920%D~\x11\xc7\x16\xed\x0f0R\x8d#\xff\xd6\xf3451)h\xf8\xa7<{aS\xd9\xa6f\xac\xa6i=^\xee}\xe5\x8f\xe5T\xcb<\xbenT\xcfS2\xa1M\xaf\xa7R#r\xc0;`.\xa1\xa1\xe2\xc0Y&\x0f0G\'a{)\xfb\xc3/F\x7f2_\xe5\n\x80.|\'\x91k\xa6\x96O@?\nf\x9f\xca\x87h2kN}h\x1d\xc9 2\xa6Jw.F|\xa4\xb5:\n\x96g\xb6\xb2vM\xf6\xd5V\t\x8d\x16\xe8*f\x88S\xbd\x8d\r<+l\x8b9\xdb\x1c\xf7\xf9JA\xfb&\t\xba\x9c\xb0p\xb2\xc8\xa9\xe1\xf2\xf1\x92\xe1\xa8w\x8a\xca\xee\x18%=\x0f\xa3\xcb<k\x8b\xb5\xe0a\x8dj\xcc\xc7\xaa\xf2\xbe\x86\xea\xb0\rh\xd6\xc6p\x1e+&\x1f"W\x8f\xa1\xc1\xb1\xd1k@\xdcZ\xd4u\xd6\xe1\x03P\x9f\xc3\x05#v\xd7D\xa8l\xa3\xdcJ-t\x19i,\xfb\xe9U\x86\xd6\x07r@\x01\xbd\xe8\xf9@\x15\xaco$\xcf\x02\n\x95\x1d\x8dfq|\x8c\xf0=\xa3\xc4]%\x93\x81\xe1*\x17\xb3\x84\xf5\xf5\x8d\xcd\xc0\x11\xfb.\x040w\xd1\xb9TN\xd7x~"i\xe7?\xfeJid\xa9|\xda\x8a&\xf0\\\xac\x1c\xfa|JB\xbd\x0c>\xde\xf7`\x06\x04\xe5\x05\x9czJP\xc4\xda\x07\'\x83\xec\xac{V\xea\xda\x13\x96\xd1#G\x92\xc5\xb5Y(\xd5\xd4\xd8\x8a\x146>\xc1\x8e\xf4d\xb7\x12\x91_o\xf9\xfc(\xa0v\x85\x7fD@\n\xb1\xf1U\xef\xaf\xd6\xd4]\xed\xd3\xde\xebj\x93\xa3\x80\x80\xcbx\x83\x9b\xa2,\xfa\xf9\xb6]\xbd\xa3\xaa\xbeg\xbe\xee\x01\xa3T\x97\x08\xba\x80\x1f\xa3\x89NP\x9e\xfa_\xd9\x9c\x95\x90}\xd3)\x02kH:\xd1\xd7\xef\xa4\xd6\x86(\x89Iy\xd0\xdf\xb3O\xf3\xa9]\x08\xab\xe0\xc1\xc19\x8an\xcd,\xb4\xb4\x0b\x84\xfc\xda+\x08[\xc9\x905\xb43\xa4\xa6\x99\x96\x9a>\xfd\xc4\x86QA\xa5L4\xe7\x8bl\xed\xe2a\x92\x05\xed1\xce\xbc\xcfy\xd8{\xed\x18\x9fs\xec\xf7\nL\x1a\x13x\x18\xed\xa8\xe1\xb6L\xdbJ\xebA1\xd7\x1b\xd9\x9e\x08\x06j\xe2\x1cB\xd4T\xfdC)\xe6\xb7\xe8\xc7\n\xcc\x8e\xb7\xd6\xf6\xe6S*\xa3\x01\xe4\xa9\xd6I\x06\x9f-^\xb5\x9aK5\x04\xd9\xbb\xcbJk\x81\x8e\xc1\x9aq2\xbew\xb2\xa1\x8e\r\x0e\xe2\xf5\x05P\xfa\xa0\x1f\x8ch\xfa\xfe\xfe\x03q\x165\xd6B>\xf4@\xf3\xabS\xf7\xf3\x04\xd0k\x8f\xa0\xdc\xf2\xff\xcfw\xee\x01m\xc3\x02\xbd\xe4\x15zL\xd6\xbe\x02\xb6\x12\xcd\xed\xe7+\x12B\x9eZ-\x10bl\xe2nXd\xb8e\xfaNq\xb1\xf4,\xa0\xdf\x8d\x96\xb0\x1379\xd5\xa4u\xd6\xeb8\xa20\x1em\xcd\xd6L\xd49\x03\xd3p\xd1\xbb78|\x14\xf9j\x80\xad"\x8a\x17\x07\xea\xbd|\xea\x17#U\xcb\xb9xAa\x15\xbepBdn~\x9e\xef\xb6\xee\xf4\xaa\xd6\x13\x85c2\xd4?\xc8\xde\x1cWxO\x93x{\xaf\x8f\x85we\x82\x08\x8d\xcaW\xae\xe4&z p4\x85\xab\xdf5\xd3j\xe2\xd6\xea\x8a\x89\xa1\x853\x10\x83\x1c\xa2\xfc|\x974H\xec\xf3\x1b\xfa\xdd\xa1\xfa\x87s\x00\xb5V\xc3\x80\x19\x94\x82@\xefj\xc5 \xc6\xe7??=\xf6\xb9PX`\xa7\x9e8n\x9a5Z\t|\x03\xd6\xfd=\x98\xafk$J\xc1\x7f\x1e\xc4 \xa9\xe7\xcd(\xd8\x97x\x17[5\xfb\xda\x04E-\xa4\xc7\xd4|P\xb6\x910|(\xc6\xa8\xc6\xf5\xf1\xf9\x0c\xf7\xd89B\xde\xd8p\xe7\x00{*\x9d\x07\x05\xf78\x84\xe6\x98\x18GQ\xcap\xf5\x88\x16\xeb\x10\x92pFR\xbb\xfe:o\xdc\'\x8c\xc3\x10<\xbf\xd1gr\nd\x0b\x82 c\xdd\xca8\xac!\x05\x18v*\x96#\xca}\xd3\xc7\x9a\x0b%\x08\xac\xe6\x9f~s/\x1a\xb5\x1bs8\x8c\xc6\x9a0@\x0b\xac[\xd8\xcf*\xab\xc2d\xa9\xfa\xdc\x05Q\xdbx#\xac\xd7\x0b<_\xea4\x82t\x05\x067J\x93\x18\xd9w\x88\xab\xdfU\xf6\xb9?n\x90&cl\x9a\xc5\x06k%\xa4\xff\xd6K\x01\x17\xca%\xd1\xc8\xffu\xe6\x9c9}\xd1\xcc\xcbg\xe5\xd9f\xd5\xa3`\xe5\x8d\xba\xc2\t\x9d|\xa2\x94\xd6\xe2\x10\xec\x1c\xe1\x02\x1e\xdb\x1dP3\x03\x07bR\xbc\xa1o\xd3\xa2=sw\xf0\xb2DBI\x11r\xa5\xe5#\xa3Z[P\x89\xe9\xf0\xf6\x0e#-\xa2\xbe\x80\xcf\xce\x1bb\xd8\xef|W|\x7f\xd4\xf5\xb2\x94\x08I\x91\xa1\x19\xb4:\xdb\x13\xe5a\x86\xe2\xc2+.\x0b\x99ZE\x05x\xfe\x91\xa7\x17\x97z \xeaE\xe7H\x83P\xf4R\xe80(\xb3\xb6$L^\xea\x80<s\x16\x0e\xbe;\xe4g\xecs\xab\xca\x10\xed\x9e\xe9\xa7J\x10\x80\x98\x85\xf0\xd3\xfe\x1f$b\xb0\xef\x96\x87%|5\x17\x07:<\x01\xba\xc7\\\x9aax\x90\x13%\x1b\xfcG\xa9\xe7/&\x94\xa9\xc4`\xa9\x82\xb7\xe9\xf6(\x13o\x1d\xa7\x8a\xf2q8+\'\x17\xa9\x14\xa3\x0e\xb1\xce\x81\xc6\x08*:\xde\xf24Z\xe4\x90i*\x99\x03^R\xa1I35\xf7D\x9dc\x81^\xae\xdc\x00\xcf!\x14\x95\xd0\xe9\xbd\xee\xe6m\x7f#\x86\xb2\xf4x80\xd4\xfaP\n\xeb\xdb\x8e%\xfb\x10\xe2\xa6\x84]k\x10\x1e\x91~\xe9\xc9\xef\x1fS\x0eR\xfa$n\x91Ba\xcd\xe9Bp\x0fzw\xe9\x9a\xdeN\xfbE\xb1\xaf\xf5\xa25\xff\xec\x03NF\xe6@\xc0\\\xde\xfc\xfa\xbbp\x82\xcf\x9e8\x81^\x83\xdb\xd40Xu8\x91\x12{\xd1G\xf5\x86\xf0&\xe6\xbb\x1c\xb8\x9d\xd5u\xf6\x9b\xe7\x8d\x9d\xbe4\xb7\xcf\xba\x9e\x0c\xbf\xba\xadL\x0e\x802\xb6\xdd\xe6\x18\'\xadW\xbb\xb1\x05M\x96\x8dF\x8b\x13\xbe\xf1\xe3]\x7f*A\xbe\xdeJ\xafr\xc9k\x8e\xa9c[]Os\xd6\x85\x9f\xeb\xc1Q\x91\xa05\xc6\x1fD\xafg\xc13\xb8dU\xef]5\xa9"\x15- ?\xf1L\xe5\xe1!\x7f\x80\xe0]\xec\x0e\x8c;(\x05\xbd\xedf\xb2\xcf0\xa6\x1d\xfcV?\xfc\xbb@\xfa\x00\xd7\n\x9aT\xfc\xce\x19\x11\xba\x82\xc3\x1e\xe4\x11\x8a\xba$S\xaf8\xff\x93\x1a\x15\xad!`\x7f\x89\xccK]\xe7\x95~\xb4\x1bso\xde\xa2\x9dx\x0f\xa8\xaf\x13n\xadZA/l\xc2\x82@1+\x1a;\xe6\xd3\xf1\xb8\x97\x7fn\xcek1\x89?h\x1b\xf0\x02\xc2`b\xe1SG\xa5\xbc\x80/\x88\xc3\xa1b\x12\x11P"\xce\xe7\xe9\x08j&\xc9 ,g\xd5!6yh\x82\xa4O\xfe@\xea\xa80\x14\xf9\x0f\x15\x00s\xce`\x8c\xb1\x91\x851\xf5\xc5\x87\x90\xf3^*6k"\x91^\x19#\xc7\xdeh\x1d\x16\xfd>~~\x1d\xf8\xa1*/\xfb\x8dQ\x14\xa2G\x86z\xb0\xfemk>8\xcf\x94e\x97\xb7\x07\x81\xaa\xa2L\xf3?i\x8bP\x9f-\xb5\xabgIL\xba\xc8Y\nJ=VN\x9b\xf9\xdb\x8c&\xb7}\xe7{|\xb5b\xbc\xe0\x1bI\xacDQ+l\xbaGE\x91\x973\xa7S\xda\xa9Uo\xf7\x9c\xb3\xe6h%g\xaa\xe0\xcbq\xe9\xfa"]\x00\x84\x8a\xfe\xf9\xa9\xad\xd2\xa59\xc3R."\x04\xab\xa7aS\xbb\x85\xb7\xb9*.2\xaa\'\xa2\x87\x00oa\x16\x9b\x13;\x99\x88\xa0]\xaa\xf5u\x19\x1dCn\xbf\xd5\xa9C\x923\xad\x12\x13\x8cp\xf7e\xadD\xfeXi\t\xca\x1d:\xdb2-D\x03kqnh\x0e\x8c\xff\xda\xbd\xc5\x0e\t\x08\xa7\xc1\xc5Y\xaeC.\x91}\xf4\xe0\xd8\x08\xc85q;#|&\x9c\xaa\xc9\x8d;\x81\xb1W\x1d\x9d\xc1\xe8\x99\xda\x82\xcd\xd8\x1d\x9d\x99\x89\xfb\x1b\xcfi\xb1\xa3m\xb0\xb1\xef\xe4j\x10\xa8\xd7\xc9\xa2?M\xff\x87\xf4\xc9Y\n\xec\xae\xf4Z\xe5`\xf6\xc3\xec\xdb\x8a\x11\x8b\xe4\x00S\x194\x96\xe9\x86\xf13D@\x05\xe9\x89\xe4CmN\x18\xc3\x90\xa9\x82\xd0\x10\xf2\x879am\xd3\xd2p\x1a8+\x93\xa1\xd7\xee2\xc7\xe6%\xbd\x03\x96\xdb`|\xfd:\x02M)\x80\xaa\x99\xbb\x11\xa9Sg\xdf\x11r\xff4\xb5\x15\xffo\xd1\xd9\xab\xcd\x19z{\x9f\x1c\xdf\x95\x04kz\xc0\x95\xa8\xe9\xdbB\x0b\xbf[\xae\xef6)\xca\x9e\x91\xa7\xcfVI*\xd0\x12|1Hh\xd0\x8a\x8cL\xcb\x0c\x1f;\x1aQn\x9a\x00\xa7\xa3\xfeDS\xa7\x95~@&\x8c\xa2\xf9\x1f\xc1\xf2n\xfeQ\x90F\xa7\xcc\xb5\xaa\n\xa6\xf2\xbd-\x8by@\xed\x02c^\xdb4vl\x07[k\xae\xc5\x97\x88&D45\xaeN\x1c\xcbay\x02"\xe7\xa4q\xd3\x93i\x1f\x1a5\nQ\x0c\xbc\x9c\xb3F\x0f\xc9\xd2_\x9ao.(\xe4\x8a\xbb\x93\xaf\xed\xae\xb07\xb3H\xc0dwj5\x03\t\xf0U\xf1#\x1al)q\r\xca\t\xd2\xafk\xa4\x19\x13\xc8\xce\x88\x93\xabW\x8d\xa3Ds\x93f\xac\xe3OSi\x89D\x8b\xb1\xa7\x82\xbb\x82\xf0}\xdb\xed\xb7\xd5c)C\xabP\x02\xa2\x1e\xea\xb6\xe8\x83\x97nCf0\xb3f/\xdb$-o\xd2?D\x99!K\xd4\xefB@\x98P\x98\xe3Q\x10e\x89* \xeb\x10p\x8bi\xf5\xe4\xe0P\xfd\x99\x90l\xbe\xd6\xa0\xd7m\xf1eW\xb4\xf4\xe4\xcaU\x13g\xdbS\xd5\x19\x91\x8a\xf7\xf9\xfe2YT\x17\xbc\x08\xc7\xee"L)\xdf\xd1o4\x82bz\xa3\xe1\x965]\n\x06H\x9c\xcb\xd2r&\xbe\x16"\xd4M\xd6\x1dR1\x13/\xa8M\xa4\xe1\x8b\xc4\x8c\x92L\xbf\x9b\x1f\xcf\x93]\x18#\xc2\x8f^f\x88Y\xcb\xb4\x12\xb7\xdf\x8f\xc7\xee\x14c\xfa\xa2\xf4\xfc]\x1c?q#uq\xca\xd2\x17,\xf00c\xce\xb5\xc9\xb6\x9b\x82\x83\xe0V\xf7\xaa[\xaa7^n\x17\xcay\xdb\xe7\xf9\xfe,[[\xb6\xc8\x14sqI\x0b!\x0c\x81<Qt\xedr\nj&A\x9c\x8ay\xe2M \xd4U.K#\xcf\xc8C\x0bm\x87\x19\xfbf\xc8\xed\xca\xd1\x14\xd8s\xcf\xb6S\x16\x8ft>)\x17~\xd5\xc1\xfe\xde\x91@&4\xbf/X\xbb\xca\x82#u\xbc\xdc\xfb\xc9\x84\xae\x95O"#,\x8c\x8f5\xa3`\x8c\xd6\xde\xdf{3\x97\xbc\xad^WF\xedY\xc5B\x85\xac\xd6]\xc9M\xd2\x7f\x7f\x0b\xf7\x99,\xb9\xfd/\x8c\xa6j\xf1e\xe7.!y\x9e\xf1\xdf\x95\x11W\x0baWc\x13`\x89\x14I\xdf\xc1\xc3\x98\x00\xe9CoJx\xe5\x99<\x12\x7f\x83p\x1d\xb9\x0b7A\xfb\xb0\xe2}\n\xf2\xf7\xad\xfc\x8e\x04\x88\xe6\x90\xaf\xc6\xab\x13\xa3\xb5\\JoFhd\xf4\xdb;\x1b\x91\xd5\xfd\x85\x13\x9d\x84\xcdR\xacL>\x86\xf8hg\x85\x13\x9d\x88nK\xd2\xac\xde\xc2\x18\xae\xa5J\x8e$\x87\x83\x8a\xdf\x01\x0b!\xf4\xb5e\x87\x8fv\xbc\xf3D"\xbbR\xba}\xa4Z\xb8=\xaa\xf2"\x9f\xaet9\n\x96\xec=\xe7}\xc8U\x1a\xea\xb9\x87q\x90\xf5Hs\xfd\xb9\xbdb8\xee\x10L\x0f\xc9\xd3\xf2\xd8\xa3kf\xca^\xbd\xe8\x19\x82\xdb\xc6\x1f\xb8j\xb1\xb6P\x16$\x9e\x1f\xed\xdd\x10\xe9\x80,\xedE\x87!\xfb\xdc\xdf\xe6\x80Z\xa4\xe6\x00z}\x93+"\xb2\xe1}\\\x97\xf3\xc9[M\xe3\xd8\xfe\xca\xd4\xb6\xb4\xcck\xa6"S\x80\xd2;\x8b|B\x80\xbb\x89;\x87\xbd\xbd\xa9r9\xaa\xb3\x07$\xe0\xf4\xe7l\xda__\x94\xea:*\xa4jd\xcaw\x81\x1e\xcc4K;\xb5~\x82"_w\x05\xdco\xbc(\xd3\xe4\xb1\xebQm9\xe9\xea\xf9\x01+\xb8\xb5\x7f\xa8$\x8a\x88=\xbc\x85\xba\x96\xb8kq\xd0x{\xf5s\x86\xfdc\x04{\x9d\x14\xbe\x90\xef>\x8c9\xd3\x05\x99\x85\x9e\xa4r\xc0\xae\xdbv|\x0b\xd6&".\xc8\xa7\xa1\xde\xaa\xb4\xa0\x91p|O\x18. :a\t\xbbe\xf3\xda\xe9]\xb9\xd7\x97j\xc0\x94d\x98V\xb7\xe4\xa0Y\x00\xa3U\xde\x8ch\xc4\xc3\x8e\'\x86xt\x16\x8c\xaaR\'<\x8a\xe2\xe7`\xea7\xf09q)\xa0\xd0\x94\x06\x8b\x93\xc0o\\\xcb\xc0\x1bh\x18.\xaf\x04\xd6\xcd\xbbw\x0f\xd5\x18piu\x91\x8aK\xeeo\x02\xe2\x9f\x95E;{\xcfE\xf2L\xb2\xc2\x10\xd1i\x1b\xa5\x94\xbc\x9dG\x8f6\xacv-\x03\xad\xf9T\xa3\xec\x94\xea\xcb\xc0W\x12\t\xe5+\x84\xb7\xbdSS\x87<\x87\x01\xa5Q\x03\xf9a\xd2\xefQ\xae^\x1b}\xe8\xbb\x01\x8a\xf6\x83\xcd\x1b\x03\x88\x8eRz\x97\xcb\x8d\xb2\xdb\xd7\xdd\x07K\xc4C\xa7\xb0H-\xfe\x01\xe0\xefN\xe3\n\xb7i\xf6\xeaFP\xb4\n\xdd/Vadz\xecu\xd6\xaaq\x94\x1b\xd9Xm\xc6\xde\xa8\xbc\xc6Q\x15\x9d\x05\x13\xf0\xbf\x0f\x03\x7f\xcb3;\x15P+\xd9\x93\xef\x1b\x1e\xaf\xd3\xc0\xd2H\xad]\xdeT\xaalii\xc7\xb4\xe3\x04\x1b\x18\x9a\xe5\xf5\x03s\xa3r\xed\nn\xad$\x87@(K\x10,\x13\xf7\xe1\xe0\xb1\xe5\xd9\x8b^0\xc2\xd9\xc0\xb37F\x06x\x03\xb1*\xa1\x9e\xf1\x83\xb2\xf1\x9bny7Y\x8c){2\x060T\xf8\xf7\x04\xe6?=,9\xa0\xa5\x14`\xe4<H\x8d?\xc6\xf0\xf0K\xa8\xd9\x16\xa9\x91\xcc\xd7\xa4n\x8e\xef\xa7\xae\x13+D*-\xf2\xd3\x8d\xed\xa7\xed \xef\xe2s\xe4\x13B\xba\xf8\xffz\x91\x1b\xda\x98B"\x07D+zdl5\x81\xda(\xd0RC\xda\xd6\xe9Q\x80j\x96\xb6\x84\x01\xa0\xc0\x86\x18&Q5]y\xbd\x9d~\x0c\x1f$\x18\xddc\xd8\xae\xe7\xb5.]\x05fD>\x9a3`\x0b}\xafE\xbau\x9b;\x929\xb9\x9a\'|\x06_\\\x99\xa9lq\xa7\x87f\x8f\x9b\xb6y+\x04\x0e)\x88\x13\xb7\x80Q\x81\xea*\x0c\xa7\xf5\xe9i<C]H\'\x82i\xba\x13\x80\xfc\xbd%!\xaa\xfa\xd7\xe3\xd7\xf2#7\xd2\xfeLcg\xa4,\xdb\xf2vH\xca@\t\xae5\x19\xa5\xbb\x96\xa1\x05\x151\xa6=k\x86\xce!\xc1J\xa4!\x82f2\x9c\xda\xdeu7\x9d\xcav,\xf4\x9ci\xcb3\xbefR\xdd\x12\xedB\x93\x01\xd8?\xc3\xe3\x8a\xe7\xd3-q\xb1\x1d\x11\x9d\xa9\xb0\x00\x9e\xdb\x1f\x96\x8b\xe0I\xfc1\xa3\x0c\xab\x08\xdc\x0e\x8c\xeb\xa6\x9a\x934\xffI\x0bfQD\xce\xb3\x7f\xbd\xe8\xa0\x0b\xf0\xf0\x12\xba\xc2\xfe\x94\xd5\xe2\x95\xc6\xdc4\x03>\xb8P7\x98\xacxs%z\x12\xefK\r\xfd{\xfc\xc6\xc0`\xa8\xa2Y \xd5\x9b\x9dMd\xa4a\x84\xdc\xbfE\x08\xdd\xc9\xf5\xb9\xe9\x89v\xef\xc1\xd2\x7f\xb6F\xfd}t\xa4\x7f\xe2\x96#\x0f@-\x12\xd3D\xa8\xa6G5\xa8G~\x80\xf7L\xcaNC0u^\x88\xb5q-\xe5\x89T\x9dGq\xb7"/\xced\xa2=i8N\xda\xb5\x87N\xe6\xaa\x04T\x8bH\xefp+\xf8\x82\xc0\x80\xb6\xb4!%\xa4\xfbY\xeb\xde \x0f\xf9;\xf0\xdd\x18)\x03v\x00\x0c\xca\xfaD\x1c\xa34,">\x1c\xaa \x8e?\x02\x10\x1869\x12 R\xa9\xc9\xa7\xb0\x98T:\xe7\xb95z\xf9,\xac\xcbAD\xd6\x82Sd6\x0c\x14,\x93\xa0\x84\xcc\xac\x91\x91\xc5\xcc\x10\xca\xd2\x88<\xa5U"\xa7r\xfd\x1f\x05\x1d\\g\xe7\xc5\x94t9\x9e\xf0\xe1\xbf\x15\xa0\xbe\x84\x0e\x96\x82o\xb5im\xa3\x06\x158H\x17\xf2\xde\xb1\xc23\xf8\x8e/\xf5\x832v\x97;W7C\xa9\x9f\xf6\xcbK=O\xb4\xeet\xb1\x142\xd5\xeb\xf1\xbe\t\x11\x8f\xae|e\x17\xf1:`\xe5?#0\x89v)\xa0\xfb*\xe6x\x97\xee\'\xd08\t\x91FJ\x1b47\xf0\xf1\xf6?\xef\x9c\xad\xa2S\x82K\xc5s\xf2Bl\x90\'#\x84\xf8\xe9\xfe\x17w\xfc+7\xc8\xef4\xd7\xd8\x81\x8aS\x07\xa1fK\xd92\xd6\xa8\xd6\x1d\xb7Q;It\x12/\xc6\xcd`s\xe8~\xb4\x1a\xf0"[\x02%\x86\x00\x04\xa0\xc7\x87\xe7\xa6}b\xf1\xe2\xae\x15D?,\xdb\xb0\x15\x92\xba\xce\x00^\xa3\x19<\x87\'c?\x94x8\x92\xc7@$\xd4M[\x8d\x16\xc1\xdcE7\xe9\xbd\x16\x96\xb7\xf7\x10\x91\t\xa3zaO\x80\xef\xb3\xc6\xa1\xd2\x13\x83Z\x05\xe7\xf7[FW9Og\x9a\x9c\xbeLG\x7f\x06\xf0\x00\xd7/\xd04\xfb\xa5\x1bM\x17\xa9B^ \x1e`\xcd:\xa0a\xce\x90\xa8\xcbQ=\x01\xb1\xa7\xb8.S\xc8H\x91\xb0\x08\xa2\x94o\xc2\xf8h&\n\xa2S\x86\xc1\xc0\xb0\xa7\xf9\x1e\x87\x99\xa7\x86\xb8t\x91F\xea=\xc6\xf4\x95S\x01\xdb\xab\x1b\xe7v\x0b\xac!\x9c\x90re\xc34~\x1bJ\xf73\xcds5\xe2\x00\xbd\xfc\xfa\xd0\xc0\xdff\x1c~\xf8\x06\xce\x8f\x89W\x128q\t`\'r\xea\xe6\x81\x9b\x83\x7fhz\x80F\x8cO\x14H\xdc\xa5`5\x0eBf\xaa\xbb\xe5\xc2\xdde\xf2\x0e\xb5a_6\x80>e\xbe\xce\xe8\x1e1\x03\xd1\xfb\xa6_\xd1h7>\x96\x18\xc3l\x9c\x9c\xf6u\xecD\x91\xac/M,\x8d\x15"l^\xc6\xa5\xff\xe8\xc2}E\x0b\xc05r\x1a^\'0\xbcCr\x16\xab9\x81@\xddBh\xe6\x8d*\xfa,\xb9\xee\xe2\xbd\x8eM\xf9\xba\xfc\x14\x82\xbdt\x85\xd3\xcb\x81\xb5\xcd\xf2\x8cE\xe6\xd9\x8d5z\xe0)\xed\xbfK\xf3\xf8\xb7\xcf\x0c\x00\xec\xb3\xca[\x10\xe3\xd3\x1b\x07\x04\xda\xbe\x87\x8c\x11J/\xc7\xe3\x9dQ\x04@`\xd8\xf8\xd1\xd6\x97\xaaFvX\'B\xa1y\xc9\xf7\xcd\xe2\xb9\xb9\xf5n\t\xdbX(H"\xe5\xa9\x1cOy\xb6K\xc6\x08N\xdaW\x91\x9f\x01_\xa3a\x97=\xf8\x8c\xb3\\\xf8F\xa7\x81\xcc\x8azM\x17\x0c\x9cZ\xbatIz\x15\xa9\xb3\xcc\ry\x8d>G\xb9\xda)\x01\xf7\xa6\xcd\x81=|\xfcI\x87\x80\t\xc8\xc8\x00Aj\xc2\x900\xac4\x85\x0f\xda\xcfN\x16\xad\x10*\xe7\xc8y\x84\x8d[s#\xf4j\xd1\x0e\xcd\x1f\x1c\x91\x11\x1a\xd6e\xacR\x8a;\x1b\x16U\x00Mb\xecR\x92\xbc\x08\x9b\x0e\xd2\xa6d\x84\xc3X\x80\x8e\xcb4\x02\xc5@\xa0]qfq~T\x1ab\xd3[\xb4\xf0\x01\r\xc3\xf1\x0f\x8b\xde\x05\x00\x8c\x0e\xafG\xab\xa9d&\xb6\xd0\x9b\x0f\x89\xcb\xf7U\xaa\xe2@\x91\x88.\x8bP\x92\x0f\x82\x9c.\xd4nMno"k\x85^\xf4\xd0\x93\x9b\xbd\xad\x8fzV\xe4\n+f\xb7\xb8\x95\xa9\'Xy\xa47\x89\xae!\x8e\xdc-\x04\xfc\xfbr\xdb\xed\xe5K\x1a\xecSK\xb3\xc3NH\x89\xeb\\p\x9e\x182\xc5\xd9e#\xb0\x81\x18UdT\xb7\xfd\x10=+y\xbaP[?\xdd\x8d\x8a\x93V\xcdu\x1f\x9a\x94\xfe\x84\xb98|c\x8f\xdf\x14\x0c\xd6\x88?\x1a*\x89\xfcW\x87H\x93\xc0\xa1(5\xab\xa3\xcbN80\xa5\x98\xed\xdb\x0b\xdd*\x9d\xf0\x87\x06\\\xc2\x01\xe7\x8808\x90\xe1?\x12\xe71\xfcm\x8d\xf7D\xc2\xb0\x81\x01\xe7\xb4\xff\x8f\xa78\xe3\xb5N0\x00)\x91q\xae/ !\x93\xdc\x8ek\xfa\xaa\x90\xeb\xcc\x17\xe8[\x98i\xa1fx\xa4\xe9d\xaa\x9e\xe4\x90\x1c\xfd\x8c(\xf9\x8d\xa2T\xed\xa3\xcf\x82\x1c\x9e\xf8\xe9v\xd0-\x1f\x0b\xf7\xbf\xc5\xc9\xef\x14\xec i\xb5\x05\x91\x17\xaev\x9b\x85\xca\xbb{Gn_\xbe\xe7\xda&\x83y\x0f\xadM\x18\x0f\xec\xfcA\x06\xf3\r\x95F_;\xb4(\xbdP\xd9`$2\xd5\xa4\x8cf\x87j\xbc\x0f\xfa\xfb\xb6\xd5\x8c\xa2*\xb8\xcd_@C\x86\xfc\xda\xc5\x7ft\xc8\xdc\xb1y\xbe\x17\xa6\x80\x12\xdb\x81\x89\x0cV\xdbCO\xa0\xa8cT@Jx\xcao\x15Z\xb9P\xbf\xb8\xfe\x8c\xde6?-\xecU\xca\xe7M\x9f\xce\x88JP\xc5\xb2vW\x97]\xbcN1\x15\x00\xd0\xceRSj\x94;4\xab\xef\xa3\x07\xbb\xcaP\xe4E\xf0\x19R\'Y\xfb]n\xaf\x9e%\x02\xd4I \xdc\x08\xef\x0b\xf3\x96W\x82\xcf\xdaH\xcass\xa9D\r\xd5\xb4\x9c~p\xab\xa7m}\xef\x1d\xb6\x87au\xb49\x12\x85\t\xebf\xfb>\xad\xba\xd3Nw\xba\xda\x89?\x85\xc7\xc7\x01\x08\xc5]F\xbe\xd6\xc8\x00\xb4\x8e\x1d\xb7\xdb{\x9a\xc0D\xe1>\xf3\xa6\x13\xf8\x88H\xff\xec)\xec\xa5\xc1\xb72\xa1*l\xad\xfe\xda\x11\xf3\xe9\xde\x91\x04\xf6H')
1
+ from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,Proxy
2
+ # from flask_babelex import lazy_gettext as __
3
+ from flask_babelex import gettext as _
4
+ import wtforms as wtf
5
+ from flask_wtf import FlaskForm
6
+ from flask_bootstrap import SwitchField
7
+
8
+ from flask_admin.base import expose
9
+ # from gettext import gettext as _
10
+ from hiddifypanel.panel import hiddify,hiddify_api
11
+
12
+
13
+ import re
14
+ from flask import render_template,current_app, Markup,url_for
15
+ from hiddifypanel.panel.hiddify import flash
16
+ from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
17
+ from hiddifypanel.panel.database import db
18
+ from wtforms.fields import *
19
+ from hiddifypanel.panel import hiddify
20
+ from flask_classful import FlaskView
21
+ from hiddifypanel.panel.hiddify import flash
22
+ class ProxyAdmin(FlaskView):
23
+
24
+ def index(self):
25
+
26
+ return render_template('proxy.html',global_config_form=get_global_config_form(), detailed_config_form=get_all_proxy_form() )
27
+
28
+ def post(self):
29
+ global_config_form=get_global_config_form()
30
+ all_proxy_form=get_all_proxy_form()
31
+
32
+ if global_config_form.submit_global.data and global_config_form.validate_on_submit():
33
+ old_configs=get_hconfigs()
34
+ for k,vs in global_config_form.data.items():
35
+ if k in [c for c in ConfigEnum]:
36
+ BoolConfig.query.filter(BoolConfig.key==k).first().value=vs
37
+ if vs and k in [ConfigEnum.domain_fronting_http_enable, ConfigEnum.domain_fronting_tls_enable] and hconfig(ConfigEnum.domain_fronting_domain)=="":
38
+ flash((_('config.domain-fronting-notsetup-error')), 'danger')
39
+
40
+
41
+ # print(cat,vs)
42
+ db.session.commit()
43
+ hiddify.check_need_reset(old_configs)
44
+ all_proxy_form=get_all_proxy_form(True)
45
+
46
+
47
+ elif all_proxy_form.submit_detail.data and all_proxy_form.validate_on_submit():
48
+
49
+ for cdn,vs in all_proxy_form.data.items():#[c for c in ConfigEnum]:
50
+ if type(vs) is not dict:continue
51
+ for proto,v in vs.items():#[c for c in ConfigEnum]:
52
+ if type(v) is not dict:continue
53
+ for proxy_id,enable in v.items():
54
+ if not proxy_id.startswith("p_"):continue
55
+ id=int(proxy_id.split('_')[-1])
56
+ Proxy.query.filter(Proxy.id==id).first().enable=enable
57
+
58
+
59
+ # print(cat,vs)
60
+ db.session.commit()
61
+ hiddify.flash_config_success(restart_mode='apply',domain_changed=False)
62
+ if hconfig(ConfigEnum.parent_panel):
63
+ hiddify_api.sync_child_to_parent()
64
+ global_config_form= get_global_config_form(True)
65
+ else:
66
+ flash((_('config.validation-error')), 'danger')
67
+
68
+ return render_template('proxy.html', global_config_form=global_config_form, detailed_config_form=all_proxy_form)
69
+
70
+
71
+
72
+ import flask_babelex
73
+
74
+
75
+ # form=HelloForm()
76
+ # # return render('config.html',form=form)
77
+ # return render_template('config.html',form=HelloForm())
78
+ form=get_config_form()
79
+ return render_template('config.html',form=form)
80
+
81
+
82
+
83
+ def get_global_config_form(empty=False):
84
+ boolconfigs=BoolConfig.query.all()
85
+
86
+ class DynamicForm(FlaskForm):
87
+ pass
88
+
89
+ for cf in boolconfigs:
90
+ if cf.key.category()=='hidden':continue
91
+ if not cf.key.endswith("_enable"):continue
92
+ field= SwitchField(_(f'config.{cf.key}.label'), default=cf.value,description=_(f'config.{cf.key}.description'))
93
+ setattr(DynamicForm, cf.key, field)
94
+ setattr(DynamicForm,"submit_global",wtf.fields.SubmitField(_('Submit')))
95
+ if empty:
96
+ return DynamicForm(None)
97
+ return DynamicForm()
98
+
99
+
100
+ def get_all_proxy_form(empty=False):
101
+ proxies=hiddify.get_available_proxies(0)
102
+ categories1=sorted([ c for c in {c.cdn:1 for c in proxies}])
103
+ class DynamicForm(FlaskForm):
104
+ pass
105
+
106
+ for cdn in categories1:
107
+ class CDNForm(FlaskForm):
108
+ pass
109
+ cdn_proxies=[c for c in proxies if c.cdn==cdn]
110
+ protos=sorted([ c for c in {c.proto:1 for c in cdn_proxies}])
111
+ for proto in protos:
112
+ class ProtoForm(FlaskForm):
113
+ pass
114
+ proto_proxies=[c for c in cdn_proxies if c.proto==proto]
115
+ for proxy in proto_proxies:
116
+ field= SwitchField(proxy.name, default=proxy.enable,description=f"l3:{proxy.l3} transport:{proxy.transport}")
117
+ setattr(ProtoForm, f"p_{proxy.id}", field)
118
+
119
+ multifield=wtf.fields.FormField(ProtoForm,proto)
120
+ setattr(CDNForm, proto, multifield)
121
+ field_name=cdn if cdn!="Fake" else _('config.domain_fronting.label')
122
+ multifield=wtf.fields.FormField(CDNForm,field_name)
123
+ setattr(DynamicForm, cdn, multifield)
124
+ setattr(DynamicForm,"submit_detail",wtf.fields.SubmitField(_('Submit')))
125
+ if empty:
126
+ return DynamicForm(None)
127
+ return DynamicForm()
128
+
4
129
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
130
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,128 @@
1
- # 2023-04-08T15:11:22.142328
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\xa6"\x00\x00\x12\t\x04\x00\xe1Yhos\xa5AuhW\\\x95\xb0@p\x9a\x00\x00\x00\x00\x00\x00\x00\x00~\xfb>\x86\xa3\x1c\x04F\x0f\xdc\xc3BcxC\xbb\x00\xe0\x19`\x15W\xd0A\xa6\xd5*T\xd3\x93\xbfO\xfe\xf5\x10\xce\xc1\xa9\x16\xday\x99\xa6St\xf8\x170\x1e\t^\xed\x880\xc1Rn(\xa6\xef\x8b\xc9\x19[\x95\xa1\x92n\xd9\x06\xb0 8\xdc\xc3\x90\x02\xa9\xf3\xfc\x12\x0f\xd2\x02\x81w|jq_\x1d\xe8\x80\x9e\xb2l\xd0 4\x07{\x8a\x06\xf6\xe2\xfbB\x000\xcai\x9d\xe5\xe5\x97\x12\x17t\x9fN\x14\xa7)\xe4/\x7f_Q5}\x18\x830\xe4&d$\xa8\x98\x10\xecGi@\\\x9a$@\xc6\xf2\x85_t2\xcf\xfaD\xe1t\x07\x97\x93\xae\xd6K\xd3\xa6\x16\x9a\x9fp\x8b\xd3\xa9\x90\xaew\xd9(\xf3z\xb5\x9d-\x16\xc7X\x86A\x95\x18\xf5D\xa6+\xa4Z=\x82\x93\xeaB\xb3\x13\x99\xb4\xb8%\x9eI\xfe\x08R\xc7\xd3y*@\xce\xb2\x1eGE\x99\xff\x91\xb5\x85\x9f(M\xeb\xc7\xfb\xa5\x11U\x17i\x9e\xb4B\xbb\x18\xea\x06\x87\x87)\x8a\x18|}G\xf2\x14\x9f\x14\xb3\xef\xafN\xf06\xae\x1c\rFr\x8b1\x8f\xaeE\x99t\xc7\xe34\r\'\xcd\xe9\x177\xd7\x86O\xca\x13:\xfa\x9c\xcc~v\x01\xbbx\xd5\x83\x1e\xaf\'_\x86\xac<\xcf\xb0\x0c\x93"\x19\xe6\xd2/v\xae\xd1^\x0760\x14\xf9\x82\xff\t\x90!\x8f\x83\x16G\xc8\x8dc\xa0\x17\xcd\xc7\xbe\x17[\xbf\xcaK\'\x8a`#\xb5\xab\xd5\xd9<\r\xa5^KC\xc4\xa7\xb6F\xd5\xe1\xe05\xd2\x1b\x18\xe4ub\xda\xd8\x98\xc7\x8d\x82\xe2\x14j\xbb%\x11\xbe\xe4\xff\xee\xf3\xa2\xf0\xe2(\xf8\xca\x14La\xd4\x7f\xe9\xf4\xe7v/\x9a\xd5\x7f\x9b\xaf\x1f\xac\xd4\xf5q\xad\xe2\x1c\xa8\xfeD\xb6\x89\x17>$\xb2#$jC\n\x02\xca=\xac=\xd5\xf1\xce:\xd6\xd3\xa3\x13\xe1\xf4\x82Ci1\xdeF\xa7\x0e\xde\xf1\xbe\x85Ma\xa9\xc0\xc3-\x14P\x8c\xbd\xdc\xf1\xf7\xe5\x89->O\x01\xff\r\x92\x1b\x9b\xe7\n\xda\x84\x03\xa7)\xf3\xbco\xbb\xe3\xf6[\xa6\xc1\\u\xabK\x95N\x0cY\xb5\x9e\xe6#3\x18W\x89\xd2\xaa\t1\xf3\xf9s[\xc0#(0\xde\x9e2Mr\xce\xbf*\xc6\xa8\xb1\xa0\x94\xbd@\xbd\xc6\x1fWh\x88\x16\xef\x9fOS\x9d\xf6.\x9f\x180\xddi{\xc3\xe9\xd8[w\x97\xffw\x87\xea^\xf9\x8a+\xd0\x9c?*\xf8\xa1\xb0J\xb6\xe7a\xf3\x8e\xebm}\xaa\x85o\xcd\xca\xe7\x15\x172\xa0\xff\xb0{@\x07-\x88S\xa5\xb0i\xfc\x98W\xcf\x10f\x02-u\x15\x02sW\x1e\x93\xee\xc2\xd4\x02P\xb6\x97\xa9s\\\xc9\x14\x08W2m\x13\xd3Nb\x99\xd4W\xddOf\xd3\x92#\xa3\x90Ff\xd9\xf4\xdd\xf4\xd3Rl\x8e\x89\xb2\x1b\xe8{\xe4\xe2\xb7\x1e-\xddIG\x9d\xf9\x04G\xaf\rJu0\r\x83TPh\x14\x9b\x9b\t\x83\xf1\xe3\x17\xed[\xc5x\xce\x93\x87\xe1\xb1\xf0\x844\xd2\t\xc1 \x11\x01e\xe3\x12\x90\x94A\x8e\xad\xecr\xcc\xe6\xe3\x87\t\xda\xe0\xa9x\xdc\x82\xb4\x9d\xdb\xf2\x8f\x1b\xe2\x1f8\xe6,t\xa3\x0b\xbc!\x86\xc7\xa8\xb0%P\xe9\x87>]\x86y\xb6\xfb8\xcd\x08\xdf\xec\xc1\xbe\x9em\x97\x1bF"\xc8T\xf8Ic\xdf 6\x8d\x12-\x08\xd8K4WG\xc4\xb9k\xd89~\x96ki\x9c\xf7J\xa9h\x02\xa0\x806\x04es\x86u=\x04?\xce\xe1HC\x0b\xe1\x1f\xfa\xddk\xac6\xb1\xdcY\xa5\xc4 \xa6\x920F\xb2\xe4\x04n\xda\xbf,\xe8%\xd7\x1e\x1c;\xf3\xc6\\\\\x97\x94\xdff\xf2\x90\xc8\xdc\x03OF\xd0\xb2\x83\x00\x91\xb8\x1c\x13\xf5ZE\x84d\xa5\x80\x82\x0c\xc8p/qF-|\x8fu\x87\xa1D\x03\x90\xd1\x1at\xe4\xf0\xf45\x94u\xc0\xe2\x98Qi\x94t\x07\xf3F\x05\xf5j\xbf\x1a\xa5\xeb}\xb6\x15d\x92H\t\x0c=\xb9\xad\x1c\x08\xd1\x1e3w4\'\x13{\x11\xcb\x1e\x86Z\xc19\xec\x9d\x86\xc6\xc3\'\xc4\xb6\xe9P\xae\xed\xd2\xc2$\xb1\xfa\x19g\xab]\xcc[\xbfl\xde\xc1\xf6\xb5\x99\xc1\xe6hd\xc3\x0e\x18n$K?\xf7\x1ed\xad\xa4%t\x10\x93\xb5\xc7\xde6\x81\xe6o\x1f\x8d\xde\xf2\xdcO\xac\x13\xb6\x13\xda\x8b3I@\xd8\xcec\xabK\xc7\x12\xe5\x14\x14\x807:\x80$\xaa\x1d\x1b\x02\x02\x03M\x82\x86\x98\xd9)\x8e\x02\xf74\xf4"R\xbd\xd0\x8e^!t\xb4\xe7]\x0e\x07\xfd:\x06H\xc0\xc7\x0b\x16-\xf9#Jq\xae\xc4W\xdb\x85\xf9\r\xcdS\xca\xf3\x92\x03\x98\x014\x92\xdb\x9df\xe0B{\xf2\x19\xe7\xbbu\x0e\xabI\xa6f\t@[\xadL\xc0}]\xb1\x83\x8e)M\xd4}\x19\xe4\x87\xb5p\x8a\x9aE\xedT#\xcf@o\xff\x8a\x009X\xbe\x98q\x9e\xe4O\x15-\t\x03E\xf2\xbf\xdf\xf8\x14\x1d\x93\xea\x87\xb8\x1f\xaf\x97}\xb6[5\xd3\xeck\xe0v\x84N\xbd1\xfc_\xd5\x1e\x81<9\x9f\xc2\x87\xc0PC\xe4${g\x124\xdf\xf3\xb8\xaeh\xc5\xe3e\xee\x7f\'bi?\xf2\xd1\xa07\xd17,D\x1c\xe5\xb8\xf3\xb7\x99\x01>\x9b\x98\xad\x0b\x14jWE\xa3\\)\x1c\xc1"/\xaew\xe7\x99\xb2\xfe\xfcGF*,a\x91\xc6\x95\xfdj\x13\x9d\xe1\xdfm\xd9\xe8\xdf\xa9M\xd1\xa6\x9f\x82\xc6\xbe\xdf\xd7e#\x1c\xbc\xdb\xa2\x15!\xca\x10%\xd2Br \xca\xa5\x8b\xfd\x8a/\x8e\\q\x9f\xb1\xe9\x92\xf3l\xe5\x9a\xf6\x1c/\xf1\x18\xf1U\x9cA\xf7v&P\xbdlX\xa8H)zg\x91n\x80\xd8R\x87\xcc\xa6\x8f\xaen\x08\xe9\xc4\x02~\xd6\xcf@\xffb\xabQ\xb8\xa9\x05e\x11\xd4\xc0J\xb8\xa7\xf8r\xd8G\xf5\x88\x07\x0f\x10\xb3L\t\x0f\xfe\t\x85\xa4\xe8]\xfd\xacU\xe41H\xc16\xaa\x80\x06\xf6\xe9^9:L)\x7f\xad]\x1e\xb6\x88\x92\x13\x1c\xd0\x80\xe1$2M\\\x9b(_\n\x1d\xc0y\'\r\xa4-\x9f\xb8M8\xa1\xb97\x91q,\xf6\xba\x04[oRm\xb1\x84H\xa2\xa0=iZ\x91\x93\x07r\x8f-\xd4oMZUm\x84_\x8f\xb8xM#\xb0>\nd\xff\xc1h#N\\\xa0Wp\xe4\x13fa$_w\x06\x9e\xde\xd7\x03\x85B\xe9\x17\x1e\x90\xda\x85\x12\xc4\x90;Z\xa7\xc7\x00\x14%F\xcc>e\x83\xf9R\x93\xf8l\xeeU5\xa1\xbd\x19\x17a\x14M\xcc\xb3\xe9\xc7\xbd=Q\xa3\xdcd\xb0\x88\xc9\xdf\xe36z\xf4\xbd\xe0z3= \x9f\xa9PGix\xab\x0b\x8a\xebq{\xd7\xcaf\x8e\xdb\xaaH\x8c\x1f\x0b<\xf08\xa9\xcb\xdby\xbe\xc2\x06\x80I\xfd7\x80B\r\x9bo\xf9\xa8\xb3P\x97\x99\xab\xcb\x8aJ\xb4\x93\x1c)\x97\xec\xe8\xe5\x91\xed\xeefp \xd2\x06P\xfa?\x90Hz\x89\x1a\xe3\xd4\xf1\xe7k,\xc5\x04Y\x13\x88\xa8\xa9t\x95\xb9gV\x87\xf2\x86\xba\xa4\xddK\xb0e\xc6\xbe\x03\x95U\xed\xef\x16\x12\x19\xa3D\x7f\xab\x15\xde^\x16n\x9fChF\xe3\xcf\xee\xc4\xe1u=p\x8e%\xbe\xd6Mp\xdbr\x11?\xa7\xb0w\xf5\x9a\x1e\xc8>\x14\xbc\xef\x16P\xce\x9d\xebQ\x95\xeby\xd0]&/&WW\xdeC\x12H\x9e\xcc\xcb>\xa7>\xa2\x0c\xe1\x05\xf6\x19k1\xb2%\x04~\x83X\x07\r\xf6\x95:v\x86\xa1\xac|\x90\x90no\xa2\x7fY\x96o][\xbeIv\x1d\xb8X\xaa?4\x14\x98\xf2m5Z\x88\xe1~\xce\xe3\xe0\xaa\xebs\x0b\xa5\xaaj\xa1\xc6^\xf7\xdb\xf1\xef\xd6{|\x85\x94mI\xf0e=\xe2\xeaO\x0f-\x1c\xc9+~B*\xed\x9c\x84H|\xa1I\xd8~\t:\x0b\x07\x9fE\x9f\xe9Y\x16\x99\xa3\x91r\xd2=hIo\xc8\xa2\xf8I\xbe-{i[\xfa\x0b\x04=W\x9e\xd4\xdc#\x91n\xf9\x8an\x93\xc2\x16O\xa5\x85\x13LW\xaf\x14\x9df\xa7QF\x16E\x9bD\xb4\x05\xb4*D\x911\xee\x0e]\x19\xe8\xf5k\xc7\xfc@E\x03\xbb\xfd@\'\x1b\xc0\x9c\xe9\xfe\xda\xfaQ[\xf8\xe3C\xa0[Y\x07B\xc0Y<\x91&\xa8 \xa5\xd9^=)\x89\t\xe6\xe3LiP\xd3\xe4\x04\xb1\x11\xaaK\xde|1k*\x82\xe2[\x94JR\xe5\x80\xe4\x17\x82\xf2zf3\x80;\xd3\x81\xfe\xa8\xc5\xbd/2\xb8\x06+C6b\xeey\xb9\xb3\xefs\xd5f\x02x\'`}\xac\xafJ\x1d\x99\x1a\x02@\xb3\xb5kE6d\xacT@\xbe\x08\xcf1\x93W|\xba\xd1\\\xdaR\t`\x99\xe48\xd6]w\xe2]t\xe4\xec\x86%\x18\xa7\xdcE\x96\xa6\x0e\x14\xb5\xe8"\xc4\xff\xd9\xd8\x1eF\xae\xda \xe1G\xe1l\x98|2?$\xb3\xf5\xfbyBw\xd6F\xb0\xfc\x81\xdbI\x17fc\xfeQ\xe9p\x01M\xc5\xdd\x94\x0c\xbc\xfe\x9c\nk\xe3\xdb\xd6\xd5\xdf\xb7\xad\x1d\xfc\xd2g\x04\xac\x94\xfa3\xa31\x916\xb12\xa0Y@V7\xc9\xe7\xce\x8c\xdc\xdd\xa2\x15\xc9\xf0\x90PUYn*\x937)=`\'&\xc3@b\x86?9\xd3\x98\x0e\xd0\xd57\xfa)\x16.\x02\x0bt\xc1\xac\xd3\x05\\\x9c\xaa\x8b\xbf\x91Wi+b#\xb8\xf1\xd5!\x95;\xa4D\xd1c\x92Q\xa7ai8cs`\x14 \xae\x8d\x1ff\x18Q\x94zK\xb1\x1c\xc2\x87\xde\x85\xd4v6\xf2c"9X2o\xa6\xa3\xb8\xac-\x1a\xf2\x01\xa6\x86\x80\xcc\xda\xb9\xfdH\xc1%\xa5\xb2Em\x08\x83\x8e\r\x06!\x99\x81\xf1\xcf\xce~Z6\xd3\x14\xf5\xc5\x8f\xa7L# \x80\xb8\xd2\xd4@V\x8a\x0emj\xd0\xb5\x88\xd34\x86\xa5yPJy\xf3\xde\x8fB\x812*e6\x8bqU\x04\x1dZ\x91\xcc(\xa4[\xd2\x9f\x84~\xd4\x996\xfc\x93\xdc\x95Xv\xde\x00\x9cu\\\xc7\x9a\xdd)\xdc\xa6\x04^e\xfao\x06\x8b\xd1@?\x0e\xf1\xb4\x08\x1a\xed\xa1X-\xe8\x00|Uj\x9e\x83iD\xf7l\x88\xd7X\x8c7\x0e\xc8\xf9\xa1jWUK\x97~\xe8q\xe1\xc0\x8c\xd4\x1e\xf7+\xe7\x8d\xce\xc7&6\x94\xb0K\xc7\x8eX\x02i\xa4\x84T1\xe0`hu\x08\x06\xa4\xfcy\xe2\xe2|\xa9\x8c%K\x11\t\xd2W\xe1\xa5B0\xc5i\x06\x0e\x9f\x97_\xa5\xa0*\xbc\xbaN\xa9@\xef\x85\xa8\xdb/\x11\xad\x91Y\xaa\xf1\xc0!F\t?\'u5\xa0\x9e\xd2\xa9\xf7\x96\x8a\xe6]e;\xf0\x9c\xb9\xc5C\xb6}\xf6z\xdes\xddlyk\xe1xk\x12\x14\xaa\xbf\x00\x95\xef\x10\x105\\d=\xf5\xea\xffq\x01\xe2\xfeV\x95\x8d\xfa+`\xf6\xa0\x10\x9b\xd6\xa1U\x17\xf3\xf67\xed\xfb\x99m\x1d\x97\x82\xf5K\x0fa\x04\xcb\xd7\x052\xc3\x05\xdc~\x06\xd8\x14.\x02\x13\xe3\x9f\xe4F\xea\x89K\x96\xa2\x12j\x81~E4\xc8\xd8\xdf\x08M<3#D>Q\xc2D\xf6H6\x82\xd0\xe6\xa9\x82\xb4\xf68\xda\xd6\xc9jM\xa9\xd3K\x0f\xea\x02K\t\x88\xc2\x971\xb7\xde_\xe7\xa1\xaa\xdaC\xd8Z\x9e@\xd1\xced`dBg\x90\x12\x1f\xdf\x0f\xfb?[\xcdt\xbf3B\x16\xdc\xceR\x8f\xe3\xc6\x91\xd1"Q\xd6\xa3\xde\xbc\xbe5\xc6\x94Db\xd4@\x87\xfd\xa4\xb1\xac\x98\xb3/\nc%}\xf1\x13c\x88\x8e\x99~\x17\xcd\xaa\xb0~(\x1f\xf1"\xeb\xfb\x13\xed\xd9\xcd%*\xb0$\xcbT\x8d\xeeh\x07n\xebl*\x9a\tW\xc5\x9db\xcf\xa1\xe6\x95\xa6\xc7hP9\x97TN\xb6I\xf4\xf2\x85\\,\xf3\x05}\xc9=\xa76\xa7Z9\x8a\x1cI\xa1S}3\xc18\xd8\x02M`\xf3\xe3,\x83\x03\xc3\xb3/\xb4\x90\xeb\xb4\x1b\x0b\x9fD\xb3\xe0g\x08\xd3K\xec\x1a\x87G\xcb\xac|\xef\xb6\x99\xad\x8f\xe6\xee2x\x88\x9f\x91\xfb\xa7)\x90\xef\xcaZ\xde\xf8@e\x85R5\xec\xf9\xa4\x90E-\xbcm\x16\x1b\x9c{#\x88\xe3@\xb8\xfd\xaa\xd5\xfb\xfe\xac\xae(\xba9\xbd\xcd\xa2\xf4\x1f\x02m\xe1\x1e\x94\x80Q\x88\xde\xc3\x99U\x12\x9ac\x8a\x11.\xc6,#w\xf3ht%*\xea\x82\x03\x8e\x92\xa0$\xf96\x8e\xf0P\xff]\x1a\xe5\xe4Th\'\xd5\xee\n\xdc\x06|;;\x08\xae<\x02\xdf,&\x1fRQ\x96k\xea[\xd9\xf5\xe4#\xd4!\x15<wq\x08\x84/\xdbZ\xb9:"t1H]\x89\x06\xb0\x00\x05\xfe\xd6F\xdb\x97ou\x11\x03\'aL\x8c\xc6\xb0Q\x979"\xe8\x80\xfaX\xab\xffT\x0e1=\xf5\x1e\x8b\xe3Y\xb7\x8dY\xff\x82\xa7{\x8b\xa6KA\xab\xd1E\xc9%\xd8Z\xcax\xdd\xe8,r\xa4\xd8\xc1\x8a\xb9y\xd3v\xea+x"3\x85\xd1\xf0*f\xd3\xcc\xc4\x0e\xc3\xa1\x1d\xa3\x7f|\x01\x02A\xc3O\xb5\x82\xc8\x83\x9e\x06\x88\x85!0~\xeb|G,\xa0e\xd6r\xf3\x02oD\x8c\xc3\xf15wh\x85\xe3\xb4\'W\x87\xeb\x07t\xafy\xdc(\xa9P28\xa2\x14\xf0v{\x9a\xca\xde0Msj\xebAZ)66U\n\xaa\x07\xef\xfc\x12\x0byO\xeb\xfa\xdd\xdf\xc2j\x14\xf4/\xac\xfd\x9b\xd1\x83,\xad\xbb\x85`\x06\x12\x0eq\x97\x13\x86\x8d\xbb\xe0B\xba\x14\x7f\x9er1\xff\xee\x8d\xd3\xb2\xd4\x16D\x92n\xa7\x85\xf3V\xd3\xcb\xd6\x07\x17\xb1fC\x0e\x08g/\xae\x04\x95\x86\xe9\xf8\xe1\xf9S,\xb0\xa7e\xce\xe7\xbe\xca\xbf\xd9\x00\xbe\xebl\xd18\xf8\x81\x0b\xc2P\xa7\xff\xde\xe3F\xb5\xcbd@\xc0Hk\xc6\x82?\xcb\x18\xd2\xac\x9a\xc9*\x03- \x1a\xdb\xfa\xb0g2\x92v;\x8c\xd4%6\xbd\xbb\xc9\xa2T8-\x9b\xfar\x98wS\x8c0\xd4"R_\x17\xf2=K\x9a\x9aE\xb0"\x1c\xab\xc3\xc1\x89\xce\x96A\x1d4YD\xc5h#`\xb0\xca\xce"}\x82)7+\x01O\xf9\xf19*\x9e|\x93\x05\xa9\xb3\x9d\xbc@F\xa1ns\x9cl\xa2\x00\x0e\xb3r0\x1c4#\xb1\x9ek\x87\xa6\x0c\xf7-\x9c?\xaa]x\xb4W\x13\xf9b\xd7\xb9\xb3\x06\xfeV\xb6\x90w\x83\\\xce\xde\x8d\xf8\xf3\x93\xc1ir\xa3\x07u\xf5\x9f\xf8\xb0\xfb!ru\x07}R"\xb5\xb0S\xb1GG\x96`b`\xc2\xb9\x84tw\xf4\xd6!C\x86\xec\x9b\x97\\\xe2\xf8<\x1b\x06)\x05M\xf3\x81\xba\xcd\xbf;\xbe\x1d\xc0G\xb2\x06I\x10\xe6V\xee\x0f.E\x8bx\xc1mZ\xda\xae\x13\xca\x95Y\xb5QWC\xa3y<\nD_\n,k\xa0\\\xd1\xa7\xa4\xa0\xb5\x8a.\xf7R\x1f\xbf\x1ei-\x12\x82\xdb\x84Mn9\xa6\x9e{:t\xf4\xf3\xa9\xb8\xa5Hf\xb3\x02\xd9J+\xd3\x01\\\xd3a\xc9\xd5M:\x1d\x9cEs\x1di\x85\r\x9f\xa8\xbb\xc9E\xcd\xa9\xe5\x87(\x98\x0e\x10\x9fS\xc2\xdf!hk\xd01d\x96\x84/"\xef)\xd9Nx\x18r\xc9\x19\x99\x0e\xb5A\xa1}6\x97\xcc\x98\xac\xb3\xf2s|\xf3\xf1f\xd7\x98#2\x07\xdcz\x9c\xb0\x1cs\xc6\xc9\x05\xcb\xb0\xf1\xe3D\xc26\xb8\x17P\\\xce\xb3H\x85c\xd4\xe6\xea5\xf2v\xcb\xe9\xb8\x85\xedv\x00\x1d\xd7\xa2#!V38\xcceZd\x8a7\x97\xb8S-\xf8\\\x11\xbc\xc1\xf0\xc9\xa5\xb1/\xf5W\x92\x9c\x17^\x92y%\xa77\x9f-o}\xa8!\x8f\xbfA\xdc\xa7.\x00\x88\r\xdf\xb8_ \xaeS\x1e\x84\x07\x7f\x14\xcd{/\x1arD\xc7l\xce\xc4]\xab\x02Y]N\xc6\xbf\xbf\n\x9a9G\x0e\x05\x8b\xd3=\xef\x9e\xf8\xc5\xc1\xbd\xe5\x95\xda\x00\xe5k\x80J&\xe0\xf3=D\xfa<\xe6\x90\xb4(\xb9\xd4\x12>\xdfW\x19{pD\x9b\xc3\xeb`\xe8Fp\x01\xa5(L\xf1\xe3\xa1\xe8OA>\xc4@\xf2\x81\x85\rnL\x16\xea2\x15g\xfc\x96\xdb\x81\xc37\x0e\xcd\x8d\x9c\xe4\xe0I\x15!\xf3\x92N\x1d\x04\xd9\x96\xaeh\xa8vA\x14,\xc4\x15\xdem\xdb8n\xbfCU\x83\x9b*\x11iEn6\x8f2Ba*[\x8d\xab\xfb\xe5\x00\xba\x0c~=3v\x13\x87eji:$\x95\x11b\xd0!>-LC \x11\xeb\x10T\x1b\xe8/\n0xD\x87\xd1\x19S\xb5\x17L\xc0\xe2\xff\xa3\x17\xccP8\x17\xa6\xeao\xd2\x8d\x10}cS\x862\xf2\xb2\xc7\xec97\x91\xbe\xf8\xaf!%.\xc87oz\xb1MN\xcf\x82o|6\xef\xd8\xf0j\xfb\xe3*\xbe\xaa\xe1\xa2\x04\x08\xfa\x1f\xfe\x189\xf1\x03Q\xa7\xde\x0b\xc8[\xea\xd1\xce\xb1\xd4\xcf\xbd\x83 \xcd"3g\x93H:T\xebBE\xcb\x0b\x0c0\xd3\r)S\x93X\x0cb\xb3\xe5\xae5\xe1\xe0\x82\xa8\xa4\xa1\x1cc\x02\xb7=\x99(\xa8\xa2\xf6\x94\xe1$\x06\xb4\xc4\xec\xb0d\xbd\x94\xc2B\x11\x055-\xb2\x02\xc2\xbe)h95y{G\n\xd6\x9d\x92CnE\x98Z\xd0\x98u\xb8\x7f\x18\x86\x1a#r\xacY8\xc2\xea\\%I\xfa\xb4x\xc9\xe2\x9eC\xe3\xe5\x8d}W\x98\xf1\x16\xcf\x98@\reWpL\xaa\xc8\x9f\x8eM\xce\xa6\x81\xd7\x13f\xc4\x9dq\x97\x82VN\xb3\xf3V@J\x0c\x94\xd6\x96$\xe4\xd70Y\xa3\x82<\xf7\x06\xac\x1eN\x8a\x81\xef)>\xc1Y,_\xd4\xdd\xd8\x1ac\xd7;\x7f\x98\xf7x\xfc3\xa2\xf6\x84/B2\x06\x07\xb5\x7f\xc6\xa3\xf4jH\xc7\xfd\x8a\xc7\xc3\x8fy\xbfU\xceK\r\x1eU\x03J\x8e D\xf1F\x97\xf1\xd1Re\xde\x00\x95\xdb\xd9\x7f\xe4GWlk\xaf\xe3\xefjA%[\x85\x89\xdf~\x03;\xae\xd0\r\xb9\x01S\xe9Z0\\\xb1\xaac\xf9{{\xea%\x0bqL\x17\x93\x19 \xc9\xe3\n\x04eM0\xdbb\x9bN\xb5\x88i\x15c\xfa\xc7\x16r>\xd9\x9b\xe5;\x9c\xf2 \x87=%4\xc8\xc3\xd2}\x02\x1f\x13U\xc2\x07y\xfd\xe2\xb3%\xe8\xa5\xc0\xde\xaf;\xfdR\xca)\x88%\xb1\xb8u\xab\x8d\xc0\xb0\xdd_\x16\x8fs\xb9\xe9\xa4\x93\xa6\x1bY\x97\x9a\xdf9\xd6\xcf\x8e`~\x0b\x9eh\xa4\xfb\xbc\x8bt5Q\xc8d\x99\xe9\x0b\xab\x02\x81\xca\x85\xfe\x12EF\x0fA,\x0b\x983y\x9c\x8c\xd0\xe3\xa6\xa2\x19\x99\xb7F\x0c\xcdbYXmF\xea\xee\x01\x94\xbe5\xbb2\x90\xa0\xd3{\xeeF\x1a,,\xfb\xe9J@46\xb7\x80jG-\x18+\x07\x04\tE,\xb9\xa2u\t\xbd\x1d |\x8e]r\xcd\xf1\xa0\x9a\xdd\xdf\xe8\x07\x1c\xd6\xf1\xa9#i\xa41\x1a%\xba\xc8\xcc\xb0\x1e\xb4(2\x9f\xa3\x1c\x8cx-F\x81\xfb\x8c\x12\x87P\x19*\xb2\xc5\xed\x9f\xd3y!$\x8e\x93e\xfbM\xd0f\x9a\xa7\x92\x88\xbd\xa1w\x9a\xc44RR\xc7\xce\xf5\xf8\x9a\xfa\x96\x9f\xc5Zm\x0efa\xb0;\x04\x19\xf5\r\xfcK\x05\xad\xa1"T>]~\x7fX,\x90[\xc5\x8f`\x85\x07p\x1a,z\x8b\xb2\x8b\x15\x7f\xf6\xe6oF\x9ax\x12\xaf\xc3\x11B#4\x96\xa6\xf5@\xff\xec\x99~\x13}v\x11\xbe\x1c @[\x98\x89)2\xd3\xea\xbd~\xec\xea\xc2\x9c\xd0sk\xa6\xc6+\xc7\x81\xb6u:!~1\xdau\x81\x03\xb5\x99\x070$]\xecE\xe8F\xa3\xd1\xc7\x18\xe5(\xd0\xbc\xfbf\xd7\x0e\x13\xf9c\xa1\x14\xf8v\xe5H\xda\xdd\xc0\xcb)/Pe@V2P\xaa\xdb\xd1\xda4\xea\xe3\xf6[\xe5\x8b\xb4At"\xe7\xff~\xa6gb\x01^\xb2\xc0\xeb\xed\xd8\xdc\xe34\xa1\x83\xbc\x8c&\xd5o~\x1e\x1eCp\x15\xd0V\x13\xd6"X\x9d\'\x97\xf5\xbe\x9dl\xe6\r\xd0\x9c\xd6\xf4\x17\xcbA\x85D}\x9a\xce\x9e\xd8\xb4\xf2\xc3\xec\xd1\xbb}\xeb3C\xec\xbeb\x04&!o\x1e\xce\xec2\xe4`\xecs>\xbb\xfd\x8e(\xb2\xe6\x84\x04a\xc6(\xa7\x9c\xa4\xd5\x06\xda\x9e\xd2\xc4\x9c\xab\xc5&\xe9&\xc0\x84\xd1g$\xae\xad\x1a\xcf\x16oD\xe2\xd9|Amn\xa0\xf2w\x03\x7fM\x1c\xf1\x10\x0c\x13\xe5/\xa1\xd4%\x02l5\xfd\'S\x0f\x17#E\xd4\xb6\x00w,\xa8nq-v\xc0\x1f\x0f\xbc8\x98+\x06\'\x1e\xee/>\xf1\x93}K\x18?\x98\xd0i\x01/N\x1e\xd7\xc0\x1e\xa2T\x07\x88-QW\x9f\xc9\xdfY\x10BQJ@\xb1s^\xa1\x8bMI\xf4\x16\x0b\xa1\xdb\x9c\xd7\xb0o \xc0p\x1b\n\x1e\xa8d\xc2\xdd\x92\xc5/\x0f\x92\x1b\xf1xl\x98\xafu5\x1c\x0e@aOO\x04\xd0\x82\x9f\x92\x7f\xa4\xcd\x1e\xe1\xe4p\xc5N\xa7jp\\\xa4\x80\x18\x15\x0f\xcaA\x00i\x19B\xb6\xc0\x8f\xfe\xe9\x1bz\xed\xfeNK\x94\t\xd8x\xb7Q&p*4\x9a\xd0W\x9e\x83E\xd5IAD">K\xf3\xdd\xc3\x9fb\xe0c\xfc]\x84.\x7f\xa6R^\x9d9\xcb<\xddHB\xa0\n\xdb\xe8\xa7E\xc7O\n\xeeohy\x0bm\x04\xa6\xb4\x7f\xaa&\x90\x02\xeb\xb5\xc2\xea\x1c\x8a\x9e\xfc\x8f\xdb\x8c\xe3;\xbc\xff,@61\xbaXA\xb4\xdc\x83\x01\x86\xe4[S\xe3B,\x13\xcc\x01\xad\x85\xf4`\xde\xd7\x1ar\x08\x1b\xf4\xfb\xf5\xa9\xa6B\t\xa4cm\xbf\xc4\xe5S\\\xf3!z\xe6m\xb1\xc1>N,1\x93\xce\xb4\xa1f\xc6h\x92l\xba\xc2\xfe\x1c\r/_\xc4#q\xf4\xbe\x8f\xa8"\x0ey\x9f\x0e\xf2\x94\xd5\x12\xac\x8d\xff%\x115\xcf\x15\xe8T9\xbe\x9em[Y\xd3\x16\xf5\xab/\xf1D\x0f \xaf\xed\xf4\xf7\xa37\xb4\xc1\xcd\xf5\xa3\xa3R\xf1!\xa3Y\xcb\x07\t/\xfd\xd6\x9a\xc1\xf4uzi\xd5\xcc`\xcd\xe3f\xc1\xee.\xc1\xa2\xd1\x8e\xeb)\x01fl\xe7\xc4b>\xcfL\x16\x0b`\x88sys\x1c\xfc\xae\x83\xe6\xde=\xd5\xef\xfb\xcan_\xc2\xb1\xc2y\xa8\xcc8iw\xb0\xe1O\xc1hU\x03\xac\x05,~\xa24H\xe8Y w\xe6\xdb\x7f\xac^"(7\xd78\x82\xf3\x15oz$\x88>\xa2\x9a\xb3\xe3R\x06\x01=\xc2\xe1\xcaQ\\LB\xf2\x8cv\x04\x06\xf1\xa7oz\xb7\x8c\xd1QJ\xd2\xa3\x15\x8e\x947~\x03\xc2"MN2H]\xc5{\x99\x94\xd2\xff\xfa+\xd7y\xaf\xde#\xef\x84\xfc\xba\xe8\xed\xdf\xc6wU\xb2\xbd\x12"\xdf>\xdfJ\x07\xfc\x96\xbe\xaa\xcd\xd3\xb7b\xdd\x19\x02\xb8\x9c\xb8\t\rD\x82\x8c\xa2\xd1b\xd0\xb43\xbeL\xbb\'\x1eo?\xe1\xe41\xf2\xca\xfa\xd0\xa55\xf3\x95\xd0\x95\x8eCD\x0fu\x8b\xfe\x1e\xfaBt\x8c,\xf36EE\x84@!\x98ZO\xc7T\x96\xff\x1cT!9L\xfas\x07\'\xb2\x83\xdf\x91\xc3\x01\xa3\xa1\r\xf7^\xd7\xd8v\xdb\xd21\x06\xf7Zn\x18*9\x1d\x0c\x95\xa4\xee\xed\xb5\xf9`A\x13\xb0D59Q\xe0\x98_\xb5\x0b\x04\xcb\xb2\x10bQ\xb2\xfd\x97\x82\xfe\xed\x03Mr\x02\x1de\xd9\x11\xb3\x91\xac\x19\xfe\xb5E\x0c\x9f\xac\x17\xa9\xf3\xe4m\xbfd\xab"W\xa1Y\xd8kN\xc8\xc76\xc1\xa9\xc8\xc8\xfd\x03-\xca_\x9fn\xc6\x91\xe0\xa8\xee\x17\xeai5\x10\x0e\x93\xe9N\xf9D\xb9]\xeb\x06r\x96\xd91-\x0eBAmn\x8b\xdb\xa95\xbf\xa38x4YB\xb1\x91\x14B\x01\x1d\x0e\xea.\x17\xd5\xb1\xf8\xfd rF\xa4\x99t8\xb5\xa1@\xbaO\xa1\x1b\xe1c\xdc1\xd6;h\xf0\x02n1BiE\x1c\xfb\xdbA\x0c\xdeW\xe9Z\xa9\xae\xa2\xbb\xfc\x95\x1a1\xe5\\\x15\xb3\xe2K\x154\x18\xac4\xce\x85\x92\x05v\x13\xde\xa7A\xbaW\xf0\x1e\xdb\x16k\xeb\x93\x8d\x83k\x04\x89u+\xf5\xf1\x16K\x1fJ\xe0\x92^\x80Q\x12\xea\x05\n\x9bS[\t\xeat0\xcf\xf9o\x00\x00\xd1\xb3\x0b\x1c\xb6y\x82\x1b\xbe\xcf\x1e\np\'~*\x9a\xc9\xea[\x81\xfe\xb3=50\x07WhYo\xdf\xe2\xa3.\xa34\xc6\x9b\xf5W\x88\xd7\xce\nW\xf4\xab\xd0\x1b\xd1\xce\x13WX\'\xe0\x003\x17\x98\xdb,4\x13\xae\x7fd\x8d\xea]\xe8\xfb\xaa\xf7\x19!\xb3_\x81l\x18\xe2Z\xce\x81|\x086\xb8\n\xd7|\xa6\x0c\xdf\x00@\xd3E\\\xd5\x19\xc6\x19\xd5\x04^\xf1a\xbf\x1a\x06\xb9\x0b\x1f,"\xaaZ\xe4\xf4\x9f\xd5\xcbRP\xb1P5cx\xf1\x1b\x10\x0c\x12F\xd5\xb9\xb7f\xf0r]\xd8\x0c\xafy\xd5\xfb\x92ba\xd8b}\xcc,\xc8"\xce\x98V\x02\xfd\xd4\x97CJi\xe2\xd3<IZW\x7f\xf0\xbbu?\xc2\xac3\xfb;Fv\x91\xbf!\xe1\n\xc3o3\xc4\x8d\xea\xd5-\x9c\x9bZJ\xf80\xec\xbe\xb5;\x80U\x80U\x9a\xfc>7p\xf1\xaa\xb5\xa2\xe7\xc7p[\xcc\xcd@\xfe\x8d\x7f\xebR\x8b\xb0\x1dK\xe7d\x0e\xe3VF\x19(\xe0\xdb"\x99_\x16n8\xaf\xccx\xbal\x8d$v\xa8\x08\xb6!a\x0e\xdei\x9a\x84\xd16\xf2\xf8*i\xbd\xee\x80\xcd\xd2\xefT\x82\xcci\xc2\xa5\xb4\xb5\xbcI#\xf7\xf4\xd0\x83\xc6\xb3f;\x1e$%u\x80\xa1\x07\xf0\x9e\x93]\nq\xb6 f\xad\x8f\xfc\x87\x0c\x9a\xd0b\x1e\xa9\x9c\xe5k\xfa\xda\x84x\xb7\xa4\x083\xb61\xc4L\x97\xbe\x82\xc8K-}\xa6\xd8Z\xcc\x88\x9c\xb1\xfe"\x05\xdc~X}[\'\x10\x91~\x1b]\xa1*\x85\xf0\xa1\x86@(n\xc9P\x9f/\xbf\xd7T=[r\x16H\x81v&"g\x82A\x00L}x\x9c\x9e\x16\xf5\\+\xf18\n\xb3\x9c=\xbf\x82\x0e;\x87\xefm\xfd\xb0\xfa\x19\xbc\x97\xdc7\xaa p\xe8\n|\xb0\x88L\xbe\xcdg)\xce\xbf\xb7\xc3\xf0\x13\xb9\xd3\x9d\xca\xc4\xf4\n\x9f\x83\xbfA\xb3y\xef\xb1\xa9\x7fX:+\xf6\x9e\x9c\xb0y*\xf8)\xadC\xc7\xb9y9\x0e\xa3uyk\x1ba\xe0\xcb\x13\xa2\x04\xddB\xecDU\xa9@\xde%8\xa2\x94\xda\xb2\xe8.\x00.(\xc6\xaf\x0c\x17Atw\x02\xaf\xbb\x00zo\xd3\xbcO\xacx\x8bU\xdbD\x94\xe0=\xec4T>\xe0\xda1\x16:_\x81a\x0e\'\xd6\xd8\xbc\x89\x80\xa1\x13\xd6\xa0\'\xd4/pFu\xdbyBc;\x96V\x0f+(\x9a\xcd\x9d\xca\x93\xb8\xe7\x1d\xde\xf5r\x15\x91\x93\x0b]\x8a0\x9e\xb9\n\xe9\xe9\xc4\xb9B:\xd2))\xd0\xac[\x91~l\xa7\xe6\x99\xed\x19\xcc\t\xc1~\xb4A\xef\x98\xd7\x80\xcd\xd1\x9b\xf3\x18\xe9\xc1\xf6\xf2Y%P\xad\xae\xd8\x94a\xe8\xc5\xbf\xb5k/\xa3PY\xa9)\\\xc0\x98\tY\xc5\xe5v\xf1\xc0;\xf2\xd6\x9b\x88\x18\x14\xb2\x8c\xa9h\xc6D\x92\xd3o\x05\x19\xf6\x88Oc:\xfe\x08\xfb\xc3\xb3%Y\xa6\x8a\xeco\xd2\xf6g\x9d\x7f\xfbt\xa6\xb1\xde^#\xb1\xd5\xbb\xbb\xb6z\xb2F?\xe9r\xf4\xef\xb5}w\xfe\xd5\xb9,\x1dlyMV\xf2\x03%q\xd0\xa1\x17=c\xd6\xaa\xba3\xec\x95\xe6\x8c\xab>{\xe7\x95{K9\rz\xe0\xcd\xfdl\r\xcf\x0e;\xd0\xf2R\xa1&\x1f\xb7./\x0e\xb5y\xcc\xc4\xb6\x8d\x91\xc7N\x98\\\xbe_\x0b\x8aT\x97\x08\x83(\x8en&\xcdo(\xd6 \x17\xda\xeffW\x13X\xc1\x8e\xc2\x01\xa1\x9b\x04\xe1\x8c3\x1d\xf7\x87\xa3\xcc\xf0\x85B5\x11\xd6L\xac\x17!\xbb\xaa\x96\xc4\x80\x1e#l7\xe37U\x8e\xd4ru\xf4\xe3o\xa2;|\x1d\xba\xb5\x11ZI%N\x19\x0f\xc4\xf5[\xe5\xef\xf6\xe0a\x13\xbc6\x86\xda\xbc\x0e\t\xae\xd6\xab\x1ee\xe7\xa5H\xb4/6*2(\x04\xfb\x1bfM\x15O%#SX\xc1\x0f\xa1A\x89\xd1\xde\xbcZ\x1f2dcTF\xbc\xd0/\x0ev\xe1G>\xc6\xa1\xfbi\xfa\x90}\x9c;u\xb28\xf97>R\xc7\xc2\x8e+d\xa2\xbe:\xd7\xd9\xe0eo\xfa|0\x16\xbf@\xda\xa4~\xf7^\xc3\x89l\x92\xaf/\xe6\xe8\xde\x05\x1c.Q ?\x1e`\xdbsAs~\x06\xe7N<\x17"\xd1\x8f\x8fZ\xde\x06\xc7\x7f\x92\\\x98\x82&\xc7$\xda\x07\xe5x\xa6.\x8b4\xb1\xabd\x08W\'T\xb6\xdd\xaa{\xca8\\nT\xb8\x0e/\xd6e\xc6-\x0e\xe8\xa8i\xb2\xeb2\xc5\xbb?;\xf6\x08\x82\xf3 )\\\x87J4c\xcb\x08D\xa9(\x83)9\x96\xaeh\xea\xa7\xf9\x92+r\xec+\xbe/\x0e\xd2B\x9fJ\x8d}\xb5o\xeb)J\x1a&\x89\x806\x04R\xf4Vn\xd9\x99`\x89\xcd@G\xab-\x1cM3\x88\xea\xef\x83~\xe3\x84\xfc\xf9\xc64\xfb0\xbcpR\xe7%\xd6\xa9V_\x0eW\x87\xac\x07\x00\xa1\xff\xdd%\xbb6\x80\x90K%\x0f\xdeV\xb4I\xb4\xffb\x9a\xc6|r\xf4u(\xf2((\xd4P.\xa9\xb2\x01\x1c%\xe2>\x1ehA\x8d&D7\x9d\xa6\xb3\xb9$e}\xe4bC7\xf6^tY\x05\xb6\x1e\xc4\xf4\x1a\'D\xe3\xe8Q\xedbJ\x8c\xf4\xf2\xf6\xb4\x05\x10\x19\xba\x037\xc5\xee\xef\x9d\x15\xe3<\xd9\xcc\x90h>\x8bn\xaf\x97\xf8\xe04\xf1\xd7/N\xaf\x8a\xedL\x1e\xb3\x03\xc2|\xcf\xe0\xee\xc6{\x9a2P\xbe\x08\xaau\xbeJk\xc4\xd3l\xc5\xa9\xc4\xd9\x89G\x98)\xbe\xc7\xed\x83\xf9\xe3\x02>\x1bYi,0\xf1}\x8d(71\x1d\xefM\xe6\x8d\xa1?5x<\xc7\x92\x1d\xab\x17\x01\xc0n\xbd\xda\xfb\x97\x00\xb4?)\x07du\xe5\xcbTx\xe7#\x02\xb0\xa4\xb4\xefY\xe1\x12!/N\x8d\x8bVb\x18x.\xc3`\x8eU\xb8J\x93\x0f ,\xfb\x11\xa5\x1f\xa5\\4\xca\x8a\r\xed\x81>\x08\xa3\xfa\xf8{\x12u{\xe5%zR\xb7\x86IY\xedw\xf9\xc7\xa2\xf8U\xc0\xbf\xa6\xf7\xfe\xc3\xe2\xc1\xcb\xa9gM\x04~\x95Sb {\xd0_g\x06Ve\xccKw\xe9\xee\xf7\x0b\xb3\x95\xfc/\xfdU:\xce\xab\xba\x06\x8d\x1c\x8c\xeb\x00k\xf4Z\x87\x0f\xbf)\x15\x0bo`DWG\xf0]nY\x1f\xa5\xb3\x94f\xbf\x19Dj\x7f;\x81-T\x94%pY\xc7\xb9\x9c]l\x0e\xd2\x11?\xd6y\xe0\x9c\x86\x17\xab\x1dp\xd1@\xb2\xd1\t\xbb\xa3\xc9\x84\x81\x99\xb4\xc2\x9a\tE\x05p\x86\xed\xc8B\xef\x9eL\x84\xfa\xc2\xc8\x88A4\xfc\xd3\xea\xf3\xd3w\x02\'#\xcc\x1c$6\xea\x1c\xf3\r\x84v\xb1\xbb\x0b\x00\x95|$\xd11&?\x9d\xfe|\x9f\xd4\xd9\xde\xd3\xb8\x99Q\xb5\xd3\xa2\x1dG\x83\x8e\x92\\\xaa*\xd4\xa2\xf6\xf7F\x80x\x13\x98\x9b\x04\xa5i\n\x07\xfbx\xd2Z\x8c\xa7%u\xeaDUD\xb0\\N\xcc\x00\xbb&8\x93\xcd7\xd1\xaa\xbd?SU\x0c$b\xf1:\x1a \n;\xf0\x8fO.\x80\x1f\xfa \x03G qQ}?mT$\x16\x90\xd7^-\xa1k\xf5F\xa7\x0en\xaa\xc5\x99p\xe1:\xdb9POsqY4\xa8\x0c\xdd\xe5\xebs\xd5\x03\xee\xbe\xab\xd51\xe9:\xbab\xc7:\x06\xfbK\xa1\xb2\x17MIk\x91|#\xd1~\x04\x05\xf6G\xbep\x90\xa1\xd0#5\x8f\xf5\xbd\xc1\xa2\xddtr\xe0J/EX\xf8\xbal\r\x8d\xa8\xa0\xa9\xd0\xee\xae\xe8M\x17\xb9\n\x9b\xcb\x10\x12\x1f5}\xdc=\x84K\x14\xd6\x1d\xd0j\x90z\xc4;\x91\x84\xdc;\xb8\xf1\xca\x15qZn\\\xcaz\xb1\x89\xdeeJp_\xbb_\xcc^\xc8\t\x07:}\xf5\x065y\xc8\xeb\xdb\xa9\xed\x1b\xd1$\x1a#h6\xa3\r\x1ac1\x04\xef\xf8\x8bl\xc3\xdb\xbe\xbb\xdar>\r>>#\xad\x16\xfa]}\xb0^\x86\xbd\x93h\x9eQ\x9a\xe1|]\xa5\x8eX\x99.\x04\xf7\x85m5\xab\x82\xcf\xe0V\xcf\xd7\xc2{\xfb\xfb\x07\x02\x80\x83)(\xb06{*\x8a\xb3\\\xf1j\xfa\x1e\xbb\xc9\xc8+\xa8\x87\x00\xf6V\xa1\x1a\xd3)\xc1s`\xc3\xd0(\xf8g\xea\xd3\xa5\x9e\xd3s\x0co\t\x89\x1f\xd1\xfd\xcc\xc2\xda\x85\xd0\xa994\xa5\xe5\x16Y\xbb\x80\x0b;e\x81\xa0\xe5\\\xf0\xcci\x82\t\xbc\x9dJ(T\x8e\x05\x19\x06\xb0\xc2\x99\xb1\xf6Y\x8f\xbb]\xc0L\x81\xd9\xff>\xd7\xf5p\xe2\x9f\x14\x9b?\x0e\xbc\xcd\x9b\xa6\xb3 mD\xc4]X\xf0\xd4j\x0cl1\xcb\xa6\x13m\xed\xa4\x91U8F4\x92R\xb7\x9fX*\xb4\xef=5\xca\x81|\x9b\x85w\xba\xe6\xe4\xf2\x0e\x16\xc3n\xfe\xff\xf0\x84\xd52\xa2e\xdeZ\\\xd5)F\x8e\xc2\xc5\xa7\xa2\xcd\xd9B\xa2b\xefh\x95\xbd=X*f\xe8\xf5\xd2\xbf&Z\x19\x89I)=\xbb\xe9An\xac\n\xe9\xdf,b\'VM\xf8\x98\xfd\x80h\x1f \x19m<\x7f\r\x06\xa3\x96\xa9\x01\x1b\'1uc\x93;\xfe\xe3\xd3J~\xb8\xdf\xa7\xd5n\xbdk\x87\x18\x81\x10\x1c7*\xab\x0fm\xd2\xb5\xcc/\x11FX\x8f\xea\xaclH\x98\xdb\xd3\x03e}\xec\xa5`@`l\xfc\\l\x02\x8e^\xcd\x85+\x19bF\xb0[g\xef\xda}\x19\x0f\xc18\xdc\'\xe1\x1f\n\xe5\x1c*\x1b\x02\xd8\xfa\xc6\xbe>\xbb\xbe|pX\xe4\xf8\xe4\xd4?F-\x98\x98\xc8\x8d+K\x8c\x8e\xeb\x92\xf0\x80~`\xc6\xbd\xd8\xf6A\xe3\xdd\n\xad9R\x1c:\x83\xa6\x10\xdb\xc9\xe3}`\xe4V\x91>H\xc7KC\xc0\x80\xeb<d\xb3\xbcfb\x81\xfb~\x19V\xd8s:\xc2Z=\x8d\\~\x0e\xf7{4\xa7PM\xb3 \x12h\xa3\xe2\xa0\xb8pj\x86\x7f6zz\xec*\x00\xf9=\xd0\xa9U\xcds\x1c\xb8\xd0\x8atB8_\xf8\xff\x08_\xeb+\xc1\xccZ\x1bf\xc3\x90\x91\xf4\xe9\xe6\x16e4a\xbd\x0e-\x83\xdf\xbbU\x15\xa6\xd3\xac~Z\xf7R\xb9\xbc\x81\xe4F\xd2pR<\xfbv6\xee\x02ql\xca\x807e\xba\xed\xdd\xde\xe8\xf3o\x16\x7f\xcd=o*h\xde\n\xb8\xb3,\xb8\xb2\xa9\xf3\xe6Ea\x0e\x85[\x85\xcf%\xe7\x9c"V\x01\xf6\xb0p\x0e\x9d\xb9\xda\xb0\xa4l_\xa3\x1f\xdc\xd5-@3ik\xf8\xdd\xa7\x9d\xbf\xd5K\x15\x16\xa3\xdc\xfbx\x9f\xc6s \xd1\xeb\xfao\xb7xC\xcfK\x10\x9eF;u#\x1b\xbb\x9bA\x91\x95\x9c\x18Z\x84\xe8\xe8 \xe4Z(vN\xd4N\xc7M\x9c\xa9X\x91O\x069z@|r0\n\x07z\xc1\x01\xcbE\x8bj<S0\xbb\t`GA\x92\x85{\x0c\x11\x02C\xe6\xbd\xbb\x10O\xfc\x00\'2\xfdQ/F\x97\xf8a\x00\xd2M^\xfd\xdfn\xe7\xbd#od\x86\x1b_~\xbb\xa8\x1c\x8a[6\x98r\xa2\xa3o\xc3\x15\xfdW#\x02\xeb>\xbc\xda\xde\xf8\xc5e41\xbcn3\xafQ\xf0\xae\x0f\xb1l\x90@\x98\xf0\xeb:\xd6\xe5I\xebjNqS\x1b\xb4\x90iOB\xbd=\x173\x88\xeen\x97G\xd3b\x15\xa1\xce\xd5\xd7\xa7H\x84\x0f\x0f~DC\xa6\x88@\xc8{\xccY>\xdbI\xe8\x11%&\x85\xa3\xbf>\xcc\xa9Y\xd2\xceD\xd9r\xc91\xcfRN\\\x04\xc7\xa6\xc1u\xbdzrRXgu\x89\xc8\x18\tr+\x14\x03\xd3&E_V\xfc$\x81\t3FWR\x7f\xa4\xba6x\'\xe7;\x13\xc5\xe1\x95m\x1c)\x07\x11\xf3\x11\xa5q\xcf\\\xdf\xaac0r;\xe9\xdd\xf02cd\xdey\x19\x89\xcf\xa1\xd9\x03\xed\x06(\xb0\x80\xea\x02z\xe5]q3\x0e\x94\xadp\x08_0wC\xc4z\xd6\xfd\xdd\xc5\xf7r({\xfa\xba\xd99\xf0\x86CT\xdd\xe1\xf9\x1b\x08\xda X\x87\xd4\x9c\xdau\xaf\xd2w\xa7(F\x07\x02\x1e\x89\xc1#y\xbe\xdd\x04\x80\x065\x9e~\x96Sr\xf2\xbei4N\x96\xc3\xb0\xa6\x9c)\x93\xa2\x06`Z9\xe2{\xc0\xe02z\xf9\xac\xfd1\x93\xfa\x15\xe5\xef\xf2\xe6\xfb\xce\xbd*W\x8e^l-N\xee\xec\x05%\xe51\x895\x86\xc1\xb3W\x04Bjw\xc8\x1d[\x0f\x8d<\x1b?\x82\r\xa9\xac\x07\xd8\x1e~\x85\xd6\x9d\xce\x18\xbc3\xee\x06J\x7f,g\xbfy3\xdb!u\x115Zq\x0fw\x91\x99M1H\xd5\x93\xec\xde?Z\xd2\x08\xa5\x1c\xfa\xa6u\xb4\x9eaw\xf7~\xd7xz\xd4\xf7S\x87-\x9c\x1a I\x8b`\x94\x08\xd8\x11,\x08\xac\xa4&\x18\xcb\x074\x9cg-+D\xbaU\xc5C"Q\x89=\xbe\xd6V\x16a\xb7\xcaS\xdf\xdb\xc5\xd1"gI\xfb\x00\x95s\x8c\xdf\xed\x0e\xdaKU\xcf\x88C1\x1e\x81\x08/\xd5\x8b\x85\x19\xb2\x8cM\xdc\xcf\xbd\x15v\x83\x022C\x82\x97\xa9n-\x12\x8f\xc9\xa7\x9b\x84\xd0\xaf\x84\xbe\xc06y\x87\xaa\x82Na\xd3\x05\x04!\x8c\xf4\xe1\xc3)\xfe\x91\xfe\xf6\x02\xde/\xfb\xc2\x8f\x05`\xa1\x00\xec\x88Ux\xce\x81b\x07\xf7\x9c\xa3\xf5&\\\xd6QgT\xea\xdc\xf4y\x81\x9e\x8b\xde:j\xe9\x8d\xa5\xf3\x12\x174\x0e\xe5b\xf1W&.\xf0\xfe\xe9\x15')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from hiddifypanel.models import *
2
+ import flask_babel,flask_babelex
3
+
4
+ # from flask_babelex import lazy_gettext as _
5
+ from flask_babelex import gettext as _
6
+ import wtforms as wtf
7
+ from flask_wtf import FlaskForm
8
+ from flask_bootstrap import SwitchField
9
+ from hiddifypanel.panel import hiddify
10
+ from flask_admin.base import expose
11
+ # from gettext import gettext as _
12
+ from wtforms.validators import Regexp,ValidationError
13
+
14
+ import re
15
+ from flask import render_template,current_app, Markup,redirect,url_for
16
+ from hiddifypanel.models import User,Domain,DomainType,StrConfig,ConfigEnum,get_hconfigs
17
+ from hiddifypanel.panel.database import db
18
+ from wtforms.fields import *
19
+
20
+ from hiddifypanel.panel.hiddify import flash
21
+ from flask_classful import FlaskView
22
+
23
+ class QuickSetup(FlaskView):
24
+
25
+ def index(self):
26
+ return render_template('quick_setup.html', lang_form=get_lang_form(), form=get_quick_setup_form(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link(),show_domain_info=True)
27
+
28
+ def post(self):
29
+ quick_form=get_quick_setup_form()
30
+ lang_form=get_lang_form()
31
+ if lang_form.lang_submit.data:
32
+ if lang_form.validate_on_submit():
33
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
34
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.admin_lang,StrConfig.child_id==0).first().value=lang_form.admin_lang.data
35
+ StrConfig.query.filter(StrConfig.key==ConfigEnum.country,StrConfig.child_id==0).first().value=lang_form.country.data
36
+ db.session.commit()
37
+
38
+ flask_babel.refresh()
39
+ flask_babelex.refresh()
40
+ # with flask_babel.force_locale(lang_form.admin_lang.data):
41
+ # flask_babel.refresh()
42
+ # flask_babelex.refresh()
43
+ flash((_('quicksetup.setlang.success')), 'success')
44
+ else:
45
+ flash((_('quicksetup.setlang.error')), 'danger')
46
+
47
+ return render_template('quick_setup.html', form=get_quick_setup_form(True),lang_form=get_lang_form(),admin_link=admin_link(),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),show_domain_info=False)
48
+
49
+ if quick_form.validate_on_submit():
50
+ sslip_dm=Domain.query.filter(Domain.domain==f'{hiddify.get_ip(4)}.sslip.io').delete()
51
+ db.session.add(Domain(domain=quick_form.domain.data.lower(),mode=DomainType.direct))
52
+ hiddify.bulk_register_configs([
53
+ {"key":ConfigEnum.telegram_enable,"value":quick_form.enable_telegram.data},
54
+ {"key":ConfigEnum.vmess_enable,"value":quick_form.enable_vmess.data},
55
+ {"key":ConfigEnum.firewall,"value":quick_form.enable_firewall.data},
56
+ {"key":ConfigEnum.block_iran_sites,"value":quick_form.block_iran_sites.data},
57
+ {"key":ConfigEnum.decoy_domain,"value":quick_form.decoy_domain.data}
58
+ ])
59
+
60
+
61
+ db.session.commit()
62
+ # hiddify.flash_config_success()
63
+ proxy_path=hconfig(ConfigEnum.proxy_path)
64
+ # uuid=User.query.first().uuid
65
+ # userlink=f"<a class='btn btn-secondary share-link' target='_blank' href='https://{quick_form.domain.data}/{proxy_path}/{uuid}/'>{_('default user link')}</a>"
66
+ # flash((_('The default user link is %(link)s. To add or edit more users, please visit users from menu.',link=userlink)),'info')
67
+
68
+ from . import Actions
69
+ action=Actions()
70
+ return action.reinstall(domain_changed=True)
71
+ else:
72
+ flash(_('config.validation-error'), 'danger')
73
+ return render_template('quick_setup.html', form=quick_form,lang_form=get_lang_form(True),ipv4=hiddify.get_ip(4),ipv6=hiddify.get_ip(6),admin_link=admin_link() ,show_domain_info=False)
74
+
75
+ def get_lang_form(empty=False):
76
+ class LangForm(FlaskForm):
77
+ admin_lang=wtf.fields.SelectField(_("config.admin_lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.admin_lang.description"),default=hconfig(ConfigEnum.admin_lang))
78
+ # lang=wtf.fields.SelectField(_("config.lang.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa"))],description=_("config.lang.description"),default=hconfig(ConfigEnum.lang))
79
+ country=wtf.fields.SelectField(_("config.country.label"),choices=[("ir",_("Iran")),("zh",_("China")),("other","Others")],description=_("config.country.description"),default=hconfig(ConfigEnum.country))
80
+ lang_submit=wtf.fields.SubmitField(_('Submit'))
81
+
82
+ return LangForm(None)if empty else LangForm()
83
+ def get_quick_setup_form(empty=False):
84
+ def get_used_domains():
85
+ configs=get_hconfigs()
86
+ domains=[]
87
+ for c in configs:
88
+ if "domain" in c:
89
+ domains.append(configs[c])
90
+ for d in Domain.query.all():
91
+ domains.append(d.domain)
92
+ return domains
93
+ class QuickSetupForm(FlaskForm):
94
+ domain_regex="^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$"
95
+
96
+ domain_validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),
97
+ validate_domain,
98
+ wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")),
99
+ wtf.validators.NoneOf([c.value.lower() for c in StrConfig.query.all() if "fakedomain" in c.key and c.key!=ConfigEnum.decoy_domain],_("config.Domain already used"))
100
+ ]
101
+ domain=wtf.fields.StringField(_("domain.domain"),domain_validators,description=_("domain.description"),render_kw={"class":"ltr", "pattern":domain_validators[0].regex.pattern,"title":domain_validators[0].message,"required":"","placeholder":"sub.domain.com"})
102
+ enable_telegram=SwitchField(_("config.telegram_enable.label"),description=_("config.telegram_enable.description"),default=hconfig(ConfigEnum.telegram_enable))
103
+ enable_firewall=SwitchField(_("config.firewall.label"),description=_("config.firewall.description"),default=hconfig(ConfigEnum.firewall))
104
+ block_iran_sites=SwitchField(_("config.block_iran_sites.label"),description=_("config.block_iran_sites.description"),default=hconfig(ConfigEnum.block_iran_sites))
105
+ enable_vmess=SwitchField(_("config.vmess_enable.label"),description=_("config.vmess_enable.description"),default=hconfig(ConfigEnum.vmess_enable))
106
+ decoy_domain=wtf.fields.StringField(_("config.decoy_domain.label"),description=_("config.decoy_domain.description"),default=hconfig(ConfigEnum.decoy_domain),validators=[wtf.validators.Regexp(domain_regex,re.IGNORECASE,_("config.Invalid domain")),hiddify.validate_domain_exist])
107
+ submit=wtf.fields.SubmitField(_('Submit'))
108
+
109
+
110
+
111
+ return QuickSetupForm(None) if empty else QuickSetupForm()
112
+
113
+ def validate_domain(form,field):
114
+ domain=field.data
115
+ dip=hiddify.get_domain_ip(domain)
116
+ if dip==None:
117
+ raise ValidationError(_("Domain can not be resolved! there is a problem in your domain"))
118
+
119
+ myip=hiddify.get_ip(4)
120
+ if dip and myip!=dip:
121
+ raise ValidationError(_("Domain (%(domain)s)-> 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,domain=domain))
122
+ def admin_link():
123
+ domains=get_panel_domains()
124
+ if len(domains):
125
+ return "https://"+domains[0].domain+hiddify.get_admin_path()
126
+ else:
127
+ return "https://"+hiddify.get_ip(4)+hiddify.get_admin_path()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
128
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product