hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-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\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00M\x1c\x00\x00\x12\t\x04\x00\x02\x157\xda\x8c6\xad\x7f:\xa6\xa8\xd3{\\\x87\xa7\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xc9!\x9d\xbdHxI\xf775\x96\xba\xff,^\x8eN\x81\r\xbe\xb80\xdc\xf4\x93\xc9\x9f\x1cM\x1eC\n\xde_\xfaR\x127C\x90\xfe\xe6\xd6\xf4\xdc*\xd2\x83\xc4 \xd0\xfc\xb9\xe8\x1d\x0f\x84\x00EXA\x98r\x07Ah{\xd9\xd6\x07f/\xfa\xd6J\x9e\xa1o\x0c\xa6\xdd\xa6<\x93H\xce\xc0\xd7%`$C\x17\x05\xcd\xda\x19\xb2\xba\xdc\xbd\x97v\xd7\xf2\n~\xffQu\xd7\xf5\x93\xbeAyS8\xba\xae\xe7vQ\xa3\x1f)\x18\r.\'\x10\x10$\xe0\xa7\xf1Q\xc6T\x1e\x8c\x85\xf8\xff@?8\x95\x8e\x06\x19\xf6f\xb9`@\x985\x9b\x9eQ\xd7\xb3\x1fM\x89:o\x8f\x03\x180\xf4\xd6\x02\xfe`o\x84\xe2rZ\x9f\xc3\xe6a)\xe5\xceq\x893\x9a\x80t\x80\xf0\xa4t\xff\xe4\x94J\xc9\xfc\x9a\xad9I=\x18\\O"\x07\x11\x7fS&\xb1\x93*MN\x876\xba\x04\xdf\x9dj|\x9d\x93\x84\xd2\xe8%+\x12P\x9fi`\x01\x82\x1etwZ@\xb3\xc6\x05\xf9\xd8\x1d-\xbc\x06Z\xb3"&\'\xc5\x9b\xe1\x07E\\\x0cs\xed\xae$1\xaaU\x9b\xfdr\x1cL].h\xe0\xff\xb3\xba@|\xc7\x9d\x05\x956\xb3C\xdei\x12w\x98!\xfa\xbd\xda\x7f\x8b\x81t6\xef\xc1?q^\xe4J\xdf\xee|\\\x87?\xc8\x03\',\xd5#\x1e\xaa,&\xfe\x16%SJd\xca\xed\xd3\x8a\x84\xd5\x17R\x8e\xff\xbf\xdb\xf8\xc6I\x18}g\xbe7\x98\xeb\x05\xda<\xe9H<\x19\xf81\xec+\xd3?\xb1\xf1\x89\xc9{\x7fAt\xb5v\x84\xd0c\x83\xf8=N\xf0\xd2s\x15\xc5 O\x08\xc8\xb8K\xd4\xc4\x0bbQ\x1a\xe1\xb9\\0\xdbp,;2\x00\xe6\x89\xc2\xbd\x9d$\x05\x0fX\xb23\xfd\xc6\x89\x03\xbf\xe0V\xd6\x9f[\x8a\x08\xd1\xbb\x8e\x87\xcd\xc1\xb9\xf1\xde\xee\x0e;gs\xd9\x00nQ\x9e\x17\x99\xe13;\x92!_\'7\xac\x93\xeb\x8f\x87\xa7!\xb8\x1a5f\x8f*\x0eo\x14\xf9o\xab\x19\xb6$\xda\xcb\xc1\x8a\x98\xac>\x83\xfa|\x17o\xc5\xb6\x8b?\x8a\r\x7f$?eu\x07m\xef\xf3\xc3\xc7\xdb\x88V[p\x1d?*\xe5\xfc\x07\xdd\rS\xc0\x8f\x90\xf8L3\x85\x1b\xb8\xbfY#\x99\x04\xa8\x9eJp\x96\x0f\x9bC9_\xad?0\x8f\xce.\x8f7\x88\x1cu\x07\xb9\x80A\xfbg\x07\xf8\xb7h\xe9\x19N0}\x90\xf1^v2[\xf5UGQ<\xf6\xd1\x97U\xf6\xb7\xeaE\x0c\xed;\xafN\xacQ\xfc\xed\xc7\xe4$\xed_2hS\xa4\xa8\xdd\x0e\xdd\xc8\xfc*\xa5\x0f\xec{,}1dD\x9a\xb1\xf4\x1f\xa3\xf9\xd08emS\xbb\xca&\xaam\xa4tG:\xca\x052\xf7Jj\xd6Jhs}b\x13\xa7\xd0*u\xceY\xfd\x0c\xbbg\xe2\x85\x17\xed\n\xb5\xf6\x97\xb4\x15\x9e\xc1k\x86\x03\xf6\x80\x8987a\xb1J\xee7taMt\x0c\xbb\xda\xd36\x9aT-}q\xc9V_&\xf2\xa4p\xef&\x01\xbe\x1c\xf3CquS\x19t\x7f\xc8\xb3|H\xeb\xf3\xa8Z\xb3/\xd9\xbe\xd3\xa9\xcf\xe0Q\xe9\x99\xe3\x88n\xe2\xe4\x0eF>y\x966K<\x1c\x07_\xc6l\xba\xbb\xdf\xc7#|\xac\x97\x17j\xca\x18 \xc8E\xfd\x84*J\xc9(\xc9\xb2e\x93S\x16\xd7\xe6e\xd4p\'7\xdc\xaa\xe2 \xb5\xa6\xba\xdfE\xd4E\x14>\x1d\xac[\x01\xa3\xc2\xf4\xe9\xf8\xfc\x01\xb2\x94\xd5\xe3\xca\x96\xa6S\xc4=\xf2\xd8\x14\x80\xf4\x08\x00I\xef\x9a_keC\x836\xbb\xb9\xf4\x8c\xee\xc56\x82\xda\xbeL=01\xb2\\^\xcb\xe7\x16\x80K\x11\xa8%aJIR\x1e\xf1}\xb2\xdb\xf8\xc2I\x83\x8a\xd3\x18\x13\xe6U\x05m\x82V\xcc\xe27\xf1\xaaiBM;#W\x91\x93\x14\x00\xad\x979b\xa8\x87\x1cAC\xac\x84\xe9,\xd9K\xfdN\x91)y\xd9\x83"\xbe\xb9A\xc1\xe3\xa8\\\x8f\xc4\xa9\xf8\xe8G*\xa4\xb1\x92G\xc6ry/~q\xedT\xa1\xf2\xfbRVw\xb3A\xf0MOuCuIp~\xb5\x126\xdf\xdaz\xa7\x90X^\x91\x8a\x8fHu"aK\r-\x9e\xa9\x896]\x9c\xa43p\x8eF\xab\xd0\x0e\xa4|?\xc2\x86f\x81\xd8\xe2\x1d\x0f|WY\x00y\x96\xfc\xa7E$\'\xac\xda8\xd4\x190\x13\xc0\xca\x98N6\xca~lg\x85\x1e\xe6yr\xcd\xa1\x94\xd4x\xf66\xa3Pa\xc1\x0b\xd9\x04R\xf4\xa9\x12\x81\x16\xc9\xd62\xe5\xf1\xd5\xd3\x0b\xd3\xe6"\x1f\xaf#\xa3\xc0\xa1\x81\xd7m\x8f\x1b\xfc#\x1eI\xe0\xb8\xac\xc2e\x19\xee\xee\x9b\x8f&\xf0!\x14\xb4\xaf\xf8gk\x06C\x80\x17w\xfe\xc0\x0bX\x8a\xcd\xa7\xfam\xa7S\xc7\xf7\x1am\x95\x1d\xe1\x8f\xf4i\x12\xe32\x15Zi\x04Ll\xbaL\x06\x06W\x07;9\xae\xbd;b\xe8\xf2\xf9\x14\xef\x8eSw\xa8\x9f\xd6\xe9\x1f\xaa\xa1&\xcd\xdbg\xdf\x83\r\x1e!\xfbA\xd14\xf0&\xcb\xb1\x7f\xd8B\x14\x16jq\xcbU\x11`\xe3j\xaa\xae(|\xa1\xdf\x9bE\x17~\x9e\xce"Z{\x17\x8fc\xa4\x04<\t\x9e\xe7\x05\xfc\x03\xfc\xe5(\x8e\x1a_\xce\xf0x\xe2\xf8\x98\xffK5\x15\xf4\xac@\xc58?2\x16#L\xdf\x1c\'\x9a\x1d!\xd9\xaf\xed\x19(X\x8f\x18\nF\x16se\x05b7\xd0\xbc\x9a<\x13\xfb\xbb\xc0f\xf9T-S-\xfa\xd4\x0b\x0c\xba\xfd\xde/\x83\xd2;\xae\x7fn8\x03\x07L\xc1\xba4`m<\xd0\xf9\x16\\\xa2\xcd\xb5\x9d_\xfb\xea\xf2|\xc7\xaa\xc5\xb3\xae\x81>e\x19\xdc\n\x88,>)\x85\xb0\x89\xff\x82\xd5\xb7_\xc1_\x0b\x80{\xf6R\xe3\tut:\xdfip\xfc{b_]9\x0f\n\xa8\xf3m2B\xeeP\x08Y\xee\x92gk\x05\xe4\x14A\xf7\x088\x03\x94/\xbd\t\xb5\x86>\xb9\xb9\xd2\xe6H\xc7TN\x8b;\\=\x81x\xa2\x92dk\x9b\xa6UM3\xdbq\xcf\xcfS\xe5s\xc7\x1d\xf7\x1a\x82g\xd3\t\xc8\xa7\xcc\xdd\xc9\x06\t\xee\xcd\x059\xf9\xc0\xb6\x7f\x94\xf1{\x9bf\x84g\xaah\xd5\xbc\x9du\xa5\x90\x11yQ(I\xf0\xb44\x12M2+\xdeEU\xb3=\xdc\xb3=\x8ey\xc7\xdc#i\xecK\x94\x95\xae#H\xc1m\xcc(L^\xe0\\\xe9\n@\x18\xa9m\x08\xd2M\xac\x16\x1b\xf8\x00\xb7\x81Z\x7f\x92\x92\xb6\x00\x1f\x1d\xf5!V\x0e\xf8z\x06\xa7\x99\x81>\x8a\x93\x0c\xef\xc9\x85\xac\xa2!\x16\x9ab\xdcx\xffxA\xb6\xf4\x19\x10\xfe\xc6U\x12\xd3\x92.\x18\xb1=\xc9i"\xce\x14F\xb5t\x98\xc2KB\x8d\x17\xa3\x06~\'\x1c\x9b\xad\x1b&\xc5`\x82b\xa2by\xeb\xe4\x97_\xee\x85\xfa\xb1\xbb\xdc\xafOj\t\x9a*\x80\'I\xe0~\x16e\x87\xa1\x97s \xdd\x8d\n\xd8\x84\xdf\xf1\x04\xe6\x06\x8b\xa1@\xdd!mp\x1fX\xf9\xf0U7\x80\x9d\xaa\x08\x18\x17\x15{"\xeb\xfe;\x1f\xc5\rxJtM{^\x17,\x9b\xb3\xab2QrZ\x0b\xc5(\xdc\xb8\x11\xcb\x9c\x0e?\x9cB\x8df\xcaW\xb8\xebz\xec\xc5\xb0A0\x1f\xc3\x93\x9cZ*\r\x81\xd6\xce\xdd]gr0B\x14\x0e\n\xc1sW\x91\x14Pa-\xf8\x8f1gb\x0bz\xf1\xad\x083%\x93j\x18\xd8^yUX\x86oC\xd2\xfdq\x07\x14\xac\x1d\x89\xd3f\xe74\xab\x04\xfb\x8a\xf0Aa\xcb\x1eO\x16\xa9\x07^\xd3\x06d\x86\xaa\xaa\x89\x84\t\xdc\xefOv\x16+\x04\xb5@\x10\x00.\xc3\xdeZ\xd3\xb7=Z\xb4\xeaW`\x08\xf3\x886T\xd7^\xc2?(\x81\xc7\xc4-\xd2#\xe4\x16 \xe8?DwX/\xc9w,\x19\x0bs]\xa7\xaa\x8c\xb8\x8b\x84k\xa8\xc5\x19\x081\x92\xe5\xbfj\xadvs\xfd\xa6tO\xa1\x9fK/`\x1d\x9c \xab\x1a\xe3\xb2\xfe\x1d\xb2\xae\xd6\xf4\x14N\x07\t\x96\xd3NV=A\xfc\xb3:\xf44/\xac\xee\xf3\x0c\xf2\x05\xc4\xc7\xeb\x94\r\'V\xf9\xc5\xffK?\x92s\x03\xb8Q\xa3\xefs\xda\x03\x81\xdb\x98t=P\xcf\x98\xa0f\xf5{0\x90\xccM6\x87g\xec\x81\xfdFc\x9d\x1e\x0fH{\x91@\xfc\xf8\xd2\x90\x18Oc\x94\x02\xbc\xa4\xa5\xe3\xc0|\xc5\xed\x9b\x18\x14\xa0?\x8e\x10"Img+\xd1\xc7\r\x04\x11\xc0\xcb\xb6\xfe\xae\xd3\xdcJd\xccHv\xfd\xd4?\x1a\xf5.\xd2\xe5\xb7\x01&v\xce\xd5t\x963\xeeS\x068\xf1l\xb3\xc5m\'\x03\xda}h\x0c\xfe5"\xd2$\xaa\t\xb1\xca\'\x8e?\xee\xac\xb3\xe6\x81N\xd8a\x13\xe0b\xedy\x07\x9f\xf9\x1a\x12\xc4<4\x91\xb7\xbb#<\x13\xf2+\xeb\x88\xc9\xe2a\x91p\\\xff\x91\n_\x00\x0c]\x9684[\xf0\xfa,\xf6\x93\xe3\xe6\x84m\xf5\xa0\xfb\x8c\xc4\x10\xc1z\r\x1d\x12\x1aY\xe9X\x18f\xb7\xfaurJ\x0c\x9d&\xe7\xe3\x85\x82\x18\x157\x0ew\xbf\xb4vp\x18\xfc\xd1\xbd?\x0e\xc2\xcb\xc6Wd\x96\xb8<X\xccyy\x0bY\xf5\x9b\xdbg\x8c\x92Q\x93\xda4\xddw\xe3S\xcd8\x90\xaf\x8b\xfaX\xc6\xed\x91O\xcc\x82\xb1G\xe4o\xe2\xa88\x13h,\xcd\xc4{g\x87\xf7\xfe7\xe5/|q\xf1u:X\x93b\xdfIS\xcfT^\xb5,3\x93@%,\xafgF?\x92\x97\xdd\xd5\xd9\x98R\xe1\xf0+j\xc9\x8c\x99u\xde\x08\xc2\x045\xfd\xfbf\x82\x11\xa7$\x96(:\xc0#\x0e\x15\xbe\xfe\xe6\xe0\x95:>\x8c\x9b}\xc6u\x17\x80\x16%;CJ9\x82\xdc\xf0?\xae\xd0\x89\x82\xa2\x90\x92\x9b\x14K\xe7\xe0Q\x7f\xc0\x87D5\x06\xce\xb80VS\x98\x8aM4\x88\xdc\xf0\xbfh\xd4\xfd\xdd;\xe6U\x9e\xc8D\\\xa02\x90\x07z>\'\xbe\xf7\x00\xa8\xbdc9\xc8\x19\x95\x96\x9f\x08\x064\x91;\xb3\x12\x00\xbd\x8c\x81\xeb\xad\xf0\x91\xab\xa1\x1e\x1a\xcb\x9e\xa1\xba\x11`\x8f$w\xc7KN\x8f\xcd\xd7ewB\x8b\xf7G7w\xf2aO\x14\x07o{\xd2]\x1a\x89\x92\\!\xe3\xe5\x08\x0b\xd4\x9d\n>\x17\xee\xd6\xe1\xcf\xe7\x9c\x867\x16\xf77\x0e*\xaa\x840\xd6\xd0\xd5~!\x94dt"{+\x05\t\n\xc0\xeb\x96,\xe2\xde\xe1)\xedGJ\xfc\xfeN@Q\xfb\x02?\xdc\x1c)\x86p\xfc$\x90\xc6"<\xaf\x99\xf7\xf3b\xf7\x83H\xf9JY\xe6\x87\xf2\x97\xedG\xac\x9f\x84F\x91\x98\x9dH\x90q\xcf\xcf8\x0b\x82\xbf\x9b \xcc\xb1:\xf3\xe2\xdb\xec\xd5\x85\xe6)\x07\xdc\xb0_:z\xf1#\x18k\xf5\x84\xa9\x04\x86\x94\xaev\xfc,\xd47W\xee\xb2%+4\x18\x9c\xc2!\x87\x0eW\xf4]\xd7}p\x0fY\xbdc\xea\xbe\x0cf\xb3\x9a\x8fc\xbe\x8c\xb2\xfa\x8d1W\x17,%\\<\x077\xb6\x8f(\xac\xd13Z\x03\'\xaa\xe7\x91\xb4j\x1d\x03O\xc1\xc3i\xd0Y\xe7D!\xae\xb9=\x98^^\xe2\x9c\xe6\xdc\xec\xa5<\xd2\xb7}I\xa58\x98HY\xd7g#\xd9\xd3\x1d)S0Y\xa31\xbd\x18\x7f\x82\xa6\xac\x83\xb8]\r\x05\xb9\xae\x02\xab/\x86\xdb\xd8\xef|\x8d\x1a\x84\x861[\x10\xa0\x08\x00\x9d\x0f\x88+\x87%\xda\xa6\xa2\xd3\xf1\xa5\xed\x83\xc5\xbe\xf7\xa2M\xea\x1f\xdb&&f2i\x1cO\xbb\xcc\xa7q\x0f\x02\xb9d\xe9\xa3?[\xf5\xd8E\x85%\tm\xdeR8\xe4\xcb\xadn~\x07(\x021\x99w\xb1E\xcbQ\x19\x10\x12\xc4\x11e\xa5|\x9cl>\x0f\x07z<\x05\xe6\xbc\xac\x90}\xa4\xcf\xafn\x05\x19\xed\x88\xc4\x97r\xd7\xb64)\xc1\x00\xc4\xfcD\x0b\xc5\xf2\xd2\xa9\xac\xd2\xce\xcd\x82\x90\x9e"\xe2C\x9b\x12\xcc|J3\x8d9\x13\x07AO\xf4\xd2x\xec\xdc\x07\x14\x85\xe7\xba\x17\xec/[;\xe89\xa0\xc5\xb2*eO1\xcb\xba\xf0\xfc\xb1Z\xd9\xce\x99)\xd77\xab\x12\xdf\x7f1\xd4\xd4\x8a\xbf\xf1\xce{\x1f$\xbb\x80\xc4\x8c\xa3M\x1f\xab\x9c\xa2fOcL\x1d\x1c\x14\x8b\xd9\xc4\xe6[H\xec\xed0^!\x82\x91\xe1W+\xef\x00\xff?c4@\xf2\xbf7]\xec~\xccW\x1dm\xbe\x8b\xba6\xaf\xe9\x19u,\xd0:;r\xc0\x82\xa3\xfb\xce\x9b\xd0r\x9d\x1e\xf3\xadRF\xf0#\x15\xe78\xad\xcb4f\xa3& (^\x96L\xb0\x05*\xab\xbbb\xec\xabZ\xfd\xb5\xa0\x8c\x86:3\x02\xba\xfd\xe1\xeb\xb6\xeb\x97\xb9\xcc\xce6\x1f\xe6\xaf)ry\xc0G\xee\x82\xb9\xc3\xf0\xe6\x03\xa0\xa8G\x9d!\xda\xc6G\xe2\xb3\x1d\xd7\x87\xd2\xfb\x87hc\x02\n\x97\xcec\x9epD8\x1b\x1bc\x95Q\x92\x9b\xf0-\xed\xebN2\x11\xa7A\xd7\xa33\xc2\x14\nI\r\x10\xe3\xf8iT\x1e\x1e\x87\xed\x9e\xbdi;\xc7I!\x88\x08"+7\x8f=\xaa\x1a-\x03?\xf8H\xe8\xe2\x0b\xf5}(\x90 o\xae\x98\xab\x0b\xbe<2\xe2"\x96<\x8a\xa8\x89c\xb2\xb3\x06/*t\x86\xa1-%\x03\x04\xe8\xd8.\x99\xdf\xa8\xc09\xcfD\xb7/\xed]\x11O\x0b\xca\x0c\xcf\x80%\xa3u8\x83\x10\x1d\x07\xca\x8e0%O\x9c\x1a\n1\xb3\xb16?\xba\xf2\x8b=R4_,\xd7\x9a\x99\x91\xdf\xd3e]5\xfd\xb7 \xfb^\x1e,\x05\x9f\xc6=l\x1e\xc4\xbc\xed02\xf710\x91\x10\xde\xd0\xdb\'\x90\x116\xf0\xd5\xfd\x18\xf5\x0b\xc3\xffF\xe2{&\xfaP\xc3\x11\x84\x94\x0c\xf6\x98=\xb6/\xec1\xff,\xe9\xfc\x9f y\x8d@J\xc5[\x00\xde}E\x18<R-|\xf4\x1b=GH\xf5\x91a\xae1\xca<J@\xc0;v\xcem\xf4P\xe4J\x0b\x05>\x1a\xe3v\x96\xd0\x9b+\xc5\xbeADx\x89\xc9\xc4\xda\xa7\xc5r\x01n\xcdS\xbc\xa9x\x1e\x97\xc8\xd3 &\xc7\xeah\xe7P\xff\xdf\xe7U\xa2\xc8\x06|-8\xb6\x10e4&\xef\xb2\x92\xf5\xfdy\xfa\xa0Tq|\x88y{\xa2\xd4\xd7oQU(mT\xa8\xc2]xr-\xd4u%\xccHs\xeaS\x94\xe1\x17\x0b^X\xe4\xd4\xbas\xae\xadH\r\x99\xbb~\xc4u\x8d_3\xdc\xd2\x9c>\xc1L4 \xf5\xb6[\x07\x88(\x973\x11\xe2y\x91\x85\xcc0s[\x1f\x9a\xd5\xbe\xbd\xe1w\x9d\x01\x13\x81\xf1\xfe\x87\xbbI;\x18\xf4\x9f7\xebUP\x81\x89$\xff=c|\xd4Y\xec\x0c\x8c6\xa0\xd5\'\x0c\xa2\xcbL!;\xda\x14\x9f\x85\x8e\xb8\x16\xfe\xc2\'P\x08!)S6\x90\xc1\xaa}R<\x18Hf\xac\xe4\x02V\xbb}%\x94\xebp\x86\x9c\xe1\xc88Oa{\xa1h\xad\xd8@Y]\x13Pl8\r8\xd2\xe8\xe1C\xd8\xdc\xf2\x80y\x16\x7f\xfdB\x94\xdeeL\x90C\x0ev\x9b\xd81{z8\xafq\xba\xc2\x9b\x9f\xe2\n)\xad\x9f]["\xf3Z\xb4\xde\xc5\x9c\x08\x1b\xa9/?h\x1b\xdf\xb5t5H+\xbe\xc0i\x95e\xfd\xdb\x8d\xbf\x7f\x1d\xef.p\xd9zu\xd0\xbd8\x0c8l8\xe0\xa5[\xa1\xeby\xc3/\xc0\xfb1B\xefC{\xf7\xe0V\x17u\xd6DUh]@\xebk\xf8\x8f\xe1E\xfd\xe8\xcf\x06\xd19a\x07\xf0\xcaz.\xa6%t)Z\x9e\x89\x9fJ\xb5N%L\xfc72\xb5\xd8\xbdq\rY\x91}\x8a\t%\x8aN\xceT|\xf3\\\xf0~\xa63\xd2\xb4\x8f\xe2A\xecH\xcb\x98\xb7\x03\xca\x87\xcb\xa5\xba\x9da\xe9m(\xbb\x03\xa6\xb1\xff\xf0\x13\x0c\xf0\xe0\xb4M\x06\x94\xe6\xf6l\x15\x8f\x18\x1f\x98\xb5*\x0b\x85(\x1f\x05\xd3\x19(-|\x86\xe8\xff\xdf\xeb\xed}.\x1a5\x07F\x04$j\xe6\xb9\xb1\xb8o}\xb3\x0e$\xf7z\xab\xd6(`\xad\xb1mA\x84ES4\xd2\x90\xca\xca\x00\x086\xaa\xefb\xa6\xdbf\xbd\xb9\xdd\xe5\xc5\x16\xf9\x90\xb3a\x9ff\x90z\xf1\xfb\xdc\x9cm\x1f\xd1\x88NU\x9aF\xe8\xedy\x84\xe9 \xd1S\xd1\xbe+~y*\xed\xb7\xf6\x14\xc9\xa7^[u\x1d \xa2\x9a:c)t\x10\x978\xb7\xfd\x8c\xb2C\x02\xa1\x92\xe4\xdckdS\xa6\xadS[ff\xff\x97A\xa2\x19\x80QX\xdc)\xf2\x9c\xa0\x0e\xc9e\x1a\x86\xc9`\x14\xd7\x99\xe4\xda\x94\x96\x87\xfa\x05i\x17\x1b\xf7@M8\xdaI\\\xf7C\xc3N_\x91\xb2y\x02\xbeF\nHKw\xb5\xf7*mHb@\xcbM\x7f\xc1i\x88\x84^\x12\x95#\xdb\xdd\xd0b\xc4\x8b+n"\x15\xb96\xd3\x11\x99\x94\xb79HI\r\xf3\xff\x9f^\x1d\t\xff\xb7y\xb8[\x9d\x7f\xe7\xa5\xcf`\xd0N!\xfd\xb81\xf0\x01\xc6u\xbda \nLU\x1f\xd6\xbehYn\xd1\x03L\t\xd8\xf9\x03\xbd\x96\xcf\x93\xc8\x880\xcc\xc3\xa6\x08l\xf98j\xbaQ6\xa5\xd1;$/\x1a\xf8\xd5P\xa6\x15\xaeWkPjFDJF\x88wm\x0c6b\xd5\x07\xfeI\xc4\x90\xed\xbd\xc9t\x03\xbc\xf8+<Z\xbb\xd4\x9ekPvh\xa3o\xe8\xdf\x1b9\xbe\xaf*R\x03\xad(\x81\x8d}+w\x02\xa9 \xd9K\x7f\xcc\xc5\x8a\xd2yCU\xe8\xc8\x13E\xb9\x85\x04\xa7\x03\xe9\x13\xcbk\x80o\rF-W\xb6j\xb5~Nj\xeb\xd3\x96\xc7\xf5\x05\xca6\xb7\x18\xe3M\x0c\xccGW\xcf\xd3\xd4\x06s\x15\x059\x02\x8d\x05p\xd6\xf7\xa4\x8eK\xdf\xfc\x96n\x01\xaa\xfd\x9c\xbe:\xce\x8e\xb5\xa8\xdbx\x8b\xd9<\x9eR\xf5\x9b=\x01\x9e#\xad\x0e\x1f\xcb\x0ft\xcb\x05_j\xc6u\xd3\xa3E)\x05\xc7\xaf\xa0\x01\xcb\\\x1d\x9f\x8b\xb73\xa4\x93\xc2\xf3|\xb6q!\xdcOcU{q_\xe1\x06Z\xc3\xbdiY\xa7\xbc\xe7\xb2\xa7?O\xe6\xa5\x93\x16)\x05\xb8$\xdaz\x03p\x83]y\x9bK\xde\xdbT\xbf\xce\xc3=\xdf\x0e\xb0\x04\xc7\xc9\xd4\xe6\xca\xe2\xd5\xe3Z\xce\x81\xb8\xd4p\x86\x17\x89\xc3\x12\xf3z\xa4\xa8%\xa7:Z>\xfd\xe50\xbf\x1e\xd4X\x0cJl\xf0\xeb\x9c\x8c\x88\xd7\xd0\xa6?b\xfc\xc7\x0b\xc1g\x8fKh\xcao\xd6K\xa9O9\xfa \x85\xd0MZn\x85\xbeD\xaa"\xa9\xa2\xe2\x00,f\xd8C\x0cq\x14%\x96zp\xac\xe0\x11O-\xe9C\x00\x11t\x9fm\x8c\x93\x87\x0e\'\xf4QEb\x94\xacg\t\xd5s\xf5\x18\xf8\xfc\x1e/\xe1\xdb{\xe7\x8d\x8bZ\xb6\x93\x83M\xf7\x93h\xa1]\x16\x839\xb7CS[\xf8R\x18\xb1\xe2F\x7f\xec\xde\xa6\x03\x92|\xd5\xed\xf4,\xff-P \x89~\xfe\x8ay\xe2\x1f\x08`\x04\x9ceh9gh\xc7\xcb\x04\xa1\x08s\xa8>\xd5UB`\xf8AR\xa9\xa2\xf4R\x91\xa4\xfa\x92\xe4rE\xad\xe0\x1c\xbc\x0fs\xceA\xe30\xd2[\x0eY\xb9\x98J\x80\xb1_\xdd?\x8c\x1b\x8f\xf6>}\xf3\xa4\x04\x80\x12\xc2\x8b\xb6[B \xee^\x11Z\xa6P\xdb\x02D\xbd\x13Re\xbb\xcf\xc8\xe5\x98I\xe0\xac{\x89\xfe\xd9FxKm\xcd\xb5\x8f\x9b\xab\xd9\x98\xc4zL\xaa\x9f_m\xf4\x97\xd7\xde\xcf\xe9\xd2\xa9\x93\xa1\x16\t\x88%]"\x84\xa0`z\xcb\r[W|\xcc\xeex|X\xd6\xeb\x92+\xa1\xa4 \xab\x12\xf3\x15\\\xd2\x89\xbdmZ\x97I\xa5\xf2\xd0\x1e\x9eV_\xf5\xb0c\xccY\xa2\xdb\xb8\x18\xcc-\xcf\x881\x8e\xcaP\xe7i#\x9a_Cts:\xb0!\xc5\xcdw\xb1\x10\xab\xac\x81\xe8\xf2_\xe5\xc2\x9a\xd5\x7f.[\xfel\x1a\xdc\xb2\xe9\x00 \\K\xad`*\xdbK\x9e}\xe2\xa7W\xab\xda\xf9\xaa\x99W\xf2j\xfb\x1a\xb2\xcdDe\x01+\xe7YuI\x06\xc9\xd4r\xef\xd1g\t)\x86\xa2\x87\xfe\r\xb7\xbd\x9cy\x89\xa9\xdb\xa5g\xf3ZpKJ\x82\xbe6\x1ebUj\xdaw\r\xf7Cj-\xd9EL\xa0\x88\xfc\x17[e~c\x93\x96f\x03\xe9(y\x04>\x1b\xce\xa6\xb2\xc6hV\xb021\xe2; z\xe1\xe5o\x93\xb9\xb2`\xee\xa9c\x18\xc5\xe3\xb0\x07\x7f\x15\x86$4\xfb\x8e\\\xa4\x92\xe8\x9f9g\xaf)\xf5K\'\x8b\xb7\xb6\x06|w`\xafG\x96R\x0es5\x1f\xb38I\xearmyian\x8f\x0f\xdd\xf8\x03\xec\x13\x8c\xd5\xe6^\x1dx\xb9\xe2J>\x9f\x0c\xe9o\x0eh\xea\xe7t\xfb\xf1\xc2S-\xe99^n\xbb0\xb9\x04\xbf_\xf9\xad\xcf+\xac\x01p\xad\x08\x94\x17\xc5\xb1+\xb2b\xeagY\x9el\x81\xd7\xc7YK\x82\xf4\xf4Ax\xd4\xbf\x9aa\xad\x82\t\xb8F\x0f\x8a\x94\xde\x04\\\xdb03j\xdb\xcew\xf6\xd4?\xfd\xf7\xfa\xf7\xa6\x13h\x89\xf9\x99\xeb\xbf=X\xb7o\x0bc\xb8&\x8e\x83F\xdd^K\xcc\xd4\x9f\x90w\xc5t\x83\xfcaZzj#\xe7/!\x97\x0b\xf7\xcew\x7f\xd4i\xf6C\xc3\x8d\xa7\xe89\xb7\\\xac(\xf2\x02\xe3\xf7D\xdb\xcb\x98+\x8dO\x19\x93\x93\xdb\xd4\x99/\xfc\xa2\x15h\xd7\xa2\xb6iV\xfb\xaf\xe3\xfax\xc6Y\xe1\xe3\xe0\x11\xed@\xe8\xd8\x1e4\x1a\xd2\t\xe6E\x9f\xa0\xd6\x16\xe74q\xeb\xdf\x10\x90\x99-\xcbV\xcc\x0e\x96?c\xa9L9\xc5!\xc0\x00\x15]\xd5v\xce0,\t\xfc\x84\x91\xa3\xb7\xd5\xe1\x0b\x88\xd74\xa2\xc7\xfe\x8e\x19\x95\x83\xa0\x8f(P\xaa\x92\x08\xfd|[\x96\x9c\xd9\xb6\x82o\xe6?H\xdf\x1b\x97\x98\x10z\xda\xcf\x10\x9dow\xe3\xe8\xe5yQ?\x90\xee\x15\xca\x18\x0cii\xd2`\x98\x0b\x02\xc6\x89 5\x7f"\xc1\x8f\n\xa1\x90\xb9\xcc\xf8\xf3\x9b\xb3\xc7N\\\x9f\xcd\xf1\t[\x83W-\xd3\x9f\x12\x8e4\xc0\xf5\xa8\x97\xfb\xee\x15)\xcf\xfc\xd6\x11\xb5iZ#?\x7f^\x135\xf7\x8a\xc8\xaf\xdb\xeb`\x85\xae\xe4\x86\x1bf\x05\x84\x17\xca@\x95\xda\xbb\n\x19\x15k\x9f\x85\xd7\x9fo\x9akH\x92\xea2\xc8)\x0ep\xbc\xeb\xd3(F\xd3\xaa+ x\r\xce\xdc\x86\x0e\xbb \xd9\xb2\xa71"\x84.\xcdGF\xcbue\x1c\xc1\xae>\x18\x0c\xaf\xe5\xe49$\x97\x99K\xe9\x1a\xb3\xe6\xd54\x15(U;m\xde\n\xa4s\xca\x95\x13\x82_\xf8\x1d\xb4\x92\xff\xe9\xcaK\x94\xfe8YYv\xd8m\x11\xdb&\x95T\xddBB\xe52\xb8\xe5eZv\x9duq\xd7\xde\x0c\xcf\xdc!\x81\xdbr\x7fm\xb5\x8b\x01\xc5\xdaw\\\xfboB8\x10"\x06\xb6\x91\xb7\xd9-Id(\x16t*\xb9\xfe\x9ds\xb8\xd4l\xc6iD\xef\xd5g\xd7\x9e\xb0\x9d\xfaW\x8d\xddA$\xba\xed\x11\x8d;\xc4r\xa7\x8c.r\x89 k&ns\x0bY\xe9\t<\x02ia\xea\x8f\xca\x19\x12\xbc\xc2d\x92\xb2\x90\x9cB$\x9c\xfb\x03\xd7\xcd\x9f\x83\x0c\x88\x8e\xf0\xc2\xc4\x01\xbdj\xa7\xf6\xa6\xf6V\xbbR\xbf.\x158\xbe\x12x\xef8\xc8\xc1\xc3\xde\xb4f\x91\xab\x1f\xd8\xb0Va\x0b/\x12q\xe4\x81\xa6`\xaa\x08\x7f\x9d5n\xc20\xbb\x05\xca?&\tKFJ\x83c\xf8Y\x14A|\xb3V\xb3 \xb4>V\xd4\xa1\x8c\xac\xd3\xd8\xa7\xd3\x9f\xb0\x0e0\xfd0,\x1e\x7f\xf2e\xc0M\xbb\'\xd6\x12\x82^"\xd1\xad\x95\x13sc\xa7\xaa\x96\xe9\x9beP\xa9\x9dY\xf4\x84\xa8!~\x8e\x03]\xed\xc1lo\x87%\xfe\x15ct\x9f\x8c\xe0\xaa\xcf\xaf\xdc\xfcM\xc5\xbeY*\x94\xd6\xa2\xa0\x0f\x03\x15\xfa\x1bpv\xbd\xde\xb6\xf5\xc1Y\x07O\xa2\x1c\xa5a\n\x0f\xd2\xadO\xe0\xad\xfe\xc7<\xc4\xd0\xd2\x07`G\xeeM\x1eML \x03\x80\x8a\xe5\xc0\x95b\x01\x92*\x08\x8b\xb3t}s\x87\xd9g|\x10\x8c\x1a\'\x830\x80\xe0\xf3ql\xf0\xe3A\x88\x92\x91\xf1B-\x05\xa9\xc0\x94\xe1\xda\xeex\xf4\xa2{H\xf03\\"C\x94\xe9g\x88\x9c\xe5\xd1\x13\xf49\xc6l\xd7b\xa1\x18\x04\x9c\xd6\x96B\x9a5\xd4\x96v\x86\xb0\x86\x1e\xa8s\xd7\x8f,EK\xa6L\xa6\xb8\x19\xbcW\xfe\xc4\xdce\xcbj\xb0\x00K\xcd\x86\t$u\xf9\xf3k5\x10\xe2?\x9dnp$\xa0\x93\xbe\xe6}\xab\x82\xab\xcf\xa4\x02p\xef\xa0j4$\x12S\xd9\x1a\x02 \xa9\x15\xb2\xd3\xfcX\xb0\x00\xea\xbb\xb1\xba\x9a\x91\xf25Eb*:"{\xdb\x88\x9e\xeb=\xf0\x88\x95\xd4\xc0l\xa6\x99O\xb1\xdbO\x8a(\xdb\x8d\xae,\xfe\xb0V\xb6\xa2g\xea\xdd\xb0\x88\xd6/\x96<\x16\x02!\x07\x86\x9f\xb7\x17\xc2^\xb2|\x96\x93\xc8p*\x83L;\x17\xd7\xd9\xdc\x03\\\x18a\xbc\x17x\x15\xe2i\x15\xc8A\xa6\xc1\x03\xee7\xe6\xa6\x08\xba\xaa\xbb\xf1"\xe1E;\xca\x05\xa0}\xcf&\x06\xbb\xb1V\x1d\xb4\xe4d\xee\xb9\x86\xccQ\xe9\xeb\xfb\x8cV2O\x7f\xfe\xea\xfd{\xa4\xf0e\xc4\xd07\xb2\xb2/\x8b\xd7"\xa9\x1d8\x1f\xf9dxG\'\xe6n]\xa0\x9c[{\x87\xf5[\x1c\\a\xb3\x8ep\xf9\xf3\x18\xc7\xa0\x85\xd9\xbc\xcf\x99\xb2E\xeeO\xcc&\x84X\xe7nn5\xf0\xb8=\x93\x97\x14\x0ba\xf0lYW\xa2\xd7H\xdd*\xb4w\xea*b\xdd\xf4\x9d\xbbPb\xdcH\x04\xbf\xfb[\x90*\xbf\xd1r\xef\xf5\xef\x90\x8d\xdc\x056^\x87t\x80\x10\xa2\x1a\x18E}\xc6\xd2\xa2\xfc\x8b\x18\xf6\xd5\xf76\xd7)\x9a\xbb\xc9\x9c\xaeHT\x82\x95\xba\xa3\xcf\x03X\xbc\xa1\x87q\xbf\xaf[\xd4\xe4@\\\xb7\xafH;0\x99\xaa*\x07\x17\xb3\xcb\x98\xf4\'Bai\xb0@f\xb6\xad\xe9\x0cS.\xedtv\xd1\xac\x96y\xe4\xc8\xc6c]\x17x\x01_\x0cBR\x93\xa5zr\xc7\x0f\xe8\x8d\xb4\xd5\x04f\xb3\x9b\x01Y\xe4\x9c(\x04t#q\xdbS\xe6\xbb\x96\xa0\xed\x82\xcb\x9cl\xc8\x84\x1aS\xcb\xd5C\xbd\x89\xeb\x98\xc2\xc58\xd3[\xbb\xb8\x01\xc5\x94\x1dRM8\xd7y\xc0]\xe0O&1\x16\xa5\x9fI\xc0\xf6\xb3\x0f\xdbv\x8e,\xebl\xb1T\xdd<\xbcv\x97\xcf\xd7\xd1\xd7o\xb0Nb\x0fK\xe02\xeb\xd7%d\xc2\x87\xf5"\xcf\xc0\xf8\xc3\x16\x97\xfe\x9b\x18\x0f\x98\xb6(m\xcb\xbb\x0c9\xdd\xe9\xe2*0\xf4\xa6\x9cK\xc2\xf7\x12\xcd\x03\x10\x7f\xb8)V\x1c\xdd~\x83}\xb2\xbaQ\x06\xd4\x85Y\x80\xdd\xab\xea\x10\xdaM\xf2NJ\\#\xf8\xefh\x91\x06\x1d*\xf9\nAg\x05z\x91\xc9V\xba\xe6\x00\xa7\x83\x1c\xbeIvq-|\xceC\x8d7\xe8\xee\xca\x87\xc3\xc5\xad\xa8\xdb\xba\xe9\xd4\x9f6%T\xd3`\x02\xc9\xf4\xbd\xce\xe8t\xf4\xdc\xdc;@E\x81\xc8\xefw\xe6\x88C\x8b\x9c\xe2b\x9f"\x1c\xaf\xff\xa5\xe3\xbc\xc9\xfe\xc0\xbd\x1e\x89S\xdc\xbc\x1dO4\xe4O\x05M\xf9,d\xf2{\x86\xee\x83\xaf\x01\xb3\xfd\xaa\xdb2<LL%X\x1c\xe9C\xf48:\xcf#c\xd0\'\xddX&\xf0\xc5\x9e\xa9k)\x07b\x8e\x15\xce\x12oh\x85\x93.\xb8\x81T\xcev9\x124\xa2\xf5f\xbb\xafs\xb5\xa1T\x92%YX\xd5\x7fi\xfd\x84\x0e\xd6^?/\xc9\x9e,\xe0RMo1\xd1-\xfa\x97\x17\xfa\xd5n}\xbc+\xdc;V\xe1<\xac3M\x12\xec\x0fM\xa1\x9a\x8eJ\xa8(m\\\xec\xbb\x00\xf2\xb6\x16\xfeb5\xe8J\x1e\xecS:\xc5\xaa\x06\xb8\xcd5\xa98\xa8\x90\xc7u\x8e\x9d\xee\xbf7\x14S\xcb\x1e\x07\x93\t\x94R\x08_\xd7\x0e\x1b\x8f\xe9\xb9\xb7\xb8\xa7#\xe3k<\xf0\x12oj\xa2\xe4\x11uL\xf12|\x1f\xdb=#\xaecR\xf9P\xd3\xb6\xbf\x98\xe1\xf5\x8d\x8fZ\x96Ca\x02\x91\x0e\x97\x1f\x94%\xeeO\x1c\xa7\x94 =\x1d\x1e\x85j8\xe7\xdbR\xe8\x96\xc3R\x8d\x1c\xc8c\x04\xaa\x13\x84\xae4\x8c\xde\xc8q\x06z\xe4\xd8y\x0f\xdc]lp\xd9|\x8e?\xb3\x944\xfe\x0cq\xb43B\xca\x0f\x88\x1d\'\xd9\n\x14\xdf&\xf2\\\xe0\xea\xaf\xf7HC\x08\xa3\xa2FKJ\xbc,\x94\xca\xd9\x07\'u<\xaf\x86\x98.\xbc6\xed>\xbc\x81}\x9b\xcc\r0gI*\xb9\xc2E\x9b\xec\xfd\xdfY.\xbc\xc54\xf8V8^z\x1fd~v\x84j\x87\x11\x0c\xf9\x91L\x80cT\xdb\x9b3\x87\x93Pm\xc1w)\xb0\xc7\xda\x0f\x94Zi\xdb\xcb\x12\xa5\xb7\xfe\xea\x12\x15\xab\x00\xb8\xb3a\x96\x8a\x14\xbf\xb5\x8e\xb7U}/\xd0\xc40{\n\x02\xb8\x8b\xd9\xf7\x18\xc8\x94)\x95\x08qI\xcb\xc9b\xb3\xb9zO.\x0f\xda6\x8d\xf9\x0e.\xe4\x7f\x94\xe9\ro\xd902\x8a\xc8Pr\xe4*\xf5\xbf3\x0c\xd8\x0c\x04\x9c_\xc0d\x1d}R\x85\x95\x82\xe9+ 2R\xd5\x9c\x02\x92\x1d\xcb\xff&\xd1K\x8d/\xaf\t\xff\x12\xc1j"\x0b\xa9K<k\xd2\x92\xaap\xd0\xa4\xd1\x7f\x9dM\x1b\xf1\xfbX\x1e-\xa1\x94\xa9y\xa0\x90t\xb9f\x91\x8e8P\xf1GX\x00\x90-\xa2J\x91\xa7\x0e\x7f\xa2\xb2\x9eX\xf5\x96\x8f<q\xbb\xe0\x9dz\x99\xd6\xe7Y\xf3\xdbl\x19\x0c\xa3\xb8i\x1b\xd0\x85\x17\xca\xf7X*\x83:)\x0e;w\x0f\x97\xaa\x00\x9d0\xb3\x8cc\x0e\x93\x19+\x94\xb8\x9d\xe8\x8ae\x15\x013\x17\xd0MwM\x0b.e\x8a\x14\x9aG\x9c\x87\xeb\xc7\xe4\x0b\xb6?\x8e\x17\xd7\xf5\xf6\xd1\xd7\xa9\xe3Rsir\xe0\xe1F\xa5&\xfe\xb3\x9c\x86\xfeI\xc1\x82*\x9e"\xf1\xe3\xe8\x03/8VZ8\xe9\xbb\xd9?\xc5\xef0X\xfb\x0cMV4\xa6\x01\xd2\xe8\xe7\xa7F\x03zO\xe9\xba\xcb\x04(q\xef\xcf\xdd\'b\xce\x10|\xean\xc8\xe6me\'\x06LH\x83Z\xb8O\x85\xdba\x11A\x0bc\xd1\xcd\xe5f\x8cHl#\x01\xe9\xadM\x13\xd8\xe7\x0b\xf6!I\xde\xa4\xb3\x17\xf9\x9d\x9fQ\xeb\xf5\x84\x18_\xc9db. \xe9=\xbf<P\x02\xdet\xe9\xa7\xf0\xdb\xab3B\xc0\x18h\xeb\xe0\xfd\xcd\x0e\x87\xe6\xee\xe0(\xd0\x1d60\xcfl\xf1rJ}\x95\x1e\x12\x80dr\x9a\xac\x9a\xaf\x8e\x8ea\x9f')
|
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\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfd\x19\x00\x00\x12\t\x04\x006t\x1c\xd1g\x11\xf1\x1ec\rIm\x1f\xe9R$\x00\x00\x00\x00\x00\x00\x00\x00J\x84\x7f{\xfaH\xfb\x85\x88N\xce\x18\xf7\xd2G&\x81\xde\xfa\x80mz\x1d\xa5\xcd!\xc3\xccHJ\x8fd\xd9D\xa7[\x91\x94\xe6;\xca\x8fl\xcb9\x14\xf6WH\xd0\xfbm+\xfc\xe9\xed\xe7\xc7\xff0\xea\xfe\xfd\xd2\x1b0\x12\xa2\xca\xac\xb4X-O\x06\\=\xdb\x04\\\xe1_\x98\xfe\x17O\x18\xaawu#g#9\xf6J\x8bJ\xbf\x81\x82[\x14\x90!+\xddL\'\xfb|\x15\xc8\x11a\xa7M\x91\x9f\xa9\x1e\xa1~2Di\x0f\xdf;\xc0\x91\xab\xbb\xb2s=ENN\x1d\xe8\x16m\x03\x83\x9b>\xc2\xf3\x8fuFw\xe9P\x1f\xca\x8f\x03$O<x\xb9\xe6\n\x1e\x02<\x86s>D\xef\x0f1\x12L\x0e[e)\x8d}\xb1\xce\x94d\xd8\xc5\xa4\x86N\xe8ac\x15oL6\xa8*\x19QB]1\xfa\xbe\x1c\xdaCR\x8a=\xa2\xad\x92\xfc\xe8\xdeA\xa8\xc9xn\xa1)\xdcEX]^\'\x07\xd4\x19ea\x96\xed]\x97\x0b\xf4\x133`\xc6\xabSg4;\xcb\xca_\x80\x80\xfcS\xc1\x81\x82\xbb{\xb8\xaaP\xbc\x1b\x13\x80 \xe7\x9fp\xe7k\xb0\x87cbAB\x96\xff9\xdc\xa6\xd1X\x18\x16P\xe7H\xfe\x0b>\x10C\x88\x83\x866\xb8\xcd\xbeSJ~\xdb}\x04\xf2Z\x84\x9c\x8aRSh\xdd\x0bn\x16\xca\xde\xaf\x88\xd0\x1ce\x87\x91\xdc\xb4\x99/z{"\x98uJ\x0b\xebo\xa3\xc9\xbf\x1c\xff\xce\xe97\xb7\xd5F5\xda7Ck\xee\x88\xdb\x8f\xadP\xe1w\xd6\x87\x81\x9b\xe0\xdc\x13\xbb\xf8\x0f\xee\xb3\xb2\xa1~_\x84:\xe6\xc2;\xc5\x0c\xbc\xc8\xa8.\xae\x94q\xae\xc9\x1b\x10~|\xb4\xb1C\xe4\xf4\xcb\x88:D\x00\xfe"\xdc6\x864&\xbb\x93$\x87\xef\xe4\xbf\xa9\xa6N\x00:HE\x12`\x00\x1c\xe2m\xab\xc8\x9d\xea\x08)\xa3o\x8f\xb9\xc8\x9b\xca\x98\xc50v\xe5Iq@\xd7\xa1\x98|I\x1cv$h\x10\xd4L\x8d`\x822=\xf0\xd4\x0b\x99\x07\xbeb\xc00\xe8\xed9F\xc7HIO\xc2O\x10m,\x18\xd5\xbd\xb2W\xe9\x1d\xb6M\x8dP\xca8\xb9\xba/[p\x81\x80\x1e\xd6W\xd8\xff\\\\\xf5\xcaa\x8b\x9bl\x9er-Z\xab|\xb0\x9c\xa6\x1e\x1f?=U\xccj^\xd9\x84>\xb3\xcb\x11\x0br!\xbb\xaa\xb6\xd1g\x97\xe4\xf3\x8a\xb9O9\xf4\x07D\xef\x18\xf7K\xe9G1/\xe4\x08\xc8{\xbf\x9e\xfb<M\xc7\xc6\xb1\xffi\x97\xad\xe1|\xf3\xb9.Z\xd9S\x1d\xa2S\xd9\x8bi\x94\xcf\x86\xbe|\x81\rVjw\x11\xb7\x93\x1a\x9a\xe9\xd1\x88&E\x18\xc9\x94a\xb5\x11-\xc8\x89\x97Y4/\xe8\xcf\x9e\x8d\xe5b7\x98m\xd4FPw\xc8\r\xbf1`\xb2=N\x05L\xbe\xc8%\x99\xf7\xac\xc6b5\xec\xe9\x9f\xc4\xa6;2\xd3Y\xd3\xf4{\xb4\xca\xb9\x8c\xd2\x12\xd64[L\xae\x9c\xe3d]\xd1\x9d\xbd\xdd\xfc|i\xb4\x98\x07h\xf8\xb3\x94_#\xa2;[\xc2\xa9\x9f\xe5?k\x16\x1e\xd40\xa4\xa3\x07\xab\xa3\xb2Q8Ab.\xe6mB\x00 \xe5\x88\xcd^t\xd6\xb8N\x9dr9{\xd62\xeb\x16\xf1fzg\xca6|?5Oek\x07}mi\xa2\x9a\x8d\xa6\xce"\xc0\xe65Sh\x8axh\xa6o\x83\xeb\xc8\xa3\xe1\xd0\xa68\xd2\xb4 \xe5\r\xff\x91\xf6\xaa*9\xc4\xc3\x0e\xc2\x9a&\xf4!7\x87\xb7\xd4\x0b\x02\xed\xd7o^\xf4!]\xdb\x87\xa0\x1b\x1a\xcc\x84\x05R.\xc6\x1c\x86\xfc\x1a\x19\x0bb}\xa3z\xab\'\xe8\xe2\xe0\xd3\xec[\xb3 \xaeb\xeff\xf2\xd8\x81\xb7\xacd\\\xd9G\xcc\xa7\xb8\xcf\x05N\xe6\xbe\xd1\x9a\xa39hK\x12\x13\xd8M\x8eq\xc4\x9c\xccf4jQk(>g\x86\x08\x12\xa7\xdbe\t\xc7su~\x86\xf6\xaeb\xe8\xa2\xdd\xea\xbd\xd3\xb0n-\xe8\xed+t\x12t\x14\xeb\x8dL\xf6\xc2\x8d\xd9\xda\xd21\x83\xb8\x86\x1ck\x96\x85\xe5\xcf\x9f\xcd\xa5n\xfc\xbc\xfd?\xf4\xb1\x1a\xd5\x99\x12Ql\x02\x86\xdb\xfb:6z\x01V\xae?\x87\xca\xe4#\'\x8ec\xd7\xcf\x12\x99\x18\xba|\xfb\x97\xe2y\xe0ll5\xee\x9dd\x15Y{\xb8\xf8\xba\xde\x8dy\xa3\xb6\x03S\x8eg\xe7\xb7\xbb\xa9\x91\x04R\xeb\x80\xb57\xd8b\x1d%]]\x00q\xf6*H\xb0\x0c\xf4\x85\x83\xba\xa7\x19\x96qf2\t:J\xd0\xd1\xe4\xe5\xe1h!\x05\xd4\xdaN\x1ff\x05Uf\xba\xb5\x91\x91\xb0U]\xca\xa6h\x06\xa3\x88r\xbb\xbd\x1c\x94\xa2\x88\x1c\x00m#\xcbI\xa4\xbag\x17(>\x9drY\xb8K\x1b\xcc\xa3$L\xfb5\x99qhs&\x98\x17\x7f\xceK\x13\xc3\x97\xfa\x81\xed\x96\xde\x0c\x9e\x16n\xbe\xbf\xdf_\x0e\xfd\xa26\xd9l3t\x8fbf-G\xc9\xcf\xfe\x0ea\xb5\x085\x8e\x85\\\xd8\x04-k\xabV\x8c\x1b\x9b\x8a\x96d\xa8q\x03\xa8\xba\xbb\xc6\x9f\xa5\x04\x94\x0c\x1eq\xcb@\xe4\xdb\xe2w\x9d&m:\x17{E%\x9e\xde$\xab96n`5T\xf7\xe3\xe3p\xde\x89\xe0\xfcxN\xacQ5[\x03\x7f\xd2\x03\x1d\xf8\x81;\xe2\xdc\x11\xf2\x91\x9e\x8b5Rv\xa6\x8d\xc3j1\xbe\x19[\x87\xbf\t|+\r\x9b\xe6\x1c\xfd\xe9\x93\xe8?\xefeBi\x96=\x81\xa6\xb4\xcd\xacA\x93\xfe\x8f$\x11a\x94U\x8eHd\x13\xec\xc0E$&%N6rW\x81[\x87\xealm\xa7\xff3\x8c\xccp\x9d1\x98"\xfa\x8b\xb1\xf2\x81\x0c\xca\xf2f\x1e\xcbe\x89@\x9fx\x941-Q\x92\xf7\xc7{\xe5\xd2\x16\x15.8\xaa\xf6\xf6}\x83p\x1eT(U\xa7|6\x17\xa2\xd8\xf3;\x98\xc7\xb4\xc44\x07Q\xfc\rW\xe4\x19\x14\x0f\x9af\xd5\xf8\xea\xea\xa0.\x15\xaa\xbf\x17B\x08\xab\x1b\xdb\xd6>\t-\xa2\xce\x9e\xe0rVJ8\xa7\x1d\x0cE\x94Y\xdb\x88\x19\x8b\x8a\xb9\xb9\x98\xc8Q\xcc\x04\xd4\xb3i*\x8fN\x90)\xab\xe1\x92g\xd2\xda\x8aC\xbe\xe0C=\x86\x8a\xac\xce;\xd4(\x90\xd1\x9etVN\x02\xb8\xcb\x1dD\xf9\xe0:Y\xa5\x8b\xde$\x19\xbb\xc9\x94\xc8-\x7fi<\xd6\\7\xb1<\\\xf2\xea\x87\x14\xe0\xea\xe7\xa7\x0e\x94\x19-\x0fP\xd7\xb6??\xe1\x18Jh1\xb7@\xd5^\xe0\xbe\x92\x11k\xd7\x1b1\x90\xb4\x9dEuk\xf2\x7fcgs\x82wv.\x7f\t\xd7\xe7\x83\x9b\xf57\xf8\xff\xc3\x17\xe7\x8d\xd6\xa0\xad3\x9fs\xcf%:+\xde\xc8\x91\x1f\x87\xfa\xc0\xda\x05y\xe5\xcb\x9d\xaf\xc6\xfb>Na\x834\x1c\x16\x18\x83\x89X\xf0\xe8_ZB!j\x12\xf7\xe9u\x07\x16D\xcbq\x12\xe3\x94</\x12\xa5\xcf\x15`]\xd7^\xd9\x15\xa4\xe9\xfb\x02\x17X\xa4R\xf0\x16m|}\xfb=\x08\xe3\xf2P*\x90\xf1P\xe6#\xa5s\xa4\x08lL\xd9\xbe\xcbm\xf8\xfd\x9a\xb91s\xf1=\xd2\'\x08\x8a\xe2Tv\x81\\\x9b\x9d\x1b2VV\xfd}[\x10\xf1\xbc\x98\xfd\x06\xc8m\xe2\x14lY\xb2\x993\x87\x98\x0fKC\x9b\xe9g\rh&\xdc{\xec`\x1b\\\xeac\xd0x\xe9\x1auU\xac\xfe\x1a\xe7\x87\xabv\x9e\xe6\x1c9w\xa2\xa1\xd1\xc3\xd4\xd0b\x9b.\xd2\xc3]\xe9~I\x8dS/\xc9\xaa\xa0\x95#G\xbeK\x1a\xe3\xf0\x18\xaeqv \x10H\xd2\x85\x01\xf9\xd7<i\xd3Q\xe7\x8e\xcf\xea\x0f1\xe1yG\xc05\xaf\xef\nB\xde\xbe\xd6\xf0\x1a\xe2\xc0\x19\xc2a/\x01*Q\xa5\xed#_e\xe7\xa8\x833\x8b\x0b/\xffg\xab\x8a\x8e$BX\xdb\xa2u\xbf+\xeco\x12i\x0coU_)e\xf8D}\xaa\x87\x93,Bk\xeb\xf7\x9e\xe9\xcc\xa1\xd4\x06-$\x11\xf8\xee\xb8\x05\xd81\x97\x01w\x91$~Ya\xe4\xf2\xf5b\x894\x1e\x8eI\x85\x8fM\xd0h\x8e\\""j6\xa8\xe1\xfd\xfd;\x88\xf1\x0cg\'\xf8\xaa\x91\r\xb7O\r\x1f*py\xe8\xee\xd4!\x8e\xc4<]\x84\x94}\x0c]2\x85\xa9\x0e\x1b\xa9\xa4\xa0\\\xef\xfe\x9c\xc8J\xdf\xcf\x1c\xee\xa8$\x18q\x18\xcb\r\x96{\xba|\xad\xd0\xe9\x03=\xd0\x03MJ\x0e\xf7E\xf0d\x83e\x1e*\x9a\x15\xcb\x84~\xcf+\xb8\xfb"!\xda\xf2f\\z@xnB\xefh>\xaa\xce>\xd6\xae\xb9\x8a\xcb\x96C\xa6\xae2\xbf\xcbF\xf0\x98\x9b\xdb\x1eeRZ8\xf1g\xf3x\xba\xca;-\xd5\xf7P1e\x9bn\x10./\xd4\x0b?\xe3\x0e\x92\xe89\x1eQ\xe5\xb8I1M\xc2\x1f\x9a\x7f\xa7,\xd0\x99@1U\x93W\xe4\x02\x109\xd0\xd7k\xeel\xd9\xd4,\xba\x98\x1aq\xa3A\xeatr%\x8e}\x9a\xd2bd\x90\x81^\x99\xfbdG+\x1c\x1a\x7f\xdd\x97\xa8\xa2\x14\xb3:\x08a|<\xa8\xc4\xff$\xf3\x9f\xfbR[4\x0b\xa4\xb7\x0c.\xdf\x84\xfal%\xc2t\xd3\x14Ir\xa8\xf24\xfd\xc727\xe2\xbc\x7f\xf2\xe1ja\x16\xf9\x826\x19\xe6\xe5\x0c\x9dpl\xc7?\xe6Fl\x84\xb5\xa2\xe3\xd2\xa9\xa0\x88\xcc\xcc\xcc\x8e|\xf7\xb0\xcd(\x0b\xc5\xcc\x06"\xa5\x81\xd1\xfe\x0bw\xca\xd4\x1aTR\xdb\x0e\xe9\xf9z\xba\xb0\xa9\x85C\x85\x9c^\x9a`\x88\x96\x0f/\xb9\x15l\xef\xe6t\xefy\xf0Q\xfe\xe6P\xa9\xb6?\xa6\xad\xb4q\xa2=F\t\x91\x83\x1a]y\xd5,\xf8\nA\x1b\x9b\xf7\xb2J\xbfU\x00\xd0X\xe9\x92:\x9f"yz\x0c\x11}\xb8\x08C\xbf\xb8^\xf1s\xb7\x84\xb8\x9b\x9e)\x16\xceJ\xa7z]"`\xc0\xde\xbf\xf0Q\x95\x82E\x9b\xa6\'\xe4w\x9b\x85X\xe4\xd9\x014\xe4e\xd7\x7f\xdf\xe4\x12\xf1\xaa7\x8e\xfflU\x1ddc\xf9f\xfb,\x93:\x8bl\x03(\xba\xbb\xdd\xc3\\[\xe4\xc5`\xaf(\x9d\xd8\xe0+\x149\xca3\x8a\xe4\x87s\xf6\xf3$~?\xf1\x1b\xabC\xcc\x8e\xa9\xb3\xb4\xb4X\x12\xad\xae^)\xc7 \xc9\x0ea1\xee\xeaGi\xc9\x94_\xc9\xb5\xd0\x9a\x15}\xb5\xbc\x90\x86\xebrt\xd3]BP\x1d\\.\xe5\\+m\x0fa\x7f\xc1\x18\xf3\xda\x1fw\x99\xe7\x1e\xac\xd1\xd2\xc2\xafu\\$\xd3$\xfa\x0fs\xf9\x11!\xa0\x02V\x81\xa8Z\xdc\xa9A\x94\x9eZ/Q\xd7\x8b\xa0\xf0\xa5|\x02F\xa1\x93x`\xcb\xef\xc3ZS\x18}H\xeb\xc82&e\xc0\xd8n\xd7S\x1a\xad\xf3@\x02x\xd3\x10l\'\xcd\xff\xee~3\x90\xd3\x04o\xb828\xfch]\xc7\'"\x15\xfa\xd5\xac\xc0\xeb\xb5lW/\xd2\x90\x92\x1a3\xabh\x0e\xd8\x8fE\x87\xfc\xd0\x83\xb9\xcf\xd5ryC59\xe6\x8b@\x97JQ\xf5\xb3\xdb(\x97$w\xa6pa8q\xa6\xcc\xc9w6\x0c\xe7-\x8d\x8a\xff\xf9\xe7\xa5\x04\xec\xc0\x85\xc4\x00\xb3z\x8d\x13\xf8\x9c\xd2\x89\xd9\xab\xa2Q\xf1P\x86\xee\x1a\x8e\x0eg;\xda\xc8\xf9\xce\x07CE\x11\xf7\xc1\x8f\xe7rJ["t/\x84h(\xa5hhh\\\xb5\xbe\x06v\xe2\xe7\x81\xc3\x1fs+k\xfc\x94\xd9\xcd\x08\x1f]l\xbc\xf0F{\x1c\xa6*|f\xc0T\xde\x07\x00\xab\xab\xdb\xfc\x18\xd8\xc0fw\x04\x04&\x08\x13\xb7\x19\x8bm\xdeS<\xe7\x1en\x01\xa5l\x97\xd4\xfbm\xd8\xfaG\x8b\xd5v\xdce\xf2\x85\xf3g\x00\xb4\xf6\xa6\x9a\xda\x9b\xfc\xd8\x9b\x1a^\x15\xc9\xa3\xf3\\\xad\x85:\xb0=\xfd*\xd2\xce\xb3 \xd9\x9e\xc6h\xdc\xaa;I\xad\x96\x89Z\xe1M>Qe\xf7h\x81\x12\x8an$/\x1f\x80\xf6\x16\xcb\x0e\xb4W\xe3G\xf2(\xd5\x07\xe3r\x93\xbbq\x90\xcd/\x88\xd9\x05\xa6,\x99\'\x8a\x1c\xdbD\x17\xd0\x06\xfb\x1c\x00m\xe7\x05v\xb7P!,.\xaf\xc6\xa2RE\xe6\xc4CLSx0\xdd\xb2\x8b\x94\xc5\xd3:\xb7\xf0\x9aS\xd8\xbfih{.#c\x806j\x89)\xc6\xb5\xefn\xd1N\x1ca3\xba\xc1\x01\x11#\x8aU\xa2"EU\xc7\xe5\x05\x94a\x93\xbc\x11Y\xfb\xe9\xc60\x8f\xc2\x84\xaf\x8f\x0b\x81\x9f\xad\x8e,vt\xb5/\xf3\x93\xa3\x12\x86\xd5\x9ci\xd9\xaf\xf3\xae\xf9b\x0c\xee\x80\x8e:a\xe5\xa7C\x11\xfby\xd1\xe5\xdd\xa0/\xb0\xd0\xf3\xd6\x0e\x8f\xa0\x84$q\xd3XK\xff\xde\x1aq\xd1G\x1c\xa9=\x90\xa0`|\xe1\xdc\xdc\xdfq@EZ#\xd8\x86e\xa3LK^\x1c\x9f\xc9\x98\xaf\xb7\x83\xb7>h\xa9g\xbd\x11=r|Z\x88p\xc0Wr\xac\xa8\xbb\xd8\xc4Y\r\xda!\xb5\x82\')`\x0c\xbb\xf3\xb9\xeaK\xe6+\xaf\xc0/\xe6;p\xb2#\x8e!\xca\xd3\x01\xf1$d\xf5n\xe4\xd1`BT \xfb5wTL\xfeb\xc9\xd0Dcs\xe8\x94\x0f\xcb\x93j\xdd1\r d6\x80.g\x13\xd5\x0c\xa6\xbd\xb2./13\x8bj\xef\xb0\x90\\\xd7\x17o\xd3\x00\xf5OW^\xf0\xdc7]\xb3s\xff9\xbfN\x9c=\x08C.\x16\xa3\xec\x7fb2_ \xc0\xfe\xb4\xe0\x9d\xd5\xaf@@\x07\xb8\x05\xa6\x1e6[\xe0\xff\xe76\x94\x1e\xe6#o\xc0o\x96UYs\xacjM~-\xda\xab\xa0Y\x9c\x9a,0\xcb\x04_H\xe2z\x95\x8c\x95\x8bd\xe3\xd7\xae\xb2\x1d{PBG0\x8cow\x9c\xaf\x0b\xfc\x95\xe7B[F\xe6\xa3\x80+\xc0\x9cZL\xa8\x8f\xe1A\xa0\x9b\xf1\x89\x8f\xcb)\xdb\x08#\xe7\xd1\xd7\x86.jm\xa5\x01E5Y\x01\x95\xed\x9c\n\xe5R\x9f\x18\x81|\xf9\xfch\xb0E\x9f\xbeY^\x92\xa4Y?SQ\x19\xce_\xc1H\xe3\xb0\xdd\x91\xaa\x9f\xf3\x0e)v\xb0f\xbad\x97\xb3|f36\xdfL\x98u\x87\xa9\x00\xf2\x8f\xf0w\xcc\x99\xc2F\x13\xfd\x9d\x97\x8f>\x80\xda\x10\xcd%\xf5\xd6\xb4\xbc\x07\xd4m\xeb\xb7\x9f\x85\xa0l\xef \xc2v\x96Q\x81I\xf0\xadJ\xd4\xca\xe8P\xa1\xea\xff\xbc\x00\xa2A;\xd7\xcf\x99\xa6\xcc[\xfb\xc80q#X\xd1\xa5b\xdb\xe4<\xa1\xcf\xe9:#\x81\xa0\xbb\x00jE>y\x96\x9e\xc8\xa8\x90D\x94<M\xcf\xf5\x1d\n\x1d\x85\xdb\xb2\x7f\x7f\xb3\xa4\xa2\x17\xdb|\xd1?\x80i\x08m`\xcax^"\xbd\x81\xae \x01_T\xd2\xbe\xf3\x8d\xd4V\x87\xdd\x05(v\x9d\xc3\xdb]V\xec\x9a\x15\xfd\xb6\xd3\xef\xdd\x14\\\x01d\x87\x90R\x8cj+b\x19=\xf5:\xb8\x9cB<\xf7\xf9\x1f,\x96f\xd4\xac\xa3spL\xfb\x1ewO\'\xa14\x91\xb2u\x91\xdfe\xa6f\xc2\xae\xa9Q\xc0\xb5\xd1\xf1\xe57\xda\x02\x14\x197\xaa\x81f\xe7N\xdd\x8e\xf87N#_\x9ekk\xe9\xec\xad\xb2\xb2\xcaT\xe6\xaf\xf0\xcc9\xc5\xaaX\x9aH&\x87\xf2\xc2\xb8\x9b\xca(\x82\x84\x12\x0e{~\x1b\xff4,\x08]D\xca\rz\\\x10\x1a\x94d\x04\xa7\xe9(f\xf4\xb1]9\x84o\xcdz\x05\xab\x1f{\xb5>& \x19\xf2\xc2"\x8ac\x96\xc7\x87<\xe1\xee\x16\xdc\xca\x94\x8f\xc2@\xdc=B\xe1\x1b\xb91\xde\x89\xea\x18:\x8aae[\x13(\xfcz\\W\n\xca\x91\x06\xe9\xb4\x15qh\xa7\x0b\xff\xbeG\x18F\xa3\xfbr\x07^1\xed\x98#NuW\xc5\x03\x14\xef2\xf0\xc6+<\x99l\xba\x10l\xc6\x18\xd4\xb5S\x88\xe7?\xcd\xe73=&\xcfP+n\xcb\xc15W\xda3\xfd\xe4E\xac$\xa8\x0fE\x83\xc1\xc7\x8fZ\xb3\xef\x94\xb7/qU\xb8\x05\xec$\xcc\x89\xb04n\xf7\x93\x05\x94\xe2\xd3ve\xd4\x86BD\x81\x0bk\x0b)\xb5kGU$\xb9`\x9ax\x9a\x87\x1d_\xda\xf9\x86\xfeEx\r\xd6\xef\x97\xd0\xa0~\x9cT\x95\x19"\x93\x98\xc6\x9a\xd9\x1a|\xab\xdbE\x14\x8a\xcb>\xe2\x84\xc8\xddk\xfb+\xaa\xdf\xc7]-\xcc\x07\xea^\xe6@\x8f\xb4/\x94\xdbZ\x1a.%C\xcb(\xee\x1e)\xb8~\x9a\xe6)\xa5\x0c\t\x81B\xad\xb1m\xcf\xf6\xde,\xc9\x0b\x03\xadG1\xb7\x83\x08\x95\xdfr\x9bb\x00\x80\xd3\xb8\xc7\xc8\x13\xfe/\x8e\xef\xc9\xd2\xb4\xdb\xfcc\xfc\xf4\xcc\xe9\xac\xdf\xf5\xd3rM\xad\x9a\xb2\xbf\xeb\xd0\xea\xd0\xe85O\xe7\xee\x83*\n\xb5\xfe\xf9\x84y\'K\xd1\xee\xe9\x94\xdb\xde\x0b\'\x97\xb0\xdf}\x85\xc7\xfe\x85\xc0t\xa9\xc2\x15o\xb4%\xd3\x90\xfd\xc3xv\x0b(\xe8\xf4\xd5\x0e\x13IyA\xb1\xf027\x82\xa2\xf5\xc2\xdb\xb0\xec\x17\xee$/\xb4?\xad\xdf9Cb\x82\xeb\xcby\xec\x06\xba\x884\xbb\x97e\xb1O\xa1G+Q`S(\x88#\x83&^\xa0\xdb\x8f\xe6\xe0;_;\xc2\x1c\xeb \x14\x05JS\xde\xbe\xab\x03#\x0cr\x85\xa2X\xe2$\xf7\xce\xa6\x90\x16A)\xda/&C\xc5\x03\xe0\x87-\xae~\xa4\x05\x04\xd6i\xd6V\xd6\xe4\x975\x17\x8b\\;\xff\x02\x91K\x1aA\xd6\xffH\x07\xdf\x82Y\xb3\xde\xec\xf1\xf6\x84\x9eM\xcdx\x95\x1a<7\xb5\x8b\xd3\x1c\xba.\xda\x9cj\xb8\x10V\xae\x9fl\xeep\xdeMm\x9a>\xb1?n\xdb\x80B$i\xd2\xfd\xb8h\xd8\x0f\xd7\xc2[\xa9q\xb0\x9b\x83\xd0\x82t\x10\xf9^U\xdc\xf8\x18\xa8]\xad\xc9\x94\x1and\n\xe7\x0f\x84\xd0\xafz\xe2~u\xe1\xbajr\xa3\x89]\',#\xc3m|)\x06\xce\x12()\xba\x02\x04\x83\xe3\xdd\xf46\xc0\x9a\xf6\xc3\xa8\x91\xc9\xa3\xa5\xc4\xd9\x81{S\xe33\xb6\x7f\xc0x\x97\x12\x95\x92m\x0c\x0eW\t\x10\xb2Csv\x13\xeb3\x1ej\xab\xea\xa4D\xb5\xf3\xd6\x1d\x12\xd3\x8f1\xdc\x9c\x98\x08/\xba\xba\xa9z\xb1\x05\x18~\xb5\xb2\x18hw\x98\x16\xaf\xf8\xb3\x96D\x8dvL2&ie\x1c\xb41\x11 \x95\x1a\x01\x08QF\x07\xb5\xa4\xb8\xde\xce\x89t\xb0\x81}\r\x99\x07\xea\xef\xddi\\\xd6f\x03\xe6M#C\x06\x9f\\a>?\x13\xb4\xcf\x15\x1c\xca\xe5\xffW\x8ag\xe3.\x14^F\xb8V}\x9c\x90\xcb[9\xf0j\xfd\xdcs\xa8\xa3\x0e\xb4\xa08\x13\xd9\xf2\xc6\xee\x08\x16\xa4`P\xc7\xd4Q\x16z+}\xec\xe4|=\x05`\xa0@\x0bB\xb9\xd7\x16\xe1Q,\xb8;\xbc\xd5\xcbj\xc9\xce\x1f\xf6x\x07H\xe9\xf6g\x0cDmD\x81y\xb7?)\xa0\x07\xd3\xc2+\xdb+Z\xd6^=\xc5\xc7\x05\xdd,\x89\xf1\xf4;\xb4\x8eq+\'\xa24\xf8~\xf9\r\xdf\x90\xd5}\x10_-N\xe2\xe0Q\x90\xea5m}\xbe\xbc\xb5\x0f\xe1\xfd3s\xe8B[\x86\xa7R\xbenL\xe08\x12"\x16\xd1\x8e\xfd/<\xc9\xca$v \xd7w\xd4\x7fZ1\x92\xd2\xea\xb0D\x1a\xd2\xed\x1a1n\xbfJM\x02\x00?\x0e\x98\x13\x00}\x86\xbbP%\xcd\xeb\x1f]~\xcbj\x97+V\xe1 t\x07\x04v\x895\x806\xcb@\xff\xb6\x86\x8b\x8eW}4\xb0^\x9e8&\x06\xea\xdd`\x16R\xd3\xde}\x9d\x99^H\xca\xc6j?\xf9\x89\x90\xeb\xd6\x8d\xec\x1c\xf4Sb\x0b\xf7W2\x93\x0f\xb8&\xcb\x9d\xdd58\x07\xfd\x02\xfe\xca\x02\xf6\xb1\x8bqK\xf5\x87\xc3\xb0\x0e\xcd\xad3\xceP\xcf\xe0\x05\xf7G\x0es\xc1\xc2\xfa\xb0bW\xa8\xdfi\x89\xb4g\xeb\xcdLq\x0e\x16j\'\xd9\xc1m\xce\x91\x14\xce\xe7\xd1\xcc^x\xe4\xc3o\xa0\xb1m\r,\xac5\x8b4\xa7<\xeaKP*\xc8\x98M\xc2\xab\xcd2\x89\xd4b\xd9\x88\xb0\xbb%\x16Lv\x05\xe5NQ*DX\xe2\xba\xeb\x17\x86\x9e#\xb6\xdfb56\x7f\xc5N`\xe6\x12\xd0\x9c\x81\x81h\xf9y-\xb2\xff\x1fi\xac\xd8\x92/\xcd\xc2\xccS\xcd\xce\x98\xde\xdf@\xb1Y\xf9i\xda~~\xc6q\x91W\x93<\x15d\x8d\xecT\xfb#\r\xfcg\x88,\x1c~\x10\x04\x19\x93\xc4\xac\x9c\xab\xa3\xeb\xc0\x03J}\xacg\'\x8e\xba\xc8\xe7}\x8e\x9f\x19\xffDbW\xa4\xad\xd3\xbb\x85;/T\xde\xd6\x9b\xd19\x16\xb2-\xa7\xed\x16\x94jR\xeb\xe8A5TL<\xdf\xab\xf7kV\xab\x8e\xbb\x90\x8eU\x1a\xd94\xff\x0c\xb2\xe5\xa3\x01\xe2]\x87gE\xd1}\x82\xdaY\xb1\xe8w\\\xfd&\xb9\xb5\x9d-\xf1\xd4\x02\xd5\xddPo;\xc8\xd6U\xe5\xbd\x82\xa6\xd2k\x83\x83;>{\xc0D\x93\xbd\xeb\xe6\xdc^\x9b\xfb\xc4\xd8\xb4\x95\xde\xb8S/!\x13\xcc\x19\xc0Qb\xfc\x11\xcf\x11\xfe~E\x13,\x1a<\xf3\xc2\xdb\x9e\xdd.\x9c\x98\x89a\xcd6\xa2\x193\xd8\x05\xea\xc3o\x17\x83F\xfdb\xe4aB\x89E\x80>v\x11\xdbH\xdaj`|O\xa6\xd18\xc3,\x86L\xb5b\xach\xac/\xcf\xa6\xfa\xe7"\x1fU\x1a\x87\xfa\x830\xcd\x12u;\xfe\x18\xff\x10\xec\xff\x02\xa1\xd5_i\xf6\xa9z\x19\xf2\'(\xef\x8b\xed:U0m\xd2\t\xc6\x98\xed\xe7\xd5\x93\x0bx\xa15\x13\xf3\x97\x85\xb3.\xe3\xffb\x80\x12\xcb\x8a$\xa6\x1a\x89\xd7\xff\x90\xe5\x1a\x1a\t0s\x16U\x1d_\x93\xe2\x15ic\xfb\xa7\xc4)G\x18\xf5V\xb4\xd4\xe9\xaeg3\x019\xb7\xbfN\xcav,\xc5\x16\xb0X\xe6@\x95i\xf5\x92\x86V\xee\xf3%.\xbc\xe4C=P\xfc\xe9-\x887=\xa1\x0c\xe1\x85\xfa\xa0\xa2\xc74\x8eC\xc6\x11\x8b\xcf:\xf5\x94\xe1\x89-D\x14j\x87k.,\xb0\x00\xf5\xfcj\x9e$\x97\xdf\xa3\x15\x10\xd0\xf3:\x99\xc8\xc6\xe3\x87`y\x98K\xc1\x82!d\x1c\xbcJ\x85p4\xe8,8\xa9{\xbf\x98\x81\xc6\x93\x90\xd4\xda\xbc\x06\xc7\xfazp\xc1\xd0]\x10\x125b3g\xe0\xad\x8a,\x9f\xcd1*\xfa\x81zt1\xdeR\x1dOH\xf1\x06\xfee\xa1\x9f\x03\xad\tFt\x15u~22T\x87\xce6\xd4\x94)\xc4q\x9a\xc3\xce\x9bHTQ\xf1M\x19\xf7\xb3\x98`\x13\xb7S~\xa9$\x90\\O\x12\xe2;\xc1%J\r&\xc0\nN\xbcz\xa9\xd5\xe6n\x0c\x01\x1f.\xd1\xedU\x88\xb9\xd3tT\xa7KSf\x00\xf8\x05\x16_\x0c\xdax\xd2\xa7R\xd2:\xc0\xfe\x90\xa8\xa3\xee\x1c\x89\xc7\xa2\x94m\x84\x92\xa0b\xbd\'\xf6\x00\x86Br\xadW\xc2\xa1d\xa3\xf6\xc9\xdb\x0f\xae\xe1^K\x9e\x10\x89\xbc\xc9\xc1T\xad \x1e\x02\xbdN\\\xe7N\xf8\x1b\x06\x84\xb0\x9a\xc2\xe4\x92\x9b\xcc\xbe\x0f \xc9\xac\x18<\x81v\xcc\xa8\xdc\xcc/\x03+\xec\xb4\xb1<q\x80\x14\x8dI\xf2\xb0\xe0\xf9\x18\x9b3\x18>0\xea\xba\x12\x8b\xa4`\xee\xf8>x\xa0\xaeW\x9f\xf6\xba\x17@\\\x14\x02\xdd\x8e/O\xb79L\xdf\xca\x19\xa2\x1cu\xdf\xdf1\xb24"\x97>k\xffc\x80\x03\n\xfae \xab\x82/\xa6\x8bE\x14\x84\xdb\x84\x11]n\xb6\xf0\x1b\x12Q\xc8s\x82j\xb5\xae\xfa\x06\xd9\xaa\x8e\x15au_l\xcd\xcd\xf3\x9ar\xc0\xbd\x02\xedC\xd2%\x05\xa89yL*$[\x9f\xfb\xc3\xd4\xe2\xb2\xab\xc8\xa0\xb5rH\x11\x9c\xce\xb4\x96\xfc\x85\xb5\xb1\xd5\xfa\xbe`\xb7\x1c\xf9\xdb]X\xe4\x84\x89\x18\x12\x0e/\xe23@\r\xb3\xaeoR\x86\x16\x1b\xb1\xd2\x8a\x19\x163\xees\x81\x1d\x96\r\x8f1\\`h\xbd%Q\x10\xa56\xa7\xc0U\xb1\x926O\xaag\xd1&$/9\x04[" \xf6M\x85\x9f3\x8b!\xca\xa6_m\xe6\x81l\xe1\xc8\x99\xa4\xa1>3\x18x\xf3l\xbeo\x18W\xe0N\x8e\x04\x8a7\xb34\xfc\xfaa\xab\xed\x7fl\xb9\x9c\x87\x9d;\xee\xf5y\x8d\xf9\x00\x03N\xa5\x15\xb0\x01B\x02k\xb1V(\xc3M|\xb3\xbd\xc1^F\xccc\x9c\xa5/\xb4`\x8a\x01#[\xe3\xcd\xdc\xdd\xf9\x90e9-#\xf2b\xd3\xe2\\s\xf4=ZU\xaa\xb9\xae[\x99\xb9(BI\xebnb\x9dI.\xb6(B\x06u\x11\xdf\x9d\xbf\xb8V\xcf\x15\xb2K8\xc7{\xb2*\xb0\xe4\xf0\'C\x9b5\xeb\xf0E\x12\x92\xce\tu\xc2>+\xb7\xad\xb3\xf6|\',\xfe~\xa4o6r\x94\xd1\x16\xdf\x0b\xcd\xec\xacv\xda\r\x0eE\xdd\x19\x1d\xae3\x13F\x84\x1fy\xb0\xb4\xcer\x16\xb5\xd1\xc0\n\xb7@\xca\xcb\xc28\xd3\x9b\xfbn\x13O\xf3\xe3\xf3\\\x99\x1b$\xdaqbs\xd9\x11\x1c\xda\x82\xdd\xfduN\xc4w!Q}E\x8a\x07r\xfa|\xd55\xdbI\x14pm+\xf0`\x89\xe8]`8\x99\x02o\x10\xf59\x8b\xf0\xf2\xb2\xab\x05\xcb7\x19\x8f\x0b\xb2\xb95\x08\xff\xa5\xc6\x9e\xae\x95\xf24\xf6q\xd00\xaa\x0b\xb7\xc8\xee\x92\xfbB\xcc\x95x\x0f\x87\xd03\xb2\xacK\xe8j\x92\xb9\x1c\x98d5\x1bX\xc0OT\xc5\xe1\x91\xc6\xc9\x1ep\x16\x17\xd2,.\x16\x07\xc4\xbd\xd8\xfc\xfeH\xfe/)h\xca\x0c8\x12\xdd\'C\xd35K\x01\xe4l\x83\x84\xdb\x8a\xfb\na\x06\xdf\xa3\xec\xe6X_\xdf\xfc\x1cB\x08\x1be3 \x94\xda\xa2T\xf2?#d\xa5\x01TV\xaa-\xe7\x01\xc3\xa0\x11d\xff\xf9\xc3\x97\xd2o[\x85\xc4\x97\xab\x0c\'\xd4\xe2\xe5\x8e\x027\xfaL\xdb\x96w\xd3\xde>\xad$\xfc2pt\xb1O%\x81\'\x19\xdb\xac\xce6\x11)\xac\xe2\xef\x02\x9a\xfd\x82\x11wh%y\xa5\x9e\xb7\xd2\x96\x89\x01)l\x9f\x8bn\x9fpJ\xf3u\x802G2\xc6\x82Q\xba\xc3\x99\x83\xfc&\xd5\xa6\xcb\x91\xd2\xba\x93\xb4\x97G\x1f\xce-=5\x13\x92$ \xd6\xf3\x0cC<\x87\x97f\xd1n\t\xa2\x07\xd7YV\xc2J\r\xd9\xe2\x92{\xc4\x05\xf3\x86]\xabzH^\xad\x05\xb6l\t\x0f1\x84\xffu\x17\xd8i66Fk,\xe6zj\x12o\nR \x94u\xa9A\xbf\xcf9)N\'\x1a\xce\x7f\x1bw\x1f\xd7Q\x8ce\xe3\xbdr\x1a\n\xbd\x164J\xd8)\xaaV\x85c\x12\x9a\xeb\xb5v\x91\xb4b\xdf\x1f:\xff\xc3\x98/l\xcb\xbe\xbaC\xea\xb0ji:\x17\x03\xb0\xbf\x15FC\xfdk]3\x93B4X\xde:@\xe1F\x894\x1d}!\x93\x0b\x92\xca\x9e\xc4\xf8\xf3\xd3z\xc3\xa4\xac\xef\xa6]\xd9\xa5Bf\x07E\x94\xe7.w\xaf\xaf\xb7\xe3r\xc2\xf7\x979\xd9\xc2\xe9u55\xd6\x84!vb\x19f/\x82\xb9\xe3\xb9qN\x7f\x88t\x1b\xe1\x13\xb8\xb3\nmL\xd7\x8fo\xa1\xc5\xd4\x87\xde\xd3\xe9\x8b:\xb6\x82+\xcf7Q\x07b\xe5\x16#\xed;\\\xdb\x88\xd8h%\x0f7Z\x89Oq\xf1\x0f\x15\xff\xa3wK\xfe\xbe\x1c=\x85\x00ni\xf2*\n*O\x98H\xfe\x89\xa9e\rV\x18\x9e\xa4\xae+\xdbHn\x00\x9b\xaf=X\xcc\xd5=\x96F7E\xa0\x14\xc4\x00\xb1\\\xc3\xf2\xacW\xcaL\xde\xcf\xa9\xb1B-3\xa7\xd5w$\x13\x8a5\x97\x9b0\x877n\xd7\xe0p\xd8(\xb6\xef#\xf6Qn\x98\x97\x91m\x9d\x0c\x87\xbf\x18\nM\xfd\t\x85\x9eHp\xf3\x1a\xef+R\xe1\xd5\x90\xfbe\x8f\x89\nM\xd14}\x9aE\xeb\xc4Y\x89\xac\xbb\xee9\x01!O\x98\x12\xac\xce\xa6\xab"]s^\t\x11\xd4\x0b~\x88Z\x15?At\xc8\x80\xc0\xe4Z\x12\xe18,c\x1c\xe2\x8a\xe4\x8d\x1ek(\x94R\xd4\x84\xe3f\x0e,\x81\tjb\x7f\x1a\xac;\xec\'\xb8\xb0\xa6~\xc0\xe6[\x80\xac\xd1\x0c\xc9\xb2Ot\xa8\xfb\xd7A\x02\xffX\xa6G\x84\x84\x0bF\x8eH\x03\xea\xa5\xec\xdc*\xdb\xac\x89\xa6;e4\x95\x93u6\xf9\xc0\x87\x8d\xf8\x8e\x9a+\xd1^\xcc5\xe6,+L\xbb\xa4\xb0\xb82\xa7Z\xc3T\x9e\xa8\xdc\xe7\xdcJ')
|
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
|