hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
- hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,208 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00#\x1d\x00\x00\x12\t\x04\x00.\xa1\xc6\x8b\xac8\x957\xf2W\xd2]\x16\xa1\x8c\xf6\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x11\x9dR\xd44\xf2\xa0!\x7fI\x90}\x8d\xba\x07\xcd\x0b\xd5\x1d\xd7G\xc9\x7f\x98\xc6\xe9\xe7\xce\x8a\n\x08\xdf{\xc5\x04\xfc\x137;\xaa\x11\xd6\x03\xf2\x8bI\xee<pV\xaf\xfd\x0eQk+\x04\'\xc2\xe5e\r\x8d\xb1\x0e\x91\xe6\xac\x9e\x81^>\x96&\x8c\x0b\xcf\xe4\xa7\xe7\xd2\x8d\x99\x8c\xa5\x81\xd3d\x10\xa9\xb0\xa3\x83/a\x82\x9b\xe8\xa2\xd1\xb9\xcaaOAfX"\xec\x86\xe6\xd3 \x9cdG\xda\xdc\xd1Z{Xb\x98\xde\x0c\x15\xdd\xd9K\xad\xcdu\xf5%\x98h\xaejp%`?\x83\x0e\xe5.\x00\xb6\xf9\xf2F1\x97\x88\xae\xf3\x02\xd7f\xad>h\x96\xde"\xd7"x\xe8\xf2\x92\xeaUC\xc4[\xa85\xe0\x91\xd8\xc4\x83\x93\xcc\'\xee\x9c\xa6\x9bV\x04}\xb7\xc0"\xae_^\xeeZ\x82\x17\xb7\xbc\x18\xca\xc2\xa7\xb7zF\xdb4\x0f\x03\xaf\xb9\'h\xd8\xb8-T\xe77\xfe\xc1Ll\x89w\x84\x14\xd0\x93\x91VR\xde\r\x87\x90\x89d\xc6\xe2f\x0f\xd4\xb7u\xcf{a\x7f\x11\xb3;\xf4\x86\x19G\xbc$\xce\xc1\xc2\xd5\x16\xaeU?Pq\x87\xe0D>-\xd75N:\xe7\xc9\x14\x02\x9f\x9c/\xb0\x11x\xf6\xa4\x0e*R\x107\'\xaa|\x8bc\x02\x95\xa5b\xd4\x9a\xf3\xb4\xb9O\xcd\xc9\xc5\x7fR\xf54\x92#\x8a\xaca\x8bo\x89A78\xfe\x9a\xb5\xf4\x81\xc6\xa8J\x1dI\xf6U\xda\xd9g_\xe0S*-\xbe\x03\xb9\xd7j\xd5\x8f\x8e\x823\x7f\xf6\x93\xb6f\x8cp\xe8\xa3\x80\xc1^\xfe8!\x17=L\x8eX#\x8f\xb1\xb4\xa3\x86\x03\xc0\xee\x8fn\x82d}\\\x12\xcf.pq\\\xbe\x90\xa4\x7f\x85\xf7\xbf\x99A "\x97\x99C]\x84{\x0e{\xfb\xcd\xe2?Cd\xe5Hl\xe5\x0fF\xbc\xd09t\x81\xb11\xd6Z\x95^\xc3\x8c\xa7j&\x17\r\xe7\x9a\xd1\xc6\xd1\xed\x16\x0e9\x81\x18@@\x07\t\xeff}MU\x90$\xbe\x1d\x80L5\x18BZ\xf9m\x89\xb5\xd6\x85l\xd4\xd1\xea\t!?\x1c]\xf2\xd22\x91\x15\xfd\xa9>q\x16\xf3<.G\x82#\xc4F\x88\x12B,\xff\xa3\x95\xeb<\x93\xa3-\xcc\xa4\xd0\x88\xb6\xa9hJ}7\xc0\xa6$\x8e\x93\xb3G\xf7M\x14<\x87\ta\xc6m\x1f_(F\xfft\xdf\x18\xd5\x0c\xc3ms\x861\xb6M34\x0e\x08d\x18\xed:\xf8 Xm\xf6\xf7s\x00h\xbd\xc7\\\x9f\xa9\x84\x17\x942\xe5\x91\xbc,\xd5\x858\r\xc1\xd4=\xca;O\xe0Z\x84\x8ek\x8a\x9f\xc4\x86\xd5<`\xb3\x07r\xbe\xa6(\xb9\xe0\x00\x80\x99\xe0\xc9!v\x0bZ\x8c\x8c\xab\xfcS\xa4sM\x92\xa5\x13\xe9\x8fj\xa4\xca.(/K\x1e\xd3n\x8f\x07\x02\xe4L*\xec\xfbz*#\x90-\xf8\xb5\xe8\xb8\xbd\xdf\x9f$/.5 X\x8bKi\x83\x98H\xd4\xaf\x9bpY\xdb\x1b\xacG\xa8\xb1\xd53\xe7\xfas\x86\xf4\xf5\xbaY\x99y\xfe6c\xdei\xf7\xf7gb\xce\xf4;A\x1d~\xe7\xe7\xa7om{C\x95\x06\x94\xac\x19\xec\xa4\x8bj\xac\x14S\xc39\x93\x984\xff\x03\x11=\x15bp\x8bxJ\x02\x83\xf1&l\xfe8\x00)\xbfo\x9a\x96\x0b\xf4\x99 \x82\xd5\xd6\xfd)\x85\xeco\xba&\x81\xf5T"\xb2=b9&\xa8R\xca\xcf\x11\xebv\x9e\x18\x8d>y:\xff\x81\xde\xf3K\xe4\xc9\xfa\xcf\xef\r\xf2Q\xe5\xa4G,/\xb9?\x16\xdfh\x01=\xe3\x02t\'T\x05\x12\xces\x92\x01H\xe7\xd4\xb14g\xaaM\x13\x05\x17\x04M\x98b}a\xc0Ut"/\xe5\xb7\xb7\x8a\xc5\xbc\xd2\x1c\xca\x00\x8d\xddn_\x82!\x00\rG\xbc\x82$\xf8\x92S\x9e\x7f+@\x87\xc3GY+\xd36\xd76\xec\x06y\xb8\x1b0\xb3\x7f\x1b\x1as\x15\x19e\x13y\n#\x86\x0b\x96\xf7G\xc8e\xc2\x02\xd5 f)\x99P\x8d\xe7\xd5\xd4?O\xe0q\xd9\xe9\xd18\x0b\xb6\xf2\x0b\x87v\xd2\x8fI&F\xfb\xc2Rs`\xdbB\x8e=\xfb\x9d\xef\x131\rm\xaehr\x8b]\x1fG\x18\xb6k~\x1a\xfb9\x95\xc7\xe6\xea\r\x9a\x9e\xe4\x8asL\xec\x9f\n\xb6\xee\x81\xb8!\x88U\x80#\x08\x8c\x89\t\x83\x02?\xa2\xda\xe7i~^J"\x17\xc7e\xfc\x0e<WP,\xa8\xbc\xff\x16A\xfdY`\\\x87\xbb\xb9\xad\x01\xc39\xb6\xebrR\x96\xd9\xd9\xc7\xaf0,\'wfL\x06\xf7\x917\xac\xd5\xbey\xc1|\xe6\xef\x7f[\xf6\xac\xa1lk\xca\x85\xaa\xfe\xde\xe373\x9d\x96JsW\x02\xa37\xc4\xce^+!\xd7\xae\x8dQ:5OfK\xcb@\x19/qQ\xbe\x8ahf\xca\xf0p}qoo\xfd\xb3\x9f\xd25\x94\x92i\xc8\x83k\\O&T\xc1W\xf1\xb4\x04\xd8\t+\x95\xea\x9c\xf0\xeat\xe0\x8fn\xe9\x18\xe0\xf1\x97C\x02\xdfQ5\xd1o\xbc*GN\x1cUk)\xce\x00c\xaa.R\x91h\xbfb\xed&D\xa1\xd5\xb0\xce\xb2T"\x1b6\x8d\xeaO?qp\rd\xc13\xda\x89o%R\xddx\x9f5\x8b\x9am\xa4a&h2\x88\xe3a\xdfj3d\xdc\xac\nXar\x96\x06\xef$\xf4n\x02_\xb1\x8b^\x94sx/SL\t\xcd=\xb7\xd1\xc5\xc9\xe9\xa2\xec\xa3U\xee\x1e\xc4\xdaX\x97\x18D\x11\xde\x89=\xd8\x98\xed\x1c\xaf\xcaN\x8c\x84y1\x8dr\xfc\x19\x9c\x85\x8c\xb2\xc0\x96}\xd6\xc0\xc8\xb3\x1e\xb7\x08s~!J\x9d\x83>\xd4\xd8\xbb\xdb:\xbd\x7f\xe5\xe4\x1e\x12a](\xc3\xd2\n\x8f\xb3\xee&~\xb5\xb7%\x12B\xb1\xc6^c\x88\x15\xb43@\'wMy\xbe\xf7j\x1dN\x91\xf4\x89\xe9D\xc3\x87+1G\x81\x0bY\xc4@\xd8o\xa0\xd6\xda(I\xe7\xfe"\x9b1J\xad\xc9\xf9)\x9d\xe4\x1a\xa8\x91<4\x0f\xcf\xce\x8eT\x86\xb7\xdam\x12\x16\xe6<$\t\xbdZ\xb2\xe6)\xc0\x82_h\xc6O\xea\xedO\xc0\xd0\xe5\xa8\xe1\x14K\x85}\xf1\x9ao\xd3\xae\x89\xbeDmp\xd1W\x0cc\xd9\x9a\xbe\x02w\xe9]:\xb3\xc0\xd0\\"@Q\xe4\xf3\x1c\xc9\xf9iQ\xe3\t\x07\x9d\x0f\xe9wR>\x12\xf0\x80\x9b\x9c\x04w\xf4vZ\xba\x1d\xcf\xf2\x13\x14k4\x9f:\x96>\xfe\xa1\xba\r\xc5\xe5_m\xb1*\x1f\xf8\x88w\xfb\xb6*\xa44\xd0C\x86\r\xd3\xbcD\xf0\xef\x17\xc83I\x85)\xa9<\xe3v\x94\xc0\x8d-F^\xf2\xe0\xabX\x06\xa8\x83\x18O\xbd\x0f\xc9\xa3\x1d\xe04\xdd\xb4\x7f\x9b\xb8\'\x02\xa8j\x0b |^{\xb4\\\xde:g\x9fJx\xd8\xf2\xc3\x8b\xc0\xe4\x04\x03\x8f\xc7z\x08\xca\x9e\xad\xb9@\xd2\xc859\xfc\x194\xdb\xaa/\xa3\xaf.%\xc8\t\x95U\xbe\xa5"\x0c\xff\x06\xb1\xa5\xd5~\xc0\xa4\xe9!\xe87\x9b,;\x16\xb8"\x91W\x9dX\xca\xbc\x05\xc7\x14\x8c\xa9\xaeL#\xe8\xdc\x04\x96\x1f-\x18\x7f\xc2\x11\xe2@\n\xe1\xe9\x8f\xe2\xdeskz\xc7iR\xd6\xca\x7f\xe1\x1b\x1f\xbfaP\xc0\xca(\xbc4\x1f\x98U\xda%\xad_\xa0\x90\xb2\xef\xfb\xa77\xe9\x95\xdc\x12/\x9cle.\x02\x92\xe4I\xef\xcd\xc7)\xdcm\xf5\xa0\xf2\x9d\xd0:\x83\x04\xde.[7X%\xf8r\xc5hT;\x1e\x16u\xda]%{T\x97tU\r\xa64\xb8\xbbh$\xb3%\xba\xbd<a\x7f*`\x85\xac\xdf\xed\xc3\xb2\xa2C\xc8{\xd1\xe3\xae}[\xf2\xd1&\x9d\xed\xa3\x81\xcei\x15l\x01*\xc3\xab\xf4\xec\xdb\xa9E\xa9\xba\xd8\xac\xba1#\xbd\x01\xb6\x8d\x96\xb6>\xec\xf2\xa2\x87\xa30><\xf9o\xa5\xc9o8\x8c\x92\x07\xc5EoN*&\xd2\xd1Ln\xb2d\xf2\x12\x8a\xbe\xb0\xe9\x87\rm(\x07x\xc1\x1b\xb1tY^[\xf0Df\xa8\xc0\x1eRT\x10DS\xfb\x1et\xd0/\xeb\x12\xfaX\tL\x99\xdfL\xf4\x0f\xacI\xbb\xbc\xf7\xbbM\xd2Gv\xecT\x978)\x9dl!\xda\xef\x9f\x1b\xd8\xef[-\xd1a\xc4\nT2eR\xd8U\xcb\xa1\xc1\xef\xfcB\x0c\xbc\x9e8\x8b\x1e\xa7[6\xfa\xd5\tW\xfb\xe1\x8ff\x9c\x8b*Z\xa3\xd4{Zm\x02\xa5\x19\xf1\xd6\xe4YoR\xc1\xbd\xd3;\t\xc7\x90\x99\xba!\xee\xaa\xdb\x16\xc7+b\xc2Kp\x04\xea\xd0\x9eA\xe4S\xbe\x83\xf7\x91]\x08(&\x15#\xbb\x15\xfd\x13\xf3\xc7\x80\t\xd1\xce\xe6E\x9c\xd5\x16\xa5\xe42`\xce\x14\xc7/\xb7t\xb1\x1c\x1e\xb6\x85\xaa\x148\xde\xcd\x03\x8a\x0c\x02\xa55\xa5\x16\x04\xc8q\xe1\xff\xb0\xc5\x89\x93\x17\xe3-[\xd2\x8a\x97\xc9\xdc!\xd5r\t?\x1b\xcb)\xd5\xd2\x0c\x99N\x00\xa7Q\x8b\xf8ew\xf5\xbd\xe8\x1a?O\rL\x83%dw\x80\xff\x9cK\xa2H\x1e>\xdcT\xf1n\xae\xcfmh>\x1b\x92\xd8\xdf\x08\xb3\xc1\xd2K\x98\xc8\xbd\xd2_\x80\xc8U\x80"\xd8~9\xe9)\xaf{[QO\xfd\xd0\xc9\xfeZ-g\xe4,l\x95\xd51\x9a*\x0b\xb9\xbf\x1bX\x87\x00\xd2n`\x7f\xd1\x0f\xe7`U\xbd\xd82\xa4=\x1es\xa2W\xa8\x9e\x90k\xed\x02xqgp1\x9f\xc6\xf5{W\x80\xa1!\x92\xc1^\x0f\xa0\x13\x9f\xb0R\'\x17h\xfarUa\x03\x195u"*\x94\x15\xca\xda;yv\xa5\x8cv\xaf\x94\x174\xdfE\x83\xef\xa7\xc1E\xa8n\xbfi\x0fi.r\x12\x10\r\xaeSAl\xfc\x86\x94\n.\xdf \x1fPV\xda\xe0\xfc{\xe2N\xfb\xecQ\x9d::\xcb\x13\x08A\xb6\xf3~v\xc2w\xf5{iRE|Q)A\xa9\x88\xcd^-\xfa\x1b5\x89\r\xbc\xb4\xd6\n\xf4\x15\xce\xb8>4\x82\xc4\x98\x8e\xc4\xab\x95\x02\x1f\xa1\x0b\x05\x8e\xaf\xf0\x9e\x8a\x91\xf0\xcc\xae}\xe8\x18~\xd1>6E\xd9\xc9)Y\x1e\r\xcb"9wl0z\xaa\xee5\x07\xa5\xe1\xc0Gws\x93W\xb6C\xf7\xd7k\x00\x1a\x89\xa8\x0b\x15\x0cc\xeb\xd7\xbe\x19J\xe2WC\x8a\xb1\x93:\xf4O\xe1\xf0\xf2\x143G\x0c7\xd5o\xc8<<={\xf8\xb2\x8e\xc8n#\x97\t\xd1G&J\x92[5N\xdaO0\xd0\xa9J\xfa,F\xf5_\x8fFh\x9d\t-[,\xc9\xdf\xe3\xff\x96\xc34\r\x03\x7fU\x81\xf0\xd0P@_z^tcn\xe1\xday\x8d\xd4\xc9\x06\xc5v\x94\xd89\r\xc0JM\r\xc0\xb49L\x8cj\xb0\x93\\\x94\xc0\xcd\x92\xfdG@\xd1W\x81\xefBy\x00!\xdd\x12\x02c\xecq\xb6\x1c\xc2\x12%>\x13.:A\x877\xb5\x13Md\x03H\x05\x1f~Nf\xa6N\xc9\xa2o~\xc7CT\xdb\xc2;\xeb\xf4G\xe8t\x80\xff~\x03\x81kx\x80@\xef\xd1)\x12\xf5\xa5D\x1f\xa5\x86.y\xc2n\x93\xbf4\xcd4,A,_\xb6x\x81\xee@,\x04\xa8nb\x04\xe0-gb\xd4\xdd\xabs\x8b\x8a\xf7(:\xb3+`\x16M\xb8\xd3,\xf6\xff\xc6\x94\x1c|\xda`\xde:\xb9\xdcc\x9b\xc3}:\xa3\x08Q%\xa5\xac\xfb\xb0M\xbc6\x06\xaa\x00\xb6\x9c\x18L\xa5<0\xfc\xc8\x8b9Z\x0f\x0eh"\x15\x17\x0c\xb3\xa0\xa1!\xfd=\xc6\xbd/\x9cD4)\x13\xdf\xc7\xee\x94`\xc7\x8aa\xf1r\x0c\xb9\xcb]J\x9a\xab:R:3B\x9d-L\xd5\xd3\'\xda\\\xf4\xb4\xd24=\n93gu{d\xceIT\x0b\xe9\xd4\xa9]t\x81Qo\x17\x10\xc5\xbc\xe2\x955\xedV\xe4A*8\x83l+\x14\x1c\xf6E\xe0\x960\x90\xa5\xdf\xb7\xf0\xf1[x>\x85w\xa3s\xb0\xb3\xfd1\x9aG\xfdtBB\x0fl\xc2H\xdf\x85\x17\x10.c\x92\xb4\xa8\xf3\xed \xf5\xd2L3\x19\xdem\xa96\xeb\x8f\xc3S\x00\xd0\r\x97_\xba\xd8\xd8\xee\x005\x00\xb3\xf0\r\x99\xeb\x88!\x13\xf0\xd3V\xfe\x18\xd8\xa1\xd3\xc4\xd6/\xb5\x9f\x0b;9&x\x83\x9e\x1fN\xd0\x07\xa9\x08\xdff\x89\xfas\xa3\xd1\xec\xdd\x8a\xe5\x8fcJ7M\xd0t\xb9\xc2f\x16\xa1\xb8\xf2cZ\xc7\xcaC\x8eW\xc5\xdb\xae\x01^\x1b\x99\x01\x7f\xc2\x1feB\x0f\x1e\xef(\xae\xd6\xb9O\xaa\xbb\xac[\xa0\xc4\xe3<\xba0Y\xf7\xda1\xbd\xd6h\xfd{\xa5\xdcWy"\xd7\x7f\x8a\xb3H5\xf02Gu\xd36qX\x82\x1ai\xea\x18E\xfa\xa3L\xcf\xa6\xa9\xfb~\x16\xa3\xd1\x83)\xb9\xdd\xec\xa98\xda\x8as\t\x18\x87>\xe5BY6\xf5b(\x94!\xd1\x1bZ\xd2\xc7\x01\x1f"\xcd!\x93;~-\xddBKY\xae\x0c\xb5\x1b\x0fHT\x1c\x077\x12\xc9\xbdj\xa1\x06\xa3\xa9\x08\x05ec\xbe\x9a\xc9\xe3\x7f\xcc(%\x84H\xfd\xc4\x16\xc8\x10@\x1a\x96\xffC\xf3\xd2Q\x12\xc4\xbbx\xf7\xba\xf3\x17\xca\xaf\x10\xbb\xca\xf0q\x11\xb3\x88\x13Z\xa7,\xda\xc8\x11\xbb\xc7-\xbe\xea\x82\xe5|b\xc8\x1a\xddoI\x88\xa9\xb1\xdd\xd0C\xfc\xcb\x13o;\x98\xaa\xa1W"z\x86\xddT\x88\xe1c\xc1Z\xa4\x85\xc3\x9f\x18\x83\x82\x03i\x02E}}9\x023\x8c\x17\x0e8\xb5\x085\xc4\x8c\xd5\xe8P\x10\xc8\x9e\xf5=A\xc5\x05\x8b\xb3\xe36+Yf\xcaVU@\xcc\xc7\xeb\xd1\x80C,\xd5r,]xZ\x12bVU\xb2\xa4\x15&?\xb1\x08\xe9\xe7\xeb\xc8\xb4\x0fl\x97\xa8\x11\x18\xc1\xcclF\x8eS\x0e\xa9gM\xe6dD\xbdE\xe6\x1c\xa6\xe3?\xcbc\xfe\xca\xfcE4\xad\x83z\xac!\x941L\xbbm\xa1\xd7\xd1\xd3\x90\x0c\x13_H\x0b+\xc9\x7fG\t\xf1\xb5\xb0\xaa\xferi`\xacSCY\x1f\x8a\xdc\x91\xa5M\xcaU*\x17p\x97\xc7S/\x85e\xb7\x94\xf3\x86\xaa\x8e\xfb\x853\xeb\xbel\xa1\x99kgK\xb4f\xfd\x17`\xd2\x80\'\x8e\xf7Em\x8d\xff\x1f\x98X\xd4<\x06\xd7\x1c\xc9\x07l\xe2!\xfa\x9d\xf7\xd4\xb8$\x84\xbat\xc7\xd4\xc8d\'\xe4\xc6-HQ\xe9\x99\x07/)\xf0L\xef\x9b\xf1\x94\xf6\xe7G\x8f!\xd2\x10sz\xc0\xd3w?&\xe0\xe15\xc7\xd0\xb8\xecQ\t\x91\xba%\x82^)6\xcd\x04+\xee\x1e^\xebH\xa0.\xce\x03i\xd8P\xdc\x15\xe3\xab\xa6\xc4H7\xa2+\xb3\x18!a\x10H\xd3\xce\x84KM\rS\x8d\xe6d\xe3+\x07\xbdm[\xfc\xa6\x8c\xec\x05\x1b7\xc8\x8d\xea\xcd\x98\x10\xc6T{\x98\x95\xbeO0\xa7\xf3\xa4s\xb6pQ\x0c\xc2\'\x89n\x91S\xf1\x846G\x0e\x9e|\xe8r\xd7\\\x14\xc2hZ+8\t\xee1\x13\xe0T\x80\xe3\xb9\x06\x07\xc9\xe1\x13H\x95J\x80\x98AU\x0f6<\xb7G@s/\xdd\xbbn6\xee\xd2\x0fOk\xb5)\x1d\x07\x1e\n\xae/5\xb7\xf4C\x9bQ\xae\x8d1~8]8\x93\x95\x17G\xde5\xe9\xbdd\xc8@u+\x95\xdbn\xb9\x82\x02\'\xa6*\x18N\xba*\xd9~=\x15MX\x91\x9a\x018\xd1#\xedS\xbd\xb4\x9b\x1e\x86\xd8-\x91\xc7\x0c\xc2\xaeM\xf4A=\x9a\xd8A\xdb\x96\xb5\xed\xe7\xb0\xbd`\xa0\xc5\xf3\x0f\xce\xe5\x0fG\xb2\x17K\xfe!H\xea\x04\xf8\x97\xde\xd0\xd8\x86\xe7\xc2\x8dt\x1c\x9a\x99\x8a\xa8\x81(\xaa\xc4\xaf\xbco\xa6?\xc3\x85\xec\x0c\xde\xe9%"\xe4E\xe5\xc6\nQrb*\xdalj\xf3\xd1^\xaa1\x86\x90`{\xfa\xd1\x92\x06\xd0\xd0j\xbd\xc6\xc2\xc4}\xa5r\x05\x19t`{\xc3b\xc5\t\x02\xa1\x12\xe5q\xf2\xac\x9a\xaa\x83\x16\x07s\xdf\xc1`\x87\xb9\xaa\x07\x12+&\x90w\xf1P\xe0\x00\x0e:9\x81@\xd5\xef\x9c\x96\x84/R\xac\xc9\xd5\xcd\xdf\x11\x1b\xa6\xfbj\x91b\xef\xfa\xa7\x9aS\xdaz\x8d\xca\xb6\x91\x8a2\xa2*\x9d\xdd\x88\xa4\x01(t\x1f\xedN\xae\x00\xd2\xe8\xb0H\xae\x1b2\xac\xcb\xdeS1\x97\x91U\xcd)M\xffm\xd5\xd1\xd4\xb0\x14s\xad\x13\xbf\xa80e\xe0\x17C\xa5\x11\xb9\x13\xa4\xd8\xdc\x05a\xf4\xe0\x98>\x97\x0c5O\xa5\x03\xf2Z\xf9\xb7\x89\xb44Zm\x9f^x\x1a\x9a\x106]\n\x82\xcc\x10\xcaK\xca\x96\x84\xef\x87\xae\x82\xee\xe9\r\xb0\x93\xf3q\xbaS7\xaf\xe4E\x80\xe5\x13\xfd\xdc\xa1+1\x1bM:\xa6;\xd4&nb6\xed\xcd\xd7J\x9a\xfc\xb8hy.FU\xf5\xf0\x02\xb7k\xe2\x86\xdcB\xf2^\x82_\x00\x8b\x9b\xa2\x1e\t\x88\\l\xa4\x13\xdcq?z\xd5\xb6\x1cQ\xf8H?~\xc4m\xb2\xac\xfcr6~"\x86O\x97\x17]\x14\x0e\xc79\xe6\x0c\x10({=\xd5\xacY\xe2\xe2\x14\x00\x82\x0f\nK(\xb3t\x95\xf6\xb0Y\xbd|\xcfn2s\x11b\xe8\x92)\xf4\xee\xdc\xb3\x17\x1c/\xd5\x91\x14f\xfeS\'\x1c\xae8\xc1Tt\x8e\x86z\xe5\xdd\x90v\x06\xd2T{3&\x05[p\xe1\xa2s}[M\xc3\xa4t *\x9bw[||,5\xf6G\xf0\xe0+(F\xd9Z\xf1\r\xda\x9c\x02\x15K\xd7@\x13%\xef`l\xc4\xac\xee\x05\x849\xf4\xfa\x84\xf2\xfb\xdd\xef\'\x97\x8fR\xbd\x95\xda\xf5\x82\xa0`\x92&\xd0\x16\xa3\x03\xba\xb3\xdd~`R|\xf6\xd8\xce\x18\x1c\xb9\xe7(d\xd1<\x19\xa7\x11\x96W\x91\xb1\x95\xb1\xcdo\xaa\xb5\xe0\xe91\xcaXX\xbd\xfcc\xc16\xed\x90\x192\x02q\x00s\xd1\x97~\x89\x8bL\xacF\x96\x8a\x9dn\x83E\xb3\xf4L\xf5\xd2\xf4\xc1b\x19{\xc0\xfb\xb8=M\x90\xac\xb7\xa8\xdf\x90\x99\xc4\xc0X\x89dgf\xfb\xf9Ot(\xba\xa2\xf8\xd8l\x92E\x16\xdc4\xb7\x19\xcaz\xc9o\xa6\x01\xabz\xe9\x15\xdc\x01y\xaa\xbf_\xdbxy\xd6\x9e\x91\x97 \xc7\x07\x98/\xe2\xb3\xf8\x0b\x12\x80\x89\x95.\xa9A\xd2\x93\xddz\xba\xe6d3\xf6?\xd5\xe3\x00\xd5$\x88\x81\x7f\xa2\xe9\xf3\x16K\x98\x82+\xc1\xa0\xb0\xe6\xc3\xdc\xb4cbg=\x8a\x89\xd4\t\xb6\x15\xf2m\xd6l\xf4\xc9\xce\xb3=;\x8a\x13\x9e\xfd\xa1|\xa3\xb4\xd2\xa7\xb7B\xdb._3\xe5\xbe\xed\x9d\x17\x1d\xe4\xd0\x12n\xbe\x10s6j\xcbF\xf7m\x98\xa9R\x94\x8d\xa1\x10\xcc\x7f>\x08o\x13=\xde\x9b_\x98\xcax\xe7\x00O=\xa8N\x94t\xb5@\xe7\x1eq\xec\xefR\x0cq\xc6\xcegNPa6#\x00\\\xeb\xe4\xae\xd3\x7f\x07\xe8\x96\x17\x83\x91\xd4K\xdb\xe5T\xc0\xf9\xf90)\x92\x16\xe4\\Gq\xb6\x9d\xd0\xb5l\xa7\x86\xc3~:\xf5\x91:S\xc0\x0c\xc3\x17\x99)\xed\xa5Y\xfe\xc9\xd0i\x8b|\x04\xc3\x99/4\xce\xf9"\xff\xb4\xfbq\xddc? \x98Q\xf0\xe6\xf6\xd3`\xe8\xcb\xf0\x06A\xf8{\x9d\x84e\x9b%\x1e\xef\xd2\x98\xceakeXp\x99Mc\xc5/\x15\x1b\xe1#[r\x93\x8dPTh\xf0\x1c4\xb4\x89\xdbzt\xe7\x9a\xf7\x7fS\xe8\x92b\xadj\xc4\x15\x92\x1bM\x95\xdf\xa7f\x1c(\x83<\xec3\xc5\xf3\xa3\xc8?9\xfa\xe8\x1c8\xeaX\x85\xde\xd4\x9at\xb1\xeb\xea\x8d\x86\x16&&\xfb\xb5n\xe1\xee\x1325\xce\x91\xd6,\x88\x0cT\xf8b\xc6\xd5\xde\xce"\xc9 [tu\xdeab\x10\xf2\xcfqK\x80\xc0i\x07)\xf2\t\x02\xb0\xa9(\x08A\x82TFhx\x1f\xe1]TU\x81\x8c\xa1N\xf4\x8b\xba`\xef\x92\x05k\xfb7\xab\x02\x08\xe1\xd0h\x92\xdb\xa5\x0ff\x1d\xa5\x91\xec\x9e)C\xf8c\x9d3u\xedJ\xc0\x9b{\xa8\x8d:\xa5V\xee\xd4\x94^\x19\xa7sec\x9dR\xae\xe3\x18B>\xb8\xc9\x9d\xbf\x84gy\x90I\xfd\xc8)f\xeaD\x91)\x7f#G\x88\xcf#fk\x99\x14#y3\x03QF\xb8A<\x08Y\xa1\'8d\x1d}\xa2\'\x0c\xf2*~\x0f\x11\x1b\x13un\xfe:\x9cD`\xd7G\xe6\xda\x05?\x92~\xed\x8d\xb1\x93\t%0\x9ba\x95*et\x92\x0f\x17G%\xf2\x19\xdcu\xc5\x80\xd8z\xba\'\x01c>\x9b\x1a\x9b\xf7vi\x1fU7\xa8\xab!\xf7\xf6\xf2\xc4\x81x\x9dQ\x8a\\jQb}\x18\x82\x1d\xd6\xcb\xfaq\xfe1\x0fX\xd7\xd5\x9f\x0cVEk\x8a\xb0b6M\xdd-K\x1b\xd6w\x8e\xd3\xb7\x903\xb8w\xb9G\xb8\x1e\xdaW\x8be\x90\xa8I\x04\xb4y;\xd0\xc2\x19V\x9d=\xdfg\xe4\xe2;\xb7z=\x99i!\xfe\x17\x8c~\x8fO\xb0\xa5\x81,\xcd\xa6\xf5J\xc2Q\x01\xef\x1d\x7fa\xf0\xa0!\xdf\xdb\xf4v^\xc8\x07\x16\xd5\xdd\xf6\xa8\xcfg=\'\xac\x0c\x99o\xd1\xcb\x98\xfbH&\x96\n\xda\xf7\x01\xff\x04l\xce\xa8\xfd\xaf.f\x88f\xa7\xe7\x85\x9f\xa9\x15\xcc\',\x88y\x82c\xec\xf2VNS\x9b\x12"\xd0\xac\x88\x001\xdd\xcc\xe7\xc5\xaf\xf2DG\xc6\xa5\xc3\x84\xf0Ps\xe8\xc4\x1eT\'x\xaa@\x07]QE-"\xea\x11\xd6W\xab\xbc\x8f\xbb\xbc\x98&\xad\xcdPu\xae\xb7gk\x81\x86?\xa7\xaa\x1dp!\xffR\x0b\xb2\xc9\xd8\xccN\x8f.\xaf\x8f\xd9`c\xfc\x06\x1b\x07\xbb]z1-\xbf\xbb\xa0\xa9\x1e\x93UX\x8e\x1e\x8c\xbb\'\xf6\x91T\x8el>\xd1\xd6\xab\xff\xdb\xff\x92\r\xcd\xd0j\xd4E\x18\x04=nl\x08qz$\xb5\x10?\xddY\xfe\x90\xe5\xecc\x95\xfd@\x9f\x1d\x93\xf2X\xd8\xc3\xf6\xb0\xd3\xa5\x11\xad\x10\xb1\x85\xd1k\x1e\xfb\x9f\xc9cp\xc1qI\x0cTh$\xfa\xeaC\xaeT\xc8nT\x02g\xea5\x9d\x06\x95\xe3\x9e\x9d\xeb\x1a`z\x8d\xf15\x93m\xb5\xd1\x8do\xcc\xed>M\xd9\xa3Y\xd2\xdf\x01E(\xc1\x9d\xc5sT\xde\xfc(Z\x92\xcc\xc0\xec\xb5\xc1\xf3%\xae\x19\xc2\x0c\xd5\xf5Z\xfd\x7f\x00}\t+@r\xe6\xb1\xca\xd1\x92\xd0\xbe3\xdc\xb5<\xb7\x14[!_K\x0b\xc2u\xc5\xcd\xc7\xe0\xab\xbf\xb7\xa5*0O5j\x8c\xef}7\x83q\xf5S\xf8\x98\xfa{\xb4\x95\xa1v*e\x9c\xc9\xe2\xdcmWz\xab\x84\xc2\xe7\x8a\x85\xc4cW)\x82R\xe4\xd3\x16T\xa0\xce\xc6\x9cU\xe6ou\xab\xf0\xe4H\x81\xf4z\'\xb1\xef\xf7\xa1\x81\x93\xdd\x95\x1bZc\xd9\r\xe3\xc31%E\x04zj\xea\xb5e\xf8\xbc\xd2\xa9\x12\x8f\xd4Q\x1d\xe6%\xac\x943\xb3Em\x08\xfbST6,P\xdd[VB\x08\xcb~8(\xe6\x80\xdb\x08\x98\xf3\xe5E\xbe\xd8:\n\xc3b\x90\xda7\x85N\x87\xcc\x04\x8b\xb7\xb3=\x04\xe3\xdb\xa2\xfe\xc5\x01\x0cp\xb5\\\x11\x88\x0fLr&\x8a\x85Y\xa7\xcf\xc1*\x80\\\x8d\xbb\xba\x85\x16\x19\xae\xda\x86\x10a\xfe?w\xac\x9e\xcf35Y\xfe\xad\x7fU\xa1D\x81\xf0o\r\xde\xa2Q\xde\x1e\x91\x9f\x10a\x9d\xab\xaf\xbe#+\x0b\xb5\tx"\xdcu\x8e\x95\xc2Y\xbc-\xf0f\xe6\xbe\x0c\xe6\xd8\x8c\xd7\x95M`+a\xcbgf\x04r\x8a@@a\xe7*n\xebW\xe7;x\x83\xa9\xa4\xda\xb1\x9b\xb9\xd8F\xe6\xe0\xbc\xab\xde*\xdf\xd2H_\xd0D\xca\xd6\x90\xf4\xfa,\x06\xdb\x02\x01\xa2p\xc6\xbb\xad_\xbf\xd5i7\xa0\xc3\x8db\xf8\x9e\x9c\xefg\xc4\xac\x1e"J\x93\xb9\xbe\xc7FaMR\xf1j\xf2\x996\xaf%\xc0.?\x06+\x7fU\x99gv\x10\x925Mr]\xf4\x855\xb2\xe2\x98i\xa0x\x1a\x02<\xb3\xa6\xe8\x8b4\x9b\xfb@;9A\xac\x9av\x14\x90G\xc4\xa3!O\x01\x9e%\xd8\x12M\x1e\xc3dh\x8d\x84\x0c%\xdf\\\xe4\x01G\x93\xa6\xd7\x8b\xc1\x8f\xb3IQ\xbevY/\x041\x83\x1f\xd5\xe5\xda\xafe\xe0\x97\x9fh=\x03\xd3\xc9\xfb\x8c7iq\xfe#MU\x90OF\x0b/\xa4\xa4\xd0\xcc4\xd4x\xafw\xd9\x89\xb5\xf0\xfc\xdf\xd5L\x80|e\x99\xeegE\x98\xac\x92]\xbb5x\x05\x9c\x9du\xbf\xc2\xc06\x19\r\xff\xc0U\xa1\x07\xf1\n\x04A\xb7\x06\x8d\xa3\x0bZs\x94\xb0=\x1fC\x18\xbe\x8a\xc4\x9e\xaa\xa7\xd8\x14\x9bn\xd5"Y G\xfe\x01\xcc\x02Q\x031\x19\x1a\x8b\xcd\x0b=kg\xb2/\xf6\x90x\x8d\x82\xfb\x88g\xfdF\xb4=7\xccR\xd5\xd0\xe8\x81\xe7Q\xfc\xc5\xe9T\xe6\x17\x17\xf4\xe2eE\x10\x07\xe3B\xb8r@hC\xe6\x90\x88\x04i\n\xcc\xb4kv\x9e]\xa1\xff#w\x1d\xc0\xd22UW[\xc9\x90\x07<=\xba:\xe1y\x19\xb9\xfd?\xab\xfd\x1d\x974zt\x17O\x8e\x9a\xea:l\xcaE\x01&\xb1\xb3\x17\xcd\xdd\x89\xaak\xfck@w\xd1\xc4R\xa78\xd5\xb8\x96\x8fn\xefH\xac\x9ae\xc4\xc9\xf6\xad1\xc7\xd7\x15H\xe4\x1eO&\t\xcd.\xc23Q\xaeq\xc1\x02\x8d\x1f%\xf1\x9a\x16\x89\xf8\x98m\xcc\x85k\xc4\xaa\xf5\xa6\x10\x9c8\xe3\xcb\xa6/,\xa2\x11\xa44\xccDpJ\xddk\xc4\xa9ke\x1c\xf6\xb2\xe1\x94\x8cX\xfe\x1er\xfav{\xf6k\x9b\xe9N\x1eI]\xd3N|\xb7\x06\xb0\x9dg\xc2\xb0 y\xa3\x9b\xd5\x1d*\x81\x1f\xdc6t\x9f\x07\xb4.A\xbe,Nb\x05\xc0\xe3@\xfdT%q\xae\x17m\xb0~\xa0\xe8ikA\x94HA\xc2\x82\'\xe4\x17\xf4\xa0\xe4\x17aS\x85\xbf\xe9\x9f\xf45\xba\xb9\x1a\xb3\xa2 n\x89-\xde\xd7K*\xdc\x1c\xc7\x9f\xaf\xfe\x0fP#<R\xcb\xfb\xa3I\xe8\xf4-&\xdfzsP\xde\xcc\x13-\x1a\xa7\xbf\x18\xfdy^\xd0\xe5\xc7|\xc9i\xf5\x92\x98\xedw2c\xe4\xcd\x93\xc6\x95s\xeb\xe1=,\xbd\x1fgO\xa3A\xdbi@\x1f\'\xad\x11mC=\x03!Q^\x87\xc4\xd2\x04a*x\x04\x8c\xa7\x0b\xcfx{^ Vr\xf2\xd8\x8f\xfe\n\xe6Od_M\x9csR.\xeb@\x97\x7f\x05\xb8V\xb2\x0c\xd5ic\xb3\x0c\x80\xecu\x1e\xfb\xfd\xb3\x8c\x92\xc0\xb24\xdd\x9e\xf51\xbf\xe0A\x85k\xe4\xeb1\x03\xe1M\x8a\x1c\x10nZs\x86\xe2f\x7f\xea\xaazp\x1b\xe9\xa8\x15\xf9\xd0\xfd1\x84Z\xae\x01\x9a\xb5\xfb\xa8\x82\x86\xc9\xc2L\x1e~\x98\xbb\x18\xcdQN1\xae2`\x15"?\xc4Q\x8f\xad\x04\x08\x8f\xb4[\xb4\xef\xaa\xbd"\xcdr\xf8\x92ZC\x08\xf1pi\xe0\xea\xf5WC\xe5\x8a\xf1W\x08\xbd\x8a,\x12\xf3Uhb\xb9\x95*\x1b\x06n\xb3Ms\xfe\x01\xd4b@?\xb1\x90c\xf4\xd1q\x8d;\xeeY\x7f\x82\x88g.\x0c\xd7\xf7\xf9\xb5\xdd\x03\x9b\xcf\x1c\x13\xbb\xa8\xf8p\x93fOnK\xff\x97\xa9\x0f\xc5\x06\x0b\x1cg\xd3M\xf635\xf2+[\xf0\xdb\x06\xd5`\x13\x84\xc6\xcc\xb8D\x0f\x06\x8d\xf9\xc3>\xdd\xac|\x0f,\xc1b\xbe\x87\xf3\xe2\x9c8\x10r*\xe6\x17\x18(\xe4\xe4\x8fj\x85\xec\x9cn\xd8S\x87\x82\xbe"0\x8b)\x91\x01=\x9d\xb7\xd6n\xf6\x1b0>\xf4j!\xcd\x10\xbf\x05\xfa7\x8b\nh\x08\x14`\xea\x18\xdc\x8bE7\xf8H\xd2\x13Gi\xbe\xdc02\xf7\xe4I\xeb~\x02}g\x7f\x96\x12\x0eYW\xc7\x08K\x93\xea\xf3\xb2\x04\xda\xc6\x18`"\xe59)\xa0\xf2\x95?G%l\xc8g\xb3\x90\x02\x18;-\x00xm\xf0A-\xb7b\xe2\xed\xfc\xabJ\xbf\xd1\xfda\x8a\x19f?\x0f\x8a\xb5dl\x17\xa5\xe68\xfa\xdb\xd7\x15]|\x92!\xe78\xf3HXUm\xa4\xc0\xb4\xd8h\xbb\xbc\xe9\x95\x1ac*\x10\xba)\xff6F\xc7\xbe\x82\xc5-\x12u\x8c\xf5Z\xb5\xd4\x80S\xdaj*\xfb\xab/wU!\x1cP\x0e\xe3\xe4\x1c|\xcb\x89\x1a\xc7(\x96\x83\xd7g\x1a\x89\xc4\xb1C\xber\xd1\xab\x83#u\x92Hp\xd8S\xeefe\xff\x13\xbbt\xf7\xc7\xb6Z\xdf\xb3\xf3\xf2t\x8d\x04\\\xcdC;zs\x8a\xf8\x0e\xb0\xcf\xa2\xb7\xc2\x8a\xf2\xa6r\xeb\xae\xa6\x82&W\xf7\xb8\xb7\xf7&\xdbB$%\xd2\x9e\x02-x{\x84~>\xad\xdc\xa2\xe1\xc6\xc2\xf4\t\xed\x88f\xe8l\xe7\xb1\x86U\x9cH\x9fO\xeb[\x07\xd8~T>\xde\xeb\r \x18\x0bw\xb2\xc3\x12\x07\xe9\x88\xe2\xdb\xbc\x03\x90D\x89\x0f?\x15\xf3,\x02\x0fl\xbd\xf6Q\xab\xaa\x89\xcb\x00\x13;f\xc34\x96\x1d\xf1\xdb\xb8\xfc.Z\xc4\x08\xa7\xa8\xa5-\xa9\xdb9y\xe7\xa01\x1fM\xb0\x8a\xe0:\xeeC]`7\xe4`\x01\x92{\xcec\xdd\xc4pd\x89\xe6\xeb\xa6G\xba\xf5\xdc1}\xab\x15\xf4\xc6~\xb2j\xf8="\xd7\xeag\xb1\xbe\x0c\xebE\xa0cH\x0c\xc3\xc6Rm\xcc\x0f\xdf\xc7\xf2\x1a\xa5\x97oA\x08M\x8cr\x02\'_\xc1\x83\xa5\xd4 \x86\xf1\xcb\xd1\x855\x9c-\xe3\x8a\x91pJ\xc0\xcd\x13\xd0\x80VV\xda\xd6\x015\xe5\xdf.4\x0e\xf6\x92\xd3z\xb5\xb8\x12\xfc\x1d\xf7\xde\x99\xdf\xe7<\xe1L5@\xb1t\x9dz\x19z\xb6\xc0\x01\xfd<\xae\x05\xfa\x8f\xe4\x96C;\x94\x17\xbe\x1b \xa4\xeeI.g\x17\x7f\xdb\xa6\xc9\xa8\xa6\xa6\xb2\x98L+_\xd0.\xea~/\xf9\xda\x98\xc7\x84%\x05\xb9\xd9\xd6.\xec\\\x15^\xe8\x8d\x11\x8eH\xb9\xc5\x0fW\xdcd\xff@2\x94B\xff\xf1\xe6/\x84\xf8\xc5\xef\xf5\xaa%3$\xa0R\xba\'\xc0-\xa8C\xd4hrt\xca\x10B\xfe\xdb1\xbfY\xaf\xd9\xdd\x89]\x06\xfd\x95\xe7%6Lu\x9f)k\xc7\xbe\x9a`\x9di\x05> \x87\x13M\x15I\xbb\xac\xc1*el\xf4\x08\xc8\x02\x82\x1c\x0f\xc6:c\xe4\xc2\xfe\xc2;6L{\\(}F*\xd6\xd8\xfa\xaa~7\xff \xde\x8c\xe3\x15\xfb\x8b\xb3\x95\x94\xa9,\xee\\\xdb\xd8)v\xd5\xe2\xb4\xfa\xc7\xad\xae\x1f=\xf5\xb1u\xfcWSxy\xe5\xd9$\xd4\xcc\xd4f\x0e$\xe3\x03\xb2`\xb2\xb5X\xcdf\xec\xb2\x1a\xda\xbcG\xdfN9\xd0<8\x06\x12.z\xb4Se|a9&\xb3u\xf7\xe9\xe5\x10\xa9O{\xaa\xdb\xbe\xbau6\xb0\xb9\x80\xaaX\xce\x0b2\xa7\xa5\xf5\xd9\x94\xa9H\xcd\xa0Z\xec.&{\x0e\x81\xa2\x90\xfc\xad\xde\xdd7\x99\n\xb5\x15\x88\xa7\xe5e\x99\x03\xae\x96\x14"T\xb0\xbe\xdb\x92\xdc\xf3\xfeq\xf6?xQ\x88\x17(\xa8Kd\t\x1c\x0f\x93D\xac\xac\xff4\xf2\x8a\x8e\x02*\x1a\xbc\x938g\xf4\x98\xe7@\x9f\x06;7i\xfa\xfcG\xe66G#:\x1e\xe3\nBP\x9a\x92\xd7\xd79\xe6i\xd7\x06[; b\xe5\xe6\xaa\xb6FU\x8c\x8f\x80NzM\xd0\x15\x84\xc2\x81\xee\xfa\xed\xa9\xe8a7\x02\xa0\xd4\xda\x92\xe7b\xf9\x8bA\t\xa9\x9fz\x0fg\xca\xe4v\x97\t\xeb\x90\x91<\xcd\xe8\xda\xaf\xe4\x98\xb2\xb3\xbc\x9fQc\xa5\xf9\xa6\xd3 \xa9!G\xa1\xdb~\xdf\x06\x9e\x1cb\x1e\x8c\xee\xe5/\xc0tJ\xe8\xd7\x17"\x11\xa3R4\x9c\x13\xc7\x0f\xb1\x92\xd3\xf1\xf6\xdd\xf5\\\xbb<\xcf\x9e\x8d\xe8\xe9\xa5-\xf9c(\xd29\xb7!M\xbe\xc4%\xf1\x06\x9d')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
class ConfigCategory(StrEnum):
|
20
|
+
admin=auto()
|
21
|
+
branding=auto()
|
22
|
+
general=auto()
|
23
|
+
proxies=auto()
|
24
|
+
domain_fronting=auto()
|
25
|
+
telegram=auto()
|
26
|
+
http=auto()
|
27
|
+
tls=auto()
|
28
|
+
ssfaketls=auto()
|
29
|
+
shadowtls=auto()
|
30
|
+
tuic=auto()
|
31
|
+
ssr=auto()
|
32
|
+
kcp=auto()
|
33
|
+
hidden=auto()
|
34
|
+
advanced=auto()
|
35
|
+
too_advanced=auto()
|
36
|
+
|
37
|
+
class ConfigEnum(StrEnum):
|
38
|
+
cloudflare=auto()
|
39
|
+
license=auto()
|
40
|
+
country=auto()
|
41
|
+
package_mode=auto()
|
42
|
+
utls=auto()
|
43
|
+
telegram_bot_token=auto()
|
44
|
+
is_parent=auto()
|
45
|
+
parent_panel=auto()
|
46
|
+
unique_id=auto()
|
47
|
+
last_hash=auto()
|
48
|
+
cdn_forced_host=auto() # removed
|
49
|
+
lang = auto()
|
50
|
+
admin_lang = auto()
|
51
|
+
admin_secret = auto()
|
52
|
+
tls_ports = auto()
|
53
|
+
http_ports = auto()
|
54
|
+
kcp_ports = auto()
|
55
|
+
kcp_enable = auto()
|
56
|
+
decoy_domain = auto()
|
57
|
+
proxy_path = auto()
|
58
|
+
firewall = auto()
|
59
|
+
netdata = auto()
|
60
|
+
http_proxy_enable = auto()
|
61
|
+
block_iran_sites = auto()
|
62
|
+
allow_invalid_sni = auto()
|
63
|
+
auto_update = auto()
|
64
|
+
speed_test = auto()
|
65
|
+
only_ipv4 = auto()
|
66
|
+
|
67
|
+
shared_secret = auto()
|
68
|
+
|
69
|
+
telegram_enable = auto()
|
70
|
+
# telegram_secret=auto()
|
71
|
+
telegram_adtag = auto()
|
72
|
+
telegram_lib = auto()
|
73
|
+
telegram_fakedomain = auto()
|
74
|
+
|
75
|
+
v2ray_enable = auto()
|
76
|
+
torrent_block = auto()
|
77
|
+
|
78
|
+
ssfaketls_enable = auto()
|
79
|
+
# ssfaketls_secret="ssfaketls_secret"
|
80
|
+
ssfaketls_fakedomain = auto()
|
81
|
+
|
82
|
+
shadowtls_enable = auto()
|
83
|
+
# shadowtls_secret=auto()
|
84
|
+
shadowtls_fakedomain = auto()
|
85
|
+
|
86
|
+
tuic_enable = auto()
|
87
|
+
tuic_port = auto()
|
88
|
+
|
89
|
+
ssr_enable = auto()
|
90
|
+
# ssr_secret="ssr_secret"
|
91
|
+
ssr_fakedomain = auto()
|
92
|
+
|
93
|
+
vmess_enable = auto()
|
94
|
+
domain_fronting_domain = auto()
|
95
|
+
domain_fronting_http_enable = auto()
|
96
|
+
domain_fronting_tls_enable = auto()
|
97
|
+
|
98
|
+
db_version = auto()
|
99
|
+
|
100
|
+
branding_title=auto()
|
101
|
+
branding_site=auto()
|
102
|
+
branding_freetext=auto()
|
103
|
+
not_found=auto()
|
104
|
+
path_vmess=auto()
|
105
|
+
path_vless=auto()
|
106
|
+
path_trojan=auto()
|
107
|
+
path_v2ray=auto()#deprecated
|
108
|
+
path_ss=auto()
|
109
|
+
|
110
|
+
path_ws=auto()
|
111
|
+
path_tcp=auto()
|
112
|
+
path_grpc=auto()
|
113
|
+
|
114
|
+
# cdn_forced_host=auto()
|
115
|
+
@classmethod
|
116
|
+
def _missing_(cls, value):
|
117
|
+
return cls.not_found #"key not found"
|
118
|
+
def info(self):
|
119
|
+
map = {
|
120
|
+
self.lang: {'category': ConfigCategory.branding,'show_in_parent':True, 'commercial':True},
|
121
|
+
self.admin_lang: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
122
|
+
self.cloudflare:{'category': ConfigCategory.advanced , 'commercial':True},
|
123
|
+
self.license:{'category': ConfigCategory.hidden, 'commercial':True},
|
124
|
+
self.proxy_path: {'category': ConfigCategory.too_advanced,'apply_mode':'apply','show_in_parent':True},
|
125
|
+
self.path_vmess:{'category': ConfigCategory.too_advanced},
|
126
|
+
self.path_vless:{'category': ConfigCategory.too_advanced},
|
127
|
+
self.path_trojan:{'category': ConfigCategory.too_advanced},
|
128
|
+
self.path_ss:{'category': ConfigCategory.hidden},
|
129
|
+
self.path_tcp:{'category': ConfigCategory.too_advanced},
|
130
|
+
self.path_ws:{'category': ConfigCategory.too_advanced},
|
131
|
+
self.path_grpc:{'category': ConfigCategory.too_advanced},
|
132
|
+
self.path_v2ray:{'category': ConfigCategory.hidden},
|
133
|
+
self.last_hash:{'category': ConfigCategory.hidden},
|
134
|
+
|
135
|
+
self.utls: {'category': ConfigCategory.advanced,'commercial':True},
|
136
|
+
self.package_mode: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
137
|
+
self.telegram_bot_token: {'category': ConfigCategory.advanced,'show_in_parent':True,'commercial':True},
|
138
|
+
self.is_parent:{'category': ConfigCategory.hidden,'type':bool},
|
139
|
+
self.parent_panel:{'category': ConfigCategory.hidden, 'commercial':True},
|
140
|
+
self.unique_id:{'category': ConfigCategory.hidden,},
|
141
|
+
self.cdn_forced_host:{'category': ConfigCategory.hidden,},
|
142
|
+
self.branding_title:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
143
|
+
self.branding_site:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
144
|
+
self.branding_freetext:{'category': ConfigCategory.branding,'show_in_parent':True,'commercial':True},
|
145
|
+
self.not_found:{'category': ConfigCategory.hidden},
|
146
|
+
self.admin_secret: {'category': ConfigCategory.admin,'show_in_parent':True,'commercial':True},
|
147
|
+
|
148
|
+
self.tls_ports: {'category': ConfigCategory.tls,'apply_mode':'apply'},#tls
|
149
|
+
self.http_ports: {'category': ConfigCategory.http,'apply_mode':'apply'},#http
|
150
|
+
self.kcp_ports: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
151
|
+
self.kcp_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
152
|
+
self.decoy_domain: {'category': ConfigCategory.general,'apply_mode':'apply'},
|
153
|
+
self.country: {'category': ConfigCategory.general,'apply_mode':'restart'},
|
154
|
+
self.firewall: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
155
|
+
self.netdata: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
156
|
+
self.http_proxy_enable: {'category': ConfigCategory.http,'type':bool},
|
157
|
+
self.block_iran_sites: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
158
|
+
self.allow_invalid_sni: {'category': ConfigCategory.tls,'type':bool,'apply_mode':'apply'},
|
159
|
+
self.auto_update: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply','show_in_parent':True},
|
160
|
+
self.speed_test: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
161
|
+
self.only_ipv4: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
162
|
+
self.torrent_block: {'category': ConfigCategory.general,'type':bool,'apply_mode':'apply'},
|
163
|
+
|
164
|
+
self.shared_secret: {'category': ConfigCategory.proxies,'apply_mode':'apply'},
|
165
|
+
|
166
|
+
self.telegram_enable: {'category': ConfigCategory.telegram,'type':bool,'apply_mode':'apply'},
|
167
|
+
# telegram_secret:{'category':'general'},
|
168
|
+
self.telegram_adtag: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
169
|
+
self.telegram_fakedomain: {'category': ConfigCategory.telegram,'apply_mode':'apply'},
|
170
|
+
self.telegram_lib: {'category': ConfigCategory.telegram,'apply_mode':'reinstall'},
|
171
|
+
|
172
|
+
self.v2ray_enable: {'category': ConfigCategory.proxies,'type':bool,'apply_mode':'apply'},
|
173
|
+
|
174
|
+
self.ssfaketls_enable: {'category': ConfigCategory.ssfaketls,'type':bool,'apply_mode':'apply'},
|
175
|
+
# ssfaketls_secret:{'category':'ssfaketls'},
|
176
|
+
self.ssfaketls_fakedomain: {'category': ConfigCategory.ssfaketls,'apply_mode':'apply'},
|
177
|
+
|
178
|
+
self.shadowtls_enable: {'category': ConfigCategory.shadowtls,'type':bool,'apply_mode':'apply'},
|
179
|
+
# shadowtls_secret:{'category':'shadowtls'},
|
180
|
+
self.shadowtls_fakedomain: {'category': ConfigCategory.shadowtls,'apply_mode':'apply'},
|
181
|
+
|
182
|
+
self.tuic_enable: {'category': ConfigCategory.tuic,'type':bool,'apply_mode':'apply'},
|
183
|
+
self.tuic_port: {'category': ConfigCategory.tuic,'apply_mode':'apply'},
|
184
|
+
|
185
|
+
self.ssr_enable: {'category': ConfigCategory.hidden,'type':bool,'apply_mode':'apply'},
|
186
|
+
# ssr_secret:{'category':'ssr'},
|
187
|
+
self.ssr_fakedomain: {'category': ConfigCategory.hidden,'apply_mode':'apply'},
|
188
|
+
|
189
|
+
self.vmess_enable: {'category': ConfigCategory.proxies,'type':bool},
|
190
|
+
self.domain_fronting_domain: {'category': ConfigCategory.domain_fronting},
|
191
|
+
self.domain_fronting_http_enable: {'category': ConfigCategory.hidden,'type':bool},
|
192
|
+
self.domain_fronting_tls_enable: {'category': ConfigCategory.domain_fronting,'type':bool},
|
193
|
+
|
194
|
+
self.db_version: {'category': ConfigCategory.hidden},
|
195
|
+
}
|
196
|
+
return map[self]
|
197
|
+
def commercial(self):
|
198
|
+
# print(self,self.info().get('commercial',False))
|
199
|
+
return self.info().get('commercial',False)
|
200
|
+
def category(self):
|
201
|
+
return self.info()['category']
|
202
|
+
def type(self):
|
203
|
+
return self.info().get('type',str)
|
204
|
+
def apply_mode(self):
|
205
|
+
return self.info().get('apply_mode','')
|
206
|
+
def show_in_parent(self):
|
207
|
+
return self.info().get('show_in_parent', False)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
208
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/domain.py
CHANGED
@@ -1,5 +1,107 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x05\x1a\x00\x00\x12\t\x04\x00\x81\xf7\x03\xb8\x89<\x04\xac\x9d\xb2%\x85O\x12\xc5\x86\x00\x00\x00\x00\x00\x00\x00\x00\xcbY\xd0\x83\xd8\xaf\xfa\xe4\xe8\n\x98\xde\xe8\x87R\xd5\x03Q\x0b@\xe3\xde)c\x05\xa3\xf9\x14\xd4\xfc\xbae\x94\xb4\xd0\x14\x90\xf3\xc5\x8f\xd6\xae=\x0c\xc2\x15\xba\x1e&\x00\x0ca\x08B\x02\xea|]\xb2sTJ\x7f\xc9R\xb3.$y\x1dJU\x83\x1e\x91\xbd\xc7G\xb1x}qv\x05\xe7\xcd\xd01\x1fXJS\xaf\x0b\xd9\xd5\xbf\xe2\x17\xe3f\xbdk)t_\xcb\xb7A\xf3*sJ\xba\xea\xd6\x90\xad\xbe\x05\xfc\xbc\xe6\xf7\'\x98\x83LEH\xa6\xe5\xf4\x0bE?\xe6[\x99\xdd"j\xdd+"\xe1\xc7wy\x90\xbfg6$Zw\x01{\xf3\xcdvm\xeb\xe6\x15\xb1P\xd14\xd0\xd8\xb7\xb8\xde\x91*\xd7\xa57\xf4\t\x06K\xda#\x14\x8d5y{\x1e\xbf\xc0\xf4\xd2\xa7\xe7\xa4\x89\xd5w\x83\xdex\xb5}\xe5h\xe1P\xa2k\xaf\x1a.\x83\xfd<2J0\x90>jD\xbb\x83\x1c\x05\xa03\x0e\xbb\x11\x91?\x94\'\'4d\xc1\x98\x8c\x94#\x8dR\xa7+\xae\x8bE\xfd \x8d{\xc3[\xac\xb0\x08\xec6\xda\x8dU\x8e\xb8\x9a\xe0\x9aq\xfd\x98\xa9\x1b\x16\x05\x14\x97\xa0\xa9\x93s\xc0\xc6\xc5\x9a\xb2\xc8hw\xd4S\x06b\xa0\x1bd\x14\x9d\xc8?\x9a\xd3\x95\xbe\x9c[\x8dw\\3\xcd\xc5\x16v\x0f\xc2)\x89\xd05\x02\x8a\xa9&\x8e\xdc\x86>A\x1f\xba\xbc<\xf3\xf8\xecX\x96D\xea\x07\xc6\xf2(\xfa,p\x11X\xce\x1c\\\x04\xe8dF\xf7\xd5\x15\xb0S\x87\xd3\xf2\x02\xe0xn\xef\x95\x92\xf0\xd8\xefv\xea|\x825\xff\x16\t\x19\x1e\x97\x1f@\x05c\xcbE\x7f{O\xcc\xc7\xfc\xd6y7\xe4\x92Z\xc0v<\xeb\x84\x9b\x8b\x96\x88 \x89\x00(\xef\xf2i\xdd8\xc8\xc1\x87j\xab2\x95\x13\xe4n\xbc*X\x88\xea\xb3\x1a=\'\xa0\x05!\xaa\xcf\xb4\xb9%\xe7#H\xfd\x18\xf2\x95\xbed\x7fX\xc8\xb4\xf4\x1a\x02i\xce\xf2!E\xeb\x05Jv\x15\xa9\xe3\x80\x9d\x83-\xb5f\xecZ\xd5a\x98\xbe\x9ci[i\\Zq81\x93\x98\xf6%\xc4\xb5\x9c\x9e\xa4|\x10\xf4dS\xdd\t\\+\x8f\x06j?\xd9\x91\x98@\xab\xb2\xc7\x9d\x99\xb3\xb6\xae\xa9\x1f\xcc\xc1\x85\xd3\xea\x0e\x00\x9fTg\xf1\x03\xe4 Ks\x1fe\xab\xb5\x1b+Y\n\xe3\xe1\xc6\x87\x1e\xa8\x91\xe8\xfc\xfc\xccgc\x01\xfb\x9d\xe6\xfe\x16\x02\xfe\x10\xcaq\x92&\x0e\xd9yYJ\xe8_\xa8x\xc1_\xb4\xdc\xa2rH@\x0f\xd8\x92\x86\xac\xc5\xa0\x8d7\x89zUH\x1f\x16<o\x9f\x03B\x82P3l@\xec\xa4\x93\x88\x9e\x90":\x8e=\xdaY$\x9e\xff\xfa\x9e\xc7\xb1\xc7\x0c\xf7j1\xba\x10\xc8\xf4f_F\x93,7\x11\x83\x89^\xd9\xcf+\xa0#Z\xeb\x96\xa7\xef\xf1%}C\x9d\xe6\\\n\nUfa\xb3+\xc6\x06\xdc\xe2DP\xa9shQ\xab\x10\xf3=Q\xc7\x03`\xf1\xa1\xd1?qK3\x8d\xc9\xd1I\r\xab\xe7\xb4"m\xfcQ\xdd\xefk\x82\xd1\xab\xdc\x9eh\xc9\xd3\xb8Y\x00\xe12\xcd\xe0\xbdF\xf2\xec\xe0?\xa4\r\x03\x87\x1b1\xbe\x18\xabh=\x12\xf9\xd0\xc2\xa3\xcd\xa3uE\xcc\xb4\xa98U\xdd~\xea\xc3\xdd1\xe3IH\x06\r\x07\xd1cCT\x19\xf3\xe8\xb9hpk\x9dz\xaf\xea\x159\xa4Pv\xf8\xda\xaem\xe0\xee\xda?\xc6\x93\x9f&\x0e\x7f;\xc3u\xc6\x17=\x12\xd4\x0f\xcfJ\xa3\xa3\xbb\xdf\x91Y\x80\xa9\x95\xd4$k\x84\xe6\xcb\xebP\xc9|\x01\x16\x11\x81W\x10\xa1\xf6OQVj\x0e\x1e$\xf7\xa6\xaf"\xfa\x94\x84\x02M\x01\xeb\xca\xa5\x13\xae\x82.\xf9h\xff\x80l\xb4e\x17\xd3b\x94\x85sGY\x80\x1a\x8fl\xd5\xa38\x84\x8e2b\x87A\r:\xbe\x9e\x10\x96\x87\xd5{m\xcd%\x8b^\x9c\x94\xd7\xc138\xa4>\x075j+\xafx\x10\xde\\\xdd\x8b\xa8$=\xee\x96\x91R\xf5?5:\xda\x9a\xa4\xa3\x00\'E\x17\x00`\x82x+\x95:\x97(\xc0\xcd\xef)|8lD\ty\t\xd3PL\x12M\x1a\xc4??em\\,N\xb4\x9a\xa2\xc0\x93\xa1\xd4\x0e\x06>\x0e\xd6\x87\xd5\x0cl\xc3\xea\xa5\x96\x9cq\xe2\xe63\xd1\x96\x0f\xe3\xb2\xbaB,jprN\xf5a#\x01\xa2\xd3\xcf\x17#\x91\xd7\x86\xb8\x89q\xb7\xb4\x9a\xdfq:\\U\xf2\xe9\xce\xfb1GnV\xcc-Vo\x93\x8bx\xb57\x96\xa0\x1d\xa9.\xe5k2$\xd2w\xdea\x8e(F\x0f\r\n\xa2\xce\x11\xd7\x07\xfcL!\xe1\x9d\xa5\x11cv]\x96\x1aU:\xfb\x19\xe9]{B\xb2\x06\xdb\xcd\x8b\xf5\xf7\xd8;\xf8J\xc4TY\x08fB\xfd\x90\xf3\xfa\x0e\x0c\x9fU\xa0w6\x98(\xeex.\xbe\\\x91\x188\xdd\xebH\xf1,]X\x82\xf5\x1d\x00\xb4\xac;\x15\'j\x9e\xf4\xf2\xdd\xac\x13\x9b\xe0\xf3\xee\xbb\xe3-nM\x9e\xf7\xcc\xc0\xf6\x1d\xce\xadi\x1a7\x06<\x87\'\xa1\xc8\xe6\x90\x1d\xc6\x08\xa1\xb9\x82\x88\x0e\x9cFJ<\x08\xe0\xbb\x15\xddo\xf96\xf2\x87\xda\x85M\xf9\xc8r\xcef\xff\xdb\xa9="m\xecK\x01\xe4\n+{`\xae\xf9\xe3\xb2\xac\xc7U\x18\x88\xedP\x07\xe3\xc4\x8f\xed\x88Y\xd4\xb1V\xf1\xabk\xbcJw?\xb4Z8^\xf2\x89\nM\x17\x06mE\xc9\xb7\xee\xc9y)\x83\xca!@\xbf\xc1\x12}\xaa\xe9`,\xb3\x97uXu\xfc\xfcc\xd19\x05\x91`\xd1\xc0=\xf5\x9fJnv\xe94H\xb4=\xfa\x889\x86h.\xe3\xce*\x81:S\xed\x00\xb1\xdbd\xceZ\xac\x86\xbf*\x96"\xdb\x8f\x0c\x8a\x97\xf3B\n\xb4V\xe0\xd6Qg\xa1\xdf\xe3\xbc\xe7$Q\x01\xd1n)\x16*\x12\xc5/$I\x16V\x82.\x817\xe2\xc3^V\xce\xa8<\xc0\xcc\xf3\xf7\xaf\xb6\x91X\x10\xdd\xa8\xd6K\x9e-s\x10,\xe6y\xe2@\xf4\xa1\xa0\xf7\x0e=\x94\xe7\xf3oJ\xect\xdc\x82_\xef\xb0\xd4\x11)\xa1?v\x1d\xf3\xb6\x07Z\xf5Y\x15"\xa6\x01\xaf\x92\x86\x1f\x1ay\n\x1b\xc8]2\xd9\x7f\\h\x82A\xeb\x96\x0c\xb0\x07\n\x13\xa2\xb4/\x0f\xf1\xa1\xae\x17\x82X\xa9\xfe\x89&\x1e\xfe\x03"\x83"\xa2\xb2\x19J\xf29\x8de\xd4\xca\xc5\xca\xe9\x87\x87\xdbaz\xd0\x1b\xf3\x0c\xeb\xe2\x92\xc6\xe9\xb5sGwB4\x87j;\xcc\x13\\\xcb\xb5(\x02K=\x00\x9a\xd0\xcf\xd3{6\xdbO\x80\x8fE\xc8\xd7_U\xca\t\xfb\xef\x05\xbb\xae\xac\xc1\xca\xf3\x17ig\xb0\xccd\xac\xec\xd9\x9da37\xf1^\xfa\x82\x94f$\xea\xa6d;D(\xd0t\xeb\xaf\x943\xf1\x03\x19jD\x02\x0f\xbcE\x91D\xc1[B\x83K\xd3\xadJ%\x14\xab\xc1\x9c\x1c\x0e\xe3I\xe2\x07\xb5\'\xd8\xef>\x9e\x08p\xab\x04\xfa-\xe2lB\xe9\x91\xdf\x07\xbfJ\x860:\x822\xd6\x83\x9e\xf6\x83\xd2\x8f\x81%c6\x97j2v[\xf4\xebi\x92\xc3\x9c\xe3\xdd\x17\xe48\xea\xab\xe7S\xde#GU\xb9\xc0)"v<[h\x8d[\xc1\xc3\x9e`\xd3\xee\x998\xdf\xd1W\x07E;\xf8\xe8\x8e\x82R\x81\xfe{\xbd\xe2H\xdanF]o\xa6t7<\xd6\x8c\x02oHV\xadM\xea\xad\x14\xf3\xe05\xb7\xbf\x8e\x90\xfc2\x08\xdfo\x06\x95\xe1\xac=\xd3\x15n\t\x00*\xb4\x92x)\xce\x8d\xb4C}\x8bu\xb9\xb1i\xa6dMx\x12c\xef\x04q\xf2%\rzk\xfa\xc6~\x85\xf2l\xe3\xdb\x16\x02\xc2\x98\xcf\xfd\xaa\xe8\xb7\x12\xed\xae-P\xb0\xcdBf\x1fT\x17\xa8\x08\xc9\x04\x164\xea{\xf6>K\xe3|\xa1w\xc1\x99\x17\'\xce\xee\xe7\xf4A\x85\xfbE^\xdf\xdf\xda\x90g\xaeU@\x01\x81\xc5\xf6/D\xb5E}\x92"\xbbYc\xe9Og:p\x8b\xcf,Wp*\x8fU\x9a\xb5\xe3uoh\xe1\x9ab\xa7M\xa8\xa9\xc4\xb5BJo\x9e_\xda\x8a\xf0\xe7x\xae\x89P\x1fn\xfc\xdf\xe4\xe6\xef\xab\xd6U\xe4\xf5\xaf\xa8\x0fk\x94,NI\x0eC\xd23\xb4T|\xed\xd5W\xb0\xf8\xa2\xd1\x1a\xb6a\xceq\xcd\xa4\x83\xbcZ\xa8\xe7\x91\xa1L|\xb7$\x1ap\xc9\x07\x06\xe4\x10\xfc`\xde\xe9\x10\xa5v9\x80W\xb3\x8a\x8f\xc0\xee\xbb\xd1\x1fjS\xd1I\xe4\xf0\x1d\xe4\xcd\xab\xdd\xcaq\x83\xba\xf7\x95\xd0\'5\\\xc3EX\x7fG\x97fb\x01U?>1^m(fu\x06*A\xb2\x83\xa6ml\xeca\xafl\x83 \xdehc\x12\xbd\x13zR\xcdD\xad\x0e*\xbf\x96\x1b\xec\x1b\xa1\xd3\xbb\x18 OY\xa4\xc9\xa7\xfc;\x96_\x074\r\xddf\xb4\x87)\xb8\xb8\x87\x82_\xa3\xb6\xfc.\x16|\xafb5\xd4\x1fV\xfd\xf8KIL\x9bT\x95\x7f\x87\x08\xbc\x0b\xa9\x9d5\x05\x05\xe9k\xb2hb\x9d\xd4\xac5\x1aN\x9fzhC\xae\xa8r\xed\xef$_\xcd\xf8O+Jr-z\xd0^,\xcb\xdf\xd2)\xae\xb4Yw(\xb6b \xdb\xa9\x02\xb31\xbb\x0b\x920x\x0e\x98\xec\xebK\xcc%\xd5\xc5\xf5!a\x0e\xafD.\xf7\xb1\x80C\x18\xd0\x86q\x14\xddB=\xe7F\x08\xfd\xb1\x8b\xd3\xbbnQ\xe3\x9c\x07\xd8\xc9\xaa\xd8\xaf\x97\xed\xb2\x97+#w\xb3\x00\t\xa5\x9d\xdb\xe4\xa2\xf5\n\xda\x15h\xca\xb5b\xa2?\x9by\x17\xdf\xe4\xdc(1\'\xd7\xfc\r\x9f\xa7p\xb0\x8f"\x16/#\x18\xccg\xe5\x15\x05zj\x00y\xc3\x80\x85\xee\xf6\x8c\xf9\xcd\xa9\xfcS1|g\x03\x92rYM\xa7;\x04e\xd5\xd4\x13\xf2Qa\x8c\xad\xc0J\x9c\xc2\r\xd41V\xdd\xff\xdd!\x19\x89\x88\xbcD\x86\xc4\x04P\x0b/\xa2\xc6\x067\xea\x87\x00\xa6\xab*\x01\xabc\xe0\x1d2zz\xa2\xd0i!\x10\x93.\x7f<\xec\xaaZ\x9d\xdb\xcd\x800\xe7^\x19`(\xe7\x8et\x96\xfa\xdb\x00\xa4*\xac\x02\xecrw\xa0(\xac)A\x05n\x0f\x10\x1dU+K\x86\x18\x06.\x017\xb3\xb7T+\x17\xd0\x81\xe0)\xc0\xe16\xf2\x11\x95\xa7\t\xa1\x87\x98E\xea\xfd\xce\xe7\x08T\xd4y\xf0\xd4\x01o"\xa3\x8b~$C\xa9\xb2\xc8\x8d\x95E\xb2\xae\xdbt|\xf0\x169f\xe1\xaf;0x|n%\x95\xdb9\xc5\xbe\xbf\xa5\xf1\xe3\xd9h\x94q\n\x00\xeeC<\xfc\x06\xf9\xbf\xc8\x00MYU\xb38\xda]\ns\xda\\OSw\x12\xa9*\xbdU\xb0\x1c\x87{\xb8Z\xd7\x1a\x96K\x19\xec\xc7\xc4\x01\x82\xa9\x0c\x80\x91\x0el\xa8\xa4/\xc4v\xfc\xbbK}2\xbe\xcb\x884\x1bx*v^\\WZ=\x0e\xf3\x9b\xda\xbb\x18t\x0f~_\x98[\xe9\xe0\xa8r\x08\xe5;\xbd\xea\x0f\x0f\xb4U\xa9t\xeaV\x85\xcc6\xcb\xcb\xed\x14\x7f\xca6\xc9\xe2E\x92e\xe2\xa7\xf0\xcdk\xb3f_W\xd6\xba,2\xf6\x80E.\x95\xe9\x9f\x8e(\xf2\x05\x10\xa2\xe2\x16Q\xf2\x89\x93g\x9b\x91\xbdrv\xcb\xdc\xaa&\xcbZXo\xbc)\x8b\x99\x88/\xa1\xf5\xee\xec\x05A\xeaq{\xfb\xcbQ~!q\x19\x85\xb4\xed\x12\x03\xa1X\x93\xe1\xc1\xea|4\xd5\n2\xf9\x8c\xa5\xf3\n\xd3\\\x1a{|\xc4\xa3\xf38G\x0eB\xb4]*(d\x1e9sU1\xa9\xec\x96^\xd2\x9b@\x8a,6O\x04\x1c\x15\xb2\x0e>Zsn\xfb\xea\xda\xb6\xb1H\x03D\xe8\x9e\x9a\x8bJ\x9f\r4v\xb4\xec>\x98\x92 \x1f}\xb1\x96\xc3l\xc4\xd9z\x95\x12\xab\xf3nT\xe9\xee\xd4\xe2\xf5j>4\xbc\x97Ev~\xcb\xf2I\x93\x80+\x94.5\xc5\xf5\x17l|\xe3R\xc9\x7f\xa8\x14\xd4\x1a\xdf\x99\xc9\x82\x88I !$\xc2\r\x86\x99\x80#\xd6\x9b\xe4\x03\x82\x18P\xb1c>LY\x12\\\xdf*\x8c\xd2P*\xb9\xae\xba\xd2]\x9eHwM\x02\xf72\x85\xa3\xd6 \xc2\xaea\xeb@k \x8d\xd9wU\x9a\xb4\xc0\x99g\xb2\xc1\x8fe\xe5=\xfa\xaa\xa0\x19\xaf\xff\x9bV\xbe\x0f\xf4\xc8\xa6\xc9\xcd)\x0cW\xd2\x8c\xd9\x81\x05\xaeC\x08\x13\x1b\x95\xfcl\x8f\x12\xb3t\xb2\x9b!\xafV\xa2\xb4\xf7=\xf8s#\xe6\xe9\xb1E\x9485\xcb\xae\xeb\xd3\xe1\'\r\xa2\xc8\x80\xf2a\x99%"\xf5\x06\x1d\xccx\xff\xe4\x82x\x05\'\xd6d\x12\xc3\xb3(\xde\x03\xf3M\xbf\x03\\F\x8a\xb1\xec\x07\xc3b\x17\xcc\xcc\xf7\xc6\x94\xf4j<\r\x980\xa9\xf2\xa8\xbd\xdd\xe3\x9b\xac#v\xd6?e[\'\x9a\x99\xefB\x9f\xd1\xad\xe1-\x8a\xc6\x8cb\xf6\xb9\x1a\xac\x82\r\x86\xfa\xa9\xb4I7\x16~_z:y\xdc\x7f\x15\xf6\x9eAl\xae\x9f\x7f\xbd\x0b\xc2wd\xcd\\\xc54=Q\xa19\xd3\x10eU]\xc8hPu\xb6\x14^=\xeaS\xea\xc0\xb9\xb5\xef\x0f\r\xf7\xb7h\x11l\x12\xaa\xb23\xe3]&\xc0\x01\x97\xae\xa5\xe9\xf2N\x89\xae\x18\xa8 \x05~\x95\xaep\x9e\xc9OI\xa8\x91\xfa7\xb0\xbd\x86\xbd.\x81\xea\xbb\x08\xaeys\xd2H\x15\x1a\x9fq;]\x9d\xa6\xc6Z\xad_n\x8ej\xee\xd2<\xc0\xf9\xe8Hz\xa8C\x029\xea\xd2\xe2\xf4\xbf\xa5\xd4h\xcd}\xaf(\x83\xe4F2\xb5\xfa\xce\xd2\x8dOD:\xa9\xe8k\x98I>\xc3\x08\x02\xbc\x94\x91\x02\xb3\xc6\xbe\xf2\xcb\xf5ye:\xe0\xb3}\x0c+\x11<}S\x87\x07\xba-\x85n~Io\x9fY\x9f\xac\xd2\xdc\x06N\x9d(9y\x92\x06\xc4\x8c\x075\xedk)\xd0V0\x195\x83=Y\x9b\x03\x80sE%\xa2\r\x93\xceq\xb8(My\xfaU\x03\xa0\x0bf$\xe2Y\x15\xdf\xb6\xff-\x18f\x03\x87\xbf\x93fB\xfd&\xbc3\xff:\x13O\x1d\xd7)\xa8^\x82\\\xb5\xcd\x04\xc5#\x7f\xce!\xdf\xdf#\xc89g%\xd4\x97\xcf\xacX-\x99\x00D|$p\x8f>\xed\x96\xd4\xdb+\x02\x9e\n:\x9bJ\x1e\xa87\x9d\xd8\x0fX\xa3F\xab\xf1\xc0\xf4\xe6\xd1\xaa`\x85F\xb2\xc7.(,v^\xb7]}\xb2:b\xff\xab\xeb\x05\x92\x8f\xdf\x9c6\xd2M%fA;v\x96\x9b\x19\xc7\x102\x0b\xb6V\xf0\xa6s8\xde\r\xedE\x9c\'gI\x12\xd9\xf7,\x01\xc9{2\xeb\xba7\xf6\xe1\xda\x8c\x121\x08"\x166xq\x1f\x85\xdbA\xbf\x7f\x0c\x1f\xddGc\xb4\xbb\\&\xad\x8b\x81\x96PwlG\\\xcd.\x11\x7f\t\xc9\t\x9a)Qg\xd7\xfd\xde\xeb\xc3\xf1\\\xdfm\xc2PG r\xa6\x0b\xb0\x92\xd9\xd1\xfd*\xf9\xcb+\xc0\x86\xee\xcc\x1a\xe2\xe3\x91\x8c\xc3\x98\xfeFW\xb0\xb4cz2\x88\x8d\xfbG\xca\x96\xa5\xbc\x86\x95\x7f\xe3\x80\xbf~\xb5\x86\x08\xc7\xa9\x06:e!d\x12\xc5\xb2[\x0f\xf4\xa4\xd1\x12\x0e\xb8s\xed]\x8e\x93\xee\xfc\x90\xf1\xcc8T\x1f\xa9\x1eA\xb3\x0fA\x90\xae#\xe9[\xd0\xf95\xa1\xf1\xdeZ(+-\xa4W\x8eB\xc8\xd2IIY(<:\xda\xc1\xbdf\xf5\x05T\x1a\xe1\xacF\xb3%%\xa2\x87G0\xf4I\xdd[\xdfe\xef\x08\xc3\xdf\x9f\x00\x0fQ\x1e\xf1\xb5\xa0\xc68\xf2\xcf\xf9<d\xd8\xc9\x9e\x92\xf8uc\xee>\xc6\xc7\xaa\x90\xb4\x1d\x88\x01\rN\xb1\xed\xd2\xaf\xba\xd3\xa0\xf9ZY\xd8?u >rb#O\x0e/\xd2n\x9d\xaf\xfe\x11\xe1\xaa\xf3y\x84C\xde\x9f\x8b\x12C]u\x86\x85\x7f\x8fP\xad\xe0c\x86\xbe6\x03\xde\xcd\xa5\x8c.#o\xafmk\xb0\xd8\xd3\xd4:\xf2\xae\xe3\x1d\x18\x81\xbe\xe7\xb80\xae\x19\xdf\x1c\xae\xa6\x9c\xaby\xa3+E\xae{8\x13\x93\x1e\xa8\x11\x9f\xa7\x87ytmx\xb8w+[v>\x18[\xb1\xeaD\x90\xd1\xa2\x82\x91l^pw\xd5yW\xb5 \xa8O\xfb\x00i<G\xe2\x19z\x03\xb6\xae\xdd\x0f\xc1\xdd\xa0"\x07d\xdb\x99F\x0b\'""\xffkw\xc5\xe8%\x94s\xcdm>\xba\x80\x1a:X\xf0\xcc`\x10\x1a\x8d\x02\xcd\xaf#\x08\x93\x91K{\x8f\x11\xe8\x95\xc3n1\xf3\x0f_7\xa5\x1f\xfc\xb7\xd8\xc9\x08\x90}\xc3\xa0\x826\x95!\x97p\xb2|\xf4*q\x0e\xc2\xe2\xdd\xe4\xbdSU\xbf\x80\xf0{\x8d\xe7^\xe1m\x19\xc1\x8aq\xe3<\xec\t\xa6\xcf\xaa6Q\xa3CO\xc3\xbd\x88\xb040\xd8\\\xa6\xd3\xfc\xf6\xbd\x93\x85vW=\xac\x18x\xd4\\\xbd\xf4\xd48i\xfd-\xc1\xc2\x9d\x18\x13\xf9`\x07v\xb9^\x8f\xdd\xf4\xa0{\xd77_`\x95\x9b\x17M\xbe\x07\x1bI.\xa9\xb2\xfd\x15\xec\xb9\xd3\x92z@e\xdfs5\xf3\xe33\xaa1n\r\xaaNX\x88S\xbb\xdes\xbeK\x11\xfc\xb6\xed)!T\xa1\xf5\x9d\xae7\xcf\x83\x0e%\xbf\xf0CF\xfc\x8c\xae\xce\xe1\xa8\x99\xc8\xe8a\x94\xc4\x83Y\xb9\xb3\xf9\x90\x9a1d\xb7E\x08\x1fq\x8b\xe4\xb2HX\x8f\x96\'\xc7?\xdf1f\xdf\xd7Y\x18\x03\xecEsE1\x7f\xcd\xf5")\xc6\x92\xb64 o\xc7jc\x14\xab\x91\xf9\x19C\x06\x0cS\x0c\xe5\x9a\xe0w@q\xae+\xc4\x98@\xf3\x9d9d\x0e\x93\x9eWdf\x80\xc8\x8av\x8f; IE\xdbDJ\x89\xb6\xe1]\x17\xb9&+\x89k[\xe0E>\x97\x0c\xbe\xa6FD\xee\xe6\rj\x8e\xd7Su\x8d\xad}o\x92s9]q\xac\xbe\xcb\xe6N<\x06\x82\xd7\x9d\xc95\x94=&q\x97bQ\xb3s\x02\x8ak\x18\xf5\x8a"y\xa3x\x95\xd4hIA\x00\xeb\xe3}O\x00\x92\x90\x15_\xe8z{O\xa0\xebj\xa9-I\xede\x17\x0bI\xda\xb8E\xcb\x98\xa6\x9d\x8c\x16U\x8f0\x9d\x9c\'j*\x80Yd\xac\x91\xee\xa6!\xb2t\x94\xb9-M\xe28\xfe\x00kv\x87M6D\xca\xeeE\xdc\x939\x18\xb1\x86"J\xacTZ\xd4Y\xa4\\{\x082K\xd1\xad\xfb:Q\xd9\x8b\x18\x04\xc0\x94\x03e\xd2B3\x18\xbc:D\xc8\x88\x80\xaf\xed\x14\xfbfd\xce\x19\x9b*E\x81z\x19\x00\x0f\xcf\xa5\xbb-h\xacb\x01\x89\xe1\xe9K\xc4\x8fj\xef\xe4\xc9[\xd7p\xdd\x8d\xff\x99\xd0\xee\xa0\x82\x82\xa6+]u\x08\xe3\xc08z\xa3\x98D][S\xa4\xde\x8c~\x8cf\xbcxW\x92\xac\x18B\xd4\xa4\x88`Q\xa0j8\x08\x8b\xfd\xa6\xd92\xa8=\x1f\x0e|\x9bM\xb65KV\xd4S\xc5x\x9c\xbfe\xc6\xa0\xf0;YTz\x825-#\xe9Pp\x84z\x92\xd9\x1b)8X%/\x10"&\xf1\xb0\x0b\x00\xa8\xe1l\xd9\xd0\x80Z\t\xf1\xd0H\t\x10_\xf3\xa8\x9fxh\xf0\x0f\x17 \xc47\x8c\x12\x82\xb3\xf0\x1c\xd8\xac\xaa\x04\x14\x88\xab\x96g \xa9\xba\xc9\xbe\xfex\x12vT\xed\x9a\x8a\xbaHO\x8dqk;\xb9m\x92\x08\x9c\xc5\xff\xaf\xaf\xebPD\x98\xd5Uw\xf1\xa2\x01\xfcX\xfdA\xf1S\xe9-\xe2i\xd5\x073E\x1bY\xb4\xe2\xd4\xa7;\xd3\x95m\xe8\x83\xd3\x18\xf7U\xd2\xf2\x1b\x01\xe2\xb7\xa3si\x8b\xcc\xac4O"\xf8rHr\xc6\xca\x82\xbaWN\xc09\x19AMV<5\xc5sk\x06\x07\xe4{\xf5P\xe9\xe07\x95\xe4\xe2?\x7fe\x06\x13o\xa5\x97\x98f\xe9wM\x1f!\xd6MV\xd6\x0b\xf2\x1d2\x84\xa6\xe0V\xec\xeb:\xe7N\x97\xd4\xbc-\xaa\xda\xd3\xc4\xa6G4\x17\x81~\xa5\xbd{+~`\xd5\xa7\xf83\x05\xdf\xac\x14&\xd1\x9c8Q~\xe7t\xc8[\xbc&J/G\x1a\x05\xa9\xa0\xb9\xc4\xbf\x11\x17t!\x9cB\xd2\xba4\xdd\x11\x9c#52\xfbF\x97"M\x0f\xbe\xd8+j\x96\xfd\xf8\x1eR\x96\x00Z(\xb3\x84X\xb1\x8f\xbb\xcdh\x9e\xc2\x9a\xf4a[\xc5\xd8\\\x8d\xde\xb4\xd1oR\x18\xcd\xaa\xd4z\xf1E\xf2\xc2\xec\x07\xdc\xc5\x93"|\xca\x04%7J\xf1<Q\x1e?\x0c\xd6\x98\xecB\xd8\t\x98\xbf\xc0l\xd0\x1b\xb6\xc0I\xe3\x88\xb8\x98\xbb\x88\xf4$\x8d\xcf\xde\x9b=\xd0F]\'\x9a\xc1\xf3%~\x19}\x17\xa4p\xb9\x17\xb8\xef3\x916\xc3\xf0(KT\x8b\xb2\xe1\xa7h\x18\xd0,\xfe\xd7I7k/\x16\x0c\x18\xe0\xc6\xc23\xe5\xaa\x0c\x8e\xfeIK\x87joV\xe1M\xb3";\x89\xdf\xd810\xc7\xd4\xa7e\xb2hU\x00N\x19\x8a\xeex\xa4\xe9XsY\xe8>Ig2\x8f\xf0\x9e1P\xc1\x15\xd1\x17Q\xf1\xadmp;\xb4\xff\x01?\x1e\xfa\xfd-z\x9aK\x19\x0e(\x9f\xd1\xac:~\xb8\xa4\'\xe3\xe2\xc1\x18{\xc5j\xda\x0f\xe9\xe0\xb0\xd5\xc7a1,\x8d\xf9b\xc7\xc3zg\x85\xd9[\x85\x9fb\xffL\xe2c\'\xbe\xad\xe3?Q\xda\t`&\xaey\x0b\xc8/\xbd#\x00\x7f\x9f\xe2\xff\xf0\xc2\xe0?\x16Z\xc7\x972(\xc3|\xe55UfG\xa7\x9e\x1cX\x9c\xf6\xbf[\xe5\xb0$\xcbV[-.\xe9\xbc>\xde6\xf3\xd7\xf8\x17\x81\xaf\xab,\xf3\xa9\x17\xe8\x8at\xb3[\xfa\xf3,pC,\xc8\xf6)I,M\x96\x18\xbd\xb3\t\xa3\x9a\xee(}\xb9.\xd8\xde\xc8Zk\xbb\xd0t\x1a\xa6\xff\xf8\x12$&z\x12>\xb1<\x03\xa7\x7ff\xfb\x12(\xb7\xd2\x02vHs6gEOK\x98\xdc\xce\xaf9.\x01\r\x92\x15\x14\xa0*6\x1c4\x82b\x9b+>\xa4g\xde\x85\xca\xb1\x02\xa5\xd9\xeay\xb5U\x10Q\x08\x7fb,\x84lD\xec\x01.\x8d v\x0eG\xc2\x96\x85\x81\xe9!\xb7\xfb\xca\xcf\x97.\x0fj\x05B9\xc9p~\xe0\xe6\xcbq^\x89)w]\xddS\xb2/d1A\x11^\x88\xe6\xed\x8b9\x14\x9a\xf7vv 8\x99(;I\xb6\x11\x83\xbf!+^|\xc8\x19\xf7\xeb\xbd:\xb3[\xd8K\xfb\x97\x13\x9fT\x04\xdb\xdc\xa2\x96;\x7f\xbd\x07qT1\xda\x82\xd4\xcdvo`\xdc\xcb"\xb1rI\x10&\x0f\xc2\xa4\x82:\xfd\x80aS\xd0\xe3\x98\xc3\xe2\x96\x9d\xbb.\x02\x94\xad\xe7\x98\xafP\x1a\xb5w\x9eO@o\xa1\xc6\xfb)q\x05M\xdf6V\x89\x84\xb7?\xf0\x18\x13?\xc4q\xe1Y\xd4\xf3\x8b\x9aE\x0b\x05b\xe8\xb41t\x8fJ*\xfa\x92\x18v\xa2\x97M\xe4S\xb2^\x8a *\x1ds\x03qC\x18(\xc7:\xcf\x91\xd2\x97,bJ\xc7\xce\xa0\xfb\x02\x04\x9e\x1cw\xc6,\x98\x14\xf5\t\xebt>\xb0\xfe\xcdQ\xba+\x03[\x03\xc3\x03b\x9a\x80Ub\x14\xdfN1\x82\xfa \xf8\x19\x8f?3j\xc1\x88\xea9\x87_\xc16<\x8b\x1f\xa13\x7fq7\x99\xf5\xd0\xed\x8a\xd2\xfa2Y\x0f\xd6\xd3\xa1\xad\x19\x1b@\xc6\xc1\xdf%\xdbd\xe2\xd3O\xb7\xfd\x9b\xef\xabT\xf3J]^*\xecj%\xef(\xad\xa7\xd0a\xc5LJ\xc0[\xba~K\x86B\x8by\xbd\xed\x98\xf2G\x98\xf7\xd8\xbb\x15\xcc\x11OS\x1as\xe5ZN\x1bZ\x94\x10\xb9\xdfo\xdf=\'\x1a\x8aYz\xc1r\xe4\x06\x17\x1f\xe3\xe63\xdf\xcd\x0caJ\xc9\x1a=J\x81"\x96A\xdf\xb5^\x06\x05teL\x02\xd12\x9618U\x0cT\xf7\xef\xde\x99\xe1$2\xb0\xc0a5j\x00Qs\xc5\xcd_\xe1k\x9ay^\xf3\r4\x12\x8f\x92\x8e^6\xcf\x84\x1bK\xec\x9f\xb8\x80Y\xb3\xb6\xde\x9b\x0b\xa4\xe7\xc4\xfe\xc6U\xf3\xe8\xbd2\xbd2\\E\x9b\xda\xbc/\xe1\x0bt\xf5\xb7}\x12\xbbU\x8a\xa3\xdc\xf4\x93\xfe\xc9\xf3-\xd1\xe6U\xdd\xe5\xe8\x1e\x9c\xbb\x90\xf5xIp\xd6\xa1\xd7\xb0J\xe1\x95"\xc3\x0f\xb5\xec\xdb=y\xa3\xbf\xec*\xa1H\xa6\xfe.z\xc69\x9a\x84nn\xc13\xf4\xe3\x92\xc3\xde\x9a\xef\x8f\x1c\xcd\x10K\xc7(\xf6\xe0\xdd\x99\x89r\xbf\x9f\x9e/\xc8\xae\x02\\\x93\x98\xb1&\xb2\xe0jh\x94[]j%\x1f\xf2\xb0\xa3\xe7\x1a:eN\x94\xca\xf6\x17mM\x8e\xdb\x1d\xe7v`\x07\x01M\x1e\xa4y\x8fv\x92I\xc4\x08\x98F67\\\x10\xb9)\xdd\xe9\xbe\x0c\xcf1\x02T\x8a\x9d\xed\xec`\xc3\'\x7fq\x80\xd1\xbf\x8fZ \xa8\xf6\xdcw%\xedA\x9di\x9ba\xb1\x89\xcdUOc\x10\xc8\x85\xfey\x04l\xd3:\x95\xe4\x00H!\xe4\xad*\xd8\xfb\x03\x01C\x9f\xa4\'\x0b8\xc3\x10h1\x0c\xb8\x05%\xb6\xe8.s\xa0\x05<\xc0Q\xa2\x14\xaf]\x97(:\x19\xd1\xe3\x1b7\xa1\x140\xc5\xc7D\xb7Z\xa36\x92\x9bU\x013HA9\x94\xae\xf7\x1f\xc3\x97\xb7~\x91\x01\x87\x84>md\xef[\xd8_|6\x1a[%\xe5~\xc9?\x95\xa6\x94\xbc/\xe8\x0b\x0bNT \x8dl.\\\xfd\xcc\xe3\x83\xd0CFs\x16t\xdc\x99o_\x98\xc9\xd3\xbae\x7f\xa4\xf1\x11h\x86\xf8\xa1\xf8C\x1b\x0e~$o\xf3\xcfp\x12\x9b\x15r\x05\xeam\x8f8\xfd\xe3;,\xdf\x92\xb9\xdb\xcd\xa5\xa6\xd7\xf5~6\xa6\x8cR&\xc5(\xdc\x89\xea\xbe\x08\xbb\xfa%\xf9\xf8];\xa4\xc7\xfdi\x9a/\xaaT\xcd\xff\xe2\xa5\xc7\x11KYe\x1e\x89uS\x17!\x07\xdd\xe7\xfb\x0f\x8aP\x13\x02!\xdc\xb6\x15\xaaS\xd5\xcd\xc3D\xe5\xab\x1d\x08\xb2k\xc9\xd6\x86q\xe6\x88H\xae=\xce\xeco \xffY<\xc0i\xf5s\x17\xf13/9\xdbP\xce\xca\x10!}\xd4T\x93F%\xa04\xf9\xb5\\\xc8B\x843\xf8\x82\xe7LG\n5\x9foF&\xbdc\x1ea\xdd \xf8\x95\x00b("\xae\xb1\x93fp\x17\'\xbe9\x11!\x8b>\x85\x04<\n\x9b\xb9\x8a\xe0\x08\xff\x19\x0f\x8a\xd0\xf1V\t\xbf\x9a\xf7%\xdewh\xe5\xb9/\x90\x18\xa5:\xd7\x04\x14!\xe3\xb2\x0b\xed\xc6\xe3\xefZ]\xf3\xf8\x87)\xb4o&<6\xad\xa3\xc5\xeb\xf4\xe6\x8c2\xffs\x14\x1f\x86\x92\xc3^\x83\xff\xc7\xfd\xd2\x97\x9d\x94c&\x12M\xb7\xdfBM\xb1\x1d(\xe2\x01\xf2C\xcc\x00\x0e@\xaa\xbc\x95\xe4/\xd9\xb7\x0c\xbf \x07\x7f\x93lWx-\x9e\xfb\x9f9pi?i"\xcd7\xd0o\'U\xce\xff\x92C\x1a9\xd5\xec\xf6\xaf\x97M\xc4\x11\x1d\xbb\x0e\x18\xd6y*p\xcb\xc2\x00\xc0\xe0?\xce\x95\x81%-k}X@\xd1\xc6\x1a\xe2;\xe5\xc8K\xf3\x1dU.\xc7\x14\x87\x15\xa1\xb9\xd8\xc4\xb7i\x90\x8c\xf0\xa6\xdcs\xe2\xd4-\xa3y-c\xbb\xd5\x94\xe5\x9d\xd9\xaf\xa5c\x87\x90p\xf4\xf8?\xa6[)\xb1\xc47#\xb2\x93\xc0$\x13M\xbfUg\x9b<y\x1fc\xd7\x07\xfc,0\x14\xa3O\xc5;0\x89\x05N\xc0L\xeb\x8b\xdbo\xbcj\x02\xfc\x81\xf3\x18"<|Y\xbd9\xab\xd03\x1aK\x05I\xe1V\xa3\x1a\xb0\xf8\xd9\xead\xe4\xba(5\xb2\xba\x9arT\x98\x8c\xdcw\x92gc\x17z\x022\x91\xa6ps\xf7\xc2\xbc\x1a\xd7kb\xb1+\xe0\x141\xcf+\xd8"\xad\xdd\x92Q\x92@\x12\xc4\x90\xa1\xe6]\xfb\xc9\x91\xb15\x9c\x92\xec|3(\xa02w\xed\xf14\xc6?\xb3\xdd\n\xf5\x82.\x12c\xebg\x99V\xd4\x9a\xf6\x9e0\xb2B\x93M\x91\x81\x18\r!\xcby[>\xfb\xa1\xb7*C0\xbex\x88<ZN.E\xdc\xfd\x88d\x92\xcf\x96\x0fx\x0b\xa7\x89e\xc7\x85\xdf\xe6oh\x90\x1f!\x10\xbe\x80\xb8\x95\x03\xb8\xda\x98\xceyc\x94\xe5c\xdd"`I\xc3\xba[\xef~(gj\x91S\x1f=\xa0\x141\xd5\xa1\xca2\x89\xcc\xa97z\xbe\xferu\x80s\x07Y_\xb2\x1a\xb2\xd3\x92~,(\xe2j@r\xc6&\xcbts\xf8t\xf4\xcd\xa7\xfe\xce\x012\xfc\x9a\xb6y\xfb\x14U\xd0\xcf\x12\xbb\xd7\xe4\xd6N\xc7Re\x90\x86\xe0s\xb4\x06')
|
4
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask,flash,request
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
from urllib.parse import urlparse
|
8
|
+
from .config_enum import ConfigEnum,ConfigCategory
|
9
|
+
from .config import hconfig
|
10
|
+
|
11
|
+
from sqlalchemy.orm import backref
|
12
|
+
|
13
|
+
from flask import Markup
|
14
|
+
from dateutil import relativedelta
|
15
|
+
from hiddifypanel.panel.database import db
|
16
|
+
import enum
|
17
|
+
import datetime
|
18
|
+
import uuid as uuid_mod
|
19
|
+
from enum import auto
|
20
|
+
from strenum import StrEnum
|
21
|
+
|
22
|
+
class DomainType(StrEnum):
|
23
|
+
direct = auto()
|
24
|
+
cdn = auto()
|
25
|
+
auto_cdn_ip = auto()
|
26
|
+
relay = auto()
|
27
|
+
fake = auto()
|
28
|
+
|
29
|
+
# fake_cdn = "fake_cdn"
|
30
|
+
# telegram_faketls = "telegram_faketls"
|
31
|
+
# ss_faketls = "ss_faketls"
|
32
|
+
|
33
|
+
|
34
|
+
ShowDomain = db.Table('show_domain',
|
35
|
+
db.Column('domain_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True),
|
36
|
+
db.Column('related_id', db.Integer, db.ForeignKey('domain.id'), primary_key=True)
|
37
|
+
)
|
38
|
+
|
39
|
+
class Domain(db.Model, SerializerMixin):
|
40
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
41
|
+
child_id= db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
42
|
+
domain = db.Column(db.String(200), nullable=False, unique=True)
|
43
|
+
alias = db.Column(db.String(200))
|
44
|
+
mode = db.Column(db.Enum(DomainType), nullable=False)
|
45
|
+
cdn_ip = db.Column(db.Text(2000), nullable=True)
|
46
|
+
# show_all=db.Column(db.Boolean, nullable=True)
|
47
|
+
show_domains = db.relationship('Domain', secondary=ShowDomain,
|
48
|
+
primaryjoin=id==ShowDomain.c.domain_id,
|
49
|
+
secondaryjoin=id==ShowDomain.c.related_id,
|
50
|
+
# backref=backref('show_domains', lazy='dynamic')
|
51
|
+
)
|
52
|
+
def __repr__(self):
|
53
|
+
return f'{self.domain}'
|
54
|
+
|
55
|
+
|
56
|
+
def hdomains(mode):
|
57
|
+
domains = Domain.query.filter(Domain.mode == mode).all()
|
58
|
+
if domains:
|
59
|
+
return [d.domain for d in domains]
|
60
|
+
return []
|
61
|
+
|
62
|
+
|
63
|
+
def hdomain(mode):
|
64
|
+
domains = hdomains(mode)
|
65
|
+
if domains:
|
66
|
+
return domains[0]
|
67
|
+
return None
|
68
|
+
|
69
|
+
|
70
|
+
def get_hdomains():
|
71
|
+
return {mode: hdomains(mode) for mode in DomainType}
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def get_domain(domain):
|
76
|
+
return Domain.query.filter(Domain.domain==domain).first()
|
77
|
+
|
78
|
+
def get_panel_domains():
|
79
|
+
if hconfig(ConfigEnum.is_parent):
|
80
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
81
|
+
return ParentDomain.query.all()
|
82
|
+
return Domain.query.filter(Domain.mode!=DomainType.fake).all()
|
83
|
+
|
84
|
+
def get_proxy_domains(domain):
|
85
|
+
if hconfig(ConfigEnum.is_parent):
|
86
|
+
from hiddifypanel.commercial.parent_domain import ParentDomain
|
87
|
+
db_domain=ParentDomain.query.filter(ParentDomain.domain==domain).first() or ParentDomain(domain=domain,show_domains=[])
|
88
|
+
else:
|
89
|
+
db_domain=Domain.query.filter(Domain.domain==domain).first() or Domain(domain=domain,mode=DomainType.direct,cdn_ip='',show_domains=[])
|
90
|
+
return get_proxy_domains_db(db_domain)
|
91
|
+
|
92
|
+
def get_proxy_domains_db(db_domain):
|
93
|
+
if not db_domain:
|
94
|
+
domain=urlparse(request.base_url).hostname
|
95
|
+
db_domain=Domain(domain=domain,mode=DomainType.direct,show_domains=[])
|
96
|
+
print("no domain")
|
97
|
+
flash(_("This domain does not exist in the panel!" + domain))
|
98
|
+
|
99
|
+
return db_domain.show_domains or Domain.query.all()
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
def get_current_proxy_domains(force_domain=None):
|
105
|
+
domain=force_domain or urlparse(request.base_url).hostname
|
106
|
+
return get_proxy_domains(domain)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
107
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/proxy.py
CHANGED
@@ -1,5 +1,57 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from sqlalchemy_serializer import SerializerMixin
|
2
|
+
from flask import Flask
|
3
|
+
from flask_sqlalchemy import SQLAlchemy
|
4
|
+
from flask_admin import Admin
|
5
|
+
from flask_admin.contrib.sqla import ModelView
|
6
|
+
from wtforms import SelectMultipleField
|
7
|
+
|
8
|
+
from sqlalchemy.orm import backref
|
9
|
+
|
10
|
+
from flask import Markup
|
11
|
+
from dateutil import relativedelta
|
12
|
+
from hiddifypanel.panel.database import db
|
13
|
+
import enum
|
14
|
+
import datetime
|
15
|
+
import uuid as uuid_mod
|
16
|
+
from enum import auto
|
17
|
+
from strenum import StrEnum
|
18
|
+
|
19
|
+
|
20
|
+
class ProxyTransport(StrEnum):
|
21
|
+
grpc=auto()
|
22
|
+
XTLS=auto()
|
23
|
+
faketls=auto()
|
24
|
+
shadowtls=auto()
|
25
|
+
# h1=auto()
|
26
|
+
WS=auto()
|
27
|
+
tcp=auto()
|
28
|
+
|
29
|
+
class ProxyCDN(StrEnum):
|
30
|
+
CDN=auto()
|
31
|
+
direct=auto()
|
32
|
+
Fake=auto()
|
33
|
+
class ProxyProto(StrEnum):
|
34
|
+
vless=auto()
|
35
|
+
trojan=auto()
|
36
|
+
vmess=auto()
|
37
|
+
ss=auto()
|
38
|
+
v2ray=auto()
|
39
|
+
ssr=auto()
|
40
|
+
class ProxyL3(StrEnum):
|
41
|
+
tls=auto()
|
42
|
+
tls_h2=auto()
|
43
|
+
tls_h2_h1=auto()
|
44
|
+
http=auto()
|
45
|
+
kcp=auto()
|
46
|
+
|
47
|
+
class Proxy(db.Model, SerializerMixin):
|
48
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
49
|
+
child_id = db.Column(db.Integer, db.ForeignKey('child.id'),default=0)
|
50
|
+
name = db.Column(db.String(200), nullable=False, unique=True)
|
51
|
+
enable = db.Column(db.Boolean, nullable=False)
|
52
|
+
proto = db.Column(db.Enum(ProxyProto), nullable=False)
|
53
|
+
l3 = db.Column(db.Enum(ProxyL3), nullable=False)
|
54
|
+
transport = db.Column(db.Enum(ProxyTransport), nullable=False)
|
55
|
+
cdn = db.Column(db.Enum(ProxyCDN), nullable=False)
|
4
56
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
57
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
hiddifypanel/models/usage.py
CHANGED
@@ -1,5 +1,60 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask_sqlalchemy import SQLAlchemy
|
2
|
+
from sqlalchemy import func, column
|
3
|
+
|
4
|
+
import datetime
|
5
|
+
from flask import Flask
|
6
|
+
from datetime import timedelta, date
|
7
|
+
from hiddifypanel.panel.database import db
|
8
|
+
from sqlalchemy_serializer import SerializerMixin
|
9
|
+
|
10
|
+
class DailyUsage(db.Model, SerializerMixin):
|
11
|
+
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
12
|
+
date = db.Column(db.Date, default=datetime.date.today())
|
13
|
+
usage = db.Column(db.BigInteger, default=0, nullable=False)
|
14
|
+
online = db.Column(db.Integer, default=0, nullable=False)
|
15
|
+
|
16
|
+
from sqlalchemy import column
|
17
|
+
|
18
|
+
def get_daily_usage_stats():
|
19
|
+
from .user import User
|
20
|
+
# Today's usage and online count
|
21
|
+
today=date.today()
|
22
|
+
today_stats = db.session.query(
|
23
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
24
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
25
|
+
).filter(DailyUsage.date == today).first()
|
26
|
+
users_online_today = User.query.filter(User.last_online >= today).count()
|
27
|
+
|
28
|
+
|
29
|
+
# Yesterday's usage and online count
|
30
|
+
yesterday = date.today() - timedelta(days=1)
|
31
|
+
yesterday_stats = db.session.query(
|
32
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
33
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
34
|
+
).filter(DailyUsage.date == yesterday).first()
|
35
|
+
users_online_yesterday = User.query.filter(User.last_online >= yesterday, User.last_online < today).count()
|
36
|
+
# Last 30 days' usage and online count
|
37
|
+
last_30_days_start = date.today() - timedelta(days=30)
|
38
|
+
last_30_days_stats = db.session.query(
|
39
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
40
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
41
|
+
).filter(DailyUsage.date >= last_30_days_start).first()
|
42
|
+
users_online_last_month = User.query.filter(User.last_online >= last_30_days_start).count()
|
43
|
+
|
44
|
+
# Total usage and online count
|
45
|
+
total_stats = db.session.query(
|
46
|
+
func.coalesce(func.sum(DailyUsage.usage), 0),
|
47
|
+
func.coalesce(func.sum(DailyUsage.online), 0)
|
48
|
+
).first()
|
49
|
+
ten_years_ago = today - timedelta(days=365*10)
|
50
|
+
users_online_last_10_years = User.query.filter(User.last_online >= ten_years_ago).count()
|
51
|
+
|
52
|
+
# Return the usage stats as a dictionary
|
53
|
+
return {
|
54
|
+
"today": {"usage": today_stats[0], "online": users_online_today},
|
55
|
+
"yesterday": {"usage": yesterday_stats[0], "online": users_online_yesterday},
|
56
|
+
"last_30_days": {"usage": last_30_days_stats[0], "online": users_online_last_month},
|
57
|
+
"total": {"usage": total_stats[0], "online": users_online_last_10_years}
|
58
|
+
}
|
4
59
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
60
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|