From be62f45026507330c54b0d3ace90aceb312e1841 Mon Sep 17 00:00:00 2001 From: Josuer08 Date: Sat, 6 Feb 2021 10:40:02 -0500 Subject: [PATCH] Cleanup for stow ---STOW --- .config/QtProject.conf | 8 + .config/alacritty.yml | 2 +- .config/bpytop/bpytop.conf | 36 +- .config/bpytop/error.log | 15 + .config/coc/commands | 0 .config/coc/list-commands-history.json | 1 + .config/coc/list-diagnostics-history.json | 1 + .config/coc/list-extensions-history.json | 1 + .config/coc/list-symbols-history.json | 1 + .config/coc/memos.json | 509 ++++--- .config/coc/snippets-mru | 1 + .config/htop/htoprc | 38 + .config/mutt/muttrc | 2 - .config/neofetch/config.conf | 849 ----------- .config/nvim/autoload/plug.vim | 217 ++- .config/nvim/autoload/plug.vim.old | 136 +- .config/nvim/init.vim | 134 +- .config/nvim/plugins/plugged/coc.nvim | 1 + .config/nvim/plugins/plugged/codi.vim | 1 + .../nvim/plugins}/plugged/ctrlp.vim | 0 .config/nvim/plugins/plugged/dracula | 1 + .../nvim/plugins}/plugged/gruvbox | 0 .config/nvim/plugins/plugged/nerdcommenter | 1 + .config/nvim/plugins/plugged/nerdtree | 1 + .../nvim/plugins/plugged/nerdtree-git-plugin | 1 + .config/nvim/plugins/plugged/vim-devicons | 1 + .config/nvim/plugins/plugged/vim-gitgutter | 1 + .../plugged/vim-nerdtree-syntax-highlight | 1 + .../nvim/plugins}/plugged/vim-tmux-navigator | 0 .config/nvim/plugins/plugged/yats.vim | 1 + .config/obs-studio/basic/scenes/Stream1.json | 397 +++--- .../obs-studio/basic/scenes/Stream1.json.bak | 397 +++--- .config/obs-studio/global.ini | 8 +- .../obs-studio/logs/2021-01-30 11-49-32.txt | 228 +++ .../plugin_config/rtmp-services/package.json | 4 +- .../plugin_config/rtmp-services/services.json | 79 +- .../profiler_data/2021-01-30 11-49-32.csv.gz | Bin 0 -> 234059 bytes .config/pavucontrol.ini | 8 + ...63e046f78cd7b2596e4b0ed4-card-database.tdb | Bin 0 -> 24576 bytes ...9030563e046f78cd7b2596e4b0ed4-default-sink | 1 + ...30563e046f78cd7b2596e4b0ed4-default-source | 1 + ...3e046f78cd7b2596e4b0ed4-device-volumes.tdb | Bin 0 -> 12288 bytes ...3e046f78cd7b2596e4b0ed4-stream-volumes.tdb | Bin 0 -> 12288 bytes .config/pulse/cookie | Bin 0 -> 256 bytes .config/qutebrowser/autoconfig.yml | 14 + .config/qutebrowser/bookmarks/urls | 1 + .config/qutebrowser/qsettings/QtProject.conf | 8 + .config/qutebrowser/quickmarks | 0 .../pipewire-pulse.service | 1 + .../default.target.wants/pipewire.service | 1 + .../pipewire-pulse.socket | 1 + .../user/sockets.target.wants/pipewire.socket | 1 + .local/bin/buttermanager | 3 + .local/bin/donut | Bin 0 -> 16832 bytes .local/bin/donut.c | 21 + .local/bin/onside | 2 + .local/include/python2.7/greenlet/greenlet.h | 168 +++ .local/include/python3.9/greenlet/greenlet.h | 168 +++ .../site-packages/concurrent/__init__.py | 3 + .../site-packages/concurrent/__init__.pyc | Bin 0 -> 261 bytes .../concurrent/futures/__init__.py | 23 + .../concurrent/futures/__init__.pyc | Bin 0 -> 819 bytes .../site-packages/concurrent/futures/_base.py | 667 +++++++++ .../concurrent/futures/_base.pyc | Bin 0 -> 26729 bytes .../concurrent/futures/process.py | 363 +++++ .../concurrent/futures/process.pyc | Bin 0 -> 13002 bytes .../concurrent/futures/thread.py | 170 +++ .../concurrent/futures/thread.pyc | Bin 0 -> 5727 bytes .../futures-3.3.0.dist-info/INSTALLER | 1 + .../futures-3.3.0.dist-info/LICENSE | 48 + .../futures-3.3.0.dist-info/METADATA | 57 + .../futures-3.3.0.dist-info/RECORD | 16 + .../futures-3.3.0.dist-info/WHEEL | 5 + .../futures-3.3.0.dist-info/top_level.txt | 1 + .../greenlet-0.4.17.dist-info/AUTHORS | 51 + .../greenlet-0.4.17.dist-info/INSTALLER | 1 + .../greenlet-0.4.17.dist-info/LICENSE | 30 + .../greenlet-0.4.17.dist-info/LICENSE.PSF | 47 + .../greenlet-0.4.17.dist-info/METADATA | 92 ++ .../greenlet-0.4.17.dist-info/RECORD | 10 + .../greenlet-0.4.17.dist-info/WHEEL | 5 + .../greenlet-0.4.17.dist-info/top_level.txt | 1 + .../lib/python2.7/site-packages/greenlet.so | Bin 0 -> 98183 bytes .../neovim-0.3.1-py2.7.egg-info/PKG-INFO | 10 + .../neovim-0.3.1-py2.7.egg-info/SOURCES.txt | 8 + .../dependency_links.txt | 1 + .../installed-files.txt | 6 + .../neovim-0.3.1-py2.7.egg-info/not-zip-safe | 1 + .../neovim-0.3.1-py2.7.egg-info/requires.txt | 1 + .../neovim-0.3.1-py2.7.egg-info/top_level.txt | 1 + .../site-packages/neovim/__init__.py | 8 + .../site-packages/neovim/__init__.pyc | Bin 0 -> 360 bytes .../site-packages/neovim/api/__init__.py | 8 + .../site-packages/neovim/api/__init__.pyc | Bin 0 -> 394 bytes .../pynvim-0.4.2-py2.7.egg-info/PKG-INFO | 13 + .../pynvim-0.4.2-py2.7.egg-info/SOURCES.txt | 45 + .../dependency_links.txt | 1 + .../installed-files.txt | 52 + .../pynvim-0.4.2-py2.7.egg-info/not-zip-safe | 1 + .../pynvim-0.4.2-py2.7.egg-info/requires.txt | 9 + .../pynvim-0.4.2-py2.7.egg-info/top_level.txt | 2 + .../site-packages/pynvim/__init__.py | 156 ++ .../site-packages/pynvim/__init__.pyc | Bin 0 -> 6069 bytes .../site-packages/pynvim/api/__init__.py | 15 + .../site-packages/pynvim/api/__init__.pyc | Bin 0 -> 750 bytes .../site-packages/pynvim/api/buffer.py | 217 +++ .../site-packages/pynvim/api/buffer.pyc | Bin 0 -> 9924 bytes .../site-packages/pynvim/api/common.py | 205 +++ .../site-packages/pynvim/api/common.pyc | Bin 0 -> 10326 bytes .../site-packages/pynvim/api/nvim.py | 577 ++++++++ .../site-packages/pynvim/api/nvim.pyc | Bin 0 -> 27067 bytes .../site-packages/pynvim/api/tabpage.py | 35 + .../site-packages/pynvim/api/tabpage.pyc | Bin 0 -> 1935 bytes .../site-packages/pynvim/api/window.py | 72 + .../site-packages/pynvim/api/window.pyc | Bin 0 -> 3739 bytes .../python2.7/site-packages/pynvim/compat.py | 57 + .../python2.7/site-packages/pynvim/compat.pyc | Bin 0 -> 1807 bytes .../pynvim/msgpack_rpc/__init__.py | 45 + .../pynvim/msgpack_rpc/__init__.pyc | Bin 0 -> 2478 bytes .../pynvim/msgpack_rpc/async_session.py | 145 ++ .../pynvim/msgpack_rpc/async_session.pyc | Bin 0 -> 6392 bytes .../pynvim/msgpack_rpc/event_loop/__init__.py | 24 + .../msgpack_rpc/event_loop/__init__.pyc | Bin 0 -> 687 bytes .../pynvim/msgpack_rpc/event_loop/asyncio.py | 163 +++ .../pynvim/msgpack_rpc/event_loop/asyncio.pyc | Bin 0 -> 8311 bytes .../pynvim/msgpack_rpc/event_loop/base.py | 192 +++ .../pynvim/msgpack_rpc/event_loop/base.pyc | Bin 0 -> 8381 bytes .../pynvim/msgpack_rpc/event_loop/uv.py | 124 ++ .../pynvim/msgpack_rpc/event_loop/uv.pyc | Bin 0 -> 7041 bytes .../pynvim/msgpack_rpc/msgpack_stream.py | 68 + .../pynvim/msgpack_rpc/msgpack_stream.pyc | Bin 0 -> 3267 bytes .../pynvim/msgpack_rpc/session.py | 253 ++++ .../pynvim/msgpack_rpc/session.pyc | Bin 0 -> 9960 bytes .../site-packages/pynvim/plugin/__init__.py | 9 + .../site-packages/pynvim/plugin/__init__.pyc | Bin 0 -> 634 bytes .../site-packages/pynvim/plugin/decorators.py | 175 +++ .../pynvim/plugin/decorators.pyc | Bin 0 -> 6041 bytes .../site-packages/pynvim/plugin/host.py | 276 ++++ .../site-packages/pynvim/plugin/host.pyc | Bin 0 -> 10213 bytes .../pynvim/plugin/script_host.py | 276 ++++ .../pynvim/plugin/script_host.pyc | Bin 0 -> 11496 bytes .../python2.7/site-packages/pynvim/util.py | 42 + .../python2.7/site-packages/pynvim/util.pyc | Bin 0 -> 2649 bytes .../PKG-INFO | 27 + .../SOURCES.txt | 120 ++ .../dependency_links.txt | 1 + .../installed-files.txt | 68 + .../not-zip-safe | 1 + .../requires.txt | 2 + .../top_level.txt | 1 + .../site-packages/trollius/__init__.py | 59 + .../site-packages/trollius/__init__.pyc | Bin 0 -> 1082 bytes .../site-packages/trollius/base_events.py | 1260 +++++++++++++++++ .../site-packages/trollius/base_events.pyc | Bin 0 -> 40761 bytes .../site-packages/trollius/base_subprocess.py | 282 ++++ .../trollius/base_subprocess.pyc | Bin 0 -> 11877 bytes .../site-packages/trollius/compat.py | 69 + .../site-packages/trollius/compat.pyc | Bin 0 -> 2063 bytes .../site-packages/trollius/constants.py | 7 + .../site-packages/trollius/constants.pyc | Bin 0 -> 278 bytes .../site-packages/trollius/coroutines.py | 496 +++++++ .../site-packages/trollius/coroutines.pyc | Bin 0 -> 16085 bytes .../site-packages/trollius/events.py | 626 ++++++++ .../site-packages/trollius/events.pyc | Bin 0 -> 27439 bytes .../site-packages/trollius/executor.py | 84 ++ .../site-packages/trollius/executor.pyc | Bin 0 -> 4161 bytes .../site-packages/trollius/futures.py | 450 ++++++ .../site-packages/trollius/futures.pyc | Bin 0 -> 16847 bytes .../python2.7/site-packages/trollius/locks.py | 462 ++++++ .../site-packages/trollius/locks.pyc | Bin 0 -> 17301 bytes .../python2.7/site-packages/trollius/log.py | 7 + .../python2.7/site-packages/trollius/log.pyc | Bin 0 -> 286 bytes .../site-packages/trollius/proactor_events.py | 549 +++++++ .../trollius/proactor_events.pyc | Bin 0 -> 20816 bytes .../site-packages/trollius/protocols.py | 134 ++ .../site-packages/trollius/protocols.pyc | Bin 0 -> 6872 bytes .../site-packages/trollius/py27_weakrefset.py | 202 +++ .../trollius/py27_weakrefset.pyc | Bin 0 -> 11694 bytes .../site-packages/trollius/py33_exceptions.py | 144 ++ .../trollius/py33_exceptions.pyc | Bin 0 -> 5382 bytes .../site-packages/trollius/py33_winapi.py | 75 + .../site-packages/trollius/py33_winapi.pyc | Bin 0 -> 2206 bytes .../site-packages/trollius/py3_ssl.py | 149 ++ .../site-packages/trollius/py3_ssl.pyc | Bin 0 -> 5171 bytes .../site-packages/trollius/queues.py | 325 +++++ .../site-packages/trollius/queues.pyc | Bin 0 -> 12763 bytes .../site-packages/trollius/selector_events.py | 1092 ++++++++++++++ .../trollius/selector_events.pyc | Bin 0 -> 35511 bytes .../site-packages/trollius/selectors.py | 601 ++++++++ .../site-packages/trollius/selectors.pyc | Bin 0 -> 22162 bytes .../site-packages/trollius/sslproto.py | 683 +++++++++ .../site-packages/trollius/sslproto.pyc | Bin 0 -> 24140 bytes .../site-packages/trollius/streams.py | 530 +++++++ .../site-packages/trollius/streams.pyc | Bin 0 -> 19319 bytes .../site-packages/trollius/subprocess.py | 225 +++ .../site-packages/trollius/subprocess.pyc | Bin 0 -> 9222 bytes .../python2.7/site-packages/trollius/tasks.py | 754 ++++++++++ .../site-packages/trollius/tasks.pyc | Bin 0 -> 23775 bytes .../site-packages/trollius/test_support.py | 309 ++++ .../site-packages/trollius/test_support.pyc | Bin 0 -> 12909 bytes .../site-packages/trollius/test_utils.py | 563 ++++++++ .../site-packages/trollius/test_utils.pyc | Bin 0 -> 24227 bytes .../site-packages/trollius/time_monotonic.py | 192 +++ .../site-packages/trollius/time_monotonic.pyc | Bin 0 -> 5501 bytes .../site-packages/trollius/transports.py | 294 ++++ .../site-packages/trollius/transports.pyc | Bin 0 -> 13836 bytes .../site-packages/trollius/unix_events.py | 1034 ++++++++++++++ .../site-packages/trollius/unix_events.pyc | Bin 0 -> 36439 bytes .../site-packages/trollius/windows_events.py | 777 ++++++++++ .../site-packages/trollius/windows_events.pyc | Bin 0 -> 28072 bytes .../site-packages/trollius/windows_utils.py | 238 ++++ .../site-packages/trollius/windows_utils.pyc | Bin 0 -> 7570 bytes .../greenlet-0.4.17.dist-info/AUTHORS | 51 + .../greenlet-0.4.17.dist-info/INSTALLER | 1 + .../greenlet-0.4.17.dist-info/LICENSE | 30 + .../greenlet-0.4.17.dist-info/LICENSE.PSF | 47 + .../greenlet-0.4.17.dist-info/METADATA | 92 ++ .../greenlet-0.4.17.dist-info/RECORD | 10 + .../greenlet-0.4.17.dist-info/WHEEL | 5 + .../greenlet-0.4.17.dist-info/top_level.txt | 1 + .../greenlet.cpython-39-x86_64-linux-gnu.so | Bin 0 -> 112560 bytes .../neovim-0.3.1-py3.9.egg-info/PKG-INFO | 10 + .../neovim-0.3.1-py3.9.egg-info/SOURCES.txt | 8 + .../dependency_links.txt | 1 + .../installed-files.txt | 6 + .../neovim-0.3.1-py3.9.egg-info/not-zip-safe | 1 + .../neovim-0.3.1-py3.9.egg-info/requires.txt | 1 + .../neovim-0.3.1-py3.9.egg-info/top_level.txt | 1 + .../site-packages/neovim/__init__.py | 8 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 332 bytes .../site-packages/neovim/api/__init__.py | 8 + .../api/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 357 bytes .../pynvim-0.4.2-py3.9.egg-info/PKG-INFO | 13 + .../pynvim-0.4.2-py3.9.egg-info/SOURCES.txt | 45 + .../dependency_links.txt | 1 + .../installed-files.txt | 52 + .../pynvim-0.4.2-py3.9.egg-info/not-zip-safe | 1 + .../pynvim-0.4.2-py3.9.egg-info/requires.txt | 8 + .../pynvim-0.4.2-py3.9.egg-info/top_level.txt | 2 + .../site-packages/pynvim/__init__.py | 156 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4935 bytes .../pynvim/__pycache__/compat.cpython-39.pyc | Bin 0 -> 1443 bytes .../pynvim/__pycache__/util.cpython-39.pyc | Bin 0 -> 1982 bytes .../site-packages/pynvim/api/__init__.py | 15 + .../api/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 623 bytes .../api/__pycache__/buffer.cpython-39.pyc | Bin 0 -> 7645 bytes .../api/__pycache__/common.cpython-39.pyc | Bin 0 -> 8031 bytes .../api/__pycache__/nvim.cpython-39.pyc | Bin 0 -> 21678 bytes .../api/__pycache__/tabpage.cpython-39.pyc | Bin 0 -> 1552 bytes .../api/__pycache__/window.cpython-39.pyc | Bin 0 -> 2688 bytes .../site-packages/pynvim/api/buffer.py | 217 +++ .../site-packages/pynvim/api/common.py | 205 +++ .../site-packages/pynvim/api/nvim.py | 577 ++++++++ .../site-packages/pynvim/api/tabpage.py | 35 + .../site-packages/pynvim/api/window.py | 72 + .../python3.9/site-packages/pynvim/compat.py | 57 + .../pynvim/msgpack_rpc/__init__.py | 45 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1885 bytes .../__pycache__/async_session.cpython-39.pyc | Bin 0 -> 4926 bytes .../__pycache__/msgpack_stream.cpython-39.pyc | Bin 0 -> 2476 bytes .../__pycache__/session.cpython-39.pyc | Bin 0 -> 7862 bytes .../pynvim/msgpack_rpc/async_session.py | 145 ++ .../pynvim/msgpack_rpc/event_loop/__init__.py | 24 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 617 bytes .../__pycache__/asyncio.cpython-39.pyc | Bin 0 -> 6261 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 6927 bytes .../event_loop/__pycache__/uv.cpython-39.pyc | Bin 0 -> 5068 bytes .../pynvim/msgpack_rpc/event_loop/asyncio.py | 163 +++ .../pynvim/msgpack_rpc/event_loop/base.py | 192 +++ .../pynvim/msgpack_rpc/event_loop/uv.py | 124 ++ .../pynvim/msgpack_rpc/msgpack_stream.py | 68 + .../pynvim/msgpack_rpc/session.py | 253 ++++ .../site-packages/pynvim/plugin/__init__.py | 9 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 511 bytes .../__pycache__/decorators.cpython-39.pyc | Bin 0 -> 4138 bytes .../plugin/__pycache__/host.cpython-39.pyc | Bin 0 -> 7795 bytes .../__pycache__/script_host.cpython-39.pyc | Bin 0 -> 8695 bytes .../site-packages/pynvim/plugin/decorators.py | 175 +++ .../site-packages/pynvim/plugin/host.py | 276 ++++ .../pynvim/plugin/script_host.py | 276 ++++ .../python3.9/site-packages/pynvim/util.py | 42 + .../pywal-3.3.0-py3.9.egg-info/PKG-INFO | 44 + .../pywal-3.3.0-py3.9.egg-info/SOURCES.txt | 321 +++++ .../dependency_links.txt | 1 + .../entry_points.txt | 3 + .../installed-files.txt | 322 +++++ .../pywal-3.3.0-py3.9.egg-info/not-zip-safe | 1 + .../pywal-3.3.0-py3.9.egg-info/top_level.txt | 1 + .../python3.9/site-packages/pywal/__init__.py | 31 + .../python3.9/site-packages/pywal/__main__.py | 212 +++ .../pywal/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 788 bytes .../pywal/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 5167 bytes .../pywal/__pycache__/colors.cpython-39.pyc | Bin 0 -> 3998 bytes .../pywal/__pycache__/export.cpython-39.pyc | Bin 0 -> 2830 bytes .../pywal/__pycache__/image.cpython-39.pyc | Bin 0 -> 2433 bytes .../pywal/__pycache__/reload.cpython-39.pyc | Bin 0 -> 2685 bytes .../__pycache__/sequences.cpython-39.pyc | Bin 0 -> 2430 bytes .../pywal/__pycache__/settings.cpython-39.pyc | Bin 0 -> 771 bytes .../pywal/__pycache__/theme.cpython-39.pyc | Bin 0 -> 3964 bytes .../pywal/__pycache__/util.cpython-39.pyc | Bin 0 -> 6597 bytes .../__pycache__/wallpaper.cpython-39.pyc | Bin 0 -> 3813 bytes .../site-packages/pywal/backends/__init__.py | 10 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 505 bytes .../__pycache__/colorthief.cpython-39.pyc | Bin 0 -> 1813 bytes .../__pycache__/colorz.cpython-39.pyc | Bin 0 -> 1446 bytes .../__pycache__/haishoku.cpython-39.pyc | Bin 0 -> 1325 bytes .../__pycache__/schemer2.cpython-39.pyc | Bin 0 -> 1347 bytes .../backends/__pycache__/wal.cpython-39.pyc | Bin 0 -> 2531 bytes .../pywal/backends/colorthief.py | 64 + .../site-packages/pywal/backends/colorz.py | 43 + .../site-packages/pywal/backends/haishoku.py | 37 + .../site-packages/pywal/backends/schemer2.py | 35 + .../site-packages/pywal/backends/wal.py | 87 ++ .../python3.9/site-packages/pywal/colors.py | 155 ++ .../pywal/colorschemes/dark/3024.json | 1 + .../pywal/colorschemes/dark/ashes.json | 1 + .../pywal/colorschemes/dark/base16-3024.json | 1 + .../colorschemes/dark/base16-apathy.json | 1 + .../pywal/colorschemes/dark/base16-ashes.json | 1 + .../dark/base16-atelier-cave.json | 1 + .../dark/base16-atelier-dune.json | 1 + .../dark/base16-atelier-estuary.json | 1 + .../dark/base16-atelier-forest.json | 1 + .../dark/base16-atelier-heath.json | 1 + .../dark/base16-atelier-lakeside.json | 1 + .../dark/base16-atelier-plateau.json | 1 + .../dark/base16-atelier-savanna.json | 1 + .../dark/base16-atelier-seaside.json | 1 + .../dark/base16-atelier-sulphurpool.json | 1 + .../colorschemes/dark/base16-bespin.json | 1 + .../dark/base16-black-metal-bathory.json | 1 + .../dark/base16-black-metal-burzum.json | 1 + .../dark/base16-black-metal-funeral.json | 1 + .../dark/base16-black-metal-gorgoroth.json | 1 + .../dark/base16-black-metal-immortal.json | 1 + .../dark/base16-black-metal-khold.json | 1 + .../dark/base16-black-metal-marduk.json | 1 + .../dark/base16-black-metal-mayhem.json | 1 + .../dark/base16-black-metal-nile.json | 1 + .../dark/base16-black-metal-venom.json | 1 + .../colorschemes/dark/base16-black-metal.json | 1 + .../colorschemes/dark/base16-brewer.json | 1 + .../colorschemes/dark/base16-bright.json | 1 + .../colorschemes/dark/base16-brushtrees.json | 1 + .../pywal/colorschemes/dark/base16-chalk.json | 1 + .../colorschemes/dark/base16-circus.json | 1 + .../colorschemes/dark/base16-classic.json | 1 + .../colorschemes/dark/base16-codeschool.json | 1 + .../colorschemes/dark/base16-default.json | 1 + .../colorschemes/dark/base16-dracula.json | 1 + .../colorschemes/dark/base16-eighties.json | 1 + .../colorschemes/dark/base16-embers.json | 1 + .../pywal/colorschemes/dark/base16-flat.json | 1 + .../colorschemes/dark/base16-google.json | 1 + .../colorschemes/dark/base16-grayscale.json | 1 + .../colorschemes/dark/base16-greenscreen.json | 1 + .../dark/base16-gruvbox-hard.json | 1 + .../dark/base16-gruvbox-medium.json | 1 + .../dark/base16-gruvbox-pale.json | 1 + .../dark/base16-gruvbox-soft.json | 1 + .../colorschemes/dark/base16-harmonic.json | 1 + .../colorschemes/dark/base16-hopscotch.json | 1 + .../pywal/colorschemes/dark/base16-icy.json | 1 + .../colorschemes/dark/base16-irblack.json | 1 + .../colorschemes/dark/base16-isotope.json | 1 + .../colorschemes/dark/base16-macintosh.json | 1 + .../colorschemes/dark/base16-marrakesh.json | 1 + .../colorschemes/dark/base16-materia.json | 1 + .../dark/base16-material-palenight.json | 1 + .../colorschemes/dark/base16-material.json | 1 + .../colorschemes/dark/base16-materialer.json | 1 + .../dark/base16-mellow-purple.json | 1 + .../pywal/colorschemes/dark/base16-mocha.json | 1 + .../colorschemes/dark/base16-monokai.json | 1 + .../pywal/colorschemes/dark/base16-nord.json | 1 + .../pywal/colorschemes/dark/base16-ocean.json | 1 + .../colorschemes/dark/base16-oceanicnext.json | 1 + .../colorschemes/dark/base16-onedark.json | 1 + .../colorschemes/dark/base16-outrun.json | 1 + .../colorschemes/dark/base16-paraiso.json | 1 + .../pywal/colorschemes/dark/base16-phd.json | 1 + .../pywal/colorschemes/dark/base16-pico.json | 1 + .../pywal/colorschemes/dark/base16-pop.json | 1 + .../colorschemes/dark/base16-porple.json | 1 + .../colorschemes/dark/base16-railscasts.json | 1 + .../colorschemes/dark/base16-rebecca.json | 1 + .../pywal/colorschemes/dark/base16-seti.json | 1 + .../colorschemes/dark/base16-solarflare.json | 1 + .../colorschemes/dark/base16-solarized.json | 1 + .../colorschemes/dark/base16-spacemacs.json | 1 + .../colorschemes/dark/base16-summerfruit.json | 1 + .../dark/base16-tomorrow-night.json | 1 + .../pywal/colorschemes/dark/base16-tube.json | 1 + .../colorschemes/dark/base16-twilight.json | 1 + .../colorschemes/dark/base16-unikitty.json | 1 + .../colorschemes/dark/base16-woodland.json | 1 + .../colorschemes/dark/base16-xcode-dusk.json | 1 + .../colorschemes/dark/base16-zenburn.json | 1 + .../pywal/colorschemes/dark/base16tooth.json | 1 + .../pywal/colorschemes/dark/darktooth.json | 1 + .../pywal/colorschemes/dark/dkeg-5725.json | 1 + .../pywal/colorschemes/dark/dkeg-amiox.json | 1 + .../pywal/colorschemes/dark/dkeg-bark.json | 1 + .../pywal/colorschemes/dark/dkeg-blend.json | 1 + .../pywal/colorschemes/dark/dkeg-blok.json | 1 + .../colorschemes/dark/dkeg-bluetype.json | 1 + .../pywal/colorschemes/dark/dkeg-blumune.json | 1 + .../pywal/colorschemes/dark/dkeg-book.json | 1 + .../pywal/colorschemes/dark/dkeg-branch.json | 1 + .../colorschemes/dark/dkeg-brownstone.json | 1 + .../pywal/colorschemes/dark/dkeg-bulb.json | 1 + .../pywal/colorschemes/dark/dkeg-chaires.json | 1 + .../pywal/colorschemes/dark/dkeg-coco.json | 1 + .../colorschemes/dark/dkeg-corduroy.json | 1 + .../pywal/colorschemes/dark/dkeg-depth.json | 1 + .../pywal/colorschemes/dark/dkeg-designr.json | 1 + .../pywal/colorschemes/dark/dkeg-diner.json | 1 + .../pywal/colorschemes/dark/dkeg-escen.json | 1 + .../pywal/colorschemes/dark/dkeg-fendr.json | 1 + .../pywal/colorschemes/dark/dkeg-flapr.json | 1 + .../pywal/colorschemes/dark/dkeg-forst.json | 1 + .../pywal/colorschemes/dark/dkeg-fury.json | 1 + .../pywal/colorschemes/dark/dkeg-harbing.json | 1 + .../pywal/colorschemes/dark/dkeg-kit.json | 1 + .../pywal/colorschemes/dark/dkeg-leaf.json | 1 + .../pywal/colorschemes/dark/dkeg-link.json | 1 + .../pywal/colorschemes/dark/dkeg-mattd.json | 1 + .../pywal/colorschemes/dark/dkeg-novmbr.json | 1 + .../pywal/colorschemes/dark/dkeg-owl.json | 1 + .../pywal/colorschemes/dark/dkeg-paints.json | 1 + .../pywal/colorschemes/dark/dkeg-parkd.json | 1 + .../pywal/colorschemes/dark/dkeg-pastely.json | 1 + .../pywal/colorschemes/dark/dkeg-petal.json | 1 + .../pywal/colorschemes/dark/dkeg-poly.json | 1 + .../pywal/colorschemes/dark/dkeg-prevail.json | 1 + .../pywal/colorschemes/dark/dkeg-provrb.json | 1 + .../pywal/colorschemes/dark/dkeg-raild.json | 1 + .../pywal/colorschemes/dark/dkeg-relax.json | 1 + .../pywal/colorschemes/dark/dkeg-scag.json | 1 + .../pywal/colorschemes/dark/dkeg-scape.json | 1 + .../pywal/colorschemes/dark/dkeg-shade.json | 1 + .../colorschemes/dark/dkeg-simplicity.json | 1 + .../pywal/colorschemes/dark/dkeg-skigh.json | 1 + .../pywal/colorschemes/dark/dkeg-slate.json | 1 + .../colorschemes/dark/dkeg-soundwave.json | 1 + .../pywal/colorschemes/dark/dkeg-spire.json | 1 + .../pywal/colorschemes/dark/dkeg-sprout.json | 1 + .../pywal/colorschemes/dark/dkeg-squares.json | 1 + .../pywal/colorschemes/dark/dkeg-stv.json | 1 + .../pywal/colorschemes/dark/dkeg-subtle.json | 1 + .../pywal/colorschemes/dark/dkeg-sundr.json | 1 + .../colorschemes/dark/dkeg-tealights.json | 1 + .../pywal/colorschemes/dark/dkeg-traffic.json | 1 + .../colorschemes/dark/dkeg-transposet.json | 1 + .../pywal/colorschemes/dark/dkeg-urban.json | 1 + .../pywal/colorschemes/dark/dkeg-vans.json | 1 + .../pywal/colorschemes/dark/dkeg-victory.json | 1 + .../pywal/colorschemes/dark/dkeg-view.json | 1 + .../pywal/colorschemes/dark/dkeg-wintry.json | 1 + .../pywal/colorschemes/dark/gruvbox.json | 1 + .../colorschemes/dark/hybrid-material.json | 1 + .../pywal/colorschemes/dark/monokai.json | 1 + .../colorschemes/dark/sexy-astromouse.json | 1 + .../pywal/colorschemes/dark/sexy-belge.json | 1 + .../pywal/colorschemes/dark/sexy-bitmute.json | 1 + .../pywal/colorschemes/dark/sexy-cloud.json | 1 + .../dark/sexy-colorfulcolors.json | 1 + .../pywal/colorschemes/dark/sexy-dawn.json | 1 + .../colorschemes/dark/sexy-deafened.json | 1 + .../pywal/colorschemes/dark/sexy-derp.json | 1 + .../colorschemes/dark/sexy-digerati.json | 1 + .../dark/sexy-doomicideocean.json | 1 + .../colorschemes/dark/sexy-dotshare.json | 1 + .../pywal/colorschemes/dark/sexy-dwmrob.json | 1 + .../pywal/colorschemes/dark/sexy-eqie6.json | 1 + .../colorschemes/dark/sexy-euphrasia.json | 1 + .../pywal/colorschemes/dark/sexy-gjm.json | 1 + .../colorschemes/dark/sexy-gnometerm.json | 1 + .../pywal/colorschemes/dark/sexy-gotham.json | 1 + .../dark/sexy-gslob-nature-suede.json | 1 + .../pywal/colorschemes/dark/sexy-hund.json | 1 + .../pywal/colorschemes/dark/sexy-hybrid.json | 1 + .../colorschemes/dark/sexy-insignificato.json | 1 + .../colorschemes/dark/sexy-invisibone.json | 1 + .../colorschemes/dark/sexy-jasonwryan.json | 1 + .../colorschemes/dark/sexy-kasugano.json | 1 + .../colorschemes/dark/sexy-material.json | 1 + .../pywal/colorschemes/dark/sexy-mikado.json | 1 + .../colorschemes/dark/sexy-mikazuki.json | 1 + .../pywal/colorschemes/dark/sexy-monokai.json | 1 + .../pywal/colorschemes/dark/sexy-muse.json | 1 + .../pywal/colorschemes/dark/sexy-nancy.json | 1 + .../dark/sexy-navy-and-ivory.json | 1 + .../pywal/colorschemes/dark/sexy-neon.json | 1 + .../colorschemes/dark/sexy-numixdarkest.json | 1 + .../colorschemes/dark/sexy-orangish.json | 1 + .../dark/sexy-parker_brothers.json | 1 + .../pywal/colorschemes/dark/sexy-phrak1.json | 1 + .../dark/sexy-pretty-and-pastel.json | 1 + .../pywal/colorschemes/dark/sexy-rasi.json | 1 + .../pywal/colorschemes/dark/sexy-rezza.json | 1 + .../pywal/colorschemes/dark/sexy-rydgel.json | 1 + .../colorschemes/dark/sexy-s3r0-modified.json | 1 + .../colorschemes/dark/sexy-sexcolors.json | 1 + .../dark/sexy-simple_rainbow.json | 1 + .../pywal/colorschemes/dark/sexy-splurge.json | 1 + .../pywal/colorschemes/dark/sexy-swayr.json | 1 + .../colorschemes/dark/sexy-sweetlove.json | 1 + .../pywal/colorschemes/dark/sexy-tango.json | 1 + .../colorschemes/dark/sexy-tangoesque.json | 1 + .../pywal/colorschemes/dark/sexy-tartan.json | 1 + .../pywal/colorschemes/dark/sexy-theme2.json | 1 + .../pywal/colorschemes/dark/sexy-thwump.json | 1 + .../pywal/colorschemes/dark/sexy-tlh.json | 1 + .../dark/sexy-trim-yer-beard.json | 1 + .../dark/sexy-user-77-mashup-colors.json | 1 + .../colorschemes/dark/sexy-vacuous2.json | 1 + .../dark/sexy-visibone-alt-2.json | 1 + .../colorschemes/dark/sexy-visibone.json | 1 + .../colorschemes/dark/sexy-x-dotshare.json | 1 + .../pywal/colorschemes/dark/sexy-zenburn.json | 1 + .../pywal/colorschemes/dark/solarized.json | 1 + .../colorschemes/dark/tempus_autumn.json | 1 + .../pywal/colorschemes/dark/tempus_dusk.json | 1 + .../colorschemes/dark/tempus_future.json | 1 + .../pywal/colorschemes/dark/tempus_rift.json | 1 + .../colorschemes/dark/tempus_spring.json | 1 + .../colorschemes/dark/tempus_summer.json | 1 + .../pywal/colorschemes/dark/tempus_warp.json | 1 + .../colorschemes/dark/tempus_winter.json | 1 + .../pywal/colorschemes/dark/vscode.json | 1 + .../pywal/colorschemes/dark/zenburn.json | 1 + .../pywal/colorschemes/light/3024.json | 1 + .../pywal/colorschemes/light/ashes.json | 1 + .../light/base16-atelier-cave.json | 1 + .../light/base16-atelier-dune.json | 1 + .../light/base16-atelier-estuary.json | 1 + .../light/base16-atelier-forest.json | 1 + .../light/base16-atelier-heath.json | 1 + .../light/base16-atelier-lakeside.json | 1 + .../light/base16-atelier-plateau.json | 1 + .../light/base16-atelier-savanna.json | 1 + .../light/base16-atelier-seaside.json | 1 + .../light/base16-atelier-sulphurpool.json | 1 + .../colorschemes/light/base16-classic.json | 1 + .../colorschemes/light/base16-cupcake.json | 1 + .../colorschemes/light/base16-cupertino.json | 1 + .../colorschemes/light/base16-default.json | 1 + .../colorschemes/light/base16-github.json | 1 + .../colorschemes/light/base16-google.json | 1 + .../colorschemes/light/base16-grayscale.json | 1 + .../light/base16-gruvbox-hard.json | 1 + .../light/base16-gruvbox-medium.json | 1 + .../light/base16-gruvbox-soft.json | 1 + .../colorschemes/light/base16-harmonic.json | 1 + .../colorschemes/light/base16-materialer.json | 1 + .../colorschemes/light/base16-mexico.json | 1 + .../pywal/colorschemes/light/base16-one.json | 1 + .../light/base16-shapeshifter.json | 1 + .../colorschemes/light/base16-solarized.json | 1 + .../light/base16-summerfruit.json | 1 + .../colorschemes/light/base16-tomorrow.json | 1 + .../colorschemes/light/base16-unikitty.json | 1 + .../pywal/colorschemes/light/github.json | 1 + .../light/sexy-mostly-bright.json | 1 + .../pywal/colorschemes/light/solarized.json | 1 + .../pywal/colorschemes/light/tempus_dawn.json | 1 + .../colorschemes/light/tempus_fugit.json | 1 + .../pywal/colorschemes/light/tempus_past.json | 1 + .../colorschemes/light/tempus_totus.json | 1 + .../python3.9/site-packages/pywal/export.py | 86 ++ .../python3.9/site-packages/pywal/image.py | 84 ++ .../python3.9/site-packages/pywal/reload.py | 88 ++ .../__pycache__/gtk_reload.cpython-39.pyc | Bin 0 -> 890 bytes .../site-packages/pywal/scripts/gtk_reload.py | 27 + .../site-packages/pywal/sequences.py | 88 ++ .../python3.9/site-packages/pywal/settings.py | 24 + .../site-packages/pywal/templates/colors | 16 + .../pywal/templates/colors-kitty.conf | 20 + .../templates/colors-konsole.colorscheme | 63 + .../pywal/templates/colors-oomox | 17 + .../pywal/templates/colors-putty.reg | 26 + .../pywal/templates/colors-rofi-dark.rasi | 161 +++ .../pywal/templates/colors-rofi-light.rasi | 161 +++ .../pywal/templates/colors-speedcrunch.json | 15 + .../site-packages/pywal/templates/colors-sway | 21 + .../pywal/templates/colors-tty.sh | 19 + .../pywal/templates/colors-wal-dmenu.h | 6 + .../pywal/templates/colors-wal-dwm.h | 18 + .../pywal/templates/colors-wal-st.h | 34 + .../pywal/templates/colors-wal-tabbed.h | 6 + .../pywal/templates/colors-wal.vim | 23 + .../pywal/templates/colors-waybar.css | 20 + .../pywal/templates/colors.Xresources | 68 + .../site-packages/pywal/templates/colors.css | 28 + .../site-packages/pywal/templates/colors.hs | 37 + .../site-packages/pywal/templates/colors.json | 28 + .../site-packages/pywal/templates/colors.scss | 26 + .../site-packages/pywal/templates/colors.sh | 36 + .../site-packages/pywal/templates/colors.yml | 24 + .../python3.9/site-packages/pywal/theme.py | 124 ++ .../lib/python3.9/site-packages/pywal/util.py | 186 +++ .../site-packages/pywal/wallpaper.py | 156 ++ .urlview | 2 +- .vim/.netrwhist | 5 - .vim/plugged/coc.nvim | 1 - .vim/plugged/codi.vim | 1 - .vim/plugged/dracula | 1 - .vim/plugged/nerdcommenter | 1 - .vim/plugged/nerdtree | 1 - .vim/plugged/nerdtree-git-plugin | 1 - .vim/plugged/vim-devicons | 1 - .vim/plugged/vim-gitgutter | 1 - .vim/plugged/vim-nerdtree-syntax-highlight | 1 - .vim/plugged/yats.vim | 1 - vimusage.txt | 167 --- 616 files changed, 26486 insertions(+), 1835 deletions(-) create mode 100644 .config/QtProject.conf create mode 100644 .config/coc/commands create mode 100644 .config/coc/list-commands-history.json create mode 100644 .config/coc/list-diagnostics-history.json create mode 100644 .config/coc/list-extensions-history.json create mode 100644 .config/coc/list-symbols-history.json create mode 100644 .config/htop/htoprc delete mode 100644 .config/mutt/muttrc delete mode 100644 .config/neofetch/config.conf create mode 160000 .config/nvim/plugins/plugged/coc.nvim create mode 160000 .config/nvim/plugins/plugged/codi.vim rename {.vim => .config/nvim/plugins}/plugged/ctrlp.vim (100%) create mode 160000 .config/nvim/plugins/plugged/dracula rename {.vim => .config/nvim/plugins}/plugged/gruvbox (100%) create mode 160000 .config/nvim/plugins/plugged/nerdcommenter create mode 160000 .config/nvim/plugins/plugged/nerdtree create mode 160000 .config/nvim/plugins/plugged/nerdtree-git-plugin create mode 160000 .config/nvim/plugins/plugged/vim-devicons create mode 160000 .config/nvim/plugins/plugged/vim-gitgutter create mode 160000 .config/nvim/plugins/plugged/vim-nerdtree-syntax-highlight rename {.vim => .config/nvim/plugins}/plugged/vim-tmux-navigator (100%) create mode 160000 .config/nvim/plugins/plugged/yats.vim create mode 100644 .config/obs-studio/logs/2021-01-30 11-49-32.txt create mode 100644 .config/obs-studio/profiler_data/2021-01-30 11-49-32.csv.gz create mode 100644 .config/pavucontrol.ini create mode 100644 .config/pulse/a259030563e046f78cd7b2596e4b0ed4-card-database.tdb create mode 100644 .config/pulse/a259030563e046f78cd7b2596e4b0ed4-default-sink create mode 100644 .config/pulse/a259030563e046f78cd7b2596e4b0ed4-default-source create mode 100644 .config/pulse/a259030563e046f78cd7b2596e4b0ed4-device-volumes.tdb create mode 100644 .config/pulse/a259030563e046f78cd7b2596e4b0ed4-stream-volumes.tdb create mode 100644 .config/pulse/cookie create mode 100644 .config/qutebrowser/autoconfig.yml create mode 100644 .config/qutebrowser/bookmarks/urls create mode 100644 .config/qutebrowser/qsettings/QtProject.conf create mode 100644 .config/qutebrowser/quickmarks create mode 120000 .config/systemd/user/default.target.wants/pipewire-pulse.service create mode 120000 .config/systemd/user/default.target.wants/pipewire.service create mode 120000 .config/systemd/user/sockets.target.wants/pipewire-pulse.socket create mode 120000 .config/systemd/user/sockets.target.wants/pipewire.socket create mode 100755 .local/bin/buttermanager create mode 100755 .local/bin/donut create mode 100644 .local/bin/donut.c create mode 100755 .local/bin/onside create mode 100644 .local/include/python2.7/greenlet/greenlet.h create mode 100644 .local/include/python3.9/greenlet/greenlet.h create mode 100644 .local/lib/python2.7/site-packages/concurrent/__init__.py create mode 100644 .local/lib/python2.7/site-packages/concurrent/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/__init__.py create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/_base.py create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/_base.pyc create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/process.py create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/process.pyc create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/thread.py create mode 100644 .local/lib/python2.7/site-packages/concurrent/futures/thread.pyc create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/INSTALLER create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/LICENSE create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/METADATA create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/RECORD create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/WHEEL create mode 100644 .local/lib/python2.7/site-packages/futures-3.3.0.dist-info/top_level.txt create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/AUTHORS create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/INSTALLER create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/METADATA create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/RECORD create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/WHEEL create mode 100644 .local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/top_level.txt create mode 100755 .local/lib/python2.7/site-packages/greenlet.so create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/PKG-INFO create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/SOURCES.txt create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/dependency_links.txt create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/installed-files.txt create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/not-zip-safe create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/requires.txt create mode 100644 .local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/top_level.txt create mode 100644 .local/lib/python2.7/site-packages/neovim/__init__.py create mode 100644 .local/lib/python2.7/site-packages/neovim/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/neovim/api/__init__.py create mode 100644 .local/lib/python2.7/site-packages/neovim/api/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/PKG-INFO create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/SOURCES.txt create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/dependency_links.txt create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/installed-files.txt create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/not-zip-safe create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/requires.txt create mode 100644 .local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/top_level.txt create mode 100644 .local/lib/python2.7/site-packages/pynvim/__init__.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/__init__.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/buffer.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/buffer.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/common.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/common.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/nvim.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/nvim.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/tabpage.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/tabpage.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/window.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/api/window.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/compat.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/compat.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/async_session.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/async_session.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/uv.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/uv.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/__init__.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/decorators.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/decorators.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/host.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/host.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/script_host.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/plugin/script_host.pyc create mode 100644 .local/lib/python2.7/site-packages/pynvim/util.py create mode 100644 .local/lib/python2.7/site-packages/pynvim/util.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/PKG-INFO create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/SOURCES.txt create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/dependency_links.txt create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/installed-files.txt create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/not-zip-safe create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/requires.txt create mode 100644 .local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/top_level.txt create mode 100644 .local/lib/python2.7/site-packages/trollius/__init__.py create mode 100644 .local/lib/python2.7/site-packages/trollius/__init__.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/base_events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/base_events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/base_subprocess.py create mode 100644 .local/lib/python2.7/site-packages/trollius/base_subprocess.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/compat.py create mode 100644 .local/lib/python2.7/site-packages/trollius/compat.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/constants.py create mode 100644 .local/lib/python2.7/site-packages/trollius/constants.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/coroutines.py create mode 100644 .local/lib/python2.7/site-packages/trollius/coroutines.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/executor.py create mode 100644 .local/lib/python2.7/site-packages/trollius/executor.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/futures.py create mode 100644 .local/lib/python2.7/site-packages/trollius/futures.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/locks.py create mode 100644 .local/lib/python2.7/site-packages/trollius/locks.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/log.py create mode 100644 .local/lib/python2.7/site-packages/trollius/log.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/proactor_events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/proactor_events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/protocols.py create mode 100644 .local/lib/python2.7/site-packages/trollius/protocols.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/py27_weakrefset.py create mode 100644 .local/lib/python2.7/site-packages/trollius/py27_weakrefset.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/py33_exceptions.py create mode 100644 .local/lib/python2.7/site-packages/trollius/py33_exceptions.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/py33_winapi.py create mode 100644 .local/lib/python2.7/site-packages/trollius/py33_winapi.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/py3_ssl.py create mode 100644 .local/lib/python2.7/site-packages/trollius/py3_ssl.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/queues.py create mode 100644 .local/lib/python2.7/site-packages/trollius/queues.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/selector_events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/selector_events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/selectors.py create mode 100644 .local/lib/python2.7/site-packages/trollius/selectors.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/sslproto.py create mode 100644 .local/lib/python2.7/site-packages/trollius/sslproto.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/streams.py create mode 100644 .local/lib/python2.7/site-packages/trollius/streams.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/subprocess.py create mode 100644 .local/lib/python2.7/site-packages/trollius/subprocess.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/tasks.py create mode 100644 .local/lib/python2.7/site-packages/trollius/tasks.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/test_support.py create mode 100644 .local/lib/python2.7/site-packages/trollius/test_support.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/test_utils.py create mode 100644 .local/lib/python2.7/site-packages/trollius/test_utils.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/time_monotonic.py create mode 100644 .local/lib/python2.7/site-packages/trollius/time_monotonic.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/transports.py create mode 100644 .local/lib/python2.7/site-packages/trollius/transports.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/unix_events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/unix_events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/windows_events.py create mode 100644 .local/lib/python2.7/site-packages/trollius/windows_events.pyc create mode 100644 .local/lib/python2.7/site-packages/trollius/windows_utils.py create mode 100644 .local/lib/python2.7/site-packages/trollius/windows_utils.pyc create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/AUTHORS create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/INSTALLER create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/METADATA create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/RECORD create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/WHEEL create mode 100644 .local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/top_level.txt create mode 100755 .local/lib/python3.9/site-packages/greenlet.cpython-39-x86_64-linux-gnu.so create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/PKG-INFO create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/SOURCES.txt create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/dependency_links.txt create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/installed-files.txt create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/not-zip-safe create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/requires.txt create mode 100644 .local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/top_level.txt create mode 100644 .local/lib/python3.9/site-packages/neovim/__init__.py create mode 100644 .local/lib/python3.9/site-packages/neovim/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/neovim/api/__init__.py create mode 100644 .local/lib/python3.9/site-packages/neovim/api/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/PKG-INFO create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/SOURCES.txt create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/dependency_links.txt create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/installed-files.txt create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/not-zip-safe create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/requires.txt create mode 100644 .local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/top_level.txt create mode 100644 .local/lib/python3.9/site-packages/pynvim/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/__pycache__/compat.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/__pycache__/util.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/buffer.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/common.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/nvim.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/tabpage.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/__pycache__/window.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/buffer.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/common.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/nvim.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/tabpage.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/api/window.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/compat.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/async_session.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/msgpack_stream.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/session.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/async_session.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/asyncio.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/base.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/uv.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/base.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/uv.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/msgpack_stream.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/msgpack_rpc/session.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/decorators.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/host.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/script_host.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/decorators.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/host.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/plugin/script_host.py create mode 100644 .local/lib/python3.9/site-packages/pynvim/util.py create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/PKG-INFO create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/SOURCES.txt create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/dependency_links.txt create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/entry_points.txt create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/installed-files.txt create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/not-zip-safe create mode 100644 .local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/top_level.txt create mode 100644 .local/lib/python3.9/site-packages/pywal/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pywal/__main__.py create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/__main__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/colors.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/export.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/image.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/reload.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/sequences.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/settings.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/theme.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/util.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/__pycache__/wallpaper.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__init__.py create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/__init__.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/colorthief.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/colorz.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/haishoku.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/schemer2.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/__pycache__/wal.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/colorthief.py create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/colorz.py create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/haishoku.py create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/schemer2.py create mode 100644 .local/lib/python3.9/site-packages/pywal/backends/wal.py create mode 100644 .local/lib/python3.9/site-packages/pywal/colors.py create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/3024.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/ashes.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-3024.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-apathy.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ashes.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-cave.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-dune.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-estuary.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-forest.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-heath.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-lakeside.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-plateau.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-savanna.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-seaside.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-sulphurpool.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bespin.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-bathory.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-burzum.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-funeral.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-gorgoroth.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-immortal.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-khold.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-marduk.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-mayhem.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-nile.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-venom.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brewer.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bright.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brushtrees.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-chalk.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-circus.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-classic.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-codeschool.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-default.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-dracula.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-eighties.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-embers.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-flat.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-google.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-grayscale.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-greenscreen.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-hard.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-medium.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-pale.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-soft.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-harmonic.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-hopscotch.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-icy.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-irblack.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-isotope.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-macintosh.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-marrakesh.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materia.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material-palenight.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materialer.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mellow-purple.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mocha.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-monokai.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-nord.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ocean.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-oceanicnext.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-onedark.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-outrun.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-paraiso.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-phd.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pico.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pop.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-porple.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-railscasts.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-rebecca.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-seti.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarflare.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarized.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-spacemacs.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-summerfruit.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tomorrow-night.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tube.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-twilight.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-unikitty.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-woodland.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-xcode-dusk.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-zenburn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16tooth.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/darktooth.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-5725.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-amiox.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bark.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blend.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blok.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bluetype.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blumune.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-book.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-branch.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-brownstone.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bulb.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-chaires.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-coco.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-corduroy.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-depth.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-designr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-diner.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-escen.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fendr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-flapr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-forst.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fury.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-harbing.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-kit.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-leaf.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-link.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-mattd.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-novmbr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-owl.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-paints.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-parkd.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-pastely.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-petal.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-poly.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-prevail.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-provrb.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-raild.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-relax.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scag.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scape.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-shade.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-simplicity.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-skigh.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-slate.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-soundwave.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-spire.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sprout.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-squares.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-stv.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-subtle.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sundr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-tealights.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-traffic.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-transposet.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-urban.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-vans.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-victory.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-view.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-wintry.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/gruvbox.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/hybrid-material.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/monokai.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-astromouse.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-belge.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-bitmute.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-cloud.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-colorfulcolors.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dawn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-deafened.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-derp.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-digerati.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-doomicideocean.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dotshare.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dwmrob.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-eqie6.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-euphrasia.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gjm.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gnometerm.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gotham.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gslob-nature-suede.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hund.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hybrid.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-insignificato.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-invisibone.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-jasonwryan.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-kasugano.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-material.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikado.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikazuki.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-monokai.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-muse.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-nancy.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-navy-and-ivory.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-neon.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-numixdarkest.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-orangish.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-parker_brothers.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-phrak1.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-pretty-and-pastel.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rasi.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rezza.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rydgel.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-s3r0-modified.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sexcolors.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-simple_rainbow.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-splurge.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-swayr.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sweetlove.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tango.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tangoesque.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tartan.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-theme2.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-thwump.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tlh.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-trim-yer-beard.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-user-77-mashup-colors.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-vacuous2.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone-alt-2.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-x-dotshare.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-zenburn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/solarized.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_autumn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_dusk.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_future.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_rift.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_spring.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_summer.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_warp.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_winter.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/vscode.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/dark/zenburn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/3024.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/ashes.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-cave.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-dune.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-estuary.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-forest.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-heath.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-lakeside.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-plateau.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-savanna.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-seaside.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-sulphurpool.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-classic.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupcake.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupertino.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-default.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-github.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-google.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-grayscale.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-hard.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-medium.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-soft.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-harmonic.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-materialer.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-mexico.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-one.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-shapeshifter.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-solarized.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-summerfruit.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-tomorrow.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-unikitty.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/github.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/sexy-mostly-bright.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/solarized.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_dawn.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_fugit.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_past.json create mode 100644 .local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_totus.json create mode 100644 .local/lib/python3.9/site-packages/pywal/export.py create mode 100644 .local/lib/python3.9/site-packages/pywal/image.py create mode 100644 .local/lib/python3.9/site-packages/pywal/reload.py create mode 100644 .local/lib/python3.9/site-packages/pywal/scripts/__pycache__/gtk_reload.cpython-39.pyc create mode 100644 .local/lib/python3.9/site-packages/pywal/scripts/gtk_reload.py create mode 100644 .local/lib/python3.9/site-packages/pywal/sequences.py create mode 100644 .local/lib/python3.9/site-packages/pywal/settings.py create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-kitty.conf create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-konsole.colorscheme create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-oomox create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-putty.reg create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-rofi-dark.rasi create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-rofi-light.rasi create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-speedcrunch.json create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-sway create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-tty.sh create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-wal-dmenu.h create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-wal-dwm.h create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-wal-st.h create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-wal-tabbed.h create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-wal.vim create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors-waybar.css create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.Xresources create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.css create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.hs create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.json create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.scss create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.sh create mode 100644 .local/lib/python3.9/site-packages/pywal/templates/colors.yml create mode 100644 .local/lib/python3.9/site-packages/pywal/theme.py create mode 100644 .local/lib/python3.9/site-packages/pywal/util.py create mode 100644 .local/lib/python3.9/site-packages/pywal/wallpaper.py delete mode 100644 .vim/.netrwhist delete mode 160000 .vim/plugged/coc.nvim delete mode 160000 .vim/plugged/codi.vim delete mode 160000 .vim/plugged/dracula delete mode 160000 .vim/plugged/nerdcommenter delete mode 160000 .vim/plugged/nerdtree delete mode 160000 .vim/plugged/nerdtree-git-plugin delete mode 160000 .vim/plugged/vim-devicons delete mode 160000 .vim/plugged/vim-gitgutter delete mode 160000 .vim/plugged/vim-nerdtree-syntax-highlight delete mode 160000 .vim/plugged/yats.vim delete mode 100644 vimusage.txt diff --git a/.config/QtProject.conf b/.config/QtProject.conf new file mode 100644 index 00000000..da6131d3 --- /dev/null +++ b/.config/QtProject.conf @@ -0,0 +1,8 @@ +[FileDialog] +history=file:///, file:///mnt/defvol/_active, file:///mnt/defvol/_snapshots, file:///mnt/defvol/_active/rootvol +lastVisited=file:///mnt/defvol/_snapshots +qtVersion=5.15.2 +shortcuts=file:, file:///home/josuer08 +sidebarWidth=83 +treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1\xb5\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\0\xe1\0\0\0\x1\0\0\0\0\0\0\0\x39\0\0\0\x1\0\0\0\0\0\0\0\x39\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff) +viewMode=Detail diff --git a/.config/alacritty.yml b/.config/alacritty.yml index 09dde11c..74a93df1 100644 --- a/.config/alacritty.yml +++ b/.config/alacritty.yml @@ -198,7 +198,7 @@ mouse: # # This program is executed when clicking on a text which is recognized as a URL. # The URL is always added to the command as the last parameter. - launcher: brave + launcher: qutebrowser # URL modifiers # diff --git a/.config/bpytop/bpytop.conf b/.config/bpytop/bpytop.conf index 9a89ca62..0c56e6e1 100644 --- a/.config/bpytop/bpytop.conf +++ b/.config/bpytop/bpytop.conf @@ -1,4 +1,4 @@ -#? Config file for bpytop v. 1.0.50 +#? Config file for bpytop v. 1.0.59 #* Color theme, looks for a .theme file in "/usr/[local/]share/bpytop/themes" and "~/.config/bpytop/themes", "Default" for builtin default theme. #* Prefix name by a plus sign (+) for a theme located in user themes folder, i.e. color_theme="+monokai" @@ -7,12 +7,19 @@ color_theme="Default" #* If the theme set background should be shown, set to False if you want terminal background transparency theme_background=True -#* Set bpytop view mode, "full" for everything shown, "proc" for cpu stats and processes, "stat" for cpu, mem, disks and net stats shown. -view_mode=full +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor=True + +#* Manually set which boxes to show. Available values are "cpu mem net proc", seperate values with whitespace. +shown_boxes="cpu mem net proc" #* Update time in milliseconds, increases automatically if set below internal loops processing time, recommended 2000 ms or above for better sample times for graphs. update_ms=2000 +#* Processes update multiplier, sets how often the process list is updated as a multiplier of "update_ms". +#* Set to 2 or higher to greatly decrease bpytop cpu usage. (Only integers) +proc_update_mult=2 + #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu responsive", #* "cpu lazy" updates top process over time, "cpu responsive" updates top process directly. proc_sorting="cpu lazy" @@ -56,8 +63,8 @@ background_update=True #* Custom cpu model name, empty string to disable. custom_cpu_name="" -#* Optional filter for shown disks, should be last folder in path of a mountpoint, "root" replaces "/", separate multiple values with comma. -#* Begin line with "exclude=" to change to exclude filter, oterwise defaults to "most include" filter. Example: disks_filter="exclude=boot, home" +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with a comma ",". +#* Begin line with "exclude=" to change to exclude filter, oterwise defaults to "most include" filter. Example: disks_filter="exclude=/boot, /home/user" disks_filter="" #* Show graphs instead of meters for memory values. @@ -72,6 +79,22 @@ swap_disk=True #* If mem box should be split to also show disks info. show_disks=True +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical=True + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab=False + +#* Toggles io mode for disks, showing only big graphs for disk read/write speeds. +io_mode=False + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined=False + +#* Set the top speed for the io graphs in MiB/s (10 by default), use format "device:speed" seperate disks with a comma ",". +#* Example: "/dev/sda:100, /dev/sdb:20" +io_graph_speeds="" + #* Set fixed values for network graphs, default "10M" = 10 Mibibytes, possible units "K", "M", "G", append with "bit" for bits instead of bytes, i.e "100mbit" net_download="10M" net_upload="10M" @@ -85,6 +108,9 @@ net_sync=False #* If the network graphs color gradient should scale to bandwith usage or auto scale, bandwith usage is based on "net_download" and "net_upload" values net_color_fixed=False +#* Starts with the Network Interface specified here. +net_iface="" + #* Show battery stats in top right if battery is present show_battery=True diff --git a/.config/bpytop/error.log b/.config/bpytop/error.log index 3570cac1..964d6c79 100644 --- a/.config/bpytop/error.log +++ b/.config/bpytop/error.log @@ -28,3 +28,18 @@ Traceback (most recent call last): File "/usr/bin/bpytop", line 2787, in _collect_temps cls.cpu_temp[x+1].append(core_dict[z]) KeyError: 2 +22/12/20 (22:06:40) | ERROR: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' +Traceback (most recent call last): + File "/usr/bin/bpytop", line 1199, in refresh + for f in os.listdir(d): +FileNotFoundError: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' +22/12/20 (22:09:31) | ERROR: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' +Traceback (most recent call last): + File "/usr/bin/bpytop", line 1199, in refresh + for f in os.listdir(d): +FileNotFoundError: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' +19/01/21 (16:18:23) | ERROR: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' +Traceback (most recent call last): + File "/usr/bin/bpytop", line 1266, in refresh + for f in os.listdir(d): +FileNotFoundError: [Errno 2] No such file or directory: '/home/josuer08/.config/bpytop/themes' diff --git a/.config/coc/commands b/.config/coc/commands new file mode 100644 index 00000000..e69de29b diff --git a/.config/coc/list-commands-history.json b/.config/coc/list-commands-history.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.config/coc/list-commands-history.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.config/coc/list-diagnostics-history.json b/.config/coc/list-diagnostics-history.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.config/coc/list-diagnostics-history.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.config/coc/list-extensions-history.json b/.config/coc/list-extensions-history.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.config/coc/list-extensions-history.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.config/coc/list-symbols-history.json b/.config/coc/list-symbols-history.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/.config/coc/list-symbols-history.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.config/coc/memos.json b/.config/coc/memos.json index 33235940..bd2f49eb 100644 --- a/.config/coc/memos.json +++ b/.config/coc/memos.json @@ -28,9 +28,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625747 + "expiry": 1612665822968 }, "/sbin/python2.v3": { "data": { @@ -53,9 +53,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625748 + "expiry": 1612665822969 }, "/sbin/python.v3": { "data": { @@ -67,20 +67,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625748 + "expiry": 1612665822970 }, "/usr/sbin/python3.8.v3": { "data": { @@ -117,20 +117,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625750 + "expiry": 1612665822972 }, "/usr/sbin/python2.7.v3": { "data": { @@ -153,9 +153,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625751 + "expiry": 1612665822973 }, "/usr/sbin/python2.v3": { "data": { @@ -178,9 +178,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625751 + "expiry": 1612665822974 }, "/usr/sbin/python.v3": { "data": { @@ -192,20 +192,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625752 + "expiry": 1612665822975 }, "/bin/python3.v3": { "data": { @@ -217,20 +217,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625753 + "expiry": 1612665822976 }, "/bin/python3.8.v3": { "data": { @@ -278,9 +278,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625754 + "expiry": 1612665822977 }, "/bin/python2.v3": { "data": { @@ -303,9 +303,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625755 + "expiry": 1612665822978 }, "/bin/python.v3": { "data": { @@ -317,20 +317,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625755 + "expiry": 1612665822979 }, "/usr/bin/python3.8.v3": { "data": { @@ -367,20 +367,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625776 + "expiry": 1612665822985 }, "/usr/bin/python2.7.v3": { "data": { @@ -403,9 +403,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625777 + "expiry": 1612665822986 }, "/usr/bin/python2.v3": { "data": { @@ -428,9 +428,9 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a" + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc" }, - "expiry": 1606226625777 + "expiry": 1612665822987 }, "/usr/bin/python.v3": { "data": { @@ -442,20 +442,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625778 + "expiry": 1612665822988 }, "INTERPRETERS_CACHE_v3_CurrentPathService": [ { @@ -467,18 +467,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -501,7 +501,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -513,66 +513,67 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/usr/bin/python", + "path": "/sbin/python", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" } ], "InterpreterAutoSeletionRule-currentPath": { "architecture": 3, - "path": "/usr/bin/python", + "path": "/sbin/python", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", - "type": "Unknown" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", + "type": "Unknown", + "cachedEntry": true }, "preferredGlobalPyInterpreter": { "architecture": 3, @@ -583,20 +584,21 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown", - "displayName": "Python 3.8.6 64-bit" + "cachedEntry": true, + "displayName": "Python 3.9.1 64-bit" }, "/sbin/python3.v3": { "data": { @@ -608,20 +610,20 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327" + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" }, - "expiry": 1606226625789 + "expiry": 1612665823035 }, "/sbin/python3.8.v3": { "data": { @@ -658,18 +660,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -692,7 +694,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -715,7 +717,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -727,41 +729,41 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/usr/bin/python3.8", + "path": "/usr/bin/python3.9", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -773,18 +775,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -807,7 +809,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -830,7 +832,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -842,41 +844,41 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/usr/bin/python3.8", + "path": "/usr/bin/python3.9", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -888,18 +890,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -922,7 +924,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -945,7 +947,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -957,41 +959,41 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/bin/python3.8", + "path": "/bin/python3.9", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -1003,18 +1005,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -1037,7 +1039,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -1060,7 +1062,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -1072,41 +1074,41 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/usr/sbin/python3.8", + "path": "/usr/sbin/python3.9", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -1118,18 +1120,18 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { @@ -1152,7 +1154,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -1175,7 +1177,7 @@ "version": "2.7.18-final" }, "sysPrefix": "/usr", - "fileHash": "50b3e9aa4629633a71c94387dc02e099666da80a7d09baecd347f86a76a7ab96f640ec0c089c53e3ccceddb3a6fe91c6870a9a23bfa6a19cc4907f14b3e94d8a", + "fileHash": "628dae43a0c042d44a16c945472317beb72096167d99da4b6b56461bd9f2824a5150c57286c0e09a1b6b695168591fce97bb9ea809b67ec1f9bf897d6833e0dc", "type": "Unknown" }, { @@ -1187,41 +1189,41 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" }, { "architecture": 3, - "path": "/sbin/python3.8", + "path": "/sbin/python3.9", "version": { "options": { "loose": false, "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown" } ], @@ -1270,10 +1272,10 @@ }, "/sbin/python.interpreter.displayName.v7": { "data": { - "displayName": "Python 3.8.6 64-bit", - "hash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327-6dbd384a956bcc93274b943c641e914b" + "displayName": "Python 3.9.1 64-bit", + "hash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292-33f7b37b2805fb336b2b4a8139fe1454" }, - "expiry": 1606226625975 + "expiry": 1612665823055 }, "/sbin/python2.interpreter.displayName.v7": { "data": { @@ -1291,20 +1293,21 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown", - "displayName": "Python 3.8.6 64-bit" + "cachedEntry": true, + "displayName": "Python 3.9.1 64-bit" }, "/usr/bin/python.interpreter.Details.v7": { "data": { @@ -1488,7 +1491,7 @@ }, "/sbin/python.interpreter.Details.v7": { "data": { - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "info": { "architecture": 3, "path": "/sbin/python", @@ -1511,11 +1514,12 @@ "sysPrefix": "/usr", "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", "type": "Unknown", + "cachedEntry": true, "displayName": "Python 3.8.6 64-bit", "__store": true } }, - "expiry": 1606226625905 + "expiry": 1612665823041 }, "/sbin/python2.interpreter.Details.v7": { "data": { @@ -1556,22 +1560,123 @@ "includePrerelease": false }, "loose": false, - "raw": "3.8.6-final", + "raw": "3.9.1-final", "major": 3, - "minor": 8, - "patch": 6, + "minor": 9, + "patch": 1, "prerelease": [ "final" ], "build": [], - "version": "3.8.6-final" + "version": "3.9.1-final" }, "sysPrefix": "/usr", - "fileHash": "71a1d771a5367b85faf7245348292f23ca6f461c17a45f692109167fb7e6a1507faff49202404d00b1e67714a90a2fb95e7f6a19fe9f33c7e97d86600d0f4327", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292", "type": "Unknown", - "displayName": "Python 3.8.6 64-bit" + "cachedEntry": true, + "displayName": "Python 3.9.1 64-bit" }, - "ProposeLSBanner": false + "ProposeLSBanner": false, + "/usr/sbin/python3.9.v3": { + "data": { + "architecture": 3, + "path": "/usr/sbin/python3.9", + "version": { + "options": { + "loose": false, + "includePrerelease": false + }, + "loose": false, + "raw": "3.9.1-final", + "major": 3, + "minor": 9, + "patch": 1, + "prerelease": [ + "final" + ], + "build": [], + "version": "3.9.1-final" + }, + "sysPrefix": "/usr", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" + }, + "expiry": 1612665822971 + }, + "/bin/python3.9.v3": { + "data": { + "architecture": 3, + "path": "/bin/python3.9", + "version": { + "options": { + "loose": false, + "includePrerelease": false + }, + "loose": false, + "raw": "3.9.1-final", + "major": 3, + "minor": 9, + "patch": 1, + "prerelease": [ + "final" + ], + "build": [], + "version": "3.9.1-final" + }, + "sysPrefix": "/usr", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" + }, + "expiry": 1612665822975 + }, + "/usr/bin/python3.9.v3": { + "data": { + "architecture": 3, + "path": "/usr/bin/python3.9", + "version": { + "options": { + "loose": false, + "includePrerelease": false + }, + "loose": false, + "raw": "3.9.1-final", + "major": 3, + "minor": 9, + "patch": 1, + "prerelease": [ + "final" + ], + "build": [], + "version": "3.9.1-final" + }, + "sysPrefix": "/usr", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" + }, + "expiry": 1612665822984 + }, + "/sbin/python3.9.v3": { + "data": { + "architecture": 3, + "path": "/sbin/python3.9", + "version": { + "options": { + "loose": false, + "includePrerelease": false + }, + "loose": false, + "raw": "3.9.1-final", + "major": 3, + "minor": 9, + "patch": 1, + "prerelease": [ + "final" + ], + "build": [], + "version": "3.9.1-final" + }, + "sysPrefix": "/usr", + "fileHash": "5289a968fbf6a7605648a47e7ee01cc9f6eff15ae131f2eb110c4af3da9a51bbdf86ab3ede29c57731c31f143321529edc2c1741b2576a0f3fc01dd01239a292" + }, + "expiry": 1612665823034 + } }, "coc-python|/home/josuer08/Documents/piplayer": { "INTERPRETERS_CACHE_v3_PipEnvService:facbedf314cc734fe2950bde9ead3421": [], diff --git a/.config/coc/snippets-mru b/.config/coc/snippets-mru index 9073dc2f..839ee68a 100644 --- a/.config/coc/snippets-mru +++ b/.config/coc/snippets-mru @@ -1,3 +1,4 @@ +markdownlint-disable ims for if diff --git a/.config/htop/htoprc b/.config/htop/htoprc new file mode 100644 index 00000000..bc9fdb44 --- /dev/null +++ b/.config/htop/htoprc @@ -0,0 +1,38 @@ +# Beware! This file is rewritten by htop when settings are changed in the interface. +# The parser is also very primitive, and not human-friendly. +fields=0 48 17 18 38 39 40 2 46 47 49 1 +sort_key=46 +sort_direction=1 +tree_sort_key=0 +tree_sort_direction=1 +hide_kernel_threads=1 +hide_userland_threads=0 +shadow_other_users=0 +show_thread_names=0 +show_program_path=1 +highlight_base_name=0 +highlight_megabytes=1 +highlight_threads=1 +highlight_changes=0 +highlight_changes_delay_secs=5 +find_comm_in_cmdline=1 +strip_exe_from_cmdline=1 +show_merged_command=0 +tree_view=0 +tree_view_always_by_pid=0 +header_margin=1 +detailed_cpu_time=0 +cpu_count_from_one=0 +show_cpu_usage=1 +show_cpu_frequency=0 +show_cpu_temperature=0 +degree_fahrenheit=0 +update_process_names=0 +account_guest_in_cpu_meter=0 +color_scheme=0 +enable_mouse=1 +delay=15 +left_meters=AllCPUs Memory Swap +left_meter_modes=1 1 1 +right_meters=Tasks LoadAverage Uptime +right_meter_modes=2 2 2 diff --git a/.config/mutt/muttrc b/.config/mutt/muttrc deleted file mode 100644 index f7796124..00000000 --- a/.config/mutt/muttrc +++ /dev/null @@ -1,2 +0,0 @@ -# vim: filetype=neomuttrc -source /usr/share/mutt-wizard/mutt-wizard.muttrc # mw-autogenerated diff --git a/.config/neofetch/config.conf b/.config/neofetch/config.conf deleted file mode 100644 index a96725a5..00000000 --- a/.config/neofetch/config.conf +++ /dev/null @@ -1,849 +0,0 @@ -# See this wiki page for more info: -# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info -print_info() { - info title - info underline - - info "OS" distro - info "Host" model - info "Kernel" kernel - info "Uptime" uptime - info "Packages" packages - info "Shell" shell - info "Resolution" resolution - info "DE" de - info "WM" wm - info "WM Theme" wm_theme - info "Theme" theme - info "Icons" icons - info "Terminal" term - info "Terminal Font" term_font - info "CPU" cpu - info "GPU" gpu - info "Memory" memory - - # info "GPU Driver" gpu_driver # Linux/macOS only - # info "CPU Usage" cpu_usage - # info "Disk" disk - # info "Battery" battery - # info "Font" font - # info "Song" song - # [[ "$player" ]] && prin "Music Player" "$player" - # info "Local IP" local_ip - # info "Public IP" public_ip - # info "Users" users - # info "Locale" locale # This only works on glibc systems. - - info cols -} - -# Title - - -# Hide/Show Fully qualified domain name. -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --title_fqdn -title_fqdn="off" - - -# Kernel - - -# Shorten the output of the kernel function. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --kernel_shorthand -# Supports: Everything except *BSDs (except PacBSD and PC-BSD) -# -# Example: -# on: '4.8.9-1-ARCH' -# off: 'Linux 4.8.9-1-ARCH' -kernel_shorthand="on" - - -# Distro - - -# Shorten the output of the distro function -# -# Default: 'off' -# Values: 'on', 'tiny', 'off' -# Flag: --distro_shorthand -# Supports: Everything except Windows and Haiku -distro_shorthand="off" - -# Show/Hide OS Architecture. -# Show 'x86_64', 'x86' and etc in 'Distro:' output. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --os_arch -# -# Example: -# on: 'Arch Linux x86_64' -# off: 'Arch Linux' -os_arch="on" - - -# Uptime - - -# Shorten the output of the uptime function -# -# Default: 'on' -# Values: 'on', 'tiny', 'off' -# Flag: --uptime_shorthand -# -# Example: -# on: '2 days, 10 hours, 3 mins' -# tiny: '2d 10h 3m' -# off: '2 days, 10 hours, 3 minutes' -uptime_shorthand="on" - - -# Memory - - -# Show memory pecentage in output. -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --memory_percent -# -# Example: -# on: '1801MiB / 7881MiB (22%)' -# off: '1801MiB / 7881MiB' -memory_percent="off" - - -# Packages - - -# Show/Hide Package Manager names. -# -# Default: 'tiny' -# Values: 'on', 'tiny' 'off' -# Flag: --package_managers -# -# Example: -# on: '998 (pacman), 8 (flatpak), 4 (snap)' -# tiny: '908 (pacman, flatpak, snap)' -# off: '908' -package_managers="on" - - -# Shell - - -# Show the path to $SHELL -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --shell_path -# -# Example: -# on: '/bin/bash' -# off: 'bash' -shell_path="off" - -# Show $SHELL version -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --shell_version -# -# Example: -# on: 'bash 4.4.5' -# off: 'bash' -shell_version="on" - - -# CPU - - -# CPU speed type -# -# Default: 'bios_limit' -# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. -# Flag: --speed_type -# Supports: Linux with 'cpufreq' -# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. -speed_type="bios_limit" - -# CPU speed shorthand -# -# Default: 'off' -# Values: 'on', 'off'. -# Flag: --speed_shorthand -# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz -# -# Example: -# on: 'i7-6500U (4) @ 3.1GHz' -# off: 'i7-6500U (4) @ 3.100GHz' -speed_shorthand="off" - -# Enable/Disable CPU brand in output. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --cpu_brand -# -# Example: -# on: 'Intel i7-6500U' -# off: 'i7-6500U (4)' -cpu_brand="on" - -# CPU Speed -# Hide/Show CPU speed. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --cpu_speed -# -# Example: -# on: 'Intel i7-6500U (4) @ 3.1GHz' -# off: 'Intel i7-6500U (4)' -cpu_speed="on" - -# CPU Cores -# Display CPU cores in output -# -# Default: 'logical' -# Values: 'logical', 'physical', 'off' -# Flag: --cpu_cores -# Support: 'physical' doesn't work on BSD. -# -# Example: -# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) -# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) -# off: 'Intel i7-6500U @ 3.1GHz' -cpu_cores="logical" - -# CPU Temperature -# Hide/Show CPU temperature. -# Note the temperature is added to the regular CPU function. -# -# Default: 'off' -# Values: 'C', 'F', 'off' -# Flag: --cpu_temp -# Supports: Linux, BSD -# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable -# coretemp kernel module. This only supports newer Intel processors. -# -# Example: -# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' -# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' -# off: 'Intel i7-6500U (4) @ 3.1GHz' -cpu_temp="off" - - -# GPU - - -# Enable/Disable GPU Brand -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gpu_brand -# -# Example: -# on: 'AMD HD 7950' -# off: 'HD 7950' -gpu_brand="on" - -# Which GPU to display -# -# Default: 'all' -# Values: 'all', 'dedicated', 'integrated' -# Flag: --gpu_type -# Supports: Linux -# -# Example: -# all: -# GPU1: AMD HD 7950 -# GPU2: Intel Integrated Graphics -# -# dedicated: -# GPU1: AMD HD 7950 -# -# integrated: -# GPU1: Intel Integrated Graphics -gpu_type="all" - - -# Resolution - - -# Display refresh rate next to each monitor -# Default: 'off' -# Values: 'on', 'off' -# Flag: --refresh_rate -# Supports: Doesn't work on Windows. -# -# Example: -# on: '1920x1080 @ 60Hz' -# off: '1920x1080' -refresh_rate="off" - - -# Gtk Theme / Icons / Font - - -# Shorten output of GTK Theme / Icons / Font -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --gtk_shorthand -# -# Example: -# on: 'Numix, Adwaita' -# off: 'Numix [GTK2], Adwaita [GTK3]' -gtk_shorthand="off" - - -# Enable/Disable gtk2 Theme / Icons / Font -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gtk2 -# -# Example: -# on: 'Numix [GTK2], Adwaita [GTK3]' -# off: 'Adwaita [GTK3]' -gtk2="on" - -# Enable/Disable gtk3 Theme / Icons / Font -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gtk3 -# -# Example: -# on: 'Numix [GTK2], Adwaita [GTK3]' -# off: 'Numix [GTK2]' -gtk3="on" - - -# IP Address - - -# Website to ping for the public IP -# -# Default: 'http://ident.me' -# Values: 'url' -# Flag: --ip_host -public_ip_host="http://ident.me" - -# Public IP timeout. -# -# Default: '2' -# Values: 'int' -# Flag: --ip_timeout -public_ip_timeout=2 - - -# Desktop Environment - - -# Show Desktop Environment version -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --de_version -de_version="off" - - -# Disk - - -# Which disks to display. -# The values can be any /dev/sdXX, mount point or directory. -# NOTE: By default we only show the disk info for '/'. -# -# Default: '/' -# Values: '/', '/dev/sdXX', '/path/to/drive'. -# Flag: --disk_show -# -# Example: -# disk_show=('/' '/dev/sdb1'): -# 'Disk (/): 74G / 118G (66%)' -# 'Disk (/mnt/Videos): 823G / 893G (93%)' -# -# disk_show=('/'): -# 'Disk (/): 74G / 118G (66%)' -# -disk_show=('/') - -# Disk subtitle. -# What to append to the Disk subtitle. -# -# Default: 'mount' -# Values: 'mount', 'name', 'dir', 'none' -# Flag: --disk_subtitle -# -# Example: -# name: 'Disk (/dev/sda1): 74G / 118G (66%)' -# 'Disk (/dev/sdb2): 74G / 118G (66%)' -# -# mount: 'Disk (/): 74G / 118G (66%)' -# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' -# 'Disk (/mnt/Videos): 74G / 118G (66%)' -# -# dir: 'Disk (/): 74G / 118G (66%)' -# 'Disk (Local Disk): 74G / 118G (66%)' -# 'Disk (Videos): 74G / 118G (66%)' -# -# none: 'Disk: 74G / 118G (66%)' -# 'Disk: 74G / 118G (66%)' -# 'Disk: 74G / 118G (66%)' -disk_subtitle="mount" - -# Disk percent. -# Show/Hide disk percent. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --disk_percent -# -# Example: -# on: 'Disk (/): 74G / 118G (66%)' -# off: 'Disk (/): 74G / 118G' -disk_percent="on" - - -# Song - - -# Manually specify a music player. -# -# Default: 'auto' -# Values: 'auto', 'player-name' -# Flag: --music_player -# -# Available values for 'player-name': -# -# amarok -# audacious -# banshee -# bluemindo -# clementine -# cmus -# deadbeef -# deepin-music -# dragon -# elisa -# exaile -# gnome-music -# gmusicbrowser -# gogglesmm -# guayadeque -# io.elementary.music -# iTunes -# juk -# lollypop -# mocp -# mopidy -# mpd -# muine -# netease-cloud-music -# pogo -# pragha -# qmmp -# quodlibet -# rhythmbox -# sayonara -# smplayer -# spotify -# strawberry -# tomahawk -# vlc -# xmms2d -# xnoise -# yarock -music_player="auto" - -# Format to display song information. -# -# Default: '%artist% - %album% - %title%' -# Values: '%artist%', '%album%', '%title%' -# Flag: --song_format -# -# Example: -# default: 'Song: Jet - Get Born - Sgt Major' -song_format="%artist% - %album% - %title%" - -# Print the Artist, Album and Title on separate lines -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --song_shorthand -# -# Example: -# on: 'Artist: The Fratellis' -# 'Album: Costello Music' -# 'Song: Chelsea Dagger' -# -# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' -song_shorthand="off" - -# 'mpc' arguments (specify a host, password etc). -# -# Default: '' -# Example: mpc_args=(-h HOST -P PASSWORD) -mpc_args=() - - -# Text Colors - - -# Text Colors -# -# Default: 'distro' -# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' -# Flag: --colors -# -# Each number represents a different part of the text in -# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' -# -# Example: -# colors=(distro) - Text is colored based on Distro colors. -# colors=(4 6 1 8 8 6) - Text is colored in the order above. -colors=(distro) - - -# Text Options - - -# Toggle bold text -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --bold -bold="on" - -# Enable/Disable Underline -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --underline -underline_enabled="on" - -# Underline character -# -# Default: '-' -# Values: 'string' -# Flag: --underline_char -underline_char="-" - - -# Info Separator -# Replace the default separator with the specified string. -# -# Default: ':' -# Flag: --separator -# -# Example: -# separator="->": 'Shell-> bash' -# separator=" =": 'WM = dwm' -separator=":" - - -# Color Blocks - - -# Color block range -# The range of colors to print. -# -# Default: '0', '15' -# Values: 'num' -# Flag: --block_range -# -# Example: -# -# Display colors 0-7 in the blocks. (8 colors) -# neofetch --block_range 0 7 -# -# Display colors 0-15 in the blocks. (16 colors) -# neofetch --block_range 0 15 -block_range=(0 15) - -# Toggle color blocks -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --color_blocks -color_blocks="on" - -# Color block width in spaces -# -# Default: '3' -# Values: 'num' -# Flag: --block_width -block_width=3 - -# Color block height in lines -# -# Default: '1' -# Values: 'num' -# Flag: --block_height -block_height=1 - -# Color Alignment -# -# Default: 'auto' -# Values: 'auto', 'num' -# Flag: --col_offset -# -# Number specifies how far from the left side of the terminal (in spaces) to -# begin printing the columns, in case you want to e.g. center them under your -# text. -# Example: -# col_offset="auto" - Default behavior of neofetch -# col_offset=7 - Leave 7 spaces then print the colors -col_offset="auto" - -# Progress Bars - - -# Bar characters -# -# Default: '-', '=' -# Values: 'string', 'string' -# Flag: --bar_char -# -# Example: -# neofetch --bar_char 'elapsed' 'total' -# neofetch --bar_char '-' '=' -bar_char_elapsed="-" -bar_char_total="=" - -# Toggle Bar border -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --bar_border -bar_border="on" - -# Progress bar length in spaces -# Number of chars long to make the progress bars. -# -# Default: '15' -# Values: 'num' -# Flag: --bar_length -bar_length=15 - -# Progress bar colors -# When set to distro, uses your distro's logo colors. -# -# Default: 'distro', 'distro' -# Values: 'distro', 'num' -# Flag: --bar_colors -# -# Example: -# neofetch --bar_colors 3 4 -# neofetch --bar_colors distro 5 -bar_color_elapsed="distro" -bar_color_total="distro" - - -# Info display -# Display a bar with the info. -# -# Default: 'off' -# Values: 'bar', 'infobar', 'barinfo', 'off' -# Flags: --cpu_display -# --memory_display -# --battery_display -# --disk_display -# -# Example: -# bar: '[---=======]' -# infobar: 'info [---=======]' -# barinfo: '[---=======] info' -# off: 'info' -cpu_display="off" -memory_display="off" -battery_display="off" -disk_display="off" - - -# Backend Settings - - -# Image backend. -# -# Default: 'ascii' -# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off', -# 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty' -# Flag: --backend -image_backend="ascii" - -# Image Source -# -# Which image or ascii file to display. -# -# Default: 'auto' -# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' -# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' -# Flag: --source -# -# NOTE: 'auto' will pick the best image source for whatever image backend is used. -# In ascii mode, distro ascii art will be used and in an image mode, your -# wallpaper will be used. -image_source="auto" - - -# Ascii Options - - -# Ascii distro -# Which distro's ascii art to display. -# -# Default: 'auto' -# Values: 'auto', 'distro_name' -# Flag: --ascii_distro -# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, AOSC, -# Apricity, ArcoLinux, ArchBox, ARCHlabs, ArchStrike, -# XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, Bitrig, -# BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD, -# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, -# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, -# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin, -# DesaOS, Devuan, DracOS, DragonFly, Drauger, Elementary, -# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, -# FreeMiNT, Frugalware, Funtoo, GalliumOS, Gentoo, Pentoo, -# gNewSense, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, -# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, -# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite, -# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, -# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib, -# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner, -# NuTyX, OBRevenge, OpenBSD, OpenIndiana, OpenMandriva, -# OpenWrt, osmc, Oracle, PacBSD, Parabola, Pardus, Parrot, -# Parsix, TrueOS, PCLinuxOS, Peppermint, popos, Porteus, -# PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, Raspbian, -# Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, Regata, -# Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor, -# SharkLinux, Siduction, Slackware, SliTaz, SmartOS, Solus, -# Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap, -# openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel, -# Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, Ubuntu, -# Void, Obarun, windows10, Windows7, Xubuntu, Zorin, and IRIX -# have ascii logos -# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. -# Use '{distro name}_old' to use the old logos. -# NOTE: Ubuntu has flavor variants. -# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, -# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. -# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, -# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, -# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, -# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, -# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, -# postmarketOS, and Void have a smaller logo variant. -# Use '{distro name}_small' to use the small variants. -ascii_distro="auto" - -# Ascii Colors -# -# Default: 'distro' -# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' -# Flag: --ascii_colors -# -# Example: -# ascii_colors=(distro) - Ascii is colored based on Distro colors. -# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. -ascii_colors=(distro) - -# Bold ascii logo -# Whether or not to bold the ascii logo. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --ascii_bold -ascii_bold="on" - - -# Image Options - - -# Image loop -# Setting this to on will make neofetch redraw the image constantly until -# Ctrl+C is pressed. This fixes display issues in some terminal emulators. -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --loop -image_loop="off" - -# Thumbnail directory -# -# Default: '~/.cache/thumbnails/neofetch' -# Values: 'dir' -thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" - -# Crop mode -# -# Default: 'normal' -# Values: 'normal', 'fit', 'fill' -# Flag: --crop_mode -# -# See this wiki page to learn about the fit and fill options. -# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F -crop_mode="normal" - -# Crop offset -# Note: Only affects 'normal' crop mode. -# -# Default: 'center' -# Values: 'northwest', 'north', 'northeast', 'west', 'center' -# 'east', 'southwest', 'south', 'southeast' -# Flag: --crop_offset -crop_offset="center" - -# Image size -# The image is half the terminal width by default. -# -# Default: 'auto' -# Values: 'auto', '00px', '00%', 'none' -# Flags: --image_size -# --size -image_size="auto" - -# Gap between image and text -# -# Default: '3' -# Values: 'num', '-num' -# Flag: --gap -gap=3 - -# Image offsets -# Only works with the w3m backend. -# -# Default: '0' -# Values: 'px' -# Flags: --xoffset -# --yoffset -yoffset=0 -xoffset=0 - -# Image background color -# Only works with the w3m backend. -# -# Default: '' -# Values: 'color', 'blue' -# Flag: --bg_color -background_color= - - -# Misc Options - -# Stdout mode -# Turn off all colors and disables image backend (ASCII/Image). -# Useful for piping into another command. -# Default: 'off' -# Values: 'on', 'off' -stdout="off" diff --git a/.config/nvim/autoload/plug.vim b/.config/nvim/autoload/plug.vim index 25be27f5..9c296ace 100644 --- a/.config/nvim/autoload/plug.vim +++ b/.config/nvim/autoload/plug.vim @@ -25,7 +25,7 @@ " Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } " Plug 'tpope/vim-fireplace', { 'for': 'clojure' } " -" " Using a non-master branch +" " Using a non-default branch " Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } " " " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) @@ -106,7 +106,7 @@ if s:is_win && &shellslash else let s:me = resolve(expand(':p')) endif -let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:base_spec = { 'branch': '', 'frozen': 0 } let s:TYPE = { \ 'string': type(''), \ 'list': type([]), @@ -116,6 +116,90 @@ let s:TYPE = { let s:loaded = get(s:, 'loaded', {}) let s:triggers = get(s:, 'triggers', {}) +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + if s:is_win function! s:plug_call(fn, ...) let shellslash = &shellslash @@ -179,7 +263,7 @@ function! s:define_commands() endif if has('win32') \ && &shellslash - \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') + \ && (&shell =~# 'cmd\(\.exe\)\?$' || &shell =~# 'powershell\(\.exe\)\?$') return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') endif if !has('nvim') @@ -419,7 +503,7 @@ if s:is_win let batchfile = s:plug_tempname().'.bat' call writefile(s:wrap_cmds(a:cmd), batchfile) let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) - if &shell =~# 'powershell\.exe' + if &shell =~# 'powershell\(\.exe\)\?$' let cmd = '& ' . cmd endif return [batchfile, cmd] @@ -632,16 +716,38 @@ function! plug#(repo, ...) let g:plugs[name] = spec let s:loaded[name] = get(s:loaded, name, 0) catch - return s:err(v:exception) + return s:err(repo . ' ' . v:exception) endtry endfunction function! s:parse_options(arg) let opts = copy(s:base_spec) let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif let opts.tag = a:arg elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif call extend(opts, a:arg) if has_key(opts, 'dir') let opts.dir = s:dirpath(s:plug_expand(opts.dir)) @@ -698,7 +804,7 @@ function! s:syntax() syn match plugNumber /[0-9]\+[0-9.]*/ contained syn match plugBracket /[[\]]/ contained syn match plugX /x/ contained - syn match plugDash /^-/ + syn match plugDash /^-\{1}\ / syn match plugPlus /^+/ syn match plugStar /^*/ syn match plugMessage /\(^- \)\@<=.*/ @@ -716,6 +822,7 @@ function! s:syntax() syn match plugError /^x.*/ syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ syn match plugH2 /^.*:\n-\+$/ + syn match plugH2 /^-\{2,}/ syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean hi def link plug1 Title hi def link plug2 Repeat @@ -868,9 +975,9 @@ function! s:chsh(swap) set shell=sh endif if a:swap - if &shell =~# 'powershell\.exe' || &shell =~# 'pwsh$' + if &shell =~# 'powershell\(\.exe\)\?$' || &shell =~# 'pwsh$' let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' - elseif &shell =~# 'sh' || &shell =~# 'cmd\.exe' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' set shellredir=>%s\ 2>&1 endif endif @@ -969,10 +1076,11 @@ endfunction function! s:checkout(spec) let sha = a:spec.commit - let output = s:system(['git', 'rev-parse', 'HEAD'], a:spec.dir) - if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' let output = s:system( - \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) endif return output endfunction @@ -1184,7 +1292,7 @@ function! s:update_finish() call s:log4(name, 'Checking out '.tag) let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) else - let branch = get(spec, 'branch', 'master') + let branch = s:git_origin_branch(spec) call s:log4(name, 'Merging origin/'.s:esc(branch)) let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) @@ -1424,7 +1532,7 @@ while 1 " Without TCO, Vim stack is bound to explode let [error, _] = s:git_validate(spec, 0) if empty(error) if pull - let cmd = ['git', 'fetch'] + let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] if has_tag && !empty(globpath(spec.dir, '.git/shallow')) call extend(cmd, ['--depth', '99999999']) endif @@ -2106,9 +2214,9 @@ function! plug#shellescape(arg, ...) let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') let script = get(opts, 'script', 1) - if shell =~# 'cmd\.exe' + if shell =~# 'cmd\(\.exe\)\?$' return s:shellesc_cmd(a:arg, script) - elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' + elseif shell =~# 'powershell\(\.exe\)\?$' || shell =~# 'pwsh$' return s:shellesc_ps1(a:arg) endif return s:shellesc_sh(a:arg) @@ -2160,7 +2268,7 @@ function! s:system(cmd, ...) return system(a:cmd) endif let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) - if &shell =~# 'powershell\.exe' + if &shell =~# 'powershell\(\.exe\)\?$' let cmd = '& ' . cmd endif else @@ -2189,18 +2297,17 @@ endfunction function! s:git_validate(spec, check_branch) let err = '' if isdirectory(a:spec.dir) - let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] let remote = result[-1] - if v:shell_error + if empty(remote) let err = join([remote, 'PlugClean required.'], "\n") elseif !s:compare_git_uri(remote, a:spec.uri) let err = join(['Invalid URI: '.remote, \ 'Expected: '.a:spec.uri, \ 'PlugClean required.'], "\n") elseif a:check_branch && has_key(a:spec, 'commit') - let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) - let sha = result[-1] - if v:shell_error + let sha = s:git_revision(a:spec.dir) + if empty(sha) let err = join(add(result, 'PlugClean required.'), "\n") elseif !s:hash_match(sha, a:spec.commit) let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', @@ -2208,8 +2315,9 @@ function! s:git_validate(spec, check_branch) \ 'PlugUpdate required.'], "\n") endif elseif a:check_branch - let branch = result[0] + let current_branch = result[0] " Check tag + let origin_branch = s:git_origin_branch(a:spec) if has_key(a:spec, 'tag') let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) if a:spec.tag !=# tag && a:spec.tag !~ '\*' @@ -2217,14 +2325,14 @@ function! s:git_validate(spec, check_branch) \ (empty(tag) ? 'N/A' : tag), a:spec.tag) endif " Check branch - elseif a:spec.branch !=# branch + elseif origin_branch !=# current_branch let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', - \ branch, a:spec.branch) + \ current_branch, origin_branch) endif if empty(err) let [ahead, behind] = split(s:lastline(s:system([ \ 'git', 'rev-list', '--count', '--left-right', - \ printf('HEAD...origin/%s', a:spec.branch) + \ printf('HEAD...origin/%s', origin_branch) \ ], a:spec.dir)), '\t') if !v:shell_error && ahead if behind @@ -2232,11 +2340,11 @@ function! s:git_validate(spec, check_branch) " pushable (and probably not that messed up). let err = printf( \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" - \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) else let err = printf("Ahead of origin/%s by %d commit(s).\n" \ .'Cannot update until local changes are pushed.', - \ a:spec.branch, ahead) + \ origin_branch, ahead) endif endif endif @@ -2249,7 +2357,7 @@ endfunction function! s:rm_rf(dir) if isdirectory(a:dir) - call s:system(s:is_win + return s:system(s:is_win \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) \ : ['rm', '-rf', a:dir]) endif @@ -2333,6 +2441,7 @@ endfunction function! s:delete(range, force) let [l1, l2] = a:range let force = a:force + let err_count = 0 while l1 <= l2 let line = getline(l1) if line =~ '^- ' && isdirectory(line[2:]) @@ -2341,11 +2450,22 @@ function! s:delete(range, force) let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) let force = force || answer > 1 if answer - call s:rm_rf(line[2:]) + let err = s:rm_rf(line[2:]) setlocal modifiable - call setline(l1, '~'.line[1:]) - let s:clean_count += 1 - call setline(4, printf('Removed %d directories.', s:clean_count)) + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) setlocal nomodifiable endif endif @@ -2554,20 +2674,23 @@ function! s:diff() endif call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') for [k, v] in plugs - let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let cmd = ['git', 'log', '--graph', '--color=never'] - if s:git_version_requirement(2, 10, 0) - call add(cmd, '--no-show-signature') - endif - call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) - if has_key(v, 'rtp') - call extend(cmd, ['--', v.rtp]) - endif - let diff = s:system_chomp(cmd, v.dir) - if !empty(diff) - let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' - call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) - let cnts[origin] += 1 + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif endif let bar .= '=' call s:progress_bar(2, bar, len(total)) @@ -2629,7 +2752,7 @@ function! s:snapshot(force, ...) abort let names = sort(keys(filter(copy(g:plugs), \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) for name in reverse(names) - let sha = s:system_chomp(['git', 'rev-parse', '--short', 'HEAD'], g:plugs[name].dir) + let sha = s:git_revision(g:plugs[name].dir) if !empty(sha) call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) redraw diff --git a/.config/nvim/autoload/plug.vim.old b/.config/nvim/autoload/plug.vim.old index ac143321..25be27f5 100644 --- a/.config/nvim/autoload/plug.vim.old +++ b/.config/nvim/autoload/plug.vim.old @@ -372,7 +372,7 @@ endfunction function! s:git_version_requirement(...) if !exists('s:git_version') - let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') endif return s:version_requirement(s:git_version, a:000) endfunction @@ -864,8 +864,15 @@ endfunction function! s:chsh(swap) let prev = [&shell, &shellcmdflag, &shellredir] - if !s:is_win && a:swap - set shell=sh shellredir=>%s\ 2>&1 + if !s:is_win + set shell=sh + endif + if a:swap + if &shell =~# 'powershell\.exe' || &shell =~# 'pwsh$' + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\.exe' + set shellredir=>%s\ 2>&1 + endif endif return prev endfunction @@ -898,7 +905,7 @@ function! s:regress_bar() endfunction function! s:is_updated(dir) - return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) endfunction function! s:do(pull, force, todo) @@ -935,6 +942,7 @@ function! s:do(pull, force, todo) endif elseif type == s:TYPE.funcref try + call s:load_plugin(spec) let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') call spec.do({ 'name': name, 'status': status, 'force': a:force }) catch @@ -961,7 +969,7 @@ endfunction function! s:checkout(spec) let sha = a:spec.commit - let output = s:system('git rev-parse HEAD', a:spec.dir) + let output = s:system(['git', 'rev-parse', 'HEAD'], a:spec.dir) if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) let output = s:system( \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) @@ -1079,11 +1087,16 @@ function! s:update_impl(pull, force, args) abort normal! 2G silent! redraw - let s:clone_opt = get(g:, 'plug_shallow', 1) ? - \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + let s:clone_opt = [] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif if has('win32unix') || has('wsl') - let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) endif let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' @@ -1264,7 +1277,7 @@ function! s:job_cb(fn, job, ch, data) endfunction function! s:nvim_cb(job_id, data, event) dict abort - return a:event == 'stdout' ? + return (a:event == 'stdout' || a:event == 'stderr') ? \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : \ s:job_cb('s:job_exit_cb', self, 0, a:data) endfunction @@ -1273,12 +1286,15 @@ function! s:spawn(name, cmd, opts) let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], \ 'new': get(a:opts, 'new', 0) } let s:jobs[a:name] = job - let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd - let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd call extend(job, { \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), \ 'on_exit': function('s:nvim_cb'), \ }) let jid = s:plug_call('jobstart', argv, job) @@ -1291,9 +1307,16 @@ function! s:spawn(name, cmd, opts) \ 'Invalid arguments (or job table is full)'] endif elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] let jid = job_start(s:is_win ? join(argv, ' ') : argv, { \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', \ 'out_mode': 'raw' \}) if job_status(jid) == 'run' @@ -1304,7 +1327,7 @@ function! s:spawn(name, cmd, opts) let job.lines = ['Failed to start job'] endif else - let job.lines = s:lines(call('s:system', [cmd])) + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) let job.error = v:shell_error != 0 let job.running = 0 endif @@ -1401,8 +1424,14 @@ while 1 " Without TCO, Vim stack is bound to explode let [error, _] = s:git_validate(spec, 0) if empty(error) if pull - let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' - call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + let cmd = ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) else let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } endif @@ -1410,12 +1439,14 @@ while 1 " Without TCO, Vim stack is bound to explode let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } endif else - call s:spawn(name, - \ printf('git clone %s %s %s %s 2>&1', - \ has_tag ? '' : s:clone_opt, - \ prog, - \ plug#shellescape(spec.uri, {'script': 0}), - \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) endif if !s:jobs[name].running @@ -1452,7 +1483,7 @@ G_NVIM = vim.eval("has('nvim')") == '1' G_PULL = vim.eval('s:update.pull') == '1' G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) -G_CLONE_OPT = vim.eval('s:clone_opt') +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) G_PROGRESS = vim.eval('s:progress_opt(1)') G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) G_STOP = thr.Event() @@ -1989,7 +2020,7 @@ function! s:update_ruby() end } if VIM::evaluate('s:mac_gui') == 1 - clone_opt = VIM::evaluate('s:clone_opt') + clone_opt = VIM::evaluate('s:clone_opt').join(' ') progress = VIM::evaluate('s:progress_opt(1)') nthr.times do mtx.synchronize do @@ -2055,7 +2086,23 @@ function! s:shellesc_sh(arg) return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" endfunction +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') let script = get(opts, 'script', 1) @@ -2105,8 +2152,24 @@ function! s:system(cmd, ...) let batchfile = '' try let [sh, shellcmdflag, shrd] = s:chsh(1) - let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd - if s:is_win + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if &shell =~# 'powershell\.exe' + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list let [batchfile, cmd] = s:batchfile(cmd) endif return system(cmd) @@ -2159,9 +2222,10 @@ function! s:git_validate(spec, check_branch) \ branch, a:spec.branch) endif if empty(err) - let [ahead, behind] = split(s:lastline(s:system(printf( - \ 'git rev-list --count --left-right HEAD...origin/%s', - \ a:spec.branch), a:spec.dir)), '\t') + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', a:spec.branch) + \ ], a:spec.dir)), '\t') if !v:shell_error && ahead if behind " Only mention PlugClean if diverged, otherwise it's likely to be @@ -2185,7 +2249,9 @@ endfunction function! s:rm_rf(dir) if isdirectory(a:dir) - call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) + call s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) endif endfunction @@ -2294,7 +2360,7 @@ function! s:upgrade() let new = tmp . '/plug.vim' try - let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) if v:shell_error return s:err('Error upgrading vim-plug: '. out) endif @@ -2489,11 +2555,13 @@ function! s:diff() call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') for [k, v] in plugs let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let cmd = 'git log --graph --color=never ' - \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '') - \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) if has_key(v, 'rtp') - let cmd .= ' -- '.plug#shellescape(v.rtp) + call extend(cmd, ['--', v.rtp]) endif let diff = s:system_chomp(cmd, v.dir) if !empty(diff) @@ -2561,7 +2629,7 @@ function! s:snapshot(force, ...) abort let names = sort(keys(filter(copy(g:plugs), \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) for name in reverse(names) - let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + let sha = s:system_chomp(['git', 'rev-parse', '--short', 'HEAD'], g:plugs[name].dir) if !empty(sha) call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) redraw diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim index 4f0ea0aa..e8c6c9ab 100644 --- a/.config/nvim/init.vim +++ b/.config/nvim/init.vim @@ -1,6 +1,6 @@ " Specify a directory for plugins -call plug#begin('~/.vim/plugged') +call plug#begin('~/.config/nvim/plugins/plugged') Plug 'neoclide/coc.nvim', {'branch': 'release'} Plug 'scrooloose/nerdtree' @@ -11,14 +11,9 @@ Plug 'ryanoasis/vim-devicons' Plug 'airblade/vim-gitgutter' Plug 'ctrlpvim/ctrlp.vim' " fuzzy find files Plug 'scrooloose/nerdcommenter' -"Plug 'prettier/vim-prettier', { 'do': 'yarn install' } - "This is a linter for python -Plug 'ChristianChiarulli/codi.vim' - - +Plug 'metakirby5/codi.vim' Plug 'christoomey/vim-tmux-navigator' - Plug 'morhetz/gruvbox' Plug 'dracula/vim',{'as':'dracula'} Plug 'HerringtonDarkholme/yats.vim' " TS Syntax @@ -26,59 +21,83 @@ Plug 'HerringtonDarkholme/yats.vim' " TS Syntax " Initialize plugin system call plug#end() + +"Remaps: +"jk in insert mode takes you back to normal mode inoremap jk +"Ctrl-n activates nerd toggle nmap :NERDTreeToggle +"Ctrl-s saves nmap :w +"++ in vmap or nmap coments vmap ++ NERDCommenterToggle nmap ++ NERDCommenterToggle -set timeout timeoutlen=2000 + +"Personalizado: +"espera dos segundos para el completado de comandos +set timeout timeoutlen=2000 +"Tabs and indents +set tabstop=4 softtabstop=4 +set shiftwidth=4 +set smarttab +set expandtab +set smartindent +"accept colorscheme set termguicolors +"numbers set number +set relativenumber +"cases set ignorecase set smartcase -set relativenumber "colorscheme dracula colorscheme gruvbox +"Random_useful_stuff: +"executing any .vimrc that is in the current directory for project specific +"configurations that i might need: +set exrc +"No highligt search plus incremental search: +set nohlsearch +set incsearch +"keep buffers arround while open: +set hidden +"No random sound: +set noerrorbells +"Extra space on the bottom +set scrolloff=8 +"colors: +syntax on +"A bar on the side: +set signcolumn=yes +" j/k will move virtual lines (lines that wrap) +noremap j (v:count == 0 ? 'gj' : 'j') +noremap k (v:count == 0 ? 'gk' : 'k') +"Better look for messages +set cmdheight=2 +"300ms without activity to write to disk the swapfile +set updatetime=300 +" don't give |ins-completion-menu| messages. +set shortmess+=c +"Codi: " Change the color highlight CodiVirtualText guifg=cyan - +"The indicator for codi let g:codi#virtual_text_prefix = "❯ " - - -" let g:codi#aliases = { \ 'javascript.jsx': 'javascript', \ } +"Ctrlp: +let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard'] -" open NERDTree automatically -"autocmd StdinReadPre * let s:std_in=1 -"autocmd VimEnter * NERDTree - -let g:NERDTreeGitStatusWithFlags = 1 -"let g:WebDevIconsUnicodeDecorateFolderNodes = 1 -"let g:NERDTreeGitStatusNodeColorization = 1 -"let g:NERDTreeColorMapCustom = { - "\ "Staged" : "#0ee375", - "\ "Modified" : "#d9bf91", - "\ "Renamed" : "#51C9FC", - "\ "Untracked" : "#FCE77C", - "\ "Unmerged" : "#FC51E6", - "\ "Dirty" : "#FFBD61", - "\ "Clean" : "#87939A", - "\ "Ignored" : "#808080" - "\ } - - -let g:NERDTreeIgnore = ['^node_modules$'] -" vim-prettier +"Vim_prettier: "let g:prettier#quickfix_enabled = 0 "let g:prettier#quickfix_auto_focus = 0 " prettier command for coc @@ -88,29 +107,26 @@ command! -nargs=0 Prettier :CocCommand prettier.formatFile "autocmd BufWritePre *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.yaml,*.html PrettierAsync -" ctrlp -let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard'] - -" j/k will move virtual lines (lines that wrap) -noremap j (v:count == 0 ? 'gj' : 'j') -noremap k (v:count == 0 ? 'gk' : 'k') - - -set smarttab -set cindent -set tabstop=2 -set shiftwidth=2 -" always uses spaces instead of tab characters -set expandtab - - - +"NERDTree: +let g:NERDTreeGitStatusWithFlags = 1 +let g:WebDevIconsUnicodeDecorateFolderNodes = 1 +let g:NERDTreeGitStatusNodeColorization = 1 +let g:NERDTreeColorMapCustom = { + \ "Staged" : "#0ee375", + \ "Modified" : "#d9bf91", + \ "Renamed" : "#51C9FC", + \ "Untracked" : "#FCE77C", + \ "Unmerged" : "#FC51E6", + \ "Dirty" : "#FFBD61", + \ "Clean" : "#87939A", + \ "Ignored" : "#808080" + \ } +let g:NERDTreeIgnore = ['^node_modules$'] " sync open file with NERDTree " " Check if NERDTree is open or active function! IsNERDTreeOpen() return exists("t:NERDTreeBufName") && (bufwinnr(t:NERDTreeBufName) != -1) endfunction - " Call NERDTreeFind iff NERDTree is active, current window contains a modifiable " file, and we're not in vimdiff function! SyncTree() @@ -119,11 +135,11 @@ function! SyncTree() wincmd p endif endfunction - " Highlight currently open buffer in NERDTree autocmd BufEnter * call SyncTree() -" coc config + +"Coc: let g:coc_global_extensions = [ \ 'coc-snippets', \ 'coc-pairs', @@ -137,16 +153,6 @@ let g:coc_global_extensions = [ \ 'coc-markdownlint', \ 'coc-python', \ ] -" from readme -" if hidden is not set, TextEdit might fail. -set hidden " Some servers have issues with backup files, see #649 set nobackup set nowritebackup " Better display for messages set cmdheight=2 " You will have bad experience for diagnostic messages when it's default 4000. -set updatetime=300 - -" don't give |ins-completion-menu| messages. -set shortmess+=c - -" always show signcolumns -set signcolumn=yes " Use tab for trigger completion with characters ahead and navigate. " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. diff --git a/.config/nvim/plugins/plugged/coc.nvim b/.config/nvim/plugins/plugged/coc.nvim new file mode 160000 index 00000000..a336a8bc --- /dev/null +++ b/.config/nvim/plugins/plugged/coc.nvim @@ -0,0 +1 @@ +Subproject commit a336a8bc251702d9526a6818ae56e86d92fafc0c diff --git a/.config/nvim/plugins/plugged/codi.vim b/.config/nvim/plugins/plugged/codi.vim new file mode 160000 index 00000000..cf62681a --- /dev/null +++ b/.config/nvim/plugins/plugged/codi.vim @@ -0,0 +1 @@ +Subproject commit cf62681a4962ce1873e4b2a5e0bf401dcd42890f diff --git a/.vim/plugged/ctrlp.vim b/.config/nvim/plugins/plugged/ctrlp.vim similarity index 100% rename from .vim/plugged/ctrlp.vim rename to .config/nvim/plugins/plugged/ctrlp.vim diff --git a/.config/nvim/plugins/plugged/dracula b/.config/nvim/plugins/plugged/dracula new file mode 160000 index 00000000..e7154372 --- /dev/null +++ b/.config/nvim/plugins/plugged/dracula @@ -0,0 +1 @@ +Subproject commit e7154372adc95d637ccd911c2f8601d9ff2eac1f diff --git a/.vim/plugged/gruvbox b/.config/nvim/plugins/plugged/gruvbox similarity index 100% rename from .vim/plugged/gruvbox rename to .config/nvim/plugins/plugged/gruvbox diff --git a/.config/nvim/plugins/plugged/nerdcommenter b/.config/nvim/plugins/plugged/nerdcommenter new file mode 160000 index 00000000..b83e9cdf --- /dev/null +++ b/.config/nvim/plugins/plugged/nerdcommenter @@ -0,0 +1 @@ +Subproject commit b83e9cdf835161b398e04e4c462103fd21801ee3 diff --git a/.config/nvim/plugins/plugged/nerdtree b/.config/nvim/plugins/plugged/nerdtree new file mode 160000 index 00000000..1b190899 --- /dev/null +++ b/.config/nvim/plugins/plugged/nerdtree @@ -0,0 +1 @@ +Subproject commit 1b19089917cc3e0a81d3294fead2424c419d545c diff --git a/.config/nvim/plugins/plugged/nerdtree-git-plugin b/.config/nvim/plugins/plugged/nerdtree-git-plugin new file mode 160000 index 00000000..5fa0e3e1 --- /dev/null +++ b/.config/nvim/plugins/plugged/nerdtree-git-plugin @@ -0,0 +1 @@ +Subproject commit 5fa0e3e1487b17f8a23fc2674ebde5f55ce6a816 diff --git a/.config/nvim/plugins/plugged/vim-devicons b/.config/nvim/plugins/plugged/vim-devicons new file mode 160000 index 00000000..0329d89c --- /dev/null +++ b/.config/nvim/plugins/plugged/vim-devicons @@ -0,0 +1 @@ +Subproject commit 0329d89c5114dc285939050fd5777dbcc450ddd7 diff --git a/.config/nvim/plugins/plugged/vim-gitgutter b/.config/nvim/plugins/plugged/vim-gitgutter new file mode 160000 index 00000000..ff9d134f --- /dev/null +++ b/.config/nvim/plugins/plugged/vim-gitgutter @@ -0,0 +1 @@ +Subproject commit ff9d134f0c69e25d391138036051b2c5e6bac864 diff --git a/.config/nvim/plugins/plugged/vim-nerdtree-syntax-highlight b/.config/nvim/plugins/plugged/vim-nerdtree-syntax-highlight new file mode 160000 index 00000000..5178ee4d --- /dev/null +++ b/.config/nvim/plugins/plugged/vim-nerdtree-syntax-highlight @@ -0,0 +1 @@ +Subproject commit 5178ee4d7f4e7761187df30bb709f703d91df18a diff --git a/.vim/plugged/vim-tmux-navigator b/.config/nvim/plugins/plugged/vim-tmux-navigator similarity index 100% rename from .vim/plugged/vim-tmux-navigator rename to .config/nvim/plugins/plugged/vim-tmux-navigator diff --git a/.config/nvim/plugins/plugged/yats.vim b/.config/nvim/plugins/plugged/yats.vim new file mode 160000 index 00000000..6104b30b --- /dev/null +++ b/.config/nvim/plugins/plugged/yats.vim @@ -0,0 +1 @@ +Subproject commit 6104b30b32732e367266f06ecf6e817df32ac1b9 diff --git a/.config/obs-studio/basic/scenes/Stream1.json b/.config/obs-studio/basic/scenes/Stream1.json index 5596085e..e5fea6dc 100644 --- a/.config/obs-studio/basic/scenes/Stream1.json +++ b/.config/obs-studio/basic/scenes/Stream1.json @@ -17,7 +17,7 @@ "monitoring_type": 0, "muted": false, "name": "gate", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -46,7 +46,7 @@ "monitoring_type": 0, "muted": false, "name": "Compressor", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -75,7 +75,7 @@ "monitoring_type": 0, "muted": false, "name": "Noise Suppression", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -98,7 +98,7 @@ "monitoring_type": 0, "muted": false, "name": "Limiter", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -123,9 +123,9 @@ "id": "pulse_input_capture", "mixers": 255, "monitoring_type": 2, - "muted": false, + "muted": true, "name": "Mic/Aux", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -155,7 +155,7 @@ "monitoring_type": 0, "muted": true, "name": "Desktop Audio", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -168,7 +168,7 @@ "versioned_id": "pulse_output_capture", "volume": 1.0 }, - "current_program_scene": "terms-cam", + "current_program_scene": "top", "current_scene": "terms-cam", "current_transition": "Fade", "groups": [], @@ -180,6 +180,9 @@ "switch_if_not_matching": false, "switches": [] }, + "decklink_captions": { + "source": "" + }, "output-timer": { "autoStartRecordTimer": false, "autoStartStreamTimer": false, @@ -240,30 +243,76 @@ "deinterlace_field_order": 0, "deinterlace_mode": 0, "enabled": true, + "filters": [ + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "chroma_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "greenout", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": {}, + "sync": 0, + "versioned_id": "chroma_key_filter", + "volume": 1.0 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Correction", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "brightness": -0.01, + "contrast": 0.14999999999999999, + "gamma": -0.37, + "opacity": 100, + "saturation": -0.34000000000000002 + }, + "sync": 0, + "versioned_id": "color_filter", + "volume": 1.0 + } + ], "flags": 0, - "hotkeys": { - "linuxbrowser.reloadpage": [] - }, - "id": "linuxbrowser-source", + "hotkeys": {}, + "id": "xcomposite_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "Linux Browser", - "prev_ver": 436207618, + "name": "term2", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, - "settings": { - "fps": 60, - "height": 1080, - "hide_scrollbars": true, - "url": "http://192.168.1.170:8080/", - "width": 1920 - }, + "settings": {}, "sync": 0, - "versioned_id": "linuxbrowser-source", + "versioned_id": "xcomposite_input", "volume": 1.0 }, { @@ -273,22 +322,22 @@ "enabled": true, "flags": 0, "hotkeys": {}, - "id": "xshm_input", + "id": "xcomposite_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "topscreen", - "prev_ver": 436207618, + "name": "term1", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, "settings": { - "screen": 0 + "capture_window": "18874370\r\njosuer08@3600:~\r\nAlacritty" }, "sync": 0, - "versioned_id": "xshm_input", + "versioned_id": "xcomposite_input", "volume": 1.0 }, { @@ -299,17 +348,21 @@ "flags": 0, "hotkeys": { "OBSBasic.SelectScene": [], + "libobs.hide_scene_item.Linux Browser": [], + "libobs.hide_scene_item.camera": [], + "libobs.hide_scene_item.term1": [], "libobs.hide_scene_item.term2": [], - "libobs.hide_scene_item.topscreen": [], - "libobs.show_scene_item.term2": [], - "libobs.show_scene_item.topscreen": [] + "libobs.show_scene_item.Linux Browser": [], + "libobs.show_scene_item.camera": [], + "libobs.show_scene_item.term1": [], + "libobs.show_scene_item.term2": [] }, "id": "scene", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "top", - "prev_ver": 436207618, + "name": "terms-cam", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -334,19 +387,48 @@ "group_item_backup": false, "id": 1, "locked": false, - "name": "topscreen", + "name": "camera", "pos": { + "x": 1289.0, + "y": 635.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 0.44999998807907104, + "y": 0.44999998807907104 + }, + "scale_filter": "disable", + "visible": false + }, + { + "align": 5, + "bounds": { "x": 0.0, "y": 0.0 }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "id": 2, + "locked": false, + "name": "term1", + "pos": { + "x": 1332.0, + "y": 0.0 + }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 0.34342259168624878, + "y": 0.34314429759979248 }, "scale_filter": "disable", - "visible": true + "visible": false }, { "align": 5, @@ -361,54 +443,22 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 4, + "id": 3, "locked": false, "name": "term2", "pos": { - "x": 1384.0, - "y": 778.0 + "x": 0.0, + "y": 0.0 }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.27916666865348816, - "y": 0.27962961792945862 + "x": 1.0, + "y": 1.0 }, "scale_filter": "disable", "visible": true - } - ] - }, - "sync": 0, - "versioned_id": "scene", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.camera": [], - "libobs.show_scene_item.camera": [] - }, - "id": "scene", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "onlycam", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "custom_size": false, - "id_counter": 4, - "items": [ + }, { "align": 5, "bounds": { @@ -422,9 +472,9 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 2, + "id": 4, "locked": false, - "name": "camera", + "name": "Linux Browser", "pos": { "x": 0.0, "y": 0.0 @@ -432,8 +482,8 @@ "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.56302082538604736, - "y": 0.56296294927597046 + "x": 1.0, + "y": 1.0 }, "scale_filter": "disable", "visible": true @@ -456,7 +506,7 @@ "monitoring_type": 0, "muted": false, "name": "camera", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -488,21 +538,15 @@ "flags": 0, "hotkeys": { "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.Linux Browser": [], "libobs.hide_scene_item.camera": [], - "libobs.hide_scene_item.term1": [], - "libobs.hide_scene_item.term2": [], - "libobs.show_scene_item.Linux Browser": [], - "libobs.show_scene_item.camera": [], - "libobs.show_scene_item.term1": [], - "libobs.show_scene_item.term2": [] + "libobs.show_scene_item.camera": [] }, "id": "scene", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "terms-cam", - "prev_ver": 436207618, + "name": "onlycam", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -525,51 +569,56 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 1, + "id": 2, "locked": false, "name": "camera", "pos": { - "x": 1289.0, - "y": 635.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.44999998807907104, - "y": 0.44999998807907104 - }, - "scale_filter": "disable", - "visible": false - }, - { - "align": 5, - "bounds": { "x": 0.0, "y": 0.0 }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "id": 2, - "locked": false, - "name": "term1", - "pos": { - "x": 1332.0, - "y": 0.0 - }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.34342259168624878, - "y": 0.34314429759979248 + "x": 0.56302082538604736, + "y": 0.56296294927597046 }, "scale_filter": "disable", - "visible": false - }, + "visible": true + } + ] + }, + "sync": 0, + "versioned_id": "scene", + "volume": 1.0 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [], + "libobs.hide_scene_item.term2": [], + "libobs.hide_scene_item.topscreen": [], + "libobs.show_scene_item.term2": [], + "libobs.show_scene_item.topscreen": [] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "top", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "custom_size": false, + "id_counter": 4, + "items": [ { "align": 5, "bounds": { @@ -583,9 +632,9 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 3, + "id": 1, "locked": false, - "name": "term2", + "name": "topscreen", "pos": { "x": 0.0, "y": 0.0 @@ -593,8 +642,8 @@ "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 1.4055637121200562, + "y": 1.4049478769302368 }, "scale_filter": "disable", "visible": true @@ -614,19 +663,19 @@ "group_item_backup": false, "id": 4, "locked": false, - "name": "Linux Browser", + "name": "term2", "pos": { - "x": 0.0, - "y": 0.0 + "x": 1384.0, + "y": 778.0 }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 0.27916666865348816, + "y": 0.27962961792945862 }, "scale_filter": "disable", - "visible": true + "visible": false } ] }, @@ -641,22 +690,22 @@ "enabled": true, "flags": 0, "hotkeys": {}, - "id": "xcomposite_input", + "id": "xshm_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "term1", - "prev_ver": 436207618, + "name": "topscreen", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, "settings": { - "capture_window": "18874370\r\njosuer08@3600:~\r\nAlacritty" + "screen": 0 }, "sync": 0, - "versioned_id": "xcomposite_input", + "versioned_id": "xshm_input", "volume": 1.0 }, { @@ -664,76 +713,30 @@ "deinterlace_field_order": 0, "deinterlace_mode": 0, "enabled": true, - "filters": [ - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "chroma_key_filter", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "greenout", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": {}, - "sync": 0, - "versioned_id": "chroma_key_filter", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "color_filter", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Color Correction", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "brightness": -0.01, - "contrast": 0.14999999999999999, - "gamma": -0.37, - "opacity": 100, - "saturation": -0.34000000000000002 - }, - "sync": 0, - "versioned_id": "color_filter", - "volume": 1.0 - } - ], "flags": 0, - "hotkeys": {}, - "id": "xcomposite_input", + "hotkeys": { + "linuxbrowser.reloadpage": [] + }, + "id": "linuxbrowser-source", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "term2", - "prev_ver": 436207618, + "name": "Linux Browser", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, - "settings": {}, + "settings": { + "fps": 60, + "height": 1080, + "hide_scrollbars": true, + "url": "http://192.168.1.170:8080/", + "width": 1920 + }, "sync": 0, - "versioned_id": "xcomposite_input", + "versioned_id": "linuxbrowser-source", "volume": 1.0 } ], diff --git a/.config/obs-studio/basic/scenes/Stream1.json.bak b/.config/obs-studio/basic/scenes/Stream1.json.bak index 5596085e..e5fea6dc 100644 --- a/.config/obs-studio/basic/scenes/Stream1.json.bak +++ b/.config/obs-studio/basic/scenes/Stream1.json.bak @@ -17,7 +17,7 @@ "monitoring_type": 0, "muted": false, "name": "gate", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -46,7 +46,7 @@ "monitoring_type": 0, "muted": false, "name": "Compressor", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -75,7 +75,7 @@ "monitoring_type": 0, "muted": false, "name": "Noise Suppression", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -98,7 +98,7 @@ "monitoring_type": 0, "muted": false, "name": "Limiter", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -123,9 +123,9 @@ "id": "pulse_input_capture", "mixers": 255, "monitoring_type": 2, - "muted": false, + "muted": true, "name": "Mic/Aux", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -155,7 +155,7 @@ "monitoring_type": 0, "muted": true, "name": "Desktop Audio", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -168,7 +168,7 @@ "versioned_id": "pulse_output_capture", "volume": 1.0 }, - "current_program_scene": "terms-cam", + "current_program_scene": "top", "current_scene": "terms-cam", "current_transition": "Fade", "groups": [], @@ -180,6 +180,9 @@ "switch_if_not_matching": false, "switches": [] }, + "decklink_captions": { + "source": "" + }, "output-timer": { "autoStartRecordTimer": false, "autoStartStreamTimer": false, @@ -240,30 +243,76 @@ "deinterlace_field_order": 0, "deinterlace_mode": 0, "enabled": true, + "filters": [ + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "chroma_key_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "greenout", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": {}, + "sync": 0, + "versioned_id": "chroma_key_filter", + "volume": 1.0 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "color_filter", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Color Correction", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "brightness": -0.01, + "contrast": 0.14999999999999999, + "gamma": -0.37, + "opacity": 100, + "saturation": -0.34000000000000002 + }, + "sync": 0, + "versioned_id": "color_filter", + "volume": 1.0 + } + ], "flags": 0, - "hotkeys": { - "linuxbrowser.reloadpage": [] - }, - "id": "linuxbrowser-source", + "hotkeys": {}, + "id": "xcomposite_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "Linux Browser", - "prev_ver": 436207618, + "name": "term2", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, - "settings": { - "fps": 60, - "height": 1080, - "hide_scrollbars": true, - "url": "http://192.168.1.170:8080/", - "width": 1920 - }, + "settings": {}, "sync": 0, - "versioned_id": "linuxbrowser-source", + "versioned_id": "xcomposite_input", "volume": 1.0 }, { @@ -273,22 +322,22 @@ "enabled": true, "flags": 0, "hotkeys": {}, - "id": "xshm_input", + "id": "xcomposite_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "topscreen", - "prev_ver": 436207618, + "name": "term1", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, "settings": { - "screen": 0 + "capture_window": "18874370\r\njosuer08@3600:~\r\nAlacritty" }, "sync": 0, - "versioned_id": "xshm_input", + "versioned_id": "xcomposite_input", "volume": 1.0 }, { @@ -299,17 +348,21 @@ "flags": 0, "hotkeys": { "OBSBasic.SelectScene": [], + "libobs.hide_scene_item.Linux Browser": [], + "libobs.hide_scene_item.camera": [], + "libobs.hide_scene_item.term1": [], "libobs.hide_scene_item.term2": [], - "libobs.hide_scene_item.topscreen": [], - "libobs.show_scene_item.term2": [], - "libobs.show_scene_item.topscreen": [] + "libobs.show_scene_item.Linux Browser": [], + "libobs.show_scene_item.camera": [], + "libobs.show_scene_item.term1": [], + "libobs.show_scene_item.term2": [] }, "id": "scene", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "top", - "prev_ver": 436207618, + "name": "terms-cam", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -334,19 +387,48 @@ "group_item_backup": false, "id": 1, "locked": false, - "name": "topscreen", + "name": "camera", "pos": { + "x": 1289.0, + "y": 635.0 + }, + "private_settings": {}, + "rot": 0.0, + "scale": { + "x": 0.44999998807907104, + "y": 0.44999998807907104 + }, + "scale_filter": "disable", + "visible": false + }, + { + "align": 5, + "bounds": { "x": 0.0, "y": 0.0 }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "id": 2, + "locked": false, + "name": "term1", + "pos": { + "x": 1332.0, + "y": 0.0 + }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 0.34342259168624878, + "y": 0.34314429759979248 }, "scale_filter": "disable", - "visible": true + "visible": false }, { "align": 5, @@ -361,54 +443,22 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 4, + "id": 3, "locked": false, "name": "term2", "pos": { - "x": 1384.0, - "y": 778.0 + "x": 0.0, + "y": 0.0 }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.27916666865348816, - "y": 0.27962961792945862 + "x": 1.0, + "y": 1.0 }, "scale_filter": "disable", "visible": true - } - ] - }, - "sync": 0, - "versioned_id": "scene", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.camera": [], - "libobs.show_scene_item.camera": [] - }, - "id": "scene", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "onlycam", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "custom_size": false, - "id_counter": 4, - "items": [ + }, { "align": 5, "bounds": { @@ -422,9 +472,9 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 2, + "id": 4, "locked": false, - "name": "camera", + "name": "Linux Browser", "pos": { "x": 0.0, "y": 0.0 @@ -432,8 +482,8 @@ "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.56302082538604736, - "y": 0.56296294927597046 + "x": 1.0, + "y": 1.0 }, "scale_filter": "disable", "visible": true @@ -456,7 +506,7 @@ "monitoring_type": 0, "muted": false, "name": "camera", - "prev_ver": 436207618, + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -488,21 +538,15 @@ "flags": 0, "hotkeys": { "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.Linux Browser": [], "libobs.hide_scene_item.camera": [], - "libobs.hide_scene_item.term1": [], - "libobs.hide_scene_item.term2": [], - "libobs.show_scene_item.Linux Browser": [], - "libobs.show_scene_item.camera": [], - "libobs.show_scene_item.term1": [], - "libobs.show_scene_item.term2": [] + "libobs.show_scene_item.camera": [] }, "id": "scene", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "terms-cam", - "prev_ver": 436207618, + "name": "onlycam", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, @@ -525,51 +569,56 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 1, + "id": 2, "locked": false, "name": "camera", "pos": { - "x": 1289.0, - "y": 635.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.44999998807907104, - "y": 0.44999998807907104 - }, - "scale_filter": "disable", - "visible": false - }, - { - "align": 5, - "bounds": { "x": 0.0, "y": 0.0 }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "id": 2, - "locked": false, - "name": "term1", - "pos": { - "x": 1332.0, - "y": 0.0 - }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 0.34342259168624878, - "y": 0.34314429759979248 + "x": 0.56302082538604736, + "y": 0.56296294927597046 }, "scale_filter": "disable", - "visible": false - }, + "visible": true + } + ] + }, + "sync": 0, + "versioned_id": "scene", + "volume": 1.0 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "OBSBasic.SelectScene": [], + "libobs.hide_scene_item.term2": [], + "libobs.hide_scene_item.topscreen": [], + "libobs.show_scene_item.term2": [], + "libobs.show_scene_item.topscreen": [] + }, + "id": "scene", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "top", + "prev_ver": 436273152, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "custom_size": false, + "id_counter": 4, + "items": [ { "align": 5, "bounds": { @@ -583,9 +632,9 @@ "crop_right": 0, "crop_top": 0, "group_item_backup": false, - "id": 3, + "id": 1, "locked": false, - "name": "term2", + "name": "topscreen", "pos": { "x": 0.0, "y": 0.0 @@ -593,8 +642,8 @@ "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 1.4055637121200562, + "y": 1.4049478769302368 }, "scale_filter": "disable", "visible": true @@ -614,19 +663,19 @@ "group_item_backup": false, "id": 4, "locked": false, - "name": "Linux Browser", + "name": "term2", "pos": { - "x": 0.0, - "y": 0.0 + "x": 1384.0, + "y": 778.0 }, "private_settings": {}, "rot": 0.0, "scale": { - "x": 1.0, - "y": 1.0 + "x": 0.27916666865348816, + "y": 0.27962961792945862 }, "scale_filter": "disable", - "visible": true + "visible": false } ] }, @@ -641,22 +690,22 @@ "enabled": true, "flags": 0, "hotkeys": {}, - "id": "xcomposite_input", + "id": "xshm_input", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "term1", - "prev_ver": 436207618, + "name": "topscreen", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, "settings": { - "capture_window": "18874370\r\njosuer08@3600:~\r\nAlacritty" + "screen": 0 }, "sync": 0, - "versioned_id": "xcomposite_input", + "versioned_id": "xshm_input", "volume": 1.0 }, { @@ -664,76 +713,30 @@ "deinterlace_field_order": 0, "deinterlace_mode": 0, "enabled": true, - "filters": [ - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "chroma_key_filter", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "greenout", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": {}, - "sync": 0, - "versioned_id": "chroma_key_filter", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "color_filter", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Color Correction", - "prev_ver": 436207618, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "brightness": -0.01, - "contrast": 0.14999999999999999, - "gamma": -0.37, - "opacity": 100, - "saturation": -0.34000000000000002 - }, - "sync": 0, - "versioned_id": "color_filter", - "volume": 1.0 - } - ], "flags": 0, - "hotkeys": {}, - "id": "xcomposite_input", + "hotkeys": { + "linuxbrowser.reloadpage": [] + }, + "id": "linuxbrowser-source", "mixers": 0, "monitoring_type": 0, "muted": false, - "name": "term2", - "prev_ver": 436207618, + "name": "Linux Browser", + "prev_ver": 436273152, "private_settings": {}, "push-to-mute": false, "push-to-mute-delay": 0, "push-to-talk": false, "push-to-talk-delay": 0, - "settings": {}, + "settings": { + "fps": 60, + "height": 1080, + "hide_scrollbars": true, + "url": "http://192.168.1.170:8080/", + "width": 1920 + }, "sync": 0, - "versioned_id": "xcomposite_input", + "versioned_id": "linuxbrowser-source", "volume": 1.0 } ], diff --git a/.config/obs-studio/global.ini b/.config/obs-studio/global.ini index a2489eae..51db0845 100644 --- a/.config/obs-studio/global.ini +++ b/.config/obs-studio/global.ini @@ -4,7 +4,7 @@ Pre21Defaults=false Pre23Defaults=false Pre24.1Defaults=false FirstRun=true -LastVersion=436207618 +LastVersion=436273152 [Basic] Profile=justtop @@ -14,8 +14,8 @@ SceneCollectionFile=Stream1 [BasicWindow] gridMode=false -geometry=AdnQywADAAAAAANyAAAErAAACvMAAAoaAAADcwAABK0AAAryAAAKGQAAAAEAAAAADXAAAANzAAAErQAACvIAAAoZ -DockState=AAAA/wAAAAD9AAAAAQAAAAMAAAeAAAAAl/wBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAXkAAACgAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAAF/AAABdwAAAKAA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAAC/AAAAZsAAADcAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAABJ0AAAFqAAAAmgD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAYNAAABcwAAAJ4A////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAADSwAAAbgAAAK8AAABIgAAB4AAAASkAAAABAAAAAQAAAAIAAAACPwAAAAA +geometry=AdnQywADAAAAAAAAAAAAEwAABVMAAAGVAAAAAQAAABQAAAVSAAABlAAAAAAAAAAABVQAAAABAAAAFAAABVIAAAGU +DockState=AAAA/wAAAAD9AAAAAQAAAAMAAAVSAAAAi/wBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAQoAAACgAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAAEQAAABCAAAAKAA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAACHgAAASMAAADcAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAAA0cAAAEAAAAAmgD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAARNAAABBQAAAJ4A////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAACmAAAAbgAAAK8AAABIgAABVIAAADGAAAABAAAAAQAAAAIAAAACPwAAAAA PreviewEnabled=true AlwaysOnTop=false SceneDuplicationMode=false @@ -29,4 +29,4 @@ cx=720 cy=580 [ScriptLogWindow] -geometry=AdnQywADAAAAAAAAAAAE0AAAAlcAAAZfAAAAAAAABNAAAAJXAAAGXwAAAAEAAAAADXAAAAAAAAAE0AAAAlcAAAZf +geometry=AdnQywADAAAAAAAAAAAAAAAAAlcAAAGPAAAAAAAAAAAAAAJXAAABjwAAAAAAAAAABVQAAAAAAAAAAAAAAlcAAAGP diff --git a/.config/obs-studio/logs/2021-01-30 11-49-32.txt b/.config/obs-studio/logs/2021-01-30 11-49-32.txt new file mode 100644 index 00000000..06f18e70 --- /dev/null +++ b/.config/obs-studio/logs/2021-01-30 11-49-32.txt @@ -0,0 +1,228 @@ +11:49:32 AM.680: CPU Name: Intel(R) Core(TM) i7-4600U CPU @ 2.10GHz +11:49:32 AM.680: CPU Speed: 2332.087MHz +11:49:32 AM.681: Physical Cores: 2, Logical Cores: 4 +11:49:32 AM.681: Physical Memory: 15912MB Total, 8695MB Free +11:49:32 AM.681: Kernel Version: Linux 5.10.8-arch1-1 +11:49:32 AM.681: Distribution: "Arch Linux" Unknown +11:49:32 AM.681: Session Type: x11 +11:49:32 AM.681: Window System: X11.0, Vendor: The X.Org Foundation, Version: 1.20.10 +11:49:32 AM.682: Portable mode: false +11:49:32 AM.735: OBS 26.1.0-2 (linux) +11:49:32 AM.735: --------------------------------- +11:49:32 AM.735: --------------------------------- +11:49:32 AM.735: audio settings reset: +11:49:32 AM.735: samples per sec: 48000 +11:49:32 AM.735: speakers: 2 +11:49:32 AM.737: --------------------------------- +11:49:32 AM.737: Initializing OpenGL... +11:49:32 AM.767: Loading up OpenGL on adapter Intel Open Source Technology Center Mesa DRI Intel(R) HD Graphics 4400 (HSW GT2) +11:49:32 AM.767: OpenGL loaded successfully, version 4.5 (Core Profile) Mesa 20.3.3, shading language 4.50 +11:49:32 AM.823: --------------------------------- +11:49:32 AM.823: video settings reset: +11:49:32 AM.823: base resolution: 1920x1080 +11:49:32 AM.823: output resolution: 1920x1080 +11:49:32 AM.823: downscale filter: Lanczos +11:49:32 AM.823: fps: 60/1 +11:49:32 AM.823: format: NV12 +11:49:32 AM.823: YUV mode: 709/Partial +11:49:32 AM.823: NV12 texture support not available +11:49:32 AM.830: Audio monitoring device: +11:49:32 AM.830: name: Default +11:49:32 AM.830: id: default +11:49:32 AM.830: --------------------------------- +11:49:32 AM.831: Failed to load 'en-US' text for module: 'decklink-captions.so' +11:49:32 AM.832: Failed to load 'en-US' text for module: 'decklink-ouput-ui.so' +11:49:32 AM.907: A DeckLink iterator could not be created. The DeckLink drivers may not be installed +11:49:32 AM.907: No blackmagic support +11:49:32 AM.924: v4l2loopback not installed, virtual camera disabled +11:49:32 AM.938: os_dlopen(libnvidia-encode.so.1->libnvidia-encode.so.1): libnvidia-encode.so.1: cannot open shared object file: No such file or directory +11:49:32 AM.938: +11:49:32 AM.938: FFMPEG VAAPI supported +11:49:32 AM.952: os_dlopen(libvlc.so.5->libvlc.so.5): libvlc.so.5: cannot open shared object file: No such file or directory +11:49:32 AM.952: +11:49:32 AM.952: Couldn't find VLC installation, VLC video source disabled +11:49:32 AM.952: --------------------------------- +11:49:32 AM.952: Loaded Modules: +11:49:32 AM.952: vlc-video.so +11:49:32 AM.952: text-freetype2.so +11:49:32 AM.952: rtmp-services.so +11:49:32 AM.952: obs-x264.so +11:49:32 AM.952: obs-transitions.so +11:49:32 AM.952: obs-outputs.so +11:49:32 AM.952: obs-libfdk.so +11:49:32 AM.952: obs-filters.so +11:49:32 AM.952: obs-ffmpeg.so +11:49:32 AM.952: linux-v4l2.so +11:49:32 AM.952: linux-pulseaudio.so +11:49:32 AM.952: linux-jack.so +11:49:32 AM.952: linux-decklink.so +11:49:32 AM.952: linux-capture.so +11:49:32 AM.952: linux-alsa.so +11:49:32 AM.952: image-source.so +11:49:32 AM.952: frontend-tools.so +11:49:32 AM.952: decklink-ouput-ui.so +11:49:32 AM.952: decklink-captions.so +11:49:32 AM.952: --------------------------------- +11:49:32 AM.952: ==== Startup complete =============================================== +11:49:32 AM.955: Switched to Preview/Program mode +11:49:32 AM.955: ------------------------------------------------ +11:49:32 AM.957: All scene data cleared +11:49:32 AM.957: ------------------------------------------------ +11:49:32 AM.965: pulse-input: Server name: 'pulseaudio 14.2' +11:49:32 AM.965: pulse-input: Audio format: s16le, 44100 Hz, 2 channels +11:49:32 AM.965: pulse-input: Started recording from 'alsa_output.pci-0000_00_1b.0.analog-stereo.monitor' +11:49:32 AM.965: [Loaded global audio device]: 'Desktop Audio' +11:49:32 AM.966: pulse-input: Server name: 'pulseaudio 14.2' +11:49:32 AM.966: pulse-input: Audio format: s16le, 44100 Hz, 2 channels +11:49:32 AM.966: pulse-input: Started recording from 'alsa_input.pci-0000_00_1b.0.analog-stereo' +11:49:32 AM.967: pulse-am: Server name: 'pulseaudio 14.2' +11:49:32 AM.967: pulse-am: Audio format: s16le, 44100 Hz, 2 channels +11:49:32 AM.968: pulse-am: Started Monitoring in 'alsa_output.pci-0000_00_1b.0.analog-stereo.monitor' +11:49:32 AM.969: [Loaded global audio device]: 'Mic/Aux' +11:49:32 AM.969: - filter: 'gate' (noise_gate_filter) +11:49:32 AM.969: - filter: 'Compressor' (compressor_filter) +11:49:32 AM.969: - filter: 'Noise Suppression' (noise_suppress_filter_v2) +11:49:32 AM.969: - filter: 'Limiter' (limiter_filter) +11:49:32 AM.969: - monitoring: monitor and output +11:49:32 AM.969: Source ID 'linuxbrowser-source' not found +11:49:32 AM.969: Failed to create source 'Linux Browser'! +11:49:32 AM.969: xshm-input: Geometry 1366x768 @ 0,0 +11:49:32 AM.972: v4l2-input: Start capture from /dev/video0 +11:49:33 AM.089: v4l2-input: Input: 0 +11:49:33 AM.146: v4l2-input: Resolution: 1280x720 +11:49:33 AM.146: v4l2-input: Pixelformat: BGR3 +11:49:33 AM.146: v4l2-input: Linesize: 3840 Bytes +11:49:33 AM.517: adding 64 milliseconds of audio buffering, total audio buffering is now 64 milliseconds (source: Mic/Aux) +11:49:33 AM.517: +11:49:33 AM.641: v4l2-input: Framerate: 30.00 fps +11:49:33 AM.653: xcompcap: [window-capture: 'term1'] update settings: +11:49:33 AM.653: title: josuer08@LaTiTuDe:~/Documents/tinysh +11:49:33 AM.653: class: Alacritty +11:49:33 AM.653: Bit depth: 32 +11:49:33 AM.653: Found proper GLXFBConfig (in 24): yes +11:49:33 AM.653: +11:49:33 AM.659: Switched to scene 'terms-cam' +11:49:33 AM.661: ------------------------------------------------ +11:49:33 AM.661: Loaded scenes: +11:49:33 AM.661: - scene 'top': +11:49:33 AM.661: - source: 'topscreen' (xshm_input) +11:49:33 AM.661: - source: 'term2' (xcomposite_input) +11:49:33 AM.661: - filter: 'greenout' (chroma_key_filter) +11:49:33 AM.661: - filter: 'Color Correction' (color_filter) +11:49:33 AM.661: - scene 'onlycam': +11:49:33 AM.661: - source: 'camera' (v4l2_input) +11:49:33 AM.661: - scene 'terms-cam': +11:49:33 AM.692: - source: 'camera' (v4l2_input) +11:49:33 AM.692: - source: 'term1' (xcomposite_input) +11:49:33 AM.692: - source: 'term2' (xcomposite_input) +11:49:33 AM.692: - filter: 'greenout' (chroma_key_filter) +11:49:33 AM.692: - filter: 'Color Correction' (color_filter) +11:49:33 AM.692: - source: 'Linux Browser' (linuxbrowser-source) +11:49:33 AM.692: ------------------------------------------------ +11:49:48 AM.107: User switched to scene 'top' +11:50:10 AM.009: User switched to scene 'terms-cam' +11:50:15 AM.189: --------------------------------- +11:50:15 AM.189: [x264 encoder: 'simple_h264_recording'] preset: veryfast +11:50:15 AM.189: [x264 encoder: 'simple_h264_recording'] profile: high +11:50:15 AM.189: [x264 encoder: 'simple_h264_recording'] settings: +11:50:15 AM.189: rate_control: CRF +11:50:15 AM.189: bitrate: 0 +11:50:15 AM.189: buffer size: 0 +11:50:15 AM.189: crf: 16 +11:50:15 AM.189: fps_num: 60 +11:50:15 AM.189: fps_den: 1 +11:50:15 AM.189: width: 1920 +11:50:15 AM.189: height: 1080 +11:50:15 AM.189: keyint: 250 +11:50:15 AM.189: +11:50:15 AM.194: libfdk_aac encoder created +11:50:15 AM.194: libfdk_aac bitrate: 192, channels: 2 +11:50:15 AM.196: ==== Recording Start =============================================== +11:50:15 AM.196: [ffmpeg muxer: 'simple_file_output'] Writing file '/home/josuer08/2021-01-30 11-50-15.mkv'... +11:51:37 AM.134: xcompcap: XCompositeNameWindowPixmap failed: BadMatch (invalid parameter attributes) +11:51:42 AM.211: [ffmpeg muxer: 'simple_file_output'] Output of file '/home/josuer08/2021-01-30 11-50-15.mkv' stopped +11:51:42 AM.211: Output 'simple_file_output': stopping +11:51:42 AM.211: Output 'simple_file_output': Total frames output: 5068 +11:51:42 AM.211: Output 'simple_file_output': Total drawn frames: 5087 (5221 attempted) +11:51:42 AM.211: Output 'simple_file_output': Number of lagged frames due to rendering lag/stalls: 134 (2.6%) +11:51:42 AM.215: ==== Recording Stop ================================================ +11:51:42 AM.299: Video stopped, number of skipped frames due to encoding lag: 162/5093 (3.2%) +11:51:42 AM.394: libfdk_aac encoder destroyed +01:16:53 PM.971: ==== Shutting down ================================================== +01:16:53 PM.977: v4l2-input: Stopped capture after 154321 frames +01:16:54 PM.109: pulse-input: Stopped recording from 'alsa_output.pci-0000_00_1b.0.analog-stereo.monitor' +01:16:54 PM.109: pulse-input: Got 690915 packets with 231047255 frames +01:16:54 PM.109: pulse-input: Stopped recording from 'alsa_input.pci-0000_00_1b.0.analog-stereo' +01:16:54 PM.109: pulse-input: Got 524739 packets with 231134576 frames +01:16:54 PM.109: pulse-am: Stopped Monitoring in 'alsa_output.pci-0000_00_1b.0.analog-stereo.monitor' +01:16:54 PM.110: pulse-am: Got 524686 packets with 231111064 frames +01:16:54 PM.111: All scene data cleared +01:16:54 PM.111: ------------------------------------------------ +01:16:54 PM.162: [Scripting] Total detached callbacks: 0 +01:16:54 PM.169: Freeing OBS context data +01:16:54 PM.186: == Profiler Results ============================= +01:16:54 PM.187: run_program_init: 1154.54 ms +01:16:54 PM.187: ┣OBSApp::AppInit: 2.05 ms +01:16:54 PM.187: ┃ ┗OBSApp::InitLocale: 0.679 ms +01:16:54 PM.187: ┗OBSApp::OBSInit: 1127.21 ms +01:16:54 PM.187: ┣obs_startup: 20.515 ms +01:16:54 PM.187: ┗OBSBasic::OBSInit: 1053.54 ms +01:16:54 PM.187: ┣OBSBasic::InitBasicConfig: 0.071 ms +01:16:54 PM.187: ┣OBSBasic::ResetAudio: 0.083 ms +01:16:54 PM.187: ┣OBSBasic::ResetVideo: 95.153 ms +01:16:54 PM.187: ┣OBSBasic::InitOBSCallbacks: 0.004 ms +01:16:54 PM.187: ┣OBSBasic::InitHotkeys: 0.038 ms +01:16:54 PM.187: ┣obs_load_all_modules: 121.702 ms +01:16:54 PM.187: ┃ ┣obs_init_module(decklink-captions.so): 0.018 ms +01:16:54 PM.187: ┃ ┣obs_init_module(decklink-ouput-ui.so): 0.482 ms +01:16:54 PM.187: ┃ ┣obs_init_module(frontend-tools.so): 68.934 ms +01:16:54 PM.187: ┃ ┣obs_init_module(image-source.so): 0.005 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-alsa.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-capture.so): 0.274 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-decklink.so): 0.115 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-jack.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-pulseaudio.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(linux-v4l2.so): 4.091 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-ffmpeg.so): 0.172 ms +01:16:54 PM.187: ┃ ┃ ┗nvenc_check: 0.151 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-filters.so): 0.013 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-libfdk.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-outputs.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-transitions.so): 0.005 ms +01:16:54 PM.187: ┃ ┣obs_init_module(obs-x264.so): 0.001 ms +01:16:54 PM.187: ┃ ┣obs_init_module(rtmp-services.so): 0.709 ms +01:16:54 PM.187: ┃ ┣obs_init_module(text-freetype2.so): 0.029 ms +01:16:54 PM.187: ┃ ┗obs_init_module(vlc-video.so): 0.257 ms +01:16:54 PM.187: ┣OBSBasic::ResetOutputs: 0.09 ms +01:16:54 PM.187: ┣OBSBasic::CreateHotkeys: 0.034 ms +01:16:54 PM.187: ┣OBSBasic::InitService: 1.161 ms +01:16:54 PM.187: ┣OBSBasic::InitPrimitives: 0.128 ms +01:16:54 PM.187: ┗OBSBasic::Load: 746.089 ms +01:16:54 PM.187: obs_hotkey_thread(25 ms): min=0.062 ms, median=0.159 ms, max=288.802 ms, 99th percentile=6.929 ms, 99.9951% below 25 ms +01:16:54 PM.187: audio_thread(Audio): min=0 ms, median=0.074 ms, max=27.161 ms, 99th percentile=0.321 ms +01:16:54 PM.187: ┗receive_audio: min=0.002 ms, median=0.16 ms, max=4.573 ms, 99th percentile=0.555 ms, 0.0165131 calls per parent call +01:16:54 PM.187: ┣buffer_audio: min=0 ms, median=0.001 ms, max=0.088 ms, 99th percentile=0.004 ms +01:16:54 PM.187: ┗do_encode: min=0.068 ms, median=0.157 ms, max=4.563 ms, 99th percentile=0.545 ms +01:16:54 PM.187: ┗encode(simple_aac_recording): min=0.067 ms, median=0.149 ms, max=4.557 ms, 99th percentile=0.454 ms +01:16:54 PM.187: obs_graphics_thread(16.6667 ms): min=0.098 ms, median=3.819 ms, max=678.563 ms, 99th percentile=17.014 ms, 98.8432% below 16.667 ms +01:16:54 PM.187: ┣tick_sources: min=0 ms, median=1.94 ms, max=678.426 ms, 99th percentile=11.892 ms +01:16:54 PM.187: ┣output_frame: min=0.077 ms, median=0.198 ms, max=31.265 ms, 99th percentile=1.162 ms +01:16:54 PM.187: ┃ ┣gs_context(video->graphics): min=0.077 ms, median=0.198 ms, max=31.264 ms, 99th percentile=0.548 ms +01:16:54 PM.187: ┃ ┃ ┣render_video: min=0.029 ms, median=0.138 ms, max=31.075 ms, 99th percentile=0.414 ms +01:16:54 PM.187: ┃ ┃ ┃ ┣render_main_texture: min=0.025 ms, median=0.135 ms, max=31.071 ms, 99th percentile=0.381 ms +01:16:54 PM.187: ┃ ┃ ┃ ┣render_convert_texture: min=0.03 ms, median=0.059 ms, max=20.252 ms, 99th percentile=0.178 ms, 0.0162064 calls per parent call +01:16:54 PM.187: ┃ ┃ ┃ ┗stage_output_texture: min=0.014 ms, median=0.029 ms, max=2.172 ms, 99th percentile=0.09 ms, 0.0162064 calls per parent call +01:16:54 PM.187: ┃ ┃ ┣gs_flush: min=0.028 ms, median=0.048 ms, max=5.968 ms, 99th percentile=0.129 ms +01:16:54 PM.187: ┃ ┃ ┗download_frame: min=0 ms, median=0.006 ms, max=10.251 ms, 99th percentile=3.585 ms, 0.0162064 calls per parent call +01:16:54 PM.187: ┃ ┗output_video_data: min=0 ms, median=0.848 ms, max=11.178 ms, 99th percentile=3.298 ms, 0.0162032 calls per parent call +01:16:54 PM.187: ┗render_displays: min=0.003 ms, median=1.632 ms, max=300.192 ms, 99th percentile=6.153 ms +01:16:54 PM.187: video_thread(video): min=0.001 ms, median=2.46 ms, max=1357.29 ms, 99th percentile=21.434 ms +01:16:54 PM.187: ┗receive_video: min=1.479 ms, median=2.492 ms, max=338.53 ms, 99th percentile=37.753 ms, 1.05794 calls per parent call +01:16:54 PM.187: ┗do_encode: min=1.478 ms, median=2.491 ms, max=338.527 ms, 99th percentile=37.751 ms +01:16:54 PM.187: ┗encode(simple_h264_recording): min=1.461 ms, median=2.474 ms, max=337.595 ms, 99th percentile=37.739 ms +01:16:54 PM.187: ================================================= +01:16:54 PM.187: == Profiler Time Between Calls ================== +01:16:54 PM.188: obs_hotkey_thread(25 ms): min=25.098 ms, median=25.244 ms, max=313.875 ms, 82.9311% within ±2% of 25 ms (0% lower, 17.0689% higher) +01:16:54 PM.188: obs_graphics_thread(16.6667 ms): min=4.331 ms, median=16.667 ms, max=678.568 ms, 98.0792% within ±2% of 16.667 ms (0.757597% lower, 1.16316% higher) +01:16:54 PM.188: ================================================= +01:16:54 PM.289: Number of memory leaks: 0 diff --git a/.config/obs-studio/plugin_config/rtmp-services/package.json b/.config/obs-studio/plugin_config/rtmp-services/package.json index 7006b2c8..0a9c2dd9 100644 --- a/.config/obs-studio/plugin_config/rtmp-services/package.json +++ b/.config/obs-studio/plugin_config/rtmp-services/package.json @@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 150, + "version": 161, "files": [ { "name": "services.json", - "version": 150 + "version": 161 } ] } diff --git a/.config/obs-studio/plugin_config/rtmp-services/services.json b/.config/obs-studio/plugin_config/rtmp-services/services.json index f538cef7..6e9ca4aa 100644 --- a/.config/obs-studio/plugin_config/rtmp-services/services.json +++ b/.config/obs-studio/plugin_config/rtmp-services/services.json @@ -1,5 +1,5 @@ { - "format_version": 2, + "format_version": 3, "services": [ { "name": "Twitch", @@ -193,10 +193,31 @@ "recommended": { "keyint": 2, "max video bitrate": 6000, - "max audio bitrate": 160, + "max audio bitrate": 320, "x264opts": "scenecut=0" } }, + { + "name": "YouTube - HLS", + "common": false, + "more_info_link": "https://developers.google.com/youtube/v3/live/guides/ingestion-protocol-comparison", + "servers": [ + { + "name": "Primary YouTube ingest server", + "url": "https://a.upload.youtube.com/http_upload_hls?cid={stream_key}©=0&file=out.m3u8" + }, + { + "name": "Backup YouTube ingest server", + "url": "https://b.upload.youtube.com/http_upload_hls?cid={stream_key}©=1&file=out.m3u8" + } + ], + "recommended": { + "keyint": 2, + "output": "ffmpeg_hls_muxer", + "max video bitrate": 51000, + "max audio bitrate": 160 + } + }, { "name": "YouTube - RTMP", "common": true, @@ -456,6 +477,12 @@ "recommended": { "keyint": 2, "profile": "main", + "supported resolutions": [ + "1280x720", + "852x480", + "480x360" + ], + "max fps": 30, "max video bitrate": 6000, "max audio bitrate": 128 } @@ -1431,52 +1458,8 @@ "common": false, "servers": [ { - "name": "Chicago, US", - "url": "rtmp://ingest-any-ord1.broadcast.steamcontent.com/app" - }, - { - "name": "Seattle, US", - "url": "rtmp://ingest-any-sea1.broadcast.steamcontent.com/app" - }, - { - "name": "Los Angeles, US", - "url": "rtmp://ingest-any-lax1.broadcast.steamcontent.com/app" - }, - { - "name": "Washington DC, US", - "url": "rtmp://ingest-any-iad1.broadcast.steamcontent.com/app" - }, - { - "name": "Frankfurt, DE", - "url": "rtmp://ingest-any-fra1.broadcast.steamcontent.com/app" - }, - { - "name": "London, UK", - "url": "rtmp://ingest-any-lhr1.broadcast.steamcontent.com/app" - }, - { - "name": "Stockholm, SE", - "url": "rtmp://ingest-any-sto1.broadcast.steamcontent.com/app" - }, - { - "name": "Tokyo, JP", - "url": "rtmp://ingest-any-tyo1.broadcast.steamcontent.com/app" - }, - { - "name": "Hong Kong, HK", - "url": "rtmp://ingest-any-hkg1.broadcast.steamcontent.com/app" - }, - { - "name": "Singapore, SG", - "url": "rtmp://ingest-any-sgp1.broadcast.steamcontent.com/app" - }, - { - "name": "Sydney, AU", - "url": "rtmp://ingest-any-syd1.broadcast.steamcontent.com/app" - }, - { - "name": "São Paulo, BR", - "url": "rtmp://ingest-any-gru1.broadcast.steamcontent.com/app" + "name": "Default", + "url": "rtmp://ingest-rtmp.broadcast.steamcontent.com/app" } ], "recommended": { diff --git a/.config/obs-studio/profiler_data/2021-01-30 11-49-32.csv.gz b/.config/obs-studio/profiler_data/2021-01-30 11-49-32.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..3585243364cf75bf6f7113e92a9386bdb0d7ac0f GIT binary patch literal 234059 zcmXVX1zc2H_qKq*g(0q@bcn*>2*QXo0s>b$6p)bCp-Wntkur#Z8M>t#8M;G(p+o5q z8A?*R`S!g3&);%9vClr|?6cQe&-1J;$LD{p{qGM+@$Bq?Q&%+m;hxb)l19q4{G6ratb`YC3pyQ!1Nm$BE|K=ea}xvWqkdw&KFxwMmgqXWc-gyFL!>fa9pMjrUzW~mdRZF z(Q7&DXgOWpEAv0z@4dRby4YG=-wwE1=eUeN)I6ImYnjWdI&`m$3fNoU_CILxuM9}q z8%;3{kZeA2Yd%?QIp5p{JR#W9+)1NMRTM|& zCFvaQ{Ly*9<*{w|)OE3vesbPllm2S% zVln;XvS|Kd*Hgy#bd$E_s-I)7Ww1qIX8kKY}(@j2kKK<50fuaC^t z-thUTrqqVj-OCSWPR%Fh2lH2d8ceS)1e!1RlR28tF2`HW=KYT@u1@_o&R4^lrDYD} zk6b0wuMTAPFSY~r&N%%4o^4+q%P*d<#txk0^iKCTPi)WoO-~PN=C4k}23szd8DxB~ zF3K+VrPpUzWll4l{C8ue{g_wQTTbNXFFNvC&dxv2`(1(CT%1J7Jia>R**abGtaIMk49%D4pPgDR!sdN18)TZk zMRFK#q+gxzfTOf~qg$qawhkA^3;`EWz*!CiS}x0~`e>alSEF0jWKIm4oBb{v=ysQ) zTh4ycrU#r^@y5!We$1-?rOfjp|Anx5|I-677gc>Ov$75yF86(WnUBDUrS#Vk0Vmwe7pFX?zmpG6 zidvd}v|KE3`0s(Cz1)=XKRQ^EX=-;oD)YCf`s*t2cg?BnkT(5lEzH#SY#Mm@u~W;* zc^;Nt<}%jF|J2wcvc;j}>aU*Z)o+e;?Y%sXgfm5&_6zaB#pJ>HOX{dKnJaS{sq}&i z;oZDTSLr#{i@fNo4kwv_(}g|Lcfv9*@t42%E+IpkqsLyJYc1#I4lPC`>xyY>dVgIt zXPXmcXfFcJ4;upVo35e)+>-q95q<|h2Ty*i_@CPBT79G!t}4>W*ys%t%E4J z=<<`GwutcRnU2|(@PwwEfS@ z&;4Zh)TU_Zxuf$8?$3%`OU+P*=)_>%z$^Nx_eF1M!oyDucF6dI5)}VfwNKOykyR>L zwIdeg(UM%r;F?T7Ng~(gkg+9y$my&^xW%c>O^12N_NiQu2tr%6xu!AoC`R;`358Rl zRE_VbvYt83sr|^|mh89?L!(7?-_Lys%3IWyQ5;E?oU(eH*-@2}ea{%CFg!(h&(Ka& zcU;HEQ{RT&Vt!(+C{8psvDp!xth9&(QweNxRa< zkAF3l=W|qq?nmqL*HOZn+T_qHLY#)fdPXO+uX}}KseCepZRYFy?%hs0cZ?`4;DhiA zb?e?r>Z>2*-3}3uBKlYTlyk4=LS!)0nqqM631@o5X`HLPNcGT7ZyMKb*H_j%14$G` z$?VMGQ?!Qt()(^X4Z!Bf_cZ<2H(;A1|!(LzPUds7pPTrd1c5up+ z9W>`ltYNMElEwP+WHuLX5n7zG{igfL392fC)x$PULwJ9?ed($j7FmZS zI7(cjAV-YeoPig2FIvyV!ONmq)G4e%v<#84+v->*hi0{Kte3Ce|Kh3|+BCG9oLkAM zx*J%x>Tjq$Rl|+dszb2psj!8IL64GuxZbaPHm~E-puFyb_OQ*~`0j7*5=K?;6NaC1 z`QMxRXGwX6D9qm~WZhRYxE<$CTK_}~dVpK(*5;^S`2t3Q!doL~tA>BwwnDq5X85df zSlB_n)CRo~kg0rCqU;3U3OTYdO6>p4n~15c*ex9TWpH1po>D9Rj&I{@W^!wI3RL>R@ zgY+JmxT)@f2~kLo@TO5-9L>&?=Kjp4+{E1T&-KkTnjV4whR%ezB?Zq4!A_1WIYo>#TA&gy;jUM|Z{H=#+zt{)UU zozSsx&Ay~BxY=ombH`Kk##+ISL+=1DL@FxvWLBXM|gNJBvr;KF4s;)|8$G+NR6kX_PLsl{+S%2FphbZEiYAik5^(U?lA{M zeeNLH+sJTNFyfD)NTJhYb>D)hL_p?nVYxz;C`&5!a5X-hl6skSDz51&M8Q+wpf;b_ zHWMdm98+RlNpSfBQz5c!tkTpM_VF0;Qn{?6rzK026YeI~oWuE>#zIqm=;DRs5o^zp z^Xcp{mywA?TS11T8BVl!VWnd^nA({yKSXG_J8AFcMGSm!(h15}$LUt;jjnD?W5TU6 zaa3d_HGIGoFM7aRI%dV@L=>jhaN1R~q?Utk#P@{z(9PPVM>A7--erhyH6zczn>qaO zkIsT;miW)?x;BEP*_wEflxw-eu}vAG_|JGH8BY4lR{gV`nKs48g{mjM*7IMpBSlUq|2R>aSp*} z8?8F_$TmL@Gu~FI^3Z}-d~Ry#+#dUV8lNTmexD4X4XN_Ns#d&ckpF6|gN$cK;V>~; zlkB!{sl8&o;S~0v@q~Pbw)~YX7p)#Y7INjHNysFJpCjo99Lg&6a>r z&1qCDd~L-OcdNc@f0ZO@?sb;h;eLZ5!B<^>($k{D1li`JEpjyr6UPut00Ud>pCp@M zjyd&b`?!JYbpMVdC40DudXc(;X_SY;$x~+C!>Bwv-Ktti$uwI7DSb%EN|@ce&PGkoM9q|$U7Qo+PVO$H*(aTWxEyJr2IRJv3FN_Z{YC_3}U78f+%Dy9k*sHig3tJ3Dq?lvhQ`=V-XBG zw`?wOtY)c*dw}O=75qh;c%SyZ>Pxec>&nccX4|&NwzoWpSiNo*DSQNb#q>Qc?Hh0J zt0Qqv3VzfRdwOQ26m_k?WCP?FHtanNu;Uh8rY&%vp_~Bd&nJ{%jE!>}@d-bOgLJcc zF?#W^GJdR%Cf&ExYxj#i8{FiVP*c+u0Z-Fih<-IrPv>Y(FFc9kB{iT_dqr)KGy(Q= zSf(ughOvtHHn<(u+e>U!41Dda!0@vOWzVP~+nmNS;5&Xj!uCW{(Pgk+@##?Kr)UfU zZPN~w>VmpPs(bhdO}0#CvrKWdOag=Q4LHQi+rK@ZbEqiD!HN7NTgkemUmLE9?ptSh zwSAcAHk+(=Dw5CX&vJ{gQ5_0rVg36qXFwlWM=HiZFO;5_K-xC5sbe;9ovmQ$rP;2q zd4W5!4r^fMGTN@SPV5>7X0UC$54JTWK-Vn7xP3*=f6qt^{RPZxNY@TS!jo0_S2uoE zZyhriyH>uR1&lA=i{C72&8B#ts-Gv4bF_mtiYCGEHBcn>Z&I3jk<86)^P!jn>s|5}Q)j@eMo6lCf#?7%DghZSMY{|Ti} zFjDW9ybXTEiV9kPZC08Gv`)&i=W(_q?%RkK=SUdlHfE36B5{6D0KU!0gUu zsYeVrEC1H~G)tc_Q%TpEtZFGAuVz-tc{KUf)`JvULw2j~0i5x}!?imC`Utl;H&hOd z3$iU`kaS*@M(CvC3eaYM4~6gEb%@BZ1|r%W+1tZ&oa zB5^-AT!by+Y~8$wxgsQiA$shTM1^uxV@GmSChJhozyDTxcupL2#+QRV3O-vk{Z9nbHiD^Goq+DlU3{TB2zl{FhPCCYGieT5VI%@)iz-aRYb1nd1 zP0!&<(56?TMh~Qgli>S8h|!Rzi-BZCjao6gFy#}}6YuW- zPFNnc(ceJ?->fjY6X~lyxqXX8qMOrBUOvv1>{f;(r?IE_^kOid5Vb+s4Z7SN`LR&4 zlzd~eA!=$6Q4EBbo(FDqd)-%zgo|@72BIuroG-oPI*B-QDDnTG?8{N0rp!<144idgR{<_T#$5qX z;}4|rJne~UYem$KTGWna&K<4^&P0>gP*PbI)N>)~`BJtkl*@WUu{2ijbpAIy;+`wr zb&{lH+9t-j3rDDVzKr!bi;W-PQj1u;={Nu`JXa;ktA;iMO!hKfmCh@|l6NhxHUEB|xD zf|^+bxhvWhraqRAOVmF|?+xPrJjooMdKmK3gmjr7LyRt?Q0=5t^MA~^bt_@I(ojQ; z7hab%JxfFiWiXRmi+xC5cRPXi8Xvr?aSI~S3h%|nxzkQ#Au#tg0Bf_ z6jL(85Tj2j^2_;s&PUSalqNs(&ss?3#e`DXtX9^0)l2(rew=!y^5u$D`2Sam>GOxT{SXu5$0~H&a{1v zRKB7r%-f#b>T)xKmvM%fF(fqpVdi6+7W~hsV#p1bzZJ1!X;4V&a|1&4YKr@_D}z19 zjLX}1NE|8Zpi;Hs!}`-fXNT200!+FBxV!uYRS#COKokgOxb*`((;y*B*j;}PHDz%MYW8}ZrW zy73I35Z~zSIRLgIM%;n&)G#m#MbgnsJb+sZ&jorPA;`U__qt0sllPZHyKGeGoqIA~ z%OQdPdPUTk2|D)Jw!@P5bNSR$D#{#tB)VW9Tg1)B{CeJ6^-%V~PWoZ@FtED%#Bw7u za2?^0;X*F{55dAyL5NBb{5P3!VZI}{LXIt7D%njw8H}f)f!SL-s>vt9h?Y@Qa36{^ zP@Xb{ifM~r1}kDBLb7izsK zS2ti3iG=oY&;{17#ON-Y9zSSSJx1q6PjxBA!5DTRtktOjn@q)UzX98VIZ~h3jgBx2 z8a;1$ENan2b_F*J_ZdLG6!hq!Q8m-URT_7ko43@SlQpc0rnd zaGAkW59E3zgNt`5VG#@!1>A@WgYJL05zlW_zPjn{q;XFo&?i6%20Jj@)vwb8@Z0NF*g2m z=q_ek4`3Dgg>ih7B;hu|dOmr=BE~K5J&&&^Z<19g?oDdqS1yKHd{3sjk^Cdvj=^yX zy4Vlx-Iziy5vx~xP`B-@qNYnw7a7e+4a+5NZ%xu*tLI?G>-3ILxzeEq|1)`#I9$> ztuvFrb8XBsZIE>=O|3>r<*j(<_vY?M9G0R;7t&Xkxi04yL7b(zJOgqzAvpf;N^}Ha$%%oo0D<- zQ=zvLNXa4=!B(8?cj*QGg@^YrO*Pm`mg;tZSFho=?DLf?s>4%7Zi&I*Ho|5O)&N@t z-wY=ud+cM_so_%#;3&Y&kZa?igxJlVNBJNnCqypHt|O@ljFpp5c%bnOpMlJyY-SE{%%NntTvl3Mbkhmy`q!bB0^PVTq>s~Rd78G*vPa-qPymr zL!KIjhxM#N>knxT-=&g4S{mK*d#(B{SkYa4<=H{*YzGheOwD_mVkMJLeA6FibEK-# zVCs_Vi^Pp%`ZHjo!?4dX6>Sr+Ut*Dfw%*HTVHR9t0R|x6zKuL(O=$5njhJc$;9CEV zxYH(1(-c%OgNVsQ9vn_0r*a;wh6yWnrVwk-2J=^mI}4?vz}bG&!%f(scgl9bF2FW#{va%xPKN>>;po);E_4}KhDntsI z8pr8(!|=cl5?O7U>+S6~1lOi>RwgV2zNF+g)vKL)7zE8&kk$1b%8FlaAmB{Ld;LY~(e5xJ|W1 zP8q9}p&9UCoLnfO54r>w>kV72?_Y3*9{?FIX~T@OFhkn1Re!eQbVU-VQyKo)-Aa(u z*rSek33+Zdkdt)O?L?-^MY2gc&5n#u2x4o@4fT+1eQBW4QK(*Oik|3FV?A+@l{QUFGRuP% z4e@iwo&`^^2Qd5~!q&ZGYN(E!sz?++oX6@fy0p^(LYO$7o2p>DF0=b3Qam)kF>!aQ ze6tzoKY^Pfq-0T}@B25k2W}**o?5N9PAk)JC%f#A`)0MUCb$*Q>j*vo@1E^*huprO zTiZl6w~>Csj34eLVs7)>XvEoo!d2F3_ttd~CVh(XQa%DHNUS|Kju@S+yPFK@x!X?) z;-}iwV*^W`F8zL3QwBwjUM{PE(9*k1@tiVFtK0oBG?(@%v&-F~lyVl&9>B1mrrLt9 zwU>qQGpXV^K6h3CNAXqn%F?|5R?7@7ml$)L{C_s$oLD|-rh)rOou4GOl%GNz1c958 zY_bY62yrz*$wzJ_%rIAEn`+b~y4>ltG9$SXG-w{?TA5 zSb~sj4BzJS%sQa+qWNFOOO+XW%M#4;uwJdx-2gd>AhkrN=BVd3ChfmZ0s>_Q3Pv6R zq_jUtYMsK$iz2XlBiX74xsmYD792(o{S2+{Evs%>fd3IaiHIx2InF>6$DxvlqX497o(rrr6gH&Cz4tx9JM$TYo1n@I#ar?kUn0lGsG- zS_ITMBC~r#C_16ekV^xkIGqswdIYg+&1kJQd)}HD;L28XmWPymOTv@{2^xSH(7r(( zgbgB_8DiJ9WM}QI$ArVXa!8l=ge2;Q3QLg?1P|%lK=60~m+VF3a|kK>Eo+w;e9h2o zhX#d}qU?Kgo8WuVH+rI-Tak5}&Is1GW)k(SznZ)V|KObgbU=c9OJKbh8jI?-&T+c+ zTZ;8tCxNQ5={iAb>&ql=a*fflY=i_2SrPbaTo%j8nq^RDCN%vhk77MS?0 zm@~EdOcvc|w-SV=pQ{vtkO9(#_JZE55{iW0p7w9|82}{C~^$ zfyV(^>0Ksq(9v>C=~)cTZVVHiyXbCQ-zW$VZ`!=4h|z}f;40jXz}g1x<5Qp`Wbq+T zbV%@tUM0$!jJRTgqB!`S^XE% z7Oe1`^-D7QIzO^$atPH}y82o@02RP`hfN9a4>flfNb(#)CBYA>K) zomu|0lCam4C0d3JXmv2CQ@?-4Cr0N<$vRm@aBMypwD;Il7 z3^0t=yo>Izl9yzTT1=MSN2aH9oIKFq-Pbycfao~8-tu>A;G*Z5d2zxKeEUZvVz zmZn~wd)b^=3xZo6?N0wc{O^$?%|uHP(AIKT^HtW z)RQjJy(7KMF9Fkv zNOP%HMArS}gL|fEMK0cldrB^a0R0_DIKYQ@WjQCq=ytnnd0mIvX(_^7d5k#8yG6NZG9QZ4P;YWi(3zfduKBy}LY>&k10 zbd&5^foa-_Ji$JB`$~`9%ZXqUa%tp;x+_S7Ld@;~DYS&FxEaTDbI>u5MAb{{(>K8M znNi28Fw=CcW@*~ueRbH)bSdlgZgKX<@LSv{{8B}3wI%lVBZ}ffNS>E zK3OvINKx>TE!3=S&B$SUZVt`Kbwaj1wSOub$XYSt+5IVp^K*Fi)3?${GtZP?DW6yc zv7*_k!obYBOjVfXSj)p&2r2LcJ8Z5ain!c>t<>`bNu3jtxP%XovVwy=9%mAp5g5g# zfyxy)FHz2&4&+eSs3^?GQ|pwOu<@ARA_(}Wk+F*RLkn5gcJ@om$oIsG8}~Cs%#pHP z&;Iv5%z|Gr<=WEe`4!WZG0!lR{e)z=KS&(;^#Q#08j%Grgo^*EQiaYR2di$~TGY#9 zPSwurcb+PLw|oo7`qDz&P$V=HJt$l)FvcMWrLuCUn|yj&s-gM{0Hs@yM2K%aq_Za}z*>$ABUZgF^fPj861ud%z~8dbP=C`A`!x8FWj0yQa4 z-o@-+UMg*S8zYcETK{FL#;X+OS#gx#$XC4)!VkmIkZ0unxDR+t|4jfnC^g+C>xQ@^ zrY(ANez*e#{8~)srXUlKa1U15AFJ#Y28FBuZ7)Z`3)vRLPdW%u+rm=QEolKw;Mb%* zA@?UWL6>UMZZ#OH6OhEp1Oh9IcC<#vI;(p}66}*Zp-h5~)9sN|GCuOH-`c`)wekHN zCG-SRikjKjJfcQhsco;8kj4kbfwyM@3PR+}X~3*CE|pf=V0bNoIs!tMK)Srk43zZ+ zRQ;B7Jl4wDoWucH#|Xp;;#SJO+R-|4=gdAsWL=;PKUac0Wf}v>rf@6+sAJ8pqE7kY zD_Y+}9102Gfloag;f-)fi zQ_onz0oC6v45DWK%Gt(x*6M@3b|;}RxTY~!w0QRc{1mYx=Ft5i1anSX5W=C^oJM-C zlk!t&9R4}zPbvDCczQrezx)XpurZWZ1h;ZA>1}oS z!u>FvHCmXdDL_zQs;GQrU_?BK<6BCsz*w2AlBy?4B>=@h<;tG@-A{EO6j*TMFqet9 zK1RV3DPix}wNI_IbDgriy^(FI?^L=h2uAa)Fb@oVBt=#|Ow|i&AMzPSr>YH&%jH{& z-aUAfgB9ieD9qjP*dn4gc-N2=NVTQQsAs?Ay(1UffBXqNWqyR1JwyR*U*--$*?7Jo zf``9HwVwiCri)|%0{39(es!2y3C)@VZ6Y;WIm4sSaFT3%fD-PCAa4`JP7+WglMWTI z#8%drlDIcFfgaipgkzUwIjXgKT7v*+p6oZ&cYAqyEH#j(C&?Zmut?U2FU)p4dVGv2 zWh^!@6|S;`+^N)^&8Mnt5Et|ORxT*258l%ZL_7e6Fw{LYN>H!BKL;2TEUOSPr)^<1 zzv&XJj7OCLT|-OoHif&fJWyx73e)p3LOM@mh+zG zw22CQgC>;O_%vyieS#4W7Mq__E0Zwu!C!=%$qfFGhI;PC&{XVeXq{}YUjP1*_P z$-4=-&dCi&{vW#YYg=ZCLH27 zMKQ4AUOf<3_6F4~_Ko92V) z=*W<3A6tlBSwT^^ga~W_cAiyF@^gbg1oD}H&?DCK?_akyc2N9lAbg9L#=0Lterr=ezM9!e~muD&UVd^>@`99l^1nWEwt|a=h*-q5Icq}g72 zjkyF%qr~yjEH3G|U+z6F1F)d+#BwuBXdkGs6-I^vJvB z$NkwX4}!)G+KPPo`AHt#&!5cWTCzf$JVzHzW;7X=ZW7TsL92}fy=5*You8#@7k0z8t+fK7_4Lq^12gt5ZW zr~BIo>SGQkgsC$onO>!b9>^HlbIF2B!qENduHd=D1Q11TUnZ2hns*m|cm(p*1rZ5N zKFF}boyUwcYFm%R4s&P?${ry;en-{o+{>X*v3ZZ+#s%JceD;r*WC+za#Q4!aV5Ju1 z-gtnKO*_zNaVc=1@tJu2wx81@()7-ZK|lscJ=V@!1ss zT}k^;GN*V~W%5a^)_bW zTC-Q~+sV7O|NF?|%agpuVDM|Qx1I(`DQw^ z*=#VwolfP!|1E^Z#fWjIE5!4uQG)&_61I3Tmr-`>>cwt#pNz>!5{TvRr&zX_2cJm# zJy?MRy&|_kV(Pjbwb&ZxTd|hXG$AjY2o@Mh@P9Rr;S%ZF`2N1sr}$o5^>wsoYZAve zlKLcxqNJ1Z1hGq_zk6NHi#YcQk#_x-D~<=v^Hikj+o-b*jk*c3Haij))mqCjjl?}Q z>sB>uJy&m}XIl9{<3$$QNE-TtIIDNben)su1?~mOenMQAu`obE{ffpqNRV5w zCO+}gw#H=FqXt6+9%#zOd&+L#RP&aPFd^0aHRVvH+ttcenD>3Dx{IY|i60L|XF2JV zHpr#-iTPG*q*I%aU)*Tuqd$P8e(}%I{$aYv?mK*PW25^>5^tq?`epad{&*v~OfnVi zX(rD?ghkL`wG6RzvRlMy^v5s$h~S~9##^WNA{LSkqXOqkaIUAF#7`?FAbp6L18_f6g<`R+6fV|TnC%syyz{kiC&BVK(*S9jTW>*|M zs4&?6Ue?ug|NfI3a-O&+x8*#Eq?zQ7a?A8a*+$2UDO#qp=Ofrd@?yG2sQpIl79z-y z^AVwtMU`=vAv^OQ27!astH~pF=Fb^yvfXf|+kC#&{Hd#XRBO7NYXy z&H!7j`d8h*#y^K;H+QL?ZKUAykNCzvrhDbnoT;G@r{HMG1F3Ak_0&>1v~`rT2hBLk zIDV_RORPgQ$0~C;{7>=~{z=%l64ks=Hdu7Z_rzJR+Go0HC(h>Rsp?!Qf?+E859z$l zsnVtjM}e^y{nVS(g(Q!6y_H=OSeEi8r1jP$`#M#+I%v@SE>miZNqRbP4Rxq*^?`oB z0q2v+#w1w-noieAjZK!c$9-3F5ICKMhHFm0NuBkdhB+nXHLg3hc1cK1pXpoG_>5mD zd1`PFI$VyPqT6#XDo2=`7=p(F9UDIVR3Y`u)GC^NbE9~vkw0WUSM6RE3<96RWV&V* zyZRJAK6k9RmZhGkU>oHgdImlT=UT{N?nRxQdAE?3PchbYo{Ty*EPHB7$*W@Sn(Xl` zSJM!gdvr{0bWFWcT@JOfH@#M_j$seR)~6DSb#i+B1*@do5i&l#F(jvJR+*9MIwW*6 zC)H5RW?oLqVN?AB_!!nI!ue6ReklIYlb)t44joij4B>}V8|F!mWTmE3uT@0nxhE-j zS7IA9=Rc?)*{h2PR6>h%46}3$(K%k5!vi}FFE|Q@-yuCDYM>zkQ|NNt`Az9D1F5Md zlyyUttFA_O6I{2pqW`3sC}&I9oNXjlec-75&krB-h3`^uFE`ro8(YYQU8(Y%J$9aR z7g{RXt$T@+HWKBBtLzhP9_vox< zep;8zKHF1zbCiVQX`tX$bLwFox)+{kMfI}WNzSY6tn<7=Dj81eO*isJlvC0JE8fdE za!I~1+QR9Y!P%4^xO7t#L9>6r-7t<39|~-Lc=WY{s#x`^MY3*m+TwgV(|6c!v%8Pj zoyXlTXN+U^;pCl^e7`JL= zeNW%a!g4T#p|x)3S_%Xf=xV;XUk4}g=EodK#gIztr3Eh5+YBH%Tg7+C#H_yNuchEz z;#O+USHw}*Bzb;S2QFXzn18L$;w@v?A@=#eAjVw9%b+05(5r-nl1CjCK7n`|FIviY=Yy zjfvRWarfo?DAz1^LqHVXM>Baq+Xjwz7+JS@F101ZxGPd~b`;VOFyCR~Vrq3^Dm@-8K1*`tgNNgWy$DYFEqA@!RcH@5aMWmH^3kE2q_6zS_SG`|s$5P9RY6 zBbT|$(DN;mwc-KF2)syOGZOWbIFar_qO{q*@RAV%Cf_jip4s*4!ZvukO`ZOUT^ij za8J=%k>HPQiFEZCLrQS3i)FQFc;+=+(sxYpmtm{-JjOgMB<(t&->Zy$8>;Vp9Sem9 zGz2fdr>?i_h-fjx4ZPpqe8vA28;7>khnz~-)%MpLy|#MDFkia#d%EgZXFyZk26rB~ zc^&7Ni>{T%@!!nvVM%>2Yln^zYe@&ei%0SCxd=Ge7x3ws_>p@++ z7sfkb(DAacq;ae6j#tCYdI<{G6W-LDI2FdZ9>0d5{TkX|7CsbD_f)=Ex;-?wJuP7 zq=n>GW2vu|NzKJd2>(@MshMlDqfrfp+OfiQwz$>{e;8liyH^~AkX-DG%Iv#(viPQc zye|qzwOEia?htYLh)w_OpXx!6)N39?OZ&5Rne@1s^?Mk!)DZ>(mwxXsrMOwo1E~`} z?J|Q}*F?2Nj@A#QmFzv5ATGXmG(n;7PF_w|zN}cGes~}fddPV=zgUYYh0VQ(oPFBFhP-gj_McLOm6Mv+l;@_xN-Bi{aB)M z@9X5l9cGV7Z-DqZgK66HAGeBhDN)c56|u3MMrO&*KiUqH)bzrm9T;;~-Y1J#@TDxi zDfc@}@|;DJ3dtHo2Tn7W?J6R_hYa|zGJg6VTEqkief=miCxXZ+5B2r!b)m@N%+IXU z&6e?=Ps`|9`5fkV><;F( z-|*;`cDa41dh4t9mDn44_b5eXEOX#r{l&$!l7V)QqUTn~zj1Fo>vP@dMW&mI+Lt<; zrwiXD-u^eDiWlQ)?M_c`7;^A|#4?&aU}nPL-E~1oTh|*@o?(cFUZyh3t`Z)%b=r0J zv5H%tr$D*BWwQ^`YuHs~&|I41<0dL`L_1YBee*lSF-)i~ckw%9<3|hG>rSS~uS*ZY zJ?SU>PXAdlqqm`|lUGP3)in@ONDWyYN{hnlW)8@`vG$TVwP+AEjS$A-oqEc8Z#Fi+ z{vfj6@D+;+DzzE0f+X7bj{4I!VCQO08JL>b-^BNS27Tf_={feFqeS<|H&Gc@oC=v= z*>=gU9GAr#LlLCK=Z0n2Ru#c6JL%BD zIPl*Dy#@9qAmLE=B~>PFOITGF14Cir$>?I*#%*u|JZYOZ*uVq2QO@B`NuN z|DBbmq|BVxqrrv01NJRT408r0HlT$U&B;5f>fDoeD>;XTV1M@DB*fFh>A`kLFQNDyF+};6?d}UtcfbIe{m1VO<^T#$m+g@!eT^Ab$3bsUa5w@6Q|sJS@)~c>G2K>)K`nJqFYV+qJWs zHzw(&Aae9Y6BDe)-a$d9N~VON04-8pNY70^!w_~U!B5!XuF{5wf8*mK`hhM<%_DoZ ziYsutxXgagrB8L2<^&Z!252~VHK$LnI<;M(T@N7J{!Gu^)bcjU<-DTkax@kpqgnJEdS@|36KTzN9* zvo)7sEzvk<%%$ zM8p1qP6HzT%$!VV^O(8nVwc%h1nA=o8n_5O4)z5<1$~PpK@J`PQozr+Abn19LSlB#1RM|CA8jLHj_I6%CP^?_l zO2(~kzmfzkmWCT^2-r2#gYIhvZSr7b{wWy<2>s>Rr{(`h+Li3QYJ4mBOGgJQ&$YqS ztI?44r%x~b)BdGZp73s{Tq|jR;^B^Bt3b+(}NFK!HM{xCL zdq8KO+dtHaKF$QUy9e}fD&EH-t^h&Ar_O;nu3hzUxcEZ2x81vO`G(2Vs->Z9!@(K;-wB|P;&W_{FzjC=}DtlxzDGM zytm*PEH?FEuN@pyFZcF+_*(D1&o#Kt-KuFO60^(yshdr!lkfqz!q z@m8}ugS1%Q8{9~aOkVTV1Ci)Wl0Tyqb#d7reY^r;^h|H(!p0RXtN_o9N zC6RlEoL}DbTmGPXvcfdwYrQ|T-X&Si>0b8h)uLOJo`wrrfB9`R=;TW*5E)R3;6~|B z62bNUt`flwr@bVCdtl#8>t4KWC*AV8II(pRMH^14?g<#O1gCkxB6#V0RSQ4nEWUEN+`$Fe3SR(!P|O-u-UO&`3* zEKd%9I2e8O$?C-F<)W6tz>UE8OC2j~C%l{YJ!}UlKvq zQg>Ln=7&=Z>O!?>|-zk95P8z7H;% z?_B-jPc0i_iR+TEoZkNKyb+Rt5xl_`U^=pRQFdq0gSz>tZ@m_XZgPcG0bgwriD)Pig*6SYbEd6i4tcStt z;jYcstcFS9=h#Em>EB{2*2-P`$@OZf9~5ZI<=4+MIGFa&nef5Dlb_bhha>2`6RzZ0 z-oUX}b-WIhqo01gThsYu(AV+DyvLW0{N=+VGQ-78pBrUpC%vYeo!x6AN;|t9(oA=c z*84WysiYq0{*mdF7$M_+^w0WaKVN@uYa@IGGVYTb)5`k#?lt-IZa2S+7HiOX&FSCu zmnjX@%zbCBhfd;0y}d{CWru$K_3qYSmCIktXJX*RCiVA^7TKTP9ozh3RX#s`B>i%?F?k7Akd ziyJB=6{mal8dxQP0>u?^o9s38^O2!iilcO6SN|upvu49bkJRB7>|8mVR0k_drF6wd zN*%kUys1L1NAQm=?3B4h(#6X))O2Kz(WyR?!D@3y+f1pkng1NW_2XGgt)5)DXZ^{G zWnDD+MN*9=l$!KDKiuEoHu>HHEB67Pl`DzVk&U0J{B_bLPb0!9;9a_`Z@}+x=)(Tg z;Yw{|{q$t}nl(h}H}h6q=V^%zUmx&T>QLVdY^s;!pdyJ$$BSu}t#vO2G-^}6qb-Ub zBX2lnxFfgKXf=pOCdJRieER*u+1|lC+wMY~?%`^y_1o!B&(6p4QN4e@LwjxzMxr2@ z7hyG@{ePbzw|kveUPvJg_1c%Dx@bLL%l1(XLf+rNoREhao~ZJgD_?QP4Coq0O~2i@ z`n6!KfcecxCv|w`Du$d_fXA z7-2mc$Ptx~leslhO&^7>l`i;rTZr~#rPuuIdx^0Dt_ceY*#`4x*sU8)(N~g&*9`+E zN{Yx4s{^Y3QX$>g`+0T)6XlU({p&AhE!60B>7K~`6E2|^_MFLR1y~^tF{QO(LG*i03Diu_&9LQJdwh%9Bz3B5vRO;d-{<2$NYtur4s6*4w_ zvp@W4>tX1DHbds6kf`hcHNJ;RdtRafF9jV;=^gJ&`U0nP)J#u}N+qFPH*5yt1+G6E z^lgK>#WEUK`>J4!^RqSs8Pl$2b8cvhiAcGj^)H6u-><4KjT@fOy^2n>)~xo$&uzW0 za~9{#IKQ7;6T3_jv!6rB-1^~cc6`wdONwhN2ClLuL0=vLzVcM#ipwJh?d#Rsx* zwKr8(5c}H7>|pgD0qr&eMUP?0{Hb58w)!=xjIv7K2-C99W0~&w4{sS((O^B)#0^C2 zAaAIw*^~?q#%|jQH?dL&cUXi!pF)<9*GLFd)s@IQJ(|cyB0w1YsJzr&9$HHEK-adw z1Gh*v1IioI#;ukFNvZL|%jj5Z5z3(?&fVc=N_3cYE;VIwQsLsbsRw#f=1#n?1;3!; zoum2^cxcM&uFZgH7U#LXEoa1(M*6j{QhShq8T)k2S^ZXJhs}U&!`zRYKu=HYt7t;q z4bNcY(4gw9MfQj5xokIkzCcDJ!EV9%7&*7}ZJ?~&;_g3fe-G`RUMb&Zfzw$F0qm5AB2BB*1B#K#d^-6a3?(3P0VdV0%4>354e^oELdypl|I_qVu zvW%!bgJwzZ`I^)Y*TfCR8ES^URWw_DsdDJ(iNF~eT@mro7B_{Bi?D{oR2`4T)$CjU z${l_N->FY77fx?H&Y6lT8IWbCE>j&T_fY6fg>}vzY;>GqZE(pecAU%`4&A^uSjQ$Z zyLdTQhH9#7Ti;rDjjLYL+E*-3};D^^;Q}7^uzA+m!5AL%B#&c}Yk~kZS zw;2d5U7c6c@K)dy8ij=C;6A&j*{h|ow`E^@e-!v7xUm9iljC@b1%nmsc`n5ZG8%NN zi+)6^v6-*CZJ)B8lXOE59d&*j8O*5x0*giLG z<8ajG=(S823c1iQJZUEXvirk!tG@Qoq(bC&tukyLG4_sro~E8{2$Dc0Mv-o*|JaD- z%&L8w<29&};r0ML%Uq2z_$^auPxvPGvM@WY}W) zG8)C7frO~v+Up;rsv8s^xzJQ!ko100f!=F%hh1mS&rMqh-JOS5OSR7qJ^9#fzy!r3 zJm!02D%astBQ1rpM@VxPq|nlrv~s~hZACm~5}(|`9I>G%SjjcQp5rAFkdK$ydJy<|76d^Fy(qxvo$=V^P&p+ZbWb ze{p7v)XACy_90MKWKmiz)9`U7yH%Tye1{8EB^oyDTd$dhwhtUV;loA8aW`VaLJ-{f z)!}8$6L094Gs4@MUM335Ar0^)@<+`?FvBT0yAq>FD-tlub-++Leay7!_y^4E;)Z$_U*Lln^Gtk7{8k|GvP*}c7h}I(?zpyq}RXB zoZG1xqou!k_&J~n$uRMnQSz5}%QBt#q)wltp6uO8?X8)~=83aenaDt1p-HhvZzcw&r1dy=ie)U?W9z3!ZvqteVL#i*gGa$tb;H^#Yz9XNB3NaJ*Y-2T#<}yH_ z7{^YrfBCRw74tSQc`#4QvY+z+t|6FjgNpVnRUH=_<+KfqhkH4I(Xfe<;CeNsvUoqp z?_omd5CP;u?e=IR;Zk3G_5EvZqHd&|MzstrllkK{7_C#loid)XKg$Z5ru(-sRx_AJ z3Z^9l0rOb?$oqP~!!k#)?3mvusk>OVQ(QWK&ZbS*88D6?*%+It3EpH*F}Uc=e6%o0 z$tnsVkBXWae95p`p?smbk;Ia|S-j&GiG|*UF{7fEJD&!QhGm zHQSQFUt+Xt+cNBA?*O1$lTIFyf3wz|j^pYH*X-(UFU=THOk-RKGCTzVI#E?i(`{irmntv<2Ear%J z;JCaCnwDIYE-S}h6Iz+0t6LeM3h`4l)9sPnjxM?EK3R4R!c#0i?iui`O)+-D2FCYS zlo;nge!d{~-CnxRxVYIekpU~yrg$xX_{Y3b?wk<%PEb885{pGDzwaknN_+Dc(wUz-J z)-Ka{c@h3Zf?i~fXkVX<7xdsg#V)h2*tLtT=>tfP4D-52F*pW>>^^}@wBk^FHcZWKff!vbW5*udJStQj(f-9Vj5cx($=_p z(ao%uX7hq(^TW`yM(bUaDMRZ_$|lODRXJnK-b>rK!tQ$}i3P$bVy}+5bta^5D)W+e zB;IZ+?@MPLDihg_!cJ@YnE@)?S^sp(cs}|jYs@&t_|lRDa_M0t)MR?#cAA-aDU)(UPdIdZL8!it-P8#e?xp?0?#uKFXAiH_JlB06 zzwLw|ek%MXmv9`B_jf_M?0r&Fvt>r2eKtxlaLK=9-M8pg{(X`m>P~?A($*Ir++>_u zsG=^E3YiweCCU)(A=xUD04dx-!Ohdm+$}7-iHS;=ZOxIuyE|8ta z%fnv@eO@*=J&i}!e0RfS4 zC+b%@FI^eB$3h8KD4^Kt#698p>&Sy+mYouDbh-Iim$0qWKq8L38ehi6pesO`xm~hMqLH z8{h%lbABH~oy3z_KLoY=*4+)da%DBF4J~d-K^a!K^s+?CBcS2bD%Z|vr*7t{w_V z12AufDU-sKVT8CBSBGt1V6|DvCcUqJ`WDtBr(vB`+fu#n#7LLyOa7y~Jr8?d#3=FQv*Xf$4Dzs#Hw?79LxmM@Xo;nP4P2^Dg zYzPqb&u`7rr)>sczTs6dDtURXL@0{)liRMj2H4mDC=ARrzO7=Ul5nZ`ZpS$mV1f!> zI`u2GdYb|MDzki!8MMp{XE0At6-O6cArIZ%UVq$IQ#e^kO|@6k1;Iz-GI?FhRYozZ zQ(nk#B3p}Ra|il_ymultf*!pztwy`bnWZZED+jUxHhIni=C{^X1>E7+Mj8! zCe$VEd`%2YYw<{4ZfXt$`x1b(Td|H72CBt=thKnAOI(hO=zwWiQ{6;$e8U>GE2xml zfXnJX2w_WqhAjQzzr-0BS>MZ+?wi`eWs*F=9|I)*OOCRI`sNgn^-;5+x?stmQf1Ig#pJ}hGr`KR`(%J231 zZHADVI=I;|oiRPxH8NQ~CwyJSB*L%mE%jB>jFKOl1ZRM+Xyh3ua~%-N5F14(mH~E) zN8~j4S1O<(hs$D#zIn+WD3-CHu@gO6s2_!tt7TC-53`_IAW` zqf8)WjWXx>hhc|=&NRE{0q;0>Ea^+*TkJXzMJdYy3t@YKMGPv>Bis~GjKzEpj2{|_NvK8ER6V#Cd0{3?f~<`jKvg;#7O@HV!uRYr$ zJC9@-xAcrL@0Ab6V$nw~ii{$+uQmg!0kZ&B);lk&dmU4;eEoG~{ZsN=40*jpwN~Uq z3i%TpH#8gr>5n1Z5{fg4f7pu8^6VY*3?J8rZww2%+lz9e{?`NWswxRrturClRTcAn zSQkQARyCjkph($ngi9PiTzef}Rl_?!+wts~;-YPcJ>_0du1_d&tu{Qp9vH7iCk@{n zJo{^|V40LF;Dqazxmzx=)JG@@m}iKqI6e^HM?!v z*2?#l7yfBWY~2_Xs&;V8HQdm{MSt1`wTerRVdJB-LP5RZd}FOIVPARH6||XXPg%OS zct*ZL>4||d-yDFh+_rTR;4_(<*k0)?jkT7QV72$G62Q{7Gh}Yv$puUhFwU;4Ad=?( z#Op&nqp>6i4;W?&urwwNh?dBZmaCYvs- z6gD75u*rXcRz{%aXmJ28{BKi#AbM?US7VJ)5s=8Gmen$~M}f%W%n}|JsFnV8Rmi*p zI5txa3YcUJCfPi*u5w3|dVm@{u)DY+T027hhe`vcLEIGMSAxMNwbqoX#tn!+(cdmg4@np2;g0TTvUSBm*PgPxST=F{T zYJl+=fZi@r+Vu!Wu|sIJhXIts@%3!taFghNEY3UxkHS<|-kOt3rN> zZ}*`Jt@yD#COK<}_(PXa2vAClvoQO>M3^37e7Q2NXC45EWYEHe6xSLT{y$%S2%aAT zIE}ayy5vUvV4N(Lkzh~13QA4vsb21s=d(2O9jSMCitBfWSF+Z-d5sLhrOB8#a?#QkC1Y=ZC*Ahz|>fCvlCGDn2pD!TYgkysTL z7VjIj`+2kO_7p6TD;96f%~*y6udkDF4w_N(7KoJ-fJm>Pl57S5y2FM=T`~_sTCosh zp35SaIJ$P2-@P=0wu-@-$7IkC_bitIr7BV8_@Fe{iHkx6HJpTC_jqOPhp4H>iv2C*v3O9MAt$o4 z6XEi^%A)pgQbZ{%k;R$4^aK@R-x0)B6jyO=a*)=nYh>e8p#!v;1wY%8A8uK8b;hIe zy;?9bcFR+#91hgCR}w8|t#-L9jQx^9UMA!rujIkw?|2pW)O7r1;1qD(7WYqo%}E%0 z)XdY#c0P|P0q5jIV>K6OV{;yJ_+@%Mx%jaqHE$MTNE_>`N@0gv@*Tzob^8&xn((q3 zUhKn;y6s9XpZ#f4p+sLo_-aoFo+_-D!mpZm&Gr#m{8_#BEYD|YE|Jykr3#oDMM{dP zSNHg@gi*SQOZ7qrc`jX&_{W!X5%HTB9L0{Fs}ld@X?Hbutw7J;^^2Z4JimB~GETYs z%K6AFmWQj<>g-&+$1glcKYJ@_ER2}i#+|QZ97qL;KAGep7xlf1iy|;C=L&6{mdtLI z#4y9WkffLeOF@&*ZpcGJ@Le%P0-+aQkc{s!)i}mT`-2Lz==pcGR{AEi!0z8*glMb4 zwf~tI(x~x1BbS%<$Cy1*sR{#HkG=ItvinyrM3cFe!O8Qt-7KA*X$_N$ZCxLhWc!5L zdX&lQTSXOuN=K;= zry{$}0RMV4nrs-LM1CJ^_V$iuUlm)GcBMz*PF++2;r~u01cT2jl*re{(S*WR+SW?a zS*kRA<4ToX>&sV?Y}*iFcTfn;mT0P7TchT9Ylzvm2uI~ny}I{elyJhW+cTK zQKR9lSEh>^*l{cSzOXZ=rE8X+%h_F=8arvpVP zwM^QFWWziYjfFzxTB)WmxyzvK^5lq3u2a9sIF*Lx(iO%KT6@`Gv~J?2Sktj6YaC-f zD;e*tNFMbwOSq}oS3TD;hf|`ECB_Z~A^omBuxp#J;8u6UJxp^s7cOEkhPZZ<6-~Ve z*Ht8Qe3ke}6R*y3#1VM^MtG^Jio6^)Plx9C;Y_{+S$zmy(XI!{x`N0n4l^j^cG)wc zaV>SN53%%6+n@U2p#c{}LlM`_gRzcn*;o_ftEFPU_}d~hiloEyUb{Y5lD1YTiqvV% z?U=qIR+cNvF=ow&q@mr#Xo31PQv1vPV`^JNW|Wr<*Z&@u(#ocBpFLu}K4DH~nvHB`8P1@&nEItsYnTkWG z$}7G{T4Tr(Y;(h0c8N4^(IFD8K#m(kuPi7chK#v;(681#g9SBywwwRVEI7#_e9gFB zVW6-*=@kjgOhtDW{jvhW{`RCRwJDC)w6U#arrJwDBem2|pT+wdYy28Qq(^~nqom01 zZi`bg^l5=!piaYuUdg>!EFHdwg!D|=cvxQ}N4Kx#KGGtO{FCad`04E8dtpekjPK;S zd<~O(Z`bA|LdjrWxLU=1G~E)1PjYEfnfUVo{*C$k;G zy*}6#gznCD`6%u0coR5epAlXyOpW@GegH%WApy%8>(26t)L^#I%2 z{FX3lnjDTwfQ2HUH173gA*yT?NK9zo7Vhhqg6JjEjCk7V zf2wt*G=f|G*WR3N`(8d=(sGE|*N>G!4TUXs9b)d^3uj4a#Oof;J6(Hk!tgY5o00gy zA!d~*U(J99vqlH)j@TEj=RuHbaekHvZh(gi7{T=YYL>AEC&il}b{tKBES2wocz#mt z78s)|sHn-9q|*g&8HrTcz1W-9T#2beOv)djSS8z0s48UIf;(L!9PRWzC0p8+rn(wY zX{rLGHGY4VD&(OhLI%!737X$x67AKD>c$Q+VUm2lgvKwG@Ur#Ek-44tTnUXaS=Wlal<2?B&{4*>SzA_07?_`L z=jpc6krpc*BJL9-?NlN_ht^UBh@KT%P^;=Si*C*d z63M7yBq0lu_+IjyoZd(1M29i#d2sWQFo3`;Iml^CaI2ZvznhnFiRgR@x{fEI+J#%y zaTsOtg%FiG> z?`qhs&fT!!&K5UW-EFEqw9BirP+>+SV@=J!fne7b_pr&-c$b&bUZROIV%(TpLuk@{ z+$t~X?g2@ZNll0DD9hcAb=(8VvcW%*)QBHCo-!P3WKBKP_xu*a>uXE>(f@U)DT=aNqKRGF|e-1IO4xjWep&goEGYGj>9u4$n(V{8=~>qKjRd0n5})(08|5hCuW#HPe%xu(3GhP%+^Q!OAvU_WuZp;XC{@m(u?;dmo#H%&}WKGeqo9Ud>Z4-)o zB&TroXWuw24a8gh%~v3~ppjS1LeCdVgy@7dvio8lrsB^Vfjb#>^#@aVADP0iHi_*hM^XeYc2cuGU?s%>Wu}oanrJaF$8EceM&3w*i_PHTuX73}p z7ii5^eTm2dQA!)*k>moCX>rDdEX;qgu+y4M*hQyPMjHBzl{RL(>k-a5g6J&sk)%8< zh#>UQa&-ea6O)v>tm~2M&0q%o!S8W?mWCcvtzG`1TKg_0ydxPob98nbWUX1~hdSP- zCfO(~{M|jv3p<0lk_;tjX>2wAy}BBuj0Rbg@z5bKi<7Fe9gzhBx!EdG=y zN(u@353>AO$_|=ERLNga>|c3tYg|{B*Lg+^zGX`lbtYbODfHq5H3>c<%i;gc1PMzy zLU*#e9gKmLG$Dovk(z)d@Z#30xtE$+=BQ^Ed;DyHH1X=pTUajnmo>&#${?dA>zGOz zYis){IY;PwULdserSf{a&e&%^po;T6dGZso3A}EOFehRGLQG^L8bl`^Cmi4-_w$il z$#qlS9yC}>QM7D^?3Xs($AH4zMk0e&GVJm%OkVA4+9EY=tT7oA(iA!7g`H^*$Se0; za=;ua2^adgCyd>9^Q9MewN(qeQK`QrW3xOpnSF^a5j!c?B3_-6#3xDwsxrY|QM?-S z9}xHhC#HTOvvpx$b-Ln`sGiifp}3?CUvWP2+J+UkbJ9?DZgL6ja!%gsNc+01FcOHI zhlVCb8br}qed3e<-gvby>Awb^_vS84%4N|*@5tA;^7XUriPE6F*fNI`=R2fay$@CJ zC<|AUXW#V$DdZrBe=vSX5QMiLy<)~;SwO$fA+qvV&pfOvAQl{J3#jKLg5DL5834wk zVOgrPpCX%<&}_9lI%5ow++k{)~dyMEqwh=I3xM z=_f4d{p52I;g_D+wNbLCHwfu`lo@^Q;c}djMlf=|*EEY!2mSACqo&vHCi8RprH5y#we*LjDDA7zOfSaCi~@e34XRDFu*?+Qu6IL2x))hcg3vydtI}| zB2sn1Sa^ut`-|0V9-$~*C6o5Y+-gh|bQ4mGtdb6oDZo=j*V`~~Z>5zye_I&+sa@Om6O$z^H7kdK`~cxT8vza`;&Y8O;vzk3-OHtU_;-;yX%65$ zSn1Gxo0fewPYo{|D_JmKsaP>5IEBxQObZz$UuUn?1C;Q+kx!I!Gp8nV4~w!7o420Z z0jS>sBlobdld%a-noNsC7;Nu&^AI}fk{Ha~-*z+sVx-Ab(2^5aG66BD_sxA!2*@md z^Y9}uAWn)}wlr^&rl01Jzxs}EjZNDim}z&85bSGb1#K8j@~tW84z&lh?l)qpY^7GHdzOAG8+hbd;P zU3rN8V3vgJKI;^f|E8!=Nt*s`5WVT%KcbMU$(~d;FXDC`Cuj7dflkHi6oHyT?`Bew zazY@)@X@jWV5t>CwK|N_z~!X0;BmL3;0MWGQBS7(gKU46WYVDtLatk|YGI&nCD^>s zhx7#42n!>>vn$XGVdm-A@G_e<3)(iW?8nr6p1I&57lPy--6m8WQS%RlqQTRpsiy3b zh(2azVEr8A+Lt7EF~~IsP*_R-_Lc?Rt*U#terxuyYTP8v1%#BxTh?4t@iv~{>>kKZ zw4=M>e`GvQ;oVU|Det;E_a(k*1G$6Wx|81;&MCGl2n@eRl??;Dy)9VE>%$+!D<^0! z^PUIKA$9J#92K@J)3xm}UTZRy*hLRd7ZQVzaNg`d(-yZ0S=KtMKhF#~+I+%Uci))@$tJ&zE^2xq*33rsZP<(Vo$;$`nj+Vu2Q<(WZ=Lg4-1 zh66iXzM&CjULP9D*zz?qopcpE?Knw;GV49WF*R~tyl{Xb#0d$QEyPTd$#aBxs$h(^ z`aBP(J3TR@tC&C@0{{tEDT`!uJxOz5XRDN{GfL7#VZjhH(k)G9Y#PbKjKmBlT1v1D zAVN(IXavb4o#de^uu7ziT6&E~qRNU{m1d;C@N}m|OVxJs?u^K=p$@PprOQrPc-@PF z^hFVC*#hM!pjEC%yM-DHL`H7DD0>rPN3B^yep(nYI|I{fdG;_ZGTuaE-q}b4Rc8WX zcqJYjDKgP0p#m6^Qi(Ly2ny%FEgDvoUef`~Gtfdm$X3um$8fm80Q!5j2ud(fdh6Z` zLRekFV(i)$6>87dro_lY6=D@X2{8=*w~2-_faqT;v$2eh^<-1BDRJUH8)!9tfgJJK zTOpajwHpgLk6s8X_lwehRh5$2ZgnIg$F*(4Pbq%Z^RN&$K$X>TQDemHceD`Vu-AiZ zM>A^?9thrxK(pG}>W(A1zB4p=Oil93TrgrEmEp|VsP82Jb&nBtj0ox4GrV0}eunU3 z3nSjO_IM%vvR9MGKsom<#n-r_t>~!wPtyL@n@sFhp>~@InbaWV#kTkl+?75mWfiN{<#2x)$0GIw$5Z!7J8;cdY&N!|G)ts=9?o6+I)l{(pM}@}zP1ng7|2qn=Q}XTre5&zm9|@& zeIqYDFMZRbzpMo%>V81}9FS{DWs;!~Mf!GOA!73%t{;Nc%k8LxnbNK5{HIfeQ%=II zxc9HljrShke1tfQ0_Qn?FX96|V*Tve?Aol5Ma#Z9zPJ2sE$nM~^toU}$&D5GG1UGV zZVe+gO7<1~R<)clVEIY>qcZevPlPGlvljl28~?DD%NemNh{LyR=!h+v89*kSSMGcl zVikS)GUC$5y$joAy1fR_QF~v_T=W*g9}(22h_1bWfl62VDgkACz{RNbiY8Mo%NG+B2A*cWx8x&qwYAsOG)=Ozdr7_Jhy|o%W6h<}&U9rA`aFn2o^r zf}M5nGorBkTha#OmYD)#Ak(;jSkZownEW)WitxY%wZxQ@UsSk+`fAGi__r!}Gy&1B z&9icN;NrZ0!YU^xefYrQ(@R8Xrhpa}Ldy=`ywk1=b&V={e6>RKu9F6=cd))q7Yh9B zFB2Sw>g6HgwEXvu+O-{lggf4&cxyuw@({*HSUmtmoKJ>Pp!+$yE}#~pnUV7kDCMxp z@|Kn@`)n10bod5g28GbyZ0IP~dEj*FaJPC@KW}4HDj13CH=&6q*m<;AabayN1tK#u zc|!(VCXLhMFt+0A9%u5%feP!B`}K$jQAC~Osir%OaS;_%Wso8vqsgSVM%6iD_(o=d z887Cz26)^ee6u7xZ-hV&0!P2P23fcttb>Z$72uP~6Q7gPCJYgJ`X-!ngButj^>%W$QTpY?`$ljkVJxf4n4cq^COeRET^^4)%mJxt@vJk=k=1 zwC{0qzFGWYNotYEP}CnyYjC;L&s0|Shrbk;xQ}yErYhNogY{G1%2fr!7{7YBOHDt` zN_TKmDNpq_nHzng&=umR6ywOM6{LLpB={=IHIf3oP+dO$Wp~T9pKa?oMTo}WJ5?<< zMvm?yMw3UqkPoF|K31kA7wB39qF*u`iMc689%`A5F;ApoeYF&?@n~UR{k!|zemZM~ z82L);OV-Q)CUWKzcuYqE+Ak*$H}b91M`cQ0RNT@_O}Ri5>rVFk>5ikkN%|7w0A(t4 zLZtvV?UQI5=`rLJh+o+&RI-*Bo5i zOi_NEJhi;L-{n-ow8~KGv=*1J<*%RRVsgu!HtiiD& z(%oOr&!rSXbwB&7y9v&Q3+iCm5;uw)cmxu^{d>f<{XI@Kvol?AoZT_d`b~*o{^qoMWp#i8SsZ&4-Bn^k-Akmgpt-vku~ncLw9&j zb3BRN-R}nP#)qShk-`7Va29|4_gahbi&3wL6)UtyUl4p%5P?Y+?JGx8kOcW5@c z?m42R`w4$+zrot@F{4-B5P>|&FyuLEAQMqex=*hSycgP6ZpMxHL!5Ye!1wKT$(Lcj z#_oI71vXDupfd06rh5eU|FiAedds(hDgmmwMck^2D;rY9J&)mS{!zu1Q*lSU9FWT| zzJtn2H_s1_gnHk_AAYg?m4*7;9aEIHc;YxaGdO+G+6WnixP^K)z`bbUE9ii;I`?-W zzMmkTCJCZNe2Gg37pe!5QGwBC`jGDx_iI%K*jjk@JdVn!P@lC02lECc&*?gy={pVn zIa{sjU$7cQA3x`$*|%UWS>tL`W>-)bsrbZ8W%O}a?JH^js(+IU4g^b{E3+=^h2mlK%8#n#0yxLyaGs8z!;3#(ORrxS z)jsd%;1&HupKElu%<^2(h+;&)iRLUeH~HV$QpF6_vwmOBBK6PV-Hi`-C3qUl?CDD` zV3#R9p&Zy%Z(gJ>Zmj}!+IL*jU$gH~f#e>;Cng&8wXf*+Kd_WC^cRe#UUw_foqHam zp5Ne=lUodf#3}oad4$WAnURr!>1?WU*^fz}@Snhkl(ppjZ6V}vs9_rXfKdS>#Rn1F zJ##5Hxy^Z32lY(pOj9TKPg0mmH=_Ln^y>)(=N0FzsGZVM3w6a8QYorYfev1g z}jfD zNL)4P<3LS#lk7qmEqM?9Nq&N=-%B)M7DY$|PZI4`;3UeWG1 zT-a2o647U}qeVKe%K9Gs!*~*Zl$NBuTMlO;&hL{O_luM#HUKs8bQ@hSOkQ>57%_^) z9m=trT2w5m3&OGVvsvd^=aAOvq9*^d5WrR4MHP8{p}`1?rZDgkr6j15`yKPEH>s8V znax74oQ+iFJ7v$k@qB59!5k8Rn zMqA{P=jfh4W7SAHvB!SOcuqo+>R@MKJ1#Na<`sn%>Uj7IqIYP|-pS64dObZEyj^?! z?^DbVciRTFW`9nfgM2(!E4r|2{6gdom+Ypu*~1m9dt!|icEu0w@*Ibh`&DbqB(o17 zv~Khcb|=DjxvoUaB)2VQCrub5T$;kOlSUMT+Uq|!L=D5 zLBQCSpG&Z{Tlm`B(A+I-vW4@))NU3v8*?$^*;aPl;=7tx13C>)VENl_K24ZWx$7 zO!&Gf6UV$a_U(H98*f^S`bnDcbt(Bb(cz92KRNf}RtHDVoEa*bVfioIOY+-|V+Haa zlM@_U8w(pL$=)=BU!dX!hHyVlW3f)Ofn*h4vm%fQGJx^7q4Lc0jl-aUH>4WLC6y`h z=YMfdcp*!m+m%cmY1-LGc6|!GF&B9w$>_JT8~Tw+^Q!8C_t0b6PZ6$*J=$KO2`0sl zjiYv#>>K<>dF=#2d}&W`{0;f(KFa=tJ3XF~FR0JAxBkxXM$HsnpLmsA)pSEIKV&E2 zi;MSy$fxey_?-kX_x`YL)oue($~`aoBeub$0%G^hIL@Rt-|e6gQRFu}hF^XtySV#P zgA=RyT|R!*uQfI*xm2>@gwtH_z1#i*36qi>e8ptTMC6~6d*}7%)rSik*+z}cCmWaX zGj%?0`}DUsb9leHiY@%)*O(OBt=yoMiS%36+MAsIlx;4xfr`>QsvIjf%x|idxM3!P zT&~VZ=dz3a?Ow$t2Uy)N&c9k}ALiQd@%O)(xz9@NE7YE3QM-ezM!7Yxxs2wY*iw6? z=Y?JC2RbCYrXzVKhutxg8s~2R-UHh@>V`2XS?rDd`;(Mhq+0I_;HRea&FUW^)x|G1 z{#cXM+_eae-8HuUVgnsduE9(ix;fpAiK(mDo6uO+JvKEMyUR&*@VwXaYje`Hb6$Zw z{zib+o5*9|EcBD}`_m+BC4YXW zpLDV=;;kP+61OVGD0?Or@rM{qCqpyK664xOGEU7+A3KNmVZjwAuMu-o?}*-+V>U1|HsmGfWy^%eQk-=*+ulu>O!<=i$xGtiQbb} z3qeBkk`--*kfJ46y(CKXzS<^|h$Tdi7BzZb{k#6p_dL6|%*>rR=giDG=XdVhd+kOe zmJeh*51ZOZRI?(;6{|9a@xC4>{xd?x>OC>o6-#weuk_?OwXBHPo>N|>3u?O2WB#UB z#ks`l$8!N@gZPwTd{l1h?$OiJn{!q|CAq}Of1jM*T$KeXvzZM9`s(bb#9+boZ)d$> zPHpnbgVDdzvdP-rnTfNH|I7I;=d+)>vAh2f;@WD z)M3VWpy%s*#|!G6c7TGN{&3g5(;Qwx4vHYcSrzz@Et17powTh~x+M2`8eXx@9%#F1 z;2lu!7!sgmF6@cUj=U0c)%&ioSJ&sw33jgl@-Rt_2S&;N8Ze{+u1-0{%{eH z##7T~vWPzivV+eelDN7e_6F~C-tIW~Cfm8Kc0ui%>v_7oo$MTp2`4x1YK@zlW{C`J z+V}ekT-ZLL^>`->FX0fRvu_}Um^y($BC4?HO zld8xvUUNa&%fdqDl@44uAcX^{c&7Hh?uj|e-TjT%c)%uQ;P{q)=O$-I1OzC){Ss&g zvvl2GnW=QhB49u}Ih091k3+u#^nTJE#%s*tfX(_DaGGQtq^9&gnh>Cz#_Kj8i~|fl z8k9M^IX9`j_;>Ss!%dp-($tqb9AGa)FzC2<9e15M@jK&!n($QFVLf32Pc-at%~Smz zAfgPUn5#NzxDGJn)K>Uw`pZMFmzLt4`x7f2??`qAu`9a5A^I zs1+bRygFb^cwV(-y@9K%zV9eio$@PgU4?kr+mMia2T*BAKH2jhU;KADBJ6P%T(iW~ zuF$3>;l5!Q>lFML2h|#S!7K;McaAUD(dkWuS7k?`O?B$)oR9p3b)%eZOe--SqnJu(c=T?MZVT z&9~KU$}@vzHM%W2>$Rl2*w%2awy|*BnM#J42kt^eIX3%(T8F}3rZ;Wp**>(#>u#$; zDtF0Q?bv}F>oifT>)q(#w1*9HgPT~f*crwg;2i`d&mULYt;>sC7WVkwEzuc8+I2te zdh~n8HVBi_RByKe{2ZqZceM4+%%s*5tV-Wo6R@ z@yH86*ta&UYwMkd1u<3iG}6K&S?x3+DQm0RCg)+U@6sk-O)on-EEEPK7B?O%)-5$w z<$($4hAIh>9r(}FSgn=!Zjn93OCufRc#pwMWWMTK>v`YR@re#OG&yGy>JBWdL6IY4 z^efgKHa7#yRi&lqxEIc>#4(<^GqG4bfB%QtM~+pM4|qw6Q{`RjWn{I~lH(M|oW&xQW!RNHWVe-mkZCQA?BGNzmi?zdfKI*Lgx0rk_6Yv%kAw@BG8;a=Q zI~S)bLydQ@YG26@t%OT%d^lQqvGQ^%=A0vF*3j`@F6sVbY*{<#ovu(9Eu}(C`9)6@e z=O!m8Y^C5cU`r=qN`&6O;dB46UoSd0A=ffv;U+g^eZu^_C#6=3G4?|*3ANIaHET^Y zFYAzd@1a^XSw%;XQ!g#bskh^qQ*XDikY8`-Y|A@xosCWk9XU2Xo10F(N$L;g@l88! z{--x-)HBQC3gVBps%CekoUuHY`?-74-vkg0-6|+2w-|-aT)R z9%O{I-pG)WY|8EFAK%0~FK{eO_2#%p5HTf2o!H<`o@RXe!X%C0AcVXp$gi`JJl#S# zaRg^^_6b+c+ODgU%Nkk{^^4b&I5E5UjJ~C#%;2M)-sbiCoExX|6SnL@{d}VD=b-e9 zyT{=v#%&7DiQz1~xQ=M0GN+s`H)woV7d^m!pf=h)QyfPSjh`%04@Z!i_RS~!u?vag zH>0dy=+4*frAM8F`<_rZv%XQg<4n)GIMq*1PZG<3ohZ=g6xdH7O zF&E4`zOg0h-@ubOz4Sc_Z<(QI)qY$YNluU-ozm`c( zprIipj&2%j$S`h;_u1##mELA3-=Tl7pJIiEk*oH?L*gS3=#N(gpXlffobnFgskEPw zD)H--q;_{dB?p~IVx^p~;E=__q@aSSXU8j+zruS1oAu!H4w?>Ig4461Ng7Hwz6)gu zN}6&vBYH1b%69)~c1SW-%nB?_CJG!rmd2y3V7>R-^&EC27uO}VNmD{k`Hl||Eeu=R zQ#@C!;00N`!h3(&TmorQl?x61Qd+L;890y%`G@yg zus(t#Q)D%>P_(~Pg1{#&3GPIu?y7eSH)wy|3`;Q`fZzH^arYBfubHaek2O_EDRx>Q)}3g9ldJcRiryJP=B)RXNk(4u z#SNPASBeEmgw`|O2eNuGK`rsmt3neTvXdV2D42enN#E&{U+D5FJa*?^EKL1!8IG!! z(px{>>Wd9xUMy7bQ`kzfA}{=b%A^|C<9xPF2#7zU%jYru`qJp}Vvf$2-DmcT*7Ri` zlT@f&)>EjvB)g+$`!afU_Necqp50h;8`m3nz;DmM{w>(6Fxv}n!%hThezm}ZNA(%- zTuPe$om#(WDf|o6ILcnOyBTBUQ>fgS+A?{0p`WTAkLpY0S1ab9T#c9Kd&4)y6wKcn za;BLB+Lhr<@JjhKE8lyIb;00fDou8t14&FgDR|98>|t}iA?!-U;-hY#fogZh2>*tG zD&JGnS1Er&Ui?>TK#&SxC~IX8X6DN(P5dwUBjXk;Fs0bL`0#JD67MdeMdC*U`2rI3>?IdpasWJ}qjgmb?8svJ7A<)` z+dxpL>FU0RE;!AB_&!;4o`^rnF93FV>gmsFQe`}Fnm62xNlwO>46WD=@eUnu>h8S9h?eL%pp-?W0Pz#OPX19~Wq$#71O>{e{1PLwf&8 zys#~!@3934=4;amq{8qxXmM$RUibO@#}})>bkY+4^*vQEvw+R}%COGPUVbtm`YPV| zhY??dXkjV75{$tG@@-KvEfrdhnIJ)q+3waGuMo|1T8PnKLLuQQGP(wygmgeKw`R8PBd0Amx`P>Vg zH(^^?;2!rnua3X{;*?=Ht+cJIsE*3LaFW5Y-=>Cb=F+pSG89|!MiN^6qZ^8(9Z8Oh zt{Eq{HEw68E=;89v_bxw7-rKpImKp0rLem#excWLehHyVW!_1M^COPG?JX;HzkgV| zAxQo^gY-*@oa`r2?J~UuR@?Q~6i$!7z9;JEHGlfkMQOofvVhR+S!peC{PaJoTH9oT z{Kx+&qWrqOD%|>nJLpb&8;b}lu`WMfa_l5*yE>H9|JU>qGD{F}YS=o35dY=OB9?x0 z>r$z||2wg8z?Lv&Ml=UuB9||xSPh|a@0KxBJRutpO(FNy2)>{-fcm8OEL?ua+triS z*YF5V8|Jg@0Zx6NolBEZ!AaeJ>NVFgHP9(-YWM272aH_JFB?xxjo8E!_g4LTN>t*l zvl^d{#uI;XlvwsSe;QAk`+G}0?pp({v+-LZM-bOyp=%PK)2~`qRvmP05o@(Vvl@$Z z{#yTYb`mBDoQ4(i@l)d6#Ax>*uf@WAwO3JhwQuvQu^?mJVdQUlKPdU0+0BjG0W7aa zaP4>(KXdCekr=i`3{NAuTjHEhOEQeo)kCcM|M(HtOo;g)E+EM>t;Pat{K|~x#PzAIWf$mdxnL2 zZX3yZb2O34sed@g127qFUMxJy>Yq5qxE9F!&Hl95;p)+KXDrOl{lWm;U7@9fboTxM5+an^yVKwcxbYmUr&J$7S6^EO#@hzv^W9oRK?c0gBo(Fx6quC%{ zsV`xnZ3;Y+>tUD`E`CSTX>In7!ngP%Q?>fp$J4#1A3TG}f5kckg3pNtGWTSoYBRU( zhTV+YERC?-QNu?!`|!`G6@E4m4IDri6dkpms(<~au>S)fYLgYX;I<6WKn{&Ekr90R zU2P&oXM*)z(A=j9PVzZ|*DX@tj?uUa4!5S?QEC5iKf8^&H~hE1#)!xbk2WMKaRtGm z-qgP2>`a(vB=Q~IsUlKTQ=uXnkhUi|t)KBdAXYrCeSTg}cg3E1WgR-+L;PXwoNOR` zsU-d!pEYB=FkKRJGo@z<=*Kkv&P&20j=8qj?BpHWb2(b4uVIn2$e4gCJTdym)`Vhj zFwTwXMAwO0e$w~xms&37GbMNuzi{{>T*-)kD&gzZlc6@lB z-DZtY6#khJ=|T7Tew2<@W0lXvKGlPN(d3E`&A981pW-r3d4{ZZ>Pwk2_CK6D5mBfg zb`ddhm~l^Qbjlufk;=U_4BsIE{W!kAe|Zv0bBD{Mlq;f*h~!Ubapw8TtefJVe9BJy zZPL%`W5YLz1i+saTsgnvX%6gbooEyTa|N-T&5a9^^7amu^q)9xo)Py5EXIUn>KSuaGY`5id`f_8;Phrky<4yzt zfA}c3qnk+Gc^lYXxitiH&9%AamUv?lL*zpyiA^`oF*lH-XB~O`hj3D6IkiHh_Jr1F4)6RWl-#PXE*Fes+rC? zxzY3+d$M0hA?*pmyoSV@?-12q5dpEUFyVI3AD+3`-BnbI8SMk!2UZ&%eIjhXc72+;E*CmVLUUroON^(V zhWvBx%YXG1YsKW;cN6Wx8z%&g{cxK?deQ&YuM|{?9aWs%BxAFx-N;Y(+Fjb@_{6~; zpM+@khBpV!+Xm}DlcV{6&HDX~`0>mpL_XrqNP+6hkONzmt(p;B?(QI?LtNU9a?^pA zU5NbU%b47Np|pI)^qk%R^5bGrV6A>E2?$sX6*6=jp!68_AyVi34qHx3P@RfUMC&qc z_Eh}DssJ}$~jnkQf;rfP+a+QO3eE0t>cFadl^j* ze{;+i7(#_2ZfTuS01E?U4Fja}!{@+1S`_(!w-QYr1lsxczYBUMw7X%*Rw*01PM!1h zo=RkPgL`(@zN?bBsn-SlD>af=Y70ZZn6w7S_C_M+IS;IOkNLr$V~|kzV60Co@++{@16IKVbqF(J?cWSA>nt!PuN0Et?;_?H zxtbbTBH2fI82s>RzS&)3%?v>$``vdfLGHGFUwS zFXL9z*hZ5|NccVRRA8ZZeAvRUab-eJV6vJXU9cz?6)i0+5M4d z-JT$6w><}}*>X}<4frakb$=zD{(+axH<4@7+{YurZT4{kptz+iOHw0S>iFvm!lWFCq0gmZ6ldn3O z1!{7csP0kjo&|CfT;rveQ6#hhXnBwCR?0xAYv3b<+Mi%Vtc{TaYWWlPE+;6xtEj z7<^X=Z3<)#V&-8^ju*Q(r(Zks)%pFMC1*B9JZ)8y7@q@=1C?=31?B=>@BaJpj2Xe` zcVzH6<#N?vO3FKuV~lNe3Y_LKW;0`BSP&<#?_{HgwDBGY75MDQ@3K04(q@jQK)h%x!4) zS8(55z1ozOd11A7l4_9J3e!$@=#j7!uQE zge7$3zHki7HSS7t-^LeX|JyZIn%0qi7zTW`tvHZKzH92lN2yiBx^MnCpLe@t?r&K% z)sP{gN7*69_RyI;dZ}jN&B3ntC5|(YrZ|Zxmcv2DD&CcyOZ?yPU0`)czwfZIwaUYV zvZTc~L)XoF_JZRmB5Z}p3-{OC2FslznQ=k75pcF+url;Ck8t{2 zmu`LT2gS}G()65>u8Dogc9rE{50n+}GIl^i{(3bk%1CsyCFHQ2#g197Yd^cn-HGfu z8@^CISHHqv9pqk~`piOa;?81fz@2CRF~~)+NY6}4=hOz#=2rF0Zl}jQCgb|VeHk9i z{M>D0U)3tydGq4geL|*)GRCnwR!D2Nc$lOjs!_O$~7EjuPPj1>_j91Q%zg!CYu5<3K zoz5ehYG$X(xw{0<{4=rGu?X^Gy0OJqa}k1ar%Ka^d5aX64F_zXbp$y}>2&xz6Gg?) z)gO}x$I+K^TXeU-ROvxO;c8ROB9rR98tU+=-Lv>5UH3#tQ&QH?q#4B+Pft}-&3~_T z%4koEXEAUt1#A6FP)Z* z{}$g1d4AhZWqeIXQ^I{yV2Rh;hs#uRk9%)iU302XQs6xwd^<+`;2u@@ux62hR1oR1 z)O&Dba_m3N*MZ^7nnTF7iE zbIrkn-M2UU-1z@~YFf?AKbdJNtbduP-xn;x=9xOcThEnbO!^Z=ZnH)sH<^?)nF9Ro zeYy4d?v;dmNU^&eH{#2HNofvqdCC3N+PpxEykEAZi0`@)3UZcA2{r=P+wZpd5mH&Y z=!dqSIl|3uy@EWSv3{eQU#>W4-YKZ(k_-*9?{Eu2B4Uri?_c4E2F0ICnTBxIr^TN7xElqO{)7L#b?{7n zq(}Emq6azk$h|GfwIQ;o;7Vx{bo-I}s?tvz_nfdBo8QcM#B#JA8t11r99xo{+zobrj*~?<%Xw}#;)OXH7^E)Q-ABjx`;a$e%iaU8oxt1QC&EC_yluCuh zY61sz+FAkgDN1pU2`iDw4M<8q=~LF4;GKyhe(Y3-2;17cRGq6_@16i#=EswFNT3EP zRWo7lKHx(ed$yj`%b@#i(-bwO=X8QI5s_tq;1r@hY%~( zTBb$!g)F|895Jvdz4a-n!y_*QJNVH#@9{4w^G$W#r$;?`yS3_j_c<$M2)woG$;+?X z2Dj5nWdhCFIcV58XfTn24p%ZCR84gv1nsVrrs11?Rfg;8ac6P$LF&;4M{6i^ORel8 zN4?*X$*zk^VX0+rd`tDI6O@nFItatx0xPz?gw^A;Zo4QBvrsnb{XM|F8z>uRF;-r& zqSIAA@i$8n%H6^|QFwINbQY;MbeBqc|LNjzp2;D7UIA)h*5fFG)@^pJI+9vJ%O7)_ zYvJjR$Z4bl=5_YZZfHo2*?XZ}$?*cKTpkb(EBpGK<8es3V$+3H(^+=Y>Wc5m8w}<6 z*_*|hnbU!#i>FQJkkW^(1zvj(S*TWW`HY{*8$aL;A$ z2lu&5UCa6G?9QV)mQ7;K2i?+MXSnoKM-?b<03|;&yRROndFQfV+vf z8i?(<>`}Ch^W{Y0^v%q7!LRzmI?l4G&cC{^JXK_w+r-an6QE^|wZ9aCKut`+rQ8r<$qemgGb8L78%bFvnMnNbqurF zVR%ZOJT&i8JCAu7ndlM!C(WD!HT#VT$Q*qb@Zltz!SsL>TanCo5oJSXCxP%Bld<>S zQ0Wbss{|UBcpW+>)ZrWZ)-;5i*Z4?1K=53M*Ux?ZdhO5v)SLl!#DgY z`CJlk{$*8$0XDLuCRd#nxzA74kSq7JX40BQ7zRvr760{b`^KdmQ8ZYg?IemNw{z~F zAu5j&N1E5S1@ZuTXDR+|gjyxsw$7Pp9CXOkx`3%J7D*zh;iUwMhEobtvEtcg4TL(+ zKtq@tHS{7X0Y8WSla|N!&LMN1>$60QC!)3JQrqS0`kgmrs}#M-V>{XCSq+XTYO!(x z#farHgRtvaReaHEJpV;e<$ttv>!X)Zr$%a(Y7hN9gB9)TbKM;e*-N(zL?P1UVO^pID9|SuN&BEQv*~MbxEI&~QHH_`{`p{cmkm`o5M?N?K z7-`a!vFlurrB5eGZ+ZInPF(dWh2c5rznM4Ni#_?=iY_wuk8`LWeI}&rU;XKkIDL-f z-ZMSh{(+15VfwK~eV3g8O-%iGf8zH{)kmrSELp8LVj6ROIovEW!bdo+fQ;KjZ6%wsMT>|pHw{rWWN4}6bG%UD8niT4xpRVUDYqv)X> zyTnKy+!vR=YWpy-!6S)S8QXKxBlbth%Pd=F?-Rw2YOqa>IBt)Rh{LpVmJw)y6qiqh zvR%N4ir4JFr`5BHA#zyXMN!qWo4vpuTm745`b1|-;55eEwu5Oe&MyOvVe@~Li1ZBZzMlI^g=Vt^rPQ!k)WE#RT9J91F9qT zl7?lLViSY)N9Gj2Y&w;c|W{?z_ItV*AWIZx#;*!-B!G!w#(*}>LlWC zA=5?oMUoWqfU08n*XwVCgCzv9-@^6BTFWJMjjM983A4@@UqnSuL6)J%9-gnnb51!I z%JIC(%9@$DJ2oCkrn;>|9gU-Vh%n7Z?SI*$i&t3|m1;635NlGOd-+0(0h0|jX`j>#LcdyG%VwKrPE2FzTTF3H zT1WZe(fpDjjsX^4Y+nmU575UQAIF01ceirIxH8*3(LTE^Dg0bN6&I5BbX8pHuNpQU zUVd+OJxY)4$i3Q`y;{Ove#QPhFT1+)Xajqdeszk!x-`BznY}zvzXa~~p3GjYT@j?N zj>gn4medKCvqv*4SC@c}#$M6vj$TfQ+=^#wIGSZq$S-ZU9O$FUuMGLPBQ=<^vVaeH zT#1MtE$fNivS+7AIt&cCOD{Jodyd(&nBU6{xH1xfqhggLFK9f^*Q+i9w~Qfmmqv#u z)H0JwnW}@)1*P0~HwtAM&&09Ppea8wD4t+j4u2DQ5gL?=es4>3ihcH_0CTjHC^c~B zd_C6^B}_Au8NYwu_c?qjQ<|erG-&WhC@A_hp3Hbs5=<9D8+l428g$VPs>)>v6k;>q zz4s;%&!4_kf9{E>pS6Nq0b$|Xuewtu)VF)lN0ed8EXw&`UHnk1VH%$f+;HC zCr7b|w7FUy$d3O!Yo3s#Du;dT4|y;3MP6i9P8x$ATcNr|^Id^PP9#^;rixG=94%V; zX0g44d}+#;+#UD4csA+pSk6mNG23 zbF#hjcNYUz3V1FYZa=R-P#nNzF5MTHy{&08Mz~u^4i#vra#Hci4m=T7edWW(io85{ z#U~iK#TYg$)^{LJyKVTPN5T2_>isD26A|6PxLX*KKeMR0jSVqEF44JDl+}VW`9sD1{+r*f+%QG4D=G+8LI$&+u<KN{8FhBeoaDSma6<(2_WB8+2k7+08n8)L>XT z(5!(UBE36@8T;9L)7);T8HzzCN}Wvfk>9@&33eH-(0jHi_k4{CzE%nc9hnb>w}GbE z#vH(oo|IYSN2aWAi~0=3BjlfGfY|DRO3Ckk=;(guA0xH~w)_RM&kkh`m{(l_#P-$O za@u6T=aJnMS@sPY(G)Y>93on@ql`~Z0iO9lOu6+RrK^B){PL!UYL}C*eZ-HxC~(Ib zv`IDKBwU2FTu}t1+5=rI`bV3@M^g@TTB$~1^4!8l2@$`vsO*Ot!MWH5&ErPQ6N@70 z@S-Loh?#B?Yik+sR9}&MwL46p}vDON}C=1&m9;;BFB-=h%JW|w^-|Vxs zG_>b=FxhbjN}~)83K&*FeQ6+vjt}#X&kSPF!qDF0vekcH$meh+Fx`J*l}reW8u&?6 zBOJshI39w9$obHSmg*Hcy}OJOrPUw2^%}kPcN&G(PSZR#kOmZFwmr0K1Df_D1xC0*Ua>(nyJ>hGMH1M;C-VUHu7yT)Py{!6CKogO2xXl^4$V+AQ)Cia zg&UYz!OY(NHJsCr&F^M6<~gVNz8)bG4`F)?=zSFB7QL@8ok%3&E3|Nl&D{4C{hvmj zd;2S~YG6DMUWn-h_HL{dan>QddJ_0C0#wAr;nCn?MRs!@Q(b8kYe zt4kZ;&?+f+k7Rne#uuphTaeowH)5ihQIDI+q4DN7vTXUtv`84hS8`-^+6*X&sR*IK z1!nh6kjDt^fJnM z9r@`Oon>DcDpkU6UcZG;YRQ1Oye~)0HK+%A+#$xN21?b;a8eP6oE3FLJj*lYX>bp{ zGBA$i0C`o?BE`}oLW38FWY*sf$$p~NDeb-$VT7!WQ`R3L9gNuDHkz(e=C2--g@><$ zJ;P{3=`TMHmWnyi+F1?`w?bN%Mxl!CJzD+IT=3AI9apdh$og9VMCbIzbWRZ~wZm6X znxo9kRtR*a9%Qy#OW?p8e)10E{%)F5`ib!%M+(%sS^hJSPaO2$<7n_m9T}`};*$uV zGDERs{DB50Xh*P17CCg zwKB_CvPNH&7|1;8fIOHNgIN0CP^M=$cPfG;u@0koh@f69?-{E|%zfX-Itlig$~B53 zp8gm~4jL46aUq@-0zyPfl?UFXlwb_{z>e4$$?=C&p9aLM>gwOw9u<&9tnr>yr08O497;!$!a z$6LxQn{*hT8iIY`76LW{@$^Km_Ckgd@@d>)X_pEjSNAR`k8;kKkSeE4WQ>*LGjrep zK*RqYfmYn3DW`|Q9lqx}oq0zCv)1YK96ag6ZjLzvql_*6pPfLx9`9avi#ygE`RxsO zV-5OHsLgLD#GGP?L`fBu<6yY~*lOGx@H2mfYqiHCI}h%rQ%4a$QwM}MG`6BUw|~Y^ zs2nclA1StVaX}c6oCQbMfa;lMQDywIC^DC5u$+F^&w1N<18?|)_df9QS~%2Gl-2pj zv`KXsmdO5=aYGw0AgpEMlZ%3S-&^u88sMNbEX1N5l90)`q4@+CB4K%O(Bk5jp6;|b zU?AQ5Pf*Xl)ulB6-waDGa3Uyb~vM!-D|6UvX+Tzrz&;Ygp!Tnv_V)3{6P+Sd}!N)Mz zFHSK~*Mw>BnHX8)8W=7SLTT|&z7+Gl*3Rz~{kF}e!ZjMK{T-BuWjCkS6NzVHH{UHp z@e&6jl#D)?*TF%SbuJ(B01o6J#^riHn)B`Zp~O{UAwsTYq7m6mQSiQd)u+wsWpfzA zA*rH_JASxRO9e#2FhtPE%qjwRWUGMSaYm;x7{qK*mG0YpE@^~A`HK4Vv!Y@qpro2K z-ygkIh5NgJLo7p4)Hcz3-9BhQQGTbww&Pk=X};T*kuPnQ(X>ijo>~shIH4(TwxU!b zqxWdD?BQn>FlN!Il(RiP!Bu#zSo}S9bH7t?XgP*g9v5aFt)F8K3~JwOJ2=D}Z6b6B zMV8M=JeCS$j#Mb^)aQgBf98Zk{$NOk10iWwHzs}A%y~;tI`ic3!pr~_Rq2lFvya{j z7rB-x{AfBEQ&ta$c1!660-nQNQ2R=8Mv@n@Yt094T;+}MZ2;k-$)SqvwyBz?FJrS% zyZP6JS)CdsO0zRu;_Km{VjnS%I*E)|H5I->4NehQIOzD&V*1P$xeQFjb*hFL1;B%a z4ro&{i(A7yg^QZ<4F)A$(ar8+xOPWCjX;#vOnZw3-FrNc&-GwBS`yIiT(HtTcvWE$ zhNcAQAoJAq9}CBZR^U@4o4M18*}Q&n_qqXMO#~VY!#P#QbZb!}TC`-kz4Cm8G>2|6 zq8#p;QIo$%r2)=Nu@nRsja=<;k!}KX>9&ebA&flw9^7E$f1V_us+{FPVrGD|6$z8< zC~7Kz^o#<&*oByMIN&ki>trfT&>jzLZ3ks)A-s6gItA(>ma9|r#))aKi5T=rdEb#Z zqH&thkZauZ00ZkA_R8#h-Vf2rH&(*hAa7|mBsm`Ef_7dff2UHWNq~+e zh`p>6du?A?eJ(j3<$?D2OMai@t&_+7Xwe+=YK9&=zg<{t#ZNMWazKHY2=Nf)a8^Or zd49T?d<$mO)j&V*iH)=Vgg6(vME!w~Zn&a;3l?XfeE@+|U;*bJG?qZg{5%ttIPCRX zI0%Vb6Wcp4-YF6&I0CklhC^&i+q;kPQ41yN7=i*P^8A1TV$4S^@)*hX7T5#*HT7;W zCU-Vc8Bp0FzKw1gekFk#&?n#Vdep1Xc!>JrI~Z`%Lii>5Qi&3|xpQH#afk+#4M+Ex zwshg(gdvsq{_;uMzM?RnKiXlsMJg&SV#%O) zqd}fVWM<+whDFL3z!4+Yt$q*uE-#X+&WY@5kA!l4UkVMOFyA{R2^AfGaT~~HBjJ~@ zs``yFpx3om6Pv(*8&~$SYe+@u%X$>*X#oh5%oqKP;5S8nf4VqM%8#~m@eo>qm#Sh# z;uQXnR2f&-cxmiDnT`UBGNM%7X}+^OpfJxf36lXFg2%6%+AX3*0g#ZYt$4n$O?2@m(K%~j&JRlLWHUEOowUCrpR$EuYq1N9_9|{`G=cMOT zR6x`sVblAjBlisE_bn-vUD4dGHvyNVc;WErJ{Q`_`oCyV{SQSuCkCnN5(t?F!k@3# z4maYoiEv>`S`HX=?Z922N6L3j4SCOn`i>Tv%m++m_+DH3W(ydf{0}i6AJCR|0y7V$ z1~uCDf-EES=MR=GO3PfdwX2cA8c@%2R@b|@>APuj@;^`~v3GgA^~V1xn$(%FcF4Dvy^&@KzokfkQ1 z_E4UC7gfaBW|Zg)$03yPT*^%(uDwd+D^1+Xxw}xdqVaeJv~wErVJKOz94TP&5e>qS zi5%$|Js6{`L28DzF}rtKr+x-`1Z!>8NA47q7 zMd`wOuxl`z`QANfnj?L-oCvp$e5ob@H1v%#!pwmH3I>$h@&0ThM8_uOwGS|28N9k4 z0kf5guY>%4TZdEjQ8)_S8(vHw(WRO45fj+1wT;F`+_?ZFb7Gs|Ae~ciR`pgpdd!lH z5m0e<@JE1^89Crmi~9v=MMgR2KdsOf?8$B1|DeB|ZnUVjK61$enFAQubRzS?7XeW5 ze!xVB!{N&g@K!4z;IKBIxQs2sP;814^0#*oR1S^+Qw*u0Q0K+_FH$Wv4*j7V)0+n{ zIejEx!Ql-n*Jz-eKH{%#2K(Ep9r@C^_gr13Q2?|VVKC$bTs2H=6czZL`?O*f^g%1QJ2F7dc2&(3HsNL z^-#PY02Ooxf#A})qE<9`@7y*uZOYj9)OJV^3u2ePcDZebLa@-AbrpRWZ$!-_F=f{V zzKMD$&8BVY<^;O8pLwtaFrX{5wu7>tK|i9lEd2YuaEo0QhFo3<7gsSxSz8T_S)h|l z5AwVa>Q~Gg09J?p@fV9FYl!;Y0SBB;ixHj{3ZFZNkO;9cB1G zLw7GNde3Y-e-2?#&S~DLx@l%ZoI_QOI+S(SjZ=v3UDI2aAEFs^DY9CZOdC?o3dhz`}cYp z#i1{nzY6*E%LfUEWCP4VQcQ1`c5Z%y^qORXZ{OD*g3T>@0`p2N*4mWeeKDW>J=_aJ z(e6Gwl3aDD^Fz^MB~zK7sQ~mdCu=La5oGqcMc~?0u(s(T@Y}dBx~ay2tyx^*)c6<@i3}^Jh3QULi%*0DJGN1r4 z@fRVPLB37WVnD?4p=p6wSBBGe@O2tBJb<&-d)m%sWH>_wE{xqnDu9rU(s9G5E~r zB0+3_1YjfshHWVzHir(1gn15C@)-Fe_Upw&+b+qP)hyp8*)wdn<}+`i<^8ZI4zw6} zIs)|gmDn%NN&va>#Vw%yhJ2-Y=pF|nmT04Al!q4%F!LYl(w(&{@GL5hL` zao*)XD`JMZ`JP*7%Ey))8vZz|ruTfwrU(12sM{mZ>>HJ<+R_MhEI_~!S&I)qjcQl7 zve`o+!_Q=c5CfunshQPc@dbuMf1J@e)MkUOSuT_qScs6}kgPNM9%*r(VTOxNH^gk$ z0#$VX`iu`qze#BTFCT{7BTWN~6=f_-bv z>qhT21Fgirb<(-k$D(@uKy)97Dj@p)s$e~$MHfWi4FI4jk-E-sOjI+L2Ex|pF@-ZP zwgWJ^6r1^6-t?K;x9ixp*fmGb;mv^FhW(Ja^I2vF(ZEOG#comM(!{k7}5wp`R` zKB)kZ{|ms4re!xzNpC@=r9K61P}7Ls2!6Z^+5+O{rj2Bu*PwEZA3pXO*mvo?B)`uJ zL6C2Pm0j81ZUb?w2urtU(Z|DcwmNJ8H25EA^*d!it!k&Px1wTrR=`5dZ00E$&1mY$ z`vR_&PCs@2-uPEMHc%3TjFEMI?IY?d_$r@f<%S3s5UJSa?)vwd90;%^I|b@SgKJcE zt6K};AkWG4wkK%RJvD)iI12NI50Xaaio!{_Uu5#rIXN#Rm*lx#yZ6X0XH z4kSDI-2+?&f2wCdFBtpaH!2w)~C>R zvla&!@2!rf~MO}1dsuk#pD=_B?e+_t)*6u4JZ z#QI>G#B-$qGFk}M>@Pbh)KA2;$nZ-SbAxC5ztc%$W2W4^tY zSXOnzbs}lHtw#DE3^il|_513nG7=U4cc)vs==uQi}`MiD>rX-Lm&Ehs7?0e29 z_jpT48g|G7I*6aX@6>`JY#+cT+14o+>l}8y7mD-((g2f0viHCH3r_EYqQRAKuJKLk zyH5p!;Xsfa!Wm!0>LP(~bo7QZ=0QRS^@qf*(80ruDJ8c{yY<9sUf+KeI9OgeCochb z?Lc+;*41RKi-7Y|f;RMl-D)q&n3up&|L;ieds>td0HJ^=P`v}}bxn~wv;z4;1^qh& zIFdjVH$v>Qi&p=MBP`u0S1GUMXaE3JMLIU~K?zF(-t+6=VZxT_%b4^M4Fc#b9Zh+P z88HqBr2~qrtR7G{MHy%*Gr~E^Oy3*eD<$TJxD}?Ce-@eI%|$~(%u-j4aNs`kPf>;l zBW0)ov8fC;7l1*cz!%#;liY$99F@6a?*XR5{2~6jEF%97lysx4@9qk-mxmFKC{)x+ zy9T%sW8R-t!WaGlruVHRzw9>jq9l`~L;+g6d=s_gc@wZyGLLf5l>^i2em<8o z_qq3T&VBCty1v)t#~G5v4N@HY#1((G-j371#4UsyzuVR` ztd5{BUO8lzD%z;@WnZyWaAxY<-P@wV%H)9C%r))Mkq&o0sxw8gRS7P!wOt;rX|$-T3?RW5; z?%?~fbCzoob(T5$ELNlPsi7LltPh{(#bZ~_so>Pqx7&S1fwUb>@JFEr90TpR|;1fS6NunuD|Uq|IK$J z*_Yf<__>fbXEOddDoE1d-9zcW?Kz|Kx!DeDyv=Y&ha{lQ73@qF*~q)%dUQe1U70dR z_AX=hdcu#%Kb{x;GU;EY2rqjSg0~2%;R&0z3RjBl+YS}ruy%Be!ojYvwL6PQg~5E2oxLE6dER9k>A2KtF^G~ zuQCcm1+7cHy8d{@p(qg$e8FJ?4+`H#l6~91?GZS=EaUT!SbyF*cwW}I-h`2NLVlU&}&Gn7f zyt%*cH1<7AAG(X%ZA!m-2gwIV@jmy&vy|SyC|+myQmzP6k{K#>^2FBI-W?(`{Bp6< zf>Y7UTOXNZLCC(($98x?O%;RmdG-lklUa_JS>Jr1{Y=?D)-rDXIZP<27 zfI%34h&w~!-c9V65XiknpjpOxlH#NV*`I2oJmr=#vA}OTg^Sp;T}waaZF34(b!hBOc!&p%{V6EK2~}4f{kqfV%6l{ z)?U2w-#Q9Bs6zGnOqgId)*56XKCfKMn!O_`DjMAXU5ls@6Qmp+16})9vrs-VS?xVD z_ZBA@dO{NBZ}!yk!{X^CaL&edW8bXyd7G{!j(H}znaCe5$FJzpB@OPcW+iQOT|jOSxI|5>M+@bW8~pGRr@ zbQ%tnkzcj8Ss27;PvWx`(&75&61Jib4MnoBvyny#lrbp;(TG*drF48S7kiXe0`Gwtnu-j+;!FfoAZ{5r zpt5G4lkqvCfht35D6(mv;X-{6>hP($VAGYu{S|3e73UOSg6lpZQooGG-7_R4{ zzohY%)AtruF3XO;ZxtV^jf(ZZ3=;Xjkij?Z12Z7>H_E13RY}~AI#NuXq|TLgxjOlr z`5j*l=unank@D>5kSh`-zS<#hENI}~tPSKzf`6TA%sUV=oQPKl9%rbT8&72_S#9z4 zF3P@ZmCgN;WFy-lGGZwwNEaAj-Wu;v>vkbSrgF|=>sZ2S@wAIg4-ow5GqAoC2nCdtco8Fub!9fxc;csOTn4kuWtM~B!scPZ4#rzi(g_IeWKcS6AU>5#xo zrEI^S>Gan=%E%`W1DlO?443*cmhemXVEHC$d27qCyV|5=SXibQRJGIxny=x>s!jFYG^+AByT@DTmIiT)}%rYfa3 zFEGklNV*&lRpToAwXzepm#zLnw_N?c5|;uHR{{dJ5|#HL>;q^VT=**rD=R zJufKvgY{Z%`jiECyhZQJG~D(cR7k`W3X#%ZnWL8&DnS;NBWX6Ww?Uvzu5BMb z8Vw5v>7NEjCJi&M}%`Jgx8R#RZA zd-o9++YQR7`IoP+Wwp-0HItrFa4&_d^DfX6{^st{70%-6>1Jy(449v z@hb;aT7mNp!6l2Z{SN3dX%nj!si`(0PaC8U^2S>xh*nzqW#t#b?B|;BQ@2@2MOglU zO^99kak~{OyF%T+U}A=D-;y)xU#EP1%_adu(vtqfk|?no5r-_CqBZv|Ib&Xzjp$5b z?Dt(PyMI;;!z3wRd2$wF=N4jV2r_6jIAYtfTTlU} z^dHBGHM$^vjhyauLJcm|fu8A1yzJjBfo?Y8j>*t!1pvU(o`6{@>&D2M(pp z3MBj|%FgoU0cKw8Ed>zP(R|!nTV?f5N%tOG?id^TNz+mmRc5IWV(Grm;mA$iW$r7l zusxNti-dFtVkYH{x1XR(l$rT0@#ra1bY;06^G9SI_`m<@mJ+5AC1Oec$&d!s$*smhQ~2nD9%m8GBT3 zA1Gkb{`)325@$D}CEqiLlet12ViIm}@TG!67-0y$hb~LD9^07qigAAJUz*-Fe&+0I z)`)UIvxKAG;?1Z0+8vAgCpPvxC68yPfL1597Xm+cPXpEAO@^>9*E`295_@LInZua1e8MV78iR6({*4 zVkl|Nu*@Zfw*4!rI;nlxcpe1`BF*Jn81wd;r1akgL)XvS_$|cL)Nu(lM}Zz7DANN;4L2y7Fl+#NV~tThxj95}sc@F<#0=^+4fKXhmG*9x znN9u{@j8{eJUONj(x~}xi&O%9tG+PUlzOI-3oX+lXI$jN_(Yh7MjM&z9mp+FnI91O zw-1wMw@*HK*kCA02RIW3Xa-xqAHSm27U6I)Zo5H={v&d;2ypktQ8SfXXu;1?+(*5j zTk(b6xWmOZvIaQ^Bb!=(#)_>Po;V%D@qKhN`tkytMKW)PNz zR!TO>8T#<2Bm283GK#3l5GB}9Vd#yYq? zYc4}C$5gK*6>j;>aq6ZmKkwt8)|E+FHX&KQJM@ylV`TU>gz_~+nzIDd(x=Tko;NrT z3WmM|LES47bJ(y!pAE|@*Vly-r%zniwYiPBY`*C$sV1S9+XCZ2!37~e|AFqOM4#c)as0mftf7W>N{#}%t0o1H}^^nR5j{gjx?%b8L4 zTyo6%Rjd?F2~<&ZD?wnrgJV;WeTW7=Ock}JRYNrAMT$8DM6hp9T|_x930%Iih{F6U zu=^E+WHT_Pk2?=Eh4{uU4uucBzN8NW2(G=9GS02@63H;V%~T7UWD}BvJCkH4qGSDT z67_~9090m4hHToVguwC3#%KDFld_w#y7&mw7=wqs#7nI0cOc?YE0#1PUpn)Z`}-*O zbrw7x0SkwAVG@bJct-v?e>^uYw#_d#^NX_I5^Q_&U<`|Vd@XS2qz9F8$3Az3@9O>x zyo5PJ=|yx)kh#QL_fKyG=1-WeSS9sdzGR2nqacZ==xQ~+@w3yFHFEAkk`vEa(LM6$ zG;PWl?6!F$Y-{6WO#TjPZg~lPS}NGoyEOf5qI{u>aJQEL`gxr6v$)Go!4~i#UYfQ} zeJ2;WiEV9Jr*e54_?h#VxErX;)y4&vpgZc(VRdntrxJT}Rq$8J%|t(%O1!0w4>s*A zfrRT?*86d1%3CQPW%$nd_%Z3%M4Ys+<#d&gNR|+!xJWwrlf}D-C40QcuYEK+>MbPX z-IpR0yVh0mM}w#la!zN6-Wp+b%`$N+=>sZUA1g#X2WdA4+?f%HeT&fKWxA^Yt5|Jf z1W+7AT3EN;NVlbNAU&A74AN1ZVr-kGGFe(xL$20XtUYvSz|}o3goneAarF*Kc$XTa zq=eNO`~Qc(Kt~D*8N6c`{5%ycGKeQCStu``bpLw>PnEuqSii+peeJer{YhGy6Ntr< zox9y-725)tl`s`Q6TTA{8Hf4+{<)o=dJ++V}+#xe(ajy{bXGE^W3rg3knk^?_rYjUT+GN*T|YA79- z!RN9bpJ6Or!B6u4VCy@AExSP~Y{%c>CjC5^#?-brBa_PgP*vmoahicjirh&V&m5M6 z#}0M1BeYZ%^1o^H*g{m6ZeYXBg6(Dv$|-wn-R;U*HWwHXSb7#^$R$ny}po!`ON1ENF28;SRxJyTMjmvx1>FCIiaO*%FtJ6+w%W8ayt~6 z`DP_dj}Y>_cz;E1HMALTv8mi{63V7c9@cnwS0-O8?!CT&Te(%^p@N}2`>TWbqV=tT2x|H8K`9`kjrc$JQ<5Irp`8RxkfNgCOmi&0vw9pY5rm3mi=vG;6LSuG5Q`_G7 zTfQ{TzH;~y%1S$qs)wegy9c@?9O`oh{qN?}D#N25yjy$Gfae*!!50e(@FvR?YNEUE z(F_g?{JQIIrx_Pz(46O$&(z_3e~0$Xk{p=t+w8%H^?_0*Tj#is?q+SAqkla|JoXyL z>CWvK9zNXjYeu(2ie`A#IyF`FJb&p8WlpN74BK8#rN6Kl8}rdk;_ij}RMnrxxsi-k zmPZm?UAMViNx!vCL+LMfsP6F@?ne<4ZUQ_SR8jYcqud-C<(0Y3pgGw@_d=f?Jm{q@ zI0p}C87hQUNLC60Y+|IlJYN#9r3Q+eJtDL;KJtHYzRmG~#9d9e0s&|V0-{3vjoHZQ zF>@i}3;ohbMOOYJob3bR4K5D#+I7s86XF3|y560uH_rb7x}r8WQ8_@ujx6-qN<0r( zQZ%^h=S^x?T>w5R#%`>GTJ&>oVPW@vspI8Q(FUN`Fr$yZ<`Npzrz?8f%zuwzZ~F~n zT^9#jEL#5}s6o+rKnJeZPluZP%ur6jh_W%7tqHnQF}b;--uMvp`0Gs+{NG!}$O!ch zz0Bb~PgWV==Bkfuw>RV0HrRt;VQdPYn2U)7v4E^pXfu=TpG&_QitfXlFO-|-?(!9I zx|9?yAraTM|62HYzb&o5u_o@5FYKPhgg(SVWAee7;q@UN(_0NT7h-4ytIG^mDbZeW zf`t6w`n7S(y|5DNH)cn=MLERKrbfdS50-PGy*n^JO}|^u6%1xtvj8c{32zV@WDYei z^W-n1idMLUq9W9zUKqIX`E;%xiscfjm=qp=$kaAaSA1bGv=1WZz<=b8O~2JIC3?Zj zrYk$G@;)bZh21qE228+`8?GGt76hFK218sPRY^E^Y*JpP>WZn;6{8`Z6uOURYb zYUpL-o2fgbdC{ixkb&E&i#7{WsG|!!ypte|Q;kqITU0olMh*j!e&T09{!b5NXy~Gi z`uo-Bm})XPY>UM?EGS5~wv?_TZ6`GTKr)ao*K%Ym3C4I^&)KPU)XWc)($hoSpHA_V zkMp>XFixFO*QK5iWdeJxQpj?w*aNNio5_@)-_tMa3P_q*~#R)a{ zXEz4q=5d|Bl8V zJ5p3Hvl=>A8`#DK&h!Y>ybEF8(xp+f9p611deDyE@o!bMA##q4{KA8U2$uT_PtL^YptA_{1XFOGAzRBw?8&rDo6J{HFV;<8-pZmLP_E?m?PBeW-GW02WhuI^3d<7v=;GeI%^iL zSR!@YJgH;IJtX|_uuj9$yl~aHh2>=xjlSoRLp`prd>Z&>Dt{Svc6avLG|uGZ@Z%95 z33c24H=~(hq3&ssj=C)>;v}MlO-r9XA;WwAq#x6{)AF&bzI`K8MMJebcEp$G=>;B_ z^9;Yzzy`C$kI|DSY11c~e5+Vx{rGJk@n?GQHSh2v?iOCBoh|m(A_}}De6Ew2ZAAv6LaCtLgf08__{)mutb`+zrTnNAso|j*F=SO*9mA8ywoT~!=5qOt4 zdmL$LkECpZr!d;7c-8i`28AQ;e(sDN@uab}Z>SySJX>Wf%@%xnFaFt$AI68kKlLJd zM*dWVia^m(8RsXQQ74eqx%Vibfv_w$W~U+kF<6|bN?*RHz*<`JDb0;^ArWPwb@~Fs z$CcG^OB!c!b?DaIy)-i~B>@{(+LTh`k0Tr}?%UNIMyoiwb3LIf6%Z3#l~=!809GN(l2`CTLSs2W!kqVl zC$IZ1we;_Yz6@KQszihwlt)*#_@ZU05qpbvrlI}IIupC;`)ipdbYx*At+O(s6THMF&vM7sWK1mdO9O`_>%~r3*irOaO_>iNtiq1 zo`{H;Wf19i;Dml4Rcm-ugk{Nn$&DTuOFVdxg4;v9>V=3_YVVNH4w)Ri*srQAUkh$2 zS7pChHQSA*S0XerpFqB(jHRA2{wQ4|19w`B=vjrEsl?Sd&>44dFI9;0c{qX{j`vXP zLrh8h6DiTZV7Za{hddrt$dwtjuy-O{?RlhIQ^jWch$k(nh2`*r=f57_6^TR7IZB-4Pff#irm(Y`)CA$%C zf?>wxnD%FS;1-%-J2|+#{zfW7io58XO{Zme{i?$151zBbsMjj|ycfHzJ9kJOGwWe4 zF3qoTex64XE)0k{WZ1cFD;Z;Amudp(g%=C`|&=Z4?6NinH zZn*nkXy1Zc#b}yBF`B?F;vtQFfXvkC3{0+t7$H1=cE3UA0CPw?#Qntxb>apWdT?tU z>}6PR{;WAEDa)+-NtEs{K~|fftgJO|&;MkbyRHU(zI{1pj7(NqH7q=jpflz7ey{>w zp}@vOkMLvju0F=JDI?g!wJGSxvec_bcb}#*~|?^ptUA3i0>?NljHFya;Frv z&n5Q*EYl;>y+e(y;}_?idG0;nYIN+}v5cuJRBBUpR2M|#>eYU%b2x-V9s_m6)=t{K zoJ?&BYXUgL8;)Z(Ae#djtgi!vCJhTXTW_NZs2#R zh8*Wci<2ePT5xgkJe|5|Ye$=YA-(%O&Utg0E|BJ_wx)}h_jcHcJ6{d9`1l`eZWEXl1iN%Z9b z1H&MRMrI~fH~2b4xOKK;3fpCaAIe%fnx1KsD1jZA8o1Z&qNc8yC7E{n+6?!5qmI2rr~C;&QO$fJ9LI8_ia7VQ)e(D6v@aM)J9L!r;~Y(;Ybbet5Td z4THSMm%Tw?>W>;q{0LJvAD1`y7`9+=xSWpymHb1^_p^LYFU0&f&aYS(p%MEW9ar{8 znsFbvrk;rroV%P>R?0=2KGG;3F)R@;wz3KT!* zj43z1yMhmEPh);f6ZJkpoBsBT>gsA^X7T@uW!q!?a^28_qo6sEYEqDd5)X2 z>n4(#`UGE)nm+Z25R~fcmj+am(kvz`;T7J&gXf=TV3HE`yV;f_d5hGdnByH%!L#Go z^ddVPUE%511q_#l-I@O$07IkK+uriO2Vg?lWGWn-TM!IX{BRbS8;cAnbFI^m^i`1cF_{4^D;0Ie!_ZwBoQl6e4IFxESww zlz{{H%fIPxGU86$RXvPqmXfNxKa9!@ptnB7-9JoBXCTKmDlBlgNq3?|ykE12VoUQd zEwGPRlR`Y(IZUJe#M!P9xjs>hCtnFPN3nJ7FokjX@^3EylH@mWk=-~AU&!d5s4bN9 z3j&ljW?VX%Pa{Uyol8X+xBWB~chm#E^hIbLo`pl%o#cxhu?I0Y|B({) zx?nSJ#BNtk9-rNWq{Co~YC=*`ab$yNKXcI$>?9wl$3cjV$#&W|CPC*LL%S9hM&lra z34!|zn0WwT=1?~*o)k9mfV#;igLgc_z`v`2SX_Qtk|4mc5FTJIS}(3qxm&q}iUo0x z!Nwd6U~utI!%W}BWM8X<*Pi2N=H9|!v*?n4*N_Ngp>xP6P|&w8xtm9B#-hW!_!afL z2|z~x1GLMWW2+2sT@GYk)kXsgPpBE&qzIPDvH@a6buLD^o%W4zgKKN9SLg+n2h+*` z_xM=$khK9hFp_p_qan{Lf;P1dKQSEcW2ou_VuUiiZ0YJc**bZ3a5^xJRt=xJ!EE80 zd@_6JfxbF0VRQ2uHqOP+9GB!o%dlSCkcqrOIa0~a)+CrSG5i! zysHOA=Hp-6`l$0veQ!|XcLjko0%cNd2uiN@i_ztvoSR?%> zxrEbhM3F)Pf;Irr=w3JMq{P4n8yebJg59sIEv4!?L*H4zh&3605Nt*#e-Rl@<(-Ew zL9Ajf!%l+A6^@NHN1Fx5l5r3bufIWGlPKeQv)Zvldtw=gCPkS9H>1HjA!v66hlEjCb!*B+R`U3bbE{wd(p%O4~$(#21CiL?;g!a0047N6=#7m-{!d=LS#P2 z;;>-(E~ICJ!IhlT!X%JMfR z*nYvu__kM$*)-lX8`7bj#H%w%2at+#!wP~;A80*bO|J?MHzM+E+=-5HYRmEwIQjJS z8;`(?De+GMSvQgVcWra**Wn(l#9NDW&NQ2yX*jTk$6XDEMo-8b4rffRm+;##5WFFa7L+>e(`4{-y-FY-Zraq0nf7x_HW1r z!suEjeK=c$Dr`rp${+3F5~N#LzE(@=f6Dm>66e$J;kfkH;!Hp>sokFZT1^1+j8m@G z+&LWZ_gjE($<>1JmfWz2btvXcJeMZ@!ZG27IZzj$-%+AURNzN{Dhm|UQj)o4wx0#I zm5|%}Zv5hgh0TIR+hQ@Sd>WyyGKXt8!(3<+sshgT2EJJztT)zxZfC->ieQcxW3TQ{ zH4{`5*f{A9N=4ry{@FO#)3rK-Sv{zmCjqPuWlkw+bh^0ztYJ-uoOE+nA-}$zK2dZD ze5^no#b*RCH0JT=hDr1p{A-oxCWjb|8HnVudciUd@>c(BD^vA=Q|_ci>O1`ALwbyY zM%PK2o?1$ni_CJ(J%#xmkpc(modJB~z9YF-&C?+dDi52qSn_1m8@E_K@a*L5I_aKU z4K*RPF8T4SRT@iJGJv&d>67qx>Z;D-U}VC?4Fm(X(==c%WoxZMN5b;Y~xR@%*Gmv-SQ_fW;|K!txR_ z_jNcUBn*6);?nh#2JiUnqMQkcr}uG_1L8#qN!Sd#d3FG+!z6(z+kz1*!zsuTImncq zuJLXiMtN6b;dpg#e6N@o7BGsjypaT>6QemSq2(>~{bl0Mdo4nwK;s^{w=APp2|re? z8pH^UKWsH($j)qn@Z&Wo#;LD_o7Ma~jJB1%;+k@yc*+sWZXzVo(KMX>0ulew=;}Z` zw>>sRLy)hv1z|Oyz9V!|zuCm0yYll>a`ZkrsETxXtbnbgOclx4--6!1$UXl(k@}Nc zy+=g)zD`vAYDXEk=EuN)Zv>wHT38P;<}vO2Yx%XKn0w_PcCU)KZZ)X312wc7Omf8j z*8$gk6l~0sSCEz*#a4et*ljF&S#LFj_HYUH@N|Mc zHSpIbX6{Nw@I1STOq6uRZ*54pOLHO|(I2$YJVrn?$Ogh>UeAW~!I*>!1>70n-R}U^ z%{VhH_#iD7T&MASdoKcbs*B`SbP0F6X$TBaphs~`%16ypKM_V3_XFb+VJp&fzM*uKtp{665uk`{@Z$k_ZszkIX|y_9^{iM`3y9I%y7zq z^@d&4jadJm)WaMA?Z*M#f*J^91Kv(1^VWvsgpGc3>@6u@_+nI{J<&gca(zwJGt{8O zEQdT^0AIDqC~!Lk2tp2ZmaTjoHR;aJTUm!ywrj+x7Q5MfGK8lf_ry1?o1tiCr9reMe1#rT;6?a zGt=zkB>kL)@CNC3%v=K@TH9^FTNOKQyYWt<9%UkmVM8FKST%}W5?VqkR|7}-@5mrBwZOuljgi?9Vi`m%u5AM0rHgVp%&q`(#}uF&9AXd@5LO-^eCgD zd^QW%X#kh}GPzTxctG^NQAI1cgnaCQbdY0Oi^mRdoYu0YJAdjV{Uo&3hr{hkllsQi==#2JrveJA7>=h*vl2J8FQ(K8&8RzEymzCgiYwFdO8Frc7U zHt`+R`zrLB<|x`XBkWi(!`Tg458G!H$Z*aj)YRP@KDYg+DMT&D=}mK`8&^_BssX?xwyNgL zpZs#5nm93no0UIxrkXOM15)p^73d!;5d^HXMW^9ntku>cDt>9Tff&I8=!7P8J$WR_ z_tg#{l730jY1$EF?EFRG-#$bV>ym8Rla4I~#1^E?wTczc^Et zkYs7l0d}XmKSWoC)XpO*ntTA3lty#ZxtfUh7DU&uNNN;)I;l|-0CNVw+c5=&Gk{tJH1T- z&zsjCt5`a&V~)L6$-A#|+5dm;2OyPhvF#}}=se^@+~Ex(@VHXSGpzhr_H!xb^<~r@ z?sdkL@ib6P!EH&M9syeCGJ5x`x?C%udBQPn@;qPnd*P}ZPTcWMT2C9rAeZmhtp2Ciz(4naXJ@~w0-_QehY9!IHYjIJ*kLG z@kSCl`do6y)yQoGn>RrWSg6b|mX3SfmfwN_;!mnb)(V1Y#4JO{BrGd;#XjI|lYfQa zw&ydJhL?H%`@Eg#9|ueL;>W_*}xLfaF?r!{TwfQjLC0shGNfA!qI0aPGxJYOHjj+C%~ ztUA{4!cbSfRQE}&P7z3w)*1+Fp-g*tLI)=GA%&x!;ug69VrJrXNf#-2sTpb%1(IPj&C}J5Ixw+V!sxdzdOe$H!Vy#;&$|@ zdAP02KV`9E$0^s8OOufX?aIa#zBwG5F)vIZy=yfG*5@_lQ&mc(UyG1jT1YMqiMI-S z>j*QIgon8h*kI>UX@--7<;Xc~2?Am%@4nq}I;sY9!~bC|gYt0O7X_PvLx!Z6_kR^^ z{?*`V&-+C^&NrQ+WqGQ~f+&#>dDxZg6E?bQ46mD~MBR0SElv{YBD%r$>8QnoELS+v z=0EAeCYt# zDoI{qsGWy*a^>(P_N~2fgL_TvE~vsxB6xwf{v2F()mpW9caHjH3RkTq3+%xDmK2yvY!-l`PZT%h&2kluf&4}+LOfg=QGONY zZOwhuuJRgSY_hCRd&i{k^C(`QnD)gDQ1#3KZVLuo5(pLAvxyfwS7Fc0xN8@pbT-ez zPxXR6=>fn=^&DgYj%?VwgXXKJmT^)!w1qwk`(Q4X}9>CV<3{iPO9v_4c zfz}lQxWzO9$i*rtI8y>x96*I=$HLwh7-$JmQu9689-*KB-$sZhZq?o!hGv0?n~S@j zUt0~n1*+Q(D(bm9))eQlbnrp}0@o~ZWH``n@gvZ8AC2)VwyNR^01wk#%)(v}gj@lmp1Ll`v5fhE z+b{3gsh_+H@Wu;taYDasHmdP^!)~^`WoWg zcl<4seZN%QLJe~6Mu{YI4`x=t9+j2cb}*^NQ9#&*t8wF=68vX1h^1p*I3{)Mdq2}~ zY(*0`X}OhOv}st14Ab9wPHw*Gf#Uj(sH(8bYfu<4PuNuK=JE{+Rx|{>s$g|XOhfDH zyS8}xR+N}#;S|j+1UJNL*_fA&OW&_1TSRjlm_ePL0t3aE*M#HoWnl6giivv-Uk2Xd z9O0LmgU1-05f_|+p38_JaMQI z7>iFZs&%BgLQ<$g$tOUDr;J5o2J!IZPP;OO)u0adX(;G8d`^|s>zKPj1~)4&?;-gb zwPq0#VE{8+2Chvx#2?!TPRSEX7W2v6Fq$j;ViL;bVuRUk6pI5hgrXTKz50U8t`HXY zX=Mwx{qR=IZvyp%_8I6);7c4Xn=Kxzs#EH3S;l0IIkL{V5`F*3ATaNd^DmlpGFI!n z)OB8!H5&3AY>L%w!8>RJzeYjI=0eh3lY zLq5>8;m#G>3)mrXdc#B_<)7l#n{_hQYqWhVuvY_O$XBbWi$fP}3n+68}=p$`eoYB!42dYhn&x6QjOsPEhTjOGg5p2HY{&sp;FAR~`y z;`-Y_>ee+>3xw(ZK$A#BtlAp4>(VN9*r0xMd5qi`=x@C6W0eXZ=jfE|jp7c>_DR`= zyz4f>*N>%#>#Oha)0dW%NRf+(^$Iu6S`v6VFTi)RLx-6MwDb-XFnZ8H$0*mw9y7Y$ zdQ)F!ZPnR!1C~sRroKpHU%iMe7gNG( z5xYyYCQc(bsv)GrU?{myW;HY_8kj@r2A`!wML%MfHr8Rk66>5#>6PHbeXMn=1yBTYUan%D@xRTa!mfn ztgMS1C2>G*Z2UoaXKn?Ex)V}4A2rNpepH}w(22X>$+PSKCuahDQo3rJFOI0ReSqXJ zYR-p~xn!j-3&z!%lesI+O`|8>3IlIzt@5?{RdYrt50?cc+;l}ctscVXx`bT*nGqF; zjXp35T}Pz9#R<}h;ocd}3RvgINy=?g;KGL=3)VR`qA%=HpHnSW3+3Tk#QS}; z*y&n~mB&w^ygKl86F?wFa==!XBI}Herly)$FGRAm^57i`Wqv=7wfs*d$3zXJ^kWF) zefv~GIgA{OW9dC;-Cr*n+Do9pz~(@ivI)|S;@ipBZkMPRqneb`lCSj$d|zds;z{!r zSIe0z;s+?V@>&nq!E(}Y8Dv7@RIIl6mkOU7&jWRZFZQwWsckOs6k|1lRn%1~;03_H z?y>MXz0P%MiY0 zXw8t#ljn1p@zN#6*Sa6KR;Ch%MP8iKOCGRsKkdty7{`mpSWM*qVEb%~y}IuM+AjR0 zt=;mQdqw7)im;PyisOAv>|j}uXK3@k{rJdk?co6fP|gwkd{U_C6hp6u6#MdH?&N2; zGkLKRj!wGm#<{-UezQL6A03*SkN**ir2_ZAFY>(no99|_+Jp_VG3K|4=AK}ooU1~7 zbt`$~ALIGkZo6WAkGWTSLq^8jAU@Gk$>fu4Qs-qBl^6r~D0#$gdjA`~vYQ0* zbA{NKHNZq6KMyhP4r7IcHZ<5s+HRQk=YwLOqHqthZQBES6hc%+Zo|d}Xm@|f?gw-8 z4?0)uJj1Ju_YiNKu;2L{)PLltju}f>?ORkh~N>d zb!F|rH1JFRBkn@yzyQc!$z>_NCER%m-615sB#624UQ5335qJDN z>eAbJRG?UspQwz(zDTAXHfO#WdsVX;+bTiaTeo7^AvK8lmG6GRlly>b?1;L)dK{ri zLKF-8@F_=(V*hDDeQFw^dYsW^F2wpuT;V=)O>XVA3M2Ue~?Ch77@ca%j_9ZUq zrB?J5pTH5MAq*6beW?Y2Sko!)SEpdJEcDjPQ0kTN^*yD-z?)tUdQ&}Yq_zDt;|89c z3Ecn-j~E_K6qdVkEJIZ0(H_y z<=ofQVkJbt8HMwAMi^xdT{tDl^}qN<%h2C-+e}N_Kj(Ey-gnpcRNjsJQvC5ewtQ&IuZjvk>_04ye;RhWG)}p+*R1| ze5=mS(#GOK_{YWNdm;+rg74ne8265D&B--z>zU#iouUzP7_;rzi<*6K5`9TGei_DiimAI7M4 ztLzbr_Xa&6GNN^PY(06FI_o)r>PsIvN^g+}O4~QKA^tOLvG&dK*kH-vMqP7DM%2ql zxO0n>Mb{2=JcwFsdDX%>zJVUs?c84%`kbEmQk|CdAvzwXX?L^t zU((z)VdSq{^^XSouLC}#@bv0Ce5~MhR-;rFP$xz)Wvyz4zy4a>6E?UZ*)q8PCOg{) zjONqr7xa80Pr`4{#`?A5*WPWb%U!6t*8TNSB^u-i4%g9p);bWG^^;v?Ap-8>y}`3^ z>m)Ol$2PgK6IW)bd;XfZ;-jziTw{FD&qrVLxklpwgKVFV$Q^MVf*Z5JDK=QWD7IAn zJ9KaGDHM+^!tAZX=w6+ThRX_vB6qgIImpHppO_PO2Wh?O%(S1noR`LZD@huprbylf%R?Teu ztQ|zJW{Zr%zeYQBGWk~sd21Yf_g%!|@;dT|1eqRe+C8<4i*6zl&YMz5^Vlbk$uEPY;n` zmMSFZ&H7bJJ1%k<^q?b)_?~Ldin$gd!(0U3=J)Y%FX{|u_3D?Amy2_^iO-vkIcMhl z=ha(~G*DtVQr#dGM9!Z;zxa|lXaUb^rgimrl1}|36##OgN`Cjp0Lzk~1ixNNBLvCRv{Kjc(oT2^fq5V}u zs$5%@s2VTK=n+ZgeC8g5ip!9b-36$D8#|cdS$jHoBp{xDz%*=YGxFz#@;v*2WQ=Dx zRDuca+urJ^YpA0G!nZMFIIi6wd-?o;j&B20x#3(eHh#{UsX#HxK(QTxE`5d&%0dA29xoLb|k{@I40%N)pK(FSpg>WA)Z!bS7{ zeC5rQ0{K1|oJ<~=As)=q>-*3Zl+sqZ=+JYLKnUM2Uu23ITExK4EFFP>QCs(!86D%#%= z_MF@@#3lAGS7cFyVZ_YpUs?Q@BfW>lKT7lYp$vMsvhr&iX1DwQ{K+x6&M|099S|Sw z@n!~j4SDx9e0oY9C?!XJ=Bm!VOpWA05^|6Pp2~g6j0(Yw*M_sbkV&xr9uiP{M!oVB z5!bVrU=bAm-!T1BHA@@xAO5(P?dWVcdkn-a`yIzX8aiBlYQMq%A?i!ul4_#9xh$f& zrIwa^o7$pgX6}G(R$6MyQw_~ z4hCDljev+>_R?=rY+e8cAl1=!<;link<7CvpQ9wjyZGb^^Uj64n?%83IP6|6#v=af zVAk169Jd>;X!*Zzna8vEi2SjEl7|MlmIbI-Y+0_%?Fo!$Fved&kDkk^5xST2MDoBrhCJ>xu#%e~qF*xK6^_YH1X~U_h{(V{a>Z8tgUcy(ow-nkX2j8@ZK|tG z&smd!>ToEdy-*M_Yh-vS{mY!OD{~qqmSz3g#d6+m{pB$w{9dyc5&UCFsWUssqyfGB zDWc?$*Y4mX^2NPW(o?wU7D)I0n!)+Ffj!j5XYktx!7~murL2Sh;D$@pGU+IV|JXn+ zGCov1myed4DGocdnh!liKcsZ*An0#fQX+@B zSkYw~rd!lxEeqhDCuR*=Xh|}ViN2}cZt{F~!Z!Ms#beUNoJ7N;-dg{*OeFQGw!`(e zrK(nGNs5t{1xU{m6HRRA#SKnh(9QQ=qE{o0p7P z{VGgh+BR(bqJ7+QFeG6hrVBY;41yQG0PT6ga4_4l-|NDhd3k9KmqVx8`*) z+RIJr%ydi{;Gs4~V14I&n*5OLt>xu5pI!wif;8f-sD&>kXJ`2m>e=rS;A z?sqUF=^KMr$1HaGC~5+rb)9LnQsvP=E>S>C!Z#(K(V-% zU~`G6$#kcxJxaV#e3k&_SDFvI(&nuayi zR1=z+00uRSvWfomMU5h)oFN}6{ZN3-QBaZ7qkVf19c-p8u;MG3^3dM^9%_-q&ho47 zGaDxv36>-Iv`@rFx$7GlRWz92+02mNRywfdwUha@7@~h9xmmCt;Bzd5oq@>H`2dgk zM>;f#QvSPTiw;`;$PX_HpM>R1H-#^80mxczF$id9Oby5=t~Qf0WQf8QdxMuN4&hY! zh;*wZM5^a0OiC%h_mwOWhUU|j%h$Qhb8X4xWAb>rxj^nPkqY7hKqDslbJ%QwDd_)( zQ2~wOH)AN_QfM=V1)somKp+5kBwzdub5%C&Qnbfh%&S%>S741m5X3(WtE0y-H!G-(v0%@-NPU4I#Ezt&GL+_DhUAk zEz&&Nn6Om{AC6S;Q~Yc4abJ68iLIXJVRkqoh}e7)gn}u z|NMY-(H~Gc@=MgA;b+ZwlT6IYjHFuq)F?^F`W+1-fZkPk9+sKF7=>ZqK;(0XGv^Rd zSM|mgnbYIcA&YrtKxX1Ppqx@sRGR31(?Vj=ZZE(bf;R@JT|WdRFR((t_I+MwNS?RXTyd#6r&yupYS zEgIx=x_{tA{^>4O-&5DYW3QXf>;8Lm&DhqHEV)Qm!PXruMjaYj=Tle?gXM4*Rfo`yM;r6MngHI_>1qi$a=qwu zt?+ToVm^lnn2ZGM2s{bhkoW@R05zGTeaOQ; zYv?)U<9<-BEFtVPgna{d4?6K5sMPM4J3g&VP&WtkjvD=M?Kpy(XsE{W*Y#Rp2qUZ1 zLo$q9K>+Ny&!8k3s6TouvTi=7aG(7b4os6B>2YmDM#XaaojIJqSx41nrlq?lwFEg z76ec6g*$G9*Drd_6(W<&4f{=(bX61*GS`7zvRHNm-i-B`-VV1|KxHoS*|syapaki$ z79@G3fj!_RB30zFoUfYz*p;;GwO%^XbA@4l@Dh%v;bfp;yp!Qy5a|WZfzuhtBqzg> z_nWe6Z(6gLQ8Th|zMHbVZvr3#T6W$R%{QLx(T;?p$cwU!Zn9jjp%^ka@oiow-DuLr zaEyCf{A&MzMQ4rS$f`|z-%TvG?U>u*hBKdG$(tw`192yWH#<=S1h+~F6$(K^Bw{qB$&>2YyeGA2lV3niez^cQ{V<;iT>T9S5P1P%ZqN};Aqg=O&o2aCK9|EIx>N1>__vz9z2UV zbXIIMCWe%n>M)>099n|PrRhI4Ti8+e(hQtZ31kdRU`3(nXPuZsaPVe@BvNW5B?*}k zbE^BI!UUI*E;NevmdFmEwlHV;|58>W8s+FNT?2v*_JA^ClKgi&CSO=RFe&2Z_SFLz zCIc`m%9vJh$mG#eFUJ%z5LE<04@@A?>l{T{+BDd%FDm1 zMV0}u^1)p68lWzk8Zu=tJ-I}3N4?YQn$@)1z{Q9W$QJ!=X92vJyj1|Z-AZ6OV?F{G zVPeR^RMAm2Zg_p$t0HdofSU=}g$MKpj|t*pU2Up8*SOsfytwqioVG;0nTom859WfB z|AQROS#t9tSw3%HPcFa5Np$+C8d92WQMMY6PghgOP?e@kC&XL7#T@4%@&@#i?NKGF}$y{EYWgK zd{MQvtq|_`;jgccH-*~EMkV|c_jk(kXuR`1xnPS%DOw77T3>Vd{u+60z{7`{&d`<= zYb!0{$ekO3$5uW%P9B1*22-y*@noJ*>#EN4B5e@77RegLYfR!djw&;T;;8z+;AMi* z1nvNw_yy2Jac==KwLncl-CEp?7Rk=!sJBV~sUEq?0yyXoWYxxi@9u#%>JU2cKf&s= zJ;xdLH`y#g9&1d%$eTqF(Vz7lcvn!}??BKU>(H1V97nE-2L~=^mCTuEnsnWr>0NSI{IQ zpa(4kP3&g?02bu%+3M2*I`Lq$>@s?Al>kT}Rirry0M}u4=n9P*RgOMHtj>;Rx$7%e zp^w^yldC2@aqHYcu(lc*@hp0ru*Pi|cdHX3-$wjf*R0{9zdE}T7oZ)RW1jUZhJqh} zF&m+pedtL*?qZZMp9z4E>(rcT9bmlHDs2_oI+MXG#Sco#FFJPJ`3{$EI; z4>0AGrx19y1^{PCLf0|=h~o$MTe^~B)qtp1cXg@mpO+`;n}55CoO|>EW&|$2#6N{R z=(*2@?;7(@nT2gJyGLYl0XNJ!k;f+JLH1S>RECvbzf~F6j!7@<|oY;4O7r+CePNr(2ae4 z^65h|@N(&TxtWcW^0b=oBZ>3rUrs*79|2Wtg7s#U|TDK-^6C8|`nh+wRD%hHN3i^E#1Zv@yVQMX6vIaoIrJ+Q%cP^aRlYluy z^{4jy^SoTv&>`M^z+-^`~U;e4nsHccd zLcDMATAFdg=sq*anj`>1sW}mlAF4Tle%k?fWr0KUra0PXxj>b#-EUlutdDCBUs48cm-oU+ znjC+VhP5F$=TLRvg+R>#fDlDcP8NrUss`k*;6=4?`DHK(Snc@HS@GXy9Sui4uY`98 zLz#P^-%l(jd#KI3Sd0E47SSru$A_qU69K@gm%E^%^kCv%K^T^OyGb+#m;TlsCVVq96uXp-tg_Q3tI)8 zqsPHxm_ss9>3EYk2IY0&zpzVOSpj0Z#Pd<8)!EB9ww=l%4v@z#;Gmg1nQ=U9xg+p5 zHrTKD@5;|yP6r)jE`#)q#m+&X38*_ae0mi2%6~&DR^SzW)4FOURkXs#_`vi4`xS7Q zrCRKg=ckwr5Q}Oz(WQ$U?ESO$8}z%!E)+WWX*B;54o0l}Pzz zIoFL=z+&H2hoqZ0Prs~++_<9J2G5Ewi@WaMwAOZd&3#-aHjjZ{bp$>U5t|`yC=XAa4ii zjNNO8GGt;1+}puq@EFxH2bcLp?G6=bjtD-(!=tF85*#hWC54#keL(9^+Tmuw_r;t( z!@<+HDG21Z>sqAkT2ae)QUSQ_{S?d;ttG5||D^CoWwlYxjJ7 zV~Q`a2yw+#1ZAR+PdCZ@K!bR3@aFLWUOp6MjTpRe8f+YA-om)7YOz>Nu38*&_($GM z#;7vMS-mtaI;<9j4TMh9%sD z>TW?3%MkJQ#ki)k7AYVZ#J9h}_k?$!fs(Pk1-nB#E(R-P~dZo;#`pV-rq+s6w6fR%979fR-8 z?NgVg_+Hgw6cb5|a)2>Kz@;=~MpMJs`3+O~o%_v)L~u96*I; z&R1b7d|U@e`hTDZS-#o}LrNwCz-|j(NOOIIe%_-$_>@QL07Fg^iqL1eM8Gf2lt1bF zP#{_d0PmNMTygh1SrhFO@a9&7XN8g`*&1HHD1speemr-~j_zFW)LI6C)XT}! zNqh`^uUs}DzpsDv7ms8U4Lo*7xd5-z(TKfrS5eui#&Pw@0svC<4-2$}Am$2zj|mG3 z{KrP!z)_&ub0C=mz6Oy1{JqWWDY{v7k+yyYqI?62c+_=Qtjj;o&ytJ7hdB8F|)yG4LlM5uKs#Oo&GB)L3jg}?vo-8{sHE! zIHkLJ@wbc+-@9h75RyY9DF;!HwkyoWZXEmLzo@F(0NLVhZqs=+*x$O`xgP65!-(8y z+zh>y=wu8?;wqG|dT;{tp*i+HYm!Txx1tA`R`m?o0inCCI!d1*OBCGnQUPQMqU9Kk zedhHRQ1ma~iud)oi!!n7W3U~(P7JzQAXQgm^Vra+9BTIBbYhA@Vo;pnOtH8MI>q6q zV9tDWE`-(X*DR}0S<)+#DG9%edHA|qMerR&<3F?xF)Uzs%HmU_~UvZOZOWC#0_dem;S&kjlJO^n8T)rqV)KoOl=hEdBy-2G9S z=Z?YwW_|$sp#?#M1WOh{l6v&u3HHOP z;ucX^n1AwC0;XP+JEaP-Sl!re>s*Wvsn1p1WrZZKa^6jAY-~5_91y0%5v#wT=dGX> z2OQCux5A1JVJVtZ=Bx!4D%=R{?63R?M7UPuCiK%qs;{FeSAOP3N6tzdf=qcmF`s3n z%g@x%9NCDUGY@wz8D{WjXt`B(UWZZe1L+qXjoJHY8Y7#Snj|Ob`3uLAuO(8T$)$8o zVB&(FrS-5u*m~+x>+)7dINsm;S=1Ir7SV~S)SO45A$wo_Pf!L4wInxin+^kL?(srBmB*4aE7rhND@-nvuv`MkbDC@$8R)X^QAuMnc$%;vR;9^=El zQUb|{FWpnHxQQ11#?_ow5rQNu7R5=R-mDgVgbXH#mW-1SDp^s-lpe0D-k0Zkk^o~+ zr;{=n#4c7~GGd)nSEoI0c-T)@!mFjaA!nx(34u)NlEEGd7OoKKYI5SB1Sd`kkv_vk zO%}tI2At(Yf>z?gu=Ul{ums!LXMZ)IvrGqX#tD;1g%nZ4)z|)dv)uFv+nMVEQcwQ9 zc?@wL_r}03AWORAV9ki5w_NGRd63)U&Kp(T(&L+dQ`SW#->9&#I|n`bqg&Elg^2B^ zSU@)vx~spK<+c&&!CZ~WMTim2z!&QH16!Y$kd`55MMZ!pQ`l-!s+~LSh-+tH>MiDS zRyYzAOt8=&0eQARw0gOM@R$_peY=|Sa|WLGD@OYM1^mLyuyAu0N@u3C{jo)7`weUD zz|R%Mw#4=pK&opQ9u`E;z?45O-rez}nE0m+Qns`#ha0a{;t^d2Pj@jWWfLxmt4>32 zXHX>~6OhgNM}C|Yw>okFx{G_kunD9n$k16uJ4JNV`*hh}{JzH;2UZexB;RDb{O7(% zx)XBR1I6xKN<6t63b(YLH3v7x4%fom&dVu9lF%!6s=GIA@PysPEt%~Ic~Q5hIGez2 zmbHeqbqe}|PaZ9MTiX*nncb~84V5z9`ZD9 z&=`8RXhmi>Xc&zz`cI1=n=E8M7JTS$?|eOx;Z^Pjh66{8B}m7&!+WQ+(nJDC%{t8& zkM^U_6g~WPI@FRC2UE$s5})-U6`}-*cQ&}WwZzNu)%BpOX}Eg4BI2%dJwZ?GrxAG-lfEsQj#oZ$LbTFC1x`on4-E2IF1>}(L-P%FU~Tt zjbtNKy_@Pk5MbJ05PSAmLhlw(z*k>dz6Zgc>8{*o!Fn^H>CJS2H>6X~|1tn;Q`H*@ z(v39E4dW+s*>zgZ661nG76nQuCtPIMx<7mlOi#^Cu9R7Pn zQKewF$kTlA#8msR)+E?-=@Fx7H!ue2+v;q|5CFt-?ECc35eL8 zieMc_>v9C(f#WBGk7$C{^qEoIOphOapBO%|h!9*0%&*0sj!{b3D@5W@5l-h8&SC`> ztS65>FvcQ@m$7;PgF{I$=^^?<5j2?rBcbUzqtK)tNa6x`q3o-tJ7unbejLbPg~gx; zK3n82S0@0;?>E^WYlZ~-E%;h)D|e5wLTb$TnXn=X!gNHh@unI5^(l}AnT}|T?5YZ2 z>UUFuW2PkDI}m>!nLXXzL#Y>Pj3Gzhv1cGp_yA9rL#TQzlFkDq<&4gQFd3`7sOkvl z5^+TMd$7*~+;sVtT`isSM_|*Mxuvd@Bm$@e3ym{NE_}U_H~g%nbNHlW%0LH{5gu?g z(uOy(XIA5ubNAw9Yd{99EFLi+DU(V))Hfp*QW=DpE|JC%5l3bKXRxH>1xb zf}P|myD%6EXZRCES_N_>Fp+01zCn{uW8}B-{s}rSb0qhI<`L9YFSA8{)lc%|U|Yeake6Q&ut6Jdu^1g*Rn z-{$rZe^!RXTlGFWy3u$?Gk~KB+-JEH%4DZs=9TZWJ8w*xxqm$A^y^3N`)t`lH7r9+ zE>cZ{{sgPiwcf=bx~_%UGO_9$WYq0j!b)+Xh@Ht^c`cfJ%#NS$@RmPiIp71-) z>6gpn_ehd2#8`)&V&+bKn*punCkLcB{YrW~fj@6WOt5=cyp8eRaSD4pV&?BIe-cM)JI+Acj<;klj%?1!qwpy3_ zC0|w81n%?m{y1VYyK~9xPN3D%h^NJ{5j$AQJ+;sQyadUKVotOR5%$7GRY1n0dp*=+ zhR0}hviF9eg)w?v*AVh+U=NJccVKx}KcIQm+H~Ug`qMW?P_SP`ntK2horX*u0GUT- z4hV;1(77rsYh`urOh2}dKd}X^8z=b-BdPK5e+VF%>Bu5H$ zN<~(Mz^uSeTY#RHb|!@RdoxGxg^B+l`I&2ZSdTk`(jr*zD~@cxKBxer{ainIa3$an z0C>u+H-HykW*or@O6kY-m~pnNE5P>7`kO}up!{?pq*{dY`#CSmYJOmavr5?lJ)e^S z$*LzaJ(<1$zHXf~|c^QfPc7Db~J)X&Vl-rZ+W(V{^`iv96b6 z{x!pG-4Aa0%Xt~Kxr&BUr{J!w?X~x66r5A#VUNx<+r||}_n&xRvIGBbezE@Vf#=*L zn4xa8QGM zn`D~y#?(!0&vUNNEsOh5RsIKitG=Ybg0e;|z!E(LH&^9{`VJT!^kL9v+2_xvxp z6nqJrLG*yl5VqqV7PX1vH8?xwQBqcx3f^uNx(wP<@8X0BUN>-s9vEvM_$_yT*e-}d zSqUw6hC%z`k(=(AoGRcLCD=&bT+i&O1?t)Th9R!CY?`sdKhxNdFruV>4)~!$wS93=|fT8pZ2L@h9Wf-pZv2{Gz@PjAHFNtK`%+U#l)@%kB}yAfguY081+tymfiH;I41Q;vcXn z`a{ST&CySUt;^$hx>LwcmtME5lx`0mc9&jgqpTCgY>LW6Mw-5o-oJ24H4=*OT=-eDc3au`q z7QM;E=tsKcokpi99UQ$$eM%}vuiqJly0f+7Q!7PdEn?2OHT*`iEcPBKrw}?1A(oxg zkZjwEf8;t_q$4nwfmGm@L&rxiWgATLAf)IfCPCSUwxfd2x0 zX^YxhDidZA7PJk1w3yX399T?4JK_*`DD`?S3iv)K$zm4h9N-Dgu9A*U(?|MQ39I>8 zd7G}ilC&(OKMB;mw+V36EfE=YjRgM3TRZF`!?fX`cFFf$L)!dZidUgGjj&;Or~>)m zjrJZ)-e8aa74 zSuyBv$zES;%xpq9wOM_GU-@09@LF2IUH+>*>ApJZNZ6e7^j#6l~s5g8ov0hQktGonLas&qjV|;PQIK8nc3Kx-T#q62`QyKySyUV-YY$A zjACyn&()g{BcEJrfD85R<6HCY6WK=$4Z;jxW+$$Vf50#;${e!RC+?_#XWxGJ5WThz zxo6$&^+O9NiEh@lSuBT3I+WBL*tZ4Hzw0)_H(F8fv(R@haw>ycJDomZZ{V#LpSIo~ z#d320nOk7j=N<^0ga@PEIJp!2GbgOEvX>tg&-lXx3nD1a$6@YXx_15ZL5b8_CS@JC zgj{a{pB~xry;$d5bI-?{r0rR^sa+KAGpD4T=cTmyf4NMrZ5;SbI=X>y)9P#7|~$T z%hRcoQpJM^nDXL0YvN_-QJ<6Ia+r?6ux^&?`$4}%r&3YKhe4Bx_pm$ML6b`xj6Srj zf8u-8``vf9J2P?xBjR~czvl1TXW+APA)K)O+(*a$Du&VYC#{)7>!%N`k6=@LUawq8U4=_pb!D(0{v>UsH{P+4 z+AlxmQ-X+|kralcJlFIdT!54QEJ{)Ig3p$k6x^SFtH7&cY-wp_3M=gfqE0iVPE&Oj z-maPQPE&sA6;ANU%4zM4*r@uB!_(QV6%1Lw$tIc-b|wmo6MwRDTuc6=AIKH2o7dJ7 z;Ni|nAN!ad_>oQ4oH?Tt|MlaQEUVU}z7Mu%X(4$`%Tml;% z_*HB(Qc9gDsw&bP-rCi=@7$e~uM2U~Sq9v5-riB?l&c~LhMnn8AHpB3u7k};x(p_a zq#gSk99!X+lfq!%8?+M7nd}eTfF#MGmQO~PvuHaAODCXStJ?G67QrSgwC3fTggtQqOs= zl=o*^FPI6`Yczaiv?SVA=kwY4?dVe&+vA3r3l_}C&mBK!hI5ZvyXKA6y0tUgwB5FA zWKI59%YGWS=n?4%Gw`e_>)KQOm3C8-1+-+!#eenfw#>U@vEM2%`zi7FX8l?3NPi&r z>>m9|MWziPmuYi{vGq3`@hX z&Is)JB2S#z=WUQ|8j7+@^3qayqV9eEJ-)c#>No@6u&5MzKtD-w3N@pjI#rCnek9ZO z&dfGgCi_BUU@?BvLB!aBGN?Z4#KPVagyU~bOEz~c+S0%zBMwIow>`YC+c%UI2CmIDn3%hA_fgd9*xyb|`j6~gKWkUw20uUg@l(j4H$_?J zEVCQ#Y{zOH4pxls_FH&<%bTL>b`wih?l}tiGxotM1C7BiQmkCE!nDK+8PuP?n1Q*r z?mWU|%j^wWox}zg+sh>6jyIM&){+Yo5g*&M&PLs}`$?HYbHBFU9hc!U1#5Msd9|`guOE80vMMC*A?MEg@g9DR85BT_w-ZgoCiN-X(KciS`%e5~d zFFx+0mHz771}M)^d&^`=G{sLbC@w*@=QNuD&zF4(Mz}A~d*1;c=@l`mT@WPoetAy0 zSpeV7Gq=W>d9RE0k@obU>=R6D=!zq4slr_jCOh%B_XHxEkEKMJPNfRJ*J{5qzK^!( zEfmiGSNjps*WT`$FLdq_s=X@Cq>U1{*DCU!&@f<`)j7QX8#zvmIR5Tl#c4J^~qLP9$Y(G{3fLotJJ95VVjC!zPn*~A46I7jJ{P#Qkj2D z6)rW>eiSaXFEJ8jA05MdKIfIYa-q;!#h{=ptOs1{Q%6#bBc=1N`Oa_QyP)4#5+L6m z{jnff>y0eqo$MQ-fs|FJvEEw8e4zAKR)Jp3fUvdtv-*Q%&ir9K-6EzUtm3c_WEJBW zc)NNxbK!9xs+SOSVwwH4#MbdnEJ-$MC2vO$`mGp5k*61s+CYGo8OdO}+$4&Zu!v(~ zFnYS?90J@?(=V852++SJg&RkcAACD9T^j`l3gssdXe zgs-qh$!v^p9$^X@-rLyz&?}rmZktc1DKn|y|;N?H@4 zMilDYzHNw`ms%0#f%Du z&L!jGvy*bYcMm~V{pfSv2~_=?7h#3?Vcsz#(VRiw!bbcMZ>fRwKH^B;`Z7nr$R%y_ zQnx8zJrA6gR#)RQIv5P{nlEa95cD*wSv~&J6qfz3^=$%QtYs{TGWLTiFA=*LO}rI> zy!Dp9)=Pgt#$TNX7i2(&2VvSnUd=%9<2}IKE%B(^2;M;&^qn6x>})N}|9Cr)*(!H{ z5+zk_BpmiQqr+-C0Wj`~y31JLW+aA;E{dTQ_iD~<2&G%O$ObKVfY!92im}4AilY6? zCUTNE_*Ps~Ua^_&!e3`WU*#k)44CyaYd~l0j^6&Di(^3nK>7R%IS&V-!N|-JMQ13V z-!=ANqd4N_H5-~{(^)zqoh;v`{)+yWGj2u-TEJup(4yMGY06ukiQB_uN}K`=ZBhGH zuciBgfCA6R*SE>k74;)+9;B620IF?!vz5Zfki*b%_#DE5txF;&(@Xr@6m}|i7whZI z0Rg7Db*yWjU)UuqF2qSmVBTi#q0FZjA5Y#qS+aPdWVJO$ccCx|jQR%rhxii2AWJHw zbV~C(IjR}wg=kq?Vcnic)a*>H;`AX4e;-?IarDtp;beOD8H0U_QD9gOBfG6zawV~^i&$>M< zk0YsKqZ=w12!HcGePF$3Vy+D${G%nn$Sh^$7a^O6KrXF~>Zkat#6WK{+h!ZP$|p9TfxjteF8X8VKrRo)U#o$$6}-5#{G&K}YDvAJRcSn(Qr zHubExY}fnoFoJcX1KmXqkKezX^K{BreBr@B?i9n-C%@eQWnhxivT|M;Af)c zmWvRc2N`dlLe-U8@e36&S0>SNiGE^z8cpBd{3T+=z1W4Bi3M5-Z%(W)W2fz8nKkxP&51Z9EgNTOw^o_XkO#e54Su;t__jbRSP)7eo06ui7|sZ!_fs zv2FAohQ2C@He`VhCFB*4F2R9*dmz1;2>zxXcsV2g-L<{x+kL;rsN(vKW42m}JApij z)6vvLQuTbxE#ym*HPZnvs*7+pBak=oHihE#NN?roJz|KQLOGU^x6W%RE4%Di?`BtF zE3*};Hv=d{%m4|zem9T5b*feHK;4YSLr1oFvwjlk9lJx{b@IHngpQWzCGUTrR$H-d zTA*;sqQ4{xRLz{&QBo-KRF~+ZSd&dSNGDqH;5eGErYRA?ergb~VOJ znD=gs1rc2@D#yZ&tS*;G55sfLfDK^FLZKf5{(KS^XSn|GLcOd_?_d|PurT}v2-WZtj%)4vsd#(vB1t>V)* zl8Zda;TkWiv2FT+!(XB`1L>=-0roNiC*}~QY*T#6V%lVAjaor!Hdr9cc|hq4rl$G@ zXDH;I&B}6R0WeU14T`*W!Y>iNvUQx-PTPSXlM$+tk;ef|mDJM7kp)F_O8gI*j7xXm zG0hqtb>H;X+tnK{sZs&WPEzlJXD#7iyBG3ovC3UQ_vvr*=f3ldvF14v@)n5^soXl; ziko22v@_&W6KC^u3#J!ePTuTRy7&#_Ot1g^v2A^z!w{Aj_4D2Vp!@Z)k7l-;$%d?4 zE;-Ikd=zXdAKhn_5%q#VbSe2EXnn?yVEk9l>R zvwSWQtY)+&wN9?3iQfqni2DN)3os^Sl#8+h_Z>G>fy zjUPJ#POc3d(@J$SScfE6+T2H@HhLVm9RE=3M{=gy9qjgPBs)aGnML65V)!x{q<37O ze=mP!sZHHZBP!mgW@p9bAzmruw8i_zb^Ov8DjWY-u9EXZB^uj5Ewj#hWHLF#Z0pXR z_AA@^sf?*pJtamw!HU@H$R(BuYiCLjbCUnP zXWs9<`AIb623x-10Bqk?jg!)G+kRQfY^_~LgJ~pAoW9apIj&#*h;;R{G&3>H^rq3$ zo7jJ@d;K#W^N&LnEX9Cs>5`SXVdt_RXCY>>R#Kk$A~EXcJs&Hh~J-o z-MNVhM65*bm1tBipTY2-DB`FAzj#o_%@jmP=d{bj6V#bys(o*-i|i*Hvt0SO_#v9X zKVy65DqJHSS8nbd=hb9X_>3B@MKbY)>Idn>^Jk|;@C=+ z@|MzOa2?S;c>qmBjJ{?RpH{-A^D=Q4W7%l_2aVSt(Q6IW4bvOKHPC$Jh9rei-L&d^muy9d4fG0Y`ZWxj7X z`+P9puYYuqD{oDo@MbPyYFX*7BcjF)s{Zut9~4nPzRmLMjVQQU*ZIP}Mo00%e*LL= zo3y4+JN3WqoEp|*&INt6$Hu*TX=$;poIjMAaYuFmqbUS~Dw!O2k_e>ZPW|7({5na3 zo_Vr1OMM$S`<^7P-`eV65bnL@0^`w?-TaBdd8f7(bbkDl#crDFJJcZc?1jBj5ADd+!CMPFL~a?CzH%EvqOM(vyBOVTh9J---{zY)?e^ zVYVE}ytRP&;&;oce(7$|MwOHd8m={}1)OSG)UNkGnwhg8bJfWBs{Umjf8ysWzW*9u zCHZG8etwkIiOifkSOh2+<$dcrJXrs;?{EVOrLOu_A5@(%z2+TuA!O?9^w=s1`}n!{ zn6L{Z%?3-ybs}wWv8vZSuun~)0#L9*{`>Ju*6^+_K*IJlAVF~^yfcfh(@DN3znHTC zi@4g=0g431zd`So1E7oU1E7njYfw_1j(kNL=!k2!=0AFBj;ww>`}hS`6hrCGR~OBC zL|z~e?)`Q5Gw}_`=MHz@3fa@6W_r(x`0e5;mKq_ayaO1x;e2;9D&_3ou|?!l9GD%qm+vCUc(>GP5cZL@7Y-+_ybheKfA{Mk&^sE zWD+$%`?iE}%c8g5)X=EA`xYs+Y2@3j>0qOTju-asvX+w(e)uJoFYIIDY?;IeKW`gm z$%%c!;K~i5-?zspOkyN)9d}<&cZ9XQu$LCJ+-2;&&^60ACc@9czr6+x+&t_I@|NdfkuUxCp27cv$aMYrB*H>f2}qgP3Od19wzb_2>+Ki?%%l(i zGi??_8-RRgUI10cg4x@vOi<^(=-m+0+i_~qwtte}C6x)PB1OtdRgZ7GZfri1+22TZI|)x|M;+A6DFD(gP{*H3-PM4H{@YV-ls zt-SHd686h}*Zq@4P))@9>7YvQ3GoZ?ZsX+Lur~)(-)<=n$pQPF`-AZQcGwEW%lj3z z@e4&RSvOw1ykFE8(xxgFO?3PIK)if;|DRub+rsxnrN3BEcc+Z^wR3d@nCefjz;r15 zxj?LnbLp>M-XEy97fxS`YZ|S3*?#={E1r0tP@KpFg5w-(naa|4sZ zL{)zq9JeMCBK(^FRMQMZ((;H;%Q-S|okD?YX?wGA42&2r0(7RNT=?CpB%`!dqkok< z)Yc0enI^Wic>}x38?N~)G23(MdGt=G2YgLf3V>2XmB01gyytcB_v^CW(bK)n9vdf9 z)rl*kPa;0mxW@s0LMuJj6+B6JdEYnr<$WwdzFp7#c-^|?zA@IWb!WT&sfhS=duf&9 z&;5xJer2M6OV$-o$uE~+D?%#>D?p1SOuQ$TbH}{>Qd-H(yj;^4n1!E9ri?FqQtQN{ zo^&u_r=GPFy)T%*;C?vaejHP}2#|m9#Qd)oOp1N4=79m!?=O!STAnDMuvb;;8Pp#( zvRyu``{{F#xQu?i7>FZby=!4f{V%KD8>TJ{+vUrA>(`GMUUUm~Vty4|0M?-*3)l`! z-xZ*~RbToJ!-%X)SDdd@zfe!I+61_Zek&3lU+*tjx916#3Ak6c@d5?{(1d8_>gy2<9=mz7yYNeugh)x#Vyo?FS+jt7{X}5F$1j1)xxZtikjq_h z{CrkrIq!OU#sW4cQfA z%@WyVAF}VV4TBjZBub1TYY{P7(v&6H_jSySy^=js5s7RgWi7HMe)bT)GyT8s`JU(A zJLjJLyyxA|Id}Hoe;O% z^Pk)V%>`cQ+5)m6nNc>u?By5#^yBM%gK-pKj0sbo>pA%mO2x;QujV6!*ss&xYI$x# zo(7$|Dh$MmhSqW!t!e1i&~`Coj}cB7Dj*fvmQYu${GMxQsi769R~yz=+Qjh-zhbdZQYU#B_L+BW#7gW>b0@# ze9WoHJm=`0m)z61!2GlAjLH!hYw;V##WP!1f)o&9Ai22lA(*`pAkJi;`S*)AwQOxG z{~YNHdc04mGjMnDY^T3YJ4;xVj*Wtmknh0Ar<8%90pWI*qp@(`H;kz`?e%-2-|s z8UFR4g*SB33D=>_}<%3g_Z)rDv6)U?hWA z-WKXeZ00I5{vH5G+03^6_nW6^2Lq^b{Ti5xHZjVeKYuF}d8G%y{Zs4m;(!pR&I*+? zmeSXPA<(aOg@p5g?*SY;uAVI2=(#PM;`{-$rExxHRf$hBl&*imv!r$bWQ<(h1ie8$ z0$JDnb=>HqS9->jXRlKznSvGjvHyYb9bf-OH8Bi;v}BV3ty>HRo%rN`+vwJ>4P`1> zMUuy%7@F@007lI%jY9_*%;Vh$0A%f6AlIf-tKLMdc;iC= z`5F00#*Wc{uv?oDm;V>1Vt)W;qvF;97}{2Sr153AW>!A3rCGg=FsltgRH^4|zf@^0|gDhH~ zH#KOb+;p7)45p=UCN-+sc_LNiK?{ZBC)B*$i`G`aJ4%xEd^tCKt8ahQ2zND~l!wN4 zeF2>yj5oX%U+)S5oVV30pQ2)<27S^Rd;N1HG#}nM4tki}pz>Hw9>n||`+W1t!E@k1 z{>utL|7Md52%Yr(B%{vD8-VpghV&(gr3v>%QWL()Z(b}_D%QOvO9RwKVK;m>xz~S zpr_xs0y6uEhGqjEtx~?w6?;ILm`ckrQ04j<$mf5r3Oolsf{32I9F*|S%Y`$;rD_43 zYO{d58P&YArC`JoinHM<7?TeAbjUl3SUYI|iMrjF|8?CF7SKu&gI@s7Xjs+*<@qA5 zwQ&weo6&cm%-Ktj`Cp0Y#Tw9>P2DJHt=;eNPl=>+of6{RF}X}1Lk^Cizr zN@q`H0xZ2*MiDs&vHO6U)~p{Gv+9D@r>8!G3^(&AkxLgkfXrTpaidPE2K<)?Do@}1 z{(uC}+LI@0iuPJ|{wvv>7y($tUx(?PE1Qf@+9+6o0WnALKY%F+rv3}w)14K%2=I#U zx%SOMlwj*mKDvg-Qgc9SlBC|$?f`PwzzMKJDu+6y;x^9om#@Va+vi0j#pj=)4{tZNH?5~2(I0x(k ze2g&y&%Er^_SfQLAw6yrsRQq?14_A64GOB7eG#A5*O^E?e8@k`g5+$pgkGx$#Cmh= zCIHXn@0Y<~Bv62c+awG3Pv3O_6f9Y-CO54va^lq2TkIoarV^=)^va_bX z0qu^Ii@lzIbdmP>mSr*^-LVlXh1oV>y|vxV6Vi*+_;j@Q@xrfq<)0C~uaYl1zRnQ8 z*;-b8@)AGZX0M zgl3(ax1Kll&8giv_CNZ`+S9cEe6MJZJ^*!ftUDusl}cyEMt)duk>=`3USXT<*_#hG zBUb|s?#?G2RGAar7hW`P8~O8*Pb%QAr2oQ)`og@((_2SBJ*<`XB-ej_$Scf~gTCYz z*Q*$b&i?G2cDyJVP&O+$Hk-In=yFHK>w<+J4!8vG4n;-j&)ahf{iC_S!88 zlKq8k?OgvHhP#C>ZW7}UHVa(Id(RtrO4n>^VmLz*B=ZZ~Xu14lA0Hb*H>|fZH-nrv zp362ExBn&v4oap}()TwuIZ$RJzc&1fN(CRFy|GBw)aXho*^Jd4U_7bBQ&CWbm;}N_M(JMU>|kCOX@xv z#VtwoKiwHAo|<=b;m3K$k(>TM!Ev>}jE+4@45V9BFR85BjW%ukFCAwj^eDlT!>F~w zJ5Omy+*zodzWe8SYKo^sG-KX??`GE90S0%sBmXEvc2M^NtvkBxccO&8*9d%kZSd#{kK^CMeCsid}CH(kV81g&Zj_w~Z# zzKMzf_1`q>U_0>dmB>87qx@T!q8@=Ab7=Pxf9UP9(HyP1i+$tYvu8Q8f zOlqg=oX#NaTY){J0WZWsyBD{pwJT`v3UWm8bI9h<-u$>zUy}Xi*oXdasED1_${{7vIR^bRX#m|CbmYJ~b3{b&d*FNlVWB zJT$Su2R5_+9q1y@6kgKvZvx|?LCZ1V!6zm@1oAiiavpegv3wwzZBSMZoOOUW8e|D7?Hn>@yg{G| ze8dg?D+I>FS$DVS_?!OGOU%Jd+LsxueI}v3cadPwBN8dX4FuXi%eHf6FT{9^g{ z`l}%c99;;YpA3RyP(OmplKJ!BWvc$+WXhfj-9I^aM z4YG}38pO!yzXabAGp2@}(5!4h$cxN_j&k~2#nA^5)Di16uQ)6_^!${-`Iwby$bWd| z?~<9cdy+*APV`?T5H|8f1uptJ8r1RuG&=)yp~Lf++HBed#S!*!eNV;p{f4vl{<(}~ z8E~eng-%uY%y)45kJhS)K8tD(h8cHe1B5U+Mu+xgB)>f~XxBsiMyseig;enD7HOKA zwU2I_?}gE{tWES@F6GD&IJ?$RMAuZyNX|Sn$k{_)1T|-#!7GR(u38kmNz{XIKg)}npZa909r@D_8YP2{Fl_Le2ngHS|By6 z^kgmC+J`Enj>?PVxxH`8az}w0R!Oz{`rlErRVT*iRw!%4-RPT8(sTxu*JvqK6kT8X zC2D|H)eyx>Au3_HGYN~-Ntda%)~T1$=s}czwQ_X61vOcQ_A7ylbUX|9q5>yR7((?R ziWS1qYra&I@2D2G#iCW%?}*TT*QY08Sitc-fK60E2h`+Y+QCTHB3)rBM-{3XFDh6R zgIA>>{=ODsFEskfQnWRJc59ri&sPgk5dz*x5%sj%`g#W!J27ES3>WXS{rBr^mP$x8 z^CFdhKZd`EcJczliaXnXRcCu<1Syxg&h`--!@_6n==+S{6*N-(HB$us-z5x=6J1o4 zoTqx!P4y;`S_MwOs;uaqiJ`7>!$St84>aKM0o!>u*nb3H}7`gCBT&T#7GF+-K#^f4qu_7SK?>igfVOsX{p z^?S!Oxh;1#gzrRJkzR~xbB5g%lz8gu9%3-3@E=~9Eec~BFDj=oxpBB6zL_1t$v2CllxxSNNec7*F%6t;LSj?S7!VO(`E zyWorSFAV8-WJE_}i#tex4V9pXbFZFz%yhjG>DZt#H)>`2gPyy@p^YB8ml(h*U9LOD2za_LDgvFb_dA>)^1tNw$JXQ zBY(hiv6$o2Pnx5X1PD3cx#j(1T8Cef$F#T__#z|Qynlj!0gZS=ukFj|Jo?zkWAB$mqonCzbtZ*ZRjDj}y%Xn5w!EiY6avuAA% zZ;H=EVde#}C)D=OQX(#Wzv{mKF6o5YX#Fc8NN&vHfT8b>=bQ>o`!xw|o)|^4I(L4J zq50%c33MRdWu!bc_mB{me$2qqKF933y+;fo9a9@I{%mKdP+Ys#qZIJy9JKTH3Q|9I z5aNY}v-2u1dznF)`&bOL-Fr5fEV}&&k90w6)SqaK=u=tX_b}P-f+ve;xc7TYqe$cc zX0KbG80nibncq*C<;LcZ8LZ;!KO=Cn{7C7x!0OH@5`q+{i{}W$hjtaCw-*i5-vz0w zh+|Kf`|hO#jSe$JVUnG{9tzhvTh0k9{xtZE>1|t74Bor=zAsx|QH9t}B9M9IMjoh5&U3b}e(T-<5C7e8Tchp`-kp=^D*_oWwus3w4 z5%8*J1Y;nk*gjzN$vglT&(WmUNDlI^Ld{IMHOEcxs7OYES-_Tzg328OnsR*$jC%r z{sX{TdMEYtB$koLafZV)98)~Uja-%x5jvvrv|%yX=DLA?h)s@ZNj_H%{xm0_$@|?Q zwNYk@k?N0U3f%h)w;q{yvv>f|1y4Q=gp(Bqcsr%f?r(Mi6caEkn)@Q$c?*p_7~|Th zC1mG9yyOqwAmVOdii0AGhv8Ry%6ND+p$wvas;Ix~wD2MIE@>C{6_kGeSD}?N{5{#b z`VIX;Qitos)+Y9!U!C)^S63yCr|AEoF@jgs@SjI5d60*>v%ZOQ2_5>P~gZCpW{5NG(`OUI**ZC$-B+3nw!)a7>L`Uw7L9w^HuOW{-5@Z{ zH>4Ebl2>6oye-L(TGVdh9Sypmv`V?$S>fGCV?9KB3BQMdgHdxZv`q39Y4EqhptqH6 zrx*IiI*n%qP02CJpgh+iq3G(M?g#{@JW{qc7wf#uY^9^58f1@*DL;e0r=a+A>x_yI zUcuEM%*Wg2fW}@zaPZDNjnU#oe5)va(+P1GQqJK_ZHwdP-5j>QTwr9}0>KsV&em~_ zmMA>pGUVY^=6K|!Zu0S%YxMA{`_g!@H~ovV9!pU1YNV;Fp=pCG%NYmx7%BT3WY=qh ze{A_~gqb!+#mFfT7&9PVR+@U=r$qIZ&Pq09-^36klZNfQ|}i}(wR5vT6U z5q1OYly7Mu>ZL(Q?Uky$fb&|aPG6Ow+Wc{DODzBJ!@iOTp$23a=7|OrqO|=&BbZFXPsko`th~p(B%rtL4*Zw_M=L6UTU?ZnVRCxdG9_iw z0*U_|ps!sFiLdD|@@tI#X{RhwK2fH*yi9iekv4Cezumsbhgt;@%vSB5360I9KEybU z(U=5muY*L^N}_G|TnP;#zMCC%3bJEehr}Do#o(rfMOJ2Li~{0pH4+Raze3{u)MJ|J znftT@B2x0c)2MXceyOw|sGt}$IUA#DI2+@nZeT9b$duOS*gbWCkU}62ed1IXeTy z*$i*IT@&dmr+p?z$ZfTBeQwpt|LCSg+|B&%gW7Ow*plJ;haYkZ&(cAxBDK8-K^yi4 z;_4mehH_|H zUj$2g5pQ_yPgZLCOoV>;wt@#H`kbj5B30GEe7G&firPM7k>#Z{m?0X`ZaKhm&ZgdC zsW@X+VFuxNUS_8)xHa6brH)S9x*XJYDt#VjTLAm4Mu8{#Z?FCK2dnIt07`Z72RzvGwU~o~(m=gZNn*`wGAeFLssQ#a>#6L$~=olEaK#;~+RI5W1ik?1;#f z1@ylB5FjE;{@g=v4!0DmdPjrBrlK!6`@RzhPL92#{DR_*Fml6XWVSlN>y}{xH(=Q@FSC7tWI7FgtivYz9{t z5Qot{SmvkgOkQ87q_53G;wSaWquNM_Rc>VcW4l{!?o#fIM63y%Q3EFaibU3k|FRf< z{^!=i-W-~o|8|Seh6WlV>ijVg+K`Jxny)g^&KqekAZ2|HmbPGuVoJ2|dn#kV zpAO?opF~)$<>w3pm11#ZW$KEBEpFcX9xI{X)wJA`z6-i*;8OLES9$2#)^BmaOuyNJ zZ@Za20%Fkj`S|N=JVeF|iaRn=g?Ed;)kC~e1xmfb05x|b4E!;KyH?F7%o|hOS;Yo& zia?M|`I%Oi)*ESz&~C`CA})_SROFO+9o~HMliDUU_6B z#aEM}fMi=!aY&jG#$(sn0 zGICXo=S5rb!*`ek18yL!X0D#%)$BHkb4q&<$EsQg$SI&SH5k2L%xavZWWoEMpZ}qg z`%+EOb&03rw9P;X@=X8&j9eLgQEvAYG^MG8P(>gdHk}I*@+H!KOZonV#%QfDRln{b zpaw9LA=w0Y=@%G(L(LFV$uR{WIS2PRcKk8tZaO2sA91N?-L+~^dxBk(mQJRK>aJTB z*!QW(Rnw1FPIhBncHg4x@(e9lJuunDuORUjDdtLsc-LIh>P{E;Rg_}T39}X7sjgGS zUy|e%Z-{UOh!HlOG(*utf{SWCIopW00-S_F7v zSf5S2j^;MF0MyEdO!W^fL}*h_y)4S}LFg(JG5RydtU$@{t_I0uhN5)`q!oT6uZ>Id z#~PJ%n0_qJve!*cwN$Dg)>|ijxY#ujjCET^mJSlaA?0UZlF~4UIF5>yZtGE5eD&P! zD?eUZOj%LlaEp?~FE0uo-H2szc5NUb0zHwdUR)z&5vYR-7U@nI_c1^S88)sugrSKk zBNX(_iq#og4`}J%8}gJA`rQQHfb-K|C@l-D{wWhv;tGuK)d2Y^cIv6L+Wwvr|2cNv z{d?@ZO3MsSBib0A8XGeAEe+|pca{k&DhD1$6YSq^ZwV;|0`%nkpzD5qK9WQh?|gbs z$9-i^>DnqSZdysK`V|STqcnnvpd=}7b7x6!=~9we+8KZ_i2vF~dW@{+&U(Bg46s*} zk-w7`_s}ptV>g;G_rco$WEE7QwLdnXNnqzaxVL9#W7XB2$;S{0(5DsHTu8*dZ0;i( zm4<$Xr-~<_3P(jTH|9R1r?4WJJMS&!ojC@pd~7V!xs;Se8vA;IGPnI`Lh_|Jr%a}L zc@>irN;7z?3yMZD_W-OFTb$T|?083uxO1 zM*laY-E-|j4rnup&$Nd|?nKI zi?(R9MkDA+H)u03~Qz zx^9>uEU%cZuQuwwTqb{Dyc?tK4)~(-h?fJGp1VvJz1IL8f}&~1=cAcc(wZPHC>@mUm2n}k_`0QY#+g%Z0^$NZOYK& z!?3pc;iQy91#Gb+Qr;EWd*$h?VcK}naPRkI8v9bEE~(gmh~t|MMw~9Yz=Xst``sYV&CNA$ysBQ&8H~V1C$~(er$|;fhCV*t1$< z@$q-*=Z^{2;hLSN%+Y9-{FY?t(T*~-q4{WRYHFD|@oQSz3lFGEtGIC15PZWC3h(!Kvn#e_m zI>m@~)5IH^A;JxZ5Hx(qIC1>txT35R10}KEl zuBwpUzmnAkRQr)j3r6?DI$L!#GZeeOj?`R8i%7S{G}?Ohn@Ugdca^GJyy?Y%!P%Z^ zF}(pd-LXo{$yBp29Ft0F6vXrSBJ~FFi4vwtxWwMATT-;eXUs~Sb4>%<5-mg$`F+)7 z1XW}hl!%XSq{(O4wgB}{BqQyxqQ%p+zf52>RE7B43wgH>pB-EZ%5mjV3R#Hs6MRQR z>XD@_p7gN#H3nNJo-B=S=Dxf+h?nj(jfzGOu*n`STh6c#3te%S_|J`EyaHv{izegH zVEHQ$xH@F5c>XwMzzP%IwUE*nF#mhO(}saP?JXp$f<{u>yn)rop~1^GW-HfRMCuz7 zIg*9akS6r46qLf^i|Q93xLHrB!wz9GaHg$<#$@4`t(qmgl_{c{VHp^FA-4_R1ps5J zn+H9lpcpJ8k8=2$5JwZghGmu>o?>R~z90{H*Nb;?f4cV!{{nlgq@Ou)QeF{xw-vE| z;)XZr0Nr3!sjMTB8yFjwK;wS2=^_d!&X$xn6EsGbN6IbKGi9b+60|}0v~XBBk4HIZ zmC>MT8-kNBE_rC^olOFYhaq&^&oFzre8n%5*y@@91RR24(+<*Z3Eh@Q3AH{bYNbhS zY31>Vl>@v~g!qxhUMP09&c*xaEpB+wH2|M8xGzGh!8Q8RCElzN7{8%K^@$KLilE~2 zNBS`m%q$SON5s~AqkK5B~+wG#vEq z(?QlRBf4-#qp{Yuy6nzTbtFXGJQq~hzC4$cw{InA4n#Q18++bL`35pl8r`McG?pO?~y9JiA*pV8fHTc z3J}-SxOjZ!$>zdDEG*^v9F39C^`Z+9W)|0NqjbOc96H&wu6Uoiw?2$tSi*Y>oy zetG3QYq{bM*tLbaQ96{~`N6$MvyLq3N9-^~SjqzM6fJ)}KW`w?oTf!S{{`{wgzm;L zQeJ1U<%1URBAUqqCDJ9F(uh^|E2FsO;`rfsehUE^b79LRK_j4w^0vt4m-zx3wY@hxPC&6?d-}=xa8HRee8t=S4m1b_=(2qms!r@$M zus>raT~Nq;7<}0S)+O{SmMI*bI0P$yGRk#>7-JzKU4UQ+Ns7VB;!Aw&x5D73Q*u&k z(L}qi^oh4$**50dmJ6VDYo#@9Y(pALI*XXbAG{)^%#Sj-=9-L7Vb8?KprxwuOqPO6 zXNa^r23TSpSJy2W>^CH>65JP`td4kfIZgkbtp@_OAxqa(99^CRxca#=ewk#H(dkHA z&tMaj6A`fGejq3;WrJMRV^fTX0Hl^KdofDRYZ@4e8VQWnY=hKXOUJv@#%xG7=~U zGqltNY4aSb6(qvQ$DFnNhGsCM?TDZGsB9|H@jR;53_X5<5N=|(gDvZ2TBde2w2suK z)Jc>u-;jNnDxJi>8Ma}tcu~##lKeqY;BwLV;200t&bYQ<7b#yR^rO3HdpCiVT(klW z5cv>{*unCy2(s_U(2FKBz`W0-Sp^_sBn(({i~)&)%HkisE24)#l$kQN<%zVdcsQ;I zrAVYKY@q=`@+nk|ITz&KW=rABy@>Vl8sj!89SD8AS;K1}G;=UX#gF zpreSVDMhB9c_ld)VL@|gUlOAbFWwKn(_!CJCVK2F18Mk4!NafIYs!#q&w3%d0eWNT58#GtJ|r?UlAw zLoKG?hB+sp#TLc+?BO27U{B=o2R2pLYiTZ6)({z~f)raQw{LHmK+Zf29omNgYAROPO2I7#=Pg3$3kn|YDd4*Cb zds70VfJwG8x;R@S#1R4IE?t3oL8hRl^TT9Bj=`_DpBX4F#f@R+zO#)$9<4*Xk|uzM z>377SH85axg^U+312x?sxZt1rS*3nrUqq)E;^mYAcpla$TNT-*DNM;D(M-8DgpKuq zLvuX#o*_k+;U!*?kO`2XFre-O*YEQfikK3i8QupsjY`}y#LKLa8EEnds4s@V!944c z&+egiK@qUAUZB8L&=5T?D2~kQ2%iVmgB37N33Cf%!kvGrVG~V`l#6@sB45bl)7~u+ zSJ2r!f^DM!azdL&Gz>T_CgoLKDAr}`KbPj-MjQ^fzI+(-nOPm>feEC5Qf*IRnV_-n zP9%PCODMi8|7yVxLzwstRstZnB!RMw*A(?=Ga_}CO(fX8vARvDA!`vii}GF@VPwY{z+rcqch6Tj1>OKeItzGvIDfSGCBG1V3?v1dSbii^F6{m8KBhQ+@87D2Mo%&Jgu%|i z#a-%959#;=;TmT&y2Oqu)#LI!Ky;k|gMc0NSC6av@GO|G&<|_H(Fy%Gi;DhZN!t{{ zra!=A_b|o++`v18%-+-2a^ePl8lrbN7W8XqTmO?QcNUYANIURV6YC$z*!gS-3nO`_E|}RsbG_CGzJ$=`_+Oq+&#)v{|nwRujr~axWE36!1@; z+ylTqKfeX|p?Pn%oogI`F@UP1NXsEz8Cn^c_yEs;^oOCHslr3udmSit8VTwf41~R>0K6eK$8OQb!nlHYc1RsYH$+y( z;KJdQXi7t_L*#=P+$+DF6&MW0K1|j&lMK0SccB>PY$%9ed_i!tw`Uf}$#GvU`m6+d zJ3Kf(1i`Vyg3P17X!Kwi0nPzNGF}Y51;231n+P&|{t6Vpa~3Sb{^A!jqYTnSb~~hS z8J;ntx2>wduzwgTmB1?Ifzjn(FES4acBrW zC;}g3<)b#LPcXD~jpOglW;3>wMXTcCHT{eP)zNzaz`sVMxRD60CH!(GFemVmmD4Ou zd}|kyZFQjsxZ8L$Zw2o{f2I`qdu&zX%fIYD*qKuPLYrypBt}2}Lnd^K(ly)j|1Q{P`)o zU5i2DyAo4R>>1c6_RV4QhS=2cANgtc%Xay>e~acagvtL|qbE$=dX5&$lLTOIQ^C0H zIOWV?^{J`XEYXRV0MN^v4b4ORQu$RsVhpRw;za_BWE|K!ubC5FpCMaC4-IQeq{ob_ zG1f%()U;hEJKv(`D>3KA(HZ2~XJy>U=SLYnmaxP+)8>==;C6@Q&&Rz}kul-~T{Als zb@Sy`@zG{;^n!%+kESwBb!-l zdv@)(vW(XA}*U)f03qoz`0q|$@hb@F~dU4#2`+xW=_+w06kbMdx);0Nj^T4jsTsH7YhKQf$X51-{$zgbGwe+tB82cIIhTg+oE9tk@Md}CHv6_a@jv55&iE)1(y6$4bWS4Ydnzxdd4oBT>tgx( zLfV^L;e`El29IN{2K{b=j=FVq>9-TYT^8{aU8IXab?F9%Dcm}wI|6T(u#&Wocs7W5 z#xW`wMATX!pU>FS2f`&u1NL}6O*G$LHmVIz%H_`rM7#GA0IQY3$R(I9ngDGWTo5^P zzEd#8c_hQ|b7c;TmCw&DM1V?^{5}PmKi)S-R!p|f4a)-|>d|B!JUBWL4jGjSM%R4I zXY!<|PGxI(Xs#A}w{iTO7e~iCf@!fpNK)eFFgYzn0GLYlhSo5qsiMz`w!Z04`LmQk z7w{PALlIgfi@X6mTbV5}YS*CVBgHbWhPNVUe0T!krqwmd#0DSot6bL}7+(YDry8Zp z&jouo@dX6ituWL6MZWSXZ*oL|tycZ2z6FG0%saonfgB*y15f;@3Jm=%!}inbr*^fk zaBFk%sllZZOw|mVVXV;Hr{l9XSQBsaQZhZsgaYFQRQc(3Rnc^ZtxAfikAbs+a+hhp zzO!8bq#WXt#$9G>pPRu!AW2;?E5)f@C|=95bp~HUGPX&KaYg_bTV7G+@-Q*jQ)(FO z!&5sj_rf5fHFsnfis_va$A5cS&x@qV;cQ=InSS)hv9EcY+NDZ-?w1x`ZX4-S>QI+$ z%cIlqu)j!SWWQ*4gGMC?2mAwAh?gHwyV|xR5WYc}Y{k%jH{Z<`Qs3{_q^Fr~?hB#7 zVF0Z83SFV+`k(J+F@2&@fr8ajO`w4Bol<23&H~I?N(Rb(C`iXUtm^9CyBYuNp__Xz z%s>Y${Ay6%+wW=MXOoiV`oKYZ>j zLmZ~skl?xj7j+BAzywE_t6IX8M6aGEsw=2g+HpJWEX1uW#1V@m&o~q;+H5~@h2F+e zinWK;EQ37&Q1PF{+(mxsPKX1FY0CKcD^lG?6|9^SEs7JRYU&)QE2p(bq=qllnTlP< zpwtJ9{ih>s=BCy-r`jsfGEFwf(hgD7DulZ|%yE=Hpm1qnO0p$v?{SOY8niuZ4_neN z>zvj?D)HWOvwam-yRzUqlzZ1iWtmy7cdN#%`~KQ#lv52+>?bz3jmIfuD`}-)tNf$E zn(b7ZSnt+a0Ngmr#C|*IQs?5-=~1xib(uK*ND!oLf=gq&y-TUltY4$naf zo^u>M9eDqNBdwfhymhk=!1 zgY4&%?bFMiq;>N+k&Ew|%>D#_;?kFNh$(IfR{*NCZ zU!E>1)B%vnn6r=e+cy|YBE*+#EQUd?V=!g`ZYSdpZjJ!BGRcH-k(x&M}(94JJ@K2wI0<-qjxJ*Rt7O5PYV3Li2=a|p z!O}v$Wcb!+&i1fHEIs^lyJ%$-fT@dZ>tS>C0auB^^B|P^`bh2IANVu16Pk$u@u7+R z&V6`HRZGOplgcoYH|Yza*KHSn?~|2`7b{w#W-O?OY<7=o>BAI?KIG`dvGn^NJJkDD z?H|^j7uJ|j4ux+kUoevA3p_RqV(5rl&0(0I=#f9@f1w3FQ!w^*Yb>aE|MS(6xH65| zZG2UY`VnWo`;p-mE~53P$&AMJnQu|jFK!-|FKCU~Po??i$1KDhrRk~`bX>pt-^jt> zSJU)Wt;Jg74vh!W2cM5+;mS@p!_RxN{frAo=^y+fa)e7}v^$3H9j{*XnSNV4W3rvQ zHCDpO^38wus_);ev8|H&mU}W235UL?H}@MBekVPPT+9F;q1Ne#KmMDz(186TIK+6c z?lZksH#3x1)G;&khqa@llJN1*@tE=8%fXWMAw8b*X*WHdcG(#kmZ6XhIMbDFg9w$& zLvi0;{pbCl;rD$h%_&EaQ51T zu7-Yg6V-&<54}?-E*3f@NQmUt!cE`H^iBNPHmm7t+ZXIt`uuA~tHl4PJyB-$uL=Im z?sRvHsMt5=Fc{tYHU(F5Y+BHaf8Y6`o(N6RQt7IJBPMlzCeO8q2UljB79S*+;bJvs zl(Y7XLtpIKdBq4c)MSpjM_sGz>6%XdJlNT}W&Sj_hkn5I7JT1BxA@t;ocm$BZaEUR zSvG#>RgqJ9iEgzLsI2E#&C0_RZ2oG(mVZh_c6{Xi)_CNX_~A`Qyg(FxO~9Li+{k6| zZ#{a)_q|kW{`=LYAync&tv8^~Z}j)TUk>>twd3WtHhL|!K-p*K4r<|CaZ#V{*x5Vh z+8kY1-Co!pZQpIL#jWgaM>KFI+Uz?AT3nZGul2&Z_19il^cinj6i(DQcQAcy@*_uU zW*2%7HemF-J$UHyajC%~`mcFpoD(afHmrlq7FKmIc4?$U19iBT@Yj9bG>fJ7vBJEh zgIMpS;SQ29?NR%4{w4pQWFNN|Umfj?q^)oL7Y@@sEI6HhxCmt&h)F14;;5O4kVerw?DWPo2O@6 z{CQ3?uwqSb=>D%=E&l8GJBB9xTlG%!{e3*1@Zcq}H00KdQUCAb;M=OZx1?8&gqVk1 zNLioW#2-1I!S9VViZP}i_)eTYS`d4&_&_YDXt^Ti&Z_@V@{)Rmw`kSX1l)rIg2dUw zZwrQJejXZc1w^9kKODi9y{-Sd@<;4||AN-rGyRYE#`44-n;iP~58W&KRr2lQn_cF_ z+QXlIs#oW({4K3d3__~UUpWHVt2fQA$|ijf%jfbrwf$`Bt<8ohr`Sg>|L}s|vB)X) zoZJ^D&~IB$SAAdgiY2ZJ=5Y~nwkz(58HRp?D~{klA7 zz8f~Q;I7+{y7kcUnDx--E$e4}4=TL#oo`}SFPeDF|HEH#3u=;nKd3AK?^0L%d3%DkgZZ0rf43Zp33lq;f=!6t|FzkZnxQ9WTg7h+;? zO>pSTOU;s^x}+5!%@RX1L0g2=CFChWX?RXjLPVvQbGXB$9o2r$>fNgS?6 zwucc~!iY&J7Nh;lqq#i9U^(QF7l0-rUBn1_JAS2~8TE>=a!ML?$*egcQ@*3b<_B@M zqtYU!2CL?ZD!qF;(xs+F1Y9^KCRC!p4PwPdQ!d8KPpaM_4T=fqZQ_SSWfa0&G*k{K z1oNCw!_CLT^${gSiiJ{wpKL0PY30xkeLVb)**2X?<-`E7jz~j(_o3WO$B?a>1l`ZF zE4O-OSET!7iH>C;wHEL8>{1$R{xphdD*?S7hO`+ueFIMUv7ORJ&6x_>Ch8`yEJRk` zS0$BLTuWM6NW_~KmWFSchHROpCCw+~K!cF}Zj~=2KxQJp`U{keeWkov<->Ol^CCpG z1UXa!O6F2+>W3a1ek0mR8FyR9@QmJ}%-*5Oagi6s)lu2R+{}`&6su9@k~1HAxSrJ$ z&@nwg=>nnb5)1*!=y@HVnv0myPFFOImuY51t>QpFL^{+E<#1}W|B$=OEE@HWcbVvI zKT7|srX`GW_2wXtpvy${0n`wV2z01-yguLsxtv8<{c4;T>_eE5pFR1*rO5g z(W+A`M^UX{3G!I7B-U`Wn!_d-q`Ww35{)`5150QsS=FoY{!alp&JR z6zBYxgcM(v=|3?;X=V^t^-$^x#@c3h`g$=W&v|3#lw$tQBm`u-xJ3k9GW5#Gn6E#G z2lbT&5s{>Q=X7%T(|);!VSMrZX_NoEU_}d0;T06hAk`FvRmSLdk{(~ zH69|aUHS){sJ4GUQ`(M_+D)2OZCW8+e#npvwO?6h_VF}K2Qa8DLkiLx@XO=yk@ ziuyU)-&#`j5rhOsAsQt`gUNUT31zrf;}Le0@It~d5!Q;$3>|gaI<|q<$(-ST7F&}n zb+~7H+2l#MQya?fB`P2e`*er9;W(_a4{q|I1^x4jB^mi$CSwdG)>y;eykqyR-Xd($ z68eF7&qu*_W5#~xZ{-uBXjMB{q4@zVluH=7Ea%g@6&Oq(yzs^$#8M|TQa%>$is4Y*W$N?6{uQCcpQP= z2@WHnWwJd4Mj^HY##}5$6-w)KA%{T;YU@qOKHi2)9c-{O$)&tR6c9cbfa2L;*%*1I z#ess)#lF%+;au#1%4iQ`2{J*3}5Jt48Xv^);?dfA#>H^B_5|6-Jnop}v&$D;6h|HqHiLUOWkkg4W@^v`x7LrU<1Ts`EM`~5lLxji4{-KL|x?pl| zk_jl|YZnLXDv?sAwkz|=l@-IQn zL?wl}>c!l!oZhPB@Pey5%H`Pw;O?*My^ZDVfjDI6dW$d6RK9b1Ci0ucH)|W>&;>1) zwgN_k5|lE;a4QqzAC&YV-YJ^O)Zn4b_YXvYmzPp-{5A%aOz_#=l)poKP`{F{)(^JI zJs~pdG$4nsKsgAj)>b?D;|li^b4sz5_=nd7U_ zv0zl%Al%mG2OO1JK>P|Xb89BaRC2JEU#KH~J^z1rdKY-6`}cqRb9X0qmfVgj!c8Q{ zRn82bmP(}Mutu?UCy8=Ovaz_MIV~(DIp5A1rGs*sX=bECNGh@u=1|!z*=qQ|*5~{G zJswx>eSE#&uh;8(UDxw^Ue`>e0F1k;O4iV?JQNAynH{L^ zcm>3}Z6H-;9AAwhOrnH%v;pY@T2@p?2{_5*2g>5>6U<(dkKvE3p7TS`?$Yq{RduMy zN`jcV_hz5xu{MzOe~7G1d?02OrrGEBVs+Ka;vS@iqyams_;*p zR<4gi_+~kkyW>&S-*}YUW7b;h8h&pjNda$LqJ2|#9kxDy$rY3-wHOVC5=BNa8tp+iT1Gy!{cPW_N!i#5fc=%s8Xdx|=JpGk7C zt4C(M@9X}mmlNO}ZdJH*?xp^9$a>>mie9?ckh&_R1yN11HVJIl45r@v%^WyZSz+3P zn)Dn!>|%1_@1t*%;Jd>9tEpbUr-sr~m|mfa(p|j^*5;|8Hq@)Y9~snB^|P5LmWP@F zKU#mM{hR8C==wkIoG_0IRgW1lNv=jMq3-84&e!j=Ri_Wj_Tg^z4(q2z|7Dq!SDYA9 zzkd=wTe7-88K($~ryCG7M)X)zr`4my~rQ%vuN#lc1s=M;e5 zHkqs*mcsI8lIp4?9w-+JG&ABs{2D5F(i;`zfwD4J4L@z3XW&V(*<4HMbwoK$)|nL6 zP}Ch!_utp$S|L$GR;Ue}I#9wT+tMDv1ISHzHc>;_Sa3MD8kN`OyR2JF`8R)O=B$rl zXep&<#y79myPAn>%< zuV&u8Hr@Fc3VN0jhS&~(8%otZ?-`=a6jVNJU$l=8lvzxR0kcxjGVxjnwsT0X|JMeb~-Z0l*^T>uSFzWq1S+zvLWbuFG73$%Qr<{|s98 zstwgfIb12-t>Qp|FWy_CR=zCEzUTjFU~g8OW5uC1IgP-%o%3<0PJ3mor5{pXXadd! zKdEdD=;YngPO@7b*X+za0YF(!oVI#kw6|Kg&d}r|0HTH|4RckyEuBo`fo-!w|i7I<@Z^Pn|yf_~@qH4uI!LAqJVXlww zLK^njdZnywAaQxheP_V9w-?N7kz~N&Th`AEZ=y!VQHzJOl1S9?_vqUoFdsj(JaiAB z5^zYy+=3Y#&6}ijT_)YpJwd9HK>gI(W5FU;*KIa&j<`uX^^~&l1LggF)Xn4d`sF8< z(M{+3RyUAn(RCERSXWkyZ_wpx%}P_$Tn&gYt1D(bP;JJj056kW9lpQ4qSX|(RQMi^ zubYpkJ~Ql5#qh4CwC4eK8x?u6&Tho}AflRbChvUfE7@x_;i|l=H{GOsf2k(>qRkMe zI;`6i_2?AkOtUXDqE5ljd)d7k5A&QNTcY zV(QNP61fdz1&9(g9{c zDure48{?_>QQZ8z;<=-5g(8SI4~&*WDO)=tp&bTSNM2WiP!1X<)yc;02+r#UgrQ8W~oZUd0sHt}|iyYn4cy;>y8!&IQ-uc12q z-eL+&Le~ftzrFJXU!8e4I}@mUmHNCep1FbaS)4iih+44^EX~A6FLmoTcFB~~_4E4; z_0B{$mU-j7*F|7OSG)V!qki<(Qd-l6f z`;4e zkLY}`lum->HWoR@c1AjsqqCvE1PnA2NU3%}U2Kt+O zFA7-WzN2PfGDr?Z+{}-7#3-gUv=roi2uv@D0_w?`9bQ9L+4r7pryOdt)BhmeHZ87NSOrUB+W?9IwfO;G0L zX)ty8tz=Qg@9d(kB&E}Y=`Fj^D20xL2Yt}y55B7ed$M}4$`9{xzfg#sWl;^A?0nbk zTz~XpuYxKb2e=FjF7;AgzxDJTZ!!vNdumDnE^S8eIXz->1Id}0ZnX~eQ$_oc!ivD3 zOt$ig_B^4Vbdhqz%*WjQ>G7*U(5L(Fl6EQd`$D^|UiYhpqC0DiS3BQXJ*2+7jl*6T z&KWCwb{Adv9M`{JlyLBg60#{`DpPZFqua=rXNN|n?;PSUruHlbjBJrBt1XyyK;E*~ zy?JNBzA#O+qhGVRqbK+0l|wr>J+{9wg(-fU-ct5<>d;{;lO)#|{^6#RpYQIfbE+|x z8yIO?I7&)vyzupui|5k^jWZ>Sl^KAc+-cyX*_x}t^a`w$bX0TH+pQE&n4eK_uof+V zO8)9&p1rGFcW%kC{(x9gVd5zRug8OA1$0c#!3MAPnt{;=p~oY<^3N8%7&tmo>WfrG zkB!c<--h?)rneP3r#cjRK4z_pu_D&`Sklk2^;Kl- zqI7Wm>bfLpZF+sJab29WzRp^oX07o;I_;a+mK3+m)cUgpi#H}G=7;VoL)S|DMQF?2 z@{(rmHhE()Ch|xVBYa6Dq_-%h|S6aUl@vyFU?N*guZM55@MWa@D zK7Vy|pC@8CB1mst0e{4;5-AOsNFRv(@x6HaN7a&eyR%$6J-X8K>ajPymN9dY_DOe+ z{X@>ez6h-?8Gp-23bsjvPkwWBF8$X0Ibjz2A?b3J+ly|!!Ez*3DG44U><%g1dRim( zdwyU`%!1huZERe|fkW)MCrXJ4)Ts8$aK{S?-*hpHL!FN;67@)NbjXo3e@Ndtr|*E~ z>hZVuZ(r(Cj0R()kiPOO^UG;ljr1g{k?_|P=a#zl(EDsy-cB^E$7m zC!Dg^#as+<`|*A1YLoJGhgdgJsl?sfVBK74-CRh3!`8C-O#BNtj$<>(P7;@GKclk5 zZVnNsxvaZEQpicZm?Lh~Z?_3S&shn3j=0qZRe0`>YM%;P-ZGiqB~0s*oM$MlrLBLM zxsKqnmU1rX$xBwkG*wiL6rs6S=)$OvJ9Tu{dSe{$*`#KenZfGu?&^e1P?eSWXhj#H zi{>5!gRih4K^$C6%Q`RpBEg;6@i@wdZ~86?mh_jNw(T+?({cP0)WCNfJ;|GY1)t5t z28Ife_2AoVJBB5yy+2`{FU=JTaO2-+#JHokFE6gkg8`NjU$fT*&m)oC)qF^wuF@ow zdc@$X&4xt^>-?XcWO|xEJt3B6Y+k&6#~F8bn$X23WG?Fc)BP!xw}Z)gh5fG^ukti6 zYj!a4qKe954}>BAwW~PwTUvgpMsA|sDrfIa7pkOJcP$%cu%5fx75;q!U*NP#1WnwIZ@8(7=d$Inx@{pb|(mpM%TU1J%%8}2> zAPCf0cm#cYcKX|Ovmii`SP ziI5tp7oD_Syt~LzSI+U+Zada;6S+lMnC1Jmf1T6vCS7#kDeJ**&0O7n@f9eCEN*U! zn$_zKzbgL=^1 zbw+f#^3NxUzZ1LH1q>H8>Y0DE;kzEEtoW^WjQ&ZSN-|vkzJuU)Q4hb9yJ*)~aW*Bb z!3L*vLs6%Gy`wSr`cdh3D~!=T8tD#h+VW%dByoiE#91YkPVftmrXQcJ z?%%YvZ#-CZ<-=ujoF3jMa?&Dta}Kd8VSQEolbNJHT}Zy{GK3hm63T-S5Y}X`_`wW3 zdnF#u_+y2Rr`+PD^C@721K&#ilJLrn4fxG|iDYq%M$<+iP;~dnaCZMRq_5M-t{n7h z=O|*y-hg)Yo7U@|tQY4MLiOh4_UcxRa9kc-5bPhmg4bO$hhZt5TALWXPsmL%?Jeo^ zh~Wee7q^e$W(E=YEfxz1j34=XN|j~is*(6hD^6~P8$O<>R62(VxN=5s&ahI~Ad%aW z%S3GbnymCmD%!uqQh~V!P_e5iQ%E?_Ds%&EGGJ{#H_47>CQa#%R6-5}5RflH=ai9p zpUT@^p}Cz-VmrEgMp3*AoOY4=>=9XRd)=+MK#W)-xj}*!llSI74CJZ9D7;R|1^e-X*GrRgn3d~~368B^ZcntB_@<#a- zMo8NM(oYKmbNsjc+|u(=h`)h4_J)WD-kizPHAvDEZl^Kg$l8h2^)0$v65XjyMqRy) zTUq=og*hA` zF)Af26@Sw#Qc}suxD<85B+W&~`QfqB;v=+|g#>X~%e#>y&P;w04ypNdA~`OC?%2$} z#YdK8n)(;BjjPy_(&vYVWx7Xrp-CA1 zC-NHBO{&z3KAc1rYsWb&T$yaON9x%RR@s%od5&O3ubo=5crVF(DpJ2dupE&26heEx zD63Z5)QjNSSMe4Q*+NdI(7dE4KR-)pJu9gza z%8IKv`+-t!C%G>{-+6KG+K_dx>7Jfi@18-gKV}BD)MoIVPO3%eh3-7*=J4@uS|<;3 zWPBPPFc_{k_mT~l4h6cc;RLcRZLFJvf==RZ960==pBq^EMct{o8w1@Y>vYL&AiGaSWE-i|~ z*A2I16j}AdHLfTkc?;N7nm;9*YfvqjWCOoQ$Jt9K|j3 zTPE+hNZkPbff;oEbxuz*&VXta!EBZsLo`%6$x_XtP}<9nxUmrg_sR#{$`WGfQ1{`8 z{=*Sciz=cT!D9`vbWkt@QO-i1gBc`o2`@fo9M&&su%5pq&>UY@|=s{uIEX^XiV3cO}tt@zrjax;U-d4jVJ;jpV< z5w~&e_(qlkl&}yW=!;>0G*ks=#5EtIX=Be}>!$d9MXUlR>Wfi3*5w4Oi zh)HUlsQ7`%a**o%QQ#iR>l-&@naxQZzrsbYA*orSgHe2zFfzmGi%rzf9Zqn6kHp)l zvpewyQkbQ5`bOj(>9>i~?N+77*~~GG-1R#xh;N7`RxWIQ8;f>Y-sp5zPI4C5(UsFe z>RnYxv@=M8Q~$UoeAFhKC=hx*6i#f11=>+Bb1DQZ6>Rx4GBt2XXb4lVqwZ!Smey2^ z+J11%OCU$IyhIKukR$C`i7n1vqOf$x5u-s!Uy=uWTL1_Jgr^_sKIoXBo(pm*&OYU~ z_MN@_DiQZ6S`Xje&1gu(9eqm$Q!-5H>Azs}ozZ&_XzU#v$=ikcvW+Z_Nlk0$H}$ZX zBFd0U((b6x&oj#~s7fa=)x9! z-oTo#!yJ!p$kmY99|B(J+)NX@jvcC5)yFNrcWya~)TP~s6Yrbkq|j3$H-1S0J|d(2G=}#K$s6k79C(Mc$xofC_ox09 zo|N1q)*aAN)>SQe{`&$?+B`*ap!S3-(Y{~MOR;e3XR?H?Ey{|M`=80oIBZG)q~WbV zZCEh)L7=`318YeOsou1>5$i^8?EZa$4h=ImSexC79N1FE6=^nqBAoo#vh_8B+nk2x zhGR0C@rIKT0VmJt3C~wb2vp&-FT|;=SwWH=>%@py!2LDZt^& zaqn6l&=E^U0PZZ#fs1vqOOIP2z(59E|F@{|x!`eYAYtl+64HZ|laU$eXH5IMdMjqT zS-{nD5-eX$H(X6u^X;4YN2^EveIz&hkok3xAs?PDLt}-P!d( z`h*PH$og%&_`pr+o~^L2?PRJ^*K#t{TVNV$fBTs8M>pDfF4P_4CM9kub%X#(eD5e; zd-a@o-9dcfPt5LCJc^f1xBSFrG_d;$*z!fmA>PTgPRV7(o53(l7dwi@`@~|Bi^RIbR_3F`F*I$%mq$R1qOZG_At_X@mPRz1EaJr^-*$!F8~SYEt*&$|z^u zxYA2}!*r-hT*N@9(?G3wz$Ih=tyl~jb!6edvLC3|Y!(_j!){Xn_P3&4rHd)Q!HU|+ zxbvq8PYhsg<2}s-+gT1FVttNH=_T9$C(gU}Ie*;atjm`Rg{mZ7R>T@UBvb3OJQLo6 zaF#~40>8!fO&f-BeTq{ajc@VolFj2`Eyxj;kXTjUz$D$XF!*BgYq2-@I|X=wh%_=| zI*%%Un6&A-i`$ZI)mpG)xrLK8=Pi_aeAgRi31l9yX*az=N@+% zB?^auQD-f2=P^Gcqjt6t)Cke`w^wajjM@k<;w9u|os&MbxDOLt>xc#JC&O5w{UQ%!@1>mTfyB#A)X!w0neraaDkvXQc$r6oSltl}h9hJ*WE ze!cp-d30(cF7O@E%E5{q>rWaB4g_(4&aVKcz5B!P537hdN9U$CwD55&^VN(6Sik+) z7ZDTT0%i|zN=n#^@Po)+b=ZC?S*qRJ_nFx3v7Dx~u5_$*jBXt(L$zYy%;UG!rozaI zx?7gw0W>NTvmH{bcv0E*6`KG|G zopgggES+NMQ2j3f)#)lSB<1%!peL+f08O(M6PXJjh)9Bqx3Cc0p-nJ$VAf*ZNw*0L z7tg34=q0OYZ1HTEvqD5EK7!DE*cux=9os;HmRMjex8a87h~2H0nBKO+#fujS?emDG zxZ=o?3(ngvmR^bk{}bB7gkj^5K9>-}>SM`|VEM_cF~WK<4{}B$*EY6y^ZS`ww`UmZ zK)RM~WUiSANkwrWXELD&ux`b(CeCNgX?y<_6!3}N3^R-$ElhB@hE=(BQ&rN!2SDBXq>-SrPWfzHoq2yWN)Mlbg9Am`? zcK~)^kmID>NF&1!-~68t^M$e#{+IXMB^f5Ld#{Pwzye&R40+wGOnxELS{488^@ z{(eNL z#^TR6ut7fbocc{=D;tps0>_X{mc5U3pn%xDkWasm@5;j~b#4#QleiQ|t|*k|$pjOd zjosWt#%1cl0iwC0L1;${I{fKI1ORckaeC$ki=z@>6S1$!jilXxBLRY|FvXS7*}?H* z6lz*}7t%=y(~EAu?0h7;bTJweUWEOL8W@B-vTo0axy!`v#TF&7RR7+=&#>UDI`fU5 zl#FeROT6(BghbAqn9|ux&Wl3sdKAWc1Ye-TpR?oFl8f`V^PA-~I?bc>@W^fvIlFPA z34g?!e>k;00tBemoz747EqzbC0n#N-bsFl{YXQSXZ72|`<%0H7ecU8bv=Bgj6i82gAcF9g zfa_|OS)QV9V5k_;{!fTiJDUkOlcyl&>VEQMD(*QjV#y*7mj=PJ0jV|z-6!#UDvA1# z0aTMZ`#fG|)FR^n3|HkeyhSW6;+A@EHL0PU;b}lMPI2w05KA@Lwbc?qla=IP7f`bt zQE$r177K&5~$t&E1Dn!Q#{}Ui5c6xoMxI>Vix@A2bnO?V#IwJ z_r~2$ix&&d2suf@tXifef!Mfu(oI^v8`D*ZJ3-m1^H>9B=saW-3jnKlsohV*q81t$i1K@E0~625egNH72op zWOyoJ(=8*lT%d(%*cVf$__?~B?xn}w5>J>Ym6jO7&gN4e>|e_A?HhDAWEJHRl;K4n zWQsR_WU2fx=5z8&F<)IWT7`rmBvs*khcY)jJ0LiKw zNUk(a`PWT7d2$&j;g{Sg8SqbEzXK4KTSe zA<=*Xg%7Di8?l?pa^wd~n5`{!q6S|90V$IWBs#=w6E^)10_($}2Hg2S34^BvPAPOi z4`9>N<6Fkr^_%FX^YY+Unamwpx~T;_v0ZxF2gFE%6i+&zM;DRlAm*yArrV0;kiBwc z0()4}BAmgOz95S}8VKTdd z32FO3fn>d>vvhcIz1v|{XXJBWSs?g=YVIvfvvSt8#rO~7f{*YL8o;4PJ(dc*`b|A( z#T(#!;_w?W;<|7jxhD>$)tS>}!%TZ+*mEnj$5vR#Q&pHD~uPy8Yr_rglCua zB#zm)QXxlN+Jpj`b>-13*~BWA5Qhul$pEG-6bF$KFn0j&k394v(F`DL3(=cveF9kD2qtdsR;Yn6mYJrS-we5Fu0rA`LT2WSL_{ektcS@=vK*i%By3t2p$KBUG8?KF}%`_ zP?LaDm{a>?sF_wv-s(K`6by&3;Vr#r7$D08F`}D}+OHv_a$+sEmfg`QU9=x)S9CUa z!ufoZaUw>8y_$o15`t795$|h6`OuHzcW=2=0pVKqi*6H z{spmHl}11O;S6Yc$C^^FQQH~8{fiL5o-k^~PmGh-bmk`<9RpAaxUezJTQQ+1XDNBRjq#XY0dmOf8gVy3@3@*K@~c{ zc?0;}=V(iluMuiLg!Hv50+61w# zbeu7kQCRlD!FFN!yaf%g9JLXGl?$yA?o6v4j z#Qt^MT5@J&)vq0T4OhM>6Xv8&E5hkXnvDcAOWgKS6Yw zs^)Q2beMxB>MlblsViD&?#@I%$%Q!?vX*ZX=8W;gyr~7(zBs38re)@o>7Kq7RYMl? zHlfu(l2|ciXsyaBkf}rwf#kh(umn&Leb89I`WQ6g3T204D|S?di2tuSpf<#A(8Q~m zb3AbEctYXft;*eBAot$iYiS1CjkNrWSEr_}QB07Q!<@ zOFl&aaPPvZ^s~z>F$>0${colYn~g{!`&L@3MZLV#c17CzyHtYj5`)wS)f$O{?vOEO zd2}|hfXe}yNAo-M9KTK29!R3jz6b16OU;0J*@TUO&~BQD_hAIVRQ4+z9jVzPfL_A! zZNyVY1(pOl`bjd(Nsd*dF7-QYwU{i~`j|cXtWp3%{S|jP)_x7D8d|Vn(u+FI=If=v z$a0-0Y{c(c*{Ar)ktO2+3Y|Q{T<9;~cu1|q?vOw+Q5Fqg|AHiLuo0Ki*}bTgd}|0T zWRJM;lz>N}k4+>)?K$(WNY> zp%tavdB{NhfW3?F0)g`moa)4Z94F@;J{-=!Kp(Iz{Xy4Na1kHi5X|38P#Xqv)*M)d z^91|{`9%w1k7Z!wq@1nJ7MU-T9={Lrhy&1wlCqIlTGRp)WT_7M?q9*i3o#{)a*myM z=#ot?{B~h6tDH?Z@)qCf#MhD*M+#zS?`H|NrJ_p-UvWk)qP+bp+$6&!IKitIFSO=E z|NO|9v*RteevjJ46mQ+fdu4bfIw@4T0Rgspkk3Cd7hAO9Bi6KlGlbUetvdBuu;EBT zN||=Ct}QKgKzu1fnDTGWN~^zUa65~Ct{(|X+FT|Q0tG)y7`r9pUg#lx zD-zbJb-o_DVH?X6MKkh=MV!K{bH~t|6k%iuLw-Lr_n25C_t`6A74`+Os$^W|s64vO z4YV}@+wtAZ;M47Af4f-?Wd^=fYs$0J3Pe5nEzE*8J{L|o4^5*8qE!K{fu<| zc$#OyZ>3Jk-XhKkw3Q*ys0Jj*Apyt5SqWfRA)DDltST~uf@pwXp5j6Xi;=lqS(H3k zFOqvqiX)pF^ydI_9uCFg9+F!iG^I{5G}8T)8+AiWbafN4N|u*%5t7C-EG9w1R9u-L z-1=C?qd04{$Q*OfwZ!PrR$@0xNRkCd@JsD2^Am`r^4}gfG?Q`SBw+-VI8|mD5F4R4 z=k<&@<)rL7yM|Hje_yNb{G+ngXt@D^7fd zM_=(WGr(Y+34?5oY09q?-?lBw9BQ+k4nh7i2s-ZTM$8jdm)NH)HF9sl$-o*oY9W{6cA&wKf}B3}S+t6g+A%gNg@N9rWO3maC7VZAr79Dj zr;GV!V*YF4E>g;3rJtMgKhbO7?R5P_tNFdc!g0<|m=Y@qf8<fSdCr-UYfmtMCyR z0)B#j4hM5pN2gWMrNF606J#2$*o)t>K-%Jxc-JJp1)@Vc`w5N9d zwE#D`xi-z$g`m0!G79$8PPlk>aR=eg%i{TU0dLh3Xb#El7r@vx$sw^BP#Nb8!)BU6%D;kKFqrW!b4M{V>M)3j=%_T0+EX?=Y=C82n zrvcmDKQ>y_SZ@m}8VAW9a9PBpg`_Rs)|vVq>`U}jwh96`utdRS>El zYmMV({#MfR@rp=Ar{4o-1>+16>Sz-0tD<dRYbviL&Z)IGWl93`Qa@+#bUZqo7 zqRx8Ov7Wx3*8+J!N?T`|xuN)En z954Z%^;NkVD=3hV6Kkj&E(jl2r*>{}KEk;`XO1PCiVx>6KC-}^uL4P4?yFbK6+fsf zE@iffGh?>{T$dROLKAQyDL=-7Mhzg~?IlZ>oCEIflIScK<^t%juD*RBT1dTxMqI=}`A z2eB)DbB+~Ijjz*I0iR5>R$K|@cHqqghC^&(ZVJ>rJ59?=fas$`BT~?h|G@0F7n@uV zEWc_wRzJECyL}7o29&xnS_U+hlT)CV(^DETn=xXla{a~X6)6;H*?tS8~)9m(q**nn^>;d=t$C@^OVV=I=Cyzxd(ZU_2 z+-ug2&$J13&On{)BJ(3~OBd~?b-=s};Z5dNvGlCktCTEd4Sz-i8Rirh5@Y+VyTF^%1+dFpJFXa^Cj zsDTk33>7j{pa!F!`67LJ1m^sjJNm3ca4AD{G}CDPxZr4}C~&zHToS5;oV36{4d>e{ z$eyFMToMT)^Cl)fy9@tYBwvm?CNGlN=u_;H`~%ULtxSn`hZZ({&t$kj!E``XVIXeQ z5xM(41BB5Y%RTw?S@}ISv@_w*!GzCTVRfLid=HI!5oFN6aKo*8NI~!EhB-GPui4V% zCUN#5JQDkg;OLmRtxZuUd>f2^kr4Q46U#I><(6en^Yc@nphCiLkep9x^wYvVvH=ZI zP14mP^O*@1T_PP``}}jp?gl4_2UFc%1#IKUcKtMkPHeH?k=v{VpJ!@tK>Uk zfO^y~K&YedaiQBG&Lh+9^I5RuQ-Uko#Z76#eY~EP`XW(|MdRiO>aG_1$qT2cTW<&* z_VhsM{U8cx1TZT#g8H9qVRby{;?MQ1NgfF~rQiMBKFYxiRuL8k;rX)a1jH~LR7p(- zC*%+G%3O0Xa8RJIsi5>12vWF_KCt^U2UJQ7znwu0=X?c@^7@Dla1lcskOTm&0d|vl z7jmQ*G!~Z(GbjP+()HP`pDY1}sN)?_`o(2}V}XFKn|vD$sJ_rdg5K{BK#|h=akXDZ z<)D%Ipo~bCLv2L-DuGZNmJyP*WKf(1P)t&SpgfH@)!|^F`;<)3+rT;oa#-kIf8zvk zR|+^DFF16)F%R6>YTp5zfP@Ula|M=fJGn^>BxZ$%&cK^W9kW#fzej;G7d-!*d?&f5 zllKl($#rZx z;{j<9bO;mN0XL1spP1*GT4<;=KAueBJ3)1~1BSsusWb;mQ0_&5=%beRm91zBEkl4b z52szMpDn{YrL%2WwPL8u%QHaTm#UC3$ZS4mW&myrn0jepaS1TJju-;LAEzwk%AECJ zLZ;FtVQjA~ye&P_3cqzp)kqO$p&M)~cFfLcm9Z&aogN34B6f;DZlc}!8z4cT;!xcf z{}=!Mw6Tyyh>GiZfT!SE8p{G>ns1WCdzCp|sgbMHkYyVS;Fg1J)!B^|JZ1;q|}lM(V3J}nmil5E4q0vwN6Q=Ubpm!z1Uqu>~?&y z)rA#PXd4TNj;wrFq^M><THZkpB~;3=;8B0uFj3vKSPFfvU>vGXlf! zkPM^2l*PqI9OCD5f+>8eZ3XAR?*zj)vYd9=;`Y*6O&}PpNL)Bo_OPeIRQ^D!QQIaK zAaMw%KS>V^*_H2+o*ognjsa0~X4t~xY=|q^t+YoVrbw$0%S2x{5f0b3rOrPI&fw+YQr)y$ab z@~;cqK!s&7b5X|u|F!4fA8nF1|3DvKNPJi)q1VjF7q#J_0d^!7NSMt)q1G$q{QPUec<*!P*7iF6p}gCV_I5loM?Dlc+_3^Ga*wK{2AmU#u%+eFs}~c zm=jbRj5gK(@zzBczO{op{XMe`VN!}P!9+BQ%?~g|PRyJwqk@`&oGt2uE50I&yP!#< z5DG{JHE&UOx#7dqQkMPy(<5`{r?__iGWG`>$Xf-qC?%U zz8Jc^znwkEH3A<4M#kVpq?kIZ((j<|V;Gmz2fOB;_|OPq5P%~_C4i;M)VDJiEavoUoT+X*@8vVuwtyb7AqQHl?Db zG?B<@AVy6l7kKu_-FDd3xWv~o7$~ZaS6b^%QEI^JIr530Wi>Y7COY&*@k)MnoNJ57 zz6zA;U?K)V8NVdZ4S3S8Vz)NY^<>e`17JzocVhaoK+XjQ``;6K23NMZu!5w79O0#e z?}GCTao_d?Tx&P@;2DM72=NB;ncK1HN;LnRv}YI3UcnKJ)()aD$f75wb(_n~8L7%{ zN8FWjAS9GmQoK=CytlOY5hqefb|&6XtC(Y%7<5Zv;ZcX-Pn<<0{=F(EywfhVYF80}BGYG4m?z>iyP}>PN7dcw1u}kabqmTG7*|STDL6MLHGjO?eM%J0$fE(wkCoAVl<*s|4SLX0AuHq)Ba&{e5`O3D%A;xaf9|`{+ zydE2=p_~{7ee|Jc{^0eeYf$AxHK_8}zfQW^nfj0Yj=l%(Sk+L@9??)J^O)lup2Aac9B-TJ+X1_(l>pL zQ@?}u{QX?v=-q1#oQ#E)*<~ZrAA?F3`T?mJ*NGJaotwLk{%)baHegW7l$(fdN{>45 zQ=hxnqT^7ovT&R2>6vrN(Fs+xHX6zikodvB_0KB{R|+3w!Su~?AE&oCIq3ZMX50@{ zYaeDfSpLBRHucy5IiOtv@W}UA-(f=lszH6EFT-IW&Qa>t7o#^3=FF&}sp` zOP1c$+mZ9VB_Gg9t{-`r_&vP9Vss0%(-O$H;k<+0i?6F$1s)epnd?u~JWdzaM+wls z@trLOt_GY;xS$*jak;$wWB7?S$!*N|E8Ce61*zpbfOjdSukP&ld-_w)&VOngArZXE z8yF&Z+1lrl0uSV0X8LOy!-!L)^v(d{Pn~%2X;}wX{*eu9R1bf6{44b4gY%eTVQWSw z@!PZPgWW7d@qxCc$M5vHprLDz(pzj9k^+**G9Q!lC|$hZegS2!|Fu6VafT~>&HQki z6r-E3v)9knZ{mz{H0uEDo}X(Qngeg!6)W)nC&f}d4HHRA|K_htXk)X@p3^UUPs4~G zreD5&Nf0llFL2}=({xW3&S_J-63_o#bFjPPL%Drb%&gn|4u@Qard=cY+_=;eXHU9H z2eyeSIz=2I=b#}iazrpnT+jZj2f9P|)6b4Lp6r=4{*=AqAmETXh6ANxY{To}M zp`23{^_9n-=rxAB(_3>6T!5MD>wJLfRKIEe2vuHbu`9YXn`KB!AK%##a26zIYS1Jz z{Z9+=$zLUQ*U;n*Il96Rw+}R`VO^=mlyRx9ul9HFTAa8~jOF>xTb;qp*4jWL57&lN z%l3-jnc1cOJY4K)FTVJ)e7X=k{`>hypjS`+u5|kP2GR$;`So$p;ll|BB7gX~#-EHA z6lAu3J7p(6%4DnlnPTY-B~p%-M*V_P?kO&9j8 z?i{EAw9dYkEAQF23{sG}TOJ&;Y0><^4m+#+pNmf5mDv|xPQAJ5+f~E?Y9;74-w{IC zCH&(*Wd_@e%L@K&Z#60$AkUU80tI9k2{ixXT(s}oTF$|4OM`%{i#wX5dYvpfegr8C z?-gLAKvhcUMwfa7+ww6>v~-+CT8!I)NU5J|p`kVdE5`^@h?ieoIJ|P+#`(ir@mU|< zEzi|iba}MmvmW&kO;*vc-QZ~c_na)#tIO3L{@`rZqCqIZ=m^-lI{U}J(O(|+@X4C! zAM*#0msiSJ3(nc=hbCOOMSk(K7P&qCbvkYTA5qr=4`ufEyRwT|TgZKv$`(;OZiAsM z(M9~Ltx0CsYBMgyjG>t^Ll-NSn98<=F}5U?j9O&e6GOIUCf5n$HYO7?;}SDMy}zgZ zzwi6`d_B*(pYxpOJm-AR@Ao_7;p<%#2M3O6*9R}v?z^bF_muT^7G@r8y@Lkua7`Fn zPGnbFfU|(*;GWb0wE+^FxvGx;46j8WP#lGCJN8>)G3n^TwL${1selB4N(=BVlNt5h ze>4GZ)EedHh8A?!KxmJ8e@>6{;Z}gEbbq_?KS9Iv!$uE50HM_fshjL`E= zRAzQ|C{ZX}Cs@&uH@+^hWLcu(z-AWq2ZlL)$mmR>pLCu3wZkgT%=1~k24T5Iakqi{ z#35(R|0D_AH3pOixkmm&Haifs+d3G?eYWD#9$l8d-2x@Bu=j5dH$TrzG0JM$3Z8r8 z+)i%daP`iiwdlmcYkGneKO0Z*Qv`1`v6j{lf5&>y5$ffiqX|C^&7h!3KM$EXjhddk z0pq+1uaTR(nGt`F=m;;)Q}gVTWrjJM$bl_zJOcYhXL&R^OkaRog8Z^ z%zvC)f2ua@)yB8_K%wx-nz$_NVeQ(-$U7i0IV3SU^E=A@cfac!IQ4&~^;*Ie5<7kh z9KPbGZ|0#dH`hF0Jhk_Fqf)q`_B>J_KvP&jT=Ue&?cR%B0n|1VI+U|1g2_F3T(TBz z2wf9E`El~r3TP3ob1TxqmU~)mvM9Gx6tRbk+}xB&nksS~jmEf{7H=6$2}SA$gg?%2 z4e(r>duCt5R+E9s3>7pkB{VeJ>X$(}L(-aqoeI&^VKDvNT$<9nMVnX1DkQDjcjH{{ zeZ`Wc>=$j8v~7>T#g^~K^$e>C$h`al{E7jGbxG-aR_4}fFhu_uY{!z`skV=_Dzs{2 ztR{oRGIz9>|AwpWA?u0>x|<3+EvEKtN&8d?Z{#cS^QrmFXEMTy z+}z)voho@2l=#f@!ZXWdjQC9~j)OXMr3rI0@ksfz0{rtSm(_x}--fy$w>~sELEXAK zH}`AkIHKc50F0j#RL3*Xe@L9OCCs^@bfHR>7qt5Pha3`)CYWm3bpC_uFf;xAl4Oob zqE|;>8CRv7Gf{k{PJ0 z!!x*aA(_^mgAM!;eQ{Xpt^wP6u zyTTkc{?jD)o0-NqXZP<%F3L16%0$j9M^ztg4Ab-7CU04UXt$V_n=y+27-rr3Ke)oU zQ8HEcwm7-jH99Oe&6P#5E=KRK>_0`tn0)cr<4(UOs%ZkQ86MCRg?&Bm2*xEeV%}b${(o;B$_3kS}6X`g{$yOv1LBvlXbRTijFzV``)ITmo zF8;_EzWHy7s{?cD3E!;|owsLQEPWQVnxWQqiG31<%WE^KLvg+G(SeG3y^VYlJzAXP zTGa82>gRkzIf?Y8(ON?LHOz)J#gB(mt_M?>S_gl4TdQuZ+G@cd0FQicpvw{1Anqr} zK68_azt$xaV}f;uemJdrqU%$wrU(+GAJW%7dIImM%JKI+R!7hs+7qTb#DzQdgzk{@ zqI*^g-t!jxIk)5f?~iMD`b!#;x$g`|*}5Rn*X2C6lf2el#=mZBAt!|v33oT#&L=piHTYcIII(bp~hu9Yr87Uc_toYY&7uJbJ<-RhW7ih0p&MKaaV zN66c15y7+FAidOIUy7H?^Yd*MnBO0#rsD;(q*q6R&t4w@kTU_2_&xlCw>Bv?h8L z(Jq4NJWRI3AK}6cdD`Dxi=kn}*tQ7W(OZ(Xe^@{d__hL-xPB{(UD|to`FM!D?yo|Q z0f7ObxZ~dB&#U>Nfw8s`x#3h>$Ydjzn6&ZGcYC7)siRwIsmTGhp<4IrX2=)k-9aJ-520l{pY2b#G75M(C22OHFRM8 ztgVto+bhYk#ESubgEyFex#DdFEd23Xq<8CnhQt&faFSNf%V{{j(kebRtvr~ zFqVyQZKrCrU#O+t;~xFHBL9N^3Lmy;d(usdb|(|r<8GB|L^FI0=0hzPn8n<#@Sklh z_`ICd09AeolRUabRKZPbe|Qs~#JQ$jZpK2pI+M?7o93IaQe9OaI?>UBn90#X@;lb} zYe=<6Xuz%yO03_?AeyI>Nl9Jzah{bAiJRUfugk4<`QTec&kEk6?JkVT;^ecMEEg_Q z3T!QMs@T3RVNKmN?e^#6vN!@0R-bF4_o34C5evz+bzk~xX=)HBuCL%8Ru%40lm>W; zlfJYGOZZlZU(0+ynsY8S*?SHt|58_m%S93W5}Sg#IFR{_ocL^*{cPAQR?!drylGP7 zTckYTb23flaPg(~l+fm>lud#vvt~wWThFGUT3rX=M z^e5v{>1ljAd?myk733W)Cf^B$y~DE5pDM) zXy*)9)z5EnVlz?%l?X89qod_6Ndmm=b;Y=e_&I441;XlSB11^>#R0{u6ZR5_k(bF? z?cCYd*^4mtnW{#~;M&v#KO1e%L3Cmr=R<$Z?z;bVz97$-@Szw@Ab z5fHv>p1QRn_n}Dv(CvaPN&VN$lcS5r2jBM(j@>>LJ<$IpdmZYsEb(ZxIKi5gKICqK zbvDgY_zY*{F1@4NGmj&DZ2cI#^v<;%R=S1OD^!o;`IY8Nf)9CQQSFBh@xxml#f?VD zn`HJ2ZSK{ibH${@cK2wH-R5F59ej;^mn<=@gdX>zc%-JdxTDo zfun%u!13-;F-{CGNQ^`u&oF8qlWaMF?4vIfO#|WJpUOFxHj{{_UjD6w4ke{2`odYM z<9EWB;iHox4de||2jX)|KOP>QNlX*U9cn4XQ#JIQ52ew=WRhu8dc#WLWjKe{bOY^5 zq&Lzy+Lc~C7e#wWv#-x(wVZ86onxhjv(VuTTTYJrNC=KuYFfN}kW4zOD!d@%IRFP2 zu*&q70*5sU(yUoeVJLAjk2BM=G;>p}A)?O)4@~1T=>f%_Po#;S`#*?sYj3n_{AW~9`25RlDXQOW>SNxJ?lR8jW2)bd4Y^?r zi%w%NW9>;x&Ch9^e*syhTMv>YZdic($DF;a8~Yd^w~)^As=1iJo+K-G;f{ZF68gXBj@G}adgbp3n*bb6a`?>eeosyheR>k& zxG_~e$$x%I1DE%sCXl|`Z6rY2KaDcUw*yr-f3MTvj-B2VPat-_Y&3j<;D{Y61am>l zP5$-q&5jA2B*LJ(iRiu$>!MHdDGlgL=+(B-12(^-uKphW^Cr&0Ochj^a{c$2#8CTY zwyKufsN`+r{E&H>j>8@NadIN!qTiF%oX_i-PbaCRiR$1|odf3iW<~BvP1eOL`~Bk8 z+{yYkgAcD5Fff2lx`?`Z(R!bnJ5S$vr6Cme%wfw)ndb28n3QKq-fDq?n!upx_V^I# zoy%@5Go@Cr)GD7j(l1sKIZgTCJTejLomUOmSaTKb#CI?K_bE=m2NK$eOp$M(=(u^7>}gtk2c&q7^}m z@MB+xTo+a(7~xpLZ?64R*&b?tYO>Z)*~-E_ajsyFNEt&~{RLmeUnUa-hKqUz)qdOA zoI`4LdTNS5GEZW%cob$hseqM%x=Nm88M+WIxssdO(QEx=K5jXvsb~*3E{fo`RGVH< zl{od`QMlWL#9W+-;y(P56CbyVus5M_OG0FerXW;JW}iULsz>t&S;3Pvbdsv*Sq^%5 zGGOT4zAfpHRB5?Ja9s_1q^S$6kdNGeIef4>{0tivFoUa)!zV0Ms)<6IB*i+M#Vb7P z2l)k(1Z$6ks>f>B_$En=->CMXb;a+|PA1|+2ktcLU#Pqq2YsK^caQAh^LCpp1z0hO zf;H-tlr{2o#w_D>sl#d+J|WUmt5$dWy`xW7D`V0g)a*Gqopo}WDmB)%{9y0fSijat zcd_xU3;!##AzXnWpx$~JXHg4UQ6HXCZ^@YaO6I~JvgS)69I}73Wljcg&D}ZjI@%FP$&ny34OP=ZSltWS%?MUYfCjmvS4X4H*(un6G5kSG^j_LWX4GAT5=%Vy8 zlHF;WzO5#>d9*%s$4WG;V}G(O3}>T1Kx@_sGbKu`ft6@(f6UKgN-a@Ux&(dLjR4*a z#e5a#pZZx&0$r#r$GCEp@AuU7fwc_(x+pk9_DWi2sAQXxKjW^v7(j{n=ZKpqKA6!T z?*%Vc6G_tt6`6zR21kx0^Jqzc<^$nof&f0?q3 z%@PJQvW!8q>KCIk^NA_7t{;AcCbCZZBX~%PVl8+^IBvaXU zbf@O-cs1g1UouREb9G65?aADPj$}82{rSExuEnFT7h^0Xc(BQK-IJC)&h~1wHrV zL_SN4-9@mRUN~NIH|@pnLFDR(o6ry^bNyPAPtX#*qz)0&loJwpjO8@SjV1_r3#nPH zoM&k-B3IYkF42V`sCpigH_J(TLG~KQ8(&i%+Ehm%M1;TgC$v?kngS~NM>_q^VEGyl4y1rj-+ar~#=z@v zUs5b^mG9Ucn8l;cu}6o(a)-R6<(InFI9Uh{Cs5+#kFz8lcB>m@T-4lGnGjvhZmM7z z*8*JU%ezePR;{EEI9+RU3-K3?4^r^ONXBBib1&m&d{9u4afD}IMrA6r+KCY{r7Y_Y z>rJk{F1e!Wq(>QF!yaPk)*W{eCs$gXj}94GF32kqT{*)NEo|U$V<{VSC1d zBys~lcEF7u$F9{Av>*9rNIY3ld9%&$T>5=i^Q0M0(m0;kuZVT|ZVFE=4I*2H9UU|2 z)A2z1ewx}L;HAAdKVDRYODa6fJZBr>8Sfrp#>6RNx&5;?@di;bWB#$1mxwWALyRGS ze`O(2e{KZ2>a7dzCp!1iTnO?K^p?pqb+E6^1O{wL`3hjx{n0%z%pv+NyBX7>FsyMc zL&g=Qz!6@Rz`%_27p5gB>u||t?*%OJ^La{Eo)sr`U zcr`hcC0@J8{LhBV1W++)Ya20lDEK+c5U;K`p`eqeV~CUWB7+ zI_J&^s^kUaV6vTb=>t93BTfhb5lEOKlTQ=z9V)V`tQCdbf5gS;{1Ox=eE*VsncR>~ zZdeGL?X2BpX@=iB(GZ!~V95%PD(`;_gIUX?(yC0yqhZ!|pagAMTP`1t;I#B*=MH6i zt870}Sm!?bScaX8B-f4bJ0H-eW=LC?UcQ6o+&681iVUca`4#(>?`>2TFIpq#*q z6Jriw602bio2t2+s@RCnpy;Ur+Z^VLp2gt}AOpj0R3qLR);yk5j;&w^Qqk)3*2E)k zCG@?b*Cq=R-zTZAJWjnUDPaZ$lRfJqPE0=sg@wP{_mCYQWFWIowbq9u`h@SmF+N(p zlf*ko3KD&C`dB`~IDy9>?&x&bjprvD$TY{tKApnHOU%rMSay%{#wR5opGz1gO!0@; zQA&#P7MNwTRgbwI5ohrZ2Fm8Gf*oC5CWlCBe?MjWY~|S5aO@uCyS^{`@SE3ETo%v2 z?f7xUaYkdorcJ<7)YWa{& zX#U96l&WrhO37AvZ~*$e8O)PA$NWWEixdBp2k8&Q`?DxT$cWmPGQ;8Zok^|gJ_>^e z*bu4U4RnRx;)Ic#S;fP@pEp~=s=WU=YvWeIb^U9ER8z?0Qn)`e{o#Q_XoN6(pWJJ0g;Ishv4|0rILSkD>V%YrAcG#B19n=*zZyiL5=Eg;+)(NPXsjr-z_Yn z-_01mY(>bHb(Lsjl<)!MDb~Zi}o$9S>%V^73a1cr&6WeT_*#NKZ zo0L`#we;PvqF~wiu34!0@LQ3ma-eXSZbVXFL6tyicR-%#hE}*(oe%X5JPfn1H1Gv^ z+JzBzG%U(a+Cmfk7v)codTtZ+f+tyD_vZ{jxiJm!tVqkS^Md-w#3#|knc-2g!M>e> z>%MZFTT*boWEADb-Q=Wl?4o|u(gBVwk~Xy$_!E6m&IN|7b}hk*XijOZ$`YiLxcYa2j2%y_C0u_`aQtSEES$L)N3m1lEODl65~uzUMis<1Y*s3 zR(~V+T6N(wxGrkRw0^zYWxa~|PVgm0hy`LIv_{!IAH3||at{YrdG@QD{9*T8N+ zaMW(QG@!wtgb{OsSHT-@zcM(re%AmlAs38mPTXsZ z15RClPM7Cjfpx5^J3Y@Z7xpx;VL3I!8iK^(-!*r!v2atD*(0EcO&OH2LDtBz>U~2t zqsNS0Rj|*|<~%e>#m=$XO@K?UD?Y@{p7^0}em!fWX+9-6O+uhfp;!yUz|J#z`hMNu z(NLlG_fM*UYq?y6daFg~Yd$PA;-@D4{QXeww@x3S^kH`gJnb;;g3_ zsDm32UFTRMT_s6br8;-k6F1>t!QmU}*0~$$qAJo}k!YSos|%h$0}L!)Yj1L9v%K4kxe{-;NaJ#Z?#`r08iAmZ#6X z4f8a`B!w>*wAcJG^I@LK)gOF^-vu4MIQ^B#Hz@6XVNFA33fVysTiPyiXFYIE^5*sj zb|fF$4+Ql&le0(Iy2NfcV&q*F;$Y!nUY2^)a=Q1(!d~#u^*!j$O49%1FiD?jR?~V< zmlimFc6-_j>jg;+HT2WR4WEl<#v=I+dP&OnI*M-d{t^#dKIss}J^kF)FwdfX4-`o> z`)VZ&wWEQ9|wS1RvH`B$?OD1HW~fmd_5M-Ulek zB0ZPb-F_nO!U?Bdua4G|T)BRPyIvhl89Q$JP1^lPQQT~Ii5=6dKfE8C8=OraJ|q9N zghrsw7|!vn1Wt;|bKS4%$~X;9aI}UYVa&M8M|>UWGgN8K2%pZ+h7YA}?G5_Wz;T63 zq-VTvQZQ*7m`}9I=DRjjQ9EB1RFt240TCdp$eOoT`kFCg$0?T6E-cFBFA-)#E!Lae zNwozd?v6@DH{)`gU%VvhGrP!i8g_>&tyk7(YVxWy53x~m7!24ycFz7A z;8?uOu}<%4ywIlR>q^~Ow}^&!1F=JWSZLU0!Ou3(dE5*>l(HqzfozoxxsM!Q!%ZQa z2ot?T${}pg&(#THtv>dE#^KQt9cZ1elq(*!3|~{MJ|;FMkOEH}fbEND2wFta|AiD& zFR^*10sATZ<4agNWUC)Yj4hl96xR_*HP4NznJ;OHyjhLZ8I9DEWwX(%|Ko?fI~zUl zh-t=}B{k%@8*vxtG13(bBPUfBxzGW<|ZbY&r&84!bsKHMR z6a0(@Pq|_pHgug#F9qCA>kUM49V1gOV$92CvkRS-2eV~bl&xDh2R6&M|D2l3#Z4UA zPpL?uYw0Q1Z{eJK&?cwy<})SqYXQjKXDocTQITY&{Api*xNohgGmU_tVpn`r%ulv~hbQ?} z{;@_@6@lL)E4uXt%9Nj6lFRc$^_TedpYY>gUv$X-X;~P`tW5ahL6t^krFT}fIs0FT z{Wn*X9Eu|3OM5S7xLR+-?vP4#%@!Niz#CnD4IozET%mJlI&Dphlj8=6eSL)*rT-mT z^D3_RDr11CUG&$1+DNK-T5Q!v%?Jc*yuV!RLyg#53l+ogM};J zRuOn2>fT8};6xr;hiN8Hu&=26Wg1_bfzq3KHxV%dJ1ZZa*v)MI++anFdT5m6X+T8a za$C|nxscdo}M6O>s9 z6rSlt-8IK5!_s+{Ec);&k#%F6{GWQIqq-vS3$(na2C^VRp`|Wb;W?U^( zo}CcsuPsko3k`tU@5(FH6pz&hdQG5B;3vlXG#^R#L0y5~H`}Rwu&NCD?AF2$rz?pcv}&K6Al^GkB;E|>H+(0&K@YP{x4t6W)UA(>Sy~VPS8YMCl;A>NUz<`k}AY1Y(@69k{a2L5<{k8t1>j6syT9)CN9c zAPz9n6<6YKa*cA8yQ_0h`$z(L55Q8DZC&c59CWQzmt9q(+&2O_vOuN90sFbBFUU0% z-wwO-KuF|l82wzn8>bk;;w%Ff0zfJ{>D4$^=+zik;?;<5PgddIBy*X)$=sP%;0U(0 zdPcef8fnQnMn)h&49@@8H-G~fXv26Y8;IG!BVCetx$b=EJ^u$F|16o(e4snuofoqQ z;XcDoSj*{lpYf|ky4bsE$+X1TQtb!2QxVU+q_cTl-#b{ym)l#&uQ^&UClm2~M!Mn4 zyV~iEK)!~+*2q%A*$FZ?Y+*6fO@$vQ4i?a*qf~It#e{pB4q+oxLp}SNYhnX{5qu>Qkkjr9 zCl$GaEcoTFw~sn%+@8-qz2zm<<(Mvl_@&UR!$ICjpMa;~LPX-RiaIKfcXvSJyRwe~e=07X>kaqB?2bYY zlV>;m=_M`mA2q!D(l9ss7)YQNYeyDey#@I2I(ttVU8A^{`r$0cYP&l*5os?9gNt%Q zJ>$s;Ydg0p%#$sOB`~1cHQ4F%nQ!Vw^lk$! zF=LV8)4%d{dMLEOyTzwy z9rZWzZUMZ$R(I047EI1%FAcLcVtP7@bZNUE!ia43*6}c}=sE2X=N=&-pXF@mX5Hw) z?fpBKvq#yEGS8mDEsXWX1ic^XO|I!bj#A?$QxUH%`h!~CDN%E6-+*$(>9xIPM`jG%{A_< z;OF-bx<~l_7ych{6^_ccJ>r|;d2Fdd5c%J!XlWX3>*pCcg5}(aKcUAWUWVPeMKb^U9e?X&zEgxD!JI~PBO*+6wJo#%gnhcDF^S=(@IkL{v| zbhMX;Ppwh#D4~dp6vT=BXm2gBUPoA-QWetKS>TWFo4;SEcwX7_`3bl3FV)fCp^Ru_`2!ljAj?$qFJ=)3v_NwF zf`q;$MWJiwUJ=AV(e%#qNTNHErAf)*Dd4cy^L7n%zQcSZpYSH!R_tV5`{eef^K1Of zFt`l{5NybWbI#$u{o#VV z@Dk}-8BL9|ha8lCe*x1{L%Oca%BY%)D&wwEM@CJp073J@}@?SId zD-T_#6lW-GUr2NX1ro$@{22Z!V~ab~uMbP@+Aj@Z$3a`9HanuMvZbi^Xxay#z=;E9 zn8S1rsnlw9Zi=6~UM`X+VpLkaGb-@=1aInO`<0SqEjeed)8$|4x|+*cy{GnTmkK8V zqjKD(Lh(wfJwG!_8ItxpXGHq5#lraM-)Cqs180yM%`LDmCWqn9i1NGHB5SZ3_}vYy zxsAzwo0XIc^PI;#LnWOV%BX65#UH-rD)ker@aZqfg@|(YFWK46mIJ@IAvFN?@^#Em z7_%XUmJ|p3&3>KSvh&)o3N}~?2>BdRYV)b7@|~dX#Vi2-MaA39o~=wp+!DlTpGYG)#4~8Yp|ALxuh?u*H;W+q6?IS5)mK zQZfeD%IfL-dP+f4JHc->iAbZOxJvF6qfgZAoQvFqbtCpN^D$aJ*XEq}ma7DXTtsjaj z^d@4{f2axlPW6ho&V!#K;)*9+xxJK0v(U+kkv;K2GoMZ&jzFbPUx`lbZhLOfK4RS; zgJgcaEGt3ipq?A9EuS;3FT_CU^&nE?ptf%Qmg1W2nklBIPaOS7_9pBUWurd z{e%d;l1v=~IcZ%*N-nb!h4Z6aHr7=xGrHECCm(jS7|{dS#{FBw<-Pf-AaKH|Sjr2U@8At9*h3%)crLlI4kTf7JE57` zK!(DAcz48!v)u?FH9{*%vs!dS!;XTwK(lC$U2t%+VAn(dkCcg+DNoRY+rUo)H76X@-F-RVwkv9J^Kpy9>_@5s6{o_(!uSW1Q9t#162 zg~O%-mC3|cKnITwe#|7>7toxoW4IQw5Q5UH<3>ko;8cvW5COMI21cR?(uCb_ZWba` zYwMk~`&O5=WfDP~4{zvIHyi^%6zW3B)Qcm#k_sM?coe~yEOHtgLx z=46M>v%M4Bh@}gMfgyg6U6a#M1H!oyK*l2e1)N+V??F(A*OpyPpUVjI44eRSUgFZL zult+Vm<`3+?XaA-#ZJQS)3#p;X9&11v1*`9mgn52iBQy~7ZqGo^b!|sP!4iXzJq%< znY1vP5>2*^AnQCWD&Gg<%R^85x3nf#?(1fy_TB_J;Nk!EfFC#*Aa-UqD9FRc@kSsl zP6CouSnP-mIxE=sf0!tuCDz2GRiTqgXKmBGq*k2%{MO_}+m3)gft3fxx_Vn`SH%=K zipXc>Ys)Lx;be?xB$mTR-z{=Vw!b5P94YwztlX_UqweYl-|Jo-)#D?NI*1{w*VPJzmG3A5MO;@` zj7owN_bh4+fb4FqM56KJa%-|UfK-%Vn47QcLAaAZ4ocsx9NBT4u#C$N2kmZW7lAq& z$~xj^2Cr;i)ps^u^uk-^MO<#V1d7`icr7aN&AvXT0K<>AuWow`OYy4(ETr)*emH0Y z>cf6AXgR_KpgKM}sqvjEHAivgIPUwW+?{7giJ-+yP9>AVCwp%|C|Fcf>^zh9K-gUG zx<_2}gq_|jiAbA;X$P}3^01tE_9$3~VU|*?Yacx1jyysTa0)C+!NK8VK{-4J0)h&z z#JFzkUEc#<3@PTRJE#)#Jj#7K`V{A>Oea!jI&QIT%M{pS@@t} zPfE#Mo?a@bkW-3;>_J_#2SM*y?KZW2MJL|{1;Y;oPNG}QJo|lPrAV2&uZ;YY)wdr? zX9VFk6)!tP7j7abuP=mb8j$}t0_^#$&XW&-W|AOaE$TIQ*RWuolixo7eQ;b2yLo2p zA)JXn&+?uTWkgPAi^s`P#X_h6K!c6qk+)#Z2sLLY)L39e65w}Fz>i#AYfOwf@>X2g z;9eddDgc2V-V_6BJlL+?9Jx9I+Q@+*XYd#lgPIL?wha}8G0@u@2n}m>Nuc5eMZ7P# z^kKzPxKuoh+63C?=Pnh#n2H;@zVr0!{E9ObQ_vo3O)!n22v%R}ZLqcM+odit(B{~g zfORB5jEQ#Z>oxYv9U2~WVf@$7(xVMAw4@1ecqO7Btvy8|@+92K0Z?_Lx#pwJi)=K& z*iZFEcd8?Gt|WNCTTSQin_4rl35ts*pn^r{E**?GSE8SGJz?@KSqqi_O+E+;-0FMB zDg&IkgfZyHgVkZSMHEw>uvsEI71~6YG)>KmrUb(+p>VnP)XcTQ<#6~w9lO%;tIt>5 zp3i$V*55b>y6scb3t6bE2?{%t4CQ9kr|0#izF*8ngPakM;fwmEJ^%IZ^t*Ot@Cb_V zoj2H3YDw2u7jA=bUQ3)jn{et~MGYiO8qu5yt$nP!9W<9J#u-l>BCp$GZ{coktm_Rw znc}|Ned1MjGFKf)rxmDX;qGQ;$6g=iDP9RI);+9PhzP`L+z~05devTgi!K943lCD6 z2+SGRDhF+`?ls1b!ALA*1Zc1zgdp&0#DnqU6nEZ`0|G_F(-_GCtF>p6))Lh`cQUm` zcPbT=i-`Q1^N?#UGxq!mq$QTqSvye#kO`)M=qM41Qf|HuV!?;#dC-mE@8j)&s8K<1 z2WFnr4{6|V&qBmi69>DKtD8DGHxZpP6!5~81lG5MRuO|>?g*TrOAZP~lKPxYi0Av4 zAh=_6R4oT%%gv?8Gd!fdqYTA;)T)D_f~CiS?)FHCCw@6jz{5}Ebth8^jKCrgMw(#^ zswxo%tmu>t*SMJ#bC$`0+r_LVmZ1oiU|EF$8d^osVNT{%X<);l?V$J-$h+{ImzgDn zIcVd9brR0eWCtMlMc=%v`k*;#8+gqY`j-zPId^$yz_gJr*eo6_p<~A-M%P5^V)qAH zO1>TdRd*iJ`Jy2tVESPuXy~Gg=fAubF#eN7Om9gnp*zj~*7WvOHz23l?>15!@LyLl z@}fXl$T>H1#xpSAhmGpVL`8yaNMQadj|OxQH9>Y|?&BHQAF%AI0rlf%MWyhlL!ka1 ztXU^8=-)n1kb?cM^rq~D&Qq_B7$ME&xeiz#isYtXSBUfvOx@=cIJ`q{VFi;+bBj8s zAOc3-6Y=7qN-nU?yd`sls(F*mlg1_5BA#gt#ZK52$;mU__{F64{28b)0Afq%-jOXJ zLHykn4kY0WD1XAyC2Wr=r_^5LXjuKyftr*<-b0u)sG36>$lNu+$sVtG+Ry7s{&=o0)*!%gj4F;L zAGaLK4)?%kPrMvHs6c~&H?tB*Xb^^8Q_SHz5*Txxc60n$+`>D91z?>;<<}kV#6OAT z$a;XUk+nk+MDl88-_MSiwDrSEwi7IxkRTwi2>OhiM63x|l7_ZgfgE@p=bPSC>}CKE zF9YUe8=0QH;31dj2EwYFS%Qz%{)JrLgs=8H2y92=2|`EpPJ)CpyUIZ>jd7M$IEq+j zYtUPv(6hi=Gn9w!9kr1^h;yIo2=JW)dw1n|F{p)W&_%lQzrUQt0jY=bBcQp+lTM>> zk-jha-8C4hK&!uZ_!Bc54*NX!umt;*oo96LNp^xAoC5mhRO`mB_VVYF1xZ(XU*_xw z!&*2_F&o`i^2Ml;pn~HW`XZo~p|*lhPNDSz56uUHmpYR;J~=Z5SSN1;D?LtLm1um` z=dR;#tGM28dtf;-yOBCB0fRsT!grz(T>)l`0rtt(TDu4mUM$g)N;o%Ds{)}&us7uB zd8k{C37RF0A!vpEfI)c*P;9v74uPd1fM@9j!WqmKY*>8o+or4(-i>qC^Htl*7TS?4 zjG-*BHR|o_k`h$X9445~iu0llfTG@)eBe`?7RIV+r7gz} zCq5Xp26&KK6euls`CWSi>lIj1?s5%WC)0!{1X>yE@_alry#@|Zq=bJrKFZq6dHARx zC<`H+MlULldmP4Atq{G{6&SvdJp2cO04~rP0V}3-teVRVhQn4oN>68NO%25Ke8eAP zU9{m`v=Qvkr;H$1(GKXM@EI4z6pAs*mzIIeo;m+`rQbnD0iHw<0INkxFnqBEEC!0sR;?=lY&%;0D+?mHc`2^q`bPU-UJvsKE`;V;Zu#v!A$SQ$r zje9CR4ym%Xodb!W@YT#o=Z{6-RF@mX`aZmb-F!R8C`D0fE!c5%^5)1OOjY)&v}-((+CBn;D`f>ot@#x&T|-B_5C4(+K0)--z;FVWY6XP_ zgbajy?#+laepN`nOLMTkfvt0&h65rM$}>@K31%4etN&U+CJkta>5j~JYiYd6LE-So z2vm zRCSMZxM8EVhWdgfUVw4N!tf?#^8vvc0%DujsueF>b-wB{yF@rx<{wf}EEN;M;&FcN zrL@y%#s!i zL)Hn3<18^EBn5sEWJwKmct!NY@lkKWWFvlK=9LBaLpU>tt$noqx)S33?@FPZQ>EEQ|W zvT^hWue<0E^iAxM!;(?|o774NlgQ6*SMK-XrZjRfQ_+G|*x#Gm%lzHqgpHk?3#3`h zTHHo6tSGpiw!n2GL`1;?c~hn(n;3p4AQCBZXOPT#AHE8)gYg4!b&hqnNskvc8h*6z z^}}vvJ!QtJ%DdM6ikwagZ#+4}>drXtg-J3I|K!F^pb~rB^@W*bvypttdi8-5Cf4%< z2Nx=NZHqoOn6YnXKMXvf3jUC1?+#5nMqG+tS4T*JaS-nT*L|+M)dM9axH|I|@}_zE zrn3Hx*OklQ08Wb{Q)}typ1|xW^o2q4vh5(g3ya^xT}uaZ$VmwLxb!cQYYCG{(wBcF zWLK#>QFPqD`ldc(6P2W2P0~Mp%&^|vKEY`@w}P&9ma`7`%sjy(j=3S#-SG3B5dKVK#qw ztf`y3pD@&^e8sK&dYi2agS#hO7k(rl7P&1fh!mVjYsfD=Ivyt51PTA^Cf0;9; zl!Iy?62_IyUBOR~EJcuT1l=&Za4J0SR{iV(5>*EE+i$$KHo44Qsz-fN2{H!i~cg?ncF*@Us0#8`r+9R{pkJus|WvFW=U%!?!Qo9 zw5VRbYW;)08(z}}2g16$_iS}FK8&(IHEsLMje7T_Pd|G2=%-U*Ac;ilN~T_dWN<(B?dxRKf%fFZd+1O1(8q?w$+z-D zJ;h&z{O@05M}cr?FByK0gl%u^Bm^VPP$S)iP)Cco)ghj*+UzZY!OwJZvXHN|w&+QYw|;SQwdPgs0Nlv;l9q#39tFo!Fj}vZtG~XAqzKF&J#k@v(;QGI zx0tTvr1RmgTJ0?&Sr7^;@@{Eg@Py{;WH^Y@f3~Y+S=tN3tiiaF!Lm#?w3>~oS7bi> zgaXO1VU77;y7P1|g?fmmAS^5ZGAmyVqEQG@2{)t02lp2Yps+}6pHr2eC|Ef(G~(4b zhXTRsat_j3>X*$6j*T+t6@oaMP<#GPorCa8u`vVhr+>OocoteOd(~RjjroWnGv&+0 z2^$4z_rpu*k8gNcj`h4pDs6lYFY#L$ZQkTrpBv$+++m<-07V%OoB^MsKHK4rJi9OL ztiVWD(Q%71b+M!>8s2IkD-_APsWj~cjNVHlw(+et2VRSLsU;GgKYl5|z)p~2Ke}%*gHBX8Uq}Rt_9g=7!Z&}3V#7+5!LQIgH`qxj_SxJpuTDum;@v9f#x?^ zoz;wQ2g9(?lLwYTVM**ZBtTmbHofPc9PZSH3Q}_)V_wYI?w~=?x zHeL*Bl$ET07L?r!mIs=pdF87>e#G8b{am#%}C%QLdc9OYv&-NC5?c9=DBIWsyrO)i` zBe^q-2Jd#QVs%*BThRo_YVQ$p4_YTS7=#&ND)a)1R!0k)=+3PEdYeND?UGDOx!M^b zS5aBw=KRBq{kUz*2h1gHw3DYIX6`UX7ScRST&@sK{+v$db+E6zuwQ)#nYDQ z1{p3_vsC~@(#};!Iku^4Q&VpdK1;0Szl{38rIrLr@J{cLt+CAhd^YX^(^UkabPhV3G`4sXQ`pQ@-)C+iRn*9s4J?qtB4XhP30MJveX3e6^-nUG<5uDY5E&jmdh z*VxN|R5!Zfx{!bJBTQ72@Wf8=Ry@`v2i=!5lQ{Lc?rvJcUEX@^vxt}c0o!FKdO%yV z&Vo~GFL;Q@jsQvIzDI90v1yX)UDrp-tg~_;)PDOy%;b*RNlt0G?F)XCO1ht&p&@XY zz0?|o*#gq~YC8$WEVeK#s2dr~y0R`fw~p??EbkUpn}LO+3bsdwZOZ)oMBKecLT%iy zRup?c&;=0}M~5}hetTh~nwGzR_tH+J->`m-v^Y%l5*void9$M%~EV3;e(x71z~_L|0m6 z&-_Qsp4*}&yM`ux#7j>YJ@}{+C4xF*ZjHpcu=KTNPHJk6MZ8n5 z+U0Ku&l$tCI+SYpEBkOmaUGeGw^7(c5dwNvF@4s3Wn0Z)yKZit+15h`T(-*0aODsu zd#@3nt26sz?2pRon;Ic_alZOw%*w>T4%-=&yd!~AHRq{g%6KfiMP0@D~i!lIthWcO;+ zpiOlL)%^nPimKRHKE%?Hnwovo(7}=nO{!-#Z6st!M!iM7h@b z=puGHanTam64+HP@jG31TJVr>!o)`+U~pdc3w3e~|7@N$y9g7~xqtf13Vt%lZE5nz zl20xlr_GhbT@@HnREN8nfY|cR3a33~sO?3DqXM@J%@d{Qs#+k=kbFqW!xNn_CK^#eTOtGttSn4(|a}GmD zyW044dwX0t5Tgn9G$qv137s9a!>bXzyYd;IY1IN_|NI>tcLdAQ#syaFw0&_T>;<|m(j<0N+Cx>SN<6;TlUPp%Jzlz4T?0*o%= zZ_B$pRetjBxbf2eLgsx9O}E9-O}y(N%rUC;X|FuO+$C2JxZ5KAVLD`0u2K(vc8Mu# zUHyV;s6l;r1I%e7upWx9k+#41(Kk}MIND3l7j#sInTIkHSSdjyM}A><|3x~gHNt8G z)tr6nYUaWdrU~c%Y2PzFsMc}8Iq1@?NZZOr)2$l{2qdya@Ucdh zOHM812yz>0=!9fh^-|z}+m}Mj>}p6DrM}M@kbSQ-6!J~|<>mF-js{=CV@_Kx|Bt?; zt&lsYHIfd0CowZ9Xh~HO8@#+(%R`{bhd$|E#}EuM7u4X1MIVZK&0_;!A z9hMv17KDQ2!i9@f4R))vGaz*1c3l6h8`NB;spQxfzpZuX5=}P5c8i7C4ysOy*w|>& zXwVAY!@s7ZWZ)HSt5{SxamQ2YFdx|up=$8QkE+<93Vk~|f2-^hxTyfcgI{o6^Y63{ zrOY}yp0*VXbrtX`f09H9%s>@ksr$gbiqF#w_PTA#b~~+sh-F)~~>|+M)Z;+2YoMOM8gND2N6%H=RhBuS!pfpldThCo?<2xD8y&?KU4;Us>#^@ceaY@cKR4Qbe^ppQqwl~Ml=n)UJB1-TaDma-iUT` zldKZIA$D*=N0P27!4JDWSPq2pqnbJ1s(r~BH>n~Q(sUW-Oa*Y8V$_aCjdS;E3vhi6 zgZgkYl@@%|8i6+{o65}UA#wOa1&8L9)f@ef>}ZJ3-Xc-2@|6hQ36VSZfxU&lZ5Qkd zh%>|Po!N1J()bod4dL_cM%?EypB6?9awWR9vUq~_f+V)F1n8eE&#c4Cum!99Yulo` znd1=dDV=K?&@uf+{Zw0y)bIBxoad>yGF@E7U1F(46KX=4PWHb!XG^ z0c#p70o6?Wz?p`M9nlMKuk_@?;CDnNXP>-f&%}IO@CgN(QfHVI3SZg5{vdZ2g?Z|M z-&H@5gairoMzNh~syN&36jCd)t#>P=ON37+X$`#CUkT@;5(a0^G%SfS)b8_$$Xkr4hB~GuhKngaC^Y zjo8*;AbjzR$&N6Mlw{67$cC6x{G*ciM;{^n9Q@jSKFLM-Z|>%MA@aM;r)+=c7(2r?uqWENN?j`vESiWx};ds9WtDX zt9=DnN~mR#=-jA2Ldy61I1nH$ox7^1Od1!l0bSD@>tBP0V%?nC2GLWrqv)BDNYMm z0!v(vOki%D+s0!!59d=Irf?5>_k}uGQz3hvdnpccQ*{_lCcU=9a4iIzp_{BMK~Q#V z4VbEieiRy5P&RG!eDAFTy`N5WVlB2~88mTG?`{ z^C5a!)r?o&BxCLl0$Y4_GtG5_Y#dnOwb7eZ0Ci%&!_hRj*KwlIY+MZle$wZ%qaSE4 zbIqKRyFE2wo}tUjfsC?cr#RxM>BGx^JAR?&u}=tb@D_M1FVn{#2ptB3lHY;IaN*2x zG1Pi)(n4PAP}^m`BhCc9U-CY^%ij>paw}XHO@Ufb3V)N1`v^*9VYPIiz}_Jd9pTb9 zsYIHF(yRtY35RR}YPHKj34Uakj*H7u+&>rwi;izAq)&4~B z@iqKM6S>EL^y2zM(^j;bb!4SRa81G@Qkux^x}Hd;MqrNbT|)l|9&*9BV}PnLh7XSJ zmFfY7db$)?h>2Yx; zm{mK7b#n9vjbA8KGDHMeB2<^z)rka`?p~<^0oU#|Vlg5M_wq5Kmqv0^tXIlH9P~mQ z2Ed<8_exDVz3OK8$mimdGj#Xe$C7Ii0qMFFpUGw#e4Q|!iEv!TVN}c=;c!1qofg6} zYxg*ULZTBtVj0z}+I3ve1;GyHs`hV8cuaLjH-dfY4)|}bV5g3{7)J45E%CwR9iW5C zd=Wz5mwCe3ruu9#_;m=-2S2AjK93@{Z`>VdqipeZ@?BMZNr=0oFGlhS8!A1=nXL@~ zjo07XF(t$a&D~grR(%F?Ds`{ASwT++diCEaa9Yp?Kffb>8vLtudNdi&djfn>j`_V# zGj8K2qKXl{*m))U0*Uz!H!kw!>5m&g`J0DTU$U&V97dB@`IqP?wSadU65{-> z1HZ`;hRkUaEg83N_c|y<@{65AF4PHFbj7{pkHXy_aCoBOaZ+?WmB#H8?MH)?fuih8_U}^Yg8Ue zf93P$UmP(K)%?@{l|8Uw;R{*~LGF1Ldk(iYQl5ka{RD=sg?2`@zh;gS+DX4-r&?nl zH|&|>`QuhVLkHCU8TR8bE%%}1LA*D<`9vrdA$WRZPHRi8KMa4}20;#}#4=dY7p}#5 zag_VNDFMM^C`#I^lHTzcn!C<#N`EL=(AAL*7d%}hJ0y?GMiw@6W0zj0u9~(DY>A0(9359^=twdSVBWX#dyakDwrc)P~+N7 z=D&swEve`jAda>Vl@0~HXOIFYq3;=z0Z4W_wH8hBxdtBfFHLY9hUmOCw2uT`+$VTMMkf?@uZ1%ySRa@dZRF z8yR4aKTTA7NuMgrPjHG6wR|y|Y~3lMriI*4ZEmk)$99o0MUM)VD9}c0=%nUVRiN)7 ze*;5t^=q~p2(`n{&IFEkTe|oK;o^E|#4*-=s`v%pO_s(Dd)wvSC0sV{ds7YL#xlY8 zhhskJ0VNNJ(Y6cVEcAsTD1p$&1O}n+Td=ElncPF*fL)~o7b3RB68wXlfnzmPT9+VT zsx)(avvCMG7?TIFSwtz84lovsG!-jpA#d<&?L(>Qz|i2o9=nF&14fN4;7BIm20UB( zDRI+BW|C2)#F%Unh_giiMph6x2q;BY-IH@Qq!(3Lrez6KIVXxCeL;~9mfQ9Pg@WhQ zHiGVGZMIcs=vJ8pZEc!22l*Ou?yD!#QT8&^?bbSp9t43c8fr4=y^{)Vvxd(nj^Gcn z$Rz+R+w3>3@xK}fE|m)h^ByM&ZU}`8+!LXWfmQ8h&rKg-u+tmTKxO@6PirB)AP573 zK&F{C!*Lsq6S~{sp$)nl-JmT=`JXaoKQ9`|miyP@E(R{U{-42p6MyUG3?WDm($fkRFVl zB2AV><7$AC`~;nfQ6E`_y^CVc#FWJZI|xkG#D$5M_Z`=$;!tDCp#>n4m{kSi4sit4 z3)Co4a6|P`E7~W;QT;(b8GgXTH7yyRst^qnmhsV$Nr-!{)WNv0cAf+;PB>3uzMnok zl+0jcJ?kb5@tw!eYZs=(X%gM%ec10CwC*$CZvof4;M(jf`|H}x^m&#hvgE!S7C2=K zj-g4%aql)qgWjv~F+%z9bRtm0It_@}K1G9P=u+W$&%kbAf8(z+fOgX71EvndhES;E zGnNJva`i(Yn5j8|(t5}KO5(xw5^-s_B9^I5Tjq?k=Y5}1-^B00Yotz9vqbEmbR#JF zUHMr?nnT}b5>LR&zFJe5Vw5s`o7p@=)U_ipcCkx3(7@xb5G}k^!uUFm@x9lyy6@M3cDJ!hmBxn&)HRVaIv-8VJkBd=JR5aCuS9iX zf^>v;(~KJIKMBBunp`ne z^czuGQrc9AAYih`E5`x;b7s;Bc7Qlt8SZoR{LWe(NS8B$Z|8}wf|m?=BleG=4obqQ`UiKtr;nLO$n^9ZruqT%zGC(g z@c#7g$WJ{5m{6M2kYOsh=cqk!3pCBlNsIij)KARb9hku@NBv(Sbk9?|EyYWzl?I_Y zz#UupX-%sr!YS}k^K9pyr@DCSazH1cVcaG_dzT}vJ5;v(XjiNf_v59Nv);{>z*x~sST9xjpNaPkW`gfR!$a6cQF!!2ao+lO^{*h~^ zepiJ@ezv)qS*~&ITkpB)o8~P1;HNaG5lxI7{NJ;i5@Yn8%DsEooY*_8L~CQh>lMTE zRro>$qX!4P*&=oojstSoNjx+Upu4NTE_5rgb zuXQ~OP2`FO0Poekc|{ zNbrZJyJvRaREALRq4=>scjx{}g5jx4Ej(Ajx4R>_wZI+%i*536ht3(foRn28wx|7c zb}_i3B9ma&G1t$t(eIF@kw27f0t!*gm992I@-Fv_u-YYhfsZ^w6+I=!EH~3FH`1+8 z5kTTCQ1w|=ANsXut;r_>r!Ee>DbmQd)+{0a^l;hnTI;t{`1?>ku(LTa80GTknEz_y z$gjDff6a2>4_CQ}dKt3$c6<4cp8-#o^(B{Dix@y1E}V^nslk<8_(SJvzk>{)ThGH6 zE2L|__7TP6H)Imt6criy80E8yl(z%*_*gf@lJ{`mQ7%6h?10a#+cUFOjeA%D*enzC( zw>~bs^Z62ygnq(Y6a8z@9#^ohJ*qLcr$6OKQAF;`p5>90-+no-M%+BC&*Eaz&Kt{B zFSi3%@fMi;%{K(iD*C{Usi7NF*5>i=_5`&U^PdLp0>Yg(6((|?o%(S51aUSt2x9K9h(;m@7n(H5kX zI<0BlQ{>KsiEO9WNNVhSXxG?Ljo0uatB^B(RQKm69m3^@!jK4$r_THSeDzWchZnA| zjQarQ5Ea(;oY@HO!0pvRzG>67v0uw9?$pL1uY#fTyt9+6Gv0OLvOdI zV@HlMg?>lvb9BVnr>Yg$LC>a`#65=c;v5t=hCPXc-Wfrw{Db(Aj#VvX3G5cx2{BOu zyb*m?f*eVFmAbSdt}Pf5w89kHVOkFCnzgdlrJ2g}jr~3dq9H?h9<6VVxX0XF*>h^O z!z?21or(#ZQH){P2@uh*X}CyU&UGiw#D`sA>DyJP6#F`bAvZtpw2@Z-Vx1Vt(f`91 z+EFfRj>HyzWJgn7MaJv|A^_Ol<@9jIYE3ThgAh9+qw6sP7l{?_WC`u8FkmE%6K7_J zZq|yIGvP$5?g?+;M+cNM)Ez2$&PEJ?ula)No1Er8EL&}=)7@#QBD@@g9bH9+#AEkyY|$sA@C5p%W&9}880+M+`=fV`YfPk%G#2qzKm|7(Nj>EWfMY@~$Pm%;7ZLaO`m=&Y zwP7bUkjrQiV4Tvfxv1Z}xIE(16GO#Mlt87{YH|h0iWtN=iYXN5dgb*FR*IOmG%)B; z?HeGS1or_RF4`o)anD!ta|-Qv?bxw-m}_J!Nn;9_L`iIdN(pnK>EU1Fu}*ML1FAB> z4Uz%&`JimndCRmfJFZEMcmXnAiE0D**N#J!zJAZ$0Mweu%ufLRMYIE*aT#%c5k0r# zy3>Rg@Utb&*z#p6TSt6-7f^i+QOnokv((4bqZhCD$+U&Q=-&m($w!F`20ACy?dIYE zAdhEJZtC)&@xSo}*Q6c__7u`y-dn za&_JXR{#{=E@i5N|Pi`5sY$$KCYWRkD4FBIFYf8<2}v1?9mrScKD!RCSZmiVXkq%n@t-AQcDA2#z*(Ebh>daPUtpJ_$!4Wj>$Gy&vo z`Ie&rTY*_mCj*DAKb9>K$B`gglK`j@+dpZ|?&X1@0zWZ&?oI$&hByvrp#el5{^fl} zz$rjlf2Uwf8uc|3pc=AmbEpA#Lvio-P1BoX#v1PVUx-7v+Qz|y$GmJwpY|xy6<8_2 z)uJq9{XdmKKF5|9_yT-hn)AYlk}Bnwa5f}SZZ9P8fK;^$FqJ|U0g^46zxWSe$KQW- z)E$sV%#qFkeit5eDz-jY)#(_j?|j`wi4e9o!1kHVm;>yb)*@;=W;eZT06+hr+pGHZ zMUUqP4aSHw*h*G~q60&8c1JtU7J0RRC}UwqC-eh8cVTC(dinm)@XXS5N-!9}ZPhB98NLFVgJKOK z34{m&h}^mng#l2{P;03m%ZV=iF3VZ5;ckgd2X9|+5BH=V&fvsRb>Kg7Zg`NlIm zYx<7Z6SJQYhM^!Ga!}@$EegPA=W;&AfGe7*crGZvZ0l2O&g2bbfqvi{uSB76C43o9om-eZ6PL51@eN z@&hC3fg(NP|B~E427v$4;55*`r3HN+$OKKt1K?nzaJBBMf?WvVR2rGzTh6feE7wq-n~RXg;=9Otf}0h zZ1ezlTL62ZB3G`4?okC2E~N-yF_6R4)_K)NMYgh^UI22HGXROY?u(^%^TDVaf3)@h zTQk*@GGzk;1-PQA2bhb4Im?K$D9X<-Sm4y>32<>UqBs&k?`6;%KD(Yhb}iPlYQi8s z)%Bs;=$8X{Zs+=Te!`zLQgQGuXcZvcZP&<9Clg#B2E0Ok2dK9P`tMl{!Mfk02Y55e z19B|T%RJ5MGqM0Du-|rNbKl>b`*V@TC}cWz<_;xzWY9C53?MNfEV{Ypf?$Am{rWtU z3?vvm(?Zb;;KkaZ3l1<@#p}E2)mEJA0W9lib4|1&pxu+n78zYE25>s-+AJ$n0b%@7@gDb0Wi31nEUjSr4{AS$Ot5?JjlI0;g9P&2+&0^%&o9a z7w&ULqJZDj8koR?B~fy50GZVW(2)VZsRO2Lq5ytq`kc#Zo5ntnp4O?#*`_6!!ixt^ zEnb1+hWdckNfV)n+Ded^TKnd$$)A_dD&t@q|-O zo1+JL&u~#d6ut{EwHK7A>+dl8a@2JxY7_(jDQVqA17Px%>aT5(?9tiKsV1p(Pj_qU z{`#sP!QQc1DawFynPiSEpQ+B!%I!+yRm>gm3HshoHnm;w^MgIYe zKmt07G+G`s-9jF1qpi;~Y@*iDQN#fG27I|X!X|ALGWD<)$V34MO~6lPHwy4Wvz>H4 z0pAHcxBzGaxD-Agh~J9l(MZc0_@W2CO=bQd0cCmM6Noa$J`CLfx5@52%Dj<&77gSR zn4OuHIZrw#i_;qwJSaA#S%>iXBmUlpYhMCaTZ-Az$n8!k?Hi(IA#+|w5m&uxs^0?C z2IX}0wc^>-xReQqxxX0C12>xq!|#kb z^?T#f(h2><6m848BwgOPFYy~ed*>hSKJ5zvI@lKou91~F#mpRs{dYwTI39Z*d;!8o zg!_O>t7VY7^5tD*U-$N;$1+L2gn7V@fJV02fu|O=M*+BloUFoXFD%epa-Ea4IqmP> z6LYnGw3O?D{oT(3i!pZh{(SlUi#IRvq~_O2PtW$RMN_W%(`vyXVY|0ef|02BXwps| z(L0}KvHgo{_@&X4yNO%ouOGYQOSO~^^#u3Jdb=OiTJ#x|TGSJKopZuZ^U|VN$(_uz z$j@m;l4ds?U}w!lzP#^BX&uhK?c1aEiMadb!RnnSh$EP;3gxqJ;BDAhH>b# z$b69QS>vsKJ-@|nG)(+sml%%q%hkquCUDCPGS;)yGHsJtNhw$sP2vv-2wJEHmfJL> zPb~!nLtPNI39zlmB_V*;f^!Rozt?ADka$Q#aI}(j`c- zeVrp){XuJrZ-wT) zgPQy@~GI2jp>0=jT!A1u^y~NsS zSk%K*a_#$B(Apb21tOB-r9u8(H*`p3c&fu>4}wjx4Uf8=|MDW9*UM^BEeWed?M%`-aOsN3)_= z8^2l(`46|J*!YRXOc(7(Y$`y0PG~FB#9_5A#ia%Q&Kr4YxQ#rU3tF#><0^O3>SFMV zONaaywS9&ZVkF8RJMP*LO?SI<64IR?fxIh>#9m3Gc}l+c=;v=L%T?#d`jzG+SP!nO zb6s6JW|=r;^w95eqmk$LY#6mN8>XM1o$hYbtD4{Iky>}LaX&5|muU6MO2W6IsMlix z?h!LqHuk!Bd`&N=)Ag{P&UO4EiL218A!>MZKrZc)nd)P-+sJ~L(ouO0yst$VybSUdv7o&YW6fbhj-0;L1*ND$rY6A4iIJxxCY0i>Jovw(TG;np9SEyd2F@JvM zIs0NWbp;?1#LSR#YC%C^;|b81Re6;`E0;vr1C51b9dAcT=uhqA?z^oq`qfI;mc(M+ zK;+5p4)tf~;J-d<#x~8)KKZ=-Zfo-8`JgffW8z$Qe$F>pu-G+XKiH^OgY?(EJg74H zeNKa^eFOBF<(*fyW`gv(UFTOM1DY&y$~H|mqb((OksofvFN-Yf!R+OlXlauEh^PAV($+ZjdSu*~jagDT;*(Dp)uY9}sUEtQ>C>swYos>Uoo%N6xY#RE^D2b= z_}I%l!SBk8J6tsDH==9b_PFDue#wk=f9^PT8!UEQWAuH^oKH;+uT#y;qd_x%J;U;7 zUq5iKZ|F@+9V`2qI!pH&SY*#v#S6*OxW#1cpD%Ymr*Po!vHQ$G0rFH7b=T zkoL^1-gFjJYE)fsa`U9QSxEC)^juZ;@>e6DM<4Y|tXvFacdYlUirJkm8AkIjaB6LX zeICCwvXwcOH_OQh^QE0;)6odyslwOB8ya}|OwW*EMFOt8BqwL-=c zpG}C^24e}KCoOUbe7&*g4)jt`sZ~@56#OB zfkGo|U1AF$vSx$dHCf))^87Y+CrDKj@kRvW*r@e}*!cB!UXy}DL0?=y>CYQE^{jo;$R2X8 zs(EJovpCTCu8lVZW>eZ)ELVIbU-KyyD5N*kXkmOS^{i(>5 zYptRGe=}-tmV^}#cNN)=rarD;Q6H9*@%cC^y7Z{D(ZVY9c6ohStI$yOP-Zxc{z}0+ z!2Flbi0E2Okm#CM0xZ+nf54KN)~4~(J6s%d6hz^#_Gu`(ES5u2} z>1F{k)%!)GqLMm}G1&>{AnlgXRl}wvn08jV5$sEOVsjGm3_dI7QckAEZP$l>&30X* z-tA|lbRb#7CwBtxKZcY7_3u{lsfg^0dlo62ikIpwEwgMwr=nRq(fdX9LzESyQ`yi$ zuv<|pS;Z*&JP|Daqf21(Nwu)|uca&-vQ>a*{m7%$rUgsU85&{-JtI}_>Hb(BBK*3w zL-`r3OyF6oM`YZ^-VS9;Sh{X3^`MbRJJF^(z4Dx4*RQ5_xbyktskz8=sQ&xTG?>8- z+LjXgbzq^!>FW^Oy7KD}!(dewW zCzhESx~u}j7%3gcSh?~;rfPWC>~V{QNC7Y|(yqN@c$ch1Lno5-Y{=*>&9MBZHz0RH zU8-|lC#!DP)SR<-asKVfl|v1xIeoK0prD|)6*>j_No^y%8~W|&KbNwv5d67LRln}{ zUalU?MrW&k1XEOevM=Yhseb|{QDJcDXQoY=Y(tmF>AsmI_*7PmO=0NbmsbJGF^Q6t zh0Ls{3y^2Fp?`}5Mn1)`s&vJg%pu3^T_1)*x2osC?5f*WdcLxAWGzP##1`* znXXu(jm_n2ZMoL`MqLYXdx~51+8Zo>#FUhO@O*=@OM*xG+_SXHE>#sduzL;0pNPBO z$cp`EWZ&S@fRXsaW$ypU)oAL=DF$;Y$GSglN%Z}~fYKFBYap6-g_r9de{X}24q?Fkf#s$F*uFoh<<#55fY-dnJGL zXOz@660n9e@17Be`yK9 zu9%pM!VDFgqnSb125;=i!! zu#tx!ZSBxKt2&2axU7UE$ore?i8^*6@6A`Y?Blxos;?Co4$KHEOAl@wd;)=vJ|VIx7D&zs2RCw zbr=LmoQ;%B3og6x+x7GiG~_S$b5#Ek%bMs8$i!9np4Z{cp}3XsBhMggQNwRbnVE*) z^d;}{Up`ZtU7vK*?Pa(h^&v0qqvd1C;0JHUwAN*hy8Hn}WT~9i@i|$BTd2k0EdLB^ zyq16Nt8LD^YQy&pbCaqDZk@at8SjAm6War&jm93E|OV1sVXaY1oGDYd ze+HLSUVQ)BX8Pe;l;+J%Pa^Ed=zaLc4Y0Gjr&cx=Hz=PsVd=I`G0c%&UV<5+s<;7jgVzxq%(Z&g-xjDlX61g;L~rGv~iy^#pVGfNW-B-GfQ_!=*Ze4 zmKp=os4yQHUdYOle^}|FGqCJis8fAh9!uElD@#-(DM#xDqaXsetPj~k&d#|w)mVbYwV!!Ey7=XZn%-J05SMwK3)7z-y`A2GudI*JDy782vv=xwaC(LV#Yy+;aSCuL%-r;oKodt%olm{VyHCn%5Tt&)iiaP#%mHpE2 z;Tg^vLC{$qiPJeIKmSFly>D4E)8a;}ssGp+L7e!6pnv^a;q6nK1=Ix*`B_Kc&lKgA zPwX3pj<<$ophgepocFR-`9_z)8F724%nlv4Rg%L(|AE-Cs23aLaN-1bYd}nZ$C~iW~+t`svEigjta(qTU{_`*%+& zuhux;i}V}kB?u?@Y`uq;C^Ft?@*(UoCcd!HlXNcV)!dAf!p4Hyaoyte4XM$GiTqbY zn7sSX@7*JRxV6U((frE1Idh86y&<-!LghZ%^`kHhKMOg`d~=8M_B6s?BKZ@n8bp6H z!~X`}=zzHte2k0ErJVR_A5!=?WQ&XOM@vL*!@oJCgz^?zVjo%}vhimNbfXP^$dq2I zMIYxs-`#nvpnJM4V1wta-(gDKwiHgE^Y$L1ah$&}t+2!@*IXy?gM{3MX%pX{zwf~s z4&L?tCAXT&SL7`B6px#m6o$2tUz?{YL~Q@OJmw9sNtF-!{U z+We%0!ezSJaYB7MFq(Zx+%onxRb=S-Y4n4L{1wUHVDplzpZv_dS5U`%$B$FF?f!z}`1`Pp zW4imn76x#zy-+Nk+pKwdCax16mVFUh60s1_j14O`B5~K28YDH*zTZ14LGzn9vG?{g zn!-greX_S5)|4FyaXiAl*=SZamuiPELGGWKQyVL>S>!D~wR6-gmXTUAcP|N2$KPmD z_Nw5bg5JGb0nU5#uzhZ?SL58pwfkX?{vKuSE@e8`s*ZG>?v1SN53%?1t{+^2>NsCX zy&znWSlxaB#agdGPG}hWXo*hA`kqizy4&cA z-JuAd4RNYS`g18;fBS+TGUOKUx6Zvr`fTVSVWHfP-x#pHzHU}as;QTH$I0Ru1URg- z?3IOy*LVw~@i{HbgIQL$Ep%yP&V0cCi9)ho{K%`1#scDM<)(Fx9 z&U%@SmuB1UxJnoN(90WH~>q=>Hj?z2^orM{>Wk#OGAsn=T;r!iNF>)$#Ws^+rYXHD9XD(Q=5~ zCGMJYkbj8WH&O<4E=)_4bZ)M5Pw1wVA+D|J&Hj`-Dl=6>*Eu9+3;E|`!ac5zVi_CQ z^$a+7O+|R7BstpEGIgLlcJJKPG~b$l=KB9c_MuxZg3Y&H9PNj=6|R8%2d2VhDy+u} z8*sm*jpfwFCrWu`Og(-F?WbJ}ZC1F2uD`QN&^U5cr%p!LV0`NIx}v(n9m+dAAvR8O zAoEsdCU}Hcf(hVGo(X3(!K{za8%mO35*2uHAdEjGrUzpE zPGr0Vv>zT(Vx!Kl?|H95Fp)oA-o4iA3!_;%Ve36hO1&j?b_>njk<|NQ6UE(u?tQUJ zuvWeK5NDRFt0JLJLCg+u-YmrPDD>)h$uQq66!6T9y#6#y%(bUS$c+ZO%SZ8d;hvF1 zcx+7&XLG<+(o2n2NBOk>F#f#?70f{dp5&>AEHxgz#p7{OL#zTk%WQrVfs;^2cngam zbiCMaL3d%Z%(gcL!+cZnKC|^Yd*Wj=H=_rjbxj+M^><~2FCetM;EP8#5KRfOJhmtO z(%tboUUCy}2-@ORdZb1gn%na%uW$xd5#iJ zGCqpr$?qEAuMfh^I+Xia(DNS;@)uy&E?9C*y+YON!@luZ*;(=|qgy5-juNmZdlAD9 zB$1H7PEA5@L>(Da5O}L0ec- z<-F|?OOrF(v~jA-X4sAcLwu&*#EV@ZEQbB{v@pcVEhJ00+m3f1F~_u#k03_$*quuU z7gk+m@f3pREWk$zVBTJ+@DysefHFo2r-^{x8*P8ve@iI*+OnV9!cJ;oE|qYWt|6Le zJ#QI2U31iTHv6HQjf4o=s6D4&HH71O?h}7UM33$d>M=aO8{QxpA>)SceTEN^4uO^+ zG(~_ZJ6t4r=slVEoIw%X^6cqa!`Hcm$a=;`&0|RJzXP~1{NfAWsC;&33c>^xO8)qa zlTh!jglV@8;2gMHgZ4{4!o!9egY1v#T;m46BRc&)Wm(4<|DAvyT0iX6 zf2Hbh!#@!_;};?eJ73?lJ0V9r~to;_~!S zm~92qyPjjGXT;j=3M0p^@luix4gHxY5vy~MnDUA37umWkYZ4_t5xe!|NZx0w zw1ff3dRV>W*k{`k$@=JoAG|N;!yGLjgS=!!^=#Jnx!!y`#l$&c0Qtra2i?5QDpV&_g? zj#6?=@C_ap4^ekRt46iOlAo$s&MP}guzT^#3$~zR`wp_PoLZ1IhpgLc;a@pGp_AcxD9{11O6ZT@WBGfFF3gnFsq}}h+ z-Fjkh8N3K;g3o$icWH2HoYxFJ!r*l~awQ7(kI-KpMzd!L&OA?QMmhgKhf2YmADNHZ z*l$(dhAy7xE#FXexADxv+cyvR+EC+0->6JnN$xj|?P0%#2>;?2?&*}X@AA+n_$-d zm2?oc?SDaYdxsQ;+)6t-^YThS?;gVKXX5g%rt-kwS(Mz!&^WvFu6k81Fg^NLx9Gxe zv&E9Dsj7TeqFyRSb3seCUfgS|aT4D>JyPWTARFs303KT?LDsdu0Bf{6KxY@eG<(=& zfvXuZ4=i@rf2w{uSN48~ZkwmDZZ_!JV@onR`!WHnY!@+;7IV@DD%wyKC1;)n{+X=fVz~qVAAWHhfs9 z_3N5`puXmD8mUPahOt(>ThIR%$w8}Dh#vhdzI2lN&$r0+sgh!Oi5&S6cO4Xe<@i$4 zr?6eSRDD`Cm+N=eR6N?;C%bktpcPo@va2OnY`Xx9_1e8WeUaH8Jk$VE5BU*3Oe47Q zrHiJ6rzqCfsXq0j%2l8x4h@zH8{azkSeny;L1vvRfhQaX;U(i%ZLHj57uy``0GTTR z<*KVrME1_DE}pz3p7C?3sz3V=^kpbfU%P`|dTGY>zfF#5adJUu8K018<48bNwHvnK zkQ z?V$&%AfZt%U-2>hI}iChCiRMU0=*{tX2`6Px_4T2Cc0iT4&4^F?6iHB zx9o%{ME|n`wT}%0hr!;K-JC^kd@0Kx+|E{fE^>pb3js>(lap9S31^8M>z9ZetU(gZ zYa9gucp4BT)>xqAD%{B2{(&h>pC>O0>Tt5V3jqp|$R|e^0Sby{8?ssxFBqhX-Y@u^ znj`6_ctE{(A+WSe31W`%JGkiAWLj9M0 zp?-P$zs+nviu$;dJ%{b76*4f>!v;e}$^L=axr>*0?5;XJVySki$SJ>c%nNpICTu+ ze#A6&YK#c`tgt9mfed0|uLkTT(O$qucB!dtyP|xkaI5R~ruI3)npZ;Su=^Rvh_ALh>3j_toMO(*x!+;xTMmYv(V| z$L9J%li|}(vfZ`5>4cAAvxQNAd1NQ5WxD^Z-bMNUYKx$F=`H2>_T1ZlbA2rR#M(HX za~ORXkzuqN?{DTg_6}A>uzH`gpdw?EN7&GhV)~rt>*eu3(r07gzKyhM>>Gp69kcCm zSYw~P<`eTR1Urw0|Nc0%Z1mETGUt@L(MiduMfF&+5E4(Qhk>>KNo@T{r|9b8Zr0fGxOnezdTbAZ2em@pe zH1E}({bQJP%;51gF)fG0S#oW)oMG;B4S1VK70b`CHhk}8P{^P4pn38O@{16RYBXSw z&lhB&k-#|Ny4wFBT2_VcMx?K>>pvvTfwDRwY)f408#|)^EoZBK5xCx0QW&)~|Adq| zcA2v@!Tj>f-$XlG#L!CMrgayY=Da_@4LI|F+nXq zPzgGfs4RAgZ^wOJSqrJxcp9bgG;#l0Y!LrsU5Izp6|iuk|laxK%M*K~Ke;G-d z&Hl9ManYo1>AjUCK6S24tMBbS;hfvUD4WHH-HAM)yJp6!+7QVDN2T)U0vpGipmq4E z)lY7qMX9BpPR0iTKc`$E|BQHTHNOQZM3?kCIfY=YS~0n(#PVsWR}N9gT%&ay3eK^B zXJMVF*x2g+eyELO6Pc{ljEysS8|s`y$cQfALh{H0T+_`yP)NujchPG9Z{;4~#;tJ0 zsH$BA5!qR9G)y`A%NJ<5QH8507z_VSNmgTF$kiVV%7F$gk^pr~5Nj8&P*c z&>{_Y*?BeA!+g1EyuRM$B62qm_`}nZq~b%Z~BKgr{6M!_z!iPb>-%jX00AFNKMcH;PZOYNtN|XfH&?!>H%DipfM56VVH#f}E@C@# zxfj3}$pg8hgAr#oBr)Bl&ykxZ+8svPqBF3e@pkk4NVE0sKH%%gyN-Z|m%Eymhk41@ zjd{tpQ$&!&^ly6yKyGoa0;U~*ngier=i*b&k#cdsKw>#=fZd6 z+J}!LIci^wW6EAdvb{y{fS|aho8z7AnK(zqHOml z!yY5Id=5j)xmX1vdj&u2El>U61-&$JG9QB|jg zx3WDF_#dAFMMEabJx{2ARB*EQ)A-G!K;dVbVk^Qz((YN>^?TYDg1H)VHLFu24zWIg zh7>ruW_~pQ8HBRb6GazO*?n5^2G z-u+7K@xuNK#J-ziM49w@hdSJXJQd5;^)UHtYv4yx){-_g*4Z7L40~hMI)lW{NDWNZ zTY0w%Z#`u!pK*1*?xwU3 z!1hFa#F=dx`$&0ms6i|;&@|Siqa5)>Bbb-2bxW*+f6Ot*_7v3_=qEEW@&qH4beU(@ z*DUBR?b*i``^DX}(872Tf~8qiU46w}GIa)Z@$pj#QHat{qw9nH_IR^;)kgNknu66N zyaN-4FuYx`B4y!uX~+CP9VRwcuqs`8RuU|=j6@gHdj4bdRPhbE$_b0e-^iG_5k6ii z-PPDFij<~5-4aLl`^^M0`R``iOEuO^ksIut9@Ranyb8$RI27_W}+9mq%HIdk^3v%+FS`0wWcQu>cBL{gm#9y41YJ#sY;(G4#+3<;&L#d-xy!I0*wPStJxb5&@tp`K zs@t|NDFxXb)Gg~Y(syWb(I}7eH*VX&-Y37kOLFX(OLEFzXT4{6k|zYFm7<(cNEk|% z6n}$Y;QoV`{MSKsEw4Y`%pYFov|i>q4^^Kk?zYIQwD*~SoBSpEZjk1tIq5^o?t7hx zrO6cuFb7*xmW_wYSqeROtJ9p(KlA>iT)tV7o~28EZowP(pKbR#?Nl1${0={?)P|jY z3R^_tE586&k!oh=SCM&MXO+47+Hs95jQVIl*yF=!E*3w^htANrOrCy@HMmAO*UT$L zoz{@%x{gf10CXTF|j#oEFEeitVN|3OWy_+ovI1#JgpU-7~n2h0a@ zBQDnu)i#bl0&Y6&4>Kl&rY}c11#d>F44!~641aDZ(}A-}AoHTAnq+dPdue8FEo-wm z&UfIB><)TXHy_Qzx4A_QqXfW&&ikafeA_cy<{V7bzb6(Lc#EKWaa{7^=6=+x^EJgo z$@cFjvtKk%DE{MClt52UNMY28^5S!gOOsXa4{YYEiTdQmHbu8qKjiJbOEh0Anjfo< zU^IeoofsH%Kp}F%wy@tO%f7#(u)&8pUVn2JX6>SV;{YzwU7F&ZUc)V0E49HEb6Hvi z6_8L|D(2PC3L}g~>^J?(1Na*= zq}rmKoj%Ro16`xIvyQ*gQ4Ty;ya8#6-NDqC7GbIXws5~sQN|_jQ$E`F|AEq9+Tg*^ zm_Vz`W=V=;>wsSn@#dhl##e#a)R3?UA=4jL4Yi-u)4_!zsu@Y-owz{{Rt0~AH8`V8 zgZ&48u>v}k(HdOoyNx^bfG&4W*!(LKykEjI)XPLIR!kY5QT zms$p_VaHYQIwPRj8;2#*nyI(*V+=kRj7+b{wVgC=B}b|aLszdB^c9bQFmb7l3Py&} zb2-S0rt#rS?@Mv!qR|NqjdgmjKiss^KS2nBs$w310LGYhUou%G+u@25o^EG!xwa38 z)nGR?fD1#BVQit{)#YXwe5+Fo1GevS?E&o+A31oMZ&Yo$wrzek5q&WNS?V;~nS6!3 zFVohjq|(zrJ;+8}T9YtwC|c+;oP1hqOsEdH7y=o5O^f&K_YsG2Id-hXPw^vi3Zi8i zd1&H&8_;#nn2?s9TZSl#x$Z8#U|f#kUIn|M7jN-X5q)p+tJUJUu4@>m|B7-q%~9T% zFw3FZnBdfEM?U3=dp!sK4-j9ha?uaJ&e;KUDIbMHV9Hk*W7z4?ST#<&(KIAvpG^`Z zT1{Zgf}Op!|Fog1K8sHt7|;J5o)~VBgT7x!R^2GZ+^Csjwt_Y&!s5AwI@cD^!^M-_FPr6Yq?A8Fw}Vf)gIL^n|poo_14&* zPW4f*MpAew3B{m2bEu)ALE9oKz}KCj;(oQ$_ptHN7BZi;psSw?pRlw}V5`m=Q> zjx_aVbT!@VoV$S~Pr>A+hWlBTF6q$WET8%4>D#1sgYH*~z|9!LJ>sii*KLxR4owK9dC-*Q0!X%T0w`iu_0|^Fu>vaD4|Jm_3k}zqgiEh@iQzRVTcqVc_ zG!W4|fo2{HUP}j_oO3t9$P9D{g%8Ifaf_0sy1W`?6Kx6{t~%l%GaY7a7;oV}eG4ix z*A#VOhHQrJdof$;j1~oh6XvfUqOo|bXeaXah0BIuRr3PZ!h|2e)nj2RQ|)Aao`90} z1d7g1>+l}I@U3yH{X3#C%vG6YU%ZwIIz#yeT2?97vd}2LXAe5h3l;hKT=dC4%eAV! zN=@n3T=sApj4y&e$RxNGU$sAk#$#TZu;)L80fQRzeHZXRQpSeTkwyA=AkIU7^7gj8 z79HutV~oMmiojD+r74X_wjXQ7RBa|9r}K0#D2smR4`JTqFR2Nu^Pk+&oca9WzEzKz zUt5E3Et&g<&(m0AyVdqa@C15i zW#NHTpzA&)!h!8P7P%)Q=NG3UYiQguxKGuIXxtVxXCuQAe&pR&0SEq{Hi3^$v``*Z z;F$-Rn0+pCC#8kL3F3u84Z6Z-a=#AD&39$aR-_h^$HDj5hvN$a3(4(tU95_@OtRhT zU%%XyI3an;+|}k?fxl40DEsOeH{-uo&cg4_`CSWF9a`}X6{}sK>$enP|4>4YVk8@! zsE|nO3+Ga%Dzgz#?&LuD5?(at5gG0SQ7PgTL zFb$y+4k5}SmgzxZf?}Bqhmeiag-lTun6TnGCj@7vwML+`wdmnFgYVkOC34gQ>nU#& zpzF`TNnLcu1f?96m@li*2}_6HeS2+9jF6=9F4`h_uMXMKb`MBo9F9;5By`l$%yY)e zICB0*PFOK6A5vhVw9ti1po7*HvB+slo^7*Dk^Z_yF~&?%mzEY0^bEk9S+ZK`5KTiy zNDwQ#EW)DATw2|%2S>x5{ zZXd|Py?^1;DrSy<8)_}9UCBean9?I{gly$-J4_>+QN6Y*4R`mKMz#%dC)7(PEhpeh z!s9lS(zuwtF&c?zesC(H5UNflM@$IR^~oaqLcGc{0Y?fUMvwfk&VYwK1-c)N3~96Y zvvgcH1Vy<(M+dYg02>jF!Zh$nMrhO4*@NC$>RdM<%C_CKAj*c24R{;X1TPTFyBfO` zD{NnU&5AIT!woR4rUzgH-^miYX~dH<;OX&|FYJEJ8d4vik}fN0N#n!VqLB~jucFnN zWTCk{>TcG31o#lye#-wdqkU{C{ z0ta1Y@GwUNfbVRdJvCC@u;x=1bh6&ua2MF|PMcx)mIe=B?&v31j#Qi&H+anGPw;kD zfrDPcHTXJ#I272H9%gn@Z7uyrkG?IGkk7a+2l=;=ENKJh?r1W78@HVqkrEH8%_Zp? zCsf@?r;!fQvXNOJ8X!I#`pfqbgYfUe$0j-yO_y4W-tNx6IP~Eg5;11ksV5;a)q~5_ zkiX%O4=i9xqkp~WJGmI7;X-YB6p4zveThFp_MHGKB}Em6=`DvHeThC*`=X@G9BX0R znIdjDHk!xx1ZEjEL?ZIb85_rq*X17PQ%Y!H@q}Db| za_RA$@gO>vVjGZ&C^E zkIAjE`*Q?Hi)_jzl@4+E+iD>QK`T4F(3fNHwg^<|>S`w0grC0Vc-u{KRCQGq2gU8{jf+<9mbshFq%`PU{WNwlI-^a<%j~XE_h8U z^ketalW$}Sw(p9D;`5>}ER{l!dFe4pE)5S5Q(w74|8qaqmP?q34Lp(!lw?{I+)7hZUF*q;M@KJzzRIBGDD zpC#9K9p74iKzg{2VnQOnLgn&Zp$T4b)d)Rw)X>;8Hbm;oyA#kwYIP$V1qEnh;}2im z0$GqAF6b=g$4XHXh17B%IxJ8g4t{~loFzcen78xACRR5}HC$k8+#($Bi+ebS|tucAhufK1d=yzWl)}B0k{K1;JyX92!}D)034o za2#E(u>+J&$K{`V0%6q7lD9Z?JMM&^C0yFy2XE29dhbBG$Y)OVNIE=+7MGr;b9OpJ zQDyK@Dm7;Ir(B|AIq|p5+9h?W--n9@1ApbE@O3KUqJcI|8j8D<_Hp3DFI;D={fPDA zg*e~|y)8O?oe?V3-$e$euH+o==35kNB5n|hB9W{(+hcPk>pGEsCrrA}IV8l0KzP7F z%fRFlH9`P*wiAnu+wJf;+#s~t^X?M3*`P!3G}wGrtf-O^f1_U{%YI%(%0RtOF1eu+ zN;!X`gt$#Ue^BsV*0<`gO{c%%fcU*i-00kC+k3|CNrxni3`(m`)^f5m?;EreOXx%! zY*v;qk$|)f-n?C*?yrrb;rOGgHaWXOXm-8-#hIC#r2Q@*&`(-H`kr3sv+P|70La+U zTm>YZdXTY1>-!ntd&k)eTx0N0oO^dQo#{osPjN(Fr8Ut+BbF4jMx7?7J2)>UNLYI7 z^;hw6X=O;Y=*#c6f?Yb~yg4SpU;W_Y+bJ)UwoFcD@VvH#+Tcd*Q0(u8uXBDRD*LsV z4%|tAcSqyCMT!ff?J8mU2{eB3G3C5RyT0rp# z@3BO^y72`fip2$E#zIh{%7tU%_F*i>%sHfC^~2^FtsTdMskM&seV=M4seHgPZ|ZZ* z=aM`TY0axl>cWuIURt#8(`cYcIKriMNDUqZgTx!l&-ZB5WEaSHF?m&pKv9;Oc0Hny z-O-=F^)N{-+_#PsPA7Wvy4xGUwlUx~2wKP>+3G7B5D@BtL-AF9wEw`GYE(;frCg+~ zdMx`pq1r$s%Xrr*H__ot22A)nEnVcnt}`zWTkK}HfBJuckQDdfT0#A9mi#&&3GxY* zz%Vdu6X7gF=RTFK@)dF|6 zD36*@Z52mKdg2U1{^#pdGX)0V`j=uq<`%iyF}0tYXD4s3M;vvwg+jB-tPprVQu>a2 z>Ae~4F?Bm2FnIi|(E@yYMyvF+DG$-!-AJz?o6@~u!wXZys< zt=?QQ0GL)(1OtnhZ)3cN z!uLfd6fxT5!E;)>tQbD=GDgFj+>9-luA{ocH0hYq%|4cSchuH3T87fNLRH}wJ&c6Hx0~ac6_Q3j`lr3eZn?K^Rr5Di6VT+%R zjH%oM-)(Mb%9^Kx>Lv74QQ9f{5!#Y$b3(Trt{uJ69?7c`kdDWi@e=zfG7A!W3bsMN z;T+70qcpn&A5U8M-Y^zl#4b%^= zi-x>IeD0()P#|63<=zjBMo^7<@Nt$z=wK}=AuA$P0r&j<^wlMR7(wgHmBCR3P758% zft)nn`Fxu#^?8YE2R4E+Q7cyzI|2ciBz*vZP3y_p^)N6y$ypU0P&zzTR>7;JO(r*# zqOkxejS&}8a-@)Rz5?ntrF%HpmMTJC=acxw}7kMVGU+H}bnS$xYmgP$73bRshUzMS&BXo{}fG(y0rR3=Lq z?k%s4?aHW*Ci+}q8k;p4=;Y^Jqd~sn7;gVcqnQ!1@bJ%G8p-8QJGwkx_XD>a;-hgE zx;>2c15b_)QK`?H*O1M8tQo;WM=@b&W1r#`@cw;Gr9$0NR>~E8%)BEdI?JPtShO$m zc67tplETB7kNl!6UnW5JR`gk$i&`HuD1vj?M~LuE@2JiKu$;Vbr>*~F_+;^E<)0_u z$C@`s!=@Y4SC9<-V49pi+t1w|O6XcwD$l+CSf7RdO8!81d#o0h{I_;hb8|$xVzPVR z-2HrN^0ws?@Zge*){~|gl`Cgp!aVRQu#|>gEg5|ac|K4psPYT#cCX@iEG(&&+GC z8Ke`889gYkhStyf&a`5URVVqJd{XEt8Fsz)JmPqfEALkP^$5LFNq{N$yC&lI843aZ zV#YUp{fD2nSFGipG&>xlF#qIk83{j2lmp6BNJ~i5dIOau#^JO~>}%I>DFn z8Iew=qLm7PAs2QNH_VKG-1#(}03z9UDU#CxhJf2?(?7Wfe{#!bhIH&y)>_?hKc@g@ z+(M~7D=AVa9GqpRK-7faQ56oJsjRZD(*KGJD?L@F zR4cK`sek+XmB;F}u1Vc7Z3=_E*i9#2JY%Yeoir*>^ZUnQfpR7CCiddboK}~WCF)|c zA74jXzp)TTopgXV(sdLY$}2Gxi*Xc-`*M{cB-1X(Qxgz1GsILSMLm?Ph$OxZ8nefC zevHcV3uReWl24mcbF`CAn_5`@qyDO`6k8=A(_C+CAEA!wXhjsDwu7hw3mX%LN(L6x zJHLx&6aQ@YCe6vShqx-U3C?MDl}yPQ0#X_{Qrvg*r}w9p(u!5Oxe5RLv|{Vvw=(u( z18o#HP^D?+SC)71mwSBgRmyMCK`*Hs?E*{ERo6Dl=%O4R^Lyb@@mccGPa zab)`iyJq+Rr$p-dVIw;1GT8xdvowXq+%Tvf#7xS_XA$#aGh&i=T3w$x9Cj)v-z@1g?59HvS# z!=ar^&KG@~iMc3l`AP@Y-hko{Os=CGUnj~fgUj6`N|R7aG;!U%v*Lt(8XFUY4a>Ak zGzmw`x74((nNKiQ;oFO!Gr%;p?U0oRJrZtleb#`|zhw0eqQq961|K~e7-kSX;u0Ly z&~tyH((UixI_{hqf;WZ15j|}e@+Ae8$+bW^)9kQWkgd^1BScll)9I6vM-35y!JQN4 zAlIo9hW8jHDFBfGLrd6`{=|M(MVfJFsp!HpJGrcS&9uny&M!P~*OQ z2BH9xtr;hP*V^su&dD9izILzcp3|rOA4EQD9_iI{W;l0Vl?u%!NCr zF~*{qt`M)=Ke`qV3^qnWZCcCK$@vwCbXvC-g(4P5>==c9r;3XwH(fx_jfeVZ0r&FR z(=?C#LaK^1|3A761@B7tcX65`^7+RKuDnGx4-^YAM$i6+aY&$_(*A1GKYGJGPJ_@+ z1|UB5<-XQPz7FO3KlGiw-b{2q-5k>>_MF2f9XTGvT>Fe+K(Rg2;${_H&&k}YQdwf^M4~^^6?lZtgQ~%sC?w(_29uaF*(C%HN3BqXkyaMIFLcg24)``2up9rImUAW4D z8S8iJY`ooPXT+wrpLqmJ{7kfOuhNhFbDe8?p1WG!2YO$(S!AD8JR_w;b~;*>Ttcdz zyWA9l%IB#as9Uo;Qh)DEJ(fncVW@P*8NB+z4@_7LzI1u01$uY!)M=Rdo6OVoaDv7Z z4o@ELOJ`?c_Q{+=PB-A$v+y(d$N^=ZW9Pxt$8OwYNz3*;}IN;ep$s-P+k5 zM2{k%G=Fjn_zlqhh9qz>gJKwFg^4mUtibx%+7lw6ynlZ zwg1*IX%yIcT_?jUN2I%Eme`b{=j_&xuMW=b@TSDbZ}d-fPW@E8d9`Yyxo&QgiX~j`d13a$>_NKs zL+oh1ZffT8qZ&)=`|y&>77uL!Cuef8Epl$kc5&7a{If!ofMKtlK!nl2%1=i_Y`Snl*_ujc2M zW2}G3WbmUfYdy^r<521P8}Z|F+p`X$$WekqLw6PT$Nu3Ro0%cno4b3b^u6&f&i_8bd9a6G~$BC)+tKN-<16yOZ^cI zACS)n@2A&aA9Dkqj?P|>*5A&La{ccj{`=NgA6ujC4F<1>B=>Y4ML>ganyiW7G9?F> z!fJg9OIPm*)S3cRP%zBm0kta>iZH__r5wA&5gwrf_Zwh=cL>RM=Gr0|rI zFt4>{EYj$%+yJsIIv^m9(4F$zu$>#B_J?C-)@;=1zb6t{$Mmuv9Q(UsLHKQ}(1Cja z#xF~>6^<#jaXo|54Kl*?F4Py^eb|Yn9{5JqqscGA$kJ$Hv3bi1XlTdM;?$DSLD@)Y z-cH*Mjp%%*FjrjO0Qs(Y#+Fe+Gh?-W)pLPfyc^o1?_sr+k*$(c;Fu@*n6K+tSI&$o z8<~mdBlz3~gn(Mp98SEn{=ST9)zA?#nHlQH^)@kj!mNA)ix?(1S>|-Uw7~6=6)Zrl zcR`b{k1l<-=mA)jK z?*OYEy6aavx=PPJ#a-Y|!+B+y&>=?^AO;24qn3ZH3n|*AXymFNDomsQQNkYDbd+cET0~W4I)Ik{G}54Tup(&<2%4y)nxx_?V?l8}T%>6!VYM z;Mp~G`x`1uPlfQVLVh3U0>TWmW5{^q*O-%z{cE8rrtEcGFzy{Q*i>ce?-u|&a2~}x z1~)a|py+TaDY024=k6CUrKg4QcW5AxOo>-MM$$+l#^0p$U^Pc1aNHqoaRbp(%0^XbBryv=HKcPxEOMQ1WZ zuK(Vgb1=-k52Py_Tos*8dqjU+n*jWY8a*5u*6{X~T$n3N?sz#zQ3_8N88LbvX#F?n zhDvXfAl-1=+H`P@11vSYOud@TdENY;LpCox)S4Grj!K$B$ z_aMfZOhI)-9U+-XFUGAco%4Oo9OLO6`Fc=!x6!!nRt(3Oz@i?{CuZ&-whaSCj-wE( zoS5HIT+E1#3HUO&srWG}<{aGS>nK`rG%D8&33k@FBp37{Y+)G8c4R7*%sBLeA?WY} z(wu`*OQE!!eO9P^shf1#*!;T}zko=Cq4NmjAy=m48G$h!UbTwi00K5&v=UVIr2NpB zfJ*y>Uiw*wUqpXU2raNm#2ADKO3+F^v_$0M84k+I`j%k0>NC5OV@3+`GepyJTCi}+ z&+vX@|1}ef3It#M0=kbN>4%gfM49djVVN11Sa3Ykms(N$>LvG_NNz=vkMZTLRk;p{ z6hZ}Voc{t|rlOmpP8SfUR2lJR^YD?Q56&zNSY}N}&TOM5dqP`Z>*h5vMr@6lrT>vm zTKVHsR^BDi)k>=eoAir7n3K*_7}qltyK-e@Q?nws#R$K6mRzUkO<$Sfs|~?i4!)?! zG86UTgdx>+;)(sjym0Tp3p*XKMJ@51$l#3R*CSAa4OVlgk8`MVMv|Rck;E^;0)u|X z+bn2y&$jzlhSMDWa{6_wG^g;9bgUE?Mx0%h%-XZatkjIoU6t}~eumYo_kAKjmbYK@ zW@a{`X#eG=)Bgn_A%e(q-;ps$!h(=_ENUMP>S*R!q}Z2HlrLt% z$(PM@8l$|4B_`a5GtNp~ay4*5H|h{GRcEO>vS2!hR2j1YEU74Ku4jf5BVRWIntuhl zi`@w$al)!reUc#Olfc(mI%Qh;#ce)I#*Z?@-HYS#ZbOPZ`P*sd)NnH3!k`^3ZBgzk zs>NKvqFKu^ub~G4z94G(OKk`%wMEjZ2cFR&XIMb38xfp=BGqWr29SBt=^J#4t^eX3 zbAGjTGK*+$oqkrKY>s$5$jUs=X* z8(^jJIrR=Upi}b4PZr>{VKYDC$C!}BaAPulvQ*LfiM*ADtjSZH}6Wid;i748l} ztqNlRa5Db)etj#RM|zBjPtOgU{`Kx=!*WBw}vp- z)mZjmG+J2w%5a+?9aMTnhcjatC9o^4((a8n?M%a1Cx~mlG}iZ-oIlZ&1a=0dD$`Rm zcOW4sNpB?AW%LuzppVsq+P(WP!AjeaV+D|NE6b-bS?~cZ$gSxCcNsAK|2xB(Q5g(c zQndPK`GalOT1Cv-zt=JqSGDB3xwHI%V>q=?9}eaLQ^pb9k{O?26WMf}-mx&L#S#}I zqF{y{t{Y62uyBvXI3bo{A4QIphHSCKH%pYP_gy4p(rUCJ;`c`_6KKv$>j8Wv6EKe*GVcC1O_UC12Buiu9ol_TE}o( zq#}?0{=8_};z)n>>wgvOqeRHLGgWvK^qhEE@<&dY(vRtxD4K_CRp3%tb=%VR=h_tg z20KF)Ja{y`e0hEu-Khqf;!c)Aa3@P3iM=ttXg3htUIQC|fK-Zvk)?7!DEu#6K?}x4 z6+HrVGugl=S%C}sS+Zu5UnpU`q(Gi668!3JMZn;Pes-1KtG3~?m`vH4;ScoG9&Yf& zdGGMol<57v5*x|h;TL{3LAt?0>_|82cLQ+noicA;c``&f5MIr2*YCa1JFJ~C2Zwv& zKh#7!7IiB!DZKGXb#V5x8p^huS4%m=X&5SE51j;&1qNalh~A-0u6iM&+aQ?}(~pQc z(`lRGo%Fqf%2!i{x2#^YV0zUU&%kHRCEDhbUYIIw3_|D&zxn}Cno$v>dD986vZ~cW z@v$Q97NkRih`}hsoAJxOl4!c&eOT{3GWa9pgh!bH*vymAuPjMQIZ$t5!q%YJggIFR zN`AZzP-Jjf^k`>GG8$!$awzr$)1}cK!B4aarj{ea(Drd7B--n41=VQV8n@UWKNNZ? zlL$1IEH^yxz7>m4<`GpdqS!E5tQ+3b`SlONP3vsv?`(@ub#W*LN3WDPBq93bJ9eNg z2Yx}-m|?HEDIx%ge$e#~o;IC$ZL%WT1tWgG=VOTHn0gfeI${Y`5!UF9| znTAjW-kd0sO_JY&4~63x5`7e=Mu#Hl`}<~GsXY6iJs6|*lh0Fq?op&r2Kx`N?OsH0 zS9p8U`3pwx$hN}t=y0G9p99^n+2qBA@UMK0QEurx#V{wgJAWf32pCPk56fBJ4rX8_ ze^6*K1F8rmMy}IE};I6de z;8^pc#o#j3G4q$rTPkVN4j5=Z4T>+yGU^&{I}@UFYXc4Em}ml3_7|xFk&Y;E1D*NP z+pXO7DBSeJM{eaRDT+o5g$PV5tFPeP$JfyOoCZygMR5`4$aO7pVq8bs#u4$*jrQOb zFFwhVRg!388%Fbykrw_*@TP7gV?I*C4W?uUHz}4YAQL{K6%`i;E6VHO$sn^Q_&i}S zLQOWXsL9;)iySJmCM|{szkM;!G63w*>?kTL|Ch-A_7j;()l+Q%r4fQGtoqZ}f#v{5 zK(zKBDE^X_tc)_bMul!TZyJ6d!3Y#$X4Stt^1Yv;5Cxzf?Zsu;t^^qQWKU2*i=kJg znaqkbQ$ZO8tX?gxv9au3VElK!P(aWqmY z^G#nGbAAVUWw}c_&2~JBeHF35wuGMqw+e$b`5|l@8Sc~st)PI`Ui8f)&LqFY3ns~6TnDv>#wYL**!WRFj)RXR- z0y={uYmbUQwpbU~)=UlkiXCbkGEC~o_}WIDSflvSlR;zk1Pc0x)+tJlo~U~v6pDgX zCy@AkD%LS*S@FYx5Tk@Cv{(dxEOsX4G;&|J=+RBBpE*nMt110=UwT7cbYD||cRB=? z81?!a!7705l}M8!^%aW`+d{+j6#X4m(Y+|oB=Kq>P@fYBnwSGMeQF&}uR+AQ@H~L? z9zwMrX9)9(bA&gy%pThO-y3~1v;wa)%uWv@+l=<_q`@ylgvWjtTPV_mALX$(SLgx4<=>5{c1__IcsiA$IpRbl7SP0v;(4q5}=Io7^yR75D!<4`~ zTZrWB{}O6Uov*_<(oR*^m`KH9hP!w^lY2e1YJgib_WNIQDpN@jHTKHe!Lo= z(EKx|WtXb)upqR7&}rJwC*@Uo!_CO_H=bl+|LrM9KcCZ+;_N#_xCn}f%DTZ5P)A-^ z!WBfD5eRHPJW>aevjdFm;l2AJF#3U&RM10xa=ak_GBj+w2i*$vZ3`}*1W+?4U5VWT zWF`Y+mM0j)D{Ep3N2<+{-r-g~XeIolrtq&-S--;x5rsLxl{{Eyo4@;IRAO|AReyE_z=*dX6;Eu?dMEfAB;zI;P#XeU^(*I-f&1gi?IV ztHl1uA^DMBi3B#F<+gVG{NrFcON}#?0DJbp8nL!@Dw~VK>7i zo5H?S52CD9mc6E7&uh)i2wUL*pwh5k>dQ6`$sk|P$;f#{*BTuoywu@-t3|~+Sg)7) zI4S;7igW>RC=k1!98hL5_ik7ne@#?YFq@iQ|5ZJalFpG-Om_XkZ99^Zwf|3<%x6bH zlQO;@S_PwR9yBV~85h}78{d^w2Ka(YoDWYAHb+(=a{9P!94X!mASOzcW&V@!e@wjx zRMPGHKMn{2PL?Ar1r)_CW@Y67#6^l|X13IL8fHT+E6Wig7C1^x%bZA-HcTy38yfmh zkChc>!-g|68*a8Ka2DQHP4mVqOo?MM+=R^iEqp(Z=80d(;y)*mLV`RxtF`PKLBKvcL-?nF( zpHCdA6fW*!9k1T>78^8lRd}*n#^Ik}zi@U5Vn*7rZd=Qfe%+>roJf0bm7Q6aD(}$^ zKt`!&tEkr^b#c$sB^mjGJwu|rga`~V$7?oxRLbd(%z92zEMm{yNP56K_fvxlyJgHfG zGc(_yGkGsOFYE1bmPB(xy`;;Gnx4Pr)p~l7P8a?=UHmy=Id+b{XJ&U0^EUD2BW;}{ zHY^;cyd;|ZU3hvp^k^kMO9lUM)YmlL6@6}5cI3xrs$1rE`|{) zAQ`!!t^CyqwQ;bTq3Lb^ad;mNoF~sbYO^Nanc_khzL((~qeUx^;xECDRSFY4A|LO3 zM(O-ol`<@FpRL8e!7tOM+5JO4{l?7U++HK;=tvpvb{{7D`H8e>Xm(}-*yq>-2aGJs z8nS*1Hi#OMr}exKpg3I7pJhb+J}S zm0;R#>w?m^PIn!c=ZfR~Og)9MDeb1KHW*tT2p+sCGH5!%93OeyC8InfjUd1--9yYyU}QM1_hYq2F{yU=hJsWwg#0_z%*x=jYCzmXC zMR=1hwxOTjBKO)F_U#~z?Izo8B}WAt>_=wJ2a~^7na&UD>CC|dUAkpKdBj!Lx_M4j z#QEi>7-K`0xlD=+Ppj)Lbaj$`g!zu&Vv}`Cy&^r^Ua?|$`<@P9>`2!yB*mcK?U(;cbV*2O z%Wd2CVPbd&&!psDoesPKuEj7=?7;HdDGx<4=A964R^6y<)1zAkc(xzg5=1^kWBEt0 z&NdR?CFp`Kd+&=7eOfL}56BqiZ4Qze?Uv`7(BuaUb7Bl~3=MMbe>O?7y58ZF)$~aa z+xxh|{7X+gA;2PO%YZD(nqz1>qyl|-rd}+IC|E;)r=72HrT&X+!&v@M7OO@)+qA=_tV_NZ$4$)x? zx32`3vcZV_n~s4l)znq?N$WGhBgrCqUVi;60`cAlhmL}Ed#J0yo6zlZ@o4LUBR(&r zVyv$^`~BKhFG~OU9O?ty>BG9Yje){?^JE0ZP9$7`GS-nlHildI_|_hQURBw|9Xt!u z)$#c`C!-3z+TR{wXEO6|-3ye39{-5O1bh~o{3oPoWsLfLqZpdUMzOEt8zzkG}#?liZ=$$wUPX*}A< z9mqBlgi;39Qrc`OWCDd1A~&r-Ahg)1dM{C^5wt$vmFM^ZFC~+Nr*KR&j)uoZFoC!V z{~8zOES1EbfL(nR&&(Z2jo7LyP2GUH?T*^PRLVVnjjoM~#@AEo#Hf5E9It-#&-4?O zpT99n?+ig#eMU4j{6aJxoBIU4a2~Aj=fs3nc4IS}ZHAlRQKIbaQ;?B4jLG96=*`nd z=o8^0M!35MtPnZ-3qk2wD@loOW`xh|P(#^&g2w(Qz#$Q_M(q$kn7Z2L-y~Qa^h6C8gExXrhB9s7)=6pTGzgDhX^Wh zZ~sz6W*1RponGx;+VBs=gruA6 zM3tO4EQ)!n&MtDb{}am)Tdkw_+ov^Fu=cTi@nKy47maZ42)xE+kDzZZ#XByAY6K_k z(h9%cC&1ack@VHb%gitK*imCHpgaykKBy^`oH*gnJJaYtetC^QS*?aF#_fbn@)Hj9&9gks{9d;Yf)ExUrG9R!tV&*t<;IiREz=@z*_k< z*(c+s*H=3fFh?dPJUv4bqr5n10D zf^v-zaB4pqtv>ZHNzJ?U(9AiU};RjPS&#L zBHbM(tF~o$KdDOIr?s27aw$1|x%BLRqT83S2iKb5Le~s@ehj-t$o4d#T~nZ-7qQ=| zCTuVH#Ve#Ufi~3s*~L^t!ww?r+n|ApZh}^=>u!cPg`Bq8GYh3`dt~d3-8~$`j&WF@ zaX24W?;lO|)YxcG!iAFdloGL`Wl`#CtVA{IfDPQHW8B=fnLMf?e$(jjuKf)XS!ad( z=UU432#V>Gw~*9wx#Ad))GdG|g^9B~VI^74|LjzKKnWJjIw6DO@*#-|6VSmM|k&>#Vei|;GM%{AkSYuSSfa>26z za(eKtK8X;eKv4uZHr!(}QQ93WTGZWp^z~Gy93z9sG_#Vw@ z$1F%cz0*tl^9f&oCLRB+-m%CEPBRe#WybRq9a1IfQqe7CDB9X!6zTY|3NMMrt)j|G z)fnv}nDafV;z-S(Cvz)CkS}KRrhB}W)xJt(jQJm9j2Y*e9l8(p<$R$>*u6mYqtCwE z4F5{GE}3zS1e^Tj%;+`-dMRRlMlaVXQ8Fb7YYOX0={b?3e$?0(sI3e9?CrmPU0IkR z=m$0_Pg71df?};UJT#27$E&kLg5Iz7R%dUvpdY`X#0v6uaLbPgKd20!OyW0gXNcp~ zK(@4m&iEZt9iKYCXX8l&gs(~Ya}wplRKX-97XNm0T~Ll zZj|s>FA|)~Z!S%(lgJ*s(O3T~fYrXhn6?6e+!)j&^p#gYLL>Q$M4%6s$e~G+bD&Kt zMCEF5pcDT#kw1RDMpMMJ= z0+@kNsSE@oi-3e50_xp0jkv=T{hwEji;CloZ-25Hf9`jaCj2=eTd`N!T=L^yq1J`u z+JbKQyH4478UkT^4FBb%S-yBQer`knqaDMug{p5C>E_l{!XG^-2I}ijv>lcHXnD=h zUPg8&QoqhD7v&f9#89cP==qFmYI-;$qnCa!&6U!8)HDLC!7iLxKQ|*R- zwO>O}nlE8aYAY2YSe10bZPDOWzK5E+n()(ieu^bi%oPG_@qHbtgRa>(lkRPzKHNJ- zW>0tw&!tnN*F&>ovA1?%w|^kxdMqXF0W4a*h_?s(d;vT^TFAbw&b}Kc%ejXDcZXDW zi?HOL2zD5nj=zJ#m5CDW{ZCMz6QLi}m9rK8(fus!!Ynzh7NHUR4M#o$(>4E#rS5l; zr+=mnF0fKp7>5V=IHFCn3(RS|h+?%Ut?@~7`|2o0@{FU{EZNjsxR|(d4Y}8!d9+lv ztp!0Tag`EESr)G9D8+St$qmzdv1#CxX=KMD$gu)eYoSv16$quPlSed)SudT%sy|HS zuYJmgKFdGj9VV1{St{snnE={OqbCmHzW*}aID*fA-5?S6uBQw0m~m?bquxx%ESR_F z0JN%%LB$Fx$B+y%9CXhJQwFc`31_G`2C|xsg%TIhLjjF`2q(NtGKlj}QA{DrK4}X8 zxipHB9&_V2Wht*p(XVqqaJ!=a&(|JdIS*j9!*sWik1LbdQgx*p$c=1lGwaA>?<$s;}!wQ z%5dr+eSmlOqv3c?<5j>Y<<=rsMEz0ldgNyrEk)y)f{{kI^&(s5X z-=p;W97CP5J?_9hs26$1Z4t~~kTKq<2+$^97Cg(dJ%gTPDy9rcO)JPBmXcR4mFn*G z+nmI6z4!gs(botB&%z{U>Hm{6KmWqZ^yOrLFh4A1K8s>K`bR0xIfz9NPuNuw*3Ij_YjuN}~eW6c%ln%}t? zwJR1AYs8QJ>r$;~n>cxmf$Z5tUU;z@Q5HlBO=427vUF{P+z`?AT4(-gUFjZcR-~<5 z---0-0W&uaM*rv~%oAJXm2)O;Ir z`I*(EVJ(vUHIHs!;WMu~Bx_gdw zBAWhOR6iPa5v&4%EhI*id8q(;F*1W~uxypdd?XBw+%~UozyQ0w@+sJM8P%*UCn=Vlnorc0<7~;oK zGwFmcP>r_&+$l$y#D+TItx^XtF}S_!wK3o_=yH{@ZK+!WWbk$b#nz2^5SFc5x0OqH;w`*?T?JOwTVm2Tr6N13K)f|CC$5t&c^iD>s2&1 zY*0W$EdX{Gz;*#=%>!kn3?c_tq5W+&u$`tm#csx;Idd@*k^c@@J)gabtZwT8g^%ew z3)}b*K@p%OnK6vyjHsVU^`M`2_j;qYZ{$i2Immq9D5pyTV6jBzBGWpDpiCx)YfdQf z{d6H1!UEiCrEK2^gYbU<+(sfas+5y}aH=$`%lXA;NsYOgd%|(A1OUG$PizEMIMuJs zz;Jl^HSk{Z8@TO=u6qT!Kt@OZz!thjAVrQ4H^*Z9 zjY*MvnJ?aQHd}zdvhrjEg0R$&y1kJ5Xn9%gUX#sr*nm>(Sz{%-m&dDR*oAP(uFG1b zsELF4fv>7(*8Vk+1{f;49f9>+!G_~m9@69u#V;rMQEJvdLx6RP#`>bNy`U=eE26hP zF2wX}$OyAE>H$L8u&oqaU+2!F&c$In4MEZiOoe~$$~1j+fZSUIJJc4075s=KezcGt z3e==x(y46(8cr(utmzSCnpWveAmQzpW}#>lO-(=Oj)W!5frz<2;JkdY3ojoHT|4m6 zJPqkV&`zTo5$prv7|Ad0qS(!RomJ{==S0?oL^QxS^81TXE-IeC-A$b>bP=+fQH=OS z*+tOZBE8(`4$t>%m38@oB|Tf(Hce^jBIb0&U2pId47GFXIFcm`UQilJAS3IX z3BGOCA=w}d=X}hpp92PjyPsle7G~aIn#GU@3QOEl8UwYw$3Y97K!;BML|e~o0-G?? zDG}V&@{Dt)+BqP=c-f;v2 zW)(aHKsuIq0K9#TKvTC6ZSZDHd&6nr7GN`BZe)?6_2vR^Q{{vEpA>2vJRl1#CF13Z zKSbRG)sCka)`)45=)&f)hu4UnpZ|7miYPKmw&#D=;>Oe)=swIBkF&cl0Tc;x^<8T zXfhYd(3+LBut(y#Ku+$;qOR6&a#L$<@)`1j-75iP;K+Zq8Bn|1={>=fZ`Z^zSnPc)`_aer_LJZA~c4Lh(=DS5piB-qr^DMhl zxVbj}5tK!MA8>4>Med+}TPiwe!$fxN!Co5>{p+e6PvEg283 z7!P-Y5kek{a81ta_HThwcTWJ89f7r7upw8!`T}c$E*?n6eYlyczwrW`QVp$hu%Lyp zRk-ccj<_cfDVxMkRhE&@ zIFOyq>qS)XQd-OqzcghBndVk{SHe7ODXX-DP#aHDji|LYo5f~O9da%>)XMjYDfQYy zcTx9ZW;^3F(%W+o>R*bvi9aHXw`7g50N3Uq|7h-c1|8sx;q5r9(dU;c8N2}1@-S$d z752?tK);Iu%;cSw!mJ+k7Esl=JIduA=DrF^HQ5Jywp72GB3Ik*LtKrOwv$-r+;PLb zXW{c4p)y?;OFABm4j95nedwYzAw0`d4KyN+BWkr7+)r*TbDHo&|JW?rN@srS)8!!> z^a09z9#85z03?9y3g{#fJKv(Vh=~de7J_rVKOMy##F1K!ZdI(Fgt`X<=(1vqBK}>N zVj=#vWCr?H(1VNsJR|#~$}GT9&t?HO`gQBnJU~u)8x;%dfw{e2EhPW0L~eyp{09ti zfLmhb3ghPadD?T3iSGhjbx`-Gi-3Si>RxZEJDmh*9-My|)<3ML;r+*%>d`+5;Www0 z9DUajaE*4JodJqHxA7-mlE@GP`y6>gGV|r+Uo_zo#vNpLPX*5XY&HU{oXbJ-m#Nv8 zF2J0JoQrd%cL3@;1s45Wojpr6NysHt_yg9q$W?MWlq)#LZT*qwl*rF{hU88vtw6ps zo-uZ1NS!VJ38+wIOO@W%!-?5epP+T`?=D=Q0N5i^*?sUK8ff`zmdBN!sPxt#HY@pd z*gw5`)1g!_?7S}vdAHQn8izkG0G>^)Jlmb1t*R)oqxSh#prh2<^B+P9-QZfK%324N zTqq{&6Xx5T>DGlKZdCyESs{EQfFGZ@R5o}9Siie4ryN_Rwd^r}`3qHnHI+`%w3j9@ zfPv6g{@<9_HzlZmddvu5H%~){$^eZW!2glJNH*xz@1F(ppk-f{$N=p|Jk!fXDU@9Y zYYGOZ(K4m2d<9OvXcVd{*rsyFNsnOPsj6%v{Gwm<^Z&`O(FT$A@GoA$HG_8xG z7<+{EY&+~wj4c(jMu!o*9*oa^HlC5pl5QNklL>OFcSQp-g`tD_5rnPxA1=2_#_goo z^D1xvmBG!o$cJ;t7c&U7?d7N+cTv(i{F~>LBvQCH*hLRFKzA?I%k_S$e8q@gi7mmu zor3L%1(e-1)?tF&HRS+IN4nJp&`H@_0PlGg%!Dm6hers?T?GkUXt&Ez^Nqss z0H*L0yt5E)Q7F$CHO=oyn6ZiloavL(3LkUY4ijVq?+J9EbFpm9yk**q@yLvZH9<=5Q$^7adI5Ax=#@RvE}LB$+jgJ|B70(@swarm?Ull-Kw z!pfIuc8^j5uB^bYkIuM=`{d=&D49n**7Y*~tr#B|V7_t0MI2Qik7rXcE|6RKcpk$% zHjz`8y1GMm6q-9wELqhpt~oK>cL>>a!2E4%F>!lwpFc<~RIu(K`m8ogJH zzwtM%EH4(Z{DxEQmxrlw<*DNf^50ZF;I*pDv6ZJV+YCmacK5KGOR-;XWaPix#X>f? z+&Ok(PfudxKGuz!e%O12IBo{<&K}5)R#9z%XVw;__{toamXVrQk1S>KcgcgzOtxiu zQZbps%a=2)Bhc^&&sal4lCGoR%u?_Sta|JLN@mxiZ46*Z(CZ+)qyvD`+HiiQ{jXP| zo2((wjjI#~o=rBkt_XYE)g)r&QppDe>e@3@tps}-k(qBDAq-IvsBQVU{*|CwY3dsk zLW)&mnKZhZ%u6#d>Xt3vEl4e$NLC_ycs^J0-JrR6X#ov zgZVBS$X+f@dhyhdrgbPV$9rNWSwII_V^kJrwsc~B;I2|l-Rf@7xoQ>#TmvDwc zVaN{?xVg>$ zR~1+uq!N%T0|4L5t|b|CrFQAs!jD`+ zZh9*C;`RiI+?U^|G)m;6KTfMKh~Jp{njyeu*Yfp`?- z9-XK{y`%KY!(XrPEOJ#Wx+9^}4rx?+XLMgVrF7KrTheIC3ux=40GDLUJ#-(lxfjUa zUZLdBjqZBWNzqS~EDIVNj3-}Bl9#&Cjb6$KcM*v8y5!@J!3}T>vO}6YQV-$-BK$BS zAe!x8m3A^Z_tYx|Cs((PoiERQL&8-Ib`@|XkXk(A8>zcm0e|howMo?Ux?c^$S zL;UdYYPxldtEQyL>0N69$AkK{t7(B`6(EafLLkVwB4e(P;zuBG%0wjv7hW}WbN z9sh}S0IT{4cD@s~{Dw6(dmLBw!=ok#an%fL&9TS7u7a6<@t+5`_-_g^=P7b9V2+QZ zpnp38Nj~^ST`lXnPdnY0r^>^fR?P`NdKw5u?GxlwtQMxkoMCKEB5;`0BEN)AGa~}; zIUQHfV``>p3Q~Cq3>@n)j@fUzgKXMTVqWIT;Zf;kfTK$+0tkZ<0`!+z4e$w#l;l2v z44;f8uZEtfw5AeueZy}6e81z1Fx`w*J<}CcLSG z->c1Q_r!cVf=L^tf{PnencqWgo%p!$(SN+Nru4Lf?_8vMMHA)doaS; zRjA@v$nI{v)8JS=GnNm>o;B>?0T&)hL0BHuL#nPk4kp@Up#Rv7Tz|end+N zvgS2F=pbz5Y}jA?ni4Xt1MgS@%guBbRh-JFE|#8CgBfDgB63Or&qCXFKP7G+1PTDUr$`_9L7wAg{-8z4wXjCyVk7hl(D`*n=4N55 zJ52k4uBkn#5I=m)dBG{FEOr79z_yb5$i#2O>fB|Ap@R(^-+yCxMfLdYTIP=ya~#o) zkm_6)zI!cl8vIPgkiE2hE9>09M)t7hzy%x+NseHxPQexTCUg)imDT zi`biZLt=i7ssOzkbifbhN!WH3fPKQY3~HNx$J20+_nid`fB``)GO0gqK+|Xw1!S5-Aw@5Q76*xAoE!1A_~?QPABUJoVrf!`=|}b5x}3Exo8k@ z%0X(ho#pZ(TkPJn~(OTJIK-PY4JM$cVr=kaCvtKBi!;jD7jX*O*xD^mIg7bP&q{ z{e%1HlqmbSUb?tK`4DfKJG?58cS?veOvzJzyH$b?z$q6g51iybw$r9Ad8lH0&skQCqJ;#g4zI@YHlD{UIl;`ZB1jD^Kz>n7 z>T|k~ELSCwmZN-B2sw_JGVg_`QHI#7AVP~EUCB*DnJHsl#A`*at|WF5b9w?DFpx_Y zh~Whxl;nYAQ>?Ek{U96He*~xN5fqoI54G?K3BqjkZ?7I>h-=J6-UY)>xy1cz0rG=O za&@G-Hl&#*XXXp(eKD&QT2-!$lE~*ENcp0N0927#{RjxVVB8ek~4_te5K0{Da_e=vEg?;*-K74Z*28chWg$6xMwjQ(H0 zpr;owFWMBn|9O>WV;N%~K*HH&w!^{|9%AS zr`YZjpOj3tq#xwI0vy4clfo|#3wpkCe?nh+|M~s0sTX-UTm5Khq3y5>4Nx@bF+oq1 z<`ypbn-6*DS-kX}F?V1ymz;i5wb?=mOjx>0VnR=D;dz$5750{~&| zZF{@Z3pcnjHF+eT4FX@LIH0>igXIyrw zAMHK#VeL%(5#8MJ0K^MFWLMN}C7J}-^JwqAdlFUPjED$Fb;vN%WDwG^W?=Huued4% z<-O0U@oDV$Up@nqNbDN$1!@)sP~@C={x>{kPNlL~Ljk}EsA$dF#3JGyQQ%Lfm^qi^ znOy39ZRH#I8^pB7-vWU@A*ZW>-;Qe4H))vdt)K0UxiAZ&4Bc}FkopxP=Yj7cudIs_cty?e zH+Oo*x>H~|=WJW0mql)+HI=u+9s#87k=OlcXp7K8XKMi3d&ep$t_)Aa7H~BkX^|3q zM8;?=F`pQuV*KEj9pxe{7Ls$$EJ($#Qgs#TFtbwCKtG{bB3z9Iu20FoyO_%qoRD0+ z?nnB$isBmTsrcG$Dr*|`2>HQpw4$Gnz*AH+BEmqdjY&CbFYA%JH}EvI2%eHTlHGe};BF)ueZ`6SI+Uw$ndXf)5Xo>LV1cg}?8s15o}`>S_65T-80k zw#uwm;B2vTS_p*;bOJco%pNY=9xuFGhC1SIVei)@6wM2Xw^ON0&;hH+Kk$Uw((q(H ziwT)H2oi8~o3kLI1vn!pq$qD@PnPnb@BAdR$=RpPa1!cjX)G%-Cq=bE8=DvN&na`L z3#3 zAs0snaukVL)5weXm{OJJ%|Ex{_n%_R6XiW899w-BVP_U?4fHGzl-Hy>3X1GO3imXd zCvZ1VbY!!$@N7jQTbKy`7C@F=V3}Q@=dH+VD;G6sUt;C0=P#=C$w>9)jkvS1q%;hN zjWYN6mgr4#ups%e`M#D$edPiSN4{HPrl(Cb|54iQmc-CFE<(2JoJ7hK8C3HDXsD$s zcji9i=o@|FX*K3btUO$#FR3t5RXl#6Oa!aG7uP}e_j1I{AZq={27P7%eGRPU@b>dd zfCr+G<+wFKvvNU-O1EtF(vi?lkrN0YTN+T8rhx&npJ%9uz#b}pG~Kkd89v-heBj5@ zomi6`gU{xNFV8_O073P$OtZZa^cfG02`StjZy`E@#|nKw0)kW|g6L19TFYVjmy9{` zM9#KAj*|t`2`j%Vj;5y(v|g0ACc9oDo(U4-Igj`kPufe)uFwdXG63NvCJ6*u6gdO6 zkkMA2(PxJ0W&s2wUzMpale{Xr+)3W@}JQ6LN|K%C%GJbjBfT(yU(mh;pbFV7|mSK z4}7E$*GDI6DxnS*=4KoxT1+dla&jK>UWiv;mcajfy@&390)HDFC3*B!E<;BVzf7sV zEick{>KE>7H5APkbv^I*2nhoF5c2Mm$804zAqXKO$E~E##x3fb7r89qpv;T9I{VS~ z!zHp{C}<)McP>aZX5n=7TH*fI)7}?!Km6w0U-+Dui{tA*Oo{k94l%u9B;!Py@8HBi zgr&%>YlX3`?xGWE3eKJZWI_<~OyKI;EB}x&dCood(rn;HHo1BA%7ryS(bg;w@@?Rnk_b%1)#LL10JoYseDWLrt1 z4)T~ntAIQm`szX9)0R}=Yc6+T=I3HU*(gf}%8mlhBl3CgQN<}(74kP|Q-f#wi5g_A znnCS`e~tRie}j(7jbi4I-gA40T=TC()hd_sSJy%-cbS-?m&-pIs|2DATgz3sbNXdI zHL9zgRVAaI81!K?LIhjoIE~#Bm4^n3CyQv0TSOFn&j?&b{>N~kSxZ_?C5-J746)f; zY6_jbM6dc!jd&*$lo6V?F4tne4rrI zVoM5fW*3A$7T6h!Z1zJH$J1s)KeWWqffT4b;9weA>(cax!kOcVa(iSVe~-6#tJXY! zf;tar_BXCs?`cdg`>HbQn#e!>+$+QV6*A~TEWf{Mm3%yS3BQEPD@wt=MK6&kuBf0M z9E8|ikQ-<$kpu)Ab{)N<8FV2xixYwW`m8Ql<}W^?^;YP!OrrN%)vP>1Wm>3YI zh-hE@9JbNE4jg`dv4RY9;}xVN#oO~wllNbOJH=A!@CCxNZ220BWW3Y#ZGmGlBea0E zJP(q7&4-oL>wIG2v>Jc1lbCY}qPBKE^8m!vGTRS(#XdL7KLWE{2avu&-`i=%n^ zpCno}!(W7j`^nP>fZSQX@{&neDc&S7S07iVnlZZG#B=6~PE4?8O_DCZJphePHDD}Y z50GC#0&;LTwRQAQ73}uOKuUfrk0Z3Kxw;nQu-qERw*SmlB+2tpI<4g*8kS9^=IZ0i zm>~q388emmTuj4S(w9@TG3V9GBw0udVG@#_gT#DhW{9)A+C9#A)jd+DB{Ge+u9Z)t z7fEW@tAcG#rEZ(-DQkmhq-rQE?c_`ik}eNbi*XnA`Ecn)zP`E?O!NleiMJ`i%sb{*f{qIHc<)*2sd=w-+uX4-h5hhjK~zKe~Mn45~X zsbzD$ar-RAZKt|Kq+RmTYBxmEWym`#cn8-T(rP;A$%VM-MC6}^M6SgN?R`WS^l``E zuaiD=7oh$urdct)NLtezF@B;{DOMeF?3ZUyY?TvlomQ;B7^_|+$6Ra`=_~kWSR^5V zCl7X{@$RN$*lIKi3S**wkjW;kk_TAyU(KbiwXnBZ+ni@OqbAE1;}x^)yO^vF<@o zHs6=R;x$ITHx(RWd~&_AIjD8Rvi_^{C9ut0{*{m*<-a@CHa1@pb>bM<8hL+8^F z9_?zF5MY?8vT`52gpV7^W4xSRd zk95tuf5gDP^wEHGeL>Vd#5h9ZmI})w&IpUtvcJV+oN&5&D@rX?ar5fb;b{Jdu{t|T zcPamI0rY5hkj!`7^Eu_;*m%y#Ii^OyK-a+;oZQ+>rZ!~DDzKBM2I%3s0Rsu_S zB&jwWE5A>mBRNn?KcifC%EyMU4XLBqT5_8TUb@y2#3x$MU1T$a-vlux ziYk{SUmrIexXw={svo_Fk(-I;U&49o<&NndHUm084+-AigO>KdW~+o5y989;lNE}A z-#SE7y$|%WZ3$`W5S{#n=E@m&m>z+usZDOw=SjhS`3I(_<8$5h$^BnZlpPzbEnC$# z{`vM>E8#0+v^O~X@_hjg*D`l;<9oN1X@y*jF z-Wf?O#uej^oL+4dY5{vI*i9;Vc`9Pbs8^lSahO`3ElYJ&)O9!v2&#?FY3 z_sG@%WkKT?rski)Z?8He-@S6+=3<|li?`C8lT?e&{Lz@b=FJ)wKDtz_|N6!8ZJRuO zNA`dp*R6N};ht_(k>_NClU$ck6XJf|22cOgIse0LG$6U7xQcbZ@n+Vuv_>0NW=9&K zo`6Q{M7)jih|^%iX^^bHcJhFhtF?x{xMc&?NZCa)7215g!T&dKPz}`=_SNu2%)aVW z5$y|hd(}~vmye5d-4!F!GaKG#Zx`~*%U*3oU(i{tugo7b{(&v!n^%$|G7JO>)jk6x zmMZTBhOm_s2@(>kvBbrd{+TgGw}VXTU;5p(&1|gV460-HXG99f*4zGgFB@nm@UFjX z6oX8Y^r~aG1z`zWU%u6i-pJ}`O!IEIoH35@P>g*?JB+&cl0OIIwovjk73We>4wmSX zH5i5`g=W+6oWDPTQl_XfCEQNc_^&bw|1fb{*H3QCxcc<6H)w3C$g*g>HhFMU8LLQ# zg+DfDGHT^ubl%nH!LP3asR>Zw<5|;1Gb^QZbkgMvYE&L6>1$zD%rRsxb@5s9+!=EH1)*;P!6IrGW@a7sUEsppude|3 zTLkvvOw9<=m@DvF8%ASB6brOB`Otyixql#0M`%v);37mfCSCd(hD;hW5`Ik`uxj%f z+%$)J_elA%c>KM1*kKZzWQE=0`BY^f`Dg5+ncjn_68jTv4U^!%_vy{+LmyZy>e-J% zC!EBM$uL!$-khrGGK*{dd2!qO1%cQ1fO<4nRJ{b;u>51Q`JzkQYHJDd3k!ciBaw}@9fPMy7WJbIBb=N*Hxmws1D zRl*>(HtK^7xSJo8BM+!0&7C1FzS|u3{@8koqyHs8`P+>wvudCB$;uwprbRCj*_y07 z7Bkimloay^G5G7}?}OQ-gsa5wHWpH{jc6|#hgZYl)3CZ$yEn~XvoW--caf|`6RHeQ z+k~2^Z>AI)5OWvOlN`r7<>Tx=%7^}nPk zhtaX!PwYmcf~$IOpF&>|t>%h3d3`JT*%CO?xQtbg1#7st z-yvb|*Wc=K`0Di6cB5fT^J(D(Sjm6%4!8c>i0x6VFoP#u!Hn_2oN7))Zo-f8bz+d# zXzeMG$>!B!#xn8>N7G&hk`tMA7Q0HQLv6)d4m3E5XV;0}#w6UtNKAwWxsx*0Cc|o5-@n?_hyS7R{OPn16=0L&EqX^e@Wf zCY82-eqnF^b4)cP*$uIO-!Yc&@RX?2Kwv(-i+JigXiR9@W!Kij`oct7d3MxPdHVpDo$)R8B4V|%Y;<=3Re zZHe3q_BE*LqkK(>aOmNhPF>OjMb>@oJR!)BdZ)yxFw5&16CZ4Etn zy(>6Hc3D4l#y6?VUGw&({!UbZ`7g z32yF8)6J@>qIX6Cz1NTM?P?bBt?GBR@+y)JM%CU(`q~4kRUO|Xo#Fy8yD8E)c)10V8uxt$m6U}Bh zQ8ud4VJiI&Jdv`-Z$Pi~CKH|F(jk@!x}3OC`_=;|aOV;*i|@`Yy!^Fh*nOL4k9^n4 zGIK{S9#gxO*DYR{|Lg#H0W{Yb|8eyg*xj_UC)Hz7VErJ?bnIbSPI!sN!-jV8Sw%+N z&CJRrg;jgIOV5yLWm?()QUiMfg(>Uh^#n2cWp-~Q>N0NPD_HnrTj2fZ)Zt!-&tbh@ ztUy#GE|@6VEB-Uzb08f%268}}`4CHk#Ie_(T!XP&jyJ1HH4+igta%(mQ>HgO)mwB= zI1hgG&~1xqIAXGJp?B3Orz%pThDYq8Ro@F2It$JT*-6Oa z?BxRuM@6qMi1WF3vh3(`;oFJA_^4TMJjZq$PHy?WLKdad`rj*)o~z(+{XwWrY+85k z@Ubw^%J>$na_;k>=dzV2;{PM+OTeN0zJTr9OxYQfvG2=R%D&4|Buhwzv4$imkummt zWNaZ@Nu(5s?1r)Lg(BP7rDQB+?7lm{|Mz^~^PJ~>?{dyP=bn4+xy$>$_k}RbpV^`0 zDHUsL^SQ|C4s3oHPZ$?vDfj|!!>U>mtemDAR&O`OAO13R@jyG zDTL(I8XI)GJVEn2)0^IRz|-NVKP${P`{n>=#KX$ThiB&{8+uFl2j7`bU}ent6ZAgd zVcL9HDw05&v7vWQ=yf3>tB%iP*TNu;6>EAqX0d$olMs10Sgq~5fK*2ow-D!e@6W{0| z^-hffZHpf3bb@%Rc~aQD_1XI~jBMY|1fRW?y4pI9|9c`lVQ`eJAm%Z6H2KIC9mall zCY!P{;+n)tyxN3A&WsLY34@k3}(zsj? zXV0oybwQEZnKqc)J$W77nb!mI(6>^J2IkoVD9X}Bwx^lctNer@ro+Q_v=sgZZe=BPlQZPXk{jf3zv?%L8n)I|M$6xv7|y!Q?gP29R~2(xI$&;`Y1?;Iko)fU zz9AJZnRSOB`{2K-vP+SJAe7x0b6mdu-0H@}aNh=DY9Gb3>6=;aOcfn?aF7J6&?4f` zvP8+=rIzW$b3Je?{IaNd*Kwjo5m#GfvF5LR^#L+@pP?|5QU!Us*tBCy5dTNf)DA9@ zuf0XCzR_QZzAVyHQB$=OYz+Bra>vfceRU=aa(DwUq1|dKT#5?6Ev->#S67*=d7<7m zP}}bbGJT&RLN(vwFD1>D!k>#x*51hRzMJqQKvCyUOCg|3izTy_m~UF?{vyMvQy;dODh7Wz$q= zsMKDzTzIxEy9uP^rF7nyAnI)VM>rb|sAm7wRAS^0tKl6L=5)KC6z9ZH=N6kYLnl*q zo<_$UZ&w|bu8g87m={ZrRh^zSRz}ej749ygV#e`k#jeBLO)s4xdRp1L0>gWy#}u%^7XqFWL!%Agpa(%L3fo-B)!Dt8CPo8o{r ziNZG~blSCsko3L%9xFa7&2fK#m`I4iEV+O$o>cXd^yp`o8-ottsxC-}`ngpf3{8{;_JI(Z@=I zViD`)Ta|D9`UkbvjWDEzqB2l~X>Uf@Z#WUDBTbF|v)aFrTzm5HK|%Y9fqvt$UEpka zb>*>a94-#n-HCY*z!z*2adlsF3j3y2u7KP9RCP!SRESp*{NA_m&4=BoBPh&m>&B1c z+B0GR{#+A8OXl=~udNr19#K3d3MzdUm$Yo!~$?Hl?YYH}3%ejp;H(sqUPwXOne zR_t|A2e+Z#uNU;fRhDRXfGuv701NzaochCor&VFn;YV{{=-v10j)e%@9+389fATNr zHH~(Z$)UD%(=-ONH*ZQ)@6mwEh*oG%>KY)3_In5j_|*=8A+u^b(V?Q9wedhN{*k;3 zU#_RB=+W-iRN2xY_N#zR2l)aE-Vj9zccP+?)O6qW0JelaP>PAG8|cZ&y?80MsNU87 zAwPYbvFcy6!E`j*JUZ}Lo2u7;DONE^d_;eLEj;1rHUlJB|R!#m^@bl1-KxRaj0{!okCJrN#5-~!*Tqc@E0 z1iNm6^b7ePYN`&qqRH1juW^STp_#>3azelw3$*2-rEESXa~YHt{&dJi8xI06qK3#e zVY&)bd+?8}TH+S*mUQE)pAHl!&-n;t8we+K2^e$vxKo(30tU;Nr!|TKNtod*N|iR& z#bi*bx?i`adu!_Z%$bxgcbx!j*A&oc+-`M6CZ*v!?(N86A(b|e;-mg&2u0)ibRC%O zIJ#whc5T9-DGHE{_fH;hlOE)M*3Ww?y5qaZt-Ig{_)Xo7ZDQ=Q&jA>AS8o#de}tmm z?IeYih4~0~z5ADR2>t?J52pl9irVBZ5PV#wW>Oo|YW_t_aZb4BWb#l&kN<(+@{T*H zOWMa>cSi4fU$~4FaI@TzWWUmCzUefbw0aY?q}+r9&$XF!porm{MAqS;X2F8zPX=4L zsDYotMZK5>S~M_k9_|}*s(b=e@F?y{p}a;|+bAlHI1bw;`}1baDv$T;+V*c9r5nYszooBdY_<&?7Pkqr4fJaQ z!HSx9AZPf?JD{vpv<>JW@5bMPum;0hT+=#eY=aG7!1Fik9dAA3^#Nm(4vjHj*rd|MnFrY_X(^fGFqnWLPFi(;hT;^R>@ayW_J?l><&vn?8$Kr1IO#4mYTA z-?MXHFqo%C2F(T?vTo#GMYTZpYCr|6;u43mW(ZRzOGu3FLiGJ5^LU_}HLsYBX4>Gwa+_Tk>zrg>dQ=n6l%%PAGFa%pV)J+3NgtbVIiXQsC_7d6lDTLnwT!WCykYILY z*0>K~5HtR48%QX!Y5>>lYYnz^91Plj=&@@(2K+|*fQ_1o@QOgpCL`$7ID^k3*is{y zlUOWG(Kc`<*24OAJt+90|Hi{@pg)z!<(txth32Uh4E!>LtgQUQDioQU-Y0i-HsD>rKM@3T3rtYI zzg#SpUI@O;LIi^$#rF+R%5Y6TK*M#&0%@A(?i(<7WQ9&LhvPs4cBJyK zO@fF(wUQvm`~AV=x5bgXZ7?1u=)5|f$b%wvXx8KbFUrkYGTryL zau5B7FLtYt7PT{<#+ix4$367#0x`$A^JG%N)-6!DQ{~m_u6PI&1GARy$k z5~i8ywej2vR5-4(%j626FJ2Rp1&5-pii5=@BN)D*}X3|Bx; zri56Drfs=Pnqc8(j=P>4^qW4p+4o_f(C~NrfcZN~Ar^D=QO+SHibhQSklfOKpxHt@ zb@CEmq4DUrWE_K_UJ&c~DzYlL1>=O7-jRjw9{{zbF#N4TibBvE%AVV0;r5C$yg(S@ zruv+nf;Aj9hOsL=7an`fqYx+qMr!mUJF?KCD4^$XVe8oAYh8Vyqh3oo3T$D43$lDz zN!eYTeR=v7J*{)0Z^^xIm)hh7%^HeP?|`h=X~@~dlwImQ2Ge+DGUG>a7xISXhrC z73hJa*FuHH>&kzD!O9nq^aA}4K#yhKJ_amDImnpe-1{Jf`@d^pIuXcKSp~SB`vFob zboXm_mRpkXKx0}7f55@fu0%IyS7d~6fJKH2Lk+|4zEwx+HCZprzRNNpjro>q%^h^ z;C!7b?WG&x59e6pSCjt%&o)BNw^0Xkw(D8^k=ao?OUS=^1^!M>bZ$RSZtzev+R_z^ z4DBg`!5hA|axebzCV7m1sMqpdp=Dsjlax7nOaa_{$^cU^JLaQeQsImpX&Qz5(=4xa z$iuRfE4LmRd#|dJ1lJ?rXS-{Gk9OK3P@H<|3cUUI>F@{s!~Unkld22T$2Fv~>JOQe z!*w4rXNV|&Fmz9NfT5c^ph1%^5Y42C8PTD=RXk=ve1wtP|D#eDmkdbctd4SxgP45? z_@WT|<0o=NWXxX8?kovTsszele$@;HCxue-^*P>Av2v@i@SO8-7^x|(x#r`cn*Z+K z$EUG=O=hUbVB8`1vWOvhpz%I@&IEyd3T`QdUyytN;AvC%7mn$pLa@=nQHyKuap7dtBv5?Js zA5E%ZnhJa5G+29Us-ZSgW(gt!wh8O0Pa3)3I`Brm?HQart6C;aUr&lSa{`lTKbeS(*!Bq=+P1%3skn&shsLr$!$zOW_Wk-lkBTpBo+* zLwm74y@bPm*Yc)#dMUr>))h33lA+=6Ml9m}Pb~lCw)rzVkX9<>6H=Hu!VZp3UVhg(ND8rO4m~XW?Z;}(mcf@cCx6);rlZbMUfz3S;qK224)$Wz{>Ar#92ygkQKdiL z&7F>7+Ym|UKkXF&?+f>zCj56RG&-`PjRZ$C6$n@r_@(!1-C@U7qe&=Z7B0@{OQC&n zA=mIl+B5B15~Nu24LHo*g=a~0xm5z|u?Q)fkxN(upo zNpgXcB59_C4KL|aFq!h--(RN8a^lBs_JKp*w!6oadxhr|D!!0$+_>6#6CX{naJ<5)bP?p0+|ZcUJ|Vpclsa>e6gF}ae3@3zjH(A2f%!g5X>*vE?kOAYUh#IJ3%3qzqIh6^+tA^woJ$avYwvn|m0)eg<)S zW3V~?-(aZbE*+w{o=ErP49to!&fr8)8P|Go{qTabNvIPXbw;(gWi{T3z8pcq6zdWcVI1M-X<5c&W^jU(OU9HFsnq`Y1eIECdZT+f zFV;`P-=0!WHWU)<&;`_Idx@)0HE|W9S}$H5QfBUZlG>sCUxZKA(NCtR)jJ9)huXsh z2EyIwvSm*>81NhdJ3%+yzk z%Mm=SPghzHN&&6j;Tk+I zZxB&bClW-?7wMs=T01RrN{kbhbepw@&AuyI!-!y|DDbt7)|Qe zj2(ExS#yjU<24&-@Q$*UWM)zvv;C+_@BB&nY}}J?q-e(r zSk>$7-^U)ovuwmSO&NW>1^nM$T-c;s9n<~x`In=y%_Y@Rp@A}{pnptrf^Rp1Sko0&brad8)SwtDU^xmS+~BFhZ7@oB?M%h_6lv_B%QB`wK`RV z$2WzyG1EfPZ!9?dPcJbBSmE>jwv2z~c+tm+5EHG_qT~n>4Oa*)ir>+Y(&e#>A2X%! zX3jpnrXT&J)hLNgO=llP3jMtwUS-{)9hSdMsceW&i$BDjpzrv!gm4K(yyn`c2)5L2 zRamC*vK~6NFUkuM4L-}Vyi8%~c(!$Inc_PQgV2Kw@vCAl;(E}e@fMe9sWuY-4kppIti+qpGB$cB7$HP zqP~BbQuTEmp)P~6*wkNMq^}MxQP6rW{_o+u;TnnkI@>j^VgfUVh3;Q0TIaE11TFU( z)3x%e*vE8+kLm2wW{4wZ)G~}Ps?*kf5rL4fazL(=HaosB+0tddV}w-^+p^@R3N~loKMCKVq{F*NzlOClV`Ywg&^D>g)l9LmfT!1WZdxRuOUB#%R2m_%r09%mF&zvYHyV zQ*b89Lizqv#*Qnr046Lcw?GFjTYqejROUD-_w`M2gRv zhO>VBOwRoVA}qtJp|9ns>Ix~F3Mo6FluQ1|RwB(&$aKXqlzt0Rg=xy#}x1Kq;U^ROtvSd>t*+pF2(=YJeu9K1G{KTd%bpG%6k zzAG5+%XD8S;=r;e^!&x86U@;JAvlb*x1o_v_mh;c{fg7Q;jrV? z(``b_>GILe>3-PBBH?sP=XC1y1b+G(etJweT^>H&svvOwy_3mT+?Y{z0xu zLtCNKkyy%eoN7FdvAB$&JAyl{b#HmRUH|H!;@X-YRqxm>)T@F6X|aP`)yzl!$qmZO zbjET|TLzC8h*IAk`){fdPTo+T+o`MjDk;TH5byiFKukRHEGMb>4;<1MpO)3{<*Evy zw?hs8;%7rwZXey&78O^${b=i6kPrBD^I2U`nC5DJURHBMP}uas()oa|kNq8Yw>y-k z99NTYKA*DLHEMq0_KI;yuHvirM1!|OE~Yiq4L{pZ!F5~c8(vY{(%=eUGroaJhn>AY zy|_etkdwYs^)da>HJEKYr)#iL@X7Y$HNN`2p+j}TQ9(}n;VW11t){2DrVUdMwzYls zO+UPI2Pm0cy~N(r{;3~-9G=a5-+#pRLT=Aus8k`+Rzm?h5kbAQ-~KHv@=adj!9+v4 zjc0i?X<RRdM&{PPM}8aQ$uTLELzK7-u(D6-8)Z@lQHHtm1Ln)--XFl)e;$ zDE>8m{NKC*CjY%u+RX++4QDjl`%y`zDeF;*gH4e%}1sQv(L7`Cc7|dYwc` z<5?S_mqVz_UQ~4Tn_P6k))95@{Y4-%OR4v7zS2Jzi#83y#R#sKz#mxrgKc|dw-$$B z3+q_7OZXP-ITdg^p9hcB%>>Rf_$D{qH_-2i(VOtpL-|9t@xQeeMrEK|Q)2=h-pRsF z-p~lIV!l_rl2>h|{o}^rQ!9+Hj(a2V?2caG3>Fh-E3JQsyq*7wA&TmJR8J(pzbaIm((Xt)Lk`ifhge{pXoHx8- z;y|}$cEdyhn_xpyN-cR~CUU3W?Z{kU--d34rwP%M!xa5_SXVLop@`g75kBm$BrEm2w*pc#_V8KjNZO!0CB& zK%%k<2&;1?`g~>vKFU@>H(*QR_oCg;7@5P&QkL-uKc=!TM#8txTbitMe;X)8j=9Aw z%@^KDi9oh+SWP9md}!3q?l4*T?)FOsvNJAdhGU9yLtr~Zv%RfogzhrMvL-sCT}m`m zBN;1l*lr+Z;#d>&%5*2q+jI6}=Qr>YdXJw(TXfytev<}+# zF~fG2A(fV|Mjcr$RT{4PCI*Rf5b99gj-z$I_CH~qv64+NEA}(4R1O9cRnF?``l$cMN0WS38hlm?yo-Im>ivZDpFc<#7w7C(34g!HLD{kqN>8+MBF}&N;eyO=Z%(ixrFaiAgq-&Y>Ub$Jepns?UDm*1Ka2$}cK$*Xk}Yb@3sN%1I;oQu4wA|&X-0Xuq5Zt^LQ^^Z$B=eI4zpu1?8n>W z5H$4<#(5)miwY&_*$3ug>>C&vJbWZ~iTNX67{mJwv#3%XJ?%52;=eHZBdj$Cc*KfI z{M3Vz&&yE{->WNb4CdrmZS<5NJUx2lp$~l26Z6VWe(IWVr=f- zMZ6fCf7emAn34PCcYP1xQr7I(jZ)v6O}*d^P(pN?xhLlIaVX);-}L0V45aXAmkw;I zT@c&3-bFw(WBZg9q(1E!W+q5vfU3(ED{?w;inSo!Rt7#S#vm8?Jj`As3cCw{o1!b# zbu7XZ_O%g_pR>I)lXmgZQOPO7H4P_(r(0ttzGK;az9x_8RHRCy+ zyiVOS%05p6LNQX3h4zjFZtf-il&=-p+pV5wR#5t z>EPd)6CYW|4Y8KzDv7hr>qX`0SHMO(Brp!Qv-K+wMUVd{Q;g)_M4<<~mSW7F4*r+e zO~F)fn2+uze#{l>Nskc(lLCYLk0I^T z&o5z*AO;<12=$LMscjSF(YL(=-8*q+M7bG(!I_Fp>Vw&eK}OHI;En`W?8jW^4;sY` zE#xsyb{f(iq*Kg}LUJ%xM16D-m-2u_Upd|?Q-4#181BqI)j*?*DG796MY|nOLS9;AwS4M!2 ze8K_mq6}CR9LFG=;N*CRi4rhz=A00q6Ow_$DR*prJI`4U?Dx|cy|>t?0US_wg3uK( z;d=R$o>d44n3Rf~1?mN!KQ~5??IrR}-v2<)C`lfgHe`WViG!*;!NfQi4AMHB%T;0G ziFdTPV*QKa-Q19{ogLi=bdNjkfp03$A=%=P(Xq(ru59l#)_l-BpwQx?805x%H>mu>5NPrrc@!y9N(p(eXGhBgGMD@c#$Qb}_vq zd{y)nkr_@uK~M_R8r6OP$k1vF%I2}FXhYxNgVBM%I$3rg>w9qY_5vqMJ_5@ z_wnXP)*#FzTCb@MzInjQV@{5+m~d9{T)!%O$OGJJXAe4-+z5Y?J5+}3KPuU-n>nmt z%ip~5x;EFWE#lw)Kh$p#EFdP65k{SBx&ThOKRnp!86^_`x_1gCImSpnRjRiNgt zx5%WF(N$|G{r?3_UJ2}M2^MgV;&6NmBifntIY2Y5V`zM@n=tz-eCkP@ca~yRK#GoB zwC~~n39Qpe@grPmq#U+g3_EY8uw+Ubu&=meN)Dtyp>gfRoGpp$bp~0quANUg9Q#rg zdX`Oo)MxkJ>BNeY0ctO8>`<2^XpxvYnxSAj(BsvYZ8DZ^l94*fVNj4EXnx7v#M)Bf z!E;5id^@pxYo%c+4F7u9U55~&v^Vg3q>vx%0=pb0su@;#6+@xB2s zX*Z2QJc3e|oPaH|QRIE;_IXr9sZ=&c&38Y3<`yK%WGpR}ciBKc0u|40ZseUYkoWmq z*AdJ}B2EE^97qv-mL~Y@0d~au?1MN@rIqeG(P>{9L|?I9_L#nTG0j4>{r`fy@bw6{ zz-2cD+glitbl0H*_4g`lA6gOIvint1H8pwsEfkMz0EoGE@<4$bO&Bvwzfqr#sT1cx zOYyi!zKXxN3@t8`i1IHQ_>kvjqsD__KLeaNUAd@|vn-FAIVdX)84Y0MOm91nkwiXl z0BYvE0dY#wkJCU&v766(5&8hUOca!od)sp;ef}3OOP-!j9GJQs3#6vJCdHnhh`FW+ z2`AG)Gs%F-69f7H3p|9)RmHb?936+9U_t9_qqc?B(Bw~xqyHo=4)eD_T)DR(SZ0h^ zGDW=2gB9~h0AH*ZzYdG;IqPxtCgPkK)GF|)(etlGsr@Rv^{7`oJFY$Hcb2x#c-UP9 zM9L5L=?n^JKv~(h)hta|HM7-x+XlQKlZV6zk{c?_0VYQ*Vsg*)K4`?+GXd%FG}VAIT0sYy2#G9qKVcF7 z#k_?cT4#OWk%CnMXLA)xEHkeSJoNC+(^)!8(%Y8w+#>_ruxMp~U(j=xL9N|lU*I|= z-0=21ba43?%ROr%@(W|s!;_3v3W?5pSr4FzN800#oTtY`u)>O+nZz{{uWu03=q8xB z0|@byrEiw9d{bf?21Gep`ee~PsT@4Zvw31xL7|wQ#} z`ti|i;Hl{Uu*$LF-(k=Dv(I0#W$5=FFw}Cjy>LUjWW$2-#)N06TQTP*_;ny&Gp0N9JO%b*{N0Swp* zhsJ}+_`6iao5_C#TkPR!alZ|~lo+~V?SUvfn-(W+AR`GtDcd5a4W%9*bc5c%NZmx@ z1yqO`(r%vzc4&X>H8U}GGz)Lcg^DGt z)D)59ij_;(0~G2qJY9)#9~blv=wiMidj)>vBSOmEGWL}tQO}JMIYvy{3ze;IV~waB zkQo+uvz2tCZAoO192w}2OhI2Y`4rA!HJzrv@{&Pm&H}cao+0$nNpL>{_%XGftji*W zY)1Pc&|y&knDEPNYscIkt%V|1Q)$lIl193sZT1T70j44klxP-{q7n>w8q8n~W>j89 zoIq@&IMJsAx4A(_{fcCK)y_takA05*U&K|22^0i`?O>6_!PuF|uxQA0{u!u}Wpp{` zC9!fc4Zx9L{~~4WaJ?%rlkrZDS_J;fEukJ=CRVW*oNncbh_?vj9XVD&;E|FEN;AwJ zky5;OjUdbr86%hofs8_-mS7W0=*8`9=avlWI3zOunlm!Kucbv$-H|JnftD+FuJpgV zSVBu%r(n}hJj=&c{6vaztHjQ0n9@C=mkzL^Wp`wJd>|4gpV))vitXtK6Z{1+p~)CQ z-de8MJHcP=FiLVoGL;BJe;*`F+URE$;C&NfaK{JC@Lk;C-|>hRRRZ&+`*ihhu%;0Z z0}&6f3h`%KjsYu-YKXzZd$Le=9^nQ=Xj?Q#o9dzf#~H9_A$vhHlL+X!TQGx>4uL+f z<(0vWt&ag&AK5Qe#UQse#1q~AU#xs0=kE}Yw9yKe9MtmHZJ1cI0XgW}*=5Ml#nFpx zb|BC4+$x@FyI*eZaeN8O2S0eqivgymXp8xB4=hU__Z2_ZAGiWmAz%$xtUKlo zF{sXvhgui2l$Z!&Q0N3xJo6&-_7aiywR&zyNK`b{sEGsu`uk$?UpX^&{hb&= zkp_rCJRdih;1Aj>R2BFjvDJ6qGJ zoj2n56^f?>glb~+5+PA{_Z?s&vV5@*`P}-)@d#F0A*-99PV^()O5kVAx4}jPYw9Fk z;9(~XyQQj?(0^D0HSduVRsLcx+$XB^K+W4}s^c5Xx?$qpX4k`!{d75Ar=czImUa|gio3&BoHWP}Oy{hM^S_St)Vxc9e_5MKq z1!t5$%Z>sUSiMDkv8M5JeL&|ro1x&xlw(x# z9z(KTskHdd4tVL0St*<%-x+S@E=y?x|#1g{slwGkK^~958+%@ zOb$uC8%#f*gN;v!d*|J+#qym+gwcUY>A_p{TY|wu;RBlr=nMm9`D=IoYL%%pB@}Ko$Md)P95zk z?cz>PriiE8xUkbw9SZK@&~3jp7J6@sW50-V^auamTa3Q=lX^MoprGfap1XI@m!L4| z$p411k zJih)Z<7r+<#24-24APZ<#@(D4$uNr~)d5uUl&5yvp8$oJ&%=4RaZX*cRGdPhM9J4e zB}e5H$)F(ioxzY8g{jkLVrkjm|AwS2xaRiUos2VV*ebM6KKl#jlYZ8_UB{m*xhxSU z9B|U~TlHk-)K8DGgQJb;qOtEyeCa|i~nACcDOpowtOym z9T7H!I$9mD*uc2*qT%l6QCGY7>pGQB0(ghGeUu%oZzruDTZx1{Me(K>G-Y%{y9ufE zv!6;gg7`~^c8I?c$2q?Re>iII2(wu9;r2#_RXOmZhLkl^K6QjV{1%zwJHVIXHLkm* zadm%I|N8tQOEBt>KL5~5RQ8@mT3dZWXGd^!Cx>R1+M6)+g7mC*R0VCq*5f=_*sS{} zd;Zb2!=GABny38e#97FR^+L^XmR{rH>d|k7Thp6+J3BO4{)6qWQiAs)^86n0pGl}q zy}CH_p`DxZtoM=iQK^~cr-D}bLWQPMZ;sL{vBY~DaS*kGdHU_}k+rr)u7<6J`3Sjs zT=0Oh2!BoBd~$O>bJ$|rl=~dik)GdI*(po)4*R{3J#H1v)VuA}zb|Ua`n9?K<3jaa zhVb($6XYgPad*!{{e!OJws)xMn6Ga=?ZdZukU#Q*Vt2*cBCEe}% z@4?AG*z9<91mDR`UVh(=l+u>Rig??Aw@uzCDXeicjuXLbo)k2gg&yEXGch$s3D`t-CP@^B%+V#mpb(!;*~?p-E{pmLN<47K zy5zW!e?dVPr1=XhJLY&gRi1Fgb>ytV&_?TXYHsJun9et$d6IoD7VUp*O}5B>x5QUHX9N@RE(UM>&Tz}GY4fB%W(lVXXW#1ViqYK52wJjLHD+ykqO zCADeFNr;ds}qI3_EP`K5)zZI{ZeLtnqxy9xD5m!0Gt&i|F`2+@S4M?8YSu~Y5 z4Keb3VJ>?UZ1pB{ghAJ<+m$=1xr>=?F&%$KwyZ({A2r!ne;MTZn5CjDa z>q@rRyZh?QgfFbnfY-^r#^xw#MW9y!taY>P!`ed5e`z+$f&5_8X>UEIx)eaeIn<5 z8CtZ01^rjMh8fSa@!9HcO7=r~!!B#fF5lGC-<110M{g@H(gI(bZ+oGGzDa23Mjy1- zyap)#N4n}dU)tcaEX~*>zHa8?ov0Y@G!>zyHa|iC#v_M}i94=>Yy3W|-J$X#Cr>=i zwy5GlvTzcyq+jjwPtWBIob19Du|e!a{q1{Egc?m%%0{x8lxKwHCs$9kc9+SCwD>;G z3)AX4eRlMGzAb4E(i`$9FYcBJ`dDRXL0;sZA^l+mpB?X$ov8|(sn=h>;L0ri@yozq zp6r=r5omuOT`q}PvS1#v4BC-IFXnv+yZ!HP1oSzav_hTTm6Qxgh&xRt*~^QB31sSM z_3@={K4zYURbrbUU5y1zdx?+cr+?_HA9q0tEtZa|`ao+{?NRZ_-*qrK`8PLKva|gz zrh`}@HSNUZ#3Q3!DW_ezB5nn^-&|NEa;Jr9_2#NO-IdX{UHylJ^fo#-jXMkOQ}=T7 zLB>g{6|(>Ew2vVGMGlmw4eMy!%7c#(3;$-FET9}5G?Rua9B=eQjkg#2-#TB5-HR~O zjx%ejpWf%>h9vM=o*l9jnGO0y2(sd3gNJ{@R#*1oW=2#+Hm1`ouCUul$bb+V_mI2@ zF@Z@wL9FnZSfPQ(cB$v6)j2j?cX}zd#ee88_bPkK61z5fyhMEXvM9ke9aVBDEAWsv zEo?DYbF?r`{7kyv)YV05m^R#^K-OGa*8I$L{9d(kFxACq$-4fwQHRQn=&i>o z+eXDPhgZy}>$kp@&t0*IuqbvgX`1Msg$c~gFW+?qkG)l z$vyinuXc(i{X)gp<&S|~GV|MOv?zrLZrRW5bBV5AkkoDx=bepzt|EjQda={*$IZrE zo=+Tn(30A>ZzQ!U9W|7)=I^Mugz|f~(;l5CpYY`D#>G9Ucj5(?)tuZPwMY(b4XQ$V z30iG&bWKNzPTULNtryVA3nVrjsaNA}sS%QEwP7lcRt;=hxYmcJLhE7ewcTjxu}%4*?ktr2yDe9NYBmweYP&>1#gKUuu;&-N%{>D{Sq zliezP?AE($D($PTLM;b=30YTUc8o``sOmP7J)hID3fgM2wv6lQmE=P2yD0Ixm~E%L z$9zL^bVH?9DAwt{*gK1SMadQK_~i3c7L()srY^SF_@T-Q2szEzrm~%HVT|FuKk9a z8!QxU4k)ktCcx+M;J;w`Di`#=m7&ypwjavupYAp}nx6t+`?QTiEiI zf0KZ1^JyRH#AlHbbMdOL)Uc(5&e==*KScW~AYT`5BXoXUPaXWT;?o{))9vjg%(gf4@;81s)v;u7i*ayG z+>_Bvz2)w|62q6vb^?3fX=RjR$*>yoKNt%N^J==y>z8%31izr|wybhdQeMEaAkzwf zqi#`R%9M41zEx+L`Lc?{yUmvon~t~lB(k}&5@ak5YXEJ0Wf`T5(WQ$^^Dzv;duyzY z=|W9nm-Z5D@IF@2@G$xRA_sUSlwzG7H~LD$=5)@c!3VeX?l0J&a=G>?Q5{Ps-c^a> zVD5nc&k>-OG{N~bRWe*R0aR8^kd-x6$)+=wLCEw?yx4sAb4K~QY>pEmn&-ujO6W~d zd7ngxk^3J#@Q~bS&pna7FX4q5Vn@Zw^W6RnxLTV%PHwiQfW;asyx$;8fd+fG8q+-I zZG3-4G~7q*=sQ%Q7j|l$OANkiGQ~c^oh$`U|usPnjCSgtfuma23O=qafW>pL7bOZZXF$-jrV(pDt6(o`Ph z0rm||P1uLsfAqIYHkfe|c`A=k{$KUC9nU-6s>ZhA{tr{{0oK&g{ExrahJuJnlbWj{ zyvr9PPuZ^yHTW=^2!?)&Kl@y?h{l{QBM&w*YCe*fGRcuOL5n|?i zFKEZ{-lw^n;h(*i?V5EWAYGfM=y`}i&0Ej1d9^Lh)4EQQ z0+xf9+ONx}Nu-8{ABSL@%HESX?FTEuX`|~sla^1S zxWJTo>08f{0kz+s!$aHDL!M99Y<|JdJgB5+@LH{SuEysocpftW+lTe$98)hqplHrP zlG+S4Vbanb|)0P^FM#hWW;tyOQgC&hU>dwfICgJ$>YqvbK2*L?ZiH$+mI zy3+a6#(75|8tP!QhTM_@DE%ugD;qP}mtstl-~$Ly$zw)1#cp_A1FhjdvEkP*CmKn9`E8YQD82tsu4sHMobqG4 zRi^<$9O8i-)V%e*Kgh!JWFKGR51$_N8?q&T>s=iC&98FcVo@>Hn!G=QN0HU~_*0Z8 znp)vEq)s`d4bTywvJB=zV-Am!*A@1h`{Ya>|1CK^7}X@~>-3y+I&3r)1T<(N^LwBn zdR<0-+Z)rD`c-r$>nqFslBzdT!>XP@Th9MA#mZ%CYQU7mnoX>@l7jGye%lK+3; zNpGurt3aOIcO`U4V+(z8cf~A)TEc0P0xl~+m~KPk&GlB(&NnC_SmmV* zotm>^W-GEor98~;fvBqSmm3Hq#nT1~!xLAcaw1molGXechegc|{>=PNgEJbbv(IM% zxKs3mEpki`TyfmfgURwc{7ME=fJw4eK7RxB6VbUcRBz~FR&NwTc>CBl-E?Rs?G3>* z-?s=e(Dt}KkCXq16CPacn^e8$*WB(=8xQw+mOuMD4v za-$(@Cuh2Ssz)`?ERRiR7Gc zp(jy>ten{81bi>t#+RnXHGR=M46z{=wClcEme{lRQ-?Z`b+D`tbAOnYr59lO1cc}h z8n?d$yl-LoS29S?ee(rx3JB-uUXBx z0`$XkBI0n5lIwNlQzUkhpa48!3;$M%xMzLK`9;^JucQ87fP>8 z4+7qs!24Ugis%^lZ4XR~vT^{Mni>0TuOb-PVH%U=_ReTyE+vclF?Vm^q3^K`o5f&6 z%fyS%AO{p(b#w;k1BBmqH+@(@>T(h5=_0`k7CO9L;l>do5!W_}3p1SO80aJ+w&3)O zd!q2Yw&whZ5F8)~iPR@4e8_=*Kx|T{+Q3mqJ4@nEu7%9;l#G}2vn@#Ue^-Q|cl4Z+x0}=Hn<|0O(tmIST-O~oVEP(7etMy5vF)YW_!X}JIEe7$%8xR((uPq>0 zr1ZRl-W7|%u3_R?%05U%Y@M(%gt@cA+~>d;vCFkH$!;kSrS)K+xtfg}&AqyCOCP$H z<_Ja;tz`bWPj-J&2sBiMbTjRjTu?~qCeMc$p)x1euD6@dDw(Ha>_T$(fPa(&Ha1=L z6pVsLrM)UhCiBU`8JoHIvEc)ae&0wJ6|!S*I)9KznXJX%(m}BmfR`QR&zN|gtLT@U z#V02fxO1qGNC&z@4%FG~cAU#`;wk!7Io~Rt<}RNGshZb;ZW>$!rKVd?Ii#{GXLM2t zoiPBA8K?T_@nDv+Jt($=LDIemBWhM#N&JD} zf!di<@_qj~M7}_{2r|+f$F^XoDfYh(;*D}ZYglBt>!&CVl)o>Br5}f76dZaG;I%-=7b|ifX|a(^LJxnjpS{INFM(T{ zvr2(?to_M3Z27U^u4F`1af>yDnTDVzPoy7YHK(V|IXHqYY*6QZJFIUZ1wIIp+eU};ZT*Bq86d~ zmc%l^A_`8!0@NgZ6}9=(9-M`jnOh9pe77OfNQd=Is3C?4F-J#HN@8c-o_y1~v=Xi)kH+Em6%64yIb8HnaBzT8p$2Qy`);f~bJYxNY$+ z2qXwmyP?tuAfTIlR%#>hN0f65%a6pFo-?mFr(P2_LkXKVQf%2?TQ*2G3&EN#VHg15 z(_*AlmL&l&b|RQgV*ts$9GRof|D>c|Y8~Uc*{IeruxACl*}z`Q|0VJ_HK@Gl>3LG! zLLvcnKh!oXQxFgKF#pkq{dxd~rF`;^ulL;zTWgSd&AG<}e`pDam%vkf`iR!lTBM1~ zs_6~=Qg?&%Jq*fZyb-+=dcRht`lIJ;*<1Rxy-@bHn+FUntTBM&y@9c$KRgD!!497Lm>z^p^A^87SQa_jZB9PP@!pwUb;tN#t$o8=8F-e|GW8adqVI!uz3LqI zx9D;D2L707861k>pjw<4INm3)Ew#!XF?DfX2yQ~sX|XGEZyYmV@I*>VWljP*dnUnZJJO$<^hr zOQBylvEl-jWpYQvo2`f0;5213hrvbO=-$z`FoHVMdd&I0s0P1&hDi%yXL7IcSz#p7 zE8yZQSis&f*r&u&&VXHjaoO7dKQ72o)7yae!3bufdn)aaM)@cFbi%eM*lg7)fwM~C zMZ8wGN=nM7@bol4-&ccv#2@b91MO{7J)ENRExCK~q zxH0$yP|X+Te2?usDK)7(6FPAY=I+s$1Y!-#dnq!!Id)ILPN~-&2Jt!CRzUgl7M%ue zwR4XRlKu^he%>}fwr6i3gk=TPc88eZo4}Oc1bo>!d-O?l4FyUA=T#L?(%c~n`Dgwu zDg`Gj+cS(PK0Jw^Ufnl;^Q@%>NBxw;>n3EITh&!?^i{TZxWU%6sd~s1Vaay5@lU>A zcY~j7&|JtqU90=}`TKActz|rdrKrQjA_f-{ZruBj2oOUT<7oT5E@lmfPcPjR$fi5b zoV_XEIz##ITFZ-oqn*^zTCiBLHx=B(-*_{F3GpDw<^0ktDQy;k*v!e<5Xg>VDZ7kF zQ>I1-kD%p?AT9xw2Wqo7`Y#;uv(WLI8HNYPMKL5<%X`yKr%>ujE{WhU3-P0JPPWRs zek3DR{u&|X=U!ds-iw6Izs|#2kyrf?&jR!{sXt7pKXo?WX%-$VUz$Em_W#KN%lg5< zLqD2C>_TgzaWR5K2X0w#dodqYh@)id?2yjNV zUcz48Bo5OO0lOABHD_<5Y0tU-^1(wvIJ*k9PKXB%?V|O}L-n`pRG7n~QS+E<$HuVe zV=U_tLnJcC7sfRS_|5HT<e-$~%(v^;Ur<(rhM4o{)2` zvuHNr;QH~ws_(x?L7SiNq1X|@2ZvVE@C1(__M#~*WQ5!m4q~>?7TFk1jsuKqQqXx|~#|2EkRf4ue)*v``!CjW=+eRoNU)Grqx#rZ^79 z?L*znLmu1@=gNqmr=Sp?w9mLIhC-IWlm8girw?W|MH|}J*ZDdQ7%LwH=@`>kW%x(9 zWne=q40G(Xz%l>0gwLBvi|VxA#xok*fsRUV_7lbT$R!7)SuPs&{DPPa_X1Y-eT>lc zG1|}Y_39lfY%;^RR0h!=dLQ0$zTKL7+KX>D@J$)cu4BL^7xU2ej{>IZ|Idt zF`+d$2GPqC2yuA1MAfUr-G6+(g4542NCewYs`D*BaVkds*=T@CV@ZdAMd=RnQ)(dl z-VwVsDGTasUoU7<@E@&y-=zjkew>Ci-283$I<&m%@Wu;&?3m$Gd+X7b%p$eETeB)M zq8|xMIXp6&A60K$Z1rxtkbJv!XH{f(AUn(Tl?8{jy`yq>nz8Dq!Jwr)BZWtHUB53w z?b++czT#|U6AlLsmMp{6r8gvHW{7uaHcEY48Vutxldt?gc$fQJaX#&2jT1NBb5^I_ z8t*HwJiV^wtQz%MVyR-PMaf51nQbNWbc5BZrmVfP9y>RW;pf?jZh=Gdl0s|RKxQ1n z33l(t#U32IG5X#8lE+pWf;O+XBQqsV+1Rt`IfnSdKCocI8zY%v#tP*%S0Vm47uB<; zyF~LiFYrCP6>;PpVi8RpFi8gTS+iAZ3Ni8FKZJ6?O8d@=vNl|a%f?FgGa8>UX+b0) zd#-TAdj0jPRK!6jmy2P%G9gnqC9C44r`%n)-Cm_{dfJtL35WvmomoS_@f!Pji?PCXujsh+Sv0S<2K&3NQr~k}(`OUf5BrEeeeJpY zvot*ArbYrFZVQ0~GP z4Ee-J+welUaSW%Uv0!6^_TOfie;Kol<2f9eMHwHjYh*e-*0;B~)P9EDvDpc)M==&w zWWAx$A?#RnUjS*#np$x=VmN~%HZ?k$F+C(zxzu&(6SJr2qvB_t#qndI>P7tCpIuHN z4NoQSoDwCNDeU%?US&~Uy=tU-XD`ELIIAo9*VyQ&ewrg*ug*ix`k9@cI4^A?)9K8n zM9N?5u?u1?qw2P6yMN{1Mk&ih+$z_w#`me)=KgJk?{n=R&1f-l`E^VGsqpoS1^0#7 zQjN-8H*(Z*1*OEe)Zt6wB3B|Yk>?D!`MPTnHgUolhBlJCG+X^~r#SvWRS_Olk#9Oc zqmR$7l12mBu8JRCb*vU%`iB;3-6TG4z}~_UV{{FLA4PQ9Mmr{}o*j3*vT@N94 zjw-f0z;2wd8J@7g8LPsMi5xu4JQV`>uIN?wyJg1^q9i70tl+7`s+>I@?)8^r)vuO! zfqJ;eJKF=9SFtT6mK=Oj#jb0++T}5WW9B!RI{9zyt~}-Jl;W*rST_yPPP#dcE_Gc? z)UZoan)s*6HKLKxGa&(;xjB_#-OCXx%O)4hePfx$!r(` z%hZXI5%01Q@2vHn={4wtVVhszKmIkA^3)x7{*g$rB?Ig}`t3W|L96VWUwc34SkDoDhHb$z3j9F2- zIma98U6*tWa#wyvN#G54ScLFK=$5dkf{S+eKD|1<(3O^wqTp=!i&l-_#J)6O3a#yG z6h|<-w)*YEEhRZ89%Dd8bd>uMSJKOb65E0`^H-4s4$!fqg}&o8J;!Tr#XEnBp60v| zShmKo7^<$mekVJSN%I1Y{7j_B<(2IIa-Vuaj4gD{yF1hxaoRLY_tAZzwY=LCRF2rg z_0a;Mu>zquD7)i1c)#veDDV@>cW(5YEhfV_FT}u_n4bvqI&@&B%bcI(raE?f>}X_6 zIC@f5uB2T16mL|gKIEL{h_fpdu_(R&NOT;N7%2$;EXo4a&_}mC(A@01^OA27C?J`+ zvf;*PfSi$_sGwFIQ$hq|rL1t6><88Bx%S)RwmD}Mm1XVmefdJ8ztxH>UJCE_mUb!E zJ@>%(O}9Vc8OR!y?ioH2TzLA_H|xnJ&AQB!=5}=`^jF`tnSanv%x@Q4%Ju0f@21D8 zp8lq1t|0f(hW$LAdi|clho8rSzcQQnR%6EgZLeB7b?6DchhQK&`V_^~>Ccwn$6|1Q ztFTxVZhjzqIX19N{2j!R@5bmE{1e)V#v9l#^0xUZM}1e?$AacuP6_T!P}MC%;oxOg zP9@hYPn(8psa_X`l)H6}aWF$PRF)ELR(&wTq?Dnr3KI+qm~p<^CM*2t_DA+v1=9l0N~2}RlHbPW z=(6^I4R-|}%KdFkIIS?Ty|DH-pIvfeN~-M)pohw`Juh`$YvGP8epgrQEwt7yT)+kF zdOh<9GfKRTY!6b}7Ayg)AzR?5xHh)U&% ztxyKCbWcBfv6la2J=Xl#+L3Ggb&URKtc5zKuq3bl%@wd9+3>t>vZ`*cLTidR%E} zI<|R|n}yl$M4{^Q;;@#4%=jsgDJ{fx@4gT-6)^Pn z3@O!cw@J>ApDNFDEUGMx`+Lx+&N_emg>Y2Pn!wq|m1-RvUGY=o?`u!a*)V7e0|~mv zQ_qhv=CxQv(-~xa=n@pxtRBf;Iem5_Ut;aEmETgku;Xe~aUpIiIIt|2#s);=Um?Ag zz%$V+M6+;}vp*QUR&##*yDX&NN)>L2)#i9uS}P0&@YI3W zg3-KWqs|Xd8E5uE=kuffD}Q>hu06}6dTur2bxcNEzkJW|q{cmz9qAo&3zH^ycMChs zMhjKt`mEm`|C7xHe-EU;gp`JJbaBQ;PjbfA+i}Kza1iGm3n+7)uW0ylJ*%#E6}bMS z2(prq^rf3KmVVV&a>nj-^d{Y`<#fRtNjsPJIk2Qom%2LYz4|_8sxTb**?fTxMU-mhs@GbU-z(@af4qxOJ67}Q)gP_?fmi9_rW2tvZe}h^Qwfm61>ST&p31}mBxmu zBmK^pt2Tgcvo7a{GRXw1v6})GMopf9PW|t8YnhvT+QzXZIW2nM0-~Ay=#Vhr=GnS} zG|bqN;dzu+3D!zIIjAjHpK7}Yol_&CP<5nOoEK?$)^y?Nxgpi6T5;ah7-KcBzE@sM zo#Uy+)4s>t=SBA$AnGld=j`D!e>r&`O|@jcLzcaMkwqqPTyS!C@=Td-$((ux&Gm5c zybgxwqfz#6^Igt0abE5$nI5d%AM9pO9kXcu92ag>*7h$Z+b&PrhK9#rE|@9ExVt0} z*Y94>1!a=uyJO;06YY2P+Nar<+&_b5UPEz3-zeUO6DX;+ij_Ujr}WaJQlHbcqtEf9 z51W5C^!`EWTHZamV8-%upN(s)LVCr5q3lb)xhq4VX>yqZF)bl z*H@NC{70KoS!x@7LEc>9gOGz~=4eX^wV?PWqgbbtrvZqARJcIuX+uddRb0v63vYDy zcHcvN7MoKmnGGuK-EL9wbHnP{k~@8(h!XcnD~47Mu}%q3uH>PNtB4X0TZg_2RouIe zir3tj{SDcA_(w+3g807D`z4+(nfbGH6@JsV%2z_ET#l8s_Iy0qk_p&WreBoH=8l$B zwEu1Zcx-=7uU(1q$0k3Iz72m&;n1cSl;&JBmbP7}Zr>`4chqavZI&>An-&CB_7w(# z$7Z}=;7}jrf^}}6Wal@?u=&Jj4d(;)XW}8{eb=Sr^$W%1m!WRI+p`bK^~;PDokeOV3XOs) zK?;ohfn3pTA7e>g(-zG?H`=r1X*EM@FcG4soK~a~h!WoW?qJ;K{6)7i!NgnP1MF$; zun(8+8HlH_I9X!C|22P~jUNTi@P#WpK2onCr3qVU;JgRwmbLZ_13(-^&%pO>yo zi+}Le2Atwkb*R^8*a2nj_rQJN$$fGK>(ph96`ciFC&&1{eJbE$5Pg8Xjr4mTKPM>G zsbc_7ZoW%=m9P<)jg&T$w(Yzj)Pwz6rW#tNdRjYIFker{ATvokGbyZ+>q`kS?s4wd z%t3wbaoe|R0dvm`O9hp23Nfv}vZ+W})yuIkSdV=`LB!Cuo z=>HPKq)}=|*MkI+0xl+p4sjbU02VLerk-?cc-VNeWHhsPqnpZL4FhNy)ZFX?ks)Wt znS4Fwgwpfg$ByUy4cju9TbgfWG-KprpCV58ygUOS<{M*6Vl>#`7C*@iT8t6QXnv5; z4;&xOF3X5u@!!PdosPAmu_q!u!ZPk?wVqq=3gj_Y>&k=8ukZk#0yS`6F&XDY?CKC+ zJB5F8y6Dnc-r4f8e~h|s(b4Qs96a(w=q!V>szPwgBqcq>AtyNXZ{FBj`gr?9gJRa# zA^*!c!g?4jTG^RJdDofFf(<|&N-nxVZ1k|~spHSq%io^bpMx8Pz9>F$r1QjoIHSBJ z{~<=-Nb9+9_npws<|fU$7cba25DUJ@fY|9Zl)c5@S~a;bc)>1Y3eH0x0RU(` zT9a=6A^2z6aM_)E>>_i?6%b;=R51Vkn`(Y#RUE!r@MSQH*^g18M?p+v$BGoGroD&J zz3A;7T%1^HY0zi*&OW{~u0hNw^qbIlD5-0jy+CcqIP_Z?<6{JH37$n|0OXj|RF}2p zyLxLaMs}x*Fc|sWCj-_A#GNN3MosNJ;!-ZR-A)ra?^IaIRSin1CygM4NgEm(DE>_DtIrgdz zQ`(6krh7fLW-|cHpxb2&JE616+7!BK#?G}!3SWN$ijlb<@?a>?@@{MKDF*={k10{!!SVP?&0TAemlB*%rJ32+6GQ{)R`N?Ar`-27tfbi5ORjSJ63y` z{-|PKWL-teAw`p*?7-H#x5~!X^6Wi%s!I&%G$YG#C*u&b~ux z*L@_)YjX>D4UK~gz$`DmCBtO|U`9o713nGRmWykLP-5+28$Y4iJ*VSTKbC`-a zJpYw}pUh}o@Dx1%X>ODCLUs4$Z$J(MJ9T~lO*@I)GTUF5zpWH__-G(PnZ_J*#WTNk zDER;zGlM1`B4%V|r2dG<&y!AKQA1p$&;KLGLkuO}@&Sx7lO4OM0I8 z*QK6Cr7ITfa+fYXD#%i)BTe;J={5S!0T9t?d<=?2d$m_Wa!yo(7? z4udH%mQ+V!P~B+Phz_r!^W3Uk87iNO%Q9_7AKtXDlvs1Le>&9AQrh`DcTfWu8F!(o zR#x_-r-|!~J^V~{b%vv3eJvL}IK0Qcvx%yFuv-7#7hoXzGvz)b*eqoBM7+*M0$quB z`CA*ribZ_u4$Vg1=uho`Um&mh=!+y6sS)TMK=J!2o~+`5#2bt|9nEQs2}E|#;;C_F ziC5p*<8O~dMwWpCvOwb$DEr#B4d`9+1kGmbY@~UmSnO_KWSLKBX7tM|wI9vFFro_s zOWn<$E>zRyGJuPP{pnT1nDBjR)a2<-Sql*~zF%6rZ>(P_o@LMaS{Nz%`bOm`C+5pf zQ|s8c1A!)=E?ZoZo2P#!j9%V)w1j;2v&@x#2~5?wK6B`6ak}=yxO?{9rynivI<4?O zO;-NgPkH+8_dUljXChN_=wZ1^#Cbs5G4sDm~1Q@fvIbsx;!13pt&G za>18DQ7)wiHLlMji(LzlE~R~C^qV_(W}{UWc%?VFmJ%YLIj+vtu`lHEPq23Y zR{|VtM2K4NPtZfuM^g2!r?>i<7zii2?n1TPZJ0E{)p-W0wflI9Np9&}X%PtZ*|?@a z8*4U~=D+@?$Be~S*_8VH@S_*IyWCe=nEik1o%xf~N(F;5E#w5z9cDNtBIZM2@tfajn%7lHAaR?%ZNPO zeIz^RCte`n#9W6{0%FoKO zG>DyF-my>Lq}TGUl%J8!J@Uo(IU>Uz)l2aD8~%Fx?I85J zP_=l<`@hD{CmG(4i?ZT~9o!Y?9nZc=uR8kh6=?oKOvcx-hp)b$99GRSl;T~T>|Y*Y z>QwSch~a;Psi$un+!sT^W9aE$aY57$Ncu>?L?-DOLgTZ9Z=B=LxOw5uQ0r7>?YoH5 zWw(q}ZC2rRIn~%kBd`%UM+ellYw6sB_F`B2e*0jZQ@~zhe>>0Fi+J@t9cAj|hyexS zT+rMUKm5J+iI&V~+Zpu!2CS_~jGlEHEt%yLe+m$xnd<@8_E8-fEB1Ugh|p5M(9$tE zrSnL9Us|MoxiRvC7f~Fk66u|Np@$!x(b9WqxF%~LpEK5rNN;=e^SieLjU2HO+~-VW zR>E(cI0S4#xgMnOFqOl;?P`dq&uX|g_l|nh-NU}OIY0;FAz>=LrJXU7VipP?E-k65 zr-7Zu-A)}T-jzx4pM!;92QgK^C2z8@ESRV)0StmWo)_#}yt8aR*|v9@gBZutrEGSN z&XmY5#cQIutmZ&8w@+3rJ8v(PH0xE$e|qXIus&$=S~9bo&beJdYuSw6-_8Ir&VJ?! z!+I$V{zg{$sl9dp#_=}FNJ9k&;STP|k}xYry{Bu*vb(+9G+X2SEP(i4{}13q^jy>F zb(-VT{HT_&@s?py-_=wTmO%FQ;h3nQ9k$xDdJdyfJqCW?@Q85#IV+)X_6cV5P>blt z1yk(YFAPh)6W2c3Oi&|r9(Ef`d&@8idq2BZQsQ>*e7I6B@AkkAq~WtH{u{=q!~#vN z;nM=iU)vBA$3wEqG0P;bzp3e1swv{9+I3H4(?XqDRX()bTp* z=uql-tLS(KPP#s+jADGf7e4xsCZaM6+3Je^@*VPzH?1J~9sm^oDWKwmu1zg?29EIi&93j=y2Kf2l*DWp5(Xnq{-jN8W!x^w2T?lPE(l6Hbxvs%))*MLB zHZ)dFF$Zq#2ewUonBC_huk5F4)|oM6^&5;3ROG^xQG`!kL9pKo2LWHEC!FW~X1QPl zKfATn>PC3WfeJ^=afWrB@7>g#rK83Ms}by5^5hs{Ldo?oS`nKXDA%Hdy1PfEEv45* zNTzK{m$`19FQkz&sX_s0veBR^W)+r3xw&JtPgO*}^=RV3xi6ASX?{oeBWWh@&1i+9 z#A;mUAo147X8c556TATHp(_tZ=S>x0=PpYtqQX`JQ-p(#q4Q}!%DQTHZ^*qEX^P*m z_?v(&u5HXJSg0qK;b!ZJ);ndpv$I^3qwXyjy7VJ?{Jlo{2-mNso5Ca5v+(1>wTX*C zKwdQ0t`Z#U&|8X8HWpt;?D2aOi*_$gH+j^cIv~o>qV#u!$<(}b0)ZA?jewe zs0r8<6grQ5aNq#c@6hx#o*+?wh@s}XbPNPGk@u*Ir1bU%PVAnslILc$3U;XRDkni_ zVx8dkp)$?mtqD#kZPo5T1-UlM<;9<9KQ;2UV!Phrvm%9{B1CNJlz%X@&qZmdNb*Bz zX0IMnipgd=*2F{S@)R(Cfw8PKweRV8lv==oSCKKf8eKF=BC|A+5RaNh4(Ow~fgDI1 z(ca~v_n zhJ~q~Rtgt^QuE8tat}6FFQvXfSUAmz{Ykr`J6jLe=UhAr992XeLFXo`qNZ{Bp9z~o zNWw@b(rsO9SKAB{OTo}EmT8uJSb~y2^6LnLHN*{OIeTRGt3eI5sPZY5%GwxeX{kLx z__uDE{B?%v_n)cu>zL=kH6)`?)$%5RBQ?064e0k|pMFyPO;3p1p`<@%;v&t|)BErZ zc_V}5;Dl=Vm~rHH@3{Fou^pL8xywT+ebZPpzdiv&ae7n(3B5Zcwb3~ai>414i>-ONNAtpzPVI4x)3G2dMD4)c1 zdAAR^rYK}m(OQ6#>N53W{%`UNk1oF(LZlwFpJmW5pXrcN^d9S7pQAaef;dex21P|e zULeNrMY=~&3Gq6Hp<>tX*l>E}_Eyk0wWIo)wV6v^F8W@&lJkMaFtW;{o^7&bTg|qE z^|6QimB66wS(OSb?cF99VWr~y`s&8t7~_xIWVe`Q3aJH~96Eq;2zgE@w4l8qi!C>@ zrFc&>e4-RS16f)NMk6cFe-LFJ=CxFqRyFt3i<@Y_s#H_EQ z)OZ036T`IMX#H|~g~s~zqt`BOjgB*^o#mVJ2j;(OxJ8K!b!{m)|Cyhn=llzME+Z7-^_&5i+_IYIwqzPQ-Rc{ID99{y9Ds$VjyncZKgFR zO$P%{Js{k7n{;tGk~Xkks5{Oi&gIrO)sgFUdEiBNntaq6u}Qn;aFtGH78L~G})>k)G9UbRSSvlO*-Y(>vY6j zoaQ8$B6(jp@fMLC`jil&I%grn<}IntR43IlakyORk+%k$MHop35O1%gC`Hq5a=JC8 zNp71xMEr|HO~X$RrG*GF+G9nGN~FH0C78(IGAMaK8zP2 zm^WXgD5v85ek`Z|+#a?+3@Q)C$?vRRKR5_ik~cy5AJ<}&_YZRAkG#^Qt%7i{ z26Q!QieN(xe4T1KNM#czksDQ;EY<7L3i9K$(`Yb24>$PO5Uu`OCAwOEycU%HokI#q zfmxQ;H8<T@oTVI+)7k>-?(`UDV%Sl#rV_Q-j8aN>t3p>-<&w3yX>Vw>*)$Q1 zM@>x56iv9!VygmO?ejMWK@}6oVmHn7c&m}$t0`lkiOXjM4B`R-Hao33HIlUzpgjWw zH$ONRpMrd9-A!F?#9aqwb(}eC5ynAa-GUOeE!<#vE@0Yg2}fR(9XXj}+s|q6S(VsG znsb6edQvr70UB1EG1|2$ zdR?Jt3|32ho<=W&r&M#1V)C)NXdujzg$*d2XFV`g?f^DZFZH=2uxMPq@n}E1)I$+9 z8Ytr{70B2FoaYI)6>kr|dU ztATBYH42tKrRZvwAeo8#5iF9X&924`$YmrVj9bv9}Gzs}1q^2`95#AFiH`cEc zV|Fbbu2GV#(#dDrNHqfKWX~;AwAaxa@^}U=&N&D^*+sfB9|R8{pdBquk^O_p=Omlc;H$M%=<*`vOY$GCn?FdJGy7CbXkeS!$aCoa%Ujim*F^i`+sjYGV zQvR0EKHB?{hPGCcmVA@Ylo=^-5L!f_Jk&Wz8zCb#&^=VW6P!(`HtNf>NP_YEDQT-+ zj6^q4=+~%nlhj(OvPWGaY%Fdy%g)0hqnKvgEVpyL2;zoen>bX`NcOOE_Lz19q?0AI z%qwKAr(PpqenlvQJmNO|gYiKoU79sTO;gw}%s8m96ufJ!n= zQXEq(_$uVntf{g%Z>(+-jzN*Kb-zyN_Il8R^r;@{b&Is;l(_w0#F$~C*s-@ux&L>O zN~GUcIw|N%Mqav5JB22-mL^h3JLD83@Qr&H{ilLXXX4Qz_H3a}#E21q(QMssuw?s8 zc~;&?K2QT5!e0tIh`eP&3V*f&eOTbZuescC;t`>KKASRdXD2Os7|=SuXQ?)fl&mzw zJ|=y#TBl`=fZzWnX?*o>dap(DD)7hptU_^xUXX87Ea)NRyS!;|tA%rVrM-DRl^%s` zG+hNY^Kd1Ja4L5(kkO;4V+i@LIms}7`7qKo25HAn=>5(O9vVcR!z6)|@}YM6;fnwN zDv5YCf}utiUy{OVg_icjsA$c zs|}9Eq%Qj*azEpr+*c!D_x|vohTsdc)r7j8AnlCqn)BcvVx<$o0Eu1pHR2mRb~6^nwMK1f|xbLVYtkpgDLoHvV4`x}i=q>%(Z5IpxgKbYn44tm+iEx`W!3>Sv=HQ6 zHi>mgKyFq{4ph4%UPeyw6#l_FsOpWnF~w5NQ3o7m`-nSS-SmIAZJ_?BqJ^OQRZD)I zsgvksI{&@&L}Q{&&ozQr%R*W-M-7Yn{IvZ7;-7H`J7-ewO|NQnHO!y(X7z77h#M6A z;-niN2t2+|;CC;Luw(xC7*0#l_3yOXyC7z8`JVp*_~U^2sdsk3;qap>Ym-|zJZ9Bgc0^7V^G@+}B=yA>Y!_~&` z-+)sp`r=_z-Vi__&8Com@ge! zaU=c08q)wZ$W5|wTJvX3|9)WZB4sG#578V{H2bq&X<|v}X{wqXlF-@#{HaLvj^B^x zl)OVf>mOiw7*=*U4+0U*5O2D-5nB!*@4#joGXlX28PL^5-%=_3z~7?NrV0N3sM;Oa zjEd!V5C*_G2_~TH9S-y#4ULQgZD2#qst^h4cSr3UZ+p9pxUc_xQG<1b z<@RNJLi$G=!asp0t7QXfpId0RFMK_PxaNs+3zwRbq(FTy2P}JcYRdckL|umYATP|j zhaU(vhvz2J_*Ei$dQM_rnK`!{3j{2=u^tKGdu*KxHw1ja50J1l%uQ&~DM^MQo#FgG zF20vx+p#1g=sz9+RcL3HUz5Ft;Ug!d6DQ16&RM$pKUw@Q+>@h(@ZlO!E<&WO{$7@A zD(4_mlUj3Hdx{eBtGTAUtPPU|Ag85E)zWqQXC{FK8Z?a8VuQdF(&smNE+K;FToaSM zRL&i_)~UxrDl^xjHD zL+oG;q_jk9OMDRjPCKZ}@vU&u&f;sqC|mM5f+J+=K=N1IMt{T3 z!W$uc7LwLhTLWMJQ+&U7tG^+@%Dk8644C+3xxi-+#lHvPzPJ1ds4@3o`&ZmdZkI1D zF|WPu%T^|V&o&Gfnx}=+{VJsp$2uO@+f=?x@lUhmBK;%1oTVJt%mrHwWr4a_NvGL< z+Gw!YYg>8sY4gV~-zT=gLc>SCMI+N~U*V0Zjx4{*8EnT-N*``65z#`!yD-IdDdvjK zpnVId6R{^;BQVgDrmY@GO{s($4<EhQgm_f-7@1y)p=+o@S46g3W!UfJwl4|E@o z(^&8N%%5JDoV7O9c*_Mc)yoN;g4HIY>&IKQ=_Qt*JGOzYiN6ow7to7YA!6` z+wk;y4vUcRI3VDYXLkc0xun+}`W5VMJa9=jsw#Tkz>aXS9FT;gO;R$JWa}#|0}=

d?2g<5L=nMvcZ?HS*&!xEgxXToMwdW zWL>2yJn=i=DsLI|Mjj-3lZWt|VQO|BIgN9l zQp%_+8+%M-SC`#?*ESryccXRA&%oD`E&xdxVA;kWiN>PYzU= zcXy}8X2Y}ygmb~}?}bDr{*Q_aWoZ;~C6G8eF{0I20bjQJ+t1f;1{$R+d1RditBr$i zDl7}7;FS$fuU1brWd{Lyz+-==6R*2B^mOm3{zh9ZyisZL=;z3hucr&ixV*uxe>Y8I z;-vHhggOpMpI_?{Ql#zok;ByJWhbR+?!3;HjTN{=g!}G-?0O@tjZLrHK_F9|1ZNhh^SsII^Z`krES385B$uZKWN&v_lyg~9(Y*wrsA2q1A{g>knnq8YMh}vsu+_3w z0s(G9iaoeXrV|MFN;DCwB3W7Vyb8=?@5A@ui3wF2Cevm1g=iGV(W5bwpf@XBpBDfS z@rCX0rYa7KeFQw1}%&zcIRCls)%Q|7(4gc!X0&{2rgRKED zh3uj;1BM~X$cA}_O9p%Aau{qADB>pgEaiivYXQy6&?tkw!a!GE=hL0|mAQU%h~`)i zgepohew5ZF0zM&@?*=~Z204Z=|~~?wC-Z(MAyNdfDl}_htLTYkIta2xzlzQ5dTDqzaRBq zXahobdWTkiD*e^`LQiNtZ+H)0`YkVnvz4c08>YDY>J#tun+3}!g5_Z>E-oM9=2|Bp zm$g|Io}r!NN(0-+0x<8_<9x_=0?U~x+j_c{Bq6la3l{krZ5K)$e|J}_Q}J(gMZbV0 zs+gsp8a8;qlG@#iWuM=T7*bcPQCv?-M(BHhWl_;Ral)s4nkdvTg^RF-qB*kZc})v`iGNY|#N(PC zX@Mfms9TB(AD3y)pa|OV0j!Y$#0xk!%~hYCWtIq=jYQF9ov2%TtE=bJjY8(OHaEX2 zz=B3$_0RQvH8VHt^#fG4XXnVdd)0+nzWyTL!P08NcJ$WB?C8M_l@Ru{=Exr9;f?bK zzGuV$%buyt&3fw?JgLuW@3WA~-|YMrk@(Yg=W#8so3_{ky{>btm!-i4IDkF$*QZ8X z9L+77ezb>mMJ&dpC z_OzwxLP+atLY5V9VpZK%wC+jTwe|}~|G8d&^MN?7bRTJ7GJY&}aQlT@wc_v=N;qgv zo&zP$)5G#*WiDNVI=_ziu2FGpxc7S!DW&oMI=cFpwyG#T$HpXxb#==YzUm(jpAk14 zb2AQTl>}+0qjBp-Dqyn_gjJ!yrfuO-ChLZqZgmvHhpf*!gvdgM2o5NeK!t8YDCm$- zT3G1^g|6)@6kcCHs27rR?!D*U^T#>&-jn+~$w@AecbfP|7joM0!f)6WmcaQdozvLL zc|A@|QGr!&Ud^87Van}r5 z<(U_lsacaL+ghXSRpYrVW~u@J!JG!#HlvF4tk5kqc@K@DhNYY>Cwp0RQF|+w3Cg)_ z4Fo_~dUd5Pa!N$*bBX}kefVJ)3e1zp+ETXFw}bW`u4krFc9xMN^M&NHwhai$n>gR? z?`fEkVrRPB4~59YEo|9eL|pJ~_pB8*sJU~nvz@U98>INEVc?yMn-F3ga3|HkhA5uH zvJQ1!4M-=Qbl`DR076y|)21x&29QiH2+?PYEF+9gSPuA3|4swM7BxZTWM#YsI5*56 z*%BI$3CYSYGbs9HSiAh{7oN`d5Qhbtm1239Jl3tjB!3ANqr$Wm{4Db-?DQ?e+03eH zJm8`GM3Ettxb z0`Et~8a;^eKu<%`b+Z{%mkpDeJ=4J0ob;mTVD;*$62U9r)MJ&2qWOW|ZVg&f(btIb87UP&moD0_Tg1L@w8fK}7kE0PU(~LOCHtZmN7qkhKva#xUZh~QL z_h2Os`B{ZTLLs44^i2OJpyxgb*4I&X*9DIxa7?w5@7zBMy&SC@kTjYU`mvYC@}NT) zN4rHgj`?{kjK``>?(-R2)b`BkfJ>qXtaK#sZu-2ur)G%D36_+PU5TBybyq&r*=gZH zL1&=pPZDZ!yEvcHR=KpdR@NyHlI>~f84Jphq*)~^sZJ9r(Uhr;5v>I2k&9T2{>%g( X511Id5R4~n?)amZT`+m)%#Qy7ZDvp; literal 0 HcmV?d00001 diff --git a/.config/pavucontrol.ini b/.config/pavucontrol.ini new file mode 100644 index 00000000..3289431c --- /dev/null +++ b/.config/pavucontrol.ini @@ -0,0 +1,8 @@ +[window] +width=1366 +height=729 +sinkInputType=1 +sourceOutputType=1 +sinkType=0 +sourceType=1 +showVolumeMeters=1 diff --git a/.config/pulse/a259030563e046f78cd7b2596e4b0ed4-card-database.tdb b/.config/pulse/a259030563e046f78cd7b2596e4b0ed4-card-database.tdb new file mode 100644 index 0000000000000000000000000000000000000000..7359e1303d239fee4a5c8d57cfbe529540e6dcf6 GIT binary patch literal 24576 zcmeI)KTE?v7{~EzQ3pYA5!9)ZTS{s>NXOzR!NEz95|gV9O_PwM;Ns-qYjE;y_!1ml z9K>CG1Bx!iC$vISnxI3s?~%)&`#rhKeO^FL4m-7;=j(N~xD9tIdpC2@#{KnY?R(sw z8(!+;Lv^Xsmrnk8UK*?IZh20+9D%RX{Jg!l@k@S$Cj<~c009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**{x7h3HhJfuqSUV3 zzDln?w?FRW-|e=a*j>kt-FoDBhAFKpN8_Syc2-h#B$aEa9oT+&X?Q_2O68pDSO$!t z=csrxu~JsP$PJxAX+dAxZlcqInsAh6OZi@)<#xd;(}E<@_CUwQ1=%uDKMZs-Q)5|$ z`>}raQ+hoX$E-a`&pdCXSGTTO#hzv}^RzO~)wJ&pJ!859bLP8pL8B0a`a21OYNnrVw+mscwc^pdPIN-5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5P|?-~RqRWp#H6MUWu;^wE9WFl&WCe)CKC~YSvJao!HAHG2(gRK zsN?)b5ZZ&F4WQkZUOcbDKA5)5VSFgvpe`1v0SCl-u&a6-Hjry1X&w!e7 z#-NXaYu*itam_wx9j|E57R@=Bi-Iv721RBU`mc0UT2n$%)LNj$!5&Hov<(zvTOV9l ztH!=9On8d1sPWI32JHYSvitGmrQc>Nkx>&vQclsefRdE_L69N%bzTny1BqNBBj50= znwS^mFz*?2{b?~Vtcsc+Dk377m?v~5Oz0+N?!DMd^WGS=$PQz9_<3f^WNt(v>ss}p z6ek<8C}}w-s#Yj$^(F)L4h1}0@`zu?p~X)b_k&J-ksIrX3*2j*k}EW@S}wPEHw`WB zj{~614Ig&YlN+1kVtS+;#8M_9yP;g(L2gSYg>gu5G8^9F9(C$I#A>co z#>T)O3fAfwP^{Hx?Bm-l`S+;SQmrarzYi31T3B9)njGssA5}$6jEH$FozB-Gc(P=Y dUt--hgW`JU*ZT@)9IkxgVmx0Nu2o{){suT~8i)V@ literal 0 HcmV?d00001 diff --git a/.config/pulse/a259030563e046f78cd7b2596e4b0ed4-stream-volumes.tdb b/.config/pulse/a259030563e046f78cd7b2596e4b0ed4-stream-volumes.tdb new file mode 100644 index 0000000000000000000000000000000000000000..27be028cab5d057eae7b17cc4d1932276ddb814c GIT binary patch literal 12288 zcmeI2ziSjh6vro9X&_)Bij5uyLNxBWfgpPRzzb1>hA5aKpptBM=gz_1oz4EZB%nc5 zFomU!KOl|RYAK?Hg{06wAVLJI6e3zh5hU@wz1$`DWAF0A6v7*Lnau9(`|H$U^JZ3iID4Af?pC~NnZETi^?Na0@pwy@wzj42%bY(uT(&G*%pNLRZuw&Fz{Wy! zsfF+64i@G=u>SZD7=CGIY;aXh-#U`>vzB8g|6=9M?G13<(YEqE{+FF!{8avgRz!dZ z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CJ0aKN4tPz8^LW$)5mg0h{f8e(Dk2X$)lKn_QJq=tZGAGNBrtXA9E^g>+S6rA_H* zIT2ouMzpap$I-mV4mi(dxfurCiteyH({;UH?+2fiV|@964Ra3|#yvj${e2u)xHnYc zu0N<2z?bod4dY|@d-w;22X+o@H`t4lKPER@ds!Ntj?$#$71jjK!D<1Sf>$_(!SFiZ zKCs8ZyP5hdT*Kk%(J162z8njk$YaNya)I??Y^?&9m3wXV-Ky9&N=U_aRlhQ42p9(_|cXP)P7 zn3ygb03WXu7W+nR&?jnx_gU-qsWoX+Ne7(62*Gr?=Zvh5fW?d+e7;a!$Lhwo@qoDh zr&PvzVa7gy@vslXH754N#6D0})G+wN(FX=$V*hWqEp*n@ysD&Ht)?mjvoHV*+yi*| z9cvi++VQku3}`FT&uMY%%0!lsnrGxAQ@SB+>EwL@?qi*BF79RQACnWU+t;AeS>f}n T9Pd_&y@7qu8Ca=JV;z41wy@(f literal 0 HcmV?d00001 diff --git a/.config/pulse/cookie b/.config/pulse/cookie new file mode 100644 index 0000000000000000000000000000000000000000..77c9957fb9c14b90310f7147d84ff48829414f92 GIT binary patch literal 256 zcmV+b0ssDGtx{pG!ty7-V)@lhY8kWfP%s+|UIs^VakH5tzV-m9bKX$R%U;^v)Jj>c*#BCHr!OK5>c=O)iM*&rC1h`&@qy-w zC{KS$ct}mkcE^fzUG@cp4S$7-Ixo4-jrP54yKUE?4VPPu^8=4T{%v_S@-Yc_J}&-F zv7>+_%woo}A5MP!O5MXSCYNpQ%EZTndzyTEsVwTq&m6-**Mot4e>?_$ErK)rr}$1r G)_}vJ&4Jhe literal 0 HcmV?d00001 diff --git a/.config/qutebrowser/autoconfig.yml b/.config/qutebrowser/autoconfig.yml new file mode 100644 index 00000000..107d5ecc --- /dev/null +++ b/.config/qutebrowser/autoconfig.yml @@ -0,0 +1,14 @@ +# If a config.py file exists, this file is ignored unless it's explicitly loaded +# via config.load_autoconfig(). For more information, see: +# https://github.com/qutebrowser/qutebrowser/blob/master/doc/help/configuring.asciidoc#loading-autoconfigyml +# DO NOT edit this file by hand, qutebrowser will overwrite it. +# Instead, create a config.py - see :help for details. + +config_version: 2 +settings: + auto_save.session: + global: true + content.media.audio_capture: + https://zencastr.com: true + content.notifications: + https://web.telegram.org: true diff --git a/.config/qutebrowser/bookmarks/urls b/.config/qutebrowser/bookmarks/urls new file mode 100644 index 00000000..2a66c151 --- /dev/null +++ b/.config/qutebrowser/bookmarks/urls @@ -0,0 +1 @@ +https://web.whatsapp.com/ (3) WhatsApp diff --git a/.config/qutebrowser/qsettings/QtProject.conf b/.config/qutebrowser/qsettings/QtProject.conf new file mode 100644 index 00000000..4260331c --- /dev/null +++ b/.config/qutebrowser/qsettings/QtProject.conf @@ -0,0 +1,8 @@ +[FileDialog] +history=file:///home/josuer08/Downloads, "file:///home/josuer08/Downloads/04 Facebook, Telegram, Signal y otras hierbas_data", file:///home/josuer08/Documents/work/zabbix-systemd-service-monitoring, file:///home/josuer08/Documents/work, file:///home/josuer08/Pictures +lastVisited=file:///home/josuer08/Pictures +qtVersion=5.15.2 +shortcuts=file:, file:///home/josuer08 +sidebarWidth=83 +treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1\xb5\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\0\xe1\0\0\0\x1\0\0\0\0\0\0\0\x39\0\0\0\x1\0\0\0\0\0\0\0\x39\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff) +viewMode=Detail diff --git a/.config/qutebrowser/quickmarks b/.config/qutebrowser/quickmarks new file mode 100644 index 00000000..e69de29b diff --git a/.config/systemd/user/default.target.wants/pipewire-pulse.service b/.config/systemd/user/default.target.wants/pipewire-pulse.service new file mode 120000 index 00000000..f631f695 --- /dev/null +++ b/.config/systemd/user/default.target.wants/pipewire-pulse.service @@ -0,0 +1 @@ +/usr/lib/systemd/user/pipewire-pulse.service \ No newline at end of file diff --git a/.config/systemd/user/default.target.wants/pipewire.service b/.config/systemd/user/default.target.wants/pipewire.service new file mode 120000 index 00000000..47f171d3 --- /dev/null +++ b/.config/systemd/user/default.target.wants/pipewire.service @@ -0,0 +1 @@ +/usr/lib/systemd/user/pipewire.service \ No newline at end of file diff --git a/.config/systemd/user/sockets.target.wants/pipewire-pulse.socket b/.config/systemd/user/sockets.target.wants/pipewire-pulse.socket new file mode 120000 index 00000000..45f62094 --- /dev/null +++ b/.config/systemd/user/sockets.target.wants/pipewire-pulse.socket @@ -0,0 +1 @@ +/usr/lib/systemd/user/pipewire-pulse.socket \ No newline at end of file diff --git a/.config/systemd/user/sockets.target.wants/pipewire.socket b/.config/systemd/user/sockets.target.wants/pipewire.socket new file mode 120000 index 00000000..d871d812 --- /dev/null +++ b/.config/systemd/user/sockets.target.wants/pipewire.socket @@ -0,0 +1 @@ +/usr/lib/systemd/user/pipewire.socket \ No newline at end of file diff --git a/.local/bin/buttermanager b/.local/bin/buttermanager new file mode 100755 index 00000000..90de0d8f --- /dev/null +++ b/.local/bin/buttermanager @@ -0,0 +1,3 @@ +#!/bin/bash +cd /opt/buttermanager/buttermanager; +/opt/buttermanager/env/bin/python3 /opt/buttermanager/buttermanager/buttermanager.py; diff --git a/.local/bin/donut b/.local/bin/donut new file mode 100755 index 0000000000000000000000000000000000000000..b67d0f7c545742bab27e662a2482d39386a18134 GIT binary patch literal 16832 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 FzX0ZajHmzr literal 0 HcmV?d00001 diff --git a/.local/bin/donut.c b/.local/bin/donut.c new file mode 100644 index 00000000..0cfcce41 --- /dev/null +++ b/.local/bin/donut.c @@ -0,0 +1,21 @@ + k;double sin() + ,cos();main(){float A= + 0,B=0,i,j,z[1760];char b[ + 1760];printf("\x1b[2J");for(;; + ){memset(b,32,1760);memset(z,0,7040) + ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28 + >i;i+=0.02){float c=sin(i),d=cos(j),e= + sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c* + h*e+f*g+5),l=cos (i),m=cos(B),n=s\ +in(B),t=c*h*g-f* e;int x=40+30*D* +(l*h*m-t*n),y= 12+15*D*(l*h*n ++t*m),o=x+80*y, N=8*((f*e-c*d*g + )*m-c*d*e-f*g-l *d*n);if(22>y&& + y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]= + ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/ + printf("\x1b[H");for(k=0;1761>k;k++) + putchar(k%80?b[k]:10);A+=0.04;B+= + 0.02;}}/*****####*******!!=;:~ + ~::==!!!**********!!!==::- + .,~~;;;========;;;:~-. + ..,--------,*/ diff --git a/.local/bin/onside b/.local/bin/onside new file mode 100755 index 00000000..3cfdbc0d --- /dev/null +++ b/.local/bin/onside @@ -0,0 +1,2 @@ +#!/bin/sh +xrandr --output eDP-1 --primary --mode 1366x768 --pos 1920x947 --rotate normal --output HDMI-1 --mode 1920x1080 --pos 0x0 --rotate normal --output DP-1 --off --output HDMI-2 --off diff --git a/.local/include/python2.7/greenlet/greenlet.h b/.local/include/python2.7/greenlet/greenlet.h new file mode 100644 index 00000000..d68160b5 --- /dev/null +++ b/.local/include/python2.7/greenlet/greenlet.h @@ -0,0 +1,168 @@ +/* vim:set noet ts=8 sw=8 : */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define GREENLET_VERSION "0.4.17" + +#if PY_VERSION_HEX >= 0x030700A3 +# define GREENLET_USE_EXC_INFO +#endif + +#ifndef GREENLET_USE_CONTEXT_VARS +#ifdef Py_CONTEXT_H +#define GREENLET_USE_CONTEXT_VARS 1 +#else +#define GREENLET_USE_CONTEXT_VARS 0 +#endif +#endif + +typedef struct _greenlet { + PyObject_HEAD + char* stack_start; + char* stack_stop; + char* stack_copy; + intptr_t stack_saved; + struct _greenlet* stack_prev; + struct _greenlet* parent; + PyObject* run_info; + struct _frame* top_frame; + int recursion_depth; + PyObject* weakreflist; +#ifdef GREENLET_USE_EXC_INFO + _PyErr_StackItem* exc_info; + _PyErr_StackItem exc_state; +#else + PyObject* exc_type; + PyObject* exc_value; + PyObject* exc_traceback; +#endif + PyObject* dict; +#if GREENLET_USE_CONTEXT_VARS + PyObject* context; +#endif +} PyGreenlet; + +#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) +#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1) +#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) +#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) +#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) + +#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3 +#define GREENLET_USE_PYCAPSULE +#endif + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 8 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void **_PyGreenlet_API = NULL; + +#define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM]) + +#define PyExc_GreenletError \ + ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM]) + +#define PyExc_GreenletExit \ + ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +#define PyGreenlet_New \ + (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +#define PyGreenlet_GetCurrent \ + (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +#define PyGreenlet_Throw \ + (* (PyObject * (*) \ + (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +#define PyGreenlet_Switch \ + (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +#define PyGreenlet_SetParent \ + (* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* Macro that imports greenlet and initializes C API */ +#ifdef GREENLET_USE_PYCAPSULE +#define PyGreenlet_Import() \ +{ \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ +} +#else +#define PyGreenlet_Import() \ +{ \ + PyObject *module = PyImport_ImportModule("greenlet"); \ + if (module != NULL) { \ + PyObject *c_api_object = PyObject_GetAttrString( \ + module, "_C_API"); \ + if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \ + _PyGreenlet_API = \ + (void **) PyCObject_AsVoidPtr(c_api_object); \ + Py_DECREF(c_api_object); \ + } \ + Py_DECREF(module); \ + } \ +} +#endif + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/.local/include/python3.9/greenlet/greenlet.h b/.local/include/python3.9/greenlet/greenlet.h new file mode 100644 index 00000000..d68160b5 --- /dev/null +++ b/.local/include/python3.9/greenlet/greenlet.h @@ -0,0 +1,168 @@ +/* vim:set noet ts=8 sw=8 : */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define GREENLET_VERSION "0.4.17" + +#if PY_VERSION_HEX >= 0x030700A3 +# define GREENLET_USE_EXC_INFO +#endif + +#ifndef GREENLET_USE_CONTEXT_VARS +#ifdef Py_CONTEXT_H +#define GREENLET_USE_CONTEXT_VARS 1 +#else +#define GREENLET_USE_CONTEXT_VARS 0 +#endif +#endif + +typedef struct _greenlet { + PyObject_HEAD + char* stack_start; + char* stack_stop; + char* stack_copy; + intptr_t stack_saved; + struct _greenlet* stack_prev; + struct _greenlet* parent; + PyObject* run_info; + struct _frame* top_frame; + int recursion_depth; + PyObject* weakreflist; +#ifdef GREENLET_USE_EXC_INFO + _PyErr_StackItem* exc_info; + _PyErr_StackItem exc_state; +#else + PyObject* exc_type; + PyObject* exc_value; + PyObject* exc_traceback; +#endif + PyObject* dict; +#if GREENLET_USE_CONTEXT_VARS + PyObject* context; +#endif +} PyGreenlet; + +#define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type) +#define PyGreenlet_MAIN(op) (((PyGreenlet*)(op))->stack_stop == (char*) -1) +#define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL) +#define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL) +#define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent) + +#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 1) || PY_MAJOR_VERSION > 3 +#define GREENLET_USE_PYCAPSULE +#endif + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 8 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void **_PyGreenlet_API = NULL; + +#define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM]) + +#define PyExc_GreenletError \ + ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM]) + +#define PyExc_GreenletExit \ + ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +#define PyGreenlet_New \ + (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +#define PyGreenlet_GetCurrent \ + (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +#define PyGreenlet_Throw \ + (* (PyObject * (*) \ + (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +#define PyGreenlet_Switch \ + (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +#define PyGreenlet_SetParent \ + (* (int (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* Macro that imports greenlet and initializes C API */ +#ifdef GREENLET_USE_PYCAPSULE +#define PyGreenlet_Import() \ +{ \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ +} +#else +#define PyGreenlet_Import() \ +{ \ + PyObject *module = PyImport_ImportModule("greenlet"); \ + if (module != NULL) { \ + PyObject *c_api_object = PyObject_GetAttrString( \ + module, "_C_API"); \ + if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \ + _PyGreenlet_API = \ + (void **) PyCObject_AsVoidPtr(c_api_object); \ + Py_DECREF(c_api_object); \ + } \ + Py_DECREF(module); \ + } \ +} +#endif + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/.local/lib/python2.7/site-packages/concurrent/__init__.py b/.local/lib/python2.7/site-packages/concurrent/__init__.py new file mode 100644 index 00000000..b36383a6 --- /dev/null +++ b/.local/lib/python2.7/site-packages/concurrent/__init__.py @@ -0,0 +1,3 @@ +from pkgutil import extend_path + +__path__ = extend_path(__path__, __name__) diff --git a/.local/lib/python2.7/site-packages/concurrent/__init__.pyc b/.local/lib/python2.7/site-packages/concurrent/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..270c67a57001602e108c0fe85898d45f03cd94e4 GIT binary patch literal 261 zcmYL@y-ou$41k>+5>-(p-l5AaT&gZ*s1PGl2iUq;Y0m1U%_XOcPlB0|=itS71s(t# zR0+%e{4cxuUd%r}ztF)&D)EnEc`0Z`6$F4@!CrwP1*Cy0c-OGk&}w+8%Yy$Asg*>0 zBcNBN*y3Qh+tpX4dMy~v$BBJ-mJoO*z`qH^OA>8Qh;?cIBR@%My3~_7r99ENx;ITo z&IS|w!3=NQrMPZ3CVQs4!Md|OQZ_C{H;p4jHi$lYMr>rZT;2AmodP|SZ?hKM>R+r? BK864Q literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/__init__.py b/.local/lib/python2.7/site-packages/concurrent/futures/__init__.py new file mode 100644 index 00000000..428b14bd --- /dev/null +++ b/.local/lib/python2.7/site-packages/concurrent/futures/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2009 Brian Quinlan. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Execute computations asynchronously using threads or processes.""" + +__author__ = 'Brian Quinlan (brian@sweetapp.com)' + +from concurrent.futures._base import (FIRST_COMPLETED, + FIRST_EXCEPTION, + ALL_COMPLETED, + CancelledError, + TimeoutError, + Future, + Executor, + wait, + as_completed) +from concurrent.futures.thread import ThreadPoolExecutor + +try: + from concurrent.futures.process import ProcessPoolExecutor +except ImportError: + # some platforms don't have multiprocessing + pass diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/__init__.pyc b/.local/lib/python2.7/site-packages/concurrent/futures/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..793f1ce566e518e553e5b62c2d12529c6a1edb2f GIT binary patch literal 819 zcmZuv%Wl&^6uov5=h3EVp$lMTu`&y6#0C}!0wG9|LL1yjRI{-r_RyHl!8pCKn5TVfEf68%K@5Qm!P}fRlpWwl zAVxq&;C+@S&}PSQJplb3JkOIJTowUbL|xa>8-(dMme-brxe`@vsV$W>AvGJBueFk@ zHhdG-rj%EqU28@Q6Dl26TII|bW@7UgIo|1#%J5TNN{)N9a^~3FFlK30#mM}m{EI8< zW3C+`e3+#d%WQJ~aWS7Rr|L7Q<-j$W zy7!Vg8L6XAoeKL9;SQ$ljik+3AKjg@yQ$Q*W)Bc%qQY@B!-~*^TQCbWleH2o`KnCK z^s|>q%vDZ#!pl`sZBUkc9=}LTY1z|?=GXL!ndG*wWT!C6vQm~d%VMl?{l5~bs5yJ> U^ci=Hfgkwe{;}WkPQ9W34;_Ee761SM literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/_base.py b/.local/lib/python2.7/site-packages/concurrent/futures/_base.py new file mode 100644 index 00000000..510ffa53 --- /dev/null +++ b/.local/lib/python2.7/site-packages/concurrent/futures/_base.py @@ -0,0 +1,667 @@ +# Copyright 2009 Brian Quinlan. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +import collections +import logging +import threading +import itertools +import time +import types + +__author__ = 'Brian Quinlan (brian@sweetapp.com)' + +FIRST_COMPLETED = 'FIRST_COMPLETED' +FIRST_EXCEPTION = 'FIRST_EXCEPTION' +ALL_COMPLETED = 'ALL_COMPLETED' +_AS_COMPLETED = '_AS_COMPLETED' + +# Possible future states (for internal use by the futures package). +PENDING = 'PENDING' +RUNNING = 'RUNNING' +# The future was cancelled by the user... +CANCELLED = 'CANCELLED' +# ...and _Waiter.add_cancelled() was called by a worker. +CANCELLED_AND_NOTIFIED = 'CANCELLED_AND_NOTIFIED' +FINISHED = 'FINISHED' + +_FUTURE_STATES = [ + PENDING, + RUNNING, + CANCELLED, + CANCELLED_AND_NOTIFIED, + FINISHED +] + +_STATE_TO_DESCRIPTION_MAP = { + PENDING: "pending", + RUNNING: "running", + CANCELLED: "cancelled", + CANCELLED_AND_NOTIFIED: "cancelled", + FINISHED: "finished" +} + +# Logger for internal use by the futures package. +LOGGER = logging.getLogger("concurrent.futures") + +class Error(Exception): + """Base class for all future-related exceptions.""" + pass + +class CancelledError(Error): + """The Future was cancelled.""" + pass + +class TimeoutError(Error): + """The operation exceeded the given deadline.""" + pass + +class _Waiter(object): + """Provides the event that wait() and as_completed() block on.""" + def __init__(self): + self.event = threading.Event() + self.finished_futures = [] + + def add_result(self, future): + self.finished_futures.append(future) + + def add_exception(self, future): + self.finished_futures.append(future) + + def add_cancelled(self, future): + self.finished_futures.append(future) + +class _AsCompletedWaiter(_Waiter): + """Used by as_completed().""" + + def __init__(self): + super(_AsCompletedWaiter, self).__init__() + self.lock = threading.Lock() + + def add_result(self, future): + with self.lock: + super(_AsCompletedWaiter, self).add_result(future) + self.event.set() + + def add_exception(self, future): + with self.lock: + super(_AsCompletedWaiter, self).add_exception(future) + self.event.set() + + def add_cancelled(self, future): + with self.lock: + super(_AsCompletedWaiter, self).add_cancelled(future) + self.event.set() + +class _FirstCompletedWaiter(_Waiter): + """Used by wait(return_when=FIRST_COMPLETED).""" + + def add_result(self, future): + super(_FirstCompletedWaiter, self).add_result(future) + self.event.set() + + def add_exception(self, future): + super(_FirstCompletedWaiter, self).add_exception(future) + self.event.set() + + def add_cancelled(self, future): + super(_FirstCompletedWaiter, self).add_cancelled(future) + self.event.set() + +class _AllCompletedWaiter(_Waiter): + """Used by wait(return_when=FIRST_EXCEPTION and ALL_COMPLETED).""" + + def __init__(self, num_pending_calls, stop_on_exception): + self.num_pending_calls = num_pending_calls + self.stop_on_exception = stop_on_exception + self.lock = threading.Lock() + super(_AllCompletedWaiter, self).__init__() + + def _decrement_pending_calls(self): + with self.lock: + self.num_pending_calls -= 1 + if not self.num_pending_calls: + self.event.set() + + def add_result(self, future): + super(_AllCompletedWaiter, self).add_result(future) + self._decrement_pending_calls() + + def add_exception(self, future): + super(_AllCompletedWaiter, self).add_exception(future) + if self.stop_on_exception: + self.event.set() + else: + self._decrement_pending_calls() + + def add_cancelled(self, future): + super(_AllCompletedWaiter, self).add_cancelled(future) + self._decrement_pending_calls() + +class _AcquireFutures(object): + """A context manager that does an ordered acquire of Future conditions.""" + + def __init__(self, futures): + self.futures = sorted(futures, key=id) + + def __enter__(self): + for future in self.futures: + future._condition.acquire() + + def __exit__(self, *args): + for future in self.futures: + future._condition.release() + +def _create_and_install_waiters(fs, return_when): + if return_when == _AS_COMPLETED: + waiter = _AsCompletedWaiter() + elif return_when == FIRST_COMPLETED: + waiter = _FirstCompletedWaiter() + else: + pending_count = sum( + f._state not in [CANCELLED_AND_NOTIFIED, FINISHED] for f in fs) + + if return_when == FIRST_EXCEPTION: + waiter = _AllCompletedWaiter(pending_count, stop_on_exception=True) + elif return_when == ALL_COMPLETED: + waiter = _AllCompletedWaiter(pending_count, stop_on_exception=False) + else: + raise ValueError("Invalid return condition: %r" % return_when) + + for f in fs: + f._waiters.append(waiter) + + return waiter + + +def _yield_finished_futures(fs, waiter, ref_collect): + """ + Iterate on the list *fs*, yielding finished futures one by one in + reverse order. + Before yielding a future, *waiter* is removed from its waiters + and the future is removed from each set in the collection of sets + *ref_collect*. + + The aim of this function is to avoid keeping stale references after + the future is yielded and before the iterator resumes. + """ + while fs: + f = fs[-1] + for futures_set in ref_collect: + futures_set.remove(f) + with f._condition: + f._waiters.remove(waiter) + del f + # Careful not to keep a reference to the popped value + yield fs.pop() + + +def as_completed(fs, timeout=None): + """An iterator over the given futures that yields each as it completes. + + Args: + fs: The sequence of Futures (possibly created by different Executors) to + iterate over. + timeout: The maximum number of seconds to wait. If None, then there + is no limit on the wait time. + + Returns: + An iterator that yields the given Futures as they complete (finished or + cancelled). If any given Futures are duplicated, they will be returned + once. + + Raises: + TimeoutError: If the entire result iterator could not be generated + before the given timeout. + """ + if timeout is not None: + end_time = timeout + time.time() + + fs = set(fs) + total_futures = len(fs) + with _AcquireFutures(fs): + finished = set( + f for f in fs + if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]) + pending = fs - finished + waiter = _create_and_install_waiters(fs, _AS_COMPLETED) + finished = list(finished) + try: + for f in _yield_finished_futures(finished, waiter, + ref_collect=(fs,)): + f = [f] + yield f.pop() + + while pending: + if timeout is None: + wait_timeout = None + else: + wait_timeout = end_time - time.time() + if wait_timeout < 0: + raise TimeoutError( + '%d (of %d) futures unfinished' % ( + len(pending), total_futures)) + + waiter.event.wait(wait_timeout) + + with waiter.lock: + finished = waiter.finished_futures + waiter.finished_futures = [] + waiter.event.clear() + + # reverse to keep finishing order + finished.reverse() + for f in _yield_finished_futures(finished, waiter, + ref_collect=(fs, pending)): + f = [f] + yield f.pop() + + finally: + # Remove waiter from unfinished futures + for f in fs: + with f._condition: + f._waiters.remove(waiter) + +DoneAndNotDoneFutures = collections.namedtuple( + 'DoneAndNotDoneFutures', 'done not_done') +def wait(fs, timeout=None, return_when=ALL_COMPLETED): + """Wait for the futures in the given sequence to complete. + + Args: + fs: The sequence of Futures (possibly created by different Executors) to + wait upon. + timeout: The maximum number of seconds to wait. If None, then there + is no limit on the wait time. + return_when: Indicates when this function should return. The options + are: + + FIRST_COMPLETED - Return when any future finishes or is + cancelled. + FIRST_EXCEPTION - Return when any future finishes by raising an + exception. If no future raises an exception + then it is equivalent to ALL_COMPLETED. + ALL_COMPLETED - Return when all futures finish or are cancelled. + + Returns: + A named 2-tuple of sets. The first set, named 'done', contains the + futures that completed (is finished or cancelled) before the wait + completed. The second set, named 'not_done', contains uncompleted + futures. + """ + with _AcquireFutures(fs): + done = set(f for f in fs + if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]) + not_done = set(fs) - done + + if (return_when == FIRST_COMPLETED) and done: + return DoneAndNotDoneFutures(done, not_done) + elif (return_when == FIRST_EXCEPTION) and done: + if any(f for f in done + if not f.cancelled() and f.exception() is not None): + return DoneAndNotDoneFutures(done, not_done) + + if len(done) == len(fs): + return DoneAndNotDoneFutures(done, not_done) + + waiter = _create_and_install_waiters(fs, return_when) + + waiter.event.wait(timeout) + for f in fs: + with f._condition: + f._waiters.remove(waiter) + + done.update(waiter.finished_futures) + return DoneAndNotDoneFutures(done, set(fs) - done) + +class Future(object): + """Represents the result of an asynchronous computation.""" + + def __init__(self): + """Initializes the future. Should not be called by clients.""" + self._condition = threading.Condition() + self._state = PENDING + self._result = None + self._exception = None + self._traceback = None + self._waiters = [] + self._done_callbacks = [] + + def _invoke_callbacks(self): + for callback in self._done_callbacks: + try: + callback(self) + except Exception: + LOGGER.exception('exception calling callback for %r', self) + except BaseException: + # Explicitly let all other new-style exceptions through so + # that we can catch all old-style exceptions with a simple + # "except:" clause below. + # + # All old-style exception objects are instances of + # types.InstanceType, but "except types.InstanceType:" does + # not catch old-style exceptions for some reason. Thus, the + # only way to catch all old-style exceptions without catching + # any new-style exceptions is to filter out the new-style + # exceptions, which all derive from BaseException. + raise + except: + # Because of the BaseException clause above, this handler only + # executes for old-style exception objects. + LOGGER.exception('exception calling callback for %r', self) + + def __repr__(self): + with self._condition: + if self._state == FINISHED: + if self._exception: + return '<%s at %#x state=%s raised %s>' % ( + self.__class__.__name__, + id(self), + _STATE_TO_DESCRIPTION_MAP[self._state], + self._exception.__class__.__name__) + else: + return '<%s at %#x state=%s returned %s>' % ( + self.__class__.__name__, + id(self), + _STATE_TO_DESCRIPTION_MAP[self._state], + self._result.__class__.__name__) + return '<%s at %#x state=%s>' % ( + self.__class__.__name__, + id(self), + _STATE_TO_DESCRIPTION_MAP[self._state]) + + def cancel(self): + """Cancel the future if possible. + + Returns True if the future was cancelled, False otherwise. A future + cannot be cancelled if it is running or has already completed. + """ + with self._condition: + if self._state in [RUNNING, FINISHED]: + return False + + if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: + return True + + self._state = CANCELLED + self._condition.notify_all() + + self._invoke_callbacks() + return True + + def cancelled(self): + """Return True if the future was cancelled.""" + with self._condition: + return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED] + + def running(self): + """Return True if the future is currently executing.""" + with self._condition: + return self._state == RUNNING + + def done(self): + """Return True of the future was cancelled or finished executing.""" + with self._condition: + return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] + + def __get_result(self): + if self._exception: + if isinstance(self._exception, types.InstanceType): + # The exception is an instance of an old-style class, which + # means type(self._exception) returns types.ClassType instead + # of the exception's actual class type. + exception_type = self._exception.__class__ + else: + exception_type = type(self._exception) + raise exception_type, self._exception, self._traceback + else: + return self._result + + def add_done_callback(self, fn): + """Attaches a callable that will be called when the future finishes. + + Args: + fn: A callable that will be called with this future as its only + argument when the future completes or is cancelled. The callable + will always be called by a thread in the same process in which + it was added. If the future has already completed or been + cancelled then the callable will be called immediately. These + callables are called in the order that they were added. + """ + with self._condition: + if self._state not in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED]: + self._done_callbacks.append(fn) + return + fn(self) + + def result(self, timeout=None): + """Return the result of the call that the future represents. + + Args: + timeout: The number of seconds to wait for the result if the future + isn't done. If None, then there is no limit on the wait time. + + Returns: + The result of the call that the future represents. + + Raises: + CancelledError: If the future was cancelled. + TimeoutError: If the future didn't finish executing before the given + timeout. + Exception: If the call raised then that exception will be raised. + """ + with self._condition: + if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: + raise CancelledError() + elif self._state == FINISHED: + return self.__get_result() + + self._condition.wait(timeout) + + if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: + raise CancelledError() + elif self._state == FINISHED: + return self.__get_result() + else: + raise TimeoutError() + + def exception_info(self, timeout=None): + """Return a tuple of (exception, traceback) raised by the call that the + future represents. + + Args: + timeout: The number of seconds to wait for the exception if the + future isn't done. If None, then there is no limit on the wait + time. + + Returns: + The exception raised by the call that the future represents or None + if the call completed without raising. + + Raises: + CancelledError: If the future was cancelled. + TimeoutError: If the future didn't finish executing before the given + timeout. + """ + with self._condition: + if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: + raise CancelledError() + elif self._state == FINISHED: + return self._exception, self._traceback + + self._condition.wait(timeout) + + if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]: + raise CancelledError() + elif self._state == FINISHED: + return self._exception, self._traceback + else: + raise TimeoutError() + + def exception(self, timeout=None): + """Return the exception raised by the call that the future represents. + + Args: + timeout: The number of seconds to wait for the exception if the + future isn't done. If None, then there is no limit on the wait + time. + + Returns: + The exception raised by the call that the future represents or None + if the call completed without raising. + + Raises: + CancelledError: If the future was cancelled. + TimeoutError: If the future didn't finish executing before the given + timeout. + """ + return self.exception_info(timeout)[0] + + # The following methods should only be used by Executors and in tests. + def set_running_or_notify_cancel(self): + """Mark the future as running or process any cancel notifications. + + Should only be used by Executor implementations and unit tests. + + If the future has been cancelled (cancel() was called and returned + True) then any threads waiting on the future completing (though calls + to as_completed() or wait()) are notified and False is returned. + + If the future was not cancelled then it is put in the running state + (future calls to running() will return True) and True is returned. + + This method should be called by Executor implementations before + executing the work associated with this future. If this method returns + False then the work should not be executed. + + Returns: + False if the Future was cancelled, True otherwise. + + Raises: + RuntimeError: if this method was already called or if set_result() + or set_exception() was called. + """ + with self._condition: + if self._state == CANCELLED: + self._state = CANCELLED_AND_NOTIFIED + for waiter in self._waiters: + waiter.add_cancelled(self) + # self._condition.notify_all() is not necessary because + # self.cancel() triggers a notification. + return False + elif self._state == PENDING: + self._state = RUNNING + return True + else: + LOGGER.critical('Future %s in unexpected state: %s', + id(self), + self._state) + raise RuntimeError('Future in unexpected state') + + def set_result(self, result): + """Sets the return value of work associated with the future. + + Should only be used by Executor implementations and unit tests. + """ + with self._condition: + self._result = result + self._state = FINISHED + for waiter in self._waiters: + waiter.add_result(self) + self._condition.notify_all() + self._invoke_callbacks() + + def set_exception_info(self, exception, traceback): + """Sets the result of the future as being the given exception + and traceback. + + Should only be used by Executor implementations and unit tests. + """ + with self._condition: + self._exception = exception + self._traceback = traceback + self._state = FINISHED + for waiter in self._waiters: + waiter.add_exception(self) + self._condition.notify_all() + self._invoke_callbacks() + + def set_exception(self, exception): + """Sets the result of the future as being the given exception. + + Should only be used by Executor implementations and unit tests. + """ + self.set_exception_info(exception, None) + +class Executor(object): + """This is an abstract base class for concrete asynchronous executors.""" + + def submit(self, fn, *args, **kwargs): + """Submits a callable to be executed with the given arguments. + + Schedules the callable to be executed as fn(*args, **kwargs) and returns + a Future instance representing the execution of the callable. + + Returns: + A Future representing the given call. + """ + raise NotImplementedError() + + def map(self, fn, *iterables, **kwargs): + """Returns an iterator equivalent to map(fn, iter). + + Args: + fn: A callable that will take as many arguments as there are + passed iterables. + timeout: The maximum number of seconds to wait. If None, then there + is no limit on the wait time. + + Returns: + An iterator equivalent to: map(func, *iterables) but the calls may + be evaluated out-of-order. + + Raises: + TimeoutError: If the entire result iterator could not be generated + before the given timeout. + Exception: If fn(*args) raises for any values. + """ + timeout = kwargs.get('timeout') + if timeout is not None: + end_time = timeout + time.time() + + fs = [self.submit(fn, *args) for args in itertools.izip(*iterables)] + + # Yield must be hidden in closure so that the futures are submitted + # before the first iterator value is required. + def result_iterator(): + try: + # reverse to keep finishing order + fs.reverse() + while fs: + # Careful not to keep a reference to the popped future + if timeout is None: + yield fs.pop().result() + else: + yield fs.pop().result(end_time - time.time()) + finally: + for future in fs: + future.cancel() + return result_iterator() + + def shutdown(self, wait=True): + """Clean-up the resources associated with the Executor. + + It is safe to call this method several times. Otherwise, no other + methods can be called after this one. + + Args: + wait: If True then shutdown will not return until all running + futures have finished executing and the resources used by the + executor have been reclaimed. + """ + pass + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.shutdown(wait=True) + return False diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/_base.pyc b/.local/lib/python2.7/site-packages/concurrent/futures/_base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5ff66c97f71e252bb0c92826812b15729b778f2 GIT binary patch literal 26729 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 | Work Ids | => | | => | Call Q | => | | +| | +----------+ | | +-----------+ | | +| | | ... | | | | ... | | | +| | | 6 | | | | 5, call() | | | +| | | 7 | | | | ... | | | +| Process | | ... | | Local | +-----------+ | Process | +| Pool | +----------+ | Worker | | #1..n | +| Executor | | Thread | | | +| | +----------- + | | +-----------+ | | +| | <=> | Work Items | <=> | | <= | Result Q | <= | | +| | +------------+ | | +-----------+ | | +| | | 6: call() | | | | ... | | | +| | | future | | | | 4, result | | | +| | | ... | | | | 3, except | | | ++----------+ +------------+ +--------+ +-----------+ +---------+ + +Executor.submit() called: +- creates a uniquely numbered _WorkItem and adds it to the "Work Items" dict +- adds the id of the _WorkItem to the "Work Ids" queue + +Local worker thread: +- reads work ids from the "Work Ids" queue and looks up the corresponding + WorkItem from the "Work Items" dict: if the work item has been cancelled then + it is simply removed from the dict, otherwise it is repackaged as a + _CallItem and put in the "Call Q". New _CallItems are put in the "Call Q" + until "Call Q" is full. NOTE: the size of the "Call Q" is kept small because + calls placed in the "Call Q" can no longer be cancelled with Future.cancel(). +- reads _ResultItems from "Result Q", updates the future stored in the + "Work Items" dict and deletes the dict entry + +Process #1..n: +- reads _CallItems from "Call Q", executes the calls, and puts the resulting + _ResultItems in "Request Q" +""" + +import atexit +from concurrent.futures import _base +import Queue as queue +import multiprocessing +import threading +import weakref +import sys + +__author__ = 'Brian Quinlan (brian@sweetapp.com)' + +# Workers are created as daemon threads and processes. This is done to allow the +# interpreter to exit when there are still idle processes in a +# ProcessPoolExecutor's process pool (i.e. shutdown() was not called). However, +# allowing workers to die with the interpreter has two undesirable properties: +# - The workers would still be running during interpretor shutdown, +# meaning that they would fail in unpredictable ways. +# - The workers could be killed while evaluating a work item, which could +# be bad if the callable being evaluated has external side-effects e.g. +# writing to a file. +# +# To work around this problem, an exit handler is installed which tells the +# workers to exit when their work queues are empty and then waits until the +# threads/processes finish. + +_threads_queues = weakref.WeakKeyDictionary() +_shutdown = False + +def _python_exit(): + global _shutdown + _shutdown = True + items = list(_threads_queues.items()) if _threads_queues else () + for t, q in items: + q.put(None) + for t, q in items: + t.join(sys.maxint) + +# Controls how many more calls than processes will be queued in the call queue. +# A smaller number will mean that processes spend more time idle waiting for +# work while a larger number will make Future.cancel() succeed less frequently +# (Futures in the call queue cannot be cancelled). +EXTRA_QUEUED_CALLS = 1 + +class _WorkItem(object): + def __init__(self, future, fn, args, kwargs): + self.future = future + self.fn = fn + self.args = args + self.kwargs = kwargs + +class _ResultItem(object): + def __init__(self, work_id, exception=None, result=None): + self.work_id = work_id + self.exception = exception + self.result = result + +class _CallItem(object): + def __init__(self, work_id, fn, args, kwargs): + self.work_id = work_id + self.fn = fn + self.args = args + self.kwargs = kwargs + +def _process_worker(call_queue, result_queue): + """Evaluates calls from call_queue and places the results in result_queue. + + This worker is run in a separate process. + + Args: + call_queue: A multiprocessing.Queue of _CallItems that will be read and + evaluated by the worker. + result_queue: A multiprocessing.Queue of _ResultItems that will written + to by the worker. + shutdown: A multiprocessing.Event that will be set as a signal to the + worker that it should exit when call_queue is empty. + """ + while True: + call_item = call_queue.get(block=True) + if call_item is None: + # Wake up queue management thread + result_queue.put(None) + return + try: + r = call_item.fn(*call_item.args, **call_item.kwargs) + except: + e = sys.exc_info()[1] + result_queue.put(_ResultItem(call_item.work_id, + exception=e)) + else: + result_queue.put(_ResultItem(call_item.work_id, + result=r)) + +def _add_call_item_to_queue(pending_work_items, + work_ids, + call_queue): + """Fills call_queue with _WorkItems from pending_work_items. + + This function never blocks. + + Args: + pending_work_items: A dict mapping work ids to _WorkItems e.g. + {5: <_WorkItem...>, 6: <_WorkItem...>, ...} + work_ids: A queue.Queue of work ids e.g. Queue([5, 6, ...]). Work ids + are consumed and the corresponding _WorkItems from + pending_work_items are transformed into _CallItems and put in + call_queue. + call_queue: A multiprocessing.Queue that will be filled with _CallItems + derived from _WorkItems. + """ + while True: + if call_queue.full(): + return + try: + work_id = work_ids.get(block=False) + except queue.Empty: + return + else: + work_item = pending_work_items[work_id] + + if work_item.future.set_running_or_notify_cancel(): + call_queue.put(_CallItem(work_id, + work_item.fn, + work_item.args, + work_item.kwargs), + block=True) + else: + del pending_work_items[work_id] + continue + +def _queue_management_worker(executor_reference, + processes, + pending_work_items, + work_ids_queue, + call_queue, + result_queue): + """Manages the communication between this process and the worker processes. + + This function is run in a local thread. + + Args: + executor_reference: A weakref.ref to the ProcessPoolExecutor that owns + this thread. Used to determine if the ProcessPoolExecutor has been + garbage collected and that this function can exit. + process: A list of the multiprocessing.Process instances used as + workers. + pending_work_items: A dict mapping work ids to _WorkItems e.g. + {5: <_WorkItem...>, 6: <_WorkItem...>, ...} + work_ids_queue: A queue.Queue of work ids e.g. Queue([5, 6, ...]). + call_queue: A multiprocessing.Queue that will be filled with _CallItems + derived from _WorkItems for processing by the process workers. + result_queue: A multiprocessing.Queue of _ResultItems generated by the + process workers. + """ + nb_shutdown_processes = [0] + def shutdown_one_process(): + """Tell a worker to terminate, which will in turn wake us again""" + call_queue.put(None) + nb_shutdown_processes[0] += 1 + while True: + _add_call_item_to_queue(pending_work_items, + work_ids_queue, + call_queue) + + result_item = result_queue.get(block=True) + if result_item is not None: + work_item = pending_work_items[result_item.work_id] + del pending_work_items[result_item.work_id] + + if result_item.exception: + work_item.future.set_exception(result_item.exception) + else: + work_item.future.set_result(result_item.result) + # Delete references to object. See issue16284 + del work_item + # Check whether we should start shutting down. + executor = executor_reference() + # No more work items can be added if: + # - The interpreter is shutting down OR + # - The executor that owns this worker has been collected OR + # - The executor that owns this worker has been shutdown. + if _shutdown or executor is None or executor._shutdown_thread: + # Since no new work items can be added, it is safe to shutdown + # this thread if there are no pending work items. + if not pending_work_items: + while nb_shutdown_processes[0] < len(processes): + shutdown_one_process() + # If .join() is not called on the created processes then + # some multiprocessing.Queue methods may deadlock on Mac OS + # X. + for p in processes: + p.join() + call_queue.close() + return + del executor + +_system_limits_checked = False +_system_limited = None +def _check_system_limits(): + global _system_limits_checked, _system_limited + if _system_limits_checked: + if _system_limited: + raise NotImplementedError(_system_limited) + _system_limits_checked = True + try: + import os + nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") + except (AttributeError, ValueError): + # sysconf not available or setting not available + return + if nsems_max == -1: + # indetermine limit, assume that limit is determined + # by available memory only + return + if nsems_max >= 256: + # minimum number of semaphores available + # according to POSIX + return + _system_limited = "system provides too few semaphores (%d available, 256 necessary)" % nsems_max + raise NotImplementedError(_system_limited) + + +class ProcessPoolExecutor(_base.Executor): + def __init__(self, max_workers=None): + """Initializes a new ProcessPoolExecutor instance. + + Args: + max_workers: The maximum number of processes that can be used to + execute the given calls. If None or not given then as many + worker processes will be created as the machine has processors. + """ + _check_system_limits() + + if max_workers is None: + self._max_workers = multiprocessing.cpu_count() + else: + if max_workers <= 0: + raise ValueError("max_workers must be greater than 0") + + self._max_workers = max_workers + + # Make the call queue slightly larger than the number of processes to + # prevent the worker processes from idling. But don't make it too big + # because futures in the call queue cannot be cancelled. + self._call_queue = multiprocessing.Queue(self._max_workers + + EXTRA_QUEUED_CALLS) + self._result_queue = multiprocessing.Queue() + self._work_ids = queue.Queue() + self._queue_management_thread = None + self._processes = set() + + # Shutdown is a two-step process. + self._shutdown_thread = False + self._shutdown_lock = threading.Lock() + self._queue_count = 0 + self._pending_work_items = {} + + def _start_queue_management_thread(self): + # When the executor gets lost, the weakref callback will wake up + # the queue management thread. + def weakref_cb(_, q=self._result_queue): + q.put(None) + if self._queue_management_thread is None: + self._queue_management_thread = threading.Thread( + target=_queue_management_worker, + args=(weakref.ref(self, weakref_cb), + self._processes, + self._pending_work_items, + self._work_ids, + self._call_queue, + self._result_queue)) + self._queue_management_thread.daemon = True + self._queue_management_thread.start() + _threads_queues[self._queue_management_thread] = self._result_queue + + def _adjust_process_count(self): + for _ in range(len(self._processes), self._max_workers): + p = multiprocessing.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue)) + p.start() + self._processes.add(p) + + def submit(self, fn, *args, **kwargs): + with self._shutdown_lock: + if self._shutdown_thread: + raise RuntimeError('cannot schedule new futures after shutdown') + + f = _base.Future() + w = _WorkItem(f, fn, args, kwargs) + + self._pending_work_items[self._queue_count] = w + self._work_ids.put(self._queue_count) + self._queue_count += 1 + # Wake up queue management thread + self._result_queue.put(None) + + self._start_queue_management_thread() + self._adjust_process_count() + return f + submit.__doc__ = _base.Executor.submit.__doc__ + + def shutdown(self, wait=True): + with self._shutdown_lock: + self._shutdown_thread = True + if self._queue_management_thread: + # Wake up queue management thread + self._result_queue.put(None) + if wait: + self._queue_management_thread.join(sys.maxint) + # To reduce the risk of openning too many files, remove references to + # objects that use file descriptors. + self._queue_management_thread = None + self._call_queue = None + self._result_queue = None + self._processes = None + shutdown.__doc__ = _base.Executor.shutdown.__doc__ + +atexit.register(_python_exit) diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/process.pyc b/.local/lib/python2.7/site-packages/concurrent/futures/process.pyc new file mode 100644 index 0000000000000000000000000000000000000000..956bb753d8e14324eeb70f6c90459fd713f4cd9f GIT binary patch literal 13002 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 NUH_QAw0`kY@V`xT7PJ5W literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/thread.py b/.local/lib/python2.7/site-packages/concurrent/futures/thread.py new file mode 100644 index 00000000..b5f832ff --- /dev/null +++ b/.local/lib/python2.7/site-packages/concurrent/futures/thread.py @@ -0,0 +1,170 @@ +# Copyright 2009 Brian Quinlan. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Implements ThreadPoolExecutor.""" + +import atexit +from concurrent.futures import _base +import itertools +import Queue as queue +import threading +import weakref +import sys + +try: + from multiprocessing import cpu_count +except ImportError: + # some platforms don't have multiprocessing + def cpu_count(): + return None + +__author__ = 'Brian Quinlan (brian@sweetapp.com)' + +# Workers are created as daemon threads. This is done to allow the interpreter +# to exit when there are still idle threads in a ThreadPoolExecutor's thread +# pool (i.e. shutdown() was not called). However, allowing workers to die with +# the interpreter has two undesirable properties: +# - The workers would still be running during interpretor shutdown, +# meaning that they would fail in unpredictable ways. +# - The workers could be killed while evaluating a work item, which could +# be bad if the callable being evaluated has external side-effects e.g. +# writing to a file. +# +# To work around this problem, an exit handler is installed which tells the +# workers to exit when their work queues are empty and then waits until the +# threads finish. + +_threads_queues = weakref.WeakKeyDictionary() +_shutdown = False + +def _python_exit(): + global _shutdown + _shutdown = True + items = list(_threads_queues.items()) if _threads_queues else () + for t, q in items: + q.put(None) + for t, q in items: + t.join(sys.maxint) + +atexit.register(_python_exit) + +class _WorkItem(object): + def __init__(self, future, fn, args, kwargs): + self.future = future + self.fn = fn + self.args = args + self.kwargs = kwargs + + def run(self): + if not self.future.set_running_or_notify_cancel(): + return + + try: + result = self.fn(*self.args, **self.kwargs) + except: + e, tb = sys.exc_info()[1:] + self.future.set_exception_info(e, tb) + else: + self.future.set_result(result) + +def _worker(executor_reference, work_queue): + try: + while True: + work_item = work_queue.get(block=True) + if work_item is not None: + work_item.run() + # Delete references to object. See issue16284 + del work_item + + # attempt to increment idle count + executor = executor_reference() + if executor is not None: + executor._idle_semaphore.release() + del executor + continue + executor = executor_reference() + # Exit if: + # - The interpreter is shutting down OR + # - The executor that owns the worker has been collected OR + # - The executor that owns the worker has been shutdown. + if _shutdown or executor is None or executor._shutdown: + # Notice other workers + work_queue.put(None) + return + del executor + except: + _base.LOGGER.critical('Exception in worker', exc_info=True) + + +class ThreadPoolExecutor(_base.Executor): + + # Used to assign unique thread names when thread_name_prefix is not supplied. + _counter = itertools.count().next + + def __init__(self, max_workers=None, thread_name_prefix=''): + """Initializes a new ThreadPoolExecutor instance. + + Args: + max_workers: The maximum number of threads that can be used to + execute the given calls. + thread_name_prefix: An optional name prefix to give our threads. + """ + if max_workers is None: + # Use this number because ThreadPoolExecutor is often + # used to overlap I/O instead of CPU work. + max_workers = (cpu_count() or 1) * 5 + if max_workers <= 0: + raise ValueError("max_workers must be greater than 0") + + self._max_workers = max_workers + self._work_queue = queue.Queue() + self._idle_semaphore = threading.Semaphore(0) + self._threads = set() + self._shutdown = False + self._shutdown_lock = threading.Lock() + self._thread_name_prefix = (thread_name_prefix or + ("ThreadPoolExecutor-%d" % self._counter())) + + def submit(self, fn, *args, **kwargs): + with self._shutdown_lock: + if self._shutdown: + raise RuntimeError('cannot schedule new futures after shutdown') + + f = _base.Future() + w = _WorkItem(f, fn, args, kwargs) + + self._work_queue.put(w) + self._adjust_thread_count() + return f + submit.__doc__ = _base.Executor.submit.__doc__ + + def _adjust_thread_count(self): + # if idle threads are available, don't spin new threads + if self._idle_semaphore.acquire(False): + return + + # When the executor gets lost, the weakref callback will wake up + # the worker threads. + def weakref_cb(_, q=self._work_queue): + q.put(None) + + num_threads = len(self._threads) + if num_threads < self._max_workers: + thread_name = '%s_%d' % (self._thread_name_prefix or self, + num_threads) + t = threading.Thread(name=thread_name, target=_worker, + args=(weakref.ref(self, weakref_cb), + self._work_queue)) + t.daemon = True + t.start() + self._threads.add(t) + _threads_queues[t] = self._work_queue + + def shutdown(self, wait=True): + with self._shutdown_lock: + self._shutdown = True + self._work_queue.put(None) + if wait: + for t in self._threads: + t.join(sys.maxint) + shutdown.__doc__ = _base.Executor.shutdown.__doc__ diff --git a/.local/lib/python2.7/site-packages/concurrent/futures/thread.pyc b/.local/lib/python2.7/site-packages/concurrent/futures/thread.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a0a0843cd3d88af4678433cf239784cd268eeb2 GIT binary patch literal 5727 zcmcIo+io1k5v`e7ExEjlqA1ysBb9eK!yz$F!=D0o~ zn-k;uq-;)(>n+)A$>EYV8`7VW!L)2nOR!PAE)6pyds9+)Xd*f#@HINSbow=!w>=VjTyb6~RCmDNiAUwqa&0TdlA zmu#ih_+|^uY*;5*Sr_hwd8v5|#Wo;d-gQ+TjljOOvM?Qd%dxO)Xs+&-1GCyIZEdRS z@2#%%%Pj4$_VcaP;i20ti+5LkxN37}-WjIZUbUQnw3SCZjurfT1 zxsF8?8$w86uR`9e^0a6_sPm$a@6HyRAKHCmTsj=CWaZ%7x{U~`EV>PgiW5l#aiLUK z#6_(18ZoJLwSa-P@Y2X3~fMXJ$YL;4&L-Smrm%wp%dcZ z@s?M+FB@t#E_=tg7~N>(pVe*uY}Z zBE#Cn994hsm3g7P_RzW}dI#wNdOB2$C#a<^SNY^rJ>_OFTjG73n1kGLHp@;4o57Xf zTyPe}Z+oMx_U>Ur8Gq%6i@b?qUxzR_F*ppO_z&rq=je$fUhi<<8S%@)#w`@fnVtsp zNrDO-h6+ zpMyAEvrb}$B*}~1CCT?tx9pIhrGFU>$Gy7vX+D`(ukYxF|wIg885kM!}^Z3YLQlp{@_~KwlQ= zz$A&|29jh@cI!Tx@p&}k%Miy4)!J#0D%s|{C`#_lpw-OiJDQM1ar94A4*wztUy(Jd zKhx0w6tIEjkp!L=yCQonsf za3VzRjKS2-i}pU~$W-wK^mnEq;s`=nb;o$FRmXUe&bx4zHG_1xTUN%AV=L1)2&XY8 zis|DR#RKt^`yYRNCsxO2Rqk@cLJtL^+Ki%eQkiXo_?H<41()MvfU>1FN&h;^_?csr zoB}{}SBW>vT`bhT$qfO@tza>j38um*YTL z*j)(E^9IpXp#ykqBFt)}CFh5ll7&kC$dFnB2lwD^($-JniSdG`5|#3$y=!Qa%9NI#TS))Kq))`3Ujs#)}p^ zkuHq6w%!9 z#D>~~+B&Xw2kEfGX0U^zech62U&ZJ<*Sc#Rjp+o3=AC*PAEy1<+^MRv@)^#F36xVb zS<~7BrfrS{q9#3Yg#C^Y{`5evkI5sx3SFPQ8Rvt;$k;mG-LyX<6-_@r0e87Mjy}#B z6VjP~PLp?2Ida=5k34B$pARl^I^-Hkl7w2%6*< zem4V+Nj$ntChnuyJqR8Qk>5X-fHj;*oLS8gUz|u7)Ti~&8ocW;`@<1LSi)Is$TNSo znwrxf8X=|UK$ARc0d&_lx*`uAL5va_`xa&e?2)y!ZMJI|uJy=`?keqco7fur#HT** z;Ta7FikTP}t9;-=bQ~J)>Rl&hERMfJF$v-5qa^M20Nt@4)wfDwn&5mbW6~sNTjl<# zdQB56TW<|=_bV)Nl;%v)Tj5M_K3oWeJu4JUedBi_bS%%WG0%=B6QhObb6Aki zuxQY3Y6fMYe1~vVIn_wJ-I$BiyO#(3ZH`3lLSPzSl(l_=yJFrpPt~aLPcXypQ0yfL z2^WJ#V?LS(U(Eyk=k>dV+Ja}V2s+%Po&>z0QY3=Cu1EkF0G7!ZoM5aGdOZICP}M{6 zFB)(NZhy8seiQN1TZZ>>dmEwC1CCCQm3=t3&q!a8i@rASF4GH|D$}MX!b1bi{WN!{ zZ%YkaW7_;Hru8oiV7(TuOikEut)t|~w_EWW5E?y^30DrUwya`CxzWSe9Ju&>s`9A$ z>(ouwP{?<#Vme{{uUT(fj}a literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/INSTALLER b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/LICENSE b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/LICENSE new file mode 100644 index 00000000..a8d65b16 --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/LICENSE @@ -0,0 +1,48 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python +alone or in any derivative version, provided, however, that PSF's +License Agreement and PSF's notice of copyright, i.e., "Copyright (c) +2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights +Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/METADATA b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/METADATA new file mode 100644 index 00000000..c94bdb98 --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/METADATA @@ -0,0 +1,57 @@ +Metadata-Version: 2.1 +Name: futures +Version: 3.3.0 +Summary: Backport of the concurrent.futures package from Python 3 +Home-page: https://github.com/agronholm/pythonfutures +Author: Brian Quinlan +Author-email: brian@sweetapp.com +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: PSF +Platform: UNKNOWN +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 2 :: Only +Requires-Python: >=2.6, <3 + +.. image:: https://travis-ci.org/agronholm/pythonfutures.svg?branch=master + :target: https://travis-ci.org/agronholm/pythonfutures + :alt: Build Status + +This is a backport of the `concurrent.futures`_ standard library module to Python 2. + +It **does not** work on Python 3 due to Python 2 syntax being used in the codebase. +Python 3 users should not attempt to install it, since the package is already included in the +standard library. + +To conditionally require this library only on Python 2, you can do this in your ``setup.py``: + +.. code-block:: python + + setup( + ... + extras_require={ + ':python_version == "2.7"': ['futures'] + } + ) + +Or, using the newer syntax: + +.. code-block:: python + + setup( + ... + install_requires={ + 'futures; python_version == "2.7"' + } + ) + +.. warning:: The ``ProcessPoolExecutor`` class has known (unfixable) problems on Python 2 and + should not be relied on for mission critical work. Please see `Issue 29 `_ and `upstream bug report `_ for more details. + +.. _concurrent.futures: https://docs.python.org/library/concurrent.futures.html + + diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/RECORD b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/RECORD new file mode 100644 index 00000000..626bac08 --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/RECORD @@ -0,0 +1,16 @@ +concurrent/__init__.py,sha256=qEFeq3yuf3lQKVseALmL8aPM8fpCS54B_5pry00M3hk,76 +concurrent/__init__.pyc,, +concurrent/futures/__init__.py,sha256=lErVwp1Kv_co1PKmfYCHvBhWZ_ONtg-bk9v74BG1Q8w,887 +concurrent/futures/__init__.pyc,, +concurrent/futures/_base.py,sha256=7SaxfmjweeKgw5bYMqCE09V_w4Q0A7N5MtcFdyV8ypI,23798 +concurrent/futures/_base.pyc,, +concurrent/futures/process.py,sha256=XWNXGq8Pgnt__2Yz49bCV9dyuaWiZLlkRwt4IQMKaOQ,14986 +concurrent/futures/process.pyc,, +concurrent/futures/thread.py,sha256=l5xiZysJdECLjizJmixi8xQj4iCWcpvGnoUiXpJTRhc,5923 +concurrent/futures/thread.pyc,, +futures-3.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +futures-3.3.0.dist-info/LICENSE,sha256=ppi9XUQeShavbJkrjoDL-hJ1XXLZEIVPofsR1N6wBZo,2395 +futures-3.3.0.dist-info/METADATA,sha256=ruUlmMgekwudpLJ8s0fW5FMaGFbqSXmTRYq9ejavcP0,1915 +futures-3.3.0.dist-info/RECORD,, +futures-3.3.0.dist-info/WHEEL,sha256=Ph_z28wTcU7HnQwSQ6yCQ-zkcGK4h4ehDfP8b6UoHVE,92 +futures-3.3.0.dist-info/top_level.txt,sha256=elL7bzFlkyVZr3M0gg0AeLUPt5OJ2F9uJcmu63VMt7A,11 diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/WHEEL b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/WHEEL new file mode 100644 index 00000000..5c9ed1e0 --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any + diff --git a/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/top_level.txt b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/top_level.txt new file mode 100644 index 00000000..e4d7bdcb --- /dev/null +++ b/.local/lib/python2.7/site-packages/futures-3.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +concurrent diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/AUTHORS b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/AUTHORS new file mode 100644 index 00000000..42a5c227 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/AUTHORS @@ -0,0 +1,51 @@ +Original Authors +---------------- +* Armin Rigo +* Christian Tismer + +Contributors +------------ +* Al Stone +* Alexander Schmidt +* Alexey Borzenkov +* Andreas Schwab +* Armin Ronacher +* Bin Wang +* Bob Ippolito +* ChangBo Guo +* Christoph Gohlke +* Denis Bilenko +* Dirk Mueller +* Donovan Preston +* Fantix King +* Floris Bruynooghe +* Fredrik Fornwall +* Gerd Woetzel +* Giel van Schijndel +* Gökhan Karabulut +* Gustavo Niemeyer +* Guy Rozendorn +* Hye-Shik Chang +* Jared Kuolt +* Jason Madden +* Josh Snyder +* Kyle Ambroff +* Laszlo Boszormenyi +* Mao Han +* Marc Abramowitz +* Marc Schlaich +* Marcin Bachry +* Matt Madison +* Matt Turner +* Michael Ellerman +* Michael Matz +* Ralf Schmitt +* Robie Basak +* Ronny Pfannschmidt +* Samual M. Rushing +* Tony Bowles +* Tony Breeds +* Trevor Bowen +* Tulio Magno Quites Machado Filho +* Ulrich Weigand +* Victor Stinner diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/INSTALLER b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE new file mode 100644 index 00000000..5e009e3c --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE @@ -0,0 +1,30 @@ +The following files are derived from Stackless Python and are subject to the +same license as Stackless Python: + + slp_platformselect.h + files in platform/ directory + +See LICENSE.PSF and http://www.stackless.com/ for details. + +Unless otherwise noted, the files in greenlet have been released under the +following MIT license: + +Copyright (c) Armin Rigo, Christian Tismer and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF new file mode 100644 index 00000000..d3b509a2 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF @@ -0,0 +1,47 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011 Python Software Foundation; All Rights Reserved" are retained in Python +alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/METADATA b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/METADATA new file mode 100644 index 00000000..a656817d --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: greenlet +Version: 0.4.17 +Summary: Lightweight in-process concurrent programming +Home-page: https://github.com/python-greenlet/greenlet +Author: UNKNOWN +Author-email: UNKNOWN +License: MIT License +Platform: any +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.0 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +.. image:: https://secure.travis-ci.org/python-greenlet/greenlet.png + :target: http://travis-ci.org/python-greenlet/greenlet + +The greenlet package is a spin-off of Stackless, a version of CPython +that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other +words. This is useful when you want to control exactly when your code +runs. You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. Additionally, you don't need a "yield" keyword. See +the example in tests/test_generator.py. + +Greenlets are provided as a C extension module for the regular +unmodified interpreter. + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip or +easy_install:: + + pip install greenlet + easy_install greenlet + + +Source code archives and windows installers are available on the +python package index at https://pypi.python.org/pypi/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io + + diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/RECORD b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/RECORD new file mode 100644 index 00000000..8c9b67b7 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/RECORD @@ -0,0 +1,10 @@ +../../../include/python2.7/greenlet/greenlet.h,sha256=lMxw5Z2sk1jjSXhqzBI13iCh4wQsv70PYnOVVam6kZI,4176 +greenlet-0.4.17.dist-info/AUTHORS,sha256=swW28t2knVRxRkaEQNZtO7MP9Sgnompb7B6cNgJM8Gk,849 +greenlet-0.4.17.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +greenlet-0.4.17.dist-info/LICENSE,sha256=u95V1UVqHpEmM-0_ZtHb2VBOPj3OT0wgFQQ83LxW5pc,1408 +greenlet-0.4.17.dist-info/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 +greenlet-0.4.17.dist-info/METADATA,sha256=1JfIvgi_IrGEShdtXql0SnoBTO20gM-UFaAskiMksOg,3378 +greenlet-0.4.17.dist-info/RECORD,, +greenlet-0.4.17.dist-info/WHEEL,sha256=v_WvMd9LcJo7UEU8YDntezoLIPEhS-iS69BF1ftVDNw,110 +greenlet-0.4.17.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 +greenlet.so,sha256=Rq5cYBkxxo_w_Q8CN741z3c3LZSt20-xraTKOPVfr44,98183 diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/WHEEL b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/WHEEL new file mode 100644 index 00000000..fdaae725 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: false +Tag: cp27-cp27mu-manylinux1_x86_64 + diff --git a/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/top_level.txt b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/top_level.txt new file mode 100644 index 00000000..46725be4 --- /dev/null +++ b/.local/lib/python2.7/site-packages/greenlet-0.4.17.dist-info/top_level.txt @@ -0,0 +1 @@ +greenlet diff --git a/.local/lib/python2.7/site-packages/greenlet.so b/.local/lib/python2.7/site-packages/greenlet.so new file mode 100755 index 0000000000000000000000000000000000000000..0867dc7a75f63e2b1086f4fbc6cd9d5b33709dc2 GIT binary patch literal 98183 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 BKA8Xj literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/PKG-INFO b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/PKG-INFO new file mode 100644 index 00000000..4cc4ba1a --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: neovim +Version: 0.3.1 +Summary: Transition packgage for pynvim +Home-page: http://github.com/neovim/python-client +Author: Thiago de Arruda +Author-email: tpadilha84@gmail.com +License: Apache +Description: UNKNOWN +Platform: UNKNOWN diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/SOURCES.txt b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/SOURCES.txt new file mode 100644 index 00000000..c8c7e9f7 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,8 @@ +setup.cfg +setup.py +neovim.egg-info/PKG-INFO +neovim.egg-info/SOURCES.txt +neovim.egg-info/dependency_links.txt +neovim.egg-info/not-zip-safe +neovim.egg-info/requires.txt +neovim.egg-info/top_level.txt \ No newline at end of file diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/dependency_links.txt b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/installed-files.txt b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/installed-files.txt new file mode 100644 index 00000000..b1be01d6 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/installed-files.txt @@ -0,0 +1,6 @@ +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/not-zip-safe b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/requires.txt b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/requires.txt new file mode 100644 index 00000000..a7390439 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/requires.txt @@ -0,0 +1 @@ +pynvim>=0.3.1 diff --git a/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/top_level.txt b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/top_level.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim-0.3.1-py2.7.egg-info/top_level.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/neovim/__init__.py b/.local/lib/python2.7/site-packages/neovim/__init__.py new file mode 100644 index 00000000..31ce7c8f --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim/__init__.py @@ -0,0 +1,8 @@ +"""Python client for Nvim. + +This is a transition package. New projects should instead import pynvim package. +""" +import pynvim +from pynvim import * + +__all__ = pynvim.__all__ diff --git a/.local/lib/python2.7/site-packages/neovim/__init__.pyc b/.local/lib/python2.7/site-packages/neovim/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9330aff6eeed61be6b36a55ded479decb3b1b6b8 GIT binary patch literal 360 zcmYLFOHRZv3{6@zj4HT8mIa9hv4I6bELc}a%&Hp`QV&f@ld4HUb0f~cwKxDcGZk3Q z^NZtOoPVDdU!TvQ*&-R)dphBapk=HfnkT+N&iafsS$caak5Woc@VJYe zcS2i(E{d(6ME!1tswg&{34&CKI4KuQG!!-}{ia^A5;cB^aq>Ot7)0p&Y+GSmh^WX8 zqo1M}caAFkr4;6eq%Ju%jS0@nJketUfYxh(xFUW?TinW8fReoIAHoA&W#@^ zmp8JqUMnlDd6DD(Ls!+cq?z$znK(#?p2m>?#+e9EQQVpe-44E;E#B=HlKQXs2`{o= Dd1zj- literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/neovim/api/__init__.py b/.local/lib/python2.7/site-packages/neovim/api/__init__.py new file mode 100644 index 00000000..3f7a8da2 --- /dev/null +++ b/.local/lib/python2.7/site-packages/neovim/api/__init__.py @@ -0,0 +1,8 @@ +"""Nvim API subpackage. + +This is a transition package. New projects should instead import pynvim.api. +""" +from pynvim import api +from pynvim.api import * + +__all__ = api.__all__ diff --git a/.local/lib/python2.7/site-packages/neovim/api/__init__.pyc b/.local/lib/python2.7/site-packages/neovim/api/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4592784d5863b7c6a802034dc5c0184a0cda594 GIT binary patch literal 394 zcmYLE%}&H15FXmPnkFVb0>{Q=!FbVwF?!QWW86LUf@~p{l|oafX5YwX@U?sZ9o(uD z_~x6xk0Jj&E*~*6ODKDw@hpOMu*XFbsGZ>ou90t#)YUQ z`hM_Zq{GgkFq4B}rTIdu2tF2b1kCM&lsT<`R*8qmg;2f~A})~c=O2+lEdS!9H@8Y_ zg{V^fAHp4myz{;0TOTGpo?UWgeJd@uX2XYF?7TZ?7aTvNm-BZ5ciQ8w9JRR+#+fJt Y!`>qlyXw7~tiCRghqTv%oRBj626?DtRR910 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/PKG-INFO b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/PKG-INFO new file mode 100644 index 00000000..8215e2a4 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/PKG-INFO @@ -0,0 +1,13 @@ +Metadata-Version: 2.1 +Name: pynvim +Version: 0.4.2 +Summary: Python client to neovim +Home-page: http://github.com/neovim/pynvim +Author: Thiago de Arruda +Author-email: tpadilha84@gmail.com +License: Apache +Download-URL: https://github.com/neovim/pynvim/archive/0.4.2.tar.gz +Description: UNKNOWN +Platform: UNKNOWN +Provides-Extra: pyuv +Provides-Extra: test diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/SOURCES.txt b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/SOURCES.txt new file mode 100644 index 00000000..995a2f20 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,45 @@ +LICENSE +MANIFEST.in +README.md +setup.cfg +setup.py +neovim/__init__.py +neovim/api/__init__.py +pynvim/__init__.py +pynvim/compat.py +pynvim/util.py +pynvim.egg-info/PKG-INFO +pynvim.egg-info/SOURCES.txt +pynvim.egg-info/dependency_links.txt +pynvim.egg-info/not-zip-safe +pynvim.egg-info/requires.txt +pynvim.egg-info/top_level.txt +pynvim/api/__init__.py +pynvim/api/buffer.py +pynvim/api/common.py +pynvim/api/nvim.py +pynvim/api/tabpage.py +pynvim/api/window.py +pynvim/msgpack_rpc/__init__.py +pynvim/msgpack_rpc/async_session.py +pynvim/msgpack_rpc/msgpack_stream.py +pynvim/msgpack_rpc/session.py +pynvim/msgpack_rpc/event_loop/__init__.py +pynvim/msgpack_rpc/event_loop/asyncio.py +pynvim/msgpack_rpc/event_loop/base.py +pynvim/msgpack_rpc/event_loop/uv.py +pynvim/plugin/__init__.py +pynvim/plugin/decorators.py +pynvim/plugin/host.py +pynvim/plugin/script_host.py +test/conftest.py +test/test_buffer.py +test/test_client_rpc.py +test/test_concurrency.py +test/test_decorators.py +test/test_events.py +test/test_host.py +test/test_logging.py +test/test_tabpage.py +test/test_vim.py +test/test_window.py \ No newline at end of file diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/dependency_links.txt b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/installed-files.txt b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/installed-files.txt new file mode 100644 index 00000000..1508a2be --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/installed-files.txt @@ -0,0 +1,52 @@ +../neovim/__init__.py +../neovim/__init__.pyc +../neovim/api/__init__.py +../neovim/api/__init__.pyc +../pynvim/__init__.py +../pynvim/__init__.pyc +../pynvim/api/__init__.py +../pynvim/api/__init__.pyc +../pynvim/api/buffer.py +../pynvim/api/buffer.pyc +../pynvim/api/common.py +../pynvim/api/common.pyc +../pynvim/api/nvim.py +../pynvim/api/nvim.pyc +../pynvim/api/tabpage.py +../pynvim/api/tabpage.pyc +../pynvim/api/window.py +../pynvim/api/window.pyc +../pynvim/compat.py +../pynvim/compat.pyc +../pynvim/msgpack_rpc/__init__.py +../pynvim/msgpack_rpc/__init__.pyc +../pynvim/msgpack_rpc/async_session.py +../pynvim/msgpack_rpc/async_session.pyc +../pynvim/msgpack_rpc/event_loop/__init__.py +../pynvim/msgpack_rpc/event_loop/__init__.pyc +../pynvim/msgpack_rpc/event_loop/asyncio.py +../pynvim/msgpack_rpc/event_loop/asyncio.pyc +../pynvim/msgpack_rpc/event_loop/base.py +../pynvim/msgpack_rpc/event_loop/base.pyc +../pynvim/msgpack_rpc/event_loop/uv.py +../pynvim/msgpack_rpc/event_loop/uv.pyc +../pynvim/msgpack_rpc/msgpack_stream.py +../pynvim/msgpack_rpc/msgpack_stream.pyc +../pynvim/msgpack_rpc/session.py +../pynvim/msgpack_rpc/session.pyc +../pynvim/plugin/__init__.py +../pynvim/plugin/__init__.pyc +../pynvim/plugin/decorators.py +../pynvim/plugin/decorators.pyc +../pynvim/plugin/host.py +../pynvim/plugin/host.pyc +../pynvim/plugin/script_host.py +../pynvim/plugin/script_host.pyc +../pynvim/util.py +../pynvim/util.pyc +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/not-zip-safe b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/requires.txt b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/requires.txt new file mode 100644 index 00000000..561f59d5 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/requires.txt @@ -0,0 +1,9 @@ +msgpack>=0.5.0 +trollius +greenlet + +[pyuv] +pyuv>=1.0.0 + +[test] +pytest>=3.4.0 diff --git a/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/top_level.txt b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/top_level.txt new file mode 100644 index 00000000..e6bb79fa --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim-0.4.2-py2.7.egg-info/top_level.txt @@ -0,0 +1,2 @@ +neovim +pynvim diff --git a/.local/lib/python2.7/site-packages/pynvim/__init__.py b/.local/lib/python2.7/site-packages/pynvim/__init__.py new file mode 100644 index 00000000..17967ce2 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/__init__.py @@ -0,0 +1,156 @@ +"""Python client for Nvim. + +Client library for talking with Nvim processes via its msgpack-rpc API. +""" +import logging +import os +import sys + +from pynvim.api import Nvim, NvimError +from pynvim.compat import IS_PYTHON3 +from pynvim.msgpack_rpc import (ErrorResponse, child_session, socket_session, + stdio_session, tcp_session) +from pynvim.plugin import (Host, autocmd, command, decode, encoding, function, + plugin, rpc_export, shutdown_hook) +from pynvim.util import VERSION, Version + + +__all__ = ('tcp_session', 'socket_session', 'stdio_session', 'child_session', + 'start_host', 'autocmd', 'command', 'encoding', 'decode', + 'function', 'plugin', 'rpc_export', 'Host', 'Nvim', 'NvimError', + 'Version', 'VERSION', 'shutdown_hook', 'attach', 'setup_logging', + 'ErrorResponse') + + +def start_host(session=None): + """Promote the current process into python plugin host for Nvim. + + Start msgpack-rpc event loop for `session`, listening for Nvim requests + and notifications. It registers Nvim commands for loading/unloading + python plugins. + + The sys.stdout and sys.stderr streams are redirected to Nvim through + `session`. That means print statements probably won't work as expected + while this function doesn't return. + + This function is normally called at program startup and could have been + defined as a separate executable. It is exposed as a library function for + testing purposes only. + """ + plugins = [] + for arg in sys.argv: + _, ext = os.path.splitext(arg) + if ext == '.py': + plugins.append(arg) + elif os.path.isdir(arg): + init = os.path.join(arg, '__init__.py') + if os.path.isfile(init): + plugins.append(arg) + + # This is a special case to support the old workaround of + # adding an empty .py file to make a package directory + # visible, and it should be removed soon. + for path in list(plugins): + dup = path + ".py" + if os.path.isdir(path) and dup in plugins: + plugins.remove(dup) + + # Special case: the legacy scripthost receives a single relative filename + # while the rplugin host will receive absolute paths. + if plugins == ["script_host.py"]: + name = "script" + else: + name = "rplugin" + + setup_logging(name) + + if not session: + session = stdio_session() + nvim = Nvim.from_session(session) + + if nvim.version.api_level < 1: + sys.stderr.write("This version of pynvim " + "requires nvim 0.1.6 or later") + sys.exit(1) + + host = Host(nvim) + host.start(plugins) + + +def attach(session_type, address=None, port=None, + path=None, argv=None, decode=None): + """Provide a nicer interface to create python api sessions. + + Previous machinery to create python api sessions is still there. This only + creates a facade function to make things easier for the most usual cases. + Thus, instead of: + from pynvim import socket_session, Nvim + session = tcp_session(address=

, port=) + nvim = Nvim.from_session(session) + You can now do: + from pynvim import attach + nvim = attach('tcp', address=
, port=) + And also: + nvim = attach('socket', path=) + nvim = attach('child', argv=) + nvim = attach('stdio') + + When the session is not needed anymore, it is recommended to explicitly + close it: + nvim.close() + It is also possible to use the session as a context mangager: + with attach('socket', path=thepath) as nvim: + print(nvim.funcs.getpid()) + print(nvim.current.line) + This will automatically close the session when you're done with it, or + when an error occured. + + + """ + session = (tcp_session(address, port) if session_type == 'tcp' else + socket_session(path) if session_type == 'socket' else + stdio_session() if session_type == 'stdio' else + child_session(argv) if session_type == 'child' else + None) + + if not session: + raise Exception('Unknown session type "%s"' % session_type) + + if decode is None: + decode = IS_PYTHON3 + + return Nvim.from_session(session).with_decode(decode) + + +def setup_logging(name): + """Setup logging according to environment variables.""" + logger = logging.getLogger(__name__) + if 'NVIM_PYTHON_LOG_FILE' in os.environ: + prefix = os.environ['NVIM_PYTHON_LOG_FILE'].strip() + major_version = sys.version_info[0] + logfile = '{}_py{}_{}'.format(prefix, major_version, name) + handler = logging.FileHandler(logfile, 'w', 'utf-8') + handler.formatter = logging.Formatter( + '%(asctime)s [%(levelname)s @ ' + '%(filename)s:%(funcName)s:%(lineno)s] %(process)s - %(message)s') + logging.root.addHandler(handler) + level = logging.INFO + env_log_level = os.environ.get('NVIM_PYTHON_LOG_LEVEL', None) + if env_log_level is not None: + lvl = getattr(logging, env_log_level.strip(), None) + if isinstance(lvl, int): + level = lvl + else: + logger.warning('Invalid NVIM_PYTHON_LOG_LEVEL: %r, using INFO.', + env_log_level) + logger.setLevel(level) + + +# Required for python 2.6 +class NullHandler(logging.Handler): + def emit(self, record): + pass + + +if not logging.root.handlers: + logging.root.addHandler(NullHandler()) diff --git a/.local/lib/python2.7/site-packages/pynvim/__init__.pyc b/.local/lib/python2.7/site-packages/pynvim/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c3fac5f583a21827e9329077e7a14d3c95d22de GIT binary patch literal 6069 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 self.end: + index = self.end + return index diff --git a/.local/lib/python2.7/site-packages/pynvim/api/buffer.pyc b/.local/lib/python2.7/site-packages/pynvim/api/buffer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d4da847013e5053fa2145dbaaf01519f2cbd067 GIT binary patch literal 9924 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 I7ta3rf31z)T>t<8 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/api/common.py b/.local/lib/python2.7/site-packages/pynvim/api/common.py new file mode 100644 index 00000000..21f5b2da --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/api/common.py @@ -0,0 +1,205 @@ +"""Code shared between the API classes.""" +import functools + +from msgpack import unpackb + +from pynvim.compat import unicode_errors_default + +__all__ = () + + +class NvimError(Exception): + pass + + +class Remote(object): + + """Base class for Nvim objects(buffer/window/tabpage). + + Each type of object has it's own specialized class with API wrappers around + the msgpack-rpc session. This implements equality which takes the remote + object handle into consideration. + """ + + def __init__(self, session, code_data): + """Initialize from session and code_data immutable object. + + The `code_data` contains serialization information required for + msgpack-rpc calls. It must be immutable for Buffer equality to work. + """ + self._session = session + self.code_data = code_data + self.handle = unpackb(code_data[1]) + self.api = RemoteApi(self, self._api_prefix) + self.vars = RemoteMap(self, self._api_prefix + 'get_var', + self._api_prefix + 'set_var', + self._api_prefix + 'del_var') + self.options = RemoteMap(self, self._api_prefix + 'get_option', + self._api_prefix + 'set_option') + + def __repr__(self): + """Get text representation of the object.""" + return '<%s(handle=%r)>' % ( + self.__class__.__name__, + self.handle, + ) + + def __eq__(self, other): + """Return True if `self` and `other` are the same object.""" + return (hasattr(other, 'code_data') + and other.code_data == self.code_data) + + def __hash__(self): + """Return hash based on remote object id.""" + return self.code_data.__hash__() + + def request(self, name, *args, **kwargs): + """Wrapper for nvim.request.""" + return self._session.request(name, self, *args, **kwargs) + + +class RemoteApi(object): + + """Wrapper to allow api methods to be called like python methods.""" + + def __init__(self, obj, api_prefix): + """Initialize a RemoteApi with object and api prefix.""" + self._obj = obj + self._api_prefix = api_prefix + + def __getattr__(self, name): + """Return wrapper to named api method.""" + return functools.partial(self._obj.request, self._api_prefix + name) + + +def transform_keyerror(exc): + if isinstance(exc, NvimError): + if exc.args[0].startswith('Key not found:'): + return KeyError(exc.args[0]) + if exc.args[0].startswith('Invalid option name:'): + return KeyError(exc.args[0]) + return exc + + +class RemoteMap(object): + """Represents a string->object map stored in Nvim. + + This is the dict counterpart to the `RemoteSequence` class, but it is used + as a generic way of retrieving values from the various map-like data + structures present in Nvim. + + It is used to provide a dict-like API to vim variables and options. + """ + + _set = None + _del = None + + def __init__(self, obj, get_method, set_method=None, del_method=None): + """Initialize a RemoteMap with session, getter/setter.""" + self._get = functools.partial(obj.request, get_method) + if set_method: + self._set = functools.partial(obj.request, set_method) + if del_method: + self._del = functools.partial(obj.request, del_method) + + def __getitem__(self, key): + """Return a map value by key.""" + try: + return self._get(key) + except NvimError as exc: + raise transform_keyerror(exc) + + def __setitem__(self, key, value): + """Set a map value by key(if the setter was provided).""" + if not self._set: + raise TypeError('This dict is read-only') + self._set(key, value) + + def __delitem__(self, key): + """Delete a map value by associating None with the key.""" + if not self._del: + raise TypeError('This dict is read-only') + try: + return self._del(key) + except NvimError as exc: + raise transform_keyerror(exc) + + def __contains__(self, key): + """Check if key is present in the map.""" + try: + self._get(key) + return True + except Exception: + return False + + def get(self, key, default=None): + """Return value for key if present, else a default value.""" + try: + return self.__getitem__(key) + except KeyError: + return default + + +class RemoteSequence(object): + + """Represents a sequence of objects stored in Nvim. + + This class is used to wrap msgapck-rpc functions that work on Nvim + sequences(of lines, buffers, windows and tabpages) with an API that + is similar to the one provided by the python-vim interface. + + For example, the 'windows' property of the `Nvim` class is a RemoteSequence + sequence instance, and the expression `nvim.windows[0]` is translated to + session.request('nvim_list_wins')[0]. + + One important detail about this class is that all methods will fetch the + sequence into a list and perform the necessary manipulation + locally(iteration, indexing, counting, etc). + """ + + def __init__(self, session, method): + """Initialize a RemoteSequence with session, method.""" + self._fetch = functools.partial(session.request, method) + + def __len__(self): + """Return the length of the remote sequence.""" + return len(self._fetch()) + + def __getitem__(self, idx): + """Return a sequence item by index.""" + if not isinstance(idx, slice): + return self._fetch()[idx] + return self._fetch()[idx.start:idx.stop] + + def __iter__(self): + """Return an iterator for the sequence.""" + items = self._fetch() + for item in items: + yield item + + def __contains__(self, item): + """Check if an item is present in the sequence.""" + return item in self._fetch() + + +def _identity(obj, session, method, kind): + return obj + + +def decode_if_bytes(obj, mode=True): + """Decode obj if it is bytes.""" + if mode is True: + mode = unicode_errors_default + if isinstance(obj, bytes): + return obj.decode("utf-8", errors=mode) + return obj + + +def walk(fn, obj, *args, **kwargs): + """Recursively walk an object graph applying `fn`/`args` to objects.""" + if type(obj) in [list, tuple]: + return list(walk(fn, o, *args) for o in obj) + if type(obj) is dict: + return dict((walk(fn, k, *args), walk(fn, v, *args)) for k, v in + obj.items()) + return fn(obj, *args, **kwargs) diff --git a/.local/lib/python2.7/site-packages/pynvim/api/common.pyc b/.local/lib/python2.7/site-packages/pynvim/api/common.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd95d65f3d723d09e6ce7f2e6f7b011edf6e5291 GIT binary patch literal 10326 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/api/nvim.py b/.local/lib/python2.7/site-packages/pynvim/api/nvim.py new file mode 100644 index 00000000..487478ac --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/api/nvim.py @@ -0,0 +1,577 @@ +"""Main Nvim interface.""" +import os +import sys +import threading +from functools import partial +from traceback import format_stack + +from msgpack import ExtType + +from pynvim.api.buffer import Buffer +from pynvim.api.common import (NvimError, Remote, RemoteApi, RemoteMap, RemoteSequence, + decode_if_bytes, walk) +from pynvim.api.tabpage import Tabpage +from pynvim.api.window import Window +from pynvim.compat import IS_PYTHON3 +from pynvim.util import Version, format_exc_skip + +__all__ = ('Nvim') + + +os_chdir = os.chdir + +lua_module = """ +local a = vim.api +local function update_highlights(buf, src_id, hls, clear_first, clear_end) + if clear_first ~= nil then + a.nvim_buf_clear_highlight(buf, src_id, clear_first, clear_end) + end + for _,hl in pairs(hls) do + local group, line, col_start, col_end = unpack(hl) + if col_start == nil then + col_start = 0 + end + if col_end == nil then + col_end = -1 + end + a.nvim_buf_add_highlight(buf, src_id, group, line, col_start, col_end) + end +end + +local chid = ... +local mod = {update_highlights=update_highlights} +_G["_pynvim_"..chid] = mod +""" + + +class Nvim(object): + + """Class that represents a remote Nvim instance. + + This class is main entry point to Nvim remote API, it is a wrapper + around Session instances. + + The constructor of this class must not be called directly. Instead, the + `from_session` class method should be used to create the first instance + from a raw `Session` instance. + + Subsequent instances for the same session can be created by calling the + `with_decode` instance method to change the decoding behavior or + `SubClass.from_nvim(nvim)` where `SubClass` is a subclass of `Nvim`, which + is useful for having multiple `Nvim` objects that behave differently + without one affecting the other. + + When this library is used on python3.4+, asyncio event loop is guaranteed + to be used. It is available as the "loop" attribute of this class. Note + that asyncio callbacks cannot make blocking requests, which includes + accessing state-dependent attributes. They should instead schedule another + callback using nvim.async_call, which will not have this restriction. + """ + + @classmethod + def from_session(cls, session): + """Create a new Nvim instance for a Session instance. + + This method must be called to create the first Nvim instance, since it + queries Nvim metadata for type information and sets a SessionHook for + creating specialized objects from Nvim remote handles. + """ + session.error_wrapper = lambda e: NvimError(decode_if_bytes(e[1])) + channel_id, metadata = session.request(b'nvim_get_api_info') + + if IS_PYTHON3: + # decode all metadata strings for python3 + metadata = walk(decode_if_bytes, metadata) + + types = { + metadata['types']['Buffer']['id']: Buffer, + metadata['types']['Window']['id']: Window, + metadata['types']['Tabpage']['id']: Tabpage, + } + + return cls(session, channel_id, metadata, types) + + @classmethod + def from_nvim(cls, nvim): + """Create a new Nvim instance from an existing instance.""" + return cls(nvim._session, nvim.channel_id, nvim.metadata, + nvim.types, nvim._decode, nvim._err_cb) + + def __init__(self, session, channel_id, metadata, types, + decode=False, err_cb=None): + """Initialize a new Nvim instance. This method is module-private.""" + self._session = session + self.channel_id = channel_id + self.metadata = metadata + version = metadata.get("version", {"api_level": 0}) + self.version = Version(**version) + self.types = types + self.api = RemoteApi(self, 'nvim_') + self.vars = RemoteMap(self, 'nvim_get_var', 'nvim_set_var', 'nvim_del_var') + self.vvars = RemoteMap(self, 'nvim_get_vvar', None, None) + self.options = RemoteMap(self, 'nvim_get_option', 'nvim_set_option') + self.buffers = Buffers(self) + self.windows = RemoteSequence(self, 'nvim_list_wins') + self.tabpages = RemoteSequence(self, 'nvim_list_tabpages') + self.current = Current(self) + self.session = CompatibilitySession(self) + self.funcs = Funcs(self) + self.lua = LuaFuncs(self) + self.error = NvimError + self._decode = decode + self._err_cb = err_cb + + # only on python3.4+ we expose asyncio + if IS_PYTHON3: + self.loop = self._session.loop._loop + + def _from_nvim(self, obj, decode=None): + if decode is None: + decode = self._decode + if type(obj) is ExtType: + cls = self.types[obj.code] + return cls(self, (obj.code, obj.data)) + if decode: + obj = decode_if_bytes(obj, decode) + return obj + + def _to_nvim(self, obj): + if isinstance(obj, Remote): + return ExtType(*obj.code_data) + return obj + + def _get_lua_private(self): + if not getattr(self._session, "_has_lua", False): + self.exec_lua(lua_module, self.channel_id) + self._session._has_lua = True + return getattr(self.lua, "_pynvim_{}".format(self.channel_id)) + + def request(self, name, *args, **kwargs): + r"""Send an API request or notification to nvim. + + It is rarely needed to call this function directly, as most API + functions have python wrapper functions. The `api` object can + be also be used to call API functions as methods: + + vim.api.err_write('ERROR\n', async_=True) + vim.current.buffer.api.get_mark('.') + + is equivalent to + + vim.request('nvim_err_write', 'ERROR\n', async_=True) + vim.request('nvim_buf_get_mark', vim.current.buffer, '.') + + + Normally a blocking request will be sent. If the `async_` flag is + present and True, a asynchronous notification is sent instead. This + will never block, and the return value or error is ignored. + """ + if (self._session._loop_thread is not None + and threading.current_thread() != self._session._loop_thread): + + msg = ("Request from non-main thread.\n" + "Requests from different threads should be wrapped " + "with nvim.async_call(cb, ...) \n{}\n" + .format('\n'.join(format_stack(None, 5)[:-1]))) + + self.async_call(self._err_cb, msg) + raise NvimError("request from non-main thread") + + decode = kwargs.pop('decode', self._decode) + args = walk(self._to_nvim, args) + res = self._session.request(name, *args, **kwargs) + return walk(self._from_nvim, res, decode=decode) + + def next_message(self): + """Block until a message(request or notification) is available. + + If any messages were previously enqueued, return the first in queue. + If not, run the event loop until one is received. + """ + msg = self._session.next_message() + if msg: + return walk(self._from_nvim, msg) + + def run_loop(self, request_cb, notification_cb, + setup_cb=None, err_cb=None): + """Run the event loop to receive requests and notifications from Nvim. + + This should not be called from a plugin running in the host, which + already runs the loop and dispatches events to plugins. + """ + if err_cb is None: + err_cb = sys.stderr.write + self._err_cb = err_cb + + def filter_request_cb(name, args): + name = self._from_nvim(name) + args = walk(self._from_nvim, args) + try: + result = request_cb(name, args) + except Exception: + msg = ("error caught in request handler '{} {}'\n{}\n\n" + .format(name, args, format_exc_skip(1))) + self._err_cb(msg) + raise + return walk(self._to_nvim, result) + + def filter_notification_cb(name, args): + name = self._from_nvim(name) + args = walk(self._from_nvim, args) + try: + notification_cb(name, args) + except Exception: + msg = ("error caught in notification handler '{} {}'\n{}\n\n" + .format(name, args, format_exc_skip(1))) + self._err_cb(msg) + raise + + self._session.run(filter_request_cb, filter_notification_cb, setup_cb) + + def stop_loop(self): + """Stop the event loop being started with `run_loop`.""" + self._session.stop() + + def close(self): + """Close the nvim session and release its resources.""" + self._session.close() + + def __enter__(self): + """Enter nvim session as a context manager.""" + return self + + def __exit__(self, *exc_info): + """Exit nvim session as a context manager. + + Closes the event loop. + """ + self.close() + + def with_decode(self, decode=True): + """Initialize a new Nvim instance.""" + return Nvim(self._session, self.channel_id, + self.metadata, self.types, decode, self._err_cb) + + def ui_attach(self, width, height, rgb=None, **kwargs): + """Register as a remote UI. + + After this method is called, the client will receive redraw + notifications. + """ + options = kwargs + if rgb is not None: + options['rgb'] = rgb + return self.request('nvim_ui_attach', width, height, options) + + def ui_detach(self): + """Unregister as a remote UI.""" + return self.request('nvim_ui_detach') + + def ui_try_resize(self, width, height): + """Notify nvim that the client window has resized. + + If possible, nvim will send a redraw request to resize. + """ + return self.request('ui_try_resize', width, height) + + def subscribe(self, event): + """Subscribe to a Nvim event.""" + return self.request('nvim_subscribe', event) + + def unsubscribe(self, event): + """Unsubscribe to a Nvim event.""" + return self.request('nvim_unsubscribe', event) + + def command(self, string, **kwargs): + """Execute a single ex command.""" + return self.request('nvim_command', string, **kwargs) + + def command_output(self, string): + """Execute a single ex command and return the output.""" + return self.request('nvim_command_output', string) + + def eval(self, string, **kwargs): + """Evaluate a vimscript expression.""" + return self.request('nvim_eval', string, **kwargs) + + def call(self, name, *args, **kwargs): + """Call a vimscript function.""" + return self.request('nvim_call_function', name, args, **kwargs) + + def exec_lua(self, code, *args, **kwargs): + """Execute lua code. + + Additional parameters are available as `...` inside the lua chunk. + Only statements are executed. To evaluate an expression, prefix it + with `return`: `return my_function(...)` + + There is a shorthand syntax to call lua functions with arguments: + + nvim.lua.func(1,2) + nvim.lua.mymod.myfunction(data, async_=True) + + is equivalent to + + nvim.exec_lua("return func(...)", 1, 2) + nvim.exec_lua("mymod.myfunction(...)", data, async_=True) + + Note that with `async_=True` there is no return value. + """ + return self.request('nvim_execute_lua', code, args, **kwargs) + + def strwidth(self, string): + """Return the number of display cells `string` occupies. + + Tab is counted as one cell. + """ + return self.request('nvim_strwidth', string) + + def list_runtime_paths(self): + """Return a list of paths contained in the 'runtimepath' option.""" + return self.request('nvim_list_runtime_paths') + + def foreach_rtp(self, cb): + """Invoke `cb` for each path in 'runtimepath'. + + Call the given callable for each path in 'runtimepath' until either + callable returns something but None, the exception is raised or there + are no longer paths. If stopped in case callable returned non-None, + vim.foreach_rtp function returns the value returned by callable. + """ + for path in self.request('nvim_list_runtime_paths'): + try: + if cb(path) is not None: + break + except Exception: + break + + def chdir(self, dir_path): + """Run os.chdir, then all appropriate vim stuff.""" + os_chdir(dir_path) + return self.request('nvim_set_current_dir', dir_path) + + def feedkeys(self, keys, options='', escape_csi=True): + """Push `keys` to Nvim user input buffer. + + Options can be a string with the following character flags: + - 'm': Remap keys. This is default. + - 'n': Do not remap keys. + - 't': Handle keys as if typed; otherwise they are handled as if coming + from a mapping. This matters for undo, opening folds, etc. + """ + return self.request('nvim_feedkeys', keys, options, escape_csi) + + def input(self, bytes): + """Push `bytes` to Nvim low level input buffer. + + Unlike `feedkeys()`, this uses the lowest level input buffer and the + call is not deferred. It returns the number of bytes actually + written(which can be less than what was requested if the buffer is + full). + """ + return self.request('nvim_input', bytes) + + def replace_termcodes(self, string, from_part=False, do_lt=True, + special=True): + r"""Replace any terminal code strings by byte sequences. + + The returned sequences are Nvim's internal representation of keys, + for example: + + -> '\x1b' + -> '\r' + -> '\x0c' + -> '\x80ku' + + The returned sequences can be used as input to `feedkeys`. + """ + return self.request('nvim_replace_termcodes', string, + from_part, do_lt, special) + + def out_write(self, msg, **kwargs): + r"""Print `msg` as a normal message. + + The message is buffered (won't display) until linefeed ("\n"). + """ + return self.request('nvim_out_write', msg, **kwargs) + + def err_write(self, msg, **kwargs): + r"""Print `msg` as an error message. + + The message is buffered (won't display) until linefeed ("\n"). + """ + if self._thread_invalid(): + # special case: if a non-main thread writes to stderr + # i.e. due to an uncaught exception, pass it through + # without raising an additional exception. + self.async_call(self.err_write, msg, **kwargs) + return + return self.request('nvim_err_write', msg, **kwargs) + + def _thread_invalid(self): + return (self._session._loop_thread is not None + and threading.current_thread() != self._session._loop_thread) + + def quit(self, quit_command='qa!'): + """Send a quit command to Nvim. + + By default, the quit command is 'qa!' which will make Nvim quit without + saving anything. + """ + try: + self.command(quit_command) + except OSError: + # sending a quit command will raise an IOError because the + # connection is closed before a response is received. Safe to + # ignore it. + pass + + def new_highlight_source(self): + """Return new src_id for use with Buffer.add_highlight.""" + return self.current.buffer.add_highlight("", 0, src_id=0) + + def async_call(self, fn, *args, **kwargs): + """Schedule `fn` to be called by the event loop soon. + + This function is thread-safe, and is the only way code not + on the main thread could interact with nvim api objects. + + This function can also be called in a synchronous + event handler, just before it returns, to defer execution + that shouldn't block neovim. + """ + call_point = ''.join(format_stack(None, 5)[:-1]) + + def handler(): + try: + fn(*args, **kwargs) + except Exception as err: + msg = ("error caught while executing async callback:\n" + "{!r}\n{}\n \nthe call was requested at\n{}" + .format(err, format_exc_skip(1), call_point)) + self._err_cb(msg) + raise + self._session.threadsafe_call(handler) + + +class Buffers(object): + + """Remote NVim buffers. + + Currently the interface for interacting with remote NVim buffers is the + `nvim_list_bufs` msgpack-rpc function. Most methods fetch the list of + buffers from NVim. + + Conforms to *python-buffers*. + """ + + def __init__(self, nvim): + """Initialize a Buffers object with Nvim object `nvim`.""" + self._fetch_buffers = nvim.api.list_bufs + + def __len__(self): + """Return the count of buffers.""" + return len(self._fetch_buffers()) + + def __getitem__(self, number): + """Return the Buffer object matching buffer number `number`.""" + for b in self._fetch_buffers(): + if b.number == number: + return b + raise KeyError(number) + + def __contains__(self, b): + """Return whether Buffer `b` is a known valid buffer.""" + return isinstance(b, Buffer) and b.valid + + def __iter__(self): + """Return an iterator over the list of buffers.""" + return iter(self._fetch_buffers()) + + +class CompatibilitySession(object): + + """Helper class for API compatibility.""" + + def __init__(self, nvim): + self.threadsafe_call = nvim.async_call + + +class Current(object): + + """Helper class for emulating vim.current from python-vim.""" + + def __init__(self, session): + self._session = session + self.range = None + + @property + def line(self): + return self._session.request('nvim_get_current_line') + + @line.setter + def line(self, line): + return self._session.request('nvim_set_current_line', line) + + @line.deleter + def line(self): + return self._session.request('nvim_del_current_line') + + @property + def buffer(self): + return self._session.request('nvim_get_current_buf') + + @buffer.setter + def buffer(self, buffer): + return self._session.request('nvim_set_current_buf', buffer) + + @property + def window(self): + return self._session.request('nvim_get_current_win') + + @window.setter + def window(self, window): + return self._session.request('nvim_set_current_win', window) + + @property + def tabpage(self): + return self._session.request('nvim_get_current_tabpage') + + @tabpage.setter + def tabpage(self, tabpage): + return self._session.request('nvim_set_current_tabpage', tabpage) + + +class Funcs(object): + + """Helper class for functional vimscript interface.""" + + def __init__(self, nvim): + self._nvim = nvim + + def __getattr__(self, name): + return partial(self._nvim.call, name) + + +class LuaFuncs(object): + + """Wrapper to allow lua functions to be called like python methods.""" + + def __init__(self, nvim, name=""): + self._nvim = nvim + self.name = name + + def __getattr__(self, name): + """Return wrapper to named api method.""" + prefix = self.name + "." if self.name else "" + return LuaFuncs(self._nvim, prefix + name) + + def __call__(self, *args, **kwargs): + # first new function after keyword rename, be a bit noisy + if 'async' in kwargs: + raise ValueError('"async" argument is not allowed. ' + 'Use "async_" instead.') + async_ = kwargs.get('async_', False) + pattern = "return {}(...)" if not async_ else "{}(...)" + code = pattern.format(self.name) + return self._nvim.exec_lua(code, *args, **kwargs) diff --git a/.local/lib/python2.7/site-packages/pynvim/api/nvim.pyc b/.local/lib/python2.7/site-packages/pynvim/api/nvim.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7370d5861d8623cb5610a7509c5ead512e9e149e GIT binary patch literal 27067 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/api/window.py b/.local/lib/python2.7/site-packages/pynvim/api/window.py new file mode 100644 index 00000000..14810609 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/api/window.py @@ -0,0 +1,72 @@ +"""API for working with Nvim windows.""" +from pynvim.api.common import Remote + + +__all__ = ('Window') + + +class Window(Remote): + + """A remote Nvim window.""" + + _api_prefix = "nvim_win_" + + @property + def buffer(self): + """Get the `Buffer` currently being displayed by the window.""" + return self.request('nvim_win_get_buf') + + @property + def cursor(self): + """Get the (row, col) tuple with the current cursor position.""" + return self.request('nvim_win_get_cursor') + + @cursor.setter + def cursor(self, pos): + """Set the (row, col) tuple as the new cursor position.""" + return self.request('nvim_win_set_cursor', pos) + + @property + def height(self): + """Get the window height in rows.""" + return self.request('nvim_win_get_height') + + @height.setter + def height(self, height): + """Set the window height in rows.""" + return self.request('nvim_win_set_height', height) + + @property + def width(self): + """Get the window width in rows.""" + return self.request('nvim_win_get_width') + + @width.setter + def width(self, width): + """Set the window height in rows.""" + return self.request('nvim_win_set_width', width) + + @property + def row(self): + """0-indexed, on-screen window position(row) in display cells.""" + return self.request('nvim_win_get_position')[0] + + @property + def col(self): + """0-indexed, on-screen window position(col) in display cells.""" + return self.request('nvim_win_get_position')[1] + + @property + def tabpage(self): + """Get the `Tabpage` that contains the window.""" + return self.request('nvim_win_get_tabpage') + + @property + def valid(self): + """Return True if the window still exists.""" + return self.request('nvim_win_is_valid') + + @property + def number(self): + """Get the window number.""" + return self.request('nvim_win_get_number') diff --git a/.local/lib/python2.7/site-packages/pynvim/api/window.pyc b/.local/lib/python2.7/site-packages/pynvim/api/window.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8f84fb0223f0f01ab09b59a608c1075813a18f5 GIT binary patch literal 3739 zcmcgv+iu%N5M5E0e2>%g8lWu}c`1Y1Qd$&EZzz%!ZPAyYpaK;23q_G5X&s7Wxy#4` z@|ONkKc(N&4`|OUNm+_w)CMfc*x?R$c6ZL4;q1Ek&*9#~zxsYCs$Ub&M`-#>h)9T2 z$cBg<5jVud5vPu5L``wp6p-YIA;z}EpF+G6;`h@n5w%3mZS(wl5RZTTMGn(kPSgCk zN=9<3%ve5sp(f}hQ99Kf^)G&I1Ga`|c{E84+3s)FV(yoN(I;s7ZwP{4*cj4b@8At# zYsdNlwPn?2t+oZV#o2c4C=Bq%y2^e--4V274che-yn(@Xt?mliwFWy2Z(y)nt9#ad zuU7Z1x?igYRz0ZIL#rOv>Mh~*+*=IoU5Ljrw=q}@Q^)LLBthJK#LW*mT--P&KcMMD zh?hc~S+0Pn=kk#L8scX%(u_&=pA^F(<$W0zc}|ImXL3NyNu+cZ2Q!M~U}h~#YC7gN zX3zH=k?{w`uw-f*BRTz1kT&IuE#8gdp^K-mLjQzbcbrbBdzR{g@&{jaJ8>EYaW__j zZZteBRM2mrw=~!+z2%-CEg-xGy$rIZ_bMQn$Q6)tBE17F zw;mRG<$DVlugW6FLj2D-6Dc!FdtFIfNtmZqMb~pudH9aDp?P&M7*UX>y{&oG7Vo0`rQ?73w}y zTb)ZXq&UWh%4g#e$90KT7^sTyCdx5`fs3EvacMcai7?nhY9$OFFReK4o6BxS3~%^8 zcq!sbE+C&`PW|cjp9O;~7*QVwPGE2dCniuydHmE@j(1?cM6xO8Yz{16ZK_Qii}O9qsfn!) zourryD1XC=S`KUu7+)95J%7AF=5p;ae39_|B$$xzn?0*c(x`}8W#)Z9N<;MbxsOYz zpXD@E=XPF}ry1pD=Gp&KcqMx=MJ+az+hfz?Jv^?|9$(cwE?M6DEbc;Flw{kx!3(m- z^?)7HA40Sp{yS~|#x-!lx&(QP+wH`~qs0C=i!^#A|> literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/compat.py b/.local/lib/python2.7/site-packages/pynvim/compat.py new file mode 100644 index 00000000..01e45db1 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/compat.py @@ -0,0 +1,57 @@ +"""Code for compatibility across Python versions.""" + +import sys +import warnings +from imp import find_module as original_find_module + + +IS_PYTHON3 = sys.version_info >= (3, 0) + + +if IS_PYTHON3: + def find_module(fullname, path): + """Compatibility wrapper for imp.find_module. + + Automatically decodes arguments of find_module, in Python3 + they must be Unicode + """ + if isinstance(fullname, bytes): + fullname = fullname.decode() + if isinstance(path, bytes): + path = path.decode() + elif isinstance(path, list): + newpath = [] + for element in path: + if isinstance(element, bytes): + newpath.append(element.decode()) + else: + newpath.append(element) + path = newpath + return original_find_module(fullname, path) + + # There is no 'long' type in Python3 just int + long = int + unicode_errors_default = 'surrogateescape' +else: + find_module = original_find_module + unicode_errors_default = 'ignore' + +NUM_TYPES = (int, long, float) + + +def check_async(async_, kwargs, default): + """Return a value of 'async' in kwargs or default when async_ is None. + + This helper function exists for backward compatibility (See #274). + It shows a warning message when 'async' in kwargs is used to note users. + """ + if async_ is not None: + return async_ + elif 'async' in kwargs: + warnings.warn( + '"async" attribute is deprecated. Use "async_" instead.', + DeprecationWarning, + ) + return kwargs.pop('async') + else: + return default diff --git a/.local/lib/python2.7/site-packages/pynvim/compat.pyc b/.local/lib/python2.7/site-packages/pynvim/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4735a3f0661eb4e244cac51949f9a186e4a06cec GIT binary patch literal 1807 zcmb_dUvC>l5TCts&b8~1fS}?Dt-?bMDreLpQltvCq)7CE5ZQ@JjnHwv8`~S-?H;>( zaV;fJ;Unh73+4$osI`f@v493;GAhBlv~9bO7(bv zGKL>*>{3a7hS~@vO)UPV-{Fvvp>;0iLgq=S^149baul>63y5^ubwFS9I}rPo3KHA0NX-=rxEo-Y?-i zfYT0~hpm@O2JGkWZ=~)1C8=G|1$6zE3y9oNa1)=N`ITZm_*YHVI;|?yzFMNJ;#0+*=-P!{;)a*Cv3!R7L<;BP z`fwPzV)ls$Bc!pZ%#gwdm~AW?>rR_Xt!qIcjP)`Xy3FmnBvV=}giMR%Rvbg8Z0``6 z*F_=I61_PgVrjc1mAJmElscD5}7y5VKL`LG&=* z9~oislPb+t=>iSO<(Vi)4e;V>Gj-Y%`95s6tf&RjQhOkCc(cp_Y?9mJn78pzj zArrEk`1+VX$<-KbttC(SSz6TS+Ic@U8=2jAom{P{(bQv2ji0A=VflKAr0f(DE(||Z z5?inwFKNHT!b7T-nWYKi_?jAKJj7;HCvunnXEKKqME>E!{m(v%JtkgQZkB3I5aXmR zg+y0$i$bE~*i7Trdh#+e6_kJfxnx$b#(kEhmZF{??JY;&xr%vAe4 z<|hVuqm=AX{>EaO$A?1)M~@$uu18fHn()%u`TZ#$Dn`JvL$A##OMAog<*DyKr~<-HeeA8SvS}YhVGHOdGm&E(bh+nB)Q6x z#3y1lX6)eVH}qt9gpd6IJDj)AY9i!Z`H6lpNse9}fAihpqsBtoW{8zs*n4D9H*Z0L zgnn(3wg|py^FmRVdZcuC@@;bb>gemq*qPi^=uM8Q@9C4~;s4V8H}E4H1p}(kZnzUh OtoI(RAYxIl6aE7*8@z@9 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.py new file mode 100644 index 00000000..8da22e04 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.py @@ -0,0 +1,45 @@ +"""Msgpack-rpc subpackage. + +This package implements a msgpack-rpc client. While it was designed for +handling some Nvim particularities(server->client requests for example), the +code here should work with other msgpack-rpc servers. +""" +from pynvim.msgpack_rpc.async_session import AsyncSession +from pynvim.msgpack_rpc.event_loop import EventLoop +from pynvim.msgpack_rpc.msgpack_stream import MsgpackStream +from pynvim.msgpack_rpc.session import ErrorResponse, Session +from pynvim.util import get_client_info + + +__all__ = ('tcp_session', 'socket_session', 'stdio_session', 'child_session', + 'ErrorResponse') + + +def session(transport_type='stdio', *args, **kwargs): + loop = EventLoop(transport_type, *args, **kwargs) + msgpack_stream = MsgpackStream(loop) + async_session = AsyncSession(msgpack_stream) + session = Session(async_session) + session.request(b'nvim_set_client_info', + *get_client_info('client', 'remote', {}), async_=True) + return session + + +def tcp_session(address, port=7450): + """Create a msgpack-rpc session from a tcp address/port.""" + return session('tcp', address, port) + + +def socket_session(path): + """Create a msgpack-rpc session from a unix domain socket.""" + return session('socket', path) + + +def stdio_session(): + """Create a msgpack-rpc session from stdin/stdout.""" + return session('stdio') + + +def child_session(argv): + """Create a msgpack-rpc session from a new Nvim instance.""" + return session('child', argv) diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de1dbb53fbd8dba1c92032f256f5dd84841d14fc GIT binary patch literal 2478 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 O_Px9Q%icr(e)(^3$^N7O literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.py new file mode 100644 index 00000000..50f704e1 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.py @@ -0,0 +1,24 @@ +"""Event loop abstraction subpackage. + +Tries to use pyuv as a backend, falling back to the asyncio implementation. +""" + +from pynvim.compat import IS_PYTHON3 + +# on python3 we only support asyncio, as we expose it to plugins +if IS_PYTHON3: + from pynvim.msgpack_rpc.event_loop.asyncio import AsyncioEventLoop + EventLoop = AsyncioEventLoop +else: + try: + # libuv is fully implemented in C, use it when available + from pynvim.msgpack_rpc.event_loop.uv import UvEventLoop + EventLoop = UvEventLoop + except ImportError: + # asyncio(trollius on python 2) is pure python and should be more + # portable across python implementations + from pynvim.msgpack_rpc.event_loop.asyncio import AsyncioEventLoop + EventLoop = AsyncioEventLoop + + +__all__ = ('EventLoop') diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4fe615640f28702b20192f8440424b2db23b5d6 GIT binary patch literal 687 zcmah`O^?$s5FICJyA7(;69-PdpzQ$?1VYOJA&^*!mC%B^i-2%2Zem)q{!;8j2)2vS>zN-oo%;8_PhAK~JEXU<}O&KAU66#1UNO(Eb8KNNoI%76iUDBdDg( zjNxK2iDDeWX)jEm%34SH%7>QML0Ut7w{pC`;%ial`DH7Gr@_+B3+jfhr`%IcSC}A7 z^N9Z7N=dWc5-}}o1ZE7TmX=EGl+gGFk9~_=-r`vhd^zL@XBX__*UNVw&Y$hLIdX4y zrCVk1QP?hW4yG1l0cu`t8C8%!^CQCsbJSRw)8;epnE9cN^% zs|yj=z~UN;z4B$$xJ+XW{clazFO!%VMV@JA+i=>ph&w^J9>x|Jf&=((=$0F+MfubE zPP9*6l!dZ2SEZ7x(hXr_&C}wf^fHLY`+wn)j}w)DNiPr5OU9&;fw2P1kFftsZJSPs aR~g>@eS~o`Pse0Vrb(L2Nls=dV)_T{#IU6R literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py new file mode 100644 index 00000000..997095e6 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py @@ -0,0 +1,163 @@ +"""Event loop implementation that uses the `asyncio` standard module. + +The `asyncio` module was added to python standard library on 3.4, and it +provides a pure python implementation of an event loop library. It is used +as a fallback in case pyuv is not available(on python implementations other +than CPython). + +Earlier python versions are supported through the `trollius` package, which +is a backport of `asyncio` that works on Python 2.6+. +""" +from __future__ import absolute_import + +import logging +import os +import sys +from collections import deque + +try: + # For python 3.4+, use the standard library module + import asyncio +except (ImportError, SyntaxError): + # Fallback to trollius + import trollius as asyncio + +from pynvim.msgpack_rpc.event_loop.base import BaseEventLoop + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + +loop_cls = asyncio.SelectorEventLoop +if os.name == 'nt': + from asyncio.windows_utils import PipeHandle + import msvcrt + + # On windows use ProactorEventLoop which support pipes and is backed by the + # more powerful IOCP facility + # NOTE: we override in the stdio case, because it doesn't work. + loop_cls = asyncio.ProactorEventLoop + + +class AsyncioEventLoop(BaseEventLoop, asyncio.Protocol, + asyncio.SubprocessProtocol): + + """`BaseEventLoop` subclass that uses `asyncio` as a backend.""" + + def connection_made(self, transport): + """Used to signal `asyncio.Protocol` of a successful connection.""" + self._transport = transport + self._raw_transport = transport + if isinstance(transport, asyncio.SubprocessTransport): + self._transport = transport.get_pipe_transport(0) + + def connection_lost(self, exc): + """Used to signal `asyncio.Protocol` of a lost connection.""" + self._on_error(exc.args[0] if exc else 'EOF') + + def data_received(self, data): + """Used to signal `asyncio.Protocol` of incoming data.""" + if self._on_data: + self._on_data(data) + return + self._queued_data.append(data) + + def pipe_connection_lost(self, fd, exc): + """Used to signal `asyncio.SubprocessProtocol` of a lost connection.""" + self._on_error(exc.args[0] if exc else 'EOF') + + def pipe_data_received(self, fd, data): + """Used to signal `asyncio.SubprocessProtocol` of incoming data.""" + if fd == 2: # stderr fd number + self._on_stderr(data) + elif self._on_data: + self._on_data(data) + else: + self._queued_data.append(data) + + def process_exited(self): + """Used to signal `asyncio.SubprocessProtocol` when the child exits.""" + self._on_error('EOF') + + def _init(self): + self._loop = loop_cls() + self._queued_data = deque() + self._fact = lambda: self + self._raw_transport = None + + def _connect_tcp(self, address, port): + coroutine = self._loop.create_connection(self._fact, address, port) + self._loop.run_until_complete(coroutine) + + def _connect_socket(self, path): + if os.name == 'nt': + coroutine = self._loop.create_pipe_connection(self._fact, path) + else: + coroutine = self._loop.create_unix_connection(self._fact, path) + self._loop.run_until_complete(coroutine) + + def _connect_stdio(self): + if os.name == 'nt': + pipe = PipeHandle(msvcrt.get_osfhandle(sys.stdin.fileno())) + else: + pipe = sys.stdin + coroutine = self._loop.connect_read_pipe(self._fact, pipe) + self._loop.run_until_complete(coroutine) + pass # replaces next logging statement + #debug("native stdin connection successful") + + # Make sure subprocesses don't clobber stdout, + # send the output to stderr instead. + rename_stdout = os.dup(sys.stdout.fileno()) + os.dup2(sys.stderr.fileno(), sys.stdout.fileno()) + + if os.name == 'nt': + pipe = PipeHandle(msvcrt.get_osfhandle(rename_stdout)) + else: + pipe = os.fdopen(rename_stdout, 'wb') + coroutine = self._loop.connect_write_pipe(self._fact, pipe) + self._loop.run_until_complete(coroutine) + pass # replaces next logging statement + #debug("native stdout connection successful") + + def _connect_child(self, argv): + if os.name != 'nt': + self._child_watcher = asyncio.get_child_watcher() + self._child_watcher.attach_loop(self._loop) + coroutine = self._loop.subprocess_exec(self._fact, *argv) + self._loop.run_until_complete(coroutine) + + def _start_reading(self): + pass + + def _send(self, data): + self._transport.write(data) + + def _run(self): + while self._queued_data: + self._on_data(self._queued_data.popleft()) + self._loop.run_forever() + + def _stop(self): + self._loop.stop() + + def _close(self): + if self._raw_transport is not None: + self._raw_transport.close() + self._loop.close() + + def _threadsafe_call(self, fn): + self._loop.call_soon_threadsafe(fn) + + def _setup_signals(self, signals): + if os.name == 'nt': + # add_signal_handler is not supported in win32 + self._signals = [] + return + + self._signals = list(signals) + for signum in self._signals: + self._loop.add_signal_handler(signum, self._on_signal, signum) + + def _teardown_signals(self): + for signum in self._signals: + self._loop.remove_signal_handler(signum) diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d2da3bdc89ed50bb815ee74f77e90b93b32db7e GIT binary patch literal 8311 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 b*=n~|y^F0?{9W;$1DlXbmS&gQOWuD04%NOn literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.py new file mode 100644 index 00000000..cabb8c63 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.py @@ -0,0 +1,192 @@ +"""Common code for event loop implementations.""" +import logging +import signal +import threading + + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + + +# When signals are restored, the event loop library may reset SIGINT to SIG_DFL +# which exits the program. To be able to restore the python interpreter to it's +# default state, we keep a reference to the default handler +default_int_handler = signal.getsignal(signal.SIGINT) +main_thread = threading.current_thread() + + +class BaseEventLoop(object): + + """Abstract base class for all event loops. + + Event loops act as the bottom layer for Nvim sessions created by this + library. They hide system/transport details behind a simple interface for + reading/writing bytes to the connected Nvim instance. + + This class exposes public methods for interacting with the underlying + event loop and delegates implementation-specific work to the following + methods, which subclasses are expected to implement: + + - `_init()`: Implementation-specific initialization + - `_connect_tcp(address, port)`: connect to Nvim using tcp/ip + - `_connect_socket(path)`: Same as tcp, but use a UNIX domain socket or + named pipe. + - `_connect_stdio()`: Use stdin/stdout as the connection to Nvim + - `_connect_child(argv)`: Use the argument vector `argv` to spawn an + embedded Nvim that has its stdin/stdout connected to the event loop. + - `_start_reading()`: Called after any of _connect_* methods. Can be used + to perform any post-connection setup or validation. + - `_send(data)`: Send `data`(byte array) to Nvim. The data is only + - `_run()`: Runs the event loop until stopped or the connection is closed. + calling the following methods when some event happens: + actually sent when the event loop is running. + - `_on_data(data)`: When Nvim sends some data. + - `_on_signal(signum)`: When a signal is received. + - `_on_error(message)`: When a non-recoverable error occurs(eg: + connection lost) + - `_stop()`: Stop the event loop + - `_interrupt(data)`: Like `stop()`, but may be called from other threads + this. + - `_setup_signals(signals)`: Add implementation-specific listeners for + for `signals`, which is a list of OS-specific signal numbers. + - `_teardown_signals()`: Removes signal listeners set by `_setup_signals` + """ + + def __init__(self, transport_type, *args): + """Initialize and connect the event loop instance. + + The only arguments are the transport type and transport-specific + configuration, like this: + + >>> BaseEventLoop('tcp', '127.0.0.1', 7450) + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('socket', '/tmp/nvim-socket') + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('stdio') + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('child', + ['nvim', '--embed', '--headless', '-u', 'NONE']) + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + + This calls the implementation-specific initialization + `_init`, one of the `_connect_*` methods(based on `transport_type`) + and `_start_reading()` + """ + self._transport_type = transport_type + self._signames = dict((k, v) for v, k in signal.__dict__.items() + if v.startswith('SIG')) + self._on_data = None + self._error = None + self._init() + try: + getattr(self, '_connect_{}'.format(transport_type))(*args) + except Exception as e: + self.close() + raise e + self._start_reading() + + def connect_tcp(self, address, port): + """Connect to tcp/ip `address`:`port`. Delegated to `_connect_tcp`.""" + pass # replaces next logging statement + #info('Connecting to TCP address: %s:%d', address, port) + self._connect_tcp(address, port) + + def connect_socket(self, path): + """Connect to socket at `path`. Delegated to `_connect_socket`.""" + pass # replaces next logging statement + #info('Connecting to %s', path) + self._connect_socket(path) + + def connect_stdio(self): + """Connect using stdin/stdout. Delegated to `_connect_stdio`.""" + pass # replaces next logging statement + #info('Preparing stdin/stdout for streaming data') + self._connect_stdio() + + def connect_child(self, argv): + """Connect a new Nvim instance. Delegated to `_connect_child`.""" + pass # replaces next logging statement + #info('Spawning a new nvim instance') + self._connect_child(argv) + + def send(self, data): + """Queue `data` for sending to Nvim.""" + pass # replaces next logging statement + #debug("Sending '%s'", data) + self._send(data) + + def threadsafe_call(self, fn): + """Call a function in the event loop thread. + + This is the only safe way to interact with a session from other + threads. + """ + self._threadsafe_call(fn) + + def run(self, data_cb): + """Run the event loop.""" + if self._error: + err = self._error + if isinstance(self._error, KeyboardInterrupt): + # KeyboardInterrupt is not destructive(it may be used in + # the REPL). + # After throwing KeyboardInterrupt, cleanup the _error field + # so the loop may be started again + self._error = None + raise err + self._on_data = data_cb + if threading.current_thread() == main_thread: + self._setup_signals([signal.SIGINT, signal.SIGTERM]) + pass # replaces next logging statement + #debug('Entering event loop') + self._run() + pass # replaces next logging statement + #debug('Exited event loop') + if threading.current_thread() == main_thread: + self._teardown_signals() + signal.signal(signal.SIGINT, default_int_handler) + self._on_data = None + + def stop(self): + """Stop the event loop.""" + self._stop() + pass # replaces next logging statement + #debug('Stopped event loop') + + def close(self): + """Stop the event loop.""" + self._close() + pass # replaces next logging statement + #debug('Closed event loop') + + def _on_signal(self, signum): + msg = 'Received {}'.format(self._signames[signum]) + pass # replaces next logging statement + #debug(msg) + if signum == signal.SIGINT and self._transport_type == 'stdio': + # When the transport is stdio, we are probably running as a Nvim + # child process. In that case, we don't want to be killed by + # ctrl+C + return + cls = Exception + if signum == signal.SIGINT: + cls = KeyboardInterrupt + self._error = cls(msg) + self.stop() + + def _on_error(self, error): + pass # replaces next logging statement + #debug(error) + self._error = OSError(error) + self.stop() + + def _on_interrupt(self): + self.stop() diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/event_loop/base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c698f6666e36ce88db96a9a700f2de0d708ebf02 GIT binary patch literal 8381 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.py new file mode 100644 index 00000000..1a192f25 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.py @@ -0,0 +1,68 @@ +"""Msgpack handling in the event loop pipeline.""" +import logging + +from msgpack import Packer, Unpacker + +from pynvim.compat import unicode_errors_default + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + + +class MsgpackStream(object): + + """Two-way msgpack stream that wraps a event loop byte stream. + + This wraps the event loop interface for reading/writing bytes and + exposes an interface for reading/writing msgpack documents. + """ + + def __init__(self, event_loop): + """Wrap `event_loop` on a msgpack-aware interface.""" + self.loop = event_loop + self._packer = Packer(unicode_errors=unicode_errors_default) + self._unpacker = Unpacker(unicode_errors=unicode_errors_default) + self._message_cb = None + + def threadsafe_call(self, fn): + """Wrapper around `BaseEventLoop.threadsafe_call`.""" + self.loop.threadsafe_call(fn) + + def send(self, msg): + """Queue `msg` for sending to Nvim.""" + pass # replaces next logging statement + #debug('sent %s', msg) + self.loop.send(self._packer.pack(msg)) + + def run(self, message_cb): + """Run the event loop to receive messages from Nvim. + + While the event loop is running, `message_cb` will be called whenever + a message has been successfully parsed from the input stream. + """ + self._message_cb = message_cb + self.loop.run(self._on_data) + self._message_cb = None + + def stop(self): + """Stop the event loop.""" + self.loop.stop() + + def close(self): + """Close the event loop.""" + self.loop.close() + + def _on_data(self, data): + self._unpacker.feed(data) + while True: + try: + pass # replaces next logging statement + #debug('waiting for message...') + msg = next(self._unpacker) + pass # replaces next logging statement + #debug('received message: %s', msg) + self._message_cb(msg) + except StopIteration: + pass # replaces next logging statement + #debug('unpacker needs more data...') + break diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/msgpack_stream.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbce56cbdd3a0580d9f25329c0e0919da1345c2 GIT binary patch literal 3267 zcmcguO^+Kz5Um+|y|I(c<^yu!t1n1KN^As&AcO!V;($a}$!uW3m+|aO+n&w1$4vLc zSt)P{e~4efksrekfcJW4y}LmQC+yuWw|ly4s$RXS>ds$#gZsZv<5b#D2j5>~*k2(s zkqKlVStvyy6HM^mks_33MdIZg^m{`sx*7(2cn6|3d0J*V)>Tzj zHqP`csSD@!@Th&~p{sPV+`z+=4>0T_2n~2(H)Kd)U_Bs#<(zbh6DK=_hLav$?N*X6x+a;lcC*VdZ=hZCpPRkE@wx#;=vsne?2Ga3vOK2I09 zZFjzgQf{2CW=X2mtgI9~%Yf#1UFD9bQWKP$%xlpvR;Bg70r#7Zo!Oa{X}v^1?8u)_ z83GPc>LG^x9O7jlFGXVD599)IAtD}dr6UfQU0eZjq2CO^NC)b%V~8Vwpr$_fF@rx< zr2!_b9ru!TQt5M>NA5b#T#odCM;k8`p@InC5_!syb8$nH$kU|Hg}P;qKXFhR?XGfp zsjW@sI!=!pzEPjm#mo&bIk#_!U*d)R0kiRyXa>|4U`TZkUln5Zw(B8$x`9hnwsq zA}HcM{{Tk|1oPDQgO(+K;z(5gs}=){N~b!1u2q{MR?Vt%*+A6PDAuW?MPBIF3pq+x zRT~3P?*ivdf=$&rFA8<671^dUwO(k06svr#p*9qNW;fb|#YSzEta!&)6U~5o^oxi?3KSt0!`*#Gy9% zs*RNVrAg1OyhIm8`9AvjwshT&JR3;$NP-}EjD;UDjxxmByLvDrT_SclUy){7XMXau zsb%9<1IX9i YFPb=hNk1*o>IK)rJK>FRKX|Y656{RHR{#J2 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.py b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.py new file mode 100644 index 00000000..446e4673 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.py @@ -0,0 +1,253 @@ +"""Synchronous msgpack-rpc session layer.""" +import logging +import threading +from collections import deque +from traceback import format_exc + +import greenlet + +from pynvim.compat import check_async + +logger = logging.getLogger(__name__) +error, debug, info, warn = (logger.error, logger.debug, logger.info, + logger.warning,) + + +class Session(object): + + """Msgpack-rpc session layer that uses coroutines for a synchronous API. + + This class provides the public msgpack-rpc API required by this library. + It uses the greenlet module to handle requests and notifications coming + from Nvim with a synchronous API. + """ + + def __init__(self, async_session): + """Wrap `async_session` on a synchronous msgpack-rpc interface.""" + self._async_session = async_session + self._request_cb = self._notification_cb = None + self._pending_messages = deque() + self._is_running = False + self._setup_exception = None + self.loop = async_session.loop + self._loop_thread = None + + def threadsafe_call(self, fn, *args, **kwargs): + """Wrapper around `AsyncSession.threadsafe_call`.""" + def handler(): + try: + fn(*args, **kwargs) + except Exception: + pass # replaces next logging statement + #warn("error caught while excecuting async callback\n%s\n", + #format_exc()) + + def greenlet_wrapper(): + gr = greenlet.greenlet(handler) + gr.switch() + + self._async_session.threadsafe_call(greenlet_wrapper) + + def next_message(self): + """Block until a message(request or notification) is available. + + If any messages were previously enqueued, return the first in queue. + If not, run the event loop until one is received. + """ + if self._is_running: + raise Exception('Event loop already running') + if self._pending_messages: + return self._pending_messages.popleft() + self._async_session.run(self._enqueue_request_and_stop, + self._enqueue_notification_and_stop) + if self._pending_messages: + return self._pending_messages.popleft() + + def request(self, method, *args, **kwargs): + """Send a msgpack-rpc request and block until as response is received. + + If the event loop is running, this method must have been called by a + request or notification handler running on a greenlet. In that case, + send the quest and yield to the parent greenlet until a response is + available. + + When the event loop is not running, it will perform a blocking request + like this: + - Send the request + - Run the loop until the response is available + - Put requests/notifications received while waiting into a queue + + If the `async_` flag is present and True, a asynchronous notification + is sent instead. This will never block, and the return value or error + is ignored. + """ + async_ = check_async(kwargs.pop('async_', None), kwargs, False) + if async_: + self._async_session.notify(method, args) + return + + if kwargs: + raise ValueError("request got unsupported keyword argument(s): {}" + .format(', '.join(kwargs.keys()))) + + if self._is_running: + v = self._yielding_request(method, args) + else: + v = self._blocking_request(method, args) + if not v: + # EOF + raise OSError('EOF') + err, rv = v + if err: + pass # replaces next logging statement + #info("'Received error: %s", err) + raise self.error_wrapper(err) + return rv + + def run(self, request_cb, notification_cb, setup_cb=None): + """Run the event loop to receive requests and notifications from Nvim. + + Like `AsyncSession.run()`, but `request_cb` and `notification_cb` are + inside greenlets. + """ + self._request_cb = request_cb + self._notification_cb = notification_cb + self._is_running = True + self._setup_exception = None + self._loop_thread = threading.current_thread() + + def on_setup(): + try: + setup_cb() + except Exception as e: + self._setup_exception = e + self.stop() + + if setup_cb: + # Create a new greenlet to handle the setup function + gr = greenlet.greenlet(on_setup) + gr.switch() + + if self._setup_exception: + pass # replaces next logging statement + #error('Setup error: {}'.format(self._setup_exception)) + raise self._setup_exception + + # Process all pending requests and notifications + while self._pending_messages: + msg = self._pending_messages.popleft() + getattr(self, '_on_{}'.format(msg[0]))(*msg[1:]) + self._async_session.run(self._on_request, self._on_notification) + self._is_running = False + self._request_cb = None + self._notification_cb = None + self._loop_thread = None + + if self._setup_exception: + raise self._setup_exception + + def stop(self): + """Stop the event loop.""" + self._async_session.stop() + + def close(self): + """Close the event loop.""" + self._async_session.close() + + def _yielding_request(self, method, args): + gr = greenlet.getcurrent() + parent = gr.parent + + def response_cb(err, rv): + pass # replaces next logging statement + #debug('response is available for greenlet %s, switching back', gr) + gr.switch(err, rv) + + self._async_session.request(method, args, response_cb) + pass # replaces next logging statement + #debug('yielding from greenlet %s to wait for response', gr) + return parent.switch() + + def _blocking_request(self, method, args): + result = [] + + def response_cb(err, rv): + result.extend([err, rv]) + self.stop() + + self._async_session.request(method, args, response_cb) + self._async_session.run(self._enqueue_request, + self._enqueue_notification) + return result + + def _enqueue_request_and_stop(self, name, args, response): + self._enqueue_request(name, args, response) + self.stop() + + def _enqueue_notification_and_stop(self, name, args): + self._enqueue_notification(name, args) + self.stop() + + def _enqueue_request(self, name, args, response): + self._pending_messages.append(('request', name, args, response,)) + + def _enqueue_notification(self, name, args): + self._pending_messages.append(('notification', name, args,)) + + def _on_request(self, name, args, response): + def handler(): + try: + rv = self._request_cb(name, args) + pass # replaces next logging statement + #debug('greenlet %s finished executing, ' + #+ 'sending %s as response', gr, rv) + response.send(rv) + except ErrorResponse as err: + pass # replaces next logging statement + #warn("error response from request '%s %s': %s", name, + #args, format_exc()) + response.send(err.args[0], error=True) + except Exception as err: + pass # replaces next logging statement + #warn("error caught while processing request '%s %s': %s", name, + #args, format_exc()) + response.send(repr(err) + "\n" + format_exc(5), error=True) + pass # replaces next logging statement + #debug('greenlet %s is now dying...', gr) + + # Create a new greenlet to handle the request + gr = greenlet.greenlet(handler) + pass # replaces next logging statement + #debug('received rpc request, greenlet %s will handle it', gr) + gr.switch() + + def _on_notification(self, name, args): + def handler(): + try: + self._notification_cb(name, args) + pass # replaces next logging statement + #debug('greenlet %s finished executing', gr) + except Exception: + pass # replaces next logging statement + #warn("error caught while processing notification '%s %s': %s", + #name, args, format_exc()) + + pass # replaces next logging statement + #debug('greenlet %s is now dying...', gr) + + gr = greenlet.greenlet(handler) + pass # replaces next logging statement + #debug('received rpc notification, greenlet %s will handle it', gr) + gr.switch() + + +class ErrorResponse(BaseException): + + """Raise this in a request handler to respond with a given error message. + + Unlike when other exceptions are caught, this gives full control off the + error response sent. When "ErrorResponse(msg)" is caught "msg" will be + sent verbatim as the error response.No traceback will be appended. + """ + + pass diff --git a/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.pyc b/.local/lib/python2.7/site-packages/pynvim/msgpack_rpc/session.pyc new file mode 100644 index 0000000000000000000000000000000000000000..066f492982af8958775c61ba0e6a80d8c7b73be8 GIT binary patch literal 9960 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 eRCqDVwb$=osKLl9SX{8{-ne}J>g zJHSP%5a5uz9CC)c)$?|9`R9jJa2#t|ztK#BKm*XC3(zIF0(=Rg1Yd!uz|TO;z|TR< z!7o58z%M~8!LLB9z^_59q2QYpxDEId5GNF$f_MXZ3*YNA)_6~F`(XXW;HI4o?LH>F zNYmZWtNVUu8v8<{UJ(nI1pS0jd7bwvdfx|)3(9MwqBh7p6KHG0E(brSpwPyUNe2ns z5NRBgG{1*9B5o;6`w4Y?400dieO*unX9U+|rsFreIRguIeAv;1ju~CWP%^N++nS5_ zUsr0@&;OB9Mi06vv=+Ag!>piHJ5F&Xg(Z!lqk<`+hYr*w85g3 Z4bi!HS3c^=nXl|Rabi(^DbFh?{sNVNg(3g| literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/plugin/decorators.py b/.local/lib/python2.7/site-packages/pynvim/plugin/decorators.py new file mode 100644 index 00000000..e7cc5280 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/plugin/decorators.py @@ -0,0 +1,175 @@ +"""Decorators used by python host plugin system.""" + +import inspect +import logging + +from pynvim.compat import IS_PYTHON3, unicode_errors_default + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) +__all__ = ('plugin', 'rpc_export', 'command', 'autocmd', 'function', + 'encoding', 'decode', 'shutdown_hook') + + +def plugin(cls): + """Tag a class as a plugin. + + This decorator is required to make the class methods discoverable by the + plugin_load method of the host. + """ + cls._nvim_plugin = True + # the _nvim_bind attribute is set to True by default, meaning that + # decorated functions have a bound Nvim instance as first argument. + # For methods in a plugin-decorated class this is not required, because + # the class initializer will already receive the nvim object. + predicate = lambda fn: hasattr(fn, '_nvim_bind') + for _, fn in inspect.getmembers(cls, predicate): + if IS_PYTHON3: + fn._nvim_bind = False + else: + fn.im_func._nvim_bind = False + return cls + + +def rpc_export(rpc_method_name, sync=False): + """Export a function or plugin method as a msgpack-rpc request handler.""" + def dec(f): + f._nvim_rpc_method_name = rpc_method_name + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = False + return f + return dec + + +def command(name, nargs=0, complete=None, range=None, count=None, bang=False, + register=False, sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim command handler.""" + def dec(f): + f._nvim_rpc_method_name = 'command:{}'.format(name) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = {} + + if range is not None: + opts['range'] = '' if range is True else str(range) + elif count is not None: + opts['count'] = count + + if bang: + opts['bang'] = '' + + if register: + opts['register'] = '' + + if nargs: + opts['nargs'] = nargs + + if complete: + opts['complete'] = complete + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'command', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def autocmd(name, pattern='*', sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim autocommand handler.""" + def dec(f): + f._nvim_rpc_method_name = 'autocmd:{}:{}'.format(name, pattern) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = { + 'pattern': pattern + } + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'autocmd', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def function(name, range=False, sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim function handler.""" + def dec(f): + f._nvim_rpc_method_name = 'function:{}'.format(name) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = {} + + if range: + opts['range'] = '' if range is True else str(range) + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'function', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def shutdown_hook(f): + """Tag a function or method as a shutdown hook.""" + f._nvim_shutdown_hook = True + f._nvim_bind = True + return f + + +def decode(mode=unicode_errors_default): + """Configure automatic encoding/decoding of strings.""" + def dec(f): + f._nvim_decode = mode + return f + return dec + + +def encoding(encoding=True): + """DEPRECATED: use pynvim.decode().""" + if isinstance(encoding, str): + encoding = True + + def dec(f): + f._nvim_decode = encoding + return f + return dec diff --git a/.local/lib/python2.7/site-packages/pynvim/plugin/decorators.pyc b/.local/lib/python2.7/site-packages/pynvim/plugin/decorators.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb89f6c439d1f255bffaea4ce609dc393d7134a7 GIT binary patch literal 6041 zcmcIo-Etg96+Sa7?Vlyfu`S1rNj!lVHU>+9P)^FYTu_!NC_tF8t5OKUFq-LIt+hL| zo}RU>ihUIqE3V*%D()yM7u;~eP2Pcb;2F4p2Y~N8J-f1n;@Cx2+CJNR`uF^N=X7`N z-^=ay{`TuAk?OCF@9(16e}beUTcDn#z6?CsLdDg6+48kslR-^}3$nE!!$sLz6wml_ zw=Sk3A7emMOjGW*l(v-~lbXNPlC8FEElGMtww5Jbk|$W`xR@15m*ok@osjf67j+-- zXCHD_XSvYr&a0IB zGRTHW@**zt!Ukh&(qMZp810oic^2&CwhTstaj%~RcF&e(xYqv<{x&;4#+B6G4{t}e zetzc%Kizz{JcFO(te@nmiA+&oz9==_cswY}I-1-(I;a>Wk$E`Ei?VE>CCP`wI7_u2 zkIOt6rezcS?l?=zexB(MlVRe1*3-FCY&kXMGCJ9vahc{1vS=sIcM}hs1(X`f4Yqy& zQi?nhiPWCZ{bNraUY8PUSH} z&kr!}wkpB?4h!6gdqEr|gV@?2#;4NRTDu+K@6Jx&2HdeKIlzy?+#B}`sJhI9VZ3XC za>rD|hX$HY(Z6q#{JtsT?SY|1&_gG4T8svHoCdCMkau-FjkTtIR14GuwQw87Qc+F| zaA`>E_P(jch_d_rVYJ=P(hkR{6?S49mu2A?v~@S@fQl0P6V%ps@}XJ3o7=G|-g$q0 zZICDNV13ZvUU$Cpt+n^oZND^^M{%+n_lyOf3#~f=)@S;#YZyRlUmL{3?KHlA4t4Am zi;)XcK)=P6vn9hTEpFAzElMk?+R?YeG7z$^}8`R2@!Q zQaj1OmMwgbV2yqfm!_l+qL7QtQ{s?HJ&s~Yq~2O=c^AC8x8$Gj61H)3({D>;P4Mxg ztAXe@aAIE`P3>qm(0)_#1mByYCdi8^b}L6w*Bsg&O>!9+R6jI;_zuuFFvZ%;ak%m+ z6iXfKJNTgDRX7562q*;#D*y`dK-Fz_i1l(6#2JfNck4%4j0)vFXt8@)60U%yHVV0B zd3M$VR_XR1MwQQx;&R7%Bp2$s7{sxMm!Neyu^Mm=-b&lRf8XLVbS?2()xUEYwufIL zd7b195Z6Gp9yEOMI}5q;mr*QLApXgEpWg{Lc?^Z$>|)nIoI_1~nbc&mAd^Lz)Me6; zNmC{*>9(2i=xA+u)Sd>rs~G2k-RF4OCZHZvas65M;`%J=UT?yZSmrK#Ymq6G&g98{ zODjGhO3uQxvM7)T;d{TqWWC#xB4r)jcAHZCjCn0<5$RxZHbnfIT+7bMer-D7G3#tt zK!dt;@q3OVYtgYV)hAO{-LdLYd@B2O?bUEBUy8rWz8lzdEM$#;$o_)%YB^R*mWqE7 zL7-`ysLkq>50(Ccq{nz1xB}U661W09;~a2>J6XXO1aCTAoq)PF)zd1CUj68CNE~U1 zE8+~1kHId<$62WXa~nJjs)gzGk+%zN&*GwIm5q5u1A}NsKQZ^?fo9cl(KA^YlBW&j z-pKVJaMhQUosUY}VbIh;-MkpaWk}G54Bbzm`L*dpn|Wq5+}g4@8~_l$JM@R}JjvS} z(gY!<6~pvdjs5XpkUxkr#4D4AZ?f}SBmv1q5@Ia;3dsc$;y^d8*qZ~`i0gMy?E4_% zopdq4ulq~hMQ_Pl_UlKKWv_)EHLs!n%f4=|LvTK|e-%uH2-u*)&cq4V$y13BA`7+T z8eT>-b5IJMhlffRfohjJnout#^iO66e$(8R;vEV>UEsjQ93+&*Y0SBfjxQc_^!(_~ zlh27ef54no-0>L@a3rci56}zX9T|EMcMwK=xxxtKNpVXPVijW$N)~|iu428*@KRx2 zE5tg4s{`u*dBb77>9F2%SVwSS4y7SC^}JS{gn@N@^z?!R2q4p&MG|0O|@>#$PX{AHR3z-)>I_ZIv>CE5cRGfaEVEPdATl%?ps}-1PUb{vZ9Ss{g zl#_h6za!D{T#4oY0)ORD##;HdH}!7)*AObCU;;HWDq2o9nGUql6<)pp=$ zIB+mbZd%f*oYPF`LjFaxgbEDxjH7_jWS8dy;~VVqQs~f7J#Tb;gl$=7hNn|a-Mgr1 z=JW6|+u;l2V>V(A_@H(6C=RoQ_~&0sa1Im}ALRy$UU_Es_Nt;m+Fdg&jr6~;c>1C< zeHg$iM!vh|A{}oFB~jpRAk!}TcAz&9yfn*Hhh zP7@HVu<5Q@2RCl_-tv@k*h>$CL%hSxOG`Z7{29f$33TLaLIs82COJ6&a6ihMgSR#@ z_n%NIZ(XU)Of`+G_UmYdlR}d??%*&{oaOt{Z$)s$_)HT97_@QoR(SKq_wL->xXQ;j zJiPIdWUbQo+b?Oc@Lf!K$VwrP0`s)cUoroIg{TsJjpMp{G}N-Oypv zag%c}9jE;Zr=|_XU%}yfrKayn`T(Q%WxemXlayu+jtSX6BuYE_97SFfrFjxX;VY=? zacq$H@G#obSIEk4yjS5egdP$qL^uU*XFo<)T*5eOq|YExq?ad7QC-ebvpw!9r21Jm z*99KLMaBgfC0SQy6yYL-Z72#DBAgKPz{8SoaVH6tf8Yq}4NAUvm8*=`5EaG)bDb)% i0SNCzOa2)c;B`;DdaZSO>DY?5dU^GY)eEi0QuDv7i}(8g literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/plugin/host.py b/.local/lib/python2.7/site-packages/pynvim/plugin/host.py new file mode 100644 index 00000000..00af6351 --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/plugin/host.py @@ -0,0 +1,276 @@ +"""Implements a Nvim host for python plugins.""" +import imp +import inspect +import logging +import os +import os.path +import re +from functools import partial +from traceback import format_exc + +from pynvim.api import decode_if_bytes, walk +from pynvim.compat import IS_PYTHON3, find_module +from pynvim.msgpack_rpc import ErrorResponse +from pynvim.plugin import script_host +from pynvim.util import format_exc_skip, get_client_info + +__all__ = ('Host') + +logger = logging.getLogger(__name__) +error, debug, info, warn = (logger.error, logger.debug, logger.info, + logger.warning,) + +host_method_spec = {"poll": {}, "specs": {"nargs": 1}, "shutdown": {}} + + +class Host(object): + + """Nvim host for python plugins. + + Takes care of loading/unloading plugins and routing msgpack-rpc + requests/notifications to the appropriate handlers. + """ + + def __init__(self, nvim): + """Set handlers for plugin_load/plugin_unload.""" + self.nvim = nvim + self._specs = {} + self._loaded = {} + self._load_errors = {} + self._notification_handlers = { + 'nvim_error_event': self._on_error_event + } + self._request_handlers = { + 'poll': lambda: 'ok', + 'specs': self._on_specs_request, + 'shutdown': self.shutdown + } + + # Decode per default for Python3 + self._decode_default = IS_PYTHON3 + + def _on_async_err(self, msg): + # uncaught python exception + self.nvim.err_write(msg, async_=True) + + def _on_error_event(self, kind, msg): + # error from nvim due to async request + # like nvim.command(..., async_=True) + errmsg = "{}: Async request caused an error:\n{}\n".format( + self.name, decode_if_bytes(msg)) + self.nvim.err_write(errmsg, async_=True) + return errmsg + + def start(self, plugins): + """Start listening for msgpack-rpc requests and notifications.""" + self.nvim.run_loop(self._on_request, + self._on_notification, + lambda: self._load(plugins), + err_cb=self._on_async_err) + + def shutdown(self): + """Shutdown the host.""" + self._unload() + self.nvim.stop_loop() + + def _wrap_delayed_function(self, cls, delayed_handlers, name, sync, + module_handlers, path, *args): + # delete the delayed handlers to be sure + for handler in delayed_handlers: + method_name = handler._nvim_registered_name + if handler._nvim_rpc_sync: + del self._request_handlers[method_name] + else: + del self._notification_handlers[method_name] + # create an instance of the plugin and pass the nvim object + plugin = cls(self._configure_nvim_for(cls)) + + # discover handlers in the plugin instance + self._discover_functions(plugin, module_handlers, path, False) + + if sync: + self._request_handlers[name](*args) + else: + self._notification_handlers[name](*args) + + def _wrap_function(self, fn, sync, decode, nvim_bind, name, *args): + if decode: + args = walk(decode_if_bytes, args, decode) + if nvim_bind is not None: + args.insert(0, nvim_bind) + try: + return fn(*args) + except Exception: + if sync: + msg = ("error caught in request handler '{} {}':\n{}" + .format(name, args, format_exc_skip(1))) + raise ErrorResponse(msg) + else: + msg = ("error caught in async handler '{} {}'\n{}\n" + .format(name, args, format_exc_skip(1))) + self._on_async_err(msg + "\n") + + def _on_request(self, name, args): + """Handle a msgpack-rpc request.""" + if IS_PYTHON3: + name = decode_if_bytes(name) + handler = self._request_handlers.get(name, None) + if not handler: + msg = self._missing_handler_error(name, 'request') + pass # replaces next logging statement + #error(msg) + raise ErrorResponse(msg) + + pass # replaces next logging statement + #debug('calling request handler for "%s", args: "%s"', name, args) + rv = handler(*args) + pass # replaces next logging statement + #debug("request handler for '%s %s' returns: %s", name, args, rv) + return rv + + def _on_notification(self, name, args): + """Handle a msgpack-rpc notification.""" + if IS_PYTHON3: + name = decode_if_bytes(name) + handler = self._notification_handlers.get(name, None) + if not handler: + msg = self._missing_handler_error(name, 'notification') + pass # replaces next logging statement + #error(msg) + self._on_async_err(msg + "\n") + return + + pass # replaces next logging statement + #debug('calling notification handler for "%s", args: "%s"', name, args) + handler(*args) + + def _missing_handler_error(self, name, kind): + msg = 'no {} handler registered for "{}"'.format(kind, name) + pathmatch = re.match(r'(.+):[^:]+:[^:]+', name) + if pathmatch: + loader_error = self._load_errors.get(pathmatch.group(1)) + if loader_error is not None: + msg = msg + "\n" + loader_error + return msg + + def _load(self, plugins): + has_script = False + for path in plugins: + err = None + if path in self._loaded: + pass # replaces next logging statement + #error('{} is already loaded'.format(path)) + continue + try: + if path == "script_host.py": + module = script_host + has_script = True + else: + directory, name = os.path.split(os.path.splitext(path)[0]) + file, pathname, descr = find_module(name, [directory]) + module = imp.load_module(name, file, pathname, descr) + handlers = [] + self._discover_classes(module, handlers, path) + self._discover_functions(module, handlers, path, False) + if not handlers: + pass # replaces next logging statement + #error('{} exports no handlers'.format(path)) + continue + self._loaded[path] = {'handlers': handlers, 'module': module} + except Exception as e: + err = ('Encountered {} loading plugin at {}: {}\n{}' + .format(type(e).__name__, path, e, format_exc(5))) + pass # replaces next logging statement + #error(err) + self._load_errors[path] = err + + kind = ("script-host" if len(plugins) == 1 and has_script + else "rplugin-host") + info = get_client_info(kind, 'host', host_method_spec) + self.name = info[0] + self.nvim.api.set_client_info(*info, async_=True) + + def _unload(self): + for path, plugin in self._loaded.items(): + handlers = plugin['handlers'] + for handler in handlers: + method_name = handler._nvim_registered_name + if hasattr(handler, '_nvim_shutdown_hook'): + handler() + elif handler._nvim_rpc_sync: + del self._request_handlers[method_name] + else: + del self._notification_handlers[method_name] + self._specs = {} + self._loaded = {} + + def _discover_classes(self, module, handlers, plugin_path): + for _, cls in inspect.getmembers(module, inspect.isclass): + if getattr(cls, '_nvim_plugin', False): + # discover handlers in the plugin instance + self._discover_functions(cls, handlers, plugin_path, True) + + def _discover_functions(self, obj, handlers, plugin_path, delay): + def predicate(o): + return hasattr(o, '_nvim_rpc_method_name') + + cls_handlers = [] + specs = [] + objdecode = getattr(obj, '_nvim_decode', self._decode_default) + for _, fn in inspect.getmembers(obj, predicate): + method = fn._nvim_rpc_method_name + if fn._nvim_prefix_plugin_path: + method = '{}:{}'.format(plugin_path, method) + sync = fn._nvim_rpc_sync + if delay: + fn_wrapped = partial(self._wrap_delayed_function, obj, + cls_handlers, method, sync, + handlers, plugin_path) + else: + decode = getattr(fn, '_nvim_decode', objdecode) + nvim_bind = None + if fn._nvim_bind: + nvim_bind = self._configure_nvim_for(fn) + + fn_wrapped = partial(self._wrap_function, fn, + sync, decode, nvim_bind, method) + self._copy_attributes(fn, fn_wrapped) + fn_wrapped._nvim_registered_name = method + # register in the rpc handler dict + if sync: + if method in self._request_handlers: + raise Exception(('Request handler for "{}" is ' + + 'already registered').format(method)) + self._request_handlers[method] = fn_wrapped + else: + if method in self._notification_handlers: + raise Exception(('Notification handler for "{}" is ' + + 'already registered').format(method)) + self._notification_handlers[method] = fn_wrapped + if hasattr(fn, '_nvim_rpc_spec'): + specs.append(fn._nvim_rpc_spec) + handlers.append(fn_wrapped) + cls_handlers.append(fn_wrapped) + if specs: + self._specs[plugin_path] = specs + + def _copy_attributes(self, fn, fn2): + # Copy _nvim_* attributes from the original function + for attr in dir(fn): + if attr.startswith('_nvim_'): + setattr(fn2, attr, getattr(fn, attr)) + + def _on_specs_request(self, path): + if IS_PYTHON3: + path = decode_if_bytes(path) + if path in self._load_errors: + self.nvim.out_write(self._load_errors[path] + '\n') + return self._specs.get(path, 0) + + def _configure_nvim_for(self, obj): + # Configure a nvim instance for obj (checks encoding configuration) + nvim = self.nvim + decode = getattr(obj, '_nvim_decode', self._decode_default) + if decode: + nvim = nvim.with_decode(decode) + return nvim diff --git a/.local/lib/python2.7/site-packages/pynvim/plugin/host.pyc b/.local/lib/python2.7/site-packages/pynvim/plugin/host.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce610b51960c91df43ced7de188787c59f8ed343 GIT binary patch literal 10213 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 (3, 4): + from importlib.machinery import PathFinder + + PYTHON_SUBDIR = 'python3' +else: + PYTHON_SUBDIR = 'python2' + + +@plugin +class ScriptHost(object): + + """Provides an environment for running python plugins created for Vim.""" + + def __init__(self, nvim): + """Initialize the legacy python-vim environment.""" + self.setup(nvim) + # context where all code will run + self.module = ModuleType('__main__') + nvim.script_context = self.module + # it seems some plugins assume 'sys' is already imported, so do it now + exec('import sys', self.module.__dict__) + self.legacy_vim = LegacyVim.from_nvim(nvim) + sys.modules['vim'] = self.legacy_vim + # mimic Vim by importing vim module by default. + exec('import vim', self.module.__dict__) + # Handle DirChanged. #296 + nvim.command( + 'au DirChanged * call rpcnotify({}, "python_chdir", v:event.cwd)' + .format(nvim.channel_id), async_=True) + # XXX: Avoid race condition. + # https://github.com/neovim/pynvim/pull/296#issuecomment-358970531 + # TODO(bfredl): when host initialization has been refactored, + # to make __init__ safe again, the following should work: + # os.chdir(nvim.eval('getcwd()', async_=False)) + nvim.command('call rpcnotify({}, "python_chdir", getcwd())' + .format(nvim.channel_id), async_=True) + + def setup(self, nvim): + """Setup import hooks and global streams. + + This will add import hooks for importing modules from runtime + directories and patch the sys module so 'print' calls will be + forwarded to Nvim. + """ + self.nvim = nvim + pass # replaces next logging statement + #info('install import hook/path') + self.hook = path_hook(nvim) + sys.path_hooks.append(self.hook) + nvim.VIM_SPECIAL_PATH = '_vim_path_' + sys.path.append(nvim.VIM_SPECIAL_PATH) + pass # replaces next logging statement + #info('redirect sys.stdout and sys.stderr') + self.saved_stdout = sys.stdout + self.saved_stderr = sys.stderr + sys.stdout = RedirectStream(lambda data: nvim.out_write(data)) + sys.stderr = RedirectStream(lambda data: nvim.err_write(data)) + + def teardown(self): + """Restore state modified from the `setup` call.""" + nvim = self.nvim + pass # replaces next logging statement + #info('uninstall import hook/path') + sys.path.remove(nvim.VIM_SPECIAL_PATH) + sys.path_hooks.remove(self.hook) + pass # replaces next logging statement + #info('restore sys.stdout and sys.stderr') + sys.stdout = self.saved_stdout + sys.stderr = self.saved_stderr + + @rpc_export('python_execute', sync=True) + def python_execute(self, script, range_start, range_stop): + """Handle the `python` ex command.""" + self._set_current_range(range_start, range_stop) + try: + exec(script, self.module.__dict__) + except Exception: + raise ErrorResponse(format_exc_skip(1)) + + @rpc_export('python_execute_file', sync=True) + def python_execute_file(self, file_path, range_start, range_stop): + """Handle the `pyfile` ex command.""" + self._set_current_range(range_start, range_stop) + with open(file_path) as f: + script = compile(f.read(), file_path, 'exec') + try: + exec(script, self.module.__dict__) + except Exception: + raise ErrorResponse(format_exc_skip(1)) + + @rpc_export('python_do_range', sync=True) + def python_do_range(self, start, stop, code): + """Handle the `pydo` ex command.""" + self._set_current_range(start, stop) + nvim = self.nvim + start -= 1 + fname = '_vim_pydo' + + # define the function + function_def = 'def %s(line, linenr):\n %s' % (fname, code,) + exec(function_def, self.module.__dict__) + # get the function + function = self.module.__dict__[fname] + while start < stop: + # Process batches of 5000 to avoid the overhead of making multiple + # API calls for every line. Assuming an average line length of 100 + # bytes, approximately 488 kilobytes will be transferred per batch, + # which can be done very quickly in a single API call. + sstart = start + sstop = min(start + 5000, stop) + lines = nvim.current.buffer.api.get_lines(sstart, sstop, True) + + exception = None + newlines = [] + linenr = sstart + 1 + for i, line in enumerate(lines): + result = function(line, linenr) + if result is None: + # Update earlier lines, and skip to the next + if newlines: + end = sstart + len(newlines) - 1 + nvim.current.buffer.api.set_lines(sstart, end, + True, newlines) + sstart += len(newlines) + 1 + newlines = [] + pass + elif isinstance(result, basestring): + newlines.append(result) + else: + exception = TypeError('pydo should return a string ' + + 'or None, found %s instead' + % result.__class__.__name__) + break + linenr += 1 + + start = sstop + if newlines: + end = sstart + len(newlines) + nvim.current.buffer.api.set_lines(sstart, end, True, newlines) + if exception: + raise exception + # delete the function + del self.module.__dict__[fname] + + @rpc_export('python_eval', sync=True) + def python_eval(self, expr): + """Handle the `pyeval` vim function.""" + return eval(expr, self.module.__dict__) + + @rpc_export('python_chdir', sync=False) + def python_chdir(self, cwd): + """Handle working directory changes.""" + os.chdir(cwd) + + def _set_current_range(self, start, stop): + current = self.legacy_vim.current + current.range = current.buffer.range(start, stop) + + +class RedirectStream(io.IOBase): + def __init__(self, redirect_handler): + self.redirect_handler = redirect_handler + + def write(self, data): + self.redirect_handler(data) + + def writelines(self, seq): + self.redirect_handler('\n'.join(seq)) + + +if IS_PYTHON3: + num_types = (int, float) +else: + num_types = (int, long, float) # noqa: F821 + + +def num_to_str(obj): + if isinstance(obj, num_types): + return str(obj) + else: + return obj + + +class LegacyVim(Nvim): + def eval(self, expr): + obj = self.request("vim_eval", expr) + return walk(num_to_str, obj) + + +# Copied/adapted from :help if_pyth. +def path_hook(nvim): + def _get_paths(): + if nvim._thread_invalid(): + return [] + return discover_runtime_directories(nvim) + + def _find_module(fullname, oldtail, path): + idx = oldtail.find('.') + if idx > 0: + name = oldtail[:idx] + tail = oldtail[idx + 1:] + fmr = imp.find_module(name, path) + module = imp.find_module(fullname[:-len(oldtail)] + name, *fmr) + return _find_module(fullname, tail, module.__path__) + else: + return imp.find_module(fullname, path) + + class VimModuleLoader(object): + def __init__(self, module): + self.module = module + + def load_module(self, fullname, path=None): + # Check sys.modules, required for reload (see PEP302). + try: + return sys.modules[fullname] + except KeyError: + pass + return imp.load_module(fullname, *self.module) + + class VimPathFinder(object): + @staticmethod + def find_module(fullname, path=None): + """Method for Python 2.7 and 3.3.""" + try: + return VimModuleLoader( + _find_module(fullname, fullname, path or _get_paths())) + except ImportError: + return None + + @staticmethod + def find_spec(fullname, target=None): + """Method for Python 3.4+.""" + return PathFinder.find_spec(fullname, _get_paths(), target) + + def hook(path): + if path == nvim.VIM_SPECIAL_PATH: + return VimPathFinder + else: + raise ImportError + + return hook + + +def discover_runtime_directories(nvim): + rv = [] + for rtp in nvim.list_runtime_paths(): + if not os.path.exists(rtp): + continue + for subdir in ['pythonx', PYTHON_SUBDIR]: + path = os.path.join(rtp, subdir) + if os.path.exists(path): + rv.append(path) + return rv diff --git a/.local/lib/python2.7/site-packages/pynvim/plugin/script_host.pyc b/.local/lib/python2.7/site-packages/pynvim/plugin/script_host.pyc new file mode 100644 index 0000000000000000000000000000000000000000..412a002e3d501d19a13d5d02264dececdf60bafa GIT binary patch literal 11496 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/pynvim/util.py b/.local/lib/python2.7/site-packages/pynvim/util.py new file mode 100644 index 00000000..dcc979df --- /dev/null +++ b/.local/lib/python2.7/site-packages/pynvim/util.py @@ -0,0 +1,42 @@ +"""Shared utility functions.""" + +import sys +from traceback import format_exception + + +def format_exc_skip(skip, limit=None): + """Like traceback.format_exc but allow skipping the first frames.""" + etype, val, tb = sys.exc_info() + for i in range(skip): + tb = tb.tb_next + return (''.join(format_exception(etype, val, tb, limit))).rstrip() + + +# Taken from SimpleNamespace in python 3 +class Version: + """Helper class for version info.""" + + def __init__(self, **kwargs): + """Create the Version object.""" + self.__dict__.update(kwargs) + + def __repr__(self): + """Return str representation of the Version.""" + keys = sorted(self.__dict__) + items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) + return "{}({})".format(type(self).__name__, ", ".join(items)) + + def __eq__(self, other): + """Check if version is same as other.""" + return self.__dict__ == other.__dict__ + + +def get_client_info(kind, type_, method_spec): + """Returns a tuple describing the client.""" + name = "python{}-{}".format(sys.version_info[0], kind) + attributes = {"license": "Apache v2", + "website": "github.com/neovim/pynvim"} + return (name, VERSION.__dict__, type_, method_spec, attributes) + + +VERSION = Version(major=0, minor=4, patch=2, prerelease='') diff --git a/.local/lib/python2.7/site-packages/pynvim/util.pyc b/.local/lib/python2.7/site-packages/pynvim/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da8f863184c733a9abaa049e69bc6098b3089643 GIT binary patch literal 2649 zcmcImZEqVz5T3IgCr*Y6biqej7gko|$tJen4=%<9(Uio0sRAN&WB5_2+;6rej)uTKIj5;c|$Cs0SHP zQlm7W9wzwKDXr18PQ5w>I7k}w7H2Dz;JZyplim`&A^N4)q-2#By;U-puTj#XWSx>* zlx$G4Ny%+WwxHVR;iyK3?RWUayAX$?s5FV1d7D~)t_HI#_BPL4$Nq!QK|6qs--a0E z6t1Yxspz+Gc|sCJ>cTHZ)#z`Z_ab-Z!v2 z&TSUrmpuE7D@$9nc`B#;MtL~3Q|o1B{CQ#IEhkY5_o3PM98KGXAQA2*X5CRfHQjOU zW~O}dMYogYag=sb+wT_Vew1fVJI}k$dh@t|!_m+<>}Mx-+U1;eptFTbuH&HD7Pj88 zXH>fz>;#*E_;X}R$C=}O{;)M)W4K2U2Iv9gAOW;Mz*J|fFsd31MV_osc-ZD}xcd;_ zo3t>ciqptB1q;+k^#aAQ?8JOM`_1D=4EHVsP%svZaEb%KI=Ia4hdA9YP2`bZqhWMWn%c%nKK!%RAmgUM-B4&6=1nq#Vg6^r-puutq9)x=ju z6q_K(`VJGI?azu20WAXh18EXo|Bf(#32+}2L5RmSh9gw510o>SW8ngpZc1_D4v== z_l-6?CM*a!AASR3S*WX~$95il8y^1f^FhUHexM?Q%@QF4Q%8F?aB9$#6732UWv)xi zBuQ)J(Gt;v&5hSwP8&M1uHqy%GxnGLZ8uoQpIAAK#(61WtClvyl8uyQ5&3w8^kK;` zMENXDY9ePsrc(ttt~KEU7NW=2.7, < 3 +Description-Content-Type: text/x-rst diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/SOURCES.txt b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/SOURCES.txt new file mode 100644 index 00000000..e8d658e3 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/SOURCES.txt @@ -0,0 +1,120 @@ +.travis.yml +AUTHORS +COPYING +MANIFEST.in +Makefile +README.rst +TODO.rst +appveyor.yml +check.py +overlapped.c +pypi.bat +releaser.conf +runtests.py +setup.cfg +setup.py +tox.ini +update-asyncio-step1.sh +update-asyncio-step2.sh +update-asyncio-step3.sh +doc/Makefile +doc/asyncio.rst +doc/changelog.rst +doc/conf.py +doc/deprecated.rst +doc/dev.rst +doc/index.rst +doc/install.rst +doc/libraries.rst +doc/make.bat +doc/trollius.jpg +doc/using.rst +examples/cacheclt.py +examples/cachesvr.py +examples/child_process.py +examples/crawl.py +examples/echo_client_tulip.py +examples/echo_server_tulip.py +examples/fetch0.py +examples/fetch1.py +examples/fetch2.py +examples/fetch3.py +examples/fuzz_as_completed.py +examples/hello_callback.py +examples/hello_coroutine.py +examples/interop_asyncio.py +examples/shell.py +examples/simple_tcp_server.py +examples/sink.py +examples/source.py +examples/source1.py +examples/stacks.py +examples/subprocess_attach_read_pipe.py +examples/subprocess_attach_write_pipe.py +examples/subprocess_shell.py +examples/tcp_echo.py +examples/timing_tcp_server.py +examples/udp_echo.py +tests/echo.py +tests/echo2.py +tests/echo3.py +tests/keycert3.pem +tests/pycacert.pem +tests/sample.crt +tests/sample.key +tests/ssl_cert.pem +tests/ssl_key.pem +tests/test_asyncio.py +tests/test_base_events.py +tests/test_events.py +tests/test_futures.py +tests/test_locks.py +tests/test_proactor_events.py +tests/test_queues.py +tests/test_selector_events.py +tests/test_selectors.py +tests/test_sslproto.py +tests/test_streams.py +tests/test_subprocess.py +tests/test_tasks.py +tests/test_transports.py +tests/test_unix_events.py +tests/test_windows_events.py +tests/test_windows_utils.py +trollius/__init__.py +trollius/base_events.py +trollius/base_subprocess.py +trollius/compat.py +trollius/constants.py +trollius/coroutines.py +trollius/events.py +trollius/executor.py +trollius/futures.py +trollius/locks.py +trollius/log.py +trollius/proactor_events.py +trollius/protocols.py +trollius/py27_weakrefset.py +trollius/py33_exceptions.py +trollius/py33_winapi.py +trollius/py3_ssl.py +trollius/queues.py +trollius/selector_events.py +trollius/selectors.py +trollius/sslproto.py +trollius/streams.py +trollius/subprocess.py +trollius/tasks.py +trollius/test_support.py +trollius/test_utils.py +trollius/time_monotonic.py +trollius/transports.py +trollius/unix_events.py +trollius/windows_events.py +trollius/windows_utils.py +trollius.egg-info/PKG-INFO +trollius.egg-info/SOURCES.txt +trollius.egg-info/dependency_links.txt +trollius.egg-info/not-zip-safe +trollius.egg-info/requires.txt +trollius.egg-info/top_level.txt \ No newline at end of file diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/dependency_links.txt b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/installed-files.txt b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/installed-files.txt new file mode 100644 index 00000000..3ec613d2 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/installed-files.txt @@ -0,0 +1,68 @@ +../trollius/__init__.py +../trollius/__init__.pyc +../trollius/base_events.py +../trollius/base_events.pyc +../trollius/base_subprocess.py +../trollius/base_subprocess.pyc +../trollius/compat.py +../trollius/compat.pyc +../trollius/constants.py +../trollius/constants.pyc +../trollius/coroutines.py +../trollius/coroutines.pyc +../trollius/events.py +../trollius/events.pyc +../trollius/executor.py +../trollius/executor.pyc +../trollius/futures.py +../trollius/futures.pyc +../trollius/locks.py +../trollius/locks.pyc +../trollius/log.py +../trollius/log.pyc +../trollius/proactor_events.py +../trollius/proactor_events.pyc +../trollius/protocols.py +../trollius/protocols.pyc +../trollius/py27_weakrefset.py +../trollius/py27_weakrefset.pyc +../trollius/py33_exceptions.py +../trollius/py33_exceptions.pyc +../trollius/py33_winapi.py +../trollius/py33_winapi.pyc +../trollius/py3_ssl.py +../trollius/py3_ssl.pyc +../trollius/queues.py +../trollius/queues.pyc +../trollius/selector_events.py +../trollius/selector_events.pyc +../trollius/selectors.py +../trollius/selectors.pyc +../trollius/sslproto.py +../trollius/sslproto.pyc +../trollius/streams.py +../trollius/streams.pyc +../trollius/subprocess.py +../trollius/subprocess.pyc +../trollius/tasks.py +../trollius/tasks.pyc +../trollius/test_support.py +../trollius/test_support.pyc +../trollius/test_utils.py +../trollius/test_utils.pyc +../trollius/time_monotonic.py +../trollius/time_monotonic.pyc +../trollius/transports.py +../trollius/transports.pyc +../trollius/unix_events.py +../trollius/unix_events.pyc +../trollius/windows_events.py +../trollius/windows_events.pyc +../trollius/windows_utils.py +../trollius/windows_utils.pyc +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/not-zip-safe b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/requires.txt b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/requires.txt new file mode 100644 index 00000000..624b76ef --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/requires.txt @@ -0,0 +1,2 @@ +six +futures diff --git a/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/top_level.txt b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/top_level.txt new file mode 100644 index 00000000..7b0645d2 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius-2.2.post1-py2.7.egg-info/top_level.txt @@ -0,0 +1 @@ +trollius diff --git a/.local/lib/python2.7/site-packages/trollius/__init__.py b/.local/lib/python2.7/site-packages/trollius/__init__.py new file mode 100644 index 00000000..a1379fbc --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/__init__.py @@ -0,0 +1,59 @@ +"""The trollius package, tracking PEP 3156.""" + +import sys + +# The selectors module is in the stdlib in Python 3.4 but not in 3.3. +# Do this first, so the other submodules can use "from . import selectors". +# Prefer asyncio/selectors.py over the stdlib one, as ours may be newer. +try: + from . import selectors +except ImportError: + import selectors # Will also be exported. + +if sys.platform == 'win32': + # Similar thing for _overlapped. + try: + from . import _overlapped + except ImportError: + import _overlapped # Will also be exported. + +# This relies on each of the submodules having an __all__ variable. +from .base_events import * +from .coroutines import * +from .events import * +from .futures import * +from .locks import * +from .protocols import * +from .py33_exceptions import * +from .queues import * +from .streams import * +from .subprocess import * +from .tasks import * +from .transports import * + +__all__ = (base_events.__all__ + + coroutines.__all__ + + events.__all__ + + py33_exceptions.__all__ + + futures.__all__ + + locks.__all__ + + protocols.__all__ + + queues.__all__ + + streams.__all__ + + subprocess.__all__ + + tasks.__all__ + + transports.__all__) + +if sys.platform == 'win32': # pragma: no cover + from .windows_events import * + __all__ += windows_events.__all__ +else: + from .unix_events import * # pragma: no cover + __all__ += unix_events.__all__ + +try: + from .py3_ssl import * + __all__ += py3_ssl.__all__ +except ImportError: + # SSL support is optionnal + pass diff --git a/.local/lib/python2.7/site-packages/trollius/__init__.pyc b/.local/lib/python2.7/site-packages/trollius/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da4b5d7681ad957358e357a626f1b61b8a911d40 GIT binary patch literal 1082 zcmZuvU2oGc6unN?cFX#?b?XB{>SM)61FK*>AmD)_At5x4Nt-GmD^0vLt7~Vrv#rkv ziHH3#UidZq0JyH3um=+5o@1Zu<7?mezZ=2#$8W#Juzo6t@9@*V2tWcb!AKzSfD@Py zSau=tA=v=#!NP}$59CxlgblU<^8nNs2qEkIl`06FF#?wrNGdS*K;0D<)s;mRCRMb! zx+^Vy+_PAzsGSL{0=KOJuffThZI*1SWI@TcOI9ygqh!sJwMy15S*K(>aKdVExeIL5 z#va>p&~Okq*mh8N&~(sp(00&qu(N^*`rW^iZ)AO>E^dcf*Jd4Jmgp77-gC-cp)4O1 z%Dz+f3*}UF%DeoD-5|CF*uO7>P21K1hLaiV8znhUbKTFPcphD_Cpd#F6&L-Z@lk*D z{Kd;*`UjuSDgFpBu)%Cu2gX@!q|(OzDmSSZ9XN3thg4oO#iJ}^iJP>`9u0aJP0i{w zkujylN3NIJAi%K=#;*Rj$fPo3r7+rJGai|9sTRjxkui-lqwJaqqfLO5u~afQsbJbv zaky6OPUpGF6;9hCxs2y}ReYwTk+J03v~WIKjz*N-#w;_b6wcx*XE`pj7TPElE!;*r zpW@n>Y3FDnjgGbgyfvY1*=`M`5$AZoCQ5iWiM-K8z4nB;NNSe;Bf!| literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/base_events.py b/.local/lib/python2.7/site-packages/trollius/base_events.py new file mode 100644 index 00000000..c5e6effd --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/base_events.py @@ -0,0 +1,1260 @@ +"""Base implementation of event loop. + +The event loop can be broken up into a multiplexer (the part +responsible for notifying us of I/O events) and the event loop proper, +which wraps a multiplexer with functionality for scheduling callbacks, +immediately or at a given time in the future. + +Whenever a public API takes a callback, subsequent positional +arguments will be passed to the callback if/when it is called. This +avoids the proliferation of trivial lambdas implementing closures. +Keyword arguments for the callback are not supported; this is a +conscious design decision, leaving the door open for keyword arguments +to modify the meaning of the API call itself. +""" + + +import collections +import heapq +import inspect +import logging +import os +import socket +import subprocess +import sys +import traceback +import warnings +try: + from collections import OrderedDict +except ImportError: + # Python 2.6: use ordereddict backport + from ordereddict import OrderedDict +try: + from threading import get_ident as _get_thread_ident +except ImportError: + # Python 2 + from threading import _get_ident as _get_thread_ident + +from . import compat +from . import coroutines +from . import events +from . import futures +from . import tasks +from .coroutines import coroutine, From, Return +from .executor import get_default_executor +from .log import logger +from .time_monotonic import time_monotonic, time_monotonic_resolution + + +__all__ = ['BaseEventLoop'] + + +# Argument for default thread pool executor creation. +_MAX_WORKERS = 5 + +# Minimum number of _scheduled timer handles before cleanup of +# cancelled handles is performed. +_MIN_SCHEDULED_TIMER_HANDLES = 100 + +# Minimum fraction of _scheduled timer handles that are cancelled +# before cleanup of cancelled handles is performed. +_MIN_CANCELLED_TIMER_HANDLES_FRACTION = 0.5 + +def _format_handle(handle): + cb = handle._callback + if inspect.ismethod(cb) and isinstance(cb.__self__, tasks.Task): + # format the task + return repr(cb.__self__) + else: + return str(handle) + + +def _format_pipe(fd): + if fd == subprocess.PIPE: + return '' + elif fd == subprocess.STDOUT: + return '' + else: + return repr(fd) + + +class _StopError(BaseException): + """Raised to stop the event loop.""" + + +def _check_resolved_address(sock, address): + # Ensure that the address is already resolved to avoid the trap of hanging + # the entire event loop when the address requires doing a DNS lookup. + # + # getaddrinfo() is slow (around 10 us per call): this function should only + # be called in debug mode + family = sock.family + + if family == socket.AF_INET: + host, port = address + elif family == socket.AF_INET6: + host, port = address[:2] + else: + return + + # On Windows, socket.inet_pton() is only available since Python 3.4 + if hasattr(socket, 'inet_pton'): + # getaddrinfo() is slow and has known issue: prefer inet_pton() + # if available + try: + socket.inet_pton(family, host) + except socket.error as exc: + raise ValueError("address must be resolved (IP address), " + "got host %r: %s" + % (host, exc)) + else: + # Use getaddrinfo(flags=AI_NUMERICHOST) to ensure that the address is + # already resolved. + type_mask = 0 + if hasattr(socket, 'SOCK_NONBLOCK'): + type_mask |= socket.SOCK_NONBLOCK + if hasattr(socket, 'SOCK_CLOEXEC'): + type_mask |= socket.SOCK_CLOEXEC + try: + socket.getaddrinfo(host, port, + family, + (sock.type & ~type_mask), + sock.proto, + socket.AI_NUMERICHOST) + except socket.gaierror as err: + raise ValueError("address must be resolved (IP address), " + "got host %r: %s" + % (host, err)) + +def _raise_stop_error(*args): + raise _StopError + + +def _run_until_complete_cb(fut): + exc = fut._exception + if (isinstance(exc, BaseException) + and not isinstance(exc, Exception)): + # Issue #22429: run_forever() already finished, no need to + # stop it. + return + _raise_stop_error() + + +class Server(events.AbstractServer): + + def __init__(self, loop, sockets): + self._loop = loop + self.sockets = sockets + self._active_count = 0 + self._waiters = [] + + def __repr__(self): + return '<%s sockets=%r>' % (self.__class__.__name__, self.sockets) + + def _attach(self): + assert self.sockets is not None + self._active_count += 1 + + def _detach(self): + assert self._active_count > 0 + self._active_count -= 1 + if self._active_count == 0 and self.sockets is None: + self._wakeup() + + def close(self): + sockets = self.sockets + if sockets is None: + return + self.sockets = None + for sock in sockets: + self._loop._stop_serving(sock) + if self._active_count == 0: + self._wakeup() + + def _wakeup(self): + waiters = self._waiters + self._waiters = None + for waiter in waiters: + if not waiter.done(): + waiter.set_result(waiter) + + @coroutine + def wait_closed(self): + if self.sockets is None or self._waiters is None: + raise Return() + waiter = futures.Future(loop=self._loop) + self._waiters.append(waiter) + yield From(waiter) + + +class BaseEventLoop(events.AbstractEventLoop): + + def __init__(self): + self._timer_cancelled_count = 0 + self._closed = False + self._ready = collections.deque() + self._scheduled = [] + self._default_executor = None + self._internal_fds = 0 + # Identifier of the thread running the event loop, or None if the + # event loop is not running + self._thread_id = None + self._clock_resolution = time_monotonic_resolution + self._exception_handler = None + self.set_debug(bool(os.environ.get('TROLLIUSDEBUG'))) + # In debug mode, if the execution of a callback or a step of a task + # exceed this duration in seconds, the slow callback/task is logged. + self.slow_callback_duration = 0.1 + self._current_handle = None + self._task_factory = None + self._coroutine_wrapper_set = False + + def __repr__(self): + return ('<%s running=%s closed=%s debug=%s>' + % (self.__class__.__name__, self.is_running(), + self.is_closed(), self.get_debug())) + + def create_task(self, coro): + """Schedule a coroutine object. + + Return a task object. + """ + self._check_closed() + if self._task_factory is None: + task = tasks.Task(coro, loop=self) + if task._source_traceback: + del task._source_traceback[-1] + else: + task = self._task_factory(self, coro) + return task + + def set_task_factory(self, factory): + """Set a task factory that will be used by loop.create_task(). + + If factory is None the default task factory will be set. + + If factory is a callable, it should have a signature matching + '(loop, coro)', where 'loop' will be a reference to the active + event loop, 'coro' will be a coroutine object. The callable + must return a Future. + """ + if factory is not None and not callable(factory): + raise TypeError('task factory must be a callable or None') + self._task_factory = factory + + def get_task_factory(self): + """Return a task factory, or None if the default one is in use.""" + return self._task_factory + + def _make_socket_transport(self, sock, protocol, waiter=None, + extra=None, server=None): + """Create socket transport.""" + raise NotImplementedError + + def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter=None, + server_side=False, server_hostname=None, + extra=None, server=None): + """Create SSL transport.""" + raise NotImplementedError + + def _make_datagram_transport(self, sock, protocol, + address=None, waiter=None, extra=None): + """Create datagram transport.""" + raise NotImplementedError + + def _make_read_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + """Create read pipe transport.""" + raise NotImplementedError + + def _make_write_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + """Create write pipe transport.""" + raise NotImplementedError + + @coroutine + def _make_subprocess_transport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + """Create subprocess transport.""" + raise NotImplementedError + + def _write_to_self(self): + """Write a byte to self-pipe, to wake up the event loop. + + This may be called from a different thread. + + The subclass is responsible for implementing the self-pipe. + """ + raise NotImplementedError + + def _process_events(self, event_list): + """Process selector events.""" + raise NotImplementedError + + def _check_closed(self): + if self._closed: + raise RuntimeError('Event loop is closed') + + def run_forever(self): + """Run until stop() is called.""" + self._check_closed() + if self.is_running(): + raise RuntimeError('Event loop is running.') + self._set_coroutine_wrapper(self._debug) + self._thread_id = _get_thread_ident() + try: + while True: + try: + self._run_once() + except _StopError: + break + finally: + self._thread_id = None + self._set_coroutine_wrapper(False) + + def run_until_complete(self, future): + """Run until the Future is done. + + If the argument is a coroutine, it is wrapped in a Task. + + WARNING: It would be disastrous to call run_until_complete() + with the same coroutine twice -- it would wrap it in two + different Tasks and that can't be good. + + Return the Future's result, or raise its exception. + """ + self._check_closed() + + new_task = not isinstance(future, futures._FUTURE_CLASSES) + future = tasks.ensure_future(future, loop=self) + if new_task: + # An exception is raised if the future didn't complete, so there + # is no need to log the "destroy pending task" message + future._log_destroy_pending = False + + future.add_done_callback(_run_until_complete_cb) + try: + self.run_forever() + except: + if new_task and future.done() and not future.cancelled(): + # The coroutine raised a BaseException. Consume the exception + # to not log a warning, the caller doesn't have access to the + # local task. + future.exception() + raise + future.remove_done_callback(_run_until_complete_cb) + if not future.done(): + raise RuntimeError('Event loop stopped before Future completed.') + + return future.result() + + def stop(self): + """Stop running the event loop. + + Every callback scheduled before stop() is called will run. Callbacks + scheduled after stop() is called will not run. However, those callbacks + will run if run_forever is called again later. + """ + self.call_soon(_raise_stop_error) + + def close(self): + """Close the event loop. + + This clears the queues and shuts down the executor, + but does not wait for the executor to finish. + + The event loop must not be running. + """ + if self.is_running(): + raise RuntimeError("Cannot close a running event loop") + if self._closed: + return + if self._debug: + logger.debug("Close %r", self) + self._closed = True + self._ready.clear() + del self._scheduled[:] + executor = self._default_executor + if executor is not None: + self._default_executor = None + executor.shutdown(wait=False) + + def is_closed(self): + """Returns True if the event loop was closed.""" + return self._closed + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if not self.is_closed(): + warnings.warn("unclosed event loop %r" % self, ResourceWarning) + if not self.is_running(): + self.close() + + def is_running(self): + """Returns True if the event loop is running.""" + return (self._thread_id is not None) + + def time(self): + """Return the time according to the event loop's clock. + + This is a float expressed in seconds since an epoch, but the + epoch, precision, accuracy and drift are unspecified and may + differ per event loop. + """ + return time_monotonic() + + def call_later(self, delay, callback, *args): + """Arrange for a callback to be called at a given time. + + Return a Handle: an opaque object with a cancel() method that + can be used to cancel the call. + + The delay can be an int or float, expressed in seconds. It is + always relative to the current time. + + Each callback will be called exactly once. If two callbacks + are scheduled for exactly the same time, it undefined which + will be called first. + + Any positional arguments after the callback will be passed to + the callback when it is called. + """ + timer = self.call_at(self.time() + delay, callback, *args) + if timer._source_traceback: + del timer._source_traceback[-1] + return timer + + def call_at(self, when, callback, *args): + """Like call_later(), but uses an absolute time. + + Absolute time corresponds to the event loop's time() method. + """ + if (coroutines.iscoroutine(callback) + or coroutines.iscoroutinefunction(callback)): + raise TypeError("coroutines cannot be used with call_at()") + self._check_closed() + if self._debug: + self._check_thread() + timer = events.TimerHandle(when, callback, args, self) + if timer._source_traceback: + del timer._source_traceback[-1] + heapq.heappush(self._scheduled, timer) + timer._scheduled = True + return timer + + def call_soon(self, callback, *args): + """Arrange for a callback to be called as soon as possible. + + This operates as a FIFO queue: callbacks are called in the + order in which they are registered. Each callback will be + called exactly once. + + Any positional arguments after the callback will be passed to + the callback when it is called. + """ + if self._debug: + self._check_thread() + handle = self._call_soon(callback, args) + if handle._source_traceback: + del handle._source_traceback[-1] + return handle + + def _call_soon(self, callback, args): + if (coroutines.iscoroutine(callback) + or coroutines.iscoroutinefunction(callback)): + raise TypeError("coroutines cannot be used with call_soon()") + self._check_closed() + handle = events.Handle(callback, args, self) + if handle._source_traceback: + del handle._source_traceback[-1] + self._ready.append(handle) + return handle + + def _check_thread(self): + """Check that the current thread is the thread running the event loop. + + Non-thread-safe methods of this class make this assumption and will + likely behave incorrectly when the assumption is violated. + + Should only be called when (self._debug == True). The caller is + responsible for checking this condition for performance reasons. + """ + if self._thread_id is None: + return + thread_id = _get_thread_ident() + if thread_id != self._thread_id: + raise RuntimeError( + "Non-thread-safe operation invoked on an event loop other " + "than the current one") + + def call_soon_threadsafe(self, callback, *args): + """Like call_soon(), but thread-safe.""" + handle = self._call_soon(callback, args) + if handle._source_traceback: + del handle._source_traceback[-1] + self._write_to_self() + return handle + + def run_in_executor(self, executor, func, *args): + if (coroutines.iscoroutine(func) + or coroutines.iscoroutinefunction(func)): + raise TypeError("coroutines cannot be used with run_in_executor()") + self._check_closed() + if isinstance(func, events.Handle): + assert not args + assert not isinstance(func, events.TimerHandle) + if func._cancelled: + f = futures.Future(loop=self) + f.set_result(None) + return f + func, args = func._callback, func._args + if executor is None: + executor = self._default_executor + if executor is None: + executor = get_default_executor() + self._default_executor = executor + return futures.wrap_future(executor.submit(func, *args), loop=self) + + def set_default_executor(self, executor): + self._default_executor = executor + + def _getaddrinfo_debug(self, host, port, family, type, proto, flags): + msg = ["%s:%r" % (host, port)] + if family: + msg.append('family=%r' % family) + if type: + msg.append('type=%r' % type) + if proto: + msg.append('proto=%r' % proto) + if flags: + msg.append('flags=%r' % flags) + msg = ', '.join(msg) + logger.debug('Get address info %s', msg) + + t0 = self.time() + addrinfo = socket.getaddrinfo(host, port, family, type, proto, flags) + dt = self.time() - t0 + + msg = ('Getting address info %s took %.3f ms: %r' + % (msg, dt * 1e3, addrinfo)) + if dt >= self.slow_callback_duration: + logger.info(msg) + else: + logger.debug(msg) + return addrinfo + + def getaddrinfo(self, host, port, + family=0, type=0, proto=0, flags=0): + if self._debug: + return self.run_in_executor(None, self._getaddrinfo_debug, + host, port, family, type, proto, flags) + else: + return self.run_in_executor(None, socket.getaddrinfo, + host, port, family, type, proto, flags) + + def getnameinfo(self, sockaddr, flags=0): + return self.run_in_executor(None, socket.getnameinfo, sockaddr, flags) + + @coroutine + def create_connection(self, protocol_factory, host=None, port=None, + ssl=None, family=0, proto=0, flags=0, sock=None, + local_addr=None, server_hostname=None): + """Connect to a TCP server. + + Create a streaming transport connection to a given Internet host and + port: socket family AF_INET or socket.AF_INET6 depending on host (or + family if specified), socket type SOCK_STREAM. protocol_factory must be + a callable returning a protocol instance. + + This method is a coroutine which will try to establish the connection + in the background. When successful, the coroutine returns a + (transport, protocol) pair. + """ + if server_hostname is not None and not ssl: + raise ValueError('server_hostname is only meaningful with ssl') + + if server_hostname is None and ssl: + # Use host as default for server_hostname. It is an error + # if host is empty or not set, e.g. when an + # already-connected socket was passed or when only a port + # is given. To avoid this error, you can pass + # server_hostname='' -- this will bypass the hostname + # check. (This also means that if host is a numeric + # IP/IPv6 address, we will attempt to verify that exact + # address; this will probably fail, but it is possible to + # create a certificate for a specific IP address, so we + # don't judge it here.) + if not host: + raise ValueError('You must set server_hostname ' + 'when using ssl without a host') + server_hostname = host + + if host is not None or port is not None: + if sock is not None: + raise ValueError( + 'host/port and sock can not be specified at the same time') + + f1 = self.getaddrinfo( + host, port, family=family, + type=socket.SOCK_STREAM, proto=proto, flags=flags) + fs = [f1] + if local_addr is not None: + f2 = self.getaddrinfo( + *local_addr, family=family, + type=socket.SOCK_STREAM, proto=proto, flags=flags) + fs.append(f2) + else: + f2 = None + + yield From(tasks.wait(fs, loop=self)) + + infos = f1.result() + if not infos: + raise socket.error('getaddrinfo() returned empty list') + if f2 is not None: + laddr_infos = f2.result() + if not laddr_infos: + raise socket.error('getaddrinfo() returned empty list') + + exceptions = [] + for family, type, proto, cname, address in infos: + try: + sock = socket.socket(family=family, type=type, proto=proto) + sock.setblocking(False) + if f2 is not None: + for _, _, _, _, laddr in laddr_infos: + try: + sock.bind(laddr) + break + except socket.error as exc: + exc = socket.error( + exc.errno, 'error while ' + 'attempting to bind on address ' + '{0!r}: {1}'.format( + laddr, exc.strerror.lower())) + exceptions.append(exc) + else: + sock.close() + sock = None + continue + if self._debug: + logger.debug("connect %r to %r", sock, address) + yield From(self.sock_connect(sock, address)) + except socket.error as exc: + if sock is not None: + sock.close() + exceptions.append(exc) + except: + if sock is not None: + sock.close() + raise + else: + break + else: + if len(exceptions) == 1: + raise exceptions[0] + else: + # If they all have the same str(), raise one. + model = str(exceptions[0]) + if all(str(exc) == model for exc in exceptions): + raise exceptions[0] + # Raise a combined exception so the user can see all + # the various error messages. + raise socket.error('Multiple exceptions: {0}'.format( + ', '.join(str(exc) for exc in exceptions))) + + elif sock is None: + raise ValueError( + 'host and port was not specified and no sock specified') + + sock.setblocking(False) + + transport, protocol = yield From(self._create_connection_transport( + sock, protocol_factory, ssl, server_hostname)) + if self._debug: + # Get the socket from the transport because SSL transport closes + # the old socket and creates a new SSL socket + sock = transport.get_extra_info('socket') + logger.debug("%r connected to %s:%r: (%r, %r)", + sock, host, port, transport, protocol) + raise Return(transport, protocol) + + @coroutine + def _create_connection_transport(self, sock, protocol_factory, ssl, + server_hostname): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + if ssl: + sslcontext = None if isinstance(ssl, bool) else ssl + transport = self._make_ssl_transport( + sock, protocol, sslcontext, waiter, + server_side=False, server_hostname=server_hostname) + else: + transport = self._make_socket_transport(sock, protocol, waiter) + + try: + yield From(waiter) + except: + transport.close() + raise + + raise Return(transport, protocol) + + @coroutine + def create_datagram_endpoint(self, protocol_factory, + local_addr=None, remote_addr=None, + family=0, proto=0, flags=0): + """Create datagram connection.""" + if not (local_addr or remote_addr): + if family == 0: + raise ValueError('unexpected address family') + addr_pairs_info = (((family, proto), (None, None)),) + else: + # join address by (family, protocol) + addr_infos = OrderedDict() + for idx, addr in ((0, local_addr), (1, remote_addr)): + if addr is not None: + assert isinstance(addr, tuple) and len(addr) == 2, ( + '2-tuple is expected') + + infos = yield From(self.getaddrinfo( + *addr, family=family, type=socket.SOCK_DGRAM, + proto=proto, flags=flags)) + if not infos: + raise socket.error('getaddrinfo() returned empty list') + + for fam, _, pro, _, address in infos: + key = (fam, pro) + if key not in addr_infos: + addr_infos[key] = [None, None] + addr_infos[key][idx] = address + + # each addr has to have info for each (family, proto) pair + addr_pairs_info = [ + (key, addr_pair) for key, addr_pair in addr_infos.items() + if not ((local_addr and addr_pair[0] is None) or + (remote_addr and addr_pair[1] is None))] + + if not addr_pairs_info: + raise ValueError('can not get address information') + + exceptions = [] + + for ((family, proto), + (local_address, remote_address)) in addr_pairs_info: + sock = None + r_addr = None + try: + sock = socket.socket( + family=family, type=socket.SOCK_DGRAM, proto=proto) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setblocking(False) + + if local_addr: + sock.bind(local_address) + if remote_addr: + yield From(self.sock_connect(sock, remote_address)) + r_addr = remote_address + except socket.error as exc: + if sock is not None: + sock.close() + exceptions.append(exc) + except: + if sock is not None: + sock.close() + raise + else: + break + else: + raise exceptions[0] + + protocol = protocol_factory() + waiter = futures.Future(loop=self) + transport = self._make_datagram_transport(sock, protocol, r_addr, + waiter) + if self._debug: + if local_addr: + logger.info("Datagram endpoint local_addr=%r remote_addr=%r " + "created: (%r, %r)", + local_addr, remote_addr, transport, protocol) + else: + logger.debug("Datagram endpoint remote_addr=%r created: " + "(%r, %r)", + remote_addr, transport, protocol) + + try: + yield From(waiter) + except: + transport.close() + raise + + raise Return(transport, protocol) + + @coroutine + def create_server(self, protocol_factory, host=None, port=None, + family=socket.AF_UNSPEC, + flags=socket.AI_PASSIVE, + sock=None, + backlog=100, + ssl=None, + reuse_address=None): + """Create a TCP server bound to host and port. + + Return a Server object which can be used to stop the service. + + This method is a coroutine. + """ + if isinstance(ssl, bool): + raise TypeError('ssl argument must be an SSLContext or None') + if host is not None or port is not None: + if sock is not None: + raise ValueError( + 'host/port and sock can not be specified at the same time') + + AF_INET6 = getattr(socket, 'AF_INET6', 0) + if reuse_address is None: + reuse_address = os.name == 'posix' and sys.platform != 'cygwin' + sockets = [] + if host == '': + host = None + + infos = yield From(self.getaddrinfo( + host, port, family=family, + type=socket.SOCK_STREAM, proto=0, flags=flags)) + if not infos: + raise socket.error('getaddrinfo() returned empty list') + + completed = False + try: + for res in infos: + af, socktype, proto, canonname, sa = res + try: + sock = socket.socket(af, socktype, proto) + except socket.error: + # Assume it's a bad family/type/protocol combination. + if self._debug: + logger.warning('create_server() failed to create ' + 'socket.socket(%r, %r, %r)', + af, socktype, proto, exc_info=True) + continue + sockets.append(sock) + if reuse_address: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, + True) + # Disable IPv4/IPv6 dual stack support (enabled by + # default on Linux) which makes a single socket + # listen on both address families. + if af == AF_INET6 and hasattr(socket, 'IPPROTO_IPV6'): + sock.setsockopt(socket.IPPROTO_IPV6, + socket.IPV6_V6ONLY, + True) + try: + sock.bind(sa) + except socket.error as err: + raise socket.error(err.errno, + 'error while attempting ' + 'to bind on address %r: %s' + % (sa, err.strerror.lower())) + completed = True + finally: + if not completed: + for sock in sockets: + sock.close() + else: + if sock is None: + raise ValueError('Neither host/port nor sock were specified') + sockets = [sock] + + server = Server(self, sockets) + for sock in sockets: + sock.listen(backlog) + sock.setblocking(False) + self._start_serving(protocol_factory, sock, ssl, server) + if self._debug: + logger.info("%r is serving", server) + raise Return(server) + + @coroutine + def connect_read_pipe(self, protocol_factory, pipe): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + transport = self._make_read_pipe_transport(pipe, protocol, waiter) + + try: + yield From(waiter) + except: + transport.close() + raise + + if self._debug: + logger.debug('Read pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) + raise Return(transport, protocol) + + @coroutine + def connect_write_pipe(self, protocol_factory, pipe): + protocol = protocol_factory() + waiter = futures.Future(loop=self) + transport = self._make_write_pipe_transport(pipe, protocol, waiter) + + try: + yield From(waiter) + except: + transport.close() + raise + + if self._debug: + logger.debug('Write pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) + raise Return(transport, protocol) + + def _log_subprocess(self, msg, stdin, stdout, stderr): + info = [msg] + if stdin is not None: + info.append('stdin=%s' % _format_pipe(stdin)) + if stdout is not None and stderr == subprocess.STDOUT: + info.append('stdout=stderr=%s' % _format_pipe(stdout)) + else: + if stdout is not None: + info.append('stdout=%s' % _format_pipe(stdout)) + if stderr is not None: + info.append('stderr=%s' % _format_pipe(stderr)) + logger.debug(' '.join(info)) + + @coroutine + def subprocess_shell(self, protocol_factory, cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=False, shell=True, bufsize=0, + **kwargs): + if not isinstance(cmd, compat.string_types): + raise ValueError("cmd must be a string") + if universal_newlines: + raise ValueError("universal_newlines must be False") + if not shell: + raise ValueError("shell must be True") + if bufsize != 0: + raise ValueError("bufsize must be 0") + protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'run shell command %r' % cmd + self._log_subprocess(debug_log, stdin, stdout, stderr) + transport = yield From(self._make_subprocess_transport( + protocol, cmd, True, stdin, stdout, stderr, bufsize, **kwargs)) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) + raise Return(transport, protocol) + + @coroutine + def subprocess_exec(self, protocol_factory, program, *args, **kwargs): + stdin = kwargs.pop('stdin', subprocess.PIPE) + stdout = kwargs.pop('stdout', subprocess.PIPE) + stderr = kwargs.pop('stderr', subprocess.PIPE) + universal_newlines = kwargs.pop('universal_newlines', False) + shell = kwargs.pop('shell', False) + bufsize = kwargs.pop('bufsize', 0) + if universal_newlines: + raise ValueError("universal_newlines must be False") + if shell: + raise ValueError("shell must be False") + if bufsize != 0: + raise ValueError("bufsize must be 0") + popen_args = (program,) + args + for arg in popen_args: + if not isinstance(arg, compat.string_types ): + raise TypeError("program arguments must be " + "a bytes or text string, not %s" + % type(arg).__name__) + protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'execute program %r' % program + self._log_subprocess(debug_log, stdin, stdout, stderr) + transport = yield From(self._make_subprocess_transport( + protocol, popen_args, False, stdin, stdout, stderr, + bufsize, **kwargs)) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) + raise Return(transport, protocol) + + def set_exception_handler(self, handler): + """Set handler as the new event loop exception handler. + + If handler is None, the default exception handler will + be set. + + If handler is a callable object, it should have a + signature matching '(loop, context)', where 'loop' + will be a reference to the active event loop, 'context' + will be a dict object (see `call_exception_handler()` + documentation for details about context). + """ + if handler is not None and not callable(handler): + raise TypeError('A callable object or None is expected, ' + 'got {0!r}'.format(handler)) + self._exception_handler = handler + + def default_exception_handler(self, context): + """Default exception handler. + + This is called when an exception occurs and no exception + handler is set, and can be called by a custom exception + handler that wants to defer to the default behavior. + + The context parameter has the same meaning as in + `call_exception_handler()`. + """ + message = context.get('message') + if not message: + message = 'Unhandled exception in event loop' + + exception = context.get('exception') + if exception is not None: + if hasattr(exception, '__traceback__'): + # Python 3 + tb = exception.__traceback__ + else: + # call_exception_handler() is usually called indirectly + # from an except block. If it's not the case, the traceback + # is undefined... + tb = sys.exc_info()[2] + exc_info = (type(exception), exception, tb) + else: + exc_info = False + + if ('source_traceback' not in context + and self._current_handle is not None + and self._current_handle._source_traceback): + context['handle_traceback'] = self._current_handle._source_traceback + + log_lines = [message] + for key in sorted(context): + if key in ('message', 'exception'): + continue + value = context[key] + if key == 'source_traceback': + tb = ''.join(traceback.format_list(value)) + value = 'Object created at (most recent call last):\n' + value += tb.rstrip() + elif key == 'handle_traceback': + tb = ''.join(traceback.format_list(value)) + value = 'Handle created at (most recent call last):\n' + value += tb.rstrip() + else: + value = repr(value) + log_lines.append('{0}: {1}'.format(key, value)) + + logger.error('\n'.join(log_lines), exc_info=exc_info) + + def call_exception_handler(self, context): + """Call the current event loop's exception handler. + + The context argument is a dict containing the following keys: + + - 'message': Error message; + - 'exception' (optional): Exception object; + - 'future' (optional): Future instance; + - 'handle' (optional): Handle instance; + - 'protocol' (optional): Protocol instance; + - 'transport' (optional): Transport instance; + - 'socket' (optional): Socket instance. + + New keys maybe introduced in the future. + + Note: do not overload this method in an event loop subclass. + For custom exception handling, use the + `set_exception_handler()` method. + """ + if self._exception_handler is None: + try: + self.default_exception_handler(context) + except Exception: + # Second protection layer for unexpected errors + # in the default implementation, as well as for subclassed + # event loops with overloaded "default_exception_handler". + logger.error('Exception in default exception handler', + exc_info=True) + else: + try: + self._exception_handler(self, context) + except Exception as exc: + # Exception in the user set custom exception handler. + try: + # Let's try default handler. + self.default_exception_handler({ + 'message': 'Unhandled error in exception handler', + 'exception': exc, + 'context': context, + }) + except Exception: + # Guard 'default_exception_handler' in case it is + # overloaded. + logger.error('Exception in default exception handler ' + 'while handling an unexpected error ' + 'in custom exception handler', + exc_info=True) + + def _add_callback(self, handle): + """Add a Handle to _scheduled (TimerHandle) or _ready.""" + assert isinstance(handle, events.Handle), 'A Handle is required here' + if handle._cancelled: + return + assert not isinstance(handle, events.TimerHandle) + self._ready.append(handle) + + def _add_callback_signalsafe(self, handle): + """Like _add_callback() but called from a signal handler.""" + self._add_callback(handle) + self._write_to_self() + + def _timer_handle_cancelled(self, handle): + """Notification that a TimerHandle has been cancelled.""" + if handle._scheduled: + self._timer_cancelled_count += 1 + + def _run_once(self): + """Run one full iteration of the event loop. + + This calls all currently ready callbacks, polls for I/O, + schedules the resulting callbacks, and finally schedules + 'call_later' callbacks. + """ + + sched_count = len(self._scheduled) + if (sched_count > _MIN_SCHEDULED_TIMER_HANDLES and + float(self._timer_cancelled_count) / sched_count > + _MIN_CANCELLED_TIMER_HANDLES_FRACTION): + # Remove delayed calls that were cancelled if their number + # is too high + new_scheduled = [] + for handle in self._scheduled: + if handle._cancelled: + handle._scheduled = False + else: + new_scheduled.append(handle) + + heapq.heapify(new_scheduled) + self._scheduled = new_scheduled + self._timer_cancelled_count = 0 + else: + # Remove delayed calls that were cancelled from head of queue. + while self._scheduled and self._scheduled[0]._cancelled: + self._timer_cancelled_count -= 1 + handle = heapq.heappop(self._scheduled) + handle._scheduled = False + + timeout = None + if self._ready: + timeout = 0 + elif self._scheduled: + # Compute the desired timeout. + when = self._scheduled[0]._when + timeout = max(0, when - self.time()) + + if self._debug and timeout != 0: + t0 = self.time() + event_list = self._selector.select(timeout) + dt = self.time() - t0 + if dt >= 1.0: + level = logging.INFO + else: + level = logging.DEBUG + nevent = len(event_list) + if timeout is None: + logger.log(level, 'poll took %.3f ms: %s events', + dt * 1e3, nevent) + elif nevent: + logger.log(level, + 'poll %.3f ms took %.3f ms: %s events', + timeout * 1e3, dt * 1e3, nevent) + elif dt >= 1.0: + logger.log(level, + 'poll %.3f ms took %.3f ms: timeout', + timeout * 1e3, dt * 1e3) + else: + event_list = self._selector.select(timeout) + self._process_events(event_list) + + # Handle 'later' callbacks that are ready. + end_time = self.time() + self._clock_resolution + while self._scheduled: + handle = self._scheduled[0] + if handle._when >= end_time: + break + handle = heapq.heappop(self._scheduled) + handle._scheduled = False + self._ready.append(handle) + + # This is the only place where callbacks are actually *called*. + # All other places just add them to ready. + # Note: We run all currently scheduled callbacks, but not any + # callbacks scheduled by callbacks run this time around -- + # they will be run the next time (after another I/O poll). + # Use an idiom that is thread-safe without using locks. + ntodo = len(self._ready) + for i in range(ntodo): + handle = self._ready.popleft() + if handle._cancelled: + continue + if self._debug: + try: + self._current_handle = handle + t0 = self.time() + handle._run() + dt = self.time() - t0 + if dt >= self.slow_callback_duration: + logger.warning('Executing %s took %.3f seconds', + _format_handle(handle), dt) + finally: + self._current_handle = None + else: + handle._run() + handle = None # Needed to break cycles when an exception occurs. + + def _set_coroutine_wrapper(self, enabled): + try: + set_wrapper = sys.set_coroutine_wrapper + get_wrapper = sys.get_coroutine_wrapper + except AttributeError: + return + + enabled = bool(enabled) + if self._coroutine_wrapper_set == enabled: + return + + wrapper = coroutines.debug_wrapper + current_wrapper = get_wrapper() + + if enabled: + if current_wrapper not in (None, wrapper): + warnings.warn( + "loop.set_debug(True): cannot set debug coroutine " + "wrapper; another wrapper is already set %r" % + current_wrapper, RuntimeWarning) + else: + set_wrapper(wrapper) + self._coroutine_wrapper_set = True + else: + if current_wrapper not in (None, wrapper): + warnings.warn( + "loop.set_debug(False): cannot unset debug coroutine " + "wrapper; another wrapper was set %r" % + current_wrapper, RuntimeWarning) + else: + set_wrapper(None) + self._coroutine_wrapper_set = False + + def get_debug(self): + return self._debug + + def set_debug(self, enabled): + self._debug = enabled + + if self.is_running(): + self._set_coroutine_wrapper(enabled) diff --git a/.local/lib/python2.7/site-packages/trollius/base_events.pyc b/.local/lib/python2.7/site-packages/trollius/base_events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..559c4714d5bd7246dbfcd5bfd2db2a145fabf1d8 GIT binary patch literal 40761 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 F{x4Odk~07R literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/base_subprocess.py b/.local/lib/python2.7/site-packages/trollius/base_subprocess.py new file mode 100644 index 00000000..ffd6e762 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/base_subprocess.py @@ -0,0 +1,282 @@ +import collections +import subprocess +import warnings + +from . import compat +from . import futures +from . import protocols +from . import transports +from .coroutines import coroutine, From, Return +from .log import logger +from .py33_exceptions import ProcessLookupError + + +class BaseSubprocessTransport(transports.SubprocessTransport): + + def __init__(self, loop, protocol, args, shell, + stdin, stdout, stderr, bufsize, + waiter=None, extra=None, **kwargs): + super(BaseSubprocessTransport, self).__init__(extra) + self._closed = False + self._protocol = protocol + self._loop = loop + self._proc = None + self._pid = None + self._returncode = None + self._exit_waiters = [] + self._pending_calls = collections.deque() + self._pipes = {} + self._finished = False + + if stdin == subprocess.PIPE: + self._pipes[0] = None + if stdout == subprocess.PIPE: + self._pipes[1] = None + if stderr == subprocess.PIPE: + self._pipes[2] = None + + # Create the child process: set the _proc attribute + try: + self._start(args=args, shell=shell, stdin=stdin, stdout=stdout, + stderr=stderr, bufsize=bufsize, **kwargs) + except: + self.close() + raise + + self._pid = self._proc.pid + self._extra['subprocess'] = self._proc + + if self._loop.get_debug(): + if isinstance(args, (bytes, str)): + program = args + else: + program = args[0] + logger.debug('process %r created: pid %s', + program, self._pid) + + self._loop.create_task(self._connect_pipes(waiter)) + + def __repr__(self): + info = [self.__class__.__name__] + if self._closed: + info.append('closed') + if self._pid is not None: + info.append('pid=%s' % self._pid) + if self._returncode is not None: + info.append('returncode=%s' % self._returncode) + elif self._pid is not None: + info.append('running') + else: + info.append('not started') + + stdin = self._pipes.get(0) + if stdin is not None: + info.append('stdin=%s' % stdin.pipe) + + stdout = self._pipes.get(1) + stderr = self._pipes.get(2) + if stdout is not None and stderr is stdout: + info.append('stdout=stderr=%s' % stdout.pipe) + else: + if stdout is not None: + info.append('stdout=%s' % stdout.pipe) + if stderr is not None: + info.append('stderr=%s' % stderr.pipe) + + return '<%s>' % ' '.join(info) + + def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): + raise NotImplementedError + + def close(self): + if self._closed: + return + self._closed = True + + for proto in self._pipes.values(): + if proto is None: + continue + proto.pipe.close() + + if (self._proc is not None + # the child process finished? + and self._returncode is None + # the child process finished but the transport was not notified yet? + and self._proc.poll() is None + ): + if self._loop.get_debug(): + logger.warning('Close running child process: kill %r', self) + + try: + self._proc.kill() + except ProcessLookupError: + pass + + # Don't clear the _proc reference yet: _post_init() may still run + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if not self._closed: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self.close() + + def get_pid(self): + return self._pid + + def get_returncode(self): + return self._returncode + + def get_pipe_transport(self, fd): + if fd in self._pipes: + return self._pipes[fd].pipe + else: + return None + + def _check_proc(self): + if self._proc is None: + raise ProcessLookupError() + + def send_signal(self, signal): + self._check_proc() + self._proc.send_signal(signal) + + def terminate(self): + self._check_proc() + self._proc.terminate() + + def kill(self): + self._check_proc() + self._proc.kill() + + @coroutine + def _connect_pipes(self, waiter): + try: + proc = self._proc + loop = self._loop + + if proc.stdin is not None: + _, pipe = yield From(loop.connect_write_pipe( + lambda: WriteSubprocessPipeProto(self, 0), + proc.stdin)) + self._pipes[0] = pipe + + if proc.stdout is not None: + _, pipe = yield From(loop.connect_read_pipe( + lambda: ReadSubprocessPipeProto(self, 1), + proc.stdout)) + self._pipes[1] = pipe + + if proc.stderr is not None: + _, pipe = yield From(loop.connect_read_pipe( + lambda: ReadSubprocessPipeProto(self, 2), + proc.stderr)) + self._pipes[2] = pipe + + assert self._pending_calls is not None + + loop.call_soon(self._protocol.connection_made, self) + for callback, data in self._pending_calls: + loop.call_soon(callback, *data) + self._pending_calls = None + except Exception as exc: + if waiter is not None and not waiter.cancelled(): + waiter.set_exception(exc) + else: + if waiter is not None and not waiter.cancelled(): + waiter.set_result(None) + + def _call(self, cb, *data): + if self._pending_calls is not None: + self._pending_calls.append((cb, data)) + else: + self._loop.call_soon(cb, *data) + + def _pipe_connection_lost(self, fd, exc): + self._call(self._protocol.pipe_connection_lost, fd, exc) + self._try_finish() + + def _pipe_data_received(self, fd, data): + self._call(self._protocol.pipe_data_received, fd, data) + + def _process_exited(self, returncode): + assert returncode is not None, returncode + assert self._returncode is None, self._returncode + if self._loop.get_debug(): + logger.info('%r exited with return code %r', + self, returncode) + self._returncode = returncode + self._call(self._protocol.process_exited) + self._try_finish() + + # wake up futures waiting for wait() + for waiter in self._exit_waiters: + if not waiter.cancelled(): + waiter.set_result(returncode) + self._exit_waiters = None + + @coroutine + def _wait(self): + """Wait until the process exit and return the process return code. + + This method is a coroutine.""" + if self._returncode is not None: + raise Return(self._returncode) + + waiter = futures.Future(loop=self._loop) + self._exit_waiters.append(waiter) + returncode = yield From(waiter) + raise Return(returncode) + + def _try_finish(self): + assert not self._finished + if self._returncode is None: + return + if all(p is not None and p.disconnected + for p in self._pipes.values()): + self._finished = True + self._call(self._call_connection_lost, None) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._loop = None + self._proc = None + self._protocol = None + + +class WriteSubprocessPipeProto(protocols.BaseProtocol): + + def __init__(self, proc, fd): + self.proc = proc + self.fd = fd + self.pipe = None + self.disconnected = False + + def connection_made(self, transport): + self.pipe = transport + + def __repr__(self): + return ('<%s fd=%s pipe=%r>' + % (self.__class__.__name__, self.fd, self.pipe)) + + def connection_lost(self, exc): + self.disconnected = True + self.proc._pipe_connection_lost(self.fd, exc) + self.proc = None + + def pause_writing(self): + self.proc._protocol.pause_writing() + + def resume_writing(self): + self.proc._protocol.resume_writing() + + +class ReadSubprocessPipeProto(WriteSubprocessPipeProto, + protocols.Protocol): + + def data_received(self, data): + self.proc._pipe_data_received(self.fd, data) diff --git a/.local/lib/python2.7/site-packages/trollius/base_subprocess.pyc b/.local/lib/python2.7/site-packages/trollius/base_subprocess.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cc9c667a4e5a2a13c5a69ff979e9f3f388cdb5c GIT binary patch literal 11877 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/compat.py b/.local/lib/python2.7/site-packages/trollius/compat.py new file mode 100644 index 00000000..df64abac --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/compat.py @@ -0,0 +1,69 @@ +"""Compatibility helpers for the different Python versions.""" + +import six +import sys + +# Python 2.6 or older? +PY26 = (sys.version_info < (2, 7)) + +# Python 3.3 or newer? +PY33 = (sys.version_info >= (3, 3)) + +# Python 3.4 or newer? +PY34 = sys.version_info >= (3, 4) + +# Python 3.5 or newer? +PY35 = sys.version_info >= (3, 5) + +if six.PY3: + integer_types = (int,) + bytes_type = bytes + text_type = str + string_types = (bytes, str) + BYTES_TYPES = (bytes, bytearray, memoryview) +else: + integer_types = (int, long,) + bytes_type = str + text_type = unicode + string_types = basestring + if PY26: + BYTES_TYPES = (str, bytearray, buffer) + else: # Python 2.7 + BYTES_TYPES = (str, bytearray, memoryview, buffer) + + +if six.PY3: + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value +else: + exec("""def reraise(tp, value, tb=None): raise tp, value, tb""") + + +def flatten_bytes(data): + """ + Convert bytes-like objects (bytes, bytearray, memoryview, buffer) to + a bytes string. + """ + if not isinstance(data, BYTES_TYPES): + raise TypeError('data argument must be byte-ish (%r)', + type(data)) + if PY34: + # In Python 3.4, socket.send() and bytes.join() accept memoryview + # and bytearray + return data + if not data: + return b'' + if six.PY2 and isinstance(data, (buffer, bytearray)): + return str(data) + elif not PY26 and isinstance(data, memoryview): + return data.tobytes() + else: + return data + + +def flatten_list_bytes(data): + """Concatenate a sequence of bytes-like objects.""" + data = map(flatten_bytes, data) + return b''.join(data) diff --git a/.local/lib/python2.7/site-packages/trollius/compat.pyc b/.local/lib/python2.7/site-packages/trollius/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e353d678f9334cd7e80601fdc7d67b8b85f9a838 GIT binary patch literal 2063 zcmcIk-ESL35T8AN#CDvxF=@Rj%MXT+<|!o29-kGWwBa_Ef%*x37FNu{syWJV~pGY zwGD$Ns2v#W5|7Lnv$UAM18NV(B^b0J`;J`H8@!8NXpdg|>~)vz%V2*ey+W^p!mC|q z_E=e_P@6OSN!2Aac!|fj2U!i0I%&$^Ck=RsmAwhcHZyOLy5G4&-FbrK)GU^f*CU;3 zzm`*#E|qn1Y^?NCB@;a!E2}auFV=o)GI@==+GMV)|H9{72N*(c5h)R&#_I}_m_%A+ zaEi-4K=LCt3~2!KI@tGE6eQjV_*p>42FT!z^*eZTaNZ$zzk_5r^frpsD2nIE?xN2*^RM`uIgSioshQ#O8 zWC#c^M{BR#ajNG^n$b+f-pLN@j(97wHd-Iag<2T9zSinFs#gT8L+K3%it-TBd8@NY zmv!!aOp`=Dl98RP76ih@%3(6a#>d)CW#>bCi0vVy5J<2L#Glid^HCNnzm4M4tIM7tdI2qT&|bu%vxiyU+94nGZ$AUA7f9kI{kvb7gvuw-D!SOcBPWImfX zPJCM*gTotc0Rx#+P%Zxl5~=cW8hNj>VcvBr;~o;Iv_usVSuK_ETNdw%hBy$7;2)e( z!KY;X4iao6f($Pm(eV>c%vn$XgnvYLOy(wwBTR)$M$)MtRtj4!&GG1|}C;Zi!=aGkB zHBoj*7TO){3;L$tHaGRigB5o30Jq5#oX%~s&u+97A9Gx>MNRq?je$D&=k#5D}RH!s3VrE WqAA*_Cyw5B&@R(iz{SA; literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/constants.py b/.local/lib/python2.7/site-packages/trollius/constants.py new file mode 100644 index 00000000..f9e12328 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/constants.py @@ -0,0 +1,7 @@ +"""Constants.""" + +# After the connection is lost, log warnings after this many write()s. +LOG_THRESHOLD_FOR_CONNLOST_WRITES = 5 + +# Seconds to wait before retrying accept(). +ACCEPT_RETRY_DELAY = 1 diff --git a/.local/lib/python2.7/site-packages/trollius/constants.pyc b/.local/lib/python2.7/site-packages/trollius/constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bc2e1fb7ba9277ef1f0e3b439f60ce51abe8d49 GIT binary patch literal 278 zcmYL^UrWO<5Wv$#HyQZigYUi-#72D42T?~?H=#6=24n>}Y7$&DYsQj3_yPRHegUsA z^x%H?|G1++$J6ig`&UKwlAwJ+4W|fANP|pBlMp>3&4_49>hxf!PZ7EALTtMjGJA-j z9fqrvBI5)BpuGZ!XXuxF0dgsdddbT aO#NMqtw*@)cH?#L%-wK$7#= 0 + offset = frame.f_lasti + 1 + instr = code.co_code[offset] + return (instr == _YIELD_FROM) + + +class CoroWrapper: + # Wrapper for coroutine object in _DEBUG mode. + + def __init__(self, gen, func=None): + assert inspect.isgenerator(gen) or inspect.iscoroutine(gen), gen + self.gen = gen + self.func = func # Used to unwrap @coroutine decorator + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + self.__name__ = getattr(gen, '__name__', None) + self.__qualname__ = getattr(gen, '__qualname__', None) + + def __repr__(self): + coro_repr = _format_coroutine(self) + if self._source_traceback: + frame = self._source_traceback[-1] + coro_repr += ', created at %s:%s' % (frame[0], frame[1]) + return '<%s %s>' % (self.__class__.__name__, coro_repr) + + def __iter__(self): + return self + + def __next__(self): + return next(self.gen) + next = __next__ + + if _YIELD_FROM_BUG: + # For for CPython issue #21209: using "yield from" and a custom + # generator, generator.send(tuple) unpacks the tuple instead of passing + # the tuple unchanged. Check if the caller is a generator using "yield + # from" to decide if the parameter should be unpacked or not. + def send(self, *value): + frame = sys._getframe() + caller = frame.f_back + assert caller.f_lasti >= 0 + if caller.f_code.co_code[caller.f_lasti] != _YIELD_FROM: + value = value[0] + return self.gen.send(value) + else: + def send(self, value): + return self.gen.send(value) + + def throw(self, exc_type, exc_value=None, exc_tb=None): + return self.gen.throw(exc_type, exc_value, exc_tb) + + def close(self): + return self.gen.close() + + @property + def gi_frame(self): + return self.gen.gi_frame + + @property + def gi_running(self): + return self.gen.gi_running + + @property + def gi_code(self): + return self.gen.gi_code + + if compat.PY35: + + __await__ = __iter__ # make compatible with 'await' expression + + @property + def gi_yieldfrom(self): + return self.gen.gi_yieldfrom + + @property + def cr_await(self): + return self.gen.cr_await + + @property + def cr_running(self): + return self.gen.cr_running + + @property + def cr_code(self): + return self.gen.cr_code + + @property + def cr_frame(self): + return self.gen.cr_frame + + def __del__(self): + # Be careful accessing self.gen.frame -- self.gen might not exist. + gen = getattr(self, 'gen', None) + frame = getattr(gen, 'gi_frame', None) + if frame is None: + frame = getattr(gen, 'cr_frame', None) + if frame is not None and frame.f_lasti == -1: + msg = '%r was never yielded from' % self + tb = getattr(self, '_source_traceback', ()) + if tb: + tb = ''.join(traceback.format_list(tb)) + msg += ('\nCoroutine object created at ' + '(most recent call last):\n') + msg += tb.rstrip() + logger.error(msg) + +if not compat.PY34: + # Backport functools.update_wrapper() from Python 3.4: + # - Python 2.7 fails if assigned attributes don't exist + # - Python 2.7 and 3.1 don't set the __wrapped__ attribute + # - Python 3.2 and 3.3 set __wrapped__ before updating __dict__ + def _update_wrapper(wrapper, + wrapped, + assigned = functools.WRAPPER_ASSIGNMENTS, + updated = functools.WRAPPER_UPDATES): + """Update a wrapper function to look like the wrapped function + + wrapper is the function to be updated + wrapped is the original function + assigned is a tuple naming the attributes assigned directly + from the wrapped function to the wrapper function (defaults to + functools.WRAPPER_ASSIGNMENTS) + updated is a tuple naming the attributes of the wrapper that + are updated with the corresponding attribute from the wrapped + function (defaults to functools.WRAPPER_UPDATES) + """ + for attr in assigned: + try: + value = getattr(wrapped, attr) + except AttributeError: + pass + else: + setattr(wrapper, attr, value) + for attr in updated: + getattr(wrapper, attr).update(getattr(wrapped, attr, {})) + # Issue #17482: set __wrapped__ last so we don't inadvertently copy it + # from the wrapped function when updating __dict__ + wrapper.__wrapped__ = wrapped + # Return the wrapper so this can be used as a decorator via partial() + return wrapper + + def _wraps(wrapped, + assigned = functools.WRAPPER_ASSIGNMENTS, + updated = functools.WRAPPER_UPDATES): + """Decorator factory to apply update_wrapper() to a wrapper function + + Returns a decorator that invokes update_wrapper() with the decorated + function as the wrapper argument and the arguments to wraps() as the + remaining arguments. Default arguments are as for update_wrapper(). + This is a convenience function to simplify applying partial() to + update_wrapper(). + """ + return functools.partial(_update_wrapper, wrapped=wrapped, + assigned=assigned, updated=updated) +else: + _wraps = functools.wraps + +_PEP479 = (sys.version_info >= (3, 5)) +if _PEP479: + # Need exec() because yield+return raises a SyntaxError on Python 2 + exec(textwrap.dedent(''' + def pep479_wrapper(func, coro_func): + @_wraps(func) + def pep479_wrapped(*args, **kw): + coro = coro_func(*args, **kw) + value = None + error = None + while True: + try: + if error is not None: + value = coro.throw(error) + elif value is not None: + value = coro.send(value) + else: + value = next(coro) + except RuntimeError: + # FIXME: special case for + # FIXME: "isinstance(exc.__context__, StopIteration)"? + raise + except StopIteration as exc: + return exc.value + except Return as exc: + exc.raised = True + return exc.value + except BaseException as exc: + raise + + try: + value = yield value + error = None + except BaseException as exc: + value = None + error = exc + + return pep479_wrapped + ''')) + + +def coroutine(func): + """Decorator to mark coroutines. + + If the coroutine is not yielded from before it is destroyed, + an error message is logged. + """ + if _inspect_iscoroutinefunction(func): + # In Python 3.5 that's all we need to do for coroutines + # defiend with "async def". + # Wrapping in CoroWrapper will happen via + # 'sys.set_coroutine_wrapper' function. + return func + + if inspect.isgeneratorfunction(func): + coro = func + else: + @_wraps(func) + def coro(*args, **kw): + res = func(*args, **kw) + if (isinstance(res, futures._FUTURE_CLASSES) + or inspect.isgenerator(res)): + res = yield From(res) + elif _AwaitableABC is not None: + # If 'func' returns an Awaitable (new in 3.5) we + # want to run it. + try: + await_meth = res.__await__ + except AttributeError: + pass + else: + if isinstance(res, _AwaitableABC): + res = yield From(await_meth()) + raise Return(res) + + if _PEP479: + # FIXME: use @_wraps + coro = pep479_wrapper(func, coro) + coro = _wraps(func)(coro) + + if not _DEBUG: + if _types_coroutine is None: + wrapper = coro + else: + wrapper = _types_coroutine(coro) + else: + @_wraps(func) + def wrapper(*args, **kwds): + w = CoroWrapper(coro(*args, **kwds), func=func) + if w._source_traceback: + del w._source_traceback[-1] + # Python < 3.5 does not implement __qualname__ + # on generator objects, so we set it manually. + # We use getattr as some callables (such as + # functools.partial may lack __qualname__). + w.__name__ = getattr(func, '__name__', None) + w.__qualname__ = getattr(func, '__qualname__', None) + return w + + wrapper._is_coroutine = True # For iscoroutinefunction(). + return wrapper + + +def iscoroutinefunction(func): + """Return True if func is a decorated coroutine function.""" + return (getattr(func, '_is_coroutine', False) or + _inspect_iscoroutinefunction(func)) + + +_COROUTINE_TYPES = (types.GeneratorType, CoroWrapper) +if _CoroutineABC is not None: + _COROUTINE_TYPES += (_CoroutineABC,) +if events.asyncio is not None: + # Accept also asyncio CoroWrapper for interoperability + if hasattr(events.asyncio, 'coroutines'): + _COROUTINE_TYPES += (events.asyncio.coroutines.CoroWrapper,) + else: + # old asyncio/Python versions + _COROUTINE_TYPES += (events.asyncio.tasks.CoroWrapper,) + +def iscoroutine(obj): + """Return True if obj is a coroutine object.""" + return isinstance(obj, _COROUTINE_TYPES) + + +def _format_coroutine(coro): + assert iscoroutine(coro) + + coro_name = None + if isinstance(coro, CoroWrapper): + func = coro.func + coro_name = coro.__qualname__ + if coro_name is not None: + coro_name = '{0}()'.format(coro_name) + else: + func = coro + + if coro_name is None: + coro_name = events._format_callback(func, ()) + + try: + coro_code = coro.gi_code + except AttributeError: + coro_code = coro.cr_code + + try: + coro_frame = coro.gi_frame + except AttributeError: + coro_frame = coro.cr_frame + + filename = coro_code.co_filename + if (isinstance(coro, CoroWrapper) + and not inspect.isgeneratorfunction(coro.func) + and coro.func is not None): + filename, lineno = events._get_function_source(coro.func) + if coro_frame is None: + coro_repr = ('%s done, defined at %s:%s' + % (coro_name, filename, lineno)) + else: + coro_repr = ('%s running, defined at %s:%s' + % (coro_name, filename, lineno)) + elif coro_frame is not None: + lineno = coro_frame.f_lineno + coro_repr = ('%s running at %s:%s' + % (coro_name, filename, lineno)) + else: + lineno = coro_code.co_firstlineno + coro_repr = ('%s done, defined at %s:%s' + % (coro_name, filename, lineno)) + + return coro_repr + + +class FromWrapper(object): + __slots__ = ('obj',) + + def __init__(self, obj): + if isinstance(obj, FromWrapper): + obj = obj.obj + assert not isinstance(obj, FromWrapper) + self.obj = obj + +def From(obj): + if not _DEBUG: + return obj + else: + return FromWrapper(obj) diff --git a/.local/lib/python2.7/site-packages/trollius/coroutines.pyc b/.local/lib/python2.7/site-packages/trollius/coroutines.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cd70d4bfe69223b81b8347046daee89bce35b1d GIT binary patch literal 16085 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/events.py b/.local/lib/python2.7/site-packages/trollius/events.py new file mode 100644 index 00000000..52611612 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/events.py @@ -0,0 +1,626 @@ +"""Event loop and event loop policy.""" +from __future__ import absolute_import + +__all__ = ['AbstractEventLoopPolicy', + 'AbstractEventLoop', 'AbstractServer', + 'Handle', 'TimerHandle', + 'get_event_loop_policy', 'set_event_loop_policy', + 'get_event_loop', 'set_event_loop', 'new_event_loop', + 'get_child_watcher', 'set_child_watcher', + ] + +import functools +import inspect +import socket +import subprocess +import sys +import threading +import traceback +try: + import reprlib # Python 3 +except ImportError: + import repr as reprlib # Python 2 + +try: + import asyncio +except (ImportError, SyntaxError): + # ignore SyntaxError for convenience: ignore SyntaxError caused by "yield + # from" if asyncio module is in the Python path + asyncio = None + +from trollius import compat + + +def _get_function_source(func): + if compat.PY34: + func = inspect.unwrap(func) + elif hasattr(func, '__wrapped__'): + func = func.__wrapped__ + if inspect.isfunction(func): + code = func.__code__ + return (code.co_filename, code.co_firstlineno) + if isinstance(func, functools.partial): + return _get_function_source(func.func) + if compat.PY34 and isinstance(func, functools.partialmethod): + return _get_function_source(func.func) + return None + + +def _format_args(args): + """Format function arguments. + + Special case for a single parameter: ('hello',) is formatted as ('hello'). + """ + # use reprlib to limit the length of the output + args_repr = reprlib.repr(args) + if len(args) == 1 and args_repr.endswith(',)'): + args_repr = args_repr[:-2] + ')' + return args_repr + + +def _format_callback(func, args, suffix=''): + if isinstance(func, functools.partial): + if args is not None: + suffix = _format_args(args) + suffix + return _format_callback(func.func, func.args, suffix) + + if hasattr(func, '__qualname__'): + func_repr = getattr(func, '__qualname__') + elif hasattr(func, '__name__'): + func_repr = getattr(func, '__name__') + else: + func_repr = repr(func) + + if args is not None: + func_repr += _format_args(args) + if suffix: + func_repr += suffix + return func_repr + +def _format_callback_source(func, args): + func_repr = _format_callback(func, args) + source = _get_function_source(func) + if source: + func_repr += ' at %s:%s' % source + return func_repr + + +class Handle(object): + """Object returned by callback registration methods.""" + + __slots__ = ('_callback', '_args', '_cancelled', '_loop', + '_source_traceback', '_repr', '__weakref__') + + def __init__(self, callback, args, loop): + assert not isinstance(callback, Handle), 'A Handle is not a callback' + self._loop = loop + self._callback = callback + self._args = args + self._cancelled = False + self._repr = None + if self._loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + else: + self._source_traceback = None + + def _repr_info(self): + info = [self.__class__.__name__] + if self._cancelled: + info.append('cancelled') + if self._callback is not None: + info.append(_format_callback_source(self._callback, self._args)) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return info + + def __repr__(self): + if self._repr is not None: + return self._repr + info = self._repr_info() + return '<%s>' % ' '.join(info) + + def cancel(self): + if not self._cancelled: + self._cancelled = True + if self._loop.get_debug(): + # Keep a representation in debug mode to keep callback and + # parameters. For example, to log the warning + # "Executing took 2.5 second" + self._repr = repr(self) + self._callback = None + self._args = None + + def _run(self): + try: + self._callback(*self._args) + except Exception as exc: + cb = _format_callback_source(self._callback, self._args) + msg = 'Exception in callback {0}'.format(cb) + context = { + 'message': msg, + 'exception': exc, + 'handle': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + self = None # Needed to break cycles when an exception occurs. + + +class TimerHandle(Handle): + """Object returned by timed callback registration methods.""" + + __slots__ = ['_scheduled', '_when'] + + def __init__(self, when, callback, args, loop): + assert when is not None + super(TimerHandle, self).__init__(callback, args, loop) + if self._source_traceback: + del self._source_traceback[-1] + self._when = when + self._scheduled = False + + def _repr_info(self): + info = super(TimerHandle, self)._repr_info() + pos = 2 if self._cancelled else 1 + info.insert(pos, 'when=%s' % self._when) + return info + + def __hash__(self): + return hash(self._when) + + def __lt__(self, other): + return self._when < other._when + + def __le__(self, other): + if self._when < other._when: + return True + return self.__eq__(other) + + def __gt__(self, other): + return self._when > other._when + + def __ge__(self, other): + if self._when > other._when: + return True + return self.__eq__(other) + + def __eq__(self, other): + if isinstance(other, TimerHandle): + return (self._when == other._when and + self._callback == other._callback and + self._args == other._args and + self._cancelled == other._cancelled) + return NotImplemented + + def __ne__(self, other): + equal = self.__eq__(other) + return NotImplemented if equal is NotImplemented else not equal + + def cancel(self): + if not self._cancelled: + self._loop._timer_handle_cancelled(self) + super(TimerHandle, self).cancel() + + +class AbstractServer(object): + """Abstract server returned by create_server().""" + + def close(self): + """Stop serving. This leaves existing connections open.""" + return NotImplemented + + def wait_closed(self): + """Coroutine to wait until service is closed.""" + return NotImplemented + + +if asyncio is not None: + # Reuse asyncio classes so asyncio.set_event_loop() and + # asyncio.set_event_loop_policy() accept Trollius event loop and trollius + # event loop policy + AbstractEventLoop = asyncio.AbstractEventLoop + AbstractEventLoopPolicy = asyncio.AbstractEventLoopPolicy +else: + class AbstractEventLoop(object): + """Abstract event loop.""" + + # Running and stopping the event loop. + + def run_forever(self): + """Run the event loop until stop() is called.""" + raise NotImplementedError + + def run_until_complete(self, future): + """Run the event loop until a Future is done. + + Return the Future's result, or raise its exception. + """ + raise NotImplementedError + + def stop(self): + """Stop the event loop as soon as reasonable. + + Exactly how soon that is may depend on the implementation, but + no more I/O callbacks should be scheduled. + """ + raise NotImplementedError + + def is_running(self): + """Return whether the event loop is currently running.""" + raise NotImplementedError + + def is_closed(self): + """Returns True if the event loop was closed.""" + raise NotImplementedError + + def close(self): + """Close the loop. + + The loop should not be running. + + This is idempotent and irreversible. + + No other methods should be called after this one. + """ + raise NotImplementedError + + # Methods scheduling callbacks. All these return Handles. + + def _timer_handle_cancelled(self, handle): + """Notification that a TimerHandle has been cancelled.""" + raise NotImplementedError + + def call_soon(self, callback, *args): + return self.call_later(0, callback, *args) + + def call_later(self, delay, callback, *args): + raise NotImplementedError + + def call_at(self, when, callback, *args): + raise NotImplementedError + + def time(self): + raise NotImplementedError + + # Method scheduling a coroutine object: create a task. + + def create_task(self, coro): + raise NotImplementedError + + # Methods for interacting with threads. + + def call_soon_threadsafe(self, callback, *args): + raise NotImplementedError + + def run_in_executor(self, executor, func, *args): + raise NotImplementedError + + def set_default_executor(self, executor): + raise NotImplementedError + + # Network I/O methods returning Futures. + + def getaddrinfo(self, host, port, family=0, type=0, proto=0, flags=0): + raise NotImplementedError + + def getnameinfo(self, sockaddr, flags=0): + raise NotImplementedError + + def create_connection(self, protocol_factory, host=None, port=None, + ssl=None, family=0, proto=0, flags=0, sock=None, + local_addr=None, server_hostname=None): + raise NotImplementedError + + def create_server(self, protocol_factory, host=None, port=None, + family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, + sock=None, backlog=100, ssl=None, reuse_address=None): + """A coroutine which creates a TCP server bound to host and port. + + The return value is a Server object which can be used to stop + the service. + + If host is an empty string or None all interfaces are assumed + and a list of multiple sockets will be returned (most likely + one for IPv4 and another one for IPv6). + + family can be set to either AF_INET or AF_INET6 to force the + socket to use IPv4 or IPv6. If not set it will be determined + from host (defaults to AF_UNSPEC). + + flags is a bitmask for getaddrinfo(). + + sock can optionally be specified in order to use a preexisting + socket object. + + backlog is the maximum number of queued connections passed to + listen() (defaults to 100). + + ssl can be set to an SSLContext to enable SSL over the + accepted connections. + + reuse_address tells the kernel to reuse a local socket in + TIME_WAIT state, without waiting for its natural timeout to + expire. If not specified will automatically be set to True on + UNIX. + """ + raise NotImplementedError + + def create_unix_connection(self, protocol_factory, path, + ssl=None, sock=None, + server_hostname=None): + raise NotImplementedError + + def create_unix_server(self, protocol_factory, path, + sock=None, backlog=100, ssl=None): + """A coroutine which creates a UNIX Domain Socket server. + + The return value is a Server object, which can be used to stop + the service. + + path is a str, representing a file systsem path to bind the + server socket to. + + sock can optionally be specified in order to use a preexisting + socket object. + + backlog is the maximum number of queued connections passed to + listen() (defaults to 100). + + ssl can be set to an SSLContext to enable SSL over the + accepted connections. + """ + raise NotImplementedError + + def create_datagram_endpoint(self, protocol_factory, + local_addr=None, remote_addr=None, + family=0, proto=0, flags=0): + raise NotImplementedError + + # Pipes and subprocesses. + + def connect_read_pipe(self, protocol_factory, pipe): + """Register read pipe in event loop. Set the pipe to non-blocking mode. + + protocol_factory should instantiate object with Protocol interface. + pipe is a file-like object. + Return pair (transport, protocol), where transport supports the + ReadTransport interface.""" + # The reason to accept file-like object instead of just file descriptor + # is: we need to own pipe and close it at transport finishing + # Can got complicated errors if pass f.fileno(), + # close fd in pipe transport then close f and vise versa. + raise NotImplementedError + + def connect_write_pipe(self, protocol_factory, pipe): + """Register write pipe in event loop. + + protocol_factory should instantiate object with BaseProtocol interface. + Pipe is file-like object already switched to nonblocking. + Return pair (transport, protocol), where transport support + WriteTransport interface.""" + # The reason to accept file-like object instead of just file descriptor + # is: we need to own pipe and close it at transport finishing + # Can got complicated errors if pass f.fileno(), + # close fd in pipe transport then close f and vise versa. + raise NotImplementedError + + def subprocess_shell(self, protocol_factory, cmd, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + **kwargs): + raise NotImplementedError + + def subprocess_exec(self, protocol_factory, *args, **kwargs): + raise NotImplementedError + + # Ready-based callback registration methods. + # The add_*() methods return None. + # The remove_*() methods return True if something was removed, + # False if there was nothing to delete. + + def add_reader(self, fd, callback, *args): + raise NotImplementedError + + def remove_reader(self, fd): + raise NotImplementedError + + def add_writer(self, fd, callback, *args): + raise NotImplementedError + + def remove_writer(self, fd): + raise NotImplementedError + + # Completion based I/O methods returning Futures. + + def sock_recv(self, sock, nbytes): + raise NotImplementedError + + def sock_sendall(self, sock, data): + raise NotImplementedError + + def sock_connect(self, sock, address): + raise NotImplementedError + + def sock_accept(self, sock): + raise NotImplementedError + + # Signal handling. + + def add_signal_handler(self, sig, callback, *args): + raise NotImplementedError + + def remove_signal_handler(self, sig): + raise NotImplementedError + + # Task factory. + + def set_task_factory(self, factory): + raise NotImplementedError + + def get_task_factory(self): + raise NotImplementedError + + # Error handlers. + + def set_exception_handler(self, handler): + raise NotImplementedError + + def default_exception_handler(self, context): + raise NotImplementedError + + def call_exception_handler(self, context): + raise NotImplementedError + + # Debug flag management. + + def get_debug(self): + raise NotImplementedError + + def set_debug(self, enabled): + raise NotImplementedError + + + class AbstractEventLoopPolicy(object): + """Abstract policy for accessing the event loop.""" + + def get_event_loop(self): + """Get the event loop for the current context. + + Returns an event loop object implementing the BaseEventLoop interface, + or raises an exception in case no event loop has been set for the + current context and the current policy does not specify to create one. + + It should never return None.""" + raise NotImplementedError + + def set_event_loop(self, loop): + """Set the event loop for the current context to loop.""" + raise NotImplementedError + + def new_event_loop(self): + """Create and return a new event loop object according to this + policy's rules. If there's need to set this loop as the event loop for + the current context, set_event_loop must be called explicitly.""" + raise NotImplementedError + + # Child processes handling (Unix only). + + def get_child_watcher(self): + "Get the watcher for child processes." + raise NotImplementedError + + def set_child_watcher(self, watcher): + """Set the watcher for child processes.""" + raise NotImplementedError + + +class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy): + """Default policy implementation for accessing the event loop. + + In this policy, each thread has its own event loop. However, we + only automatically create an event loop by default for the main + thread; other threads by default have no event loop. + + Other policies may have different rules (e.g. a single global + event loop, or automatically creating an event loop per thread, or + using some other notion of context to which an event loop is + associated). + """ + + _loop_factory = None + + class _Local(threading.local): + _loop = None + _set_called = False + + def __init__(self): + self._local = self._Local() + + def get_event_loop(self): + """Get the event loop. + + This may be None or an instance of EventLoop. + """ + if (self._local._loop is None and + not self._local._set_called and + isinstance(threading.current_thread(), threading._MainThread)): + self.set_event_loop(self.new_event_loop()) + if self._local._loop is None: + raise RuntimeError('There is no current event loop in thread %r.' + % threading.current_thread().name) + return self._local._loop + + def set_event_loop(self, loop): + """Set the event loop.""" + self._local._set_called = True + assert loop is None or isinstance(loop, AbstractEventLoop) + self._local._loop = loop + + def new_event_loop(self): + """Create a new event loop. + + You must call set_event_loop() to make this the current event + loop. + """ + return self._loop_factory() + + +# Event loop policy. The policy itself is always global, even if the +# policy's rules say that there is an event loop per thread (or other +# notion of context). The default policy is installed by the first +# call to get_event_loop_policy(). +_event_loop_policy = None + +# Lock for protecting the on-the-fly creation of the event loop policy. +_lock = threading.Lock() + + +def _init_event_loop_policy(): + global _event_loop_policy + with _lock: + if _event_loop_policy is None: # pragma: no branch + from . import DefaultEventLoopPolicy + _event_loop_policy = DefaultEventLoopPolicy() + + +def get_event_loop_policy(): + """Get the current event loop policy.""" + if _event_loop_policy is None: + _init_event_loop_policy() + return _event_loop_policy + + +def set_event_loop_policy(policy): + """Set the current event loop policy. + + If policy is None, the default policy is restored.""" + global _event_loop_policy + assert policy is None or isinstance(policy, AbstractEventLoopPolicy) + _event_loop_policy = policy + + +def get_event_loop(): + """Equivalent to calling get_event_loop_policy().get_event_loop().""" + return get_event_loop_policy().get_event_loop() + + +def set_event_loop(loop): + """Equivalent to calling get_event_loop_policy().set_event_loop(loop).""" + get_event_loop_policy().set_event_loop(loop) + + +def new_event_loop(): + """Equivalent to calling get_event_loop_policy().new_event_loop().""" + return get_event_loop_policy().new_event_loop() + + +def get_child_watcher(): + """Equivalent to calling get_event_loop_policy().get_child_watcher().""" + return get_event_loop_policy().get_child_watcher() + + +def set_child_watcher(watcher): + """Equivalent to calling + get_event_loop_policy().set_child_watcher(watcher).""" + return get_event_loop_policy().set_child_watcher(watcher) diff --git a/.local/lib/python2.7/site-packages/trollius/events.pyc b/.local/lib/python2.7/site-packages/trollius/events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1700ae71cfda305347541c517689a085b4db2dbf GIT binary patch literal 27439 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/executor.py b/.local/lib/python2.7/site-packages/trollius/executor.py new file mode 100644 index 00000000..9e7fdd78 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/executor.py @@ -0,0 +1,84 @@ +from .log import logger + +__all__ = ( + 'CancelledError', 'TimeoutError', + 'FIRST_COMPLETED', 'FIRST_EXCEPTION', 'ALL_COMPLETED', + ) + +# Argument for default thread pool executor creation. +_MAX_WORKERS = 5 + +try: + import concurrent.futures + import concurrent.futures._base +except ImportError: + FIRST_COMPLETED = 'FIRST_COMPLETED' + FIRST_EXCEPTION = 'FIRST_EXCEPTION' + ALL_COMPLETED = 'ALL_COMPLETED' + + class Future(object): + def __init__(self, callback, args): + try: + self._result = callback(*args) + self._exception = None + except Exception as err: + self._result = None + self._exception = err + self.callbacks = [] + + def cancelled(self): + return False + + def done(self): + return True + + def exception(self): + return self._exception + + def result(self): + if self._exception is not None: + raise self._exception + else: + return self._result + + def add_done_callback(self, callback): + callback(self) + + class Error(Exception): + """Base class for all future-related exceptions.""" + pass + + class CancelledError(Error): + """The Future was cancelled.""" + pass + + class TimeoutError(Error): + """The operation exceeded the given deadline.""" + pass + + class SynchronousExecutor: + """ + Synchronous executor: submit() blocks until it gets the result. + """ + def submit(self, callback, *args): + return Future(callback, args) + + def shutdown(self, wait): + pass + + def get_default_executor(): + logger.error("concurrent.futures module is missing: " + "use a synchrounous executor as fallback!") + return SynchronousExecutor() +else: + FIRST_COMPLETED = concurrent.futures.FIRST_COMPLETED + FIRST_EXCEPTION = concurrent.futures.FIRST_EXCEPTION + ALL_COMPLETED = concurrent.futures.ALL_COMPLETED + + Future = concurrent.futures.Future + Error = concurrent.futures._base.Error + CancelledError = concurrent.futures.CancelledError + TimeoutError = concurrent.futures.TimeoutError + + def get_default_executor(): + return concurrent.futures.ThreadPoolExecutor(_MAX_WORKERS) diff --git a/.local/lib/python2.7/site-packages/trollius/executor.pyc b/.local/lib/python2.7/site-packages/trollius/executor.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9af60ddbab3cd05daaa44a9e3761df6f4456adc GIT binary patch literal 4161 zcmcgvZEw^@5FXo?OYXQ!0s;C0RZS7q^@TgsN~NL|6w*tD8VjF~xrL^Dry}zr!r9Ys3W^LaEQY2L6@ZFAQXV>1D*=J_f&fo3k@1NZHDWLLN!2KIE z^@T+g;%`w*bYRiQA}c&kBb&lS8aedrGKEVNHYl#qXrbck%s)>4q?%l${U&99k!4vS zreN*@jT#hUN|VAS$uqQTQFw-aBYIBsg*M4$BVC?KS15EU>B>~P zN+JFiC_FnAou%*`cSh$Z@o8Hw&}5A!ORP`HH(0BZZ?bMB-y&#K^5)?6#sfIqf67vaAM?xPM9T?dKN@mOYh8SJ{B1Tv0g*w3;w(=CXG(Sb~JT?ken z*tjpYhTi(a2ah)U!~VB=ChKpn_a6=KKOE>b=H1=goXv`O@1lQj4a}Mwxy~~=-C5S< z9-6uhBHnOn10rT@z~UO!v}0hgPS!6D098#oa?EU-5{tISg%nBpwLd5|VjH(4m32J%oxX`&nG_Fw1)ejM-k!M^J7Gv+}h<6XUkUNvTh zYBu}BsgfbleuJ`0rOv-vlq?$FrY($Bfx&n+HV6inU?b;k4M%?wg{-aOE&;tQJ76=a zX3SxHb3QQ>!)eG6I3;huDhvgbbWl{-ybFIyunVe%Z!V3&W6_CL({ zxHKa@l$p;J&1{Mcu{#>pjiaAs;)c=><0z4D+Aa>*o5$_a4A8A-NwAltNt&yES?o@3 zn~RCZfqC-C0jM(O%rT47((YJlW&Bj+ zr|$GUCN=TvxqZjWaLUm|cCzU?lBx-mL6JN;_KFDL;4|q-a4wr+<`g5{oYo4H?qH3o zfK`cpA7zN-qH=M3~I7+vI<-SUKarGN}xTb$5vj!ZM7>ij&R z*+{_N3+1klgE5Z6MU?a*H;^H#ZJ+cFSGB@76Ps}AMSZR!fN^Gu;LJHD{g)2XTnmSL z8FJ90G>xl}H(xT|gS*?_t=KB5`ZjzQowcmE3ByoFZPa6S$TjuXK9W+qp75FhXuL;U1e*V{o&)n_nx|KJc`bEYc4w7v=N zbY~(1ZECvUFBZX-?wHDqXTfHPt01Prn|II8iRR4nbpiI<>^pS>WEEd!^;+F_td_Nk c&k?S{b^GGwi#7hOHQNg 2: + cb = '{0}, <{1} more>, {2}'.format(format_cb(cb[0]), + size-2, + format_cb(cb[-1])) + return 'cb=[%s]' % cb + + def _repr_info(self): + info = [self._state.lower()] + if self._state == _FINISHED: + if self._exception is not None: + info.append('exception={0!r}'.format(self._exception)) + else: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(self._result) + info.append('result={0}'.format(result)) + if self._callbacks: + info.append(self._format_callbacks()) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return info + + def __repr__(self): + info = self._repr_info() + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if not self._log_traceback: + # set_exception() was not called, or result() or exception() + # has consumed the exception + return + exc = self._exception + context = { + 'message': ('%s exception was never retrieved' + % self.__class__.__name__), + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + + def cancel(self): + """Cancel the future and schedule callbacks. + + If the future is already done or cancelled, return False. Otherwise, + change the future's state to cancelled, schedule the callbacks and + return True. + """ + if self._state != _PENDING: + return False + self._state = _CANCELLED + self._schedule_callbacks() + return True + + def _schedule_callbacks(self): + """Internal: Ask the event loop to call all callbacks. + + The callbacks are scheduled to be called as soon as possible. Also + clears the callback list. + """ + callbacks = self._callbacks[:] + if not callbacks: + return + + self._callbacks[:] = [] + for callback in callbacks: + self._loop.call_soon(callback, self) + + def cancelled(self): + """Return True if the future was cancelled.""" + return self._state == _CANCELLED + + # Don't implement running(); see http://bugs.python.org/issue18699 + + def done(self): + """Return True if the future is done. + + Done means either that a result / exception are available, or that the + future was cancelled. + """ + return self._state != _PENDING + + def result(self): + """Return the result this future represents. + + If the future has been cancelled, raises CancelledError. If the + future's result isn't yet available, raises InvalidStateError. If + the future is done and has an exception set, this exception is raised. + """ + if self._state == _CANCELLED: + raise CancelledError + if self._state != _FINISHED: + raise InvalidStateError('Result is not ready.') + self._log_traceback = False + if self._tb_logger is not None: + self._tb_logger.clear() + self._tb_logger = None + exc_tb = self._exception_tb + self._exception_tb = None + if self._exception is not None: + if exc_tb is not None: + compat.reraise(type(self._exception), self._exception, exc_tb) + else: + raise self._exception + return self._result + + def exception(self): + """Return the exception that was set on this future. + + The exception (or None if no exception was set) is returned only if + the future is done. If the future has been cancelled, raises + CancelledError. If the future isn't done yet, raises + InvalidStateError. + """ + if self._state == _CANCELLED: + raise CancelledError + if self._state != _FINISHED: + raise InvalidStateError('Exception is not set.') + self._log_traceback = False + if self._tb_logger is not None: + self._tb_logger.clear() + self._tb_logger = None + self._exception_tb = None + return self._exception + + def add_done_callback(self, fn): + """Add a callback to be run when the future becomes done. + + The callback is called with a single argument - the future object. If + the future is already done when this is called, the callback is + scheduled with call_soon. + """ + if self._state != _PENDING: + self._loop.call_soon(fn, self) + else: + self._callbacks.append(fn) + + # New method not in PEP 3148. + + def remove_done_callback(self, fn): + """Remove all instances of a callback from the "call when done" list. + + Returns the number of callbacks removed. + """ + filtered_callbacks = [f for f in self._callbacks if f != fn] + removed_count = len(self._callbacks) - len(filtered_callbacks) + if removed_count: + self._callbacks[:] = filtered_callbacks + return removed_count + + # So-called internal methods (note: no set_running_or_notify_cancel()). + + def _set_result_unless_cancelled(self, result): + """Helper setting the result only if the future was not cancelled.""" + if self.cancelled(): + return + self.set_result(result) + + def set_result(self, result): + """Mark the future done and set its result. + + If the future is already done when this method is called, raises + InvalidStateError. + """ + if self._state != _PENDING: + raise InvalidStateError('{0}: {1!r}'.format(self._state, self)) + self._result = result + self._state = _FINISHED + self._schedule_callbacks() + + def _get_exception_tb(self): + return self._exception_tb + + def set_exception(self, exception): + self._set_exception_with_tb(exception, None) + + def _set_exception_with_tb(self, exception, exc_tb): + """Mark the future done and set an exception. + + If the future is already done when this method is called, raises + InvalidStateError. + """ + if self._state != _PENDING: + raise InvalidStateError('{0}: {1!r}'.format(self._state, self)) + if isinstance(exception, type): + exception = exception() + self._exception = exception + if exc_tb is not None: + self._exception_tb = exc_tb + exc_tb = None + elif not six.PY3: + self._exception_tb = sys.exc_info()[2] + self._state = _FINISHED + self._schedule_callbacks() + if compat.PY34: + self._log_traceback = True + else: + self._tb_logger = _TracebackLogger(self, exception) + if hasattr(exception, '__traceback__'): + # Python 3: exception contains a link to the traceback + + # Arrange for the logger to be activated after all callbacks + # have had a chance to call result() or exception(). + self._loop.call_soon(self._tb_logger.activate) + else: + if self._loop.get_debug(): + frame = sys._getframe(1) + tb = ['Traceback (most recent call last):\n'] + if self._exception_tb is not None: + tb += traceback.format_tb(self._exception_tb) + else: + tb += traceback.format_stack(frame) + tb += traceback.format_exception_only(type(exception), exception) + self._tb_logger.tb = tb + else: + self._tb_logger.tb = traceback.format_exception_only( + type(exception), + exception) + + self._tb_logger.exc = None + + # Truly internal methods. + + def _copy_state(self, other): + """Internal helper to copy state from another Future. + + The other Future may be a concurrent.futures.Future. + """ + assert other.done() + if self.cancelled(): + return + assert not self.done() + if other.cancelled(): + self.cancel() + else: + exception = other.exception() + if exception is not None: + self.set_exception(exception) + else: + result = other.result() + self.set_result(result) + +if events.asyncio is not None: + # Accept also asyncio Future objects for interoperability + _FUTURE_CLASSES = (Future, events.asyncio.Future) +else: + _FUTURE_CLASSES = Future + +def wrap_future(fut, loop=None): + """Wrap concurrent.futures.Future object.""" + if isinstance(fut, _FUTURE_CLASSES): + return fut + assert isinstance(fut, executor.Future), \ + 'concurrent.futures.Future is expected, got {0!r}'.format(fut) + if loop is None: + loop = events.get_event_loop() + new_future = Future(loop=loop) + + def _check_cancel_other(f): + if f.cancelled(): + fut.cancel() + + new_future.add_done_callback(_check_cancel_other) + fut.add_done_callback( + lambda future: loop.call_soon_threadsafe( + new_future._copy_state, future)) + return new_future diff --git a/.local/lib/python2.7/site-packages/trollius/futures.pyc b/.local/lib/python2.7/site-packages/trollius/futures.pyc new file mode 100644 index 0000000000000000000000000000000000000000..faef48c78b02a78f495ad3ca98fa129ac7c99c64 GIT binary patch literal 16847 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 + + while failing loudly when accidentally using: + + with lock: + + """ + + def __init__(self, lock): + self._lock = lock + + def __enter__(self): + # We have no use for the "as ..." clause in the with + # statement for locks. + return None + + def __exit__(self, *args): + try: + self._lock.release() + finally: + self._lock = None # Crudely prevent reuse. + + +class _ContextManagerMixin(object): + def __enter__(self): + raise RuntimeError( + '"yield From" should be used as context manager expression') + + def __exit__(self, *args): + # This must exist because __enter__ exists, even though that + # always raises; that's how the with-statement works. + pass + + # FIXME: support PEP 492? + # if compat.PY35: + + # def __await__(self): + # # To make "with await lock" work. + # yield from self.acquire() + # return _ContextManager(self) + + # @coroutine + # def __aenter__(self): + # yield from self.acquire() + # # We have no use for the "as ..." clause in the with + # # statement for locks. + # return None + + # @coroutine + # def __aexit__(self, exc_type, exc, tb): + # self.release() + + +class Lock(_ContextManagerMixin): + """Primitive lock objects. + + A primitive lock is a synchronization primitive that is not owned + by a particular coroutine when locked. A primitive lock is in one + of two states, 'locked' or 'unlocked'. + + It is created in the unlocked state. It has two basic methods, + acquire() and release(). When the state is unlocked, acquire() + changes the state to locked and returns immediately. When the + state is locked, acquire() blocks until a call to release() in + another coroutine changes it to unlocked, then the acquire() call + resets it to locked and returns. The release() method should only + be called in the locked state; it changes the state to unlocked + and returns immediately. If an attempt is made to release an + unlocked lock, a RuntimeError will be raised. + + When more than one coroutine is blocked in acquire() waiting for + the state to turn to unlocked, only one coroutine proceeds when a + release() call resets the state to unlocked; first coroutine which + is blocked in acquire() is being processed. + + acquire() is a coroutine and should be called with 'yield From'. + + Locks also support the context management protocol. '(yield From(lock))' + should be used as context manager expression. + + Usage: + + lock = Lock() + ... + yield From(lock) + try: + ... + finally: + lock.release() + + Context manager usage: + + lock = Lock() + ... + with (yield From(lock)): + ... + + Lock objects can be tested for locking state: + + if not lock.locked(): + yield From(lock) + else: + # lock is acquired + ... + + """ + + def __init__(self, loop=None): + self._waiters = collections.deque() + self._locked = False + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + res = super(Lock, self).__repr__() + extra = 'locked' if self._locked else 'unlocked' + if self._waiters: + extra = '{0},waiters:{1}'.format(extra, len(self._waiters)) + return '<{0} [{1}]>'.format(res[1:-1], extra) + + def locked(self): + """Return True if lock is acquired.""" + return self._locked + + @coroutine + def acquire(self): + """Acquire a lock. + + This method blocks until the lock is unlocked, then sets it to + locked and returns True. + """ + if not self._waiters and not self._locked: + self._locked = True + raise Return(True) + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield From(fut) + self._locked = True + raise Return(True) + finally: + self._waiters.remove(fut) + + def release(self): + """Release a lock. + + When the lock is locked, reset it to unlocked, and return. + If any other coroutines are blocked waiting for the lock to become + unlocked, allow exactly one of them to proceed. + + When invoked on an unlocked lock, a RuntimeError is raised. + + There is no return value. + """ + if self._locked: + self._locked = False + # Wake up the first waiter who isn't cancelled. + for fut in self._waiters: + if not fut.done(): + fut.set_result(True) + break + else: + raise RuntimeError('Lock is not acquired.') + + +class Event(object): + """Asynchronous equivalent to threading.Event. + + Class implementing event objects. An event manages a flag that can be set + to true with the set() method and reset to false with the clear() method. + The wait() method blocks until the flag is true. The flag is initially + false. + """ + + def __init__(self, loop=None): + self._waiters = collections.deque() + self._value = False + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + res = super(Event, self).__repr__() + extra = 'set' if self._value else 'unset' + if self._waiters: + extra = '{0},waiters:{1}'.format(extra, len(self._waiters)) + return '<{0} [{1}]>'.format(res[1:-1], extra) + + def is_set(self): + """Return True if and only if the internal flag is true.""" + return self._value + + def set(self): + """Set the internal flag to true. All coroutines waiting for it to + become true are awakened. Coroutine that call wait() once the flag is + true will not block at all. + """ + if not self._value: + self._value = True + + for fut in self._waiters: + if not fut.done(): + fut.set_result(True) + + def clear(self): + """Reset the internal flag to false. Subsequently, coroutines calling + wait() will block until set() is called to set the internal flag + to true again.""" + self._value = False + + @coroutine + def wait(self): + """Block until the internal flag is true. + + If the internal flag is true on entry, return True + immediately. Otherwise, block until another coroutine calls + set() to set the flag to true, then return True. + """ + if self._value: + raise Return(True) + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield From(fut) + raise Return(True) + finally: + self._waiters.remove(fut) + + +class Condition(_ContextManagerMixin): + """Asynchronous equivalent to threading.Condition. + + This class implements condition variable objects. A condition variable + allows one or more coroutines to wait until they are notified by another + coroutine. + + A new Lock object is created and used as the underlying lock. + """ + + def __init__(self, lock=None, loop=None): + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + if lock is None: + lock = Lock(loop=self._loop) + elif lock._loop is not self._loop: + raise ValueError("loop argument must agree with lock") + + self._lock = lock + # Export the lock's locked(), acquire() and release() methods. + self.locked = lock.locked + self.acquire = lock.acquire + self.release = lock.release + + self._waiters = collections.deque() + + def __repr__(self): + res = super(Condition, self).__repr__() + extra = 'locked' if self.locked() else 'unlocked' + if self._waiters: + extra = '{0},waiters:{1}'.format(extra, len(self._waiters)) + return '<{0} [{1}]>'.format(res[1:-1], extra) + + @coroutine + def wait(self): + """Wait until notified. + + If the calling coroutine has not acquired the lock when this + method is called, a RuntimeError is raised. + + This method releases the underlying lock, and then blocks + until it is awakened by a notify() or notify_all() call for + the same condition variable in another coroutine. Once + awakened, it re-acquires the lock and returns True. + """ + if not self.locked(): + raise RuntimeError('cannot wait on un-acquired lock') + + self.release() + try: + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield From(fut) + raise Return(True) + finally: + self._waiters.remove(fut) + + except Exception as exc: + # Workaround CPython bug #23353: using yield/yield-from in an + # except block of a generator doesn't clear properly + # sys.exc_info() + err = exc + else: + err = None + + if err is not None: + yield From(self.acquire()) + raise err + + yield From(self.acquire()) + + @coroutine + def wait_for(self, predicate): + """Wait until a predicate becomes true. + + The predicate should be a callable which result will be + interpreted as a boolean value. The final predicate value is + the return value. + """ + result = predicate() + while not result: + yield From(self.wait()) + result = predicate() + raise Return(result) + + def notify(self, n=1): + """By default, wake up one coroutine waiting on this condition, if any. + If the calling coroutine has not acquired the lock when this method + is called, a RuntimeError is raised. + + This method wakes up at most n of the coroutines waiting for the + condition variable; it is a no-op if no coroutines are waiting. + + Note: an awakened coroutine does not actually return from its + wait() call until it can reacquire the lock. Since notify() does + not release the lock, its caller should. + """ + if not self.locked(): + raise RuntimeError('cannot notify on un-acquired lock') + + idx = 0 + for fut in self._waiters: + if idx >= n: + break + + if not fut.done(): + idx += 1 + fut.set_result(False) + + def notify_all(self): + """Wake up all threads waiting on this condition. This method acts + like notify(), but wakes up all waiting threads instead of one. If the + calling thread has not acquired the lock when this method is called, + a RuntimeError is raised. + """ + self.notify(len(self._waiters)) + + +class Semaphore(_ContextManagerMixin): + """A Semaphore implementation. + + A semaphore manages an internal counter which is decremented by each + acquire() call and incremented by each release() call. The counter + can never go below zero; when acquire() finds that it is zero, it blocks, + waiting until some other thread calls release(). + + Semaphores also support the context management protocol. + + The optional argument gives the initial value for the internal + counter; it defaults to 1. If the value given is less than 0, + ValueError is raised. + """ + + def __init__(self, value=1, loop=None): + if value < 0: + raise ValueError("Semaphore initial value must be >= 0") + self._value = value + self._waiters = collections.deque() + if loop is not None: + self._loop = loop + else: + self._loop = events.get_event_loop() + + def __repr__(self): + res = super(Semaphore, self).__repr__() + extra = 'locked' if self.locked() else 'unlocked,value:{0}'.format( + self._value) + if self._waiters: + extra = '{0},waiters:{1}'.format(extra, len(self._waiters)) + return '<{0} [{1}]>'.format(res[1:-1], extra) + + def locked(self): + """Returns True if semaphore can not be acquired immediately.""" + return self._value == 0 + + @coroutine + def acquire(self): + """Acquire a semaphore. + + If the internal counter is larger than zero on entry, + decrement it by one and return True immediately. If it is + zero on entry, block, waiting until some other coroutine has + called release() to make it larger than 0, and then return + True. + """ + if not self._waiters and self._value > 0: + self._value -= 1 + raise Return(True) + + fut = futures.Future(loop=self._loop) + self._waiters.append(fut) + try: + yield From(fut) + self._value -= 1 + raise Return(True) + finally: + self._waiters.remove(fut) + + def release(self): + """Release a semaphore, incrementing the internal counter by one. + When it was zero on entry and another coroutine is waiting for it to + become larger than zero again, wake up that coroutine. + """ + self._value += 1 + for waiter in self._waiters: + if not waiter.done(): + waiter.set_result(True) + break + + +class BoundedSemaphore(Semaphore): + """A bounded semaphore implementation. + + This raises ValueError in release() if it would increase the value + above the initial value. + """ + + def __init__(self, value=1, loop=None): + self._bound_value = value + super(BoundedSemaphore, self).__init__(value, loop=loop) + + def release(self): + if self._value >= self._bound_value: + raise ValueError('BoundedSemaphore released too many times') + super(BoundedSemaphore, self).release() diff --git a/.local/lib/python2.7/site-packages/trollius/locks.pyc b/.local/lib/python2.7/site-packages/trollius/locks.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26319876d2cd77b71be3e2ff1d903858331fdfed GIT binary patch literal 17301 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 Vb5l<|d*<0Q<(cbe9-R5!{{rMxGPD2y literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/log.py b/.local/lib/python2.7/site-packages/trollius/log.py new file mode 100644 index 00000000..23a7074a --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/log.py @@ -0,0 +1,7 @@ +"""Logging configuration.""" + +import logging + + +# Name the logger after the package. +logger = logging.getLogger(__package__) diff --git a/.local/lib/python2.7/site-packages/trollius/log.pyc b/.local/lib/python2.7/site-packages/trollius/log.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13dfb2d5ea6ed9f6c741c0c9bed244f436f699d7 GIT binary patch literal 286 zcmYL>OHacv5QNuB=!3_VGZ&;ts4?OK2gKuEap6{}ih{FsUEFMCI|t5)U(64HNvXt2 z{yejqo&5Xk`0MI%Y3MK+{wKV63A98DP*IzaSF}*XiZ&T>PM@&FuzxM{A$|_b#ah?d z3nSgi**-MMNmsca%u9KMKpF#e-HNH}z4m_>X^Oq&G!$@1C;QZ{G4G9KBuDT=l0yka z|A^19dM#Vl8;L!K>pNX}F^$*Wz3JUYT1$6R-RkHP&kluAry$N4 N{Ggy?0gSTK;up#@MnwPs literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/proactor_events.py b/.local/lib/python2.7/site-packages/trollius/proactor_events.py new file mode 100644 index 00000000..66b4caf1 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/proactor_events.py @@ -0,0 +1,549 @@ +"""Event loop using a proactor and related classes. + +A proactor is a "notify-on-completion" multiplexer. Currently a +proactor is only implemented on Windows with IOCP. +""" + +__all__ = ['BaseProactorEventLoop'] + +import socket +import warnings + +from . import base_events +from . import compat +from . import constants +from . import futures +from . import sslproto +from . import transports +from .log import logger +from .compat import flatten_bytes +from .py33_exceptions import (BrokenPipeError, + ConnectionAbortedError, ConnectionResetError) + + +class _ProactorBasePipeTransport(transports._FlowControlMixin, + transports.BaseTransport): + """Base class for pipe and socket transports.""" + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super(_ProactorBasePipeTransport, self).__init__(extra, loop) + self._set_extra(sock) + self._sock = sock + self._protocol = protocol + self._server = server + self._buffer = None # None or bytearray. + self._read_fut = None + self._write_fut = None + self._pending_write = 0 + self._conn_lost = 0 + self._closing = False # Set when close() called. + self._eof_written = False + if self._server is not None: + self._server._attach() + self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) + + def __repr__(self): + info = [self.__class__.__name__] + if self._sock is None: + info.append('closed') + elif self._closing: + info.append('closing') + if self._sock is not None: + info.append('fd=%s' % self._sock.fileno()) + if self._read_fut is not None: + info.append('read=%s' % self._read_fut) + if self._write_fut is not None: + info.append("write=%r" % self._write_fut) + if self._buffer: + bufsize = len(self._buffer) + info.append('write_bufsize=%s' % bufsize) + if self._eof_written: + info.append('EOF written') + return '<%s>' % ' '.join(info) + + def _set_extra(self, sock): + self._extra['pipe'] = sock + + def close(self): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + if not self._buffer and self._write_fut is None: + self._loop.call_soon(self._call_connection_lost, None) + if self._read_fut is not None: + self._read_fut.cancel() + self._read_fut = None + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if self._sock is not None: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self.close() + + def _fatal_error(self, exc, message='Fatal error on pipe transport'): + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: + self._loop.call_exception_handler({ + 'message': message, + 'exception': exc, + 'transport': self, + 'protocol': self._protocol, + }) + self._force_close(exc) + + def _force_close(self, exc): + if self._closing: + return + self._closing = True + self._conn_lost += 1 + if self._write_fut: + self._write_fut.cancel() + self._write_fut = None + if self._read_fut: + self._read_fut.cancel() + self._read_fut = None + self._pending_write = 0 + self._buffer = None + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + # XXX If there is a pending overlapped read on the other + # end then it may fail with ERROR_NETNAME_DELETED if we + # just close our end. First calling shutdown() seems to + # cure it, but maybe using DisconnectEx() would be better. + if hasattr(self._sock, 'shutdown'): + self._sock.shutdown(socket.SHUT_RDWR) + self._sock.close() + self._sock = None + server = self._server + if server is not None: + server._detach() + self._server = None + + def get_write_buffer_size(self): + size = self._pending_write + if self._buffer is not None: + size += len(self._buffer) + return size + + +class _ProactorReadPipeTransport(_ProactorBasePipeTransport, + transports.ReadTransport): + """Transport for read pipes.""" + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super(_ProactorReadPipeTransport, self).__init__(loop, sock, protocol, + waiter, extra, server) + self._paused = False + self._loop.call_soon(self._loop_reading) + + def pause_reading(self): + if self._closing: + raise RuntimeError('Cannot pause_reading() when closing') + if self._paused: + raise RuntimeError('Already paused') + self._paused = True + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) + + def resume_reading(self): + if not self._paused: + raise RuntimeError('Not paused') + self._paused = False + if self._closing: + return + self._loop.call_soon(self._loop_reading, self._read_fut) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) + + def _loop_reading(self, fut=None): + if self._paused: + return + data = None + + try: + if fut is not None: + assert self._read_fut is fut or (self._read_fut is None and + self._closing) + self._read_fut = None + data = fut.result() # deliver data later in "finally" clause + + if self._closing: + # since close() has been called we ignore any read data + data = None + return + + if data == b'': + # we got end-of-file so no need to reschedule a new read + return + + # reschedule a new read + self._read_fut = self._loop._proactor.recv(self._sock, 4096) + except ConnectionAbortedError as exc: + if not self._closing: + self._fatal_error(exc, 'Fatal read error on pipe transport') + elif self._loop.get_debug(): + logger.debug("Read error on pipe transport while closing", + exc_info=True) + except ConnectionResetError as exc: + self._force_close(exc) + except OSError as exc: + self._fatal_error(exc, 'Fatal read error on pipe transport') + except futures.CancelledError: + if not self._closing: + raise + else: + self._read_fut.add_done_callback(self._loop_reading) + finally: + if data: + self._protocol.data_received(data) + elif data is not None: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) + keep_open = self._protocol.eof_received() + if not keep_open: + self.close() + + +class _ProactorBaseWritePipeTransport(_ProactorBasePipeTransport, + transports.WriteTransport): + """Transport for write pipes.""" + + def write(self, data): + data = flatten_bytes(data) + if self._eof_written: + raise RuntimeError('write_eof() already called') + + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + # Observable states: + # 1. IDLE: _write_fut and _buffer both None + # 2. WRITING: _write_fut set; _buffer None + # 3. BACKED UP: _write_fut set; _buffer a bytearray + # We always copy the data, so the caller can't modify it + # while we're still waiting for the I/O to happen. + if self._write_fut is None: # IDLE -> WRITING + assert self._buffer is None + # Pass a copy, except if it's already immutable. + self._loop_writing(data=bytes(data)) + elif not self._buffer: # WRITING -> BACKED UP + # Make a mutable copy which we can extend. + self._buffer = bytearray(data) + self._maybe_pause_protocol() + else: # BACKED UP + # Append to buffer (also copies). + self._buffer.extend(data) + self._maybe_pause_protocol() + + def _loop_writing(self, f=None, data=None): + try: + assert f is self._write_fut + self._write_fut = None + self._pending_write = 0 + if f: + f.result() + if data is None: + data = self._buffer + self._buffer = None + if not data: + if self._closing: + self._loop.call_soon(self._call_connection_lost, None) + if self._eof_written: + self._sock.shutdown(socket.SHUT_WR) + # Now that we've reduced the buffer size, tell the + # protocol to resume writing if it was paused. Note that + # we do this last since the callback is called immediately + # and it may add more data to the buffer (even causing the + # protocol to be paused again). + self._maybe_resume_protocol() + else: + self._write_fut = self._loop._proactor.send(self._sock, data) + if not self._write_fut.done(): + assert self._pending_write == 0 + self._pending_write = len(data) + self._write_fut.add_done_callback(self._loop_writing) + self._maybe_pause_protocol() + else: + self._write_fut.add_done_callback(self._loop_writing) + except ConnectionResetError as exc: + self._force_close(exc) + except OSError as exc: + self._fatal_error(exc, 'Fatal write error on pipe transport') + + def can_write_eof(self): + return True + + def write_eof(self): + self.close() + + def abort(self): + self._force_close(None) + + +class _ProactorWritePipeTransport(_ProactorBaseWritePipeTransport): + def __init__(self, *args, **kw): + super(_ProactorWritePipeTransport, self).__init__(*args, **kw) + self._read_fut = self._loop._proactor.recv(self._sock, 16) + self._read_fut.add_done_callback(self._pipe_closed) + + def _pipe_closed(self, fut): + if fut.cancelled(): + # the transport has been closed + return + assert fut.result() == b'' + if self._closing: + assert self._read_fut is None + return + assert fut is self._read_fut, (fut, self._read_fut) + self._read_fut = None + if self._write_fut is not None: + self._force_close(BrokenPipeError()) + else: + self.close() + + +class _ProactorDuplexPipeTransport(_ProactorReadPipeTransport, + _ProactorBaseWritePipeTransport, + transports.Transport): + """Transport for duplex pipes.""" + + def can_write_eof(self): + return False + + def write_eof(self): + raise NotImplementedError + + +class _ProactorSocketTransport(_ProactorReadPipeTransport, + _ProactorBaseWritePipeTransport, + transports.Transport): + """Transport for connected sockets.""" + + def _set_extra(self, sock): + self._extra['socket'] = sock + try: + self._extra['sockname'] = sock.getsockname() + except (socket.error, AttributeError): + if self._loop.get_debug(): + logger.warning("getsockname() failed on %r", + sock, exc_info=True) + if 'peername' not in self._extra: + try: + self._extra['peername'] = sock.getpeername() + except (socket.error, AttributeError): + if self._loop.get_debug(): + logger.warning("getpeername() failed on %r", + sock, exc_info=True) + + def can_write_eof(self): + return True + + def write_eof(self): + if self._closing or self._eof_written: + return + self._eof_written = True + if self._write_fut is None: + self._sock.shutdown(socket.SHUT_WR) + + +class BaseProactorEventLoop(base_events.BaseEventLoop): + + def __init__(self, proactor): + super(BaseProactorEventLoop, self).__init__() + logger.debug('Using proactor: %s', proactor.__class__.__name__) + self._proactor = proactor + self._selector = proactor # convenient alias + self._self_reading_future = None + self._accept_futures = {} # socket file descriptor => Future + proactor.set_loop(self) + self._make_self_pipe() + + def _make_socket_transport(self, sock, protocol, waiter=None, + extra=None, server=None): + return _ProactorSocketTransport(self, sock, protocol, waiter, + extra, server) + + def _make_ssl_transport(self, rawsock, protocol, sslcontext, waiter=None, + server_side=False, server_hostname=None, + extra=None, server=None): + if not sslproto._is_sslproto_available(): + raise NotImplementedError("Proactor event loop requires Python 3.5" + " or newer (ssl.MemoryBIO) to support " + "SSL") + + ssl_protocol = sslproto.SSLProtocol(self, protocol, sslcontext, waiter, + server_side, server_hostname) + _ProactorSocketTransport(self, rawsock, ssl_protocol, + extra=extra, server=server) + return ssl_protocol._app_transport + + def _make_duplex_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + return _ProactorDuplexPipeTransport(self, + sock, protocol, waiter, extra) + + def _make_read_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + return _ProactorReadPipeTransport(self, sock, protocol, waiter, extra) + + def _make_write_pipe_transport(self, sock, protocol, waiter=None, + extra=None): + # We want connection_lost() to be called when other end closes + return _ProactorWritePipeTransport(self, + sock, protocol, waiter, extra) + + def close(self): + if self.is_running(): + raise RuntimeError("Cannot close a running event loop") + if self.is_closed(): + return + + # Call these methods before closing the event loop (before calling + # BaseEventLoop.close), because they can schedule callbacks with + # call_soon(), which is forbidden when the event loop is closed. + self._stop_accept_futures() + self._close_self_pipe() + self._proactor.close() + self._proactor = None + self._selector = None + + # Close the event loop + super(BaseProactorEventLoop, self).close() + + def sock_recv(self, sock, n): + return self._proactor.recv(sock, n) + + def sock_sendall(self, sock, data): + return self._proactor.send(sock, data) + + def sock_connect(self, sock, address): + try: + if self._debug: + base_events._check_resolved_address(sock, address) + except ValueError as err: + fut = futures.Future(loop=self) + fut.set_exception(err) + return fut + else: + return self._proactor.connect(sock, address) + + def sock_accept(self, sock): + return self._proactor.accept(sock) + + def _socketpair(self): + raise NotImplementedError + + def _close_self_pipe(self): + if self._self_reading_future is not None: + self._self_reading_future.cancel() + self._self_reading_future = None + self._ssock.close() + self._ssock = None + self._csock.close() + self._csock = None + self._internal_fds -= 1 + + def _make_self_pipe(self): + # A self-socket, really. :-) + self._ssock, self._csock = self._socketpair() + self._ssock.setblocking(False) + self._csock.setblocking(False) + self._internal_fds += 1 + self.call_soon(self._loop_self_reading) + + def _loop_self_reading(self, f=None): + try: + if f is not None: + f.result() # may raise + f = self._proactor.recv(self._ssock, 4096) + except futures.CancelledError: + # _close_self_pipe() has been called, stop waiting for data + return + except Exception as exc: + self.call_exception_handler({ + 'message': 'Error on reading from the event loop self pipe', + 'exception': exc, + 'loop': self, + }) + else: + self._self_reading_future = f + f.add_done_callback(self._loop_self_reading) + + def _write_to_self(self): + self._csock.send(b'\0') + + def _start_serving(self, protocol_factory, sock, + sslcontext=None, server=None): + + def loop(f=None): + try: + if f is not None: + conn, addr = f.result() + if self._debug: + logger.debug("%r got a new connection from %r: %r", + server, addr, conn) + protocol = protocol_factory() + if sslcontext is not None: + self._make_ssl_transport( + conn, protocol, sslcontext, server_side=True, + extra={'peername': addr}, server=server) + else: + self._make_socket_transport( + conn, protocol, + extra={'peername': addr}, server=server) + if self.is_closed(): + return + f = self._proactor.accept(sock) + except OSError as exc: + if sock.fileno() != -1: + self.call_exception_handler({ + 'message': 'Accept failed on a socket', + 'exception': exc, + 'socket': sock, + }) + sock.close() + elif self._debug: + logger.debug("Accept failed on socket %r", + sock, exc_info=True) + except futures.CancelledError: + sock.close() + else: + self._accept_futures[sock.fileno()] = f + f.add_done_callback(loop) + + self.call_soon(loop) + + def _process_events(self, event_list): + # Events are processed in the IocpProactor._poll() method + pass + + def _stop_accept_futures(self): + for future in self._accept_futures.values(): + future.cancel() + self._accept_futures.clear() + + def _stop_serving(self, sock): + self._stop_accept_futures() + self._proactor._stop_serving(sock) + sock.close() diff --git a/.local/lib/python2.7/site-packages/trollius/proactor_events.pyc b/.local/lib/python2.7/site-packages/trollius/proactor_events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e4ea17a0a875120c0c222f6bd33628aebc5d029 GIT binary patch literal 20816 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 o(}Z1qWcX!tAUla!dnE(I) literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/protocols.py b/.local/lib/python2.7/site-packages/trollius/protocols.py new file mode 100644 index 00000000..2c18287b --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/protocols.py @@ -0,0 +1,134 @@ +"""Abstract Protocol class.""" + +__all__ = ['BaseProtocol', 'Protocol', 'DatagramProtocol', + 'SubprocessProtocol'] + + +class BaseProtocol(object): + """Common base class for protocol interfaces. + + Usually user implements protocols that derived from BaseProtocol + like Protocol or ProcessProtocol. + + The only case when BaseProtocol should be implemented directly is + write-only transport like write pipe + """ + + def connection_made(self, transport): + """Called when a connection is made. + + The argument is the transport representing the pipe connection. + To receive data, wait for data_received() calls. + When the connection is closed, connection_lost() is called. + """ + + def connection_lost(self, exc): + """Called when the connection is lost or closed. + + The argument is an exception object or None (the latter + meaning a regular EOF is received or the connection was + aborted or closed). + """ + + def pause_writing(self): + """Called when the transport's buffer goes over the high-water mark. + + Pause and resume calls are paired -- pause_writing() is called + once when the buffer goes strictly over the high-water mark + (even if subsequent writes increases the buffer size even + more), and eventually resume_writing() is called once when the + buffer size reaches the low-water mark. + + Note that if the buffer size equals the high-water mark, + pause_writing() is not called -- it must go strictly over. + Conversely, resume_writing() is called when the buffer size is + equal or lower than the low-water mark. These end conditions + are important to ensure that things go as expected when either + mark is zero. + + NOTE: This is the only Protocol callback that is not called + through EventLoop.call_soon() -- if it were, it would have no + effect when it's most needed (when the app keeps writing + without yielding until pause_writing() is called). + """ + + def resume_writing(self): + """Called when the transport's buffer drains below the low-water mark. + + See pause_writing() for details. + """ + + +class Protocol(BaseProtocol): + """Interface for stream protocol. + + The user should implement this interface. They can inherit from + this class but don't need to. The implementations here do + nothing (they don't raise exceptions). + + When the user wants to requests a transport, they pass a protocol + factory to a utility function (e.g., EventLoop.create_connection()). + + When the connection is made successfully, connection_made() is + called with a suitable transport object. Then data_received() + will be called 0 or more times with data (bytes) received from the + transport; finally, connection_lost() will be called exactly once + with either an exception object or None as an argument. + + State machine of calls: + + start -> CM [-> DR*] [-> ER?] -> CL -> end + + * CM: connection_made() + * DR: data_received() + * ER: eof_received() + * CL: connection_lost() + """ + + def data_received(self, data): + """Called when some data is received. + + The argument is a bytes object. + """ + + def eof_received(self): + """Called when the other end calls write_eof() or equivalent. + + If this returns a false value (including None), the transport + will close itself. If it returns a true value, closing the + transport is up to the protocol. + """ + + +class DatagramProtocol(BaseProtocol): + """Interface for datagram protocol.""" + + def datagram_received(self, data, addr): + """Called when some datagram is received.""" + + def error_received(self, exc): + """Called when a send or receive operation raises an OSError. + + (Other than BlockingIOError or InterruptedError.) + """ + + +class SubprocessProtocol(BaseProtocol): + """Interface for protocol for subprocess calls.""" + + def pipe_data_received(self, fd, data): + """Called when the subprocess writes data into stdout/stderr pipe. + + fd is int file descriptor. + data is bytes object. + """ + + def pipe_connection_lost(self, fd, exc): + """Called when a file descriptor associated with the child process is + closed. + + fd is the int file descriptor that was closed. + """ + + def process_exited(self): + """Called when subprocess has exited.""" diff --git a/.local/lib/python2.7/site-packages/trollius/protocols.pyc b/.local/lib/python2.7/site-packages/trollius/protocols.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f728a4a5b95ec04ef0ccbec4ab1883aab0ccaf3b GIT binary patch literal 6872 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/py27_weakrefset.py b/.local/lib/python2.7/site-packages/trollius/py27_weakrefset.py new file mode 100644 index 00000000..990c3a6b --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/py27_weakrefset.py @@ -0,0 +1,202 @@ +# Access WeakSet through the weakref module. +# This code is separated-out because it is needed +# by abc.py to load everything else at startup. + +from _weakref import ref + +__all__ = ['WeakSet'] + + +class _IterationGuard(object): + # This context manager registers itself in the current iterators of the + # weak container, such as to delay all removals until the context manager + # exits. + # This technique should be relatively thread-safe (since sets are). + + def __init__(self, weakcontainer): + # Don't create cycles + self.weakcontainer = ref(weakcontainer) + + def __enter__(self): + w = self.weakcontainer() + if w is not None: + w._iterating.add(self) + return self + + def __exit__(self, e, t, b): + w = self.weakcontainer() + if w is not None: + s = w._iterating + s.remove(self) + if not s: + w._commit_removals() + + +class WeakSet(object): + def __init__(self, data=None): + self.data = set() + def _remove(item, selfref=ref(self)): + self = selfref() + if self is not None: + if self._iterating: + self._pending_removals.append(item) + else: + self.data.discard(item) + self._remove = _remove + # A list of keys to be removed + self._pending_removals = [] + self._iterating = set() + if data is not None: + self.update(data) + + def _commit_removals(self): + l = self._pending_removals + discard = self.data.discard + while l: + discard(l.pop()) + + def __iter__(self): + with _IterationGuard(self): + for itemref in self.data: + item = itemref() + if item is not None: + yield item + + def __len__(self): + return len(self.data) - len(self._pending_removals) + + def __contains__(self, item): + try: + wr = ref(item) + except TypeError: + return False + return wr in self.data + + def __reduce__(self): + return (self.__class__, (list(self),), + getattr(self, '__dict__', None)) + + __hash__ = None + + def add(self, item): + if self._pending_removals: + self._commit_removals() + self.data.add(ref(item, self._remove)) + + def clear(self): + if self._pending_removals: + self._commit_removals() + self.data.clear() + + def copy(self): + return self.__class__(self) + + def pop(self): + if self._pending_removals: + self._commit_removals() + while True: + try: + itemref = self.data.pop() + except KeyError: + raise KeyError('pop from empty WeakSet') + item = itemref() + if item is not None: + return item + + def remove(self, item): + if self._pending_removals: + self._commit_removals() + self.data.remove(ref(item)) + + def discard(self, item): + if self._pending_removals: + self._commit_removals() + self.data.discard(ref(item)) + + def update(self, other): + if self._pending_removals: + self._commit_removals() + for element in other: + self.add(element) + + def __ior__(self, other): + self.update(other) + return self + + def difference(self, other): + newset = self.copy() + newset.difference_update(other) + return newset + __sub__ = difference + + def difference_update(self, other): + self.__isub__(other) + def __isub__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.difference_update(ref(item) for item in other) + return self + + def intersection(self, other): + return self.__class__(item for item in other if item in self) + __and__ = intersection + + def intersection_update(self, other): + self.__iand__(other) + def __iand__(self, other): + if self._pending_removals: + self._commit_removals() + self.data.intersection_update(ref(item) for item in other) + return self + + def issubset(self, other): + return self.data.issubset(ref(item) for item in other) + __le__ = issubset + + def __lt__(self, other): + return self.data < set(ref(item) for item in other) + + def issuperset(self, other): + return self.data.issuperset(ref(item) for item in other) + __ge__ = issuperset + + def __gt__(self, other): + return self.data > set(ref(item) for item in other) + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return NotImplemented + return self.data == set(ref(item) for item in other) + + def __ne__(self, other): + opposite = self.__eq__(other) + if opposite is NotImplemented: + return NotImplemented + return not opposite + + def symmetric_difference(self, other): + newset = self.copy() + newset.symmetric_difference_update(other) + return newset + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + self.__ixor__(other) + def __ixor__(self, other): + if self._pending_removals: + self._commit_removals() + if self is other: + self.data.clear() + else: + self.data.symmetric_difference_update(ref(item, self._remove) for item in other) + return self + + def union(self, other): + return self.__class__(e for s in (self, other) for e in s) + __or__ = union + + def isdisjoint(self, other): + return len(self.intersection(other)) == 0 diff --git a/.local/lib/python2.7/site-packages/trollius/py27_weakrefset.pyc b/.local/lib/python2.7/site-packages/trollius/py27_weakrefset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7aec80b32e7cbe1af27354a948640f007baa5619 GIT binary patch literal 11694 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 PnE`6x9nY2WQ?vg8wdhRc literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/py33_exceptions.py b/.local/lib/python2.7/site-packages/trollius/py33_exceptions.py new file mode 100644 index 00000000..f10dfe9e --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/py33_exceptions.py @@ -0,0 +1,144 @@ +__all__ = ['BlockingIOError', 'BrokenPipeError', 'ChildProcessError', + 'ConnectionRefusedError', 'ConnectionResetError', + 'InterruptedError', 'ConnectionAbortedError', 'PermissionError', + 'FileNotFoundError', 'ProcessLookupError', + ] + +import errno +import select +import socket +import sys +try: + import ssl +except ImportError: + ssl = None + +from .compat import PY33 + +if PY33: + import builtins + BlockingIOError = builtins.BlockingIOError + BrokenPipeError = builtins.BrokenPipeError + ChildProcessError = builtins.ChildProcessError + ConnectionRefusedError = builtins.ConnectionRefusedError + ConnectionResetError = builtins.ConnectionResetError + InterruptedError = builtins.InterruptedError + ConnectionAbortedError = builtins.ConnectionAbortedError + PermissionError = builtins.PermissionError + FileNotFoundError = builtins.FileNotFoundError + ProcessLookupError = builtins.ProcessLookupError + +else: + # Python < 3.3 + class BlockingIOError(OSError): + pass + + class BrokenPipeError(OSError): + pass + + class ChildProcessError(OSError): + pass + + class ConnectionRefusedError(OSError): + pass + + class InterruptedError(OSError): + pass + + class ConnectionResetError(OSError): + pass + + class ConnectionAbortedError(OSError): + pass + + class PermissionError(OSError): + pass + + class FileNotFoundError(OSError): + pass + + class ProcessLookupError(OSError): + pass + + +_MAP_ERRNO = { + errno.EACCES: PermissionError, + errno.EAGAIN: BlockingIOError, + errno.EALREADY: BlockingIOError, + errno.ECHILD: ChildProcessError, + errno.ECONNABORTED: ConnectionAbortedError, + errno.ECONNREFUSED: ConnectionRefusedError, + errno.ECONNRESET: ConnectionResetError, + errno.EINPROGRESS: BlockingIOError, + errno.EINTR: InterruptedError, + errno.ENOENT: FileNotFoundError, + errno.EPERM: PermissionError, + errno.EPIPE: BrokenPipeError, + errno.ESHUTDOWN: BrokenPipeError, + errno.EWOULDBLOCK: BlockingIOError, + errno.ESRCH: ProcessLookupError, +} + +if sys.platform == 'win32': + from trollius import _overlapped + _MAP_ERRNO.update({ + _overlapped.ERROR_CONNECTION_REFUSED: ConnectionRefusedError, + _overlapped.ERROR_CONNECTION_ABORTED: ConnectionAbortedError, + _overlapped.ERROR_NETNAME_DELETED: ConnectionResetError, + }) + + +def get_error_class(key, default): + return _MAP_ERRNO.get(key, default) + + +if sys.version_info >= (3,): + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value +else: + exec("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +def _wrap_error(exc, mapping, key): + if key not in mapping: + return + new_err_cls = mapping[key] + new_err = new_err_cls(*exc.args) + + # raise a new exception with the original traceback + if hasattr(exc, '__traceback__'): + traceback = exc.__traceback__ + else: + traceback = sys.exc_info()[2] + reraise(new_err_cls, new_err, traceback) + + +if not PY33: + def wrap_error(func, *args, **kw): + """ + Wrap socket.error, IOError, OSError, select.error to raise new specialized + exceptions of Python 3.3 like InterruptedError (PEP 3151). + """ + try: + return func(*args, **kw) + except (socket.error, IOError, OSError) as exc: + if ssl is not None and isinstance(exc, ssl.SSLError): + raise + if hasattr(exc, 'winerror'): + _wrap_error(exc, _MAP_ERRNO, exc.winerror) + # _MAP_ERRNO does not contain all Windows errors. + # For some errors like "file not found", exc.errno should + # be used (ex: ENOENT). + _wrap_error(exc, _MAP_ERRNO, exc.errno) + raise + except select.error as exc: + if exc.args: + _wrap_error(exc, _MAP_ERRNO, exc.args[0]) + raise +else: + def wrap_error(func, *args, **kw): + return func(*args, **kw) diff --git a/.local/lib/python2.7/site-packages/trollius/py33_exceptions.pyc b/.local/lib/python2.7/site-packages/trollius/py33_exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6a8946e8154adbe1831147baf4c6ac96c40c0ea GIT binary patch literal 5382 zcmd5=%WfOV6}?4L57LxKJuF+c$J3s%Gqf#BwuLwkI1ia>kA=u2QIw&WLC|TjOHz}~ zZlb$58U;2Gj3>JwLB1g0k!==PWs`k=AnUAyx_kZ;BE@ht*{{I+HvYIFI@F&R2k(Vd0K;9I2)8x&NH%nfTj!M*lL5aLe6bS0T zGQ~OSph$}I)Ir%47pPO9)9UzjiaJxYA6}t?nx=k<;E#;(v|{qwNx@67^ty$$&C-$_C6)XU>3m>dYHZp-#nsDs`#`EKp~`fJN#o8n8s2 zB?FeJvrOUNxbx~V9imtB^d-?dqSt5%dSq;6!otton5|COIaV#RU6`=*tYXG4PFQGC z7_&xewCu+~%O>|W zJ?Y#bRiNIt$h%7Y9L0aiaqO&8@CglS)Tto~?ojV8`H&Xw)Tnn4#o;2*eIPgnv_?S058T_>|smA13yX7Mp_4Z z^V|%Mu(|1|&%0{KdM4|`Q^|GT!jrHo)8c=1 zT3&*=EF(F87g@jCcrLJuEZ!#<+ePeEbnjxjI0g3}Tx=J4azDJ-E>6R}&5P~g4BUHi zv0dav`Fj`J#Uk8$dgh|$>2u&H>SBYJv8Ef<_05`5(nq12CE*c*!2_j3&4b@ zJc)`}6bZ*H2E@v;YkIh58Nb#neei=u6so)5FIo7Q($;&~B_knM#>NC>a+;X)6Am?wA09?>byARP z18vF;Fa>Y|m3*+%JTXFb!m)%%N-NIZHP5NZsGsW?n(28GyTdf5A!0fsNt8uFltd+8 z5#?M}ba_Vdc<`V%+3K%IP8YICi;?&(#$-SIBNfugi~xi*hk0{f{5=VblYol2Y4H?j zlb&Yj!SrU#K(*-$=z(s}GM|m!=L9L(ti&m9kUU6i^i{TOST6k(jnDB)!gtiaq-}D! zd5Zu1ei>Zu5CK_jT$FFIc}za;V)6$hCOSDn_aTmz;O?OGx|#QDR(6G0vzl#l_+GOT z72tM|=36?-!WzSAB}3Kq-N65)@+MWDoqet7&}y0UvbDLsX$5{?Szo_4ShbejvNj)m z`_bL?NfjpCu*@2deE5sylJ5|Z6&*0%n#I86o8TMYd&~f)ey6dU1SYz9QkrwWpZH;- z-LR`nBklIC>7=}ln&rowa6|Gol5rDZl(uVBkk^o7gf#UYj>4{?%#zeUkvBOT&v{)Y zOefAl`V=iC>=I4o#e%plZi;CvQY(ce{9hDBaV-sQo~Zno;O2!l-Hx)z&UPfwWENbx z0c5%*`5<@~H=V9nqcBo~srU`ZCi z)M;vlVXpKk3mOwIPzuC%wdU#EQi#m?@w=Bt}sZ#EiR&zf@2{t6-O=daoz*fC=v z?Y6yV`eE-hTC({mh_(qpyzj}h)<)BA?4@MOmM=53)3VKyYPVm!+S_jKH_~eMo3D1a zpY1m5KS}M{vi`!vwsChDxcV@P2j*pbca`(wK8}W-tChaW?n&8{4)?;Y@9i`j&e-?= zm^tq0Gb1xI14y~&f%=XlDq z2Fb6G6ftLtqMR>dd*E+gRK=Vq<*K=9ycNIkEf-eu-}n~t*jWDicMe-l6*aNNLZMiw Oh|0`tzBrE-R{jm>f^b9t literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/py33_winapi.py b/.local/lib/python2.7/site-packages/trollius/py33_winapi.py new file mode 100644 index 00000000..792bc459 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/py33_winapi.py @@ -0,0 +1,75 @@ + +__all__ = [ + 'CloseHandle', 'CreateNamedPipe', 'CreateFile', 'ConnectNamedPipe', + 'NULL', + 'GENERIC_READ', 'GENERIC_WRITE', 'OPEN_EXISTING', 'INFINITE', + 'PIPE_ACCESS_INBOUND', + 'PIPE_ACCESS_DUPLEX', 'PIPE_TYPE_MESSAGE', 'PIPE_READMODE_MESSAGE', + 'PIPE_WAIT', 'PIPE_UNLIMITED_INSTANCES', 'NMPWAIT_WAIT_FOREVER', + 'FILE_FLAG_OVERLAPPED', 'FILE_FLAG_FIRST_PIPE_INSTANCE', + 'WaitForMultipleObjects', 'WaitForSingleObject', + 'WAIT_OBJECT_0', 'ERROR_IO_PENDING', + ] + +try: + # FIXME: use _overlapped on Python 3.3? see windows_utils.pipe() + from _winapi import ( + CloseHandle, CreateNamedPipe, CreateFile, ConnectNamedPipe, + NULL, + GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING, INFINITE, + PIPE_ACCESS_INBOUND, + PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, PIPE_READMODE_MESSAGE, + PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, NMPWAIT_WAIT_FOREVER, + FILE_FLAG_OVERLAPPED, FILE_FLAG_FIRST_PIPE_INSTANCE, + WaitForMultipleObjects, WaitForSingleObject, + WAIT_OBJECT_0, ERROR_IO_PENDING, + ) +except ImportError: + # Python < 3.3 + from _multiprocessing import win32 + import _subprocess + + from trollius import _overlapped + + CloseHandle = win32.CloseHandle + CreateNamedPipe = win32.CreateNamedPipe + CreateFile = win32.CreateFile + NULL = win32.NULL + + GENERIC_READ = win32.GENERIC_READ + GENERIC_WRITE = win32.GENERIC_WRITE + OPEN_EXISTING = win32.OPEN_EXISTING + INFINITE = win32.INFINITE + + PIPE_ACCESS_INBOUND = win32.PIPE_ACCESS_INBOUND + PIPE_ACCESS_DUPLEX = win32.PIPE_ACCESS_DUPLEX + PIPE_READMODE_MESSAGE = win32.PIPE_READMODE_MESSAGE + PIPE_TYPE_MESSAGE = win32.PIPE_TYPE_MESSAGE + PIPE_WAIT = win32.PIPE_WAIT + PIPE_UNLIMITED_INSTANCES = win32.PIPE_UNLIMITED_INSTANCES + NMPWAIT_WAIT_FOREVER = win32.NMPWAIT_WAIT_FOREVER + + FILE_FLAG_OVERLAPPED = 0x40000000 + FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000 + + WAIT_OBJECT_0 = _subprocess.WAIT_OBJECT_0 + WaitForSingleObject = _subprocess.WaitForSingleObject + ERROR_IO_PENDING = _overlapped.ERROR_IO_PENDING + + def ConnectNamedPipe(handle, overlapped): + ov = _overlapped.Overlapped() + ov.ConnectNamedPipe(handle) + return ov + + def WaitForMultipleObjects(events, wait_all, timeout): + if not wait_all: + raise NotImplementedError() + + for ev in events: + res = WaitForSingleObject(ev, timeout) + if res != WAIT_OBJECT_0: + err = win32.GetLastError() + msg = _overlapped.FormatMessage(err) + raise WindowsError(err, msg) + + return WAIT_OBJECT_0 diff --git a/.local/lib/python2.7/site-packages/trollius/py33_winapi.pyc b/.local/lib/python2.7/site-packages/trollius/py33_winapi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea11b7288e5b2912977c5138edf3875cdb98f4d1 GIT binary patch literal 2206 zcmcgs+iu%N5IrO%`6l^(iJdrk6;Lz^l7|*((MGW-hlNZDD>+UH1cahpICQw8O0Jy- zkYAei2l97)=}+{zXlGVY9OONv#Nq7Ba(B)-v-JM1E&uV=k1s~}aP89bG2O*q4j}38 zK)R3~WC^kiS%F-DT!dVLT!vhMtU}fxS0UFR*C96`HzBtmw;^|MzKaNW`yO%^au2Bk z?ILoaJwzUK2~i2UjHnDxkB&HxO+=Zz9@+-a@nmy^UxadI!-CG*z+-y@zNI&e`}Ml+-P}UPk_>Ll>8K z3+X=e0ipxg@jlYqh;G}`50Ku0K16f~M;+k8f?&tuV8=pX$KqheLSe_EVaEbu$6{i~ z!eYlFW5>c`$D(A%LS)CHWXA%PR2(sVhk>fwxUl%xv2fKPE-Y4gh~L2k%e&Uu#@NAg zxsQJR9_egW$Q-3vp`H%MGF4`c$GI9B6%MtMy=0=y^2b;^p(*P;%*JCiGB~0kIf>@3Bq;|a(asfy`bmE&7&i~ z-;aavN%u5tna$7QtrFrJ884S#=`RFw4 z1Shn8i}vdenjvj%wka8&^mt-yO}i`nXTGqBcF^(TcBgq9cPZ3q_IiHH9MT&%iFP3R zgV%5WSmER=eM-Ri7sW)vS?u&dvUYcgwEoWMNGa zkk@#XY1O#Mic6J0__lFB%|^qtktQ!2legwoHhy^jn?{is_4Q;pdObW>MZ@G-nkJV8 zO?dPuCcwi>f^9)D%%wd*p|O&^+RnJK!iz$~yot?*m4=r8;HKchG2 z)UnXEy~4}{np#e)u~E{`^DO^FPHvvr0am6nEX*u#Dd&!$meoUZqKbmJu=CE6vCQ5S zc3z#aS_RYGx>vt(?>x{YLIG*`4jsM>xWxvX#Q8GdJGS=a@F!8SIooe)>4wsmY$(>iJ7ei%%uH0iE&K*C)q8ZA2q*kzd6 z%nY%S)>2j6yS7)o=uP`0`XhSVAJG1bO1*8L=RLbS!OBH1Kq}}Q-Z`J|=kvaY;9v9g z-`@M_7hM_sRPpy`X!$=qkw~PC-jm3e*poI0NBh$D$8;d=K=j5m^*+0bdJUh=} zoW!kf$v$|f%WIJ{kze5)oL^4NPA2r$a$;^WQIo`z=cl)I*MhVc^xiA_xhU;LFz}ZN z1AoH($^hmA=`TriLyknUV~?s>koc+`UzIlcYtp_h$IH@QhWJiRH>7<-B6spl<$H0$ z#R`=gEy-)>by1R~@%7)5=qeXsFsg{Xt=q0mwk;_0c2=^#d%ZxcQ_3BAWSth?1_ebz zQSZp3_NqkJ^{{s(sY$dvqH*(f<0h^AH+1!lPWNb#X2t6E_UEhnCrP*HrAfZpNupKz zvTFzW`EmXJ>c*4J&z`l+PKbr!mN6}}z1rAI)A+lX#Mo{pDU9tzTUnN7?~g}zvtD7# zp{>>@`tjy@o2}-~*7Kcn2X3ZGVP6(l`XcKL!aVIB*`mSQ+;<*_mUm&O_aFQ;8}M2w zX3>SZLT8IQzQNw;wBjm0zd@AZ+MDAemWnHG|2grB#d5HeP_M>SV<9JTMZPxB@)>j% z=JmvEH$Y3nM^|t-43o~W4MXKO43E?3B*v#(rAyi6TjCH}4%6h}gAdnosQvx`w(T6)e67gRIPRU~Sg;=EdHi5-YAQJCHjg9=Rquag z)=Xo$A;*`;+7wQI2krlmHA3XwlC>U{*W+L#Kv$4*j#^L%=Ye#VFtV{d=oB_Qwy;r@ zs|$^T4^FeK?me+W4SP0t*cy*fmm#ir1R`6J{*?BBSd0J$0E8m16;R<>WU5QQpF^Xm zHqr78xM3mE_hhKJKJ=vT%NZc<<+>DsJpJOHysFFTq7)S_8P?^@7jO5=J5qr(MC6|n zk@5W;ZFd+*wkJbh=J+R&SH2{o+i^*iC!BfMp8Ocwr*->Z#d|d?-f&j>GxYj?O^$HL zpXE2gt#Ey83W4^x9K^gNPvv>>)@Za?kp30Y;CcuS(FZb|k|FMzmb2;6p5csS|JG%T zOcEXr=2D!uq#Hn7)omcI>1Ghuc?8!i3-*(^A;X#yH;L680cZnB)Xq({u0m1|s+Gnq zbcQw?#d0s{6=7)RIZQx;0-$pncZwo|Kq5~-^!83h*r>>HV2gpZ8DXHH;hY~ij2nAX zlIjIp&DIX^$+7WCC(f;djc%GGwp-W;78GfwiPei4^66e*2Y0d)s{{vi7JmtsdS{e| zhk*Y4umh|m&qwxjzZYA*wQI9NKPV_a!pwe|EAKcX{K{rIa)(>m3ArFIZeZ!x4-L~K z9C4|To1Y8@na%Ss>l_@|D75K*t_li|!2)l?CHr}U3Q@Lm8}B;;0b}l9*u2d-YB{$V zmzX2MC6%i?X)&q zpEFH=^>E#+V9b!AQc|TZP+Z#PhiEw=r|MT#h`{R-hR7(}XJ|RCg;?w>{2-VJFNFpd zMt|=ixVWXMa*S+wnC1l|!oe#~8l(fK2wtnh<~yLweRPVyM=v_rL0*b`agwT&eXSVT z!<9KBP5difm;N*sxfB;5`wilHUlUh3cY-{?5h|PpqpM;@bq`N=f-)mqhIHlw9Na@I zMZ$;v@bV3`{3CQO8?nkn>5r^~8Wsh=r{yKeeqV{I=A?i$vH9YPixGZ0d+icdkAwo@}*hG!|ZAba)pPg(riU*krt zf5m?@4Jb$NlP!9qS!c)C9mmE1nfKKE03#)%N?n{Q8EP#>(UTbQai7=zkKp+^m27rLRR_YHB8n>L@0M&XlljF zw^ZH5X-x~8^N-ix;nJL$OteH;LKNO|zBxt})gueZb4nZm2{*db@gqtD5hvAP^F`SH0&k&sTSvk5MY+r&9Y={(0~dqImubbX9Lof3Kk6TnGZqS~aik&HGh0lp_n3+uoeN Vavw46*Q&RctMJS^R|j)5{{?WKB_#j= literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/queues.py b/.local/lib/python2.7/site-packages/trollius/queues.py new file mode 100644 index 00000000..18167ab7 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/queues.py @@ -0,0 +1,325 @@ +"""Queues""" + +__all__ = ['Queue', 'PriorityQueue', 'LifoQueue', 'QueueFull', 'QueueEmpty'] + +import collections +import heapq + +from . import compat +from . import events +from . import futures +from . import locks +from .coroutines import coroutine, From, Return + + +class QueueEmpty(Exception): + """Exception raised when Queue.get_nowait() is called on a Queue object + which is empty. + """ + pass + + +class QueueFull(Exception): + """Exception raised when the Queue.put_nowait() method is called on a Queue + object which is full. + """ + pass + + +class Queue(object): + """A queue, useful for coordinating producer and consumer coroutines. + + If maxsize is less than or equal to zero, the queue size is infinite. If it + is an integer greater than 0, then "yield from put()" will block when the + queue reaches maxsize, until an item is removed by get(). + + Unlike the standard library Queue, you can reliably know this Queue's size + with qsize(), since your single-threaded asyncio application won't be + interrupted between calling qsize() and doing an operation on the Queue. + """ + + def __init__(self, maxsize=0, loop=None): + if loop is None: + self._loop = events.get_event_loop() + else: + self._loop = loop + self._maxsize = maxsize + + # Futures. + self._getters = collections.deque() + # Futures + self._putters = collections.deque() + self._unfinished_tasks = 0 + self._finished = locks.Event(loop=self._loop) + self._finished.set() + self._init(maxsize) + + # These three are overridable in subclasses. + + def _init(self, maxsize): + self._queue = collections.deque() + + def _get(self): + return self._queue.popleft() + + def _put(self, item): + self._queue.append(item) + + # End of the overridable methods. + + def __put_internal(self, item): + self._put(item) + self._unfinished_tasks += 1 + self._finished.clear() + + def __repr__(self): + return '<{0} at {1:#x} {2}>'.format( + type(self).__name__, id(self), self._format()) + + def __str__(self): + return '<{0} {1}>'.format(type(self).__name__, self._format()) + + def _format(self): + result = 'maxsize={0!r}'.format(self._maxsize) + if getattr(self, '_queue', None): + result += ' _queue={0!r}'.format(list(self._queue)) + if self._getters: + result += ' _getters[{0}]'.format(len(self._getters)) + if self._putters: + result += ' _putters[{0}]'.format(len(self._putters)) + if self._unfinished_tasks: + result += ' tasks={0}'.format(self._unfinished_tasks) + return result + + def _consume_done_getters(self): + # Delete waiters at the head of the get() queue who've timed out. + while self._getters and self._getters[0].done(): + self._getters.popleft() + + def _consume_done_putters(self): + # Delete waiters at the head of the put() queue who've timed out. + while self._putters and self._putters[0].done(): + self._putters.popleft() + + def qsize(self): + """Number of items in the queue.""" + return len(self._queue) + + @property + def maxsize(self): + """Number of items allowed in the queue.""" + return self._maxsize + + def empty(self): + """Return True if the queue is empty, False otherwise.""" + return not self._queue + + def full(self): + """Return True if there are maxsize items in the queue. + + Note: if the Queue was initialized with maxsize=0 (the default), + then full() is never True. + """ + if self._maxsize <= 0: + return False + else: + return self.qsize() >= self._maxsize + + @coroutine + def put(self, item): + """Put an item into the queue. + + Put an item into the queue. If the queue is full, wait until a free + slot is available before adding item. + + This method is a coroutine. + """ + self._consume_done_getters() + if self._getters: + assert not self._queue, ( + 'queue non-empty, why are getters waiting?') + + getter = self._getters.popleft() + self.__put_internal(item) + + # getter cannot be cancelled, we just removed done getters + getter.set_result(self._get()) + + elif self._maxsize > 0 and self._maxsize <= self.qsize(): + waiter = futures.Future(loop=self._loop) + + self._putters.append(waiter) + yield From(waiter) + self._put(item) + + else: + self.__put_internal(item) + + def put_nowait(self, item): + """Put an item into the queue without blocking. + + If no free slot is immediately available, raise QueueFull. + """ + self._consume_done_getters() + if self._getters: + assert not self._queue, ( + 'queue non-empty, why are getters waiting?') + + getter = self._getters.popleft() + self.__put_internal(item) + + # getter cannot be cancelled, we just removed done getters + getter.set_result(self._get()) + + elif self._maxsize > 0 and self._maxsize <= self.qsize(): + raise QueueFull + else: + self.__put_internal(item) + + @coroutine + def get(self): + """Remove and return an item from the queue. + + If queue is empty, wait until an item is available. + + This method is a coroutine. + """ + self._consume_done_putters() + if self._putters: + assert self.full(), 'queue not full, why are putters waiting?' + putter = self._putters.popleft() + + # When a getter runs and frees up a slot so this putter can + # run, we need to defer the put for a tick to ensure that + # getters and putters alternate perfectly. See + # ChannelTest.test_wait. + self._loop.call_soon(putter._set_result_unless_cancelled, None) + + raise Return(self._get()) + + elif self.qsize(): + raise Return(self._get()) + else: + waiter = futures.Future(loop=self._loop) + self._getters.append(waiter) + try: + value = (yield From(waiter)) + raise Return(value) + except futures.CancelledError: + # if we get CancelledError, it means someone cancelled this + # get() coroutine. But there is a chance that the waiter + # already is ready and contains an item that has just been + # removed from the queue. In this case, we need to put the item + # back into the front of the queue. This get() must either + # succeed without fault or, if it gets cancelled, it must be as + # if it never happened. + if waiter.done(): + self._put_it_back(waiter.result()) + raise + + def _put_it_back(self, item): + """ + This is called when we have a waiter to get() an item and this waiter + gets cancelled. In this case, we put the item back: wake up another + waiter or put it in the _queue. + """ + self._consume_done_getters() + if self._getters: + assert not self._queue, ( + 'queue non-empty, why are getters waiting?') + + getter = self._getters.popleft() + self.__put_internal(item) + + # getter cannot be cancelled, we just removed done getters + getter.set_result(item) + else: + self._queue.appendleft(item) + + def get_nowait(self): + """Remove and return an item from the queue. + + Return an item if one is immediately available, else raise QueueEmpty. + """ + self._consume_done_putters() + if self._putters: + assert self.full(), 'queue not full, why are putters waiting?' + putter = self._putters.popleft() + # Wake putter on next tick. + + # getter cannot be cancelled, we just removed done putters + putter.set_result(None) + + return self._get() + + elif self.qsize(): + return self._get() + else: + raise QueueEmpty + + def task_done(self): + """Indicate that a formerly enqueued task is complete. + + Used by queue consumers. For each get() used to fetch a task, + a subsequent call to task_done() tells the queue that the processing + on the task is complete. + + If a join() is currently blocking, it will resume when all items have + been processed (meaning that a task_done() call was received for every + item that had been put() into the queue). + + Raises ValueError if called more times than there were items placed in + the queue. + """ + if self._unfinished_tasks <= 0: + raise ValueError('task_done() called too many times') + self._unfinished_tasks -= 1 + if self._unfinished_tasks == 0: + self._finished.set() + + @coroutine + def join(self): + """Block until all items in the queue have been gotten and processed. + + The count of unfinished tasks goes up whenever an item is added to the + queue. The count goes down whenever a consumer calls task_done() to + indicate that the item was retrieved and all work on it is complete. + When the count of unfinished tasks drops to zero, join() unblocks. + """ + if self._unfinished_tasks > 0: + yield From(self._finished.wait()) + + +class PriorityQueue(Queue): + """A subclass of Queue; retrieves entries in priority order (lowest first). + + Entries are typically tuples of the form: (priority number, data). + """ + + def _init(self, maxsize): + self._queue = [] + + def _put(self, item, heappush=heapq.heappush): + heappush(self._queue, item) + + def _get(self, heappop=heapq.heappop): + return heappop(self._queue) + + +class LifoQueue(Queue): + """A subclass of Queue that retrieves most recently added entries first.""" + + def _init(self, maxsize): + self._queue = [] + + def _put(self, item): + self._queue.append(item) + + def _get(self): + return self._queue.pop() + + +if not compat.PY35: + JoinableQueue = Queue + """Deprecated alias for Queue.""" + __all__.append('JoinableQueue') diff --git a/.local/lib/python2.7/site-packages/trollius/queues.pyc b/.local/lib/python2.7/site-packages/trollius/queues.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a288ab707680b7a9864f4fe3080f510af70b7b85 GIT binary patch literal 12763 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' % (state, bufsize)) + return '<%s>' % ' '.join(info) + + def abort(self): + self._force_close(None) + + def close(self): + if self._closing: + return + self._closing = True + self._loop.remove_reader(self._sock_fd) + if not self._buffer: + self._conn_lost += 1 + self._loop.call_soon(self._call_connection_lost, None) + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if self._sock is not None: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self._sock.close() + + def _fatal_error(self, exc, message='Fatal error on transport'): + # Should be called from exception handler only. + if isinstance(exc, (BrokenPipeError, + ConnectionResetError, ConnectionAbortedError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: + self._loop.call_exception_handler({ + 'message': message, + 'exception': exc, + 'transport': self, + 'protocol': self._protocol, + }) + self._force_close(exc) + + def _force_close(self, exc): + if self._conn_lost: + return + if self._buffer: + del self._buffer[:] + self._loop.remove_writer(self._sock_fd) + if not self._closing: + self._closing = True + self._loop.remove_reader(self._sock_fd) + self._conn_lost += 1 + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + if self._protocol_connected: + self._protocol.connection_lost(exc) + finally: + self._sock.close() + self._sock = None + self._protocol = None + self._loop = None + server = self._server + if server is not None: + server._detach() + self._server = None + + def get_write_buffer_size(self): + return len(self._buffer) + + +class _SelectorSocketTransport(_SelectorTransport): + + def __init__(self, loop, sock, protocol, waiter=None, + extra=None, server=None): + super(_SelectorSocketTransport, self).__init__(loop, sock, protocol, extra, server) + self._eof = False + self._paused = False + + self._loop.call_soon(self._protocol.connection_made, self) + # only start reading when connection_made() has been called + self._loop.call_soon(self._loop.add_reader, + self._sock_fd, self._read_ready) + if waiter is not None: + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) + + def pause_reading(self): + if self._closing: + raise RuntimeError('Cannot pause_reading() when closing') + if self._paused: + raise RuntimeError('Already paused') + self._paused = True + self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) + + def resume_reading(self): + if not self._paused: + raise RuntimeError('Not paused') + self._paused = False + if self._closing: + return + self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) + + def _read_ready(self): + try: + data = wrap_error(self._sock.recv, self.max_size) + except (BlockingIOError, InterruptedError): + pass + except Exception as exc: + self._fatal_error(exc, 'Fatal read error on socket transport') + else: + if data: + self._protocol.data_received(data) + else: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) + keep_open = self._protocol.eof_received() + if keep_open: + # We're keeping the connection open so the + # protocol can write more, but we still can't + # receive more, so remove the reader callback. + self._loop.remove_reader(self._sock_fd) + else: + self.close() + + def write(self, data): + data = flatten_bytes(data) + if self._eof: + raise RuntimeError('Cannot call write() after write_eof()') + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Optimization: try to send now. + try: + n = wrap_error(self._sock.send, data) + except (BlockingIOError, InterruptedError): + pass + except Exception as exc: + self._fatal_error(exc, 'Fatal write error on socket transport') + return + else: + data = data[n:] + if not data: + return + # Not all was written; register write handler. + self._loop.add_writer(self._sock_fd, self._write_ready) + + # Add it to the buffer. + self._buffer.extend(data) + self._maybe_pause_protocol() + + def _write_ready(self): + assert self._buffer, 'Data should not be empty' + + data = flatten_bytes(self._buffer) + try: + n = wrap_error(self._sock.send, data) + except (BlockingIOError, InterruptedError): + pass + except Exception as exc: + self._loop.remove_writer(self._sock_fd) + del self._buffer[:] + self._fatal_error(exc, 'Fatal write error on socket transport') + else: + if n: + del self._buffer[:n] + self._maybe_resume_protocol() # May append to buffer. + if not self._buffer: + self._loop.remove_writer(self._sock_fd) + if self._closing: + self._call_connection_lost(None) + elif self._eof: + self._sock.shutdown(socket.SHUT_WR) + + def write_eof(self): + if self._eof: + return + self._eof = True + if not self._buffer: + self._sock.shutdown(socket.SHUT_WR) + + def can_write_eof(self): + return True + + +class _SelectorSslTransport(_SelectorTransport): + + _buffer_factory = bytearray + + def __init__(self, loop, rawsock, protocol, sslcontext, waiter=None, + server_side=False, server_hostname=None, + extra=None, server=None): + if ssl is None: + raise RuntimeError('stdlib ssl module not available') + + if not sslcontext: + sslcontext = sslproto._create_transport_context(server_side, server_hostname) + + wrap_kwargs = { + 'server_side': server_side, + 'do_handshake_on_connect': False, + } + if server_hostname and not server_side: + wrap_kwargs['server_hostname'] = server_hostname + sslsock = sslcontext.wrap_socket(rawsock, **wrap_kwargs) + + super(_SelectorSslTransport, self).__init__(loop, sslsock, protocol, extra, server) + # the protocol connection is only made after the SSL handshake + self._protocol_connected = False + + self._server_hostname = server_hostname + self._waiter = waiter + self._sslcontext = sslcontext + self._paused = False + + # SSL-specific extra info. (peercert is set later) + self._extra.update(sslcontext=sslcontext) + + if self._loop.get_debug(): + logger.debug("%r starts SSL handshake", self) + start_time = self._loop.time() + else: + start_time = None + self._on_handshake(start_time) + + def _wakeup_waiter(self, exc=None): + if self._waiter is None: + return + if not self._waiter.cancelled(): + if exc is not None: + self._waiter.set_exception(exc) + else: + self._waiter.set_result(None) + self._waiter = None + + def _on_handshake(self, start_time): + try: + wrap_ssl_error(self._sock.do_handshake) + except SSLWantReadError: + self._loop.add_reader(self._sock_fd, + self._on_handshake, start_time) + return + except SSLWantWriteError: + self._loop.add_writer(self._sock_fd, + self._on_handshake, start_time) + return + except BaseException as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed", + self, exc_info=True) + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) + self._sock.close() + self._wakeup_waiter(exc) + if isinstance(exc, Exception): + return + else: + raise + + self._loop.remove_reader(self._sock_fd) + self._loop.remove_writer(self._sock_fd) + + peercert = self._sock.getpeercert() + if not hasattr(self._sslcontext, 'check_hostname'): + # Verify hostname if requested, Python 3.4+ uses check_hostname + # and checks the hostname in do_handshake() + if (self._server_hostname and + self._sslcontext.verify_mode != ssl.CERT_NONE): + try: + ssl.match_hostname(peercert, self._server_hostname) + except Exception as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed " + "on matching the hostname", + self, exc_info=True) + self._sock.close() + self._wakeup_waiter(exc) + return + + # Add extra info that becomes available after handshake. + self._extra.update(peercert=peercert, + cipher=self._sock.cipher(), + ) + if hasattr(self._sock, 'compression'): + self._extra['compression'] = self._sock.compression() + + self._read_wants_write = False + self._write_wants_read = False + self._loop.add_reader(self._sock_fd, self._read_ready) + self._protocol_connected = True + self._loop.call_soon(self._protocol.connection_made, self) + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(self._wakeup_waiter) + + if self._loop.get_debug(): + dt = self._loop.time() - start_time + logger.debug("%r: SSL handshake took %.1f ms", self, dt * 1e3) + + def pause_reading(self): + # XXX This is a bit icky, given the comment at the top of + # _read_ready(). Is it possible to evoke a deadlock? I don't + # know, although it doesn't look like it; write() will still + # accept more data for the buffer and eventually the app will + # call resume_reading() again, and things will flow again. + + if self._closing: + raise RuntimeError('Cannot pause_reading() when closing') + if self._paused: + raise RuntimeError('Already paused') + self._paused = True + self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) + + def resume_reading(self): + if not self._paused: + raise RuntimeError('Not paused') + self._paused = False + if self._closing: + return + self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) + + def _sock_recv(self): + return wrap_ssl_error(self._sock.recv, self.max_size) + + def _read_ready(self): + if self._write_wants_read: + self._write_wants_read = False + self._write_ready() + + if self._buffer: + self._loop.add_writer(self._sock_fd, self._write_ready) + + try: + if _SSL_REQUIRES_SELECT: + rfds = (self._sock.fileno(),) + rfds = select.select(rfds, (), (), 0.0)[0] + if not rfds: + # False alarm. + return + data = wrap_error(self._sock_recv) + except (BlockingIOError, InterruptedError, SSLWantReadError): + pass + except SSLWantWriteError: + self._read_wants_write = True + self._loop.remove_reader(self._sock_fd) + self._loop.add_writer(self._sock_fd, self._write_ready) + except Exception as exc: + self._fatal_error(exc, 'Fatal read error on SSL transport') + else: + if data: + self._protocol.data_received(data) + else: + try: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) + keep_open = self._protocol.eof_received() + if keep_open: + logger.warning('returning true from eof_received() ' + 'has no effect when using ssl') + finally: + self.close() + + def _write_ready(self): + if self._read_wants_write: + self._read_wants_write = False + self._read_ready() + + if not (self._paused or self._closing): + self._loop.add_reader(self._sock_fd, self._read_ready) + + if self._buffer: + data = flatten_bytes(self._buffer) + try: + n = wrap_error(self._sock.send, data) + except (BlockingIOError, InterruptedError, SSLWantWriteError): + n = 0 + except SSLWantReadError: + n = 0 + self._loop.remove_writer(self._sock_fd) + self._write_wants_read = True + except Exception as exc: + self._loop.remove_writer(self._sock_fd) + del self._buffer[:] + self._fatal_error(exc, 'Fatal write error on SSL transport') + return + + if n: + del self._buffer[:n] + + self._maybe_resume_protocol() # May append to buffer. + + if not self._buffer: + self._loop.remove_writer(self._sock_fd) + if self._closing: + self._call_connection_lost(None) + + def write(self, data): + data = flatten_bytes(data) + if not data: + return + + if self._conn_lost: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + self._loop.add_writer(self._sock_fd, self._write_ready) + + # Add it to the buffer. + self._buffer.extend(data) + self._maybe_pause_protocol() + + def can_write_eof(self): + return False + + +class _SelectorDatagramTransport(_SelectorTransport): + + _buffer_factory = collections.deque + + def __init__(self, loop, sock, protocol, address=None, + waiter=None, extra=None): + super(_SelectorDatagramTransport, self).__init__(loop, sock, + protocol, extra) + self._address = address + self._loop.call_soon(self._protocol.connection_made, self) + # only start reading when connection_made() has been called + self._loop.call_soon(self._loop.add_reader, + self._sock_fd, self._read_ready) + if waiter is not None: + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) + + def get_write_buffer_size(self): + return sum(len(data) for data, _ in self._buffer) + + def _read_ready(self): + try: + data, addr = wrap_error(self._sock.recvfrom, self.max_size) + except (BlockingIOError, InterruptedError): + pass + except OSError as exc: + self._protocol.error_received(exc) + except Exception as exc: + self._fatal_error(exc, 'Fatal read error on datagram transport') + else: + self._protocol.datagram_received(data, addr) + + def sendto(self, data, addr=None): + data = flatten_bytes(data) + if not data: + return + + if self._address and addr not in (None, self._address): + raise ValueError('Invalid address: must be None or %s' % + (self._address,)) + + if self._conn_lost and self._address: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('socket.send() raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Attempt to send it right away first. + try: + if self._address: + wrap_error(self._sock.send, data) + else: + wrap_error(self._sock.sendto, data, addr) + return + except (BlockingIOError, InterruptedError): + self._loop.add_writer(self._sock_fd, self._sendto_ready) + except OSError as exc: + self._protocol.error_received(exc) + return + except Exception as exc: + self._fatal_error(exc, + 'Fatal write error on datagram transport') + return + + # Ensure that what we buffer is immutable. + self._buffer.append((bytes(data), addr)) + self._maybe_pause_protocol() + + def _sendto_ready(self): + while self._buffer: + data, addr = self._buffer.popleft() + try: + if self._address: + wrap_error(self._sock.send, data) + else: + wrap_error(self._sock.sendto, data, addr) + except (BlockingIOError, InterruptedError): + self._buffer.appendleft((data, addr)) # Try again later. + break + except OSError as exc: + self._protocol.error_received(exc) + return + except Exception as exc: + self._fatal_error(exc, + 'Fatal write error on datagram transport') + return + + self._maybe_resume_protocol() # May append to buffer. + if not self._buffer: + self._loop.remove_writer(self._sock_fd) + if self._closing: + self._call_connection_lost(None) diff --git a/.local/lib/python2.7/site-packages/trollius/selector_events.pyc b/.local/lib/python2.7/site-packages/trollius/selector_events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9516ad1115ea4c5ead869c4f0b270f18ec491f67 GIT binary patch literal 35511 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 0, this specifies the maximum wait time, in + seconds + if timeout <= 0, the select() call won't block, and will + report the currently ready file objects + if timeout is None, select() will block until a monitored + file object becomes ready + + Returns: + list of (key, events) for ready file objects + `events` is a bitwise mask of EVENT_READ|EVENT_WRITE + """ + raise NotImplementedError + + def close(self): + """Close the selector. + + This must be called to make sure that any underlying resource is freed. + """ + pass + + def get_key(self, fileobj): + """Return the key associated to a registered file object. + + Returns: + SelectorKey for this file object + """ + mapping = self.get_map() + if mapping is None: + raise RuntimeError('Selector is closed') + try: + return mapping[fileobj] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + @abstractmethod + def get_map(self): + """Return a mapping of file objects to selector keys.""" + raise NotImplementedError + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +class _BaseSelectorImpl(BaseSelector): + """Base selector implementation.""" + + def __init__(self): + # this maps file descriptors to keys + self._fd_to_key = {} + # read-only mapping returned by get_map() + self._map = _SelectorMapping(self) + + def _fileobj_lookup(self, fileobj): + """Return a file descriptor from a file object. + + This wraps _fileobj_to_fd() to do an exhaustive search in case + the object is invalid but we still have it in our map. This + is used by unregister() so we can unregister an object that + was previously registered even if it is closed. It is also + used by _SelectorMapping. + """ + try: + return _fileobj_to_fd(fileobj) + except ValueError: + # Do an exhaustive search. + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + return key.fd + # Raise ValueError after all. + raise + + def register(self, fileobj, events, data=None): + if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): + raise ValueError("Invalid events: {0!r}".format(events)) + + key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) + + if key.fd in self._fd_to_key: + raise KeyError("{0!r} (FD {1}) is already registered" + .format(fileobj, key.fd)) + + self._fd_to_key[key.fd] = key + return key + + def unregister(self, fileobj): + try: + key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + return key + + def modify(self, fileobj, events, data=None): + # TODO: Subclasses can probably optimize this even further. + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + if events != key.events: + self.unregister(fileobj) + key = self.register(fileobj, events, data) + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + return key + + def close(self): + self._fd_to_key.clear() + self._map = None + + def get_map(self): + return self._map + + def _key_from_fd(self, fd): + """Return the key associated to a given file descriptor. + + Parameters: + fd -- file descriptor + + Returns: + corresponding key, or None if not found + """ + try: + return self._fd_to_key[fd] + except KeyError: + return None + + +class SelectSelector(_BaseSelectorImpl): + """Select-based selector.""" + + def __init__(self): + super(SelectSelector, self).__init__() + self._readers = set() + self._writers = set() + + def register(self, fileobj, events, data=None): + key = super(SelectSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + self._readers.add(key.fd) + if events & EVENT_WRITE: + self._writers.add(key.fd) + return key + + def unregister(self, fileobj): + key = super(SelectSelector, self).unregister(fileobj) + self._readers.discard(key.fd) + self._writers.discard(key.fd) + return key + + if sys.platform == 'win32': + def _select(self, r, w, _, timeout=None): + r, w, x = select.select(r, w, w, timeout) + return r, w + x, [] + else: + def _select(self, r, w, x, timeout=None): + return select.select(r, w, x, timeout) + + def select(self, timeout=None): + timeout = None if timeout is None else max(timeout, 0) + ready = [] + try: + r, w, _ = wrap_error(self._select, + self._readers, self._writers, [], timeout) + except InterruptedError: + return ready + r = set(r) + w = set(w) + for fd in r | w: + events = 0 + if fd in r: + events |= EVENT_READ + if fd in w: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, 'poll'): + + class PollSelector(_BaseSelectorImpl): + """Poll-based selector.""" + + def __init__(self): + super(PollSelector, self).__init__() + self._poll = select.poll() + + def register(self, fileobj, events, data=None): + key = super(PollSelector, self).register(fileobj, events, data) + poll_events = 0 + if events & EVENT_READ: + poll_events |= select.POLLIN + if events & EVENT_WRITE: + poll_events |= select.POLLOUT + self._poll.register(key.fd, poll_events) + return key + + def unregister(self, fileobj): + key = super(PollSelector, self).unregister(fileobj) + self._poll.unregister(key.fd) + return key + + def select(self, timeout=None): + if timeout is None: + timeout = None + elif timeout <= 0: + timeout = 0 + else: + # poll() has a resolution of 1 millisecond, round away from + # zero to wait *at least* timeout seconds. + timeout = int(math.ceil(timeout * 1e3)) + ready = [] + try: + fd_event_list = wrap_error(self._poll.poll, timeout) + except InterruptedError: + return ready + for fd, event in fd_event_list: + events = 0 + if event & ~select.POLLIN: + events |= EVENT_WRITE + if event & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, 'epoll'): + + class EpollSelector(_BaseSelectorImpl): + """Epoll-based selector.""" + + def __init__(self): + super(EpollSelector, self).__init__() + self._epoll = select.epoll() + + def fileno(self): + return self._epoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(EpollSelector, self).register(fileobj, events, data) + epoll_events = 0 + if events & EVENT_READ: + epoll_events |= select.EPOLLIN + if events & EVENT_WRITE: + epoll_events |= select.EPOLLOUT + self._epoll.register(key.fd, epoll_events) + return key + + def unregister(self, fileobj): + key = super(EpollSelector, self).unregister(fileobj) + try: + self._epoll.unregister(key.fd) + except IOError: + # This can happen if the FD was closed since it + # was registered. + pass + return key + + def select(self, timeout=None): + if timeout is None: + timeout = -1 + elif timeout <= 0: + timeout = 0 + else: + # epoll_wait() has a resolution of 1 millisecond, round away + # from zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) * 1e-3 + + # epoll_wait() expects `maxevents` to be greater than zero; + # we want to make sure that `select()` can be called when no + # FD is registered. + max_ev = max(len(self._fd_to_key), 1) + + ready = [] + try: + fd_event_list = wrap_error(self._epoll.poll, timeout, max_ev) + except InterruptedError: + return ready + for fd, event in fd_event_list: + events = 0 + if event & ~select.EPOLLIN: + events |= EVENT_WRITE + if event & ~select.EPOLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._epoll.close() + super(EpollSelector, self).close() + + +if hasattr(select, 'devpoll'): + + class DevpollSelector(_BaseSelectorImpl): + """Solaris /dev/poll selector.""" + + def __init__(self): + super(DevpollSelector, self).__init__() + self._devpoll = select.devpoll() + + def fileno(self): + return self._devpoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(DevpollSelector, self).register(fileobj, events, data) + poll_events = 0 + if events & EVENT_READ: + poll_events |= select.POLLIN + if events & EVENT_WRITE: + poll_events |= select.POLLOUT + self._devpoll.register(key.fd, poll_events) + return key + + def unregister(self, fileobj): + key = super(DevpollSelector, self).unregister(fileobj) + self._devpoll.unregister(key.fd) + return key + + def select(self, timeout=None): + if timeout is None: + timeout = None + elif timeout <= 0: + timeout = 0 + else: + # devpoll() has a resolution of 1 millisecond, round away from + # zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) + ready = [] + try: + fd_event_list = self._devpoll.poll(timeout) + except InterruptedError: + return ready + for fd, event in fd_event_list: + events = 0 + if event & ~select.POLLIN: + events |= EVENT_WRITE + if event & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._devpoll.close() + super(DevpollSelector, self).close() + + +if hasattr(select, 'kqueue'): + + class KqueueSelector(_BaseSelectorImpl): + """Kqueue-based selector.""" + + def __init__(self): + super(KqueueSelector, self).__init__() + self._kqueue = select.kqueue() + + def fileno(self): + return self._kqueue.fileno() + + def register(self, fileobj, events, data=None): + key = super(KqueueSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + kev = select.kevent(key.fd, select.KQ_FILTER_READ, + select.KQ_EV_ADD) + self._kqueue.control([kev], 0, 0) + if events & EVENT_WRITE: + kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + self._kqueue.control([kev], 0, 0) + return key + + def unregister(self, fileobj): + key = super(KqueueSelector, self).unregister(fileobj) + if key.events & EVENT_READ: + kev = select.kevent(key.fd, select.KQ_FILTER_READ, + select.KQ_EV_DELETE) + try: + self._kqueue.control([kev], 0, 0) + except OSError: + # This can happen if the FD was closed since it + # was registered. + pass + if key.events & EVENT_WRITE: + kev = select.kevent(key.fd, select.KQ_FILTER_WRITE, + select.KQ_EV_DELETE) + try: + self._kqueue.control([kev], 0, 0) + except OSError: + # See comment above. + pass + return key + + def select(self, timeout=None): + timeout = None if timeout is None else max(timeout, 0) + max_ev = len(self._fd_to_key) + ready = [] + try: + kev_list = wrap_error(self._kqueue.control, + None, max_ev, timeout) + except InterruptedError: + return ready + for kev in kev_list: + fd = kev.ident + flag = kev.filter + events = 0 + if flag == select.KQ_FILTER_READ: + events |= EVENT_READ + if flag == select.KQ_FILTER_WRITE: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._kqueue.close() + super(KqueueSelector, self).close() + + +# Choose the best implementation, roughly: +# epoll|kqueue|devpoll > poll > select. +# select() also can't accept a FD > FD_SETSIZE (usually around 1024) +if 'KqueueSelector' in globals(): + DefaultSelector = KqueueSelector +elif 'EpollSelector' in globals(): + DefaultSelector = EpollSelector +elif 'DevpollSelector' in globals(): + DefaultSelector = DevpollSelector +elif 'PollSelector' in globals(): + DefaultSelector = PollSelector +else: + DefaultSelector = SelectSelector diff --git a/.local/lib/python2.7/site-packages/trollius/selectors.pyc b/.local/lib/python2.7/site-packages/trollius/selectors.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c572b6cab6960fc116741d7227c833a61d7a3f44 GIT binary patch literal 22162 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/sslproto.py b/.local/lib/python2.7/site-packages/trollius/sslproto.py new file mode 100644 index 00000000..1404fd79 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/sslproto.py @@ -0,0 +1,683 @@ +import collections +import warnings +try: + import ssl + from .py3_ssl import BACKPORT_SSL_CONTEXT +except ImportError: # pragma: no cover + ssl = None + +from . import compat +from . import protocols +from . import transports +from .log import logger +from .py33_exceptions import BrokenPipeError, ConnectionResetError + + +def _create_transport_context(server_side, server_hostname): + if server_side: + raise ValueError('Server side SSL needs a valid SSLContext') + + # Client side may pass ssl=True to use a default + # context; in that case the sslcontext passed is None. + # The default is secure for client connections. + if hasattr(ssl, 'create_default_context'): + # Python 3.4+: use up-to-date strong settings. + sslcontext = ssl.create_default_context() + if not server_hostname: + sslcontext.check_hostname = False + else: + # Fallback for Python 3.3. + sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if not BACKPORT_SSL_CONTEXT: + sslcontext.options |= ssl.OP_NO_SSLv2 + sslcontext.options |= ssl.OP_NO_SSLv3 + sslcontext.set_default_verify_paths() + sslcontext.verify_mode = ssl.CERT_REQUIRED + return sslcontext + + +def _is_sslproto_available(): + return hasattr(ssl, "MemoryBIO") + + +# States of an _SSLPipe. +_UNWRAPPED = "UNWRAPPED" +_DO_HANDSHAKE = "DO_HANDSHAKE" +_WRAPPED = "WRAPPED" +_SHUTDOWN = "SHUTDOWN" + +if ssl is not None: + if hasattr(ssl, 'CertificateError'): + _SSL_ERRORS = (ssl.SSLError, ssl.CertificateError) + else: + _SSL_ERRORS = ssl.SSLError + + +class _SSLPipe(object): + """An SSL "Pipe". + + An SSL pipe allows you to communicate with an SSL/TLS protocol instance + through memory buffers. It can be used to implement a security layer for an + existing connection where you don't have access to the connection's file + descriptor, or for some reason you don't want to use it. + + An SSL pipe can be in "wrapped" and "unwrapped" mode. In unwrapped mode, + data is passed through untransformed. In wrapped mode, application level + data is encrypted to SSL record level data and vice versa. The SSL record + level is the lowest level in the SSL protocol suite and is what travels + as-is over the wire. + + An SslPipe initially is in "unwrapped" mode. To start SSL, call + do_handshake(). To shutdown SSL again, call unwrap(). + """ + + max_size = 256 * 1024 # Buffer size passed to read() + + def __init__(self, context, server_side, server_hostname=None): + """ + The *context* argument specifies the ssl.SSLContext to use. + + The *server_side* argument indicates whether this is a server side or + client side transport. + + The optional *server_hostname* argument can be used to specify the + hostname you are connecting to. You may only specify this parameter if + the _ssl module supports Server Name Indication (SNI). + """ + self._context = context + self._server_side = server_side + self._server_hostname = server_hostname + self._state = _UNWRAPPED + self._incoming = ssl.MemoryBIO() + self._outgoing = ssl.MemoryBIO() + self._sslobj = None + self._need_ssldata = False + self._handshake_cb = None + self._shutdown_cb = None + + @property + def context(self): + """The SSL context passed to the constructor.""" + return self._context + + @property + def ssl_object(self): + """The internal ssl.SSLObject instance. + + Return None if the pipe is not wrapped. + """ + return self._sslobj + + @property + def need_ssldata(self): + """Whether more record level data is needed to complete a handshake + that is currently in progress.""" + return self._need_ssldata + + @property + def wrapped(self): + """ + Whether a security layer is currently in effect. + + Return False during handshake. + """ + return self._state == _WRAPPED + + def do_handshake(self, callback=None): + """Start the SSL handshake. + + Return a list of ssldata. A ssldata element is a list of buffers + + The optional *callback* argument can be used to install a callback that + will be called when the handshake is complete. The callback will be + called with None if successful, else an exception instance. + """ + if self._state != _UNWRAPPED: + raise RuntimeError('handshake in progress or completed') + self._sslobj = self._context.wrap_bio( + self._incoming, self._outgoing, + server_side=self._server_side, + server_hostname=self._server_hostname) + self._state = _DO_HANDSHAKE + self._handshake_cb = callback + ssldata, appdata = self.feed_ssldata(b'', only_handshake=True) + assert len(appdata) == 0 + return ssldata + + def shutdown(self, callback=None): + """Start the SSL shutdown sequence. + + Return a list of ssldata. A ssldata element is a list of buffers + + The optional *callback* argument can be used to install a callback that + will be called when the shutdown is complete. The callback will be + called without arguments. + """ + if self._state == _UNWRAPPED: + raise RuntimeError('no security layer present') + if self._state == _SHUTDOWN: + raise RuntimeError('shutdown in progress') + assert self._state in (_WRAPPED, _DO_HANDSHAKE) + self._state = _SHUTDOWN + self._shutdown_cb = callback + ssldata, appdata = self.feed_ssldata(b'') + assert appdata == [] or appdata == [b''] + return ssldata + + def feed_eof(self): + """Send a potentially "ragged" EOF. + + This method will raise an SSL_ERROR_EOF exception if the EOF is + unexpected. + """ + self._incoming.write_eof() + ssldata, appdata = self.feed_ssldata(b'') + assert appdata == [] or appdata == [b''] + + def feed_ssldata(self, data, only_handshake=False): + """Feed SSL record level data into the pipe. + + The data must be a bytes instance. It is OK to send an empty bytes + instance. This can be used to get ssldata for a handshake initiated by + this endpoint. + + Return a (ssldata, appdata) tuple. The ssldata element is a list of + buffers containing SSL data that needs to be sent to the remote SSL. + + The appdata element is a list of buffers containing plaintext data that + needs to be forwarded to the application. The appdata list may contain + an empty buffer indicating an SSL "close_notify" alert. This alert must + be acknowledged by calling shutdown(). + """ + if self._state == _UNWRAPPED: + # If unwrapped, pass plaintext data straight through. + if data: + appdata = [data] + else: + appdata = [] + return ([], appdata) + + self._need_ssldata = False + if data: + self._incoming.write(data) + + ssldata = [] + appdata = [] + try: + if self._state == _DO_HANDSHAKE: + # Call do_handshake() until it doesn't raise anymore. + self._sslobj.do_handshake() + self._state = _WRAPPED + if self._handshake_cb: + self._handshake_cb(None) + if only_handshake: + return (ssldata, appdata) + # Handshake done: execute the wrapped block + + if self._state == _WRAPPED: + # Main state: read data from SSL until close_notify + while True: + chunk = self._sslobj.read(self.max_size) + appdata.append(chunk) + if not chunk: # close_notify + break + + elif self._state == _SHUTDOWN: + # Call shutdown() until it doesn't raise anymore. + self._sslobj.unwrap() + self._sslobj = None + self._state = _UNWRAPPED + if self._shutdown_cb: + self._shutdown_cb() + + elif self._state == _UNWRAPPED: + # Drain possible plaintext data after close_notify. + appdata.append(self._incoming.read()) + except _SSL_ERRORS as exc: + if getattr(exc, 'errno', None) not in ( + ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE, + ssl.SSL_ERROR_SYSCALL): + if self._state == _DO_HANDSHAKE and self._handshake_cb: + self._handshake_cb(exc) + raise + self._need_ssldata = (exc.errno == ssl.SSL_ERROR_WANT_READ) + + # Check for record level data that needs to be sent back. + # Happens for the initial handshake and renegotiations. + if self._outgoing.pending: + ssldata.append(self._outgoing.read()) + return (ssldata, appdata) + + def feed_appdata(self, data, offset=0): + """Feed plaintext data into the pipe. + + Return an (ssldata, offset) tuple. The ssldata element is a list of + buffers containing record level data that needs to be sent to the + remote SSL instance. The offset is the number of plaintext bytes that + were processed, which may be less than the length of data. + + NOTE: In case of short writes, this call MUST be retried with the SAME + buffer passed into the *data* argument (i.e. the id() must be the + same). This is an OpenSSL requirement. A further particularity is that + a short write will always have offset == 0, because the _ssl module + does not enable partial writes. And even though the offset is zero, + there will still be encrypted data in ssldata. + """ + assert 0 <= offset <= len(data) + if self._state == _UNWRAPPED: + # pass through data in unwrapped mode + if offset < len(data): + ssldata = [data[offset:]] + else: + ssldata = [] + return (ssldata, len(data)) + + ssldata = [] + view = memoryview(data) + while True: + self._need_ssldata = False + try: + if offset < len(view): + offset += self._sslobj.write(view[offset:]) + except ssl.SSLError as exc: + # It is not allowed to call write() after unwrap() until the + # close_notify is acknowledged. We return the condition to the + # caller as a short write. + if exc.reason == 'PROTOCOL_IS_SHUTDOWN': + exc.errno = ssl.SSL_ERROR_WANT_READ + if exc.errno not in (ssl.SSL_ERROR_WANT_READ, + ssl.SSL_ERROR_WANT_WRITE, + ssl.SSL_ERROR_SYSCALL): + raise + self._need_ssldata = (exc.errno == ssl.SSL_ERROR_WANT_READ) + + # See if there's any record level data back for us. + if self._outgoing.pending: + ssldata.append(self._outgoing.read()) + if offset == len(view) or self._need_ssldata: + break + return (ssldata, offset) + + +class _SSLProtocolTransport(transports._FlowControlMixin, + transports.Transport): + + def __init__(self, loop, ssl_protocol, app_protocol): + self._loop = loop + self._ssl_protocol = ssl_protocol + self._app_protocol = app_protocol + self._closed = False + + def get_extra_info(self, name, default=None): + """Get optional transport information.""" + return self._ssl_protocol._get_extra_info(name, default) + + def close(self): + """Close the transport. + + Buffered data will be flushed asynchronously. No more data + will be received. After all buffered data is flushed, the + protocol's connection_lost() method will (eventually) called + with None as its argument. + """ + self._closed = True + self._ssl_protocol._start_shutdown() + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if not self._closed: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self.close() + + def pause_reading(self): + """Pause the receiving end. + + No data will be passed to the protocol's data_received() + method until resume_reading() is called. + """ + self._ssl_protocol._transport.pause_reading() + + def resume_reading(self): + """Resume the receiving end. + + Data received will once again be passed to the protocol's + data_received() method. + """ + self._ssl_protocol._transport.resume_reading() + + def set_write_buffer_limits(self, high=None, low=None): + """Set the high- and low-water limits for write flow control. + + These two values control when to call the protocol's + pause_writing() and resume_writing() methods. If specified, + the low-water limit must be less than or equal to the + high-water limit. Neither value can be negative. + + The defaults are implementation-specific. If only the + high-water limit is given, the low-water limit defaults to a + implementation-specific value less than or equal to the + high-water limit. Setting high to zero forces low to zero as + well, and causes pause_writing() to be called whenever the + buffer becomes non-empty. Setting low to zero causes + resume_writing() to be called only once the buffer is empty. + Use of zero for either limit is generally sub-optimal as it + reduces opportunities for doing I/O and computation + concurrently. + """ + self._ssl_protocol._transport.set_write_buffer_limits(high, low) + + def get_write_buffer_size(self): + """Return the current size of the write buffer.""" + return self._ssl_protocol._transport.get_write_buffer_size() + + def write(self, data): + """Write some data bytes to the transport. + + This does not block; it buffers the data and arranges for it + to be sent out asynchronously. + """ + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError("data: expecting a bytes-like instance, got {!r}" + .format(type(data).__name__)) + if not data: + return + self._ssl_protocol._write_appdata(data) + + def can_write_eof(self): + """Return True if this transport supports write_eof(), False if not.""" + return False + + def abort(self): + """Close the transport immediately. + + Buffered data will be lost. No more data will be received. + The protocol's connection_lost() method will (eventually) be + called with None as its argument. + """ + self._ssl_protocol._abort() + + +class SSLProtocol(protocols.Protocol): + """SSL protocol. + + Implementation of SSL on top of a socket using incoming and outgoing + buffers which are ssl.MemoryBIO objects. + """ + + def __init__(self, loop, app_protocol, sslcontext, waiter, + server_side=False, server_hostname=None): + if ssl is None: + raise RuntimeError('stdlib ssl module not available') + + if not sslcontext: + sslcontext = _create_transport_context(server_side, server_hostname) + + self._server_side = server_side + if server_hostname and not server_side: + self._server_hostname = server_hostname + else: + self._server_hostname = None + self._sslcontext = sslcontext + # SSL-specific extra info. More info are set when the handshake + # completes. + self._extra = dict(sslcontext=sslcontext) + + # App data write buffering + self._write_backlog = collections.deque() + self._write_buffer_size = 0 + + self._waiter = waiter + self._loop = loop + self._app_protocol = app_protocol + self._app_transport = _SSLProtocolTransport(self._loop, + self, self._app_protocol) + self._sslpipe = None + self._session_established = False + self._in_handshake = False + self._in_shutdown = False + self._transport = None + + def _wakeup_waiter(self, exc=None): + if self._waiter is None: + return + if not self._waiter.cancelled(): + if exc is not None: + self._waiter.set_exception(exc) + else: + self._waiter.set_result(None) + self._waiter = None + + def connection_made(self, transport): + """Called when the low-level connection is made. + + Start the SSL handshake. + """ + self._transport = transport + self._sslpipe = _SSLPipe(self._sslcontext, + self._server_side, + self._server_hostname) + self._start_handshake() + + def connection_lost(self, exc): + """Called when the low-level connection is lost or closed. + + The argument is an exception object or None (the latter + meaning a regular EOF is received or the connection was + aborted or closed). + """ + if self._session_established: + self._session_established = False + self._loop.call_soon(self._app_protocol.connection_lost, exc) + self._transport = None + self._app_transport = None + + def pause_writing(self): + """Called when the low-level transport's buffer goes over + the high-water mark. + """ + self._app_protocol.pause_writing() + + def resume_writing(self): + """Called when the low-level transport's buffer drains below + the low-water mark. + """ + self._app_protocol.resume_writing() + + def data_received(self, data): + """Called when some SSL data is received. + + The argument is a bytes object. + """ + try: + ssldata, appdata = self._sslpipe.feed_ssldata(data) + except ssl.SSLError as e: + if self._loop.get_debug(): + logger.warning('%r: SSL error %s (reason %s)', + self, e.errno, e.reason) + self._abort() + return + + for chunk in ssldata: + self._transport.write(chunk) + + for chunk in appdata: + if chunk: + self._app_protocol.data_received(chunk) + else: + self._start_shutdown() + break + + def eof_received(self): + """Called when the other end of the low-level stream + is half-closed. + + If this returns a false value (including None), the transport + will close itself. If it returns a true value, closing the + transport is up to the protocol. + """ + try: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) + + self._wakeup_waiter(ConnectionResetError) + + if not self._in_handshake: + keep_open = self._app_protocol.eof_received() + if keep_open: + logger.warning('returning true from eof_received() ' + 'has no effect when using ssl') + finally: + self._transport.close() + + def _get_extra_info(self, name, default=None): + if name in self._extra: + return self._extra[name] + else: + return self._transport.get_extra_info(name, default) + + def _start_shutdown(self): + if self._in_shutdown: + return + self._in_shutdown = True + self._write_appdata(b'') + + def _write_appdata(self, data): + self._write_backlog.append((data, 0)) + self._write_buffer_size += len(data) + self._process_write_backlog() + + def _start_handshake(self): + if self._loop.get_debug(): + logger.debug("%r starts SSL handshake", self) + self._handshake_start_time = self._loop.time() + else: + self._handshake_start_time = None + self._in_handshake = True + # (b'', 1) is a special value in _process_write_backlog() to do + # the SSL handshake + self._write_backlog.append((b'', 1)) + self._loop.call_soon(self._process_write_backlog) + + def _on_handshake_complete(self, handshake_exc): + self._in_handshake = False + + sslobj = self._sslpipe.ssl_object + try: + if handshake_exc is not None: + raise handshake_exc + + peercert = sslobj.getpeercert() + if not hasattr(self._sslcontext, 'check_hostname'): + # Verify hostname if requested, Python 3.4+ uses check_hostname + # and checks the hostname in do_handshake() + if (self._server_hostname + and self._sslcontext.verify_mode != ssl.CERT_NONE): + ssl.match_hostname(peercert, self._server_hostname) + except BaseException as exc: + if self._loop.get_debug(): + if (hasattr(ssl, 'CertificateError') + and isinstance(exc, ssl.CertificateError)): + logger.warning("%r: SSL handshake failed " + "on verifying the certificate", + self, exc_info=True) + else: + logger.warning("%r: SSL handshake failed", + self, exc_info=True) + self._transport.close() + if isinstance(exc, Exception): + self._wakeup_waiter(exc) + return + else: + raise + + if self._loop.get_debug(): + dt = self._loop.time() - self._handshake_start_time + logger.debug("%r: SSL handshake took %.1f ms", self, dt * 1e3) + + # Add extra info that becomes available after handshake. + self._extra.update(peercert=peercert, + cipher=sslobj.cipher(), + compression=sslobj.compression(), + ) + self._app_protocol.connection_made(self._app_transport) + self._wakeup_waiter() + self._session_established = True + # In case transport.write() was already called. Don't call + # immediatly _process_write_backlog(), but schedule it: + # _on_handshake_complete() can be called indirectly from + # _process_write_backlog(), and _process_write_backlog() is not + # reentrant. + self._loop.call_soon(self._process_write_backlog) + + def _process_write_backlog(self): + # Try to make progress on the write backlog. + if self._transport is None: + return + + try: + for i in range(len(self._write_backlog)): + data, offset = self._write_backlog[0] + if data: + ssldata, offset = self._sslpipe.feed_appdata(data, offset) + elif offset: + ssldata = self._sslpipe.do_handshake( + self._on_handshake_complete) + offset = 1 + else: + ssldata = self._sslpipe.shutdown(self._finalize) + offset = 1 + + for chunk in ssldata: + self._transport.write(chunk) + + if offset < len(data): + self._write_backlog[0] = (data, offset) + # A short write means that a write is blocked on a read + # We need to enable reading if it is paused! + assert self._sslpipe.need_ssldata + if self._transport._paused: + self._transport.resume_reading() + break + + # An entire chunk from the backlog was processed. We can + # delete it and reduce the outstanding buffer size. + del self._write_backlog[0] + self._write_buffer_size -= len(data) + except BaseException as exc: + if self._in_handshake: + # BaseExceptions will be re-raised in _on_handshake_complete. + self._on_handshake_complete(exc) + else: + self._fatal_error(exc, 'Fatal error on SSL transport') + if not isinstance(exc, Exception): + # BaseException + raise + + def _fatal_error(self, exc, message='Fatal error on transport'): + # Should be called from exception handler only. + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: + self._loop.call_exception_handler({ + 'message': message, + 'exception': exc, + 'transport': self._transport, + 'protocol': self, + }) + if self._transport: + self._transport._force_close(exc) + + def _finalize(self): + if self._transport is not None: + self._transport.close() + + def _abort(self): + if self._transport is not None: + try: + self._transport.abort() + finally: + self._finalize() diff --git a/.local/lib/python2.7/site-packages/trollius/sslproto.pyc b/.local/lib/python2.7/site-packages/trollius/sslproto.pyc new file mode 100644 index 0000000000000000000000000000000000000000..031cbfa3269d3c9259368313766d17c1faf14df6 GIT binary patch literal 24140 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' % ' '.join(info) + + @property + def transport(self): + return self._transport + + def write(self, data): + self._transport.write(data) + + def writelines(self, data): + self._transport.writelines(data) + + def write_eof(self): + return self._transport.write_eof() + + def can_write_eof(self): + return self._transport.can_write_eof() + + def close(self): + return self._transport.close() + + def get_extra_info(self, name, default=None): + return self._transport.get_extra_info(name, default) + + @coroutine + def drain(self): + """Flush the write buffer. + + The intended use is to write + + w.write(data) + yield From(w.drain()) + """ + if self._reader is not None: + exc = self._reader.exception() + if exc is not None: + raise exc + yield From(self._protocol._drain_helper()) + + +class StreamReader(object): + + def __init__(self, limit=_DEFAULT_LIMIT, loop=None): + # The line length limit is a security feature; + # it also doubles as half the buffer limit. + self._limit = limit + if loop is None: + self._loop = events.get_event_loop() + else: + self._loop = loop + self._buffer = bytearray() + self._eof = False # Whether we're done. + self._waiter = None # A future used by _wait_for_data() + self._exception = None + self._transport = None + self._paused = False + + def __repr__(self): + info = ['StreamReader'] + if self._buffer: + info.append('%d bytes' % len(info)) + if self._eof: + info.append('eof') + if self._limit != _DEFAULT_LIMIT: + info.append('l=%d' % self._limit) + if self._waiter: + info.append('w=%r' % self._waiter) + if self._exception: + info.append('e=%r' % self._exception) + if self._transport: + info.append('t=%r' % self._transport) + if self._paused: + info.append('paused') + return '<%s>' % ' '.join(info) + + def exception(self): + return self._exception + + def set_exception(self, exc): + self._exception = exc + + waiter = self._waiter + if waiter is not None: + self._waiter = None + if not waiter.cancelled(): + waiter.set_exception(exc) + + def _wakeup_waiter(self): + """Wakeup read() or readline() function waiting for data or EOF.""" + waiter = self._waiter + if waiter is not None: + self._waiter = None + if not waiter.cancelled(): + waiter.set_result(None) + + def set_transport(self, transport): + assert self._transport is None, 'Transport already set' + self._transport = transport + + def _maybe_resume_transport(self): + if self._paused and len(self._buffer) <= self._limit: + self._paused = False + self._transport.resume_reading() + + def feed_eof(self): + self._eof = True + self._wakeup_waiter() + + def at_eof(self): + """Return True if the buffer is empty and 'feed_eof' was called.""" + return self._eof and not self._buffer + + def feed_data(self, data): + assert not self._eof, 'feed_data after feed_eof' + + if not data: + return + + self._buffer.extend(data) + self._wakeup_waiter() + + if (self._transport is not None and + not self._paused and + len(self._buffer) > 2*self._limit): + try: + self._transport.pause_reading() + except NotImplementedError: + # The transport can't be paused. + # We'll just have to buffer all data. + # Forget the transport so we don't keep trying. + self._transport = None + else: + self._paused = True + + @coroutine + def _wait_for_data(self, func_name): + """Wait until feed_data() or feed_eof() is called.""" + # StreamReader uses a future to link the protocol feed_data() method + # to a read coroutine. Running two read coroutines at the same time + # would have an unexpected behaviour. It would not possible to know + # which coroutine would get the next data. + if self._waiter is not None: + raise RuntimeError('%s() called while another coroutine is ' + 'already waiting for incoming data' % func_name) + + # In asyncio, there is no need to recheck if we got data or EOF thanks + # to "yield from". In trollius, a StreamReader method can be called + # after the _wait_for_data() coroutine is scheduled and before it is + # really executed. + if self._buffer or self._eof: + return + + self._waiter = futures.Future(loop=self._loop) + try: + yield From(self._waiter) + finally: + self._waiter = None + + @coroutine + def readline(self): + if self._exception is not None: + raise self._exception + + line = bytearray() + not_enough = True + + while not_enough: + while self._buffer and not_enough: + ichar = self._buffer.find(b'\n') + if ichar < 0: + line.extend(self._buffer) + del self._buffer[:] + else: + ichar += 1 + line.extend(self._buffer[:ichar]) + del self._buffer[:ichar] + not_enough = False + + if len(line) > self._limit: + self._maybe_resume_transport() + raise ValueError('Line is too long') + + if self._eof: + break + + if not_enough: + yield From(self._wait_for_data('readline')) + + self._maybe_resume_transport() + raise Return(bytes(line)) + + @coroutine + def read(self, n=-1): + if self._exception is not None: + raise self._exception + + if not n: + raise Return(b'') + + if n < 0: + # This used to just loop creating a new waiter hoping to + # collect everything in self._buffer, but that would + # deadlock if the subprocess sends more than self.limit + # bytes. So just call self.read(self._limit) until EOF. + blocks = [] + while True: + block = yield From(self.read(self._limit)) + if not block: + break + blocks.append(block) + raise Return(b''.join(blocks)) + else: + if not self._buffer and not self._eof: + yield From(self._wait_for_data('read')) + + if n < 0 or len(self._buffer) <= n: + data = bytes(self._buffer) + del self._buffer[:] + else: + # n > 0 and len(self._buffer) > n + data = bytes(self._buffer[:n]) + del self._buffer[:n] + + self._maybe_resume_transport() + raise Return(data) + + @coroutine + def readexactly(self, n): + if self._exception is not None: + raise self._exception + + # There used to be "optimized" code here. It created its own + # Future and waited until self._buffer had at least the n + # bytes, then called read(n). Unfortunately, this could pause + # the transport if the argument was larger than the pause + # limit (which is twice self._limit). So now we just read() + # into a local buffer. + + blocks = [] + while n > 0: + block = yield From(self.read(n)) + if not block: + partial = b''.join(blocks) + raise IncompleteReadError(partial, len(partial) + n) + blocks.append(block) + n -= len(block) + + raise Return(b''.join(blocks)) + + # FIXME: should we support __aiter__ and __anext__ in Trollius? + #if compat.PY35: + # @coroutine + # def __aiter__(self): + # return self + # + # @coroutine + # def __anext__(self): + # val = yield from self.readline() + # if val == b'': + # raise StopAsyncIteration + # return val diff --git a/.local/lib/python2.7/site-packages/trollius/streams.pyc b/.local/lib/python2.7/site-packages/trollius/streams.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b26ce084e547ec1d537cba7ee85ac1ef61bb055 GIT binary patch literal 19319 zcmdU1&vP8db?(^(7g!J^D3Ib0k&=e8X@V9Bx+GbaB~cP7krrJttPE+uu9R;{IfoolImG2ka!CFJ-%_bmE;;0o@+G+>Cs(;rl|!nM@B7~T zSb&tG*g#SNG0o{8)6@Ol>-WBXuLt#C?wkJp)31KF?ed=n{(lWu`uCo59p{#idahG* zox1BxxXvEeX}HyfTSDQa>rA;`%`MejRCf{DG~K1IjnuQq%H}C_n9%rY%3`dJWg#>z4Mq z{)}6ias7R6X`j^{biMtqKkJreEq}=M4!Hg!Zs`%^Pr9W!&LukNRxp<%?!I&Pocqqw zAs6lC#OyahqoeNr1n01H_<^cpMb(k5B#6DT6ZY_!yI)riN2?xKe!M6@=189tE}C{X zAJc#yF9&p-w2zJ#bs+N-W!(v~CVE^?JXw}LL7wHMep&h?r*v)pDRTEPl51HKh5d6$ z)C;qy<7aE#!D_mY&6HI^6n3Iytl&n{%}{V?TZ^}oIE&kHFPlY0Jd6gdc03qF?W`LQ z^mLkqN!CiEcJ&pq;SsqTVn^L#A*6C~3|@)^2$db$*IggH?YyT8WbgG7$OEpyS6Ytbla*8)3@k?X{?r_Y&P6g0)fS zML&zPu;&j({pBd(BSnp`uGPFvy7AhB>vde|^GGu1ZhG#HR7+NKcRa3*J2kgbbBCco zJQSd^Rc9G*ph_UFn)hOQ4jr6I?Hx9gc;JWmU@!{QZ5_xw-p>7G0Xd1(py|SEKZNmc+eYca)wtTBi%c&499V5?9LcI&a21 zc^c?k6Dhr)#}9UR!dz}W7FLZ4v@rr3|GoAH5v`C%^R)^ zE`z6WrGJP7oa;=u^(mJecNwe!jDT}@YgBU}IHdUwQgD~$wYz&9R?{8W7Ax_*AEMbF z*4}KmkFYSY4C?L&=oY_tcEbHg`t+T5Ywm8t-JNuxz@3Ks7}a|0-h{h5MUpW)MXU5Z zbTI)T;`q~_VF_LIH+hri>aF| z*vh(&Rb$opBhaSZ6c3q(4fLen9YAFb+R;l|W!8;YMS)6RX)6uo}RQ+$6f zj)(p{W&*Wo3W-`;#Tr3DN33{%ltyPXz+SiC&9*$XJX%=+Z>?e&rYTKa%nrxsZLB$y zk8%F$ioY3;p!4uPl5&)0aliY4>BTL~1X0e%$pbwVme6na_{Q|Ce-nLxy2DLPr5$%7 z|J*s=C(-Ft&qH#0y-j}*%K-Z+v@4Xf&lXT*Vp zWGdNGs?!!SA48qiwyV=0N}WPIe&o52U_GT*p(LRZp=0p~FgTPV6(;oRob*w*wR%d;fvYx*T!zE=&JOB}gEK;@w^`g$0vRdgT zkb2ls*eWQ?v;KS5xKOWAr`2A5@2sDN>wqBHMqIT8S|O;(+Z&_sdcCV41z>lE!piY*dd;MWA><&Z{qsV9= zsO!UwgrG-`J73Z$x+^{uldM5mbCyLLT~ZX?ji6(~tV;@S+9FQ~$GZb)piq5W57YHA z>H?u=gj*QUn8N*Zv!H&suom)FWQ>K8`>b|BJ$#~Vz;r&7T~IHTZ6LX6J85TOReGa{ zq~gRj2J`LHqnKQbx5%Jd)}3(-Q(`)k@X`6ix}Wv)EPBP0jLPbLjUYG^b=+b*nw zh}_1Cc2uC$C$a9twik3x$H)AET;9t#PmB-9?F)tA#}=P^r>+DP(kG zs@bxqnWcs_oXl4}WVMfVf(ARNO$B{(FcY$8>P`nmIs=8eI8QAaoMb{v6FkL47G)pq zwyXs+Bz!s`iVZ%`?^oZ!hUxY7NhoP z<4I4uD~^~v7WDoD+<K4}m|V?uK~*?nV|CW*hE)4a2(zz|sp70<8D8ISbzNv0?RrB-c|@D0Bn( zZ$Ljn-(HhNN*5|gl8B>6M z4*4H|73}>=umV_OyE~II0vQxFC~{kn$_2b-T#m*aOrJ@J{*ScdHVq-J?I5qHneO5G ztU7QGZO28?6q+eQa@B_WCEh(m2L?1KCV2I-@os3pDfE5^muWwWAhh2JFC%=uf?Xzj zZFHr4qkFqMD0Ko&)g?ak29jvplh%+k4eneiz5A$w9+3{bg(mlLw_?LaE4-L~NI_+EaYlR$aR7h6oCOTSCkr)}m5b&CC$ z53sxzcT#|1n0A3(?4Re)*v1>E4-SA95wS|O?ajeAcI((Rr5RoWf1n}5bhNBZs2{`W znshr+Dp-IQrT|%)-`B>pa3rK7IzsXRG1p%F4|ks_h2B#JVlZQHUh44`334UKqoM?h)~l#_(=!D566_HL8#NitIwABzy1zljoR_$ia(D z_)zc?6S~bM=RyS?xK88(hGat}q@!MDV4UJ=J`4%=uJB+#-jQpgTzLKzB`L@1zyLDg zAjFvXd&X-Qtl<9= zPn4>plRJxZ@(=bYF9tz@d+a{Hye7yyA@UaKjCY_Wol%gx&DNVpNL29aC?y{n0mOjf zfI?t7D1U04^4j$o<hlkO(WqO^|0KHn%Bb0Co10bqAvd5sAdM8NeF&@fh#q`MsihR>k)AK{Xn zX-qY0GtFkBInz8qG0_j1bqQB`5y^JAWQYlY{!c|r2A2@HFR;=D7_c`54d8x*Kb%{> zuoEH*u^eR^Q8e&Ne>sB;;|}&5g3KFUVl2g|o_E9;0Aro-g7w37n6E7l1Ku!FmwQmk zcNB=|EMDIx#FEow{H^{PJWlY#0}2h}4BkyR;)R;f7`}WC5>pr^@>A<+R4DXG9Ji$> zPPN?z>>40O+S@dj4AEA1fS^+n50ft9O$FjA+<65Q%pLsg2{3~fx$`=%ltu!|(>yjX z?O4JVOS|X1Dr|}+%q5AflK}+quQWskW@znYv<3Xk(N5Wv@o%My{R(SFiCG;AX;E%& zScT_X4{`MgW-j*i+DyR^r|IpaccPcDbH-6St+c zDdQ2r*HLUrgKbUQUFDquDAbIv5rD1kXx#-l#n62s~ zPWp4aGY13*q#PSaXYddBjNB+VB5rKm6Pys$iioi{I8fwa{bgM|ARve?XiNE5c!T_t zgd0@_Wl!QYfk-=ryOjtrhbUeNF0%M*OgIK9;4$-Y31z!MBfaNe(0MMHG}i|zQgA3D z1(%>nRVA2X6Vs42C(3~4)Cse&nt*{r7NOo|vV)A~YUcZ(7}`!Kt2QiT zf#yQ1Ue4tnnqaq5V6Zys#GK$acta1Fk3y@sLeK-dz+KZdK-oMA;mA@!k%NBtu77;0ixZ9Ut_{W zg=+V`>l??!2>aRQDln>@|O8*E^vbb~W+_-(rTcyOPK_VY9!8nB;PT6hvPJq>Q( zz$pqE=<7u!wG36k)qyiKF>I%unt&_AZhAVFh1_qp!$Ir2vL{@fg|9=g;M-7zIHI!> z!>>Tg+Xi%u%)@~IWe0we+_jQNMJ$Shkql&P%Tor17JZyXR{CKTjIx)t*IP{;O z_g)&S6TK$%OQj6k50`b4ZIfIv1!m;9hDO2gOcf8A@wqPf9%&AE+<68^S?FZHs1I6uQy~G4l{teOI?^A z=Z_7wj(l;wj{Ec=l2RCGy?9=r#C4TOaKE_CjI*Cg*YO;y%uOd+3F*H??M~~xAVQy? z8=DS^$1(D1<4PBi*mPh(=-Yk1m>uSYlT?_X+-7-|oM*S5=Pr)688!yiLq0MX6u7;3 zW`cdEzk}pTZ_)wg&m-vb8%3O{s?X0pRQ89fv~*_b5JYeTMdo@E=jdGwE+N?sW=JCo zvVDOZp`vrm*?eEPIDdfemf5UaW>oe8z!47==$xXkmm!h&SQj!`W*B7Oj_!6)@l&Aw9hW|+pku8$)ojd8H0#B`nF_X3{z=^QCrB_robBf~Gqc2d_szLx z_#K$t@H+sz#U&B)vbbaslq6s`?NPO`}@^$?N2De5Hwh$f6b5B>YkMLiDf=NKKrfv=*9-~uo@ z8NR4Zi*W3zj(rSbQJHu}@Vs~7R7W=(1z?Ygn+!J+A`1tXXg*j%zZRCDdC_=?05&8t2&&ljE&R@eTzQci2q+R8rEj7&7QCw*lNGQY{5?y*| zuM`?X5X5v2P8Xm7WYz@VyLDxoyOk))SS6;NWcCdv7mqN#8A^*}~h<_*e2Pm1Bm<3rup%%~DZWNh$OI&!F9pBQ{9BGkaK)F79Jqo=qfLH{VgjN? zeiCgIlpLEnU$rap@)kPobFx(Z&O2T$9j-8!NXC^vtRwbTg_ zh)sDm1TR29f*Qe8m=vG%AQhh-OweX;KeBoFpQPd05k9+XJHG4)dT;f^&1If`(jlnQ zHFJw(X`tSDrH_b%DG9@8GtIa>Y`{rF7z)ou9WCU5HZ70FyRG}^@_wHKH-3&C_TkVa zww3QZF5(|EHef7sjMom#^F)r14-6Q5%s+Rc%e6m*f07>4(?!(dG@P9&oSuxOFPO;6 zq>;V5%setD#371!z$S~FmUgqkZd7XGt z>`v#zxJ~=1I+}DdxZ^=&J%zq<=U>wuTAyI6%|}#+g)mM1>D?GS<|YtFTc38xA0e7b zA;H6lqTc$c`!>E~W@fUqD3qH;oyRESFn+j#!(@Izb$#ADzYpz9v>3Y$NOFOX=r%Wg z0p-nr!%5zKnTeL3;07PI<4*Zf)7R6Badx#hLKxZC(-uM@b+rz6&s#*;^&vUQU7GU_ z*BaggLRr(bS#R1q;nlrIynPe0=j3v7K2TSuN}vmG~1l`C2ct^L7V!C?g^-tlgrwecCX-{zw-TIqSb{08irKSE5u zXB<-GOjfX97_1=HPrgjjH}TA=6lGRGk3WulhWt(sOfDm@e55cE?q%} zXgde)zzr{w+4?j-;E4K>j@d~#OjZaDg3C;vWipGTGBw)b&|bIbMA;3SQt`wH9Z zLk6os=)|wuA@>}1fehP2O-SFcS<_KJm>zu={TIXHi1R^xLs;xt6HhrbCn1X0-n*Iu>zh$7$1K$EVGrv%b zvr~grc|uCqMmu4EmI4*@n0%Fq)C^g&(uI<_&7$X+l&U3oA6Z3;-r;9gCVw&tl(pb4 z6Yl-xwbA$dW5+t!F=3;g$AV}@gLt&MrndM%DNJ@lCW8<0)<35dF5t#N;miQ|!Q+BY zC+C2msf4ESx%@QB9!1JCh!apx$5E<3E}>uo^-(FN&wjd?f=%g{w%|oFTb6|K_hYvT zA%^$@T4Cq>VGgh$tds+Nv;Y>rV=|i#3Q@snQb-Gha3H<(}kW8FY#U{%3^-cH8;PI*gP5tpo zK;atWaR#;C>E_u6qwvOZdTf8{^B5q9JaE_%mv!{W*^)V>H z30S+MwL{(!L?~hZ>IWr)rJRvWQip$u8eq{nX| zNjQFNyIe^OKj4DIAyq^e?ZCVv@X6-}6-`TlLk(L=dR~BU`_|_nfI860P4k!lipyLk zi(;@?ZD%AZ=2k2fBe}3ly@w$;V6%vliD*@2zzVijo-J#-BInZT^DX z3>)z~B zV58^eeYDeIRC9i|upz+T4k1Lh&%ITQGms(vc8nPfJ<;T2(@gd<5jGL5-OsG#fb7;m zu;J#j&sLt)G@yl&V-BCk*l~8zSag@jh}smjfXgM&26T!KF?l=x`#ZritRuYDXzgoQ z`&_=HU}!8J_8$c7~r?~cY=5IM*Z;qI_l?6DE-`Qy-t)g Q!}QVFW0y{xIsD3h0XBn?mjD0& literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/subprocess.py b/.local/lib/python2.7/site-packages/trollius/subprocess.py new file mode 100644 index 00000000..4ed2b5c5 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/subprocess.py @@ -0,0 +1,225 @@ +from __future__ import absolute_import + +__all__ = ['create_subprocess_exec', 'create_subprocess_shell'] + +import subprocess + +from . import events +from . import protocols +from . import streams +from . import tasks +from .coroutines import coroutine, From, Return +from .py33_exceptions import BrokenPipeError, ConnectionResetError +from .log import logger + + +PIPE = subprocess.PIPE +STDOUT = subprocess.STDOUT +if hasattr(subprocess, 'DEVNULL'): + DEVNULL = subprocess.DEVNULL + + +class SubprocessStreamProtocol(streams.FlowControlMixin, + protocols.SubprocessProtocol): + """Like StreamReaderProtocol, but for a subprocess.""" + + def __init__(self, limit, loop): + super(SubprocessStreamProtocol, self).__init__(loop=loop) + self._limit = limit + self.stdin = self.stdout = self.stderr = None + self._transport = None + + def __repr__(self): + info = [self.__class__.__name__] + if self.stdin is not None: + info.append('stdin=%r' % self.stdin) + if self.stdout is not None: + info.append('stdout=%r' % self.stdout) + if self.stderr is not None: + info.append('stderr=%r' % self.stderr) + return '<%s>' % ' '.join(info) + + def connection_made(self, transport): + self._transport = transport + + stdout_transport = transport.get_pipe_transport(1) + if stdout_transport is not None: + self.stdout = streams.StreamReader(limit=self._limit, + loop=self._loop) + self.stdout.set_transport(stdout_transport) + + stderr_transport = transport.get_pipe_transport(2) + if stderr_transport is not None: + self.stderr = streams.StreamReader(limit=self._limit, + loop=self._loop) + self.stderr.set_transport(stderr_transport) + + stdin_transport = transport.get_pipe_transport(0) + if stdin_transport is not None: + self.stdin = streams.StreamWriter(stdin_transport, + protocol=self, + reader=None, + loop=self._loop) + + def pipe_data_received(self, fd, data): + if fd == 1: + reader = self.stdout + elif fd == 2: + reader = self.stderr + else: + reader = None + if reader is not None: + reader.feed_data(data) + + def pipe_connection_lost(self, fd, exc): + if fd == 0: + pipe = self.stdin + if pipe is not None: + pipe.close() + self.connection_lost(exc) + return + if fd == 1: + reader = self.stdout + elif fd == 2: + reader = self.stderr + else: + reader = None + if reader != None: + if exc is None: + reader.feed_eof() + else: + reader.set_exception(exc) + + def process_exited(self): + self._transport.close() + self._transport = None + + +class Process: + def __init__(self, transport, protocol, loop): + self._transport = transport + self._protocol = protocol + self._loop = loop + self.stdin = protocol.stdin + self.stdout = protocol.stdout + self.stderr = protocol.stderr + self.pid = transport.get_pid() + + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, self.pid) + + @property + def returncode(self): + return self._transport.get_returncode() + + @coroutine + def wait(self): + """Wait until the process exit and return the process return code. + + This method is a coroutine.""" + return_code = yield From(self._transport._wait()) + raise Return(return_code) + + def send_signal(self, signal): + self._transport.send_signal(signal) + + def terminate(self): + self._transport.terminate() + + def kill(self): + self._transport.kill() + + @coroutine + def _feed_stdin(self, input): + debug = self._loop.get_debug() + self.stdin.write(input) + if debug: + logger.debug('%r communicate: feed stdin (%s bytes)', + self, len(input)) + try: + yield From(self.stdin.drain()) + except (BrokenPipeError, ConnectionResetError) as exc: + # communicate() ignores BrokenPipeError and ConnectionResetError + if debug: + logger.debug('%r communicate: stdin got %r', self, exc) + + if debug: + logger.debug('%r communicate: close stdin', self) + self.stdin.close() + + @coroutine + def _noop(self): + return None + + @coroutine + def _read_stream(self, fd): + transport = self._transport.get_pipe_transport(fd) + if fd == 2: + stream = self.stderr + else: + assert fd == 1 + stream = self.stdout + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: read %s', self, name) + output = yield From(stream.read()) + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: close %s', self, name) + transport.close() + raise Return(output) + + @coroutine + def communicate(self, input=None): + if input: + stdin = self._feed_stdin(input) + else: + stdin = self._noop() + if self.stdout is not None: + stdout = self._read_stream(1) + else: + stdout = self._noop() + if self.stderr is not None: + stderr = self._read_stream(2) + else: + stderr = self._noop() + stdin, stdout, stderr = yield From(tasks.gather(stdin, stdout, stderr, + loop=self._loop)) + yield From(self.wait()) + raise Return(stdout, stderr) + + +@coroutine +def create_subprocess_shell(cmd, **kwds): + stdin = kwds.pop('stdin', None) + stdout = kwds.pop('stdout', None) + stderr = kwds.pop('stderr', None) + loop = kwds.pop('loop', None) + limit = kwds.pop('limit', streams._DEFAULT_LIMIT) + if loop is None: + loop = events.get_event_loop() + protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, + loop=loop) + transport, protocol = yield From(loop.subprocess_shell( + protocol_factory, + cmd, stdin=stdin, stdout=stdout, + stderr=stderr, **kwds)) + raise Return(Process(transport, protocol, loop)) + +@coroutine +def create_subprocess_exec(program, *args, **kwds): + stdin = kwds.pop('stdin', None) + stdout = kwds.pop('stdout', None) + stderr = kwds.pop('stderr', None) + loop = kwds.pop('loop', None) + limit = kwds.pop('limit', streams._DEFAULT_LIMIT) + if loop is None: + loop = events.get_event_loop() + protocol_factory = lambda: SubprocessStreamProtocol(limit=limit, + loop=loop) + transport, protocol = yield From(loop.subprocess_exec( + protocol_factory, + program, *args, + stdin=stdin, stdout=stdout, + stderr=stderr, **kwds)) + raise Return(Process(transport, protocol, loop)) diff --git a/.local/lib/python2.7/site-packages/trollius/subprocess.pyc b/.local/lib/python2.7/site-packages/trollius/subprocess.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef2f8e756f408b30aec3ac74ffc91d72122fcbfb GIT binary patch literal 9222 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 lz{S!p;' % coro) + + if self._fut_waiter is not None: + info.insert(2, 'wait_for=%r' % self._fut_waiter) + return info + + def get_stack(self, limit=None): + """Return the list of stack frames for this task's coroutine. + + If the coroutine is not done, this returns the stack where it is + suspended. If the coroutine has completed successfully or was + cancelled, this returns an empty list. If the coroutine was + terminated by an exception, this returns the list of traceback + frames. + + The frames are always ordered from oldest to newest. + + The optional limit gives the maximum number of frames to + return; by default all available frames are returned. Its + meaning differs depending on whether a stack or a traceback is + returned: the newest frames of a stack are returned, but the + oldest frames of a traceback are returned. (This matches the + behavior of the traceback module.) + + For reasons beyond our control, only one stack frame is + returned for a suspended coroutine. + """ + frames = [] + try: + # 'async def' coroutines + f = self._coro.cr_frame + except AttributeError: + f = self._coro.gi_frame + if f is not None: + while f is not None: + if limit is not None: + if limit <= 0: + break + limit -= 1 + frames.append(f) + f = f.f_back + frames.reverse() + elif self._exception is not None: + tb = self._exception.__traceback__ + while tb is not None: + if limit is not None: + if limit <= 0: + break + limit -= 1 + frames.append(tb.tb_frame) + tb = tb.tb_next + return frames + + def print_stack(self, limit=None, file=None): + """Print the stack or traceback for this task's coroutine. + + This produces output similar to that of the traceback module, + for the frames retrieved by get_stack(). The limit argument + is passed to get_stack(). The file argument is an I/O stream + to which the output is written; by default output is written + to sys.stderr. + """ + extracted_list = [] + checked = set() + for f in self.get_stack(limit=limit): + lineno = f.f_lineno + co = f.f_code + filename = co.co_filename + name = co.co_name + if filename not in checked: + checked.add(filename) + linecache.checkcache(filename) + line = linecache.getline(filename, lineno, f.f_globals) + extracted_list.append((filename, lineno, name, line)) + exc = self._exception + if not extracted_list: + print('No stack for %r' % self, file=file) + elif exc is not None: + print('Traceback for %r (most recent call last):' % self, + file=file) + else: + print('Stack for %r (most recent call last):' % self, + file=file) + traceback.print_list(extracted_list, file=file) + if exc is not None: + for line in traceback.format_exception_only(exc.__class__, exc): + print(line, file=file, end='') + + def cancel(self): + """Request that this task cancel itself. + + This arranges for a CancelledError to be thrown into the + wrapped coroutine on the next cycle through the event loop. + The coroutine then has a chance to clean up or even deny + the request using try/except/finally. + + Unlike Future.cancel, this does not guarantee that the + task will be cancelled: the exception might be caught and + acted upon, delaying cancellation of the task or preventing + cancellation completely. The task may also return a value or + raise a different exception. + + Immediately after this method is called, Task.cancelled() will + not return True (unless the task was already cancelled). A + task will be marked as cancelled when the wrapped coroutine + terminates with a CancelledError exception (even if cancel() + was not called). + """ + if self.done(): + return False + if self._fut_waiter is not None: + if self._fut_waiter.cancel(): + # Leave self._fut_waiter; it may be a Task that + # catches and ignores the cancellation so we may have + # to cancel it again later. + return True + # It must be the case that self._step is already scheduled. + self._must_cancel = True + return True + + def _step(self, value=None, exc=None, exc_tb=None): + assert not self.done(), \ + '_step(): already done: {0!r}, {1!r}, {2!r}'.format(self, value, exc) + + if self._must_cancel: + if not isinstance(exc, futures.CancelledError): + exc = futures.CancelledError() + self._must_cancel = False + coro = self._coro + self._fut_waiter = None + + if exc_tb is not None: + init_exc = exc + else: + init_exc = None + self.__class__._current_tasks[self._loop] = self + # Call either coro.throw(exc) or coro.send(value). + try: + if exc is not None: + if exc_tb is not None: + result = coro.throw(exc, None, exc_tb) + else: + result = coro.throw(exc) + else: + result = coro.send(value) + # On Python 3.3 and Python 3.4, ReturnException is not used in + # practice. But this except is kept to have a single code base + # for all Python versions. + except coroutines.ReturnException as exc: + if isinstance(exc, ReturnException): + exc.raised = True + result = exc.value + else: + result = None + self.set_result(result) + except StopIteration as exc: + if compat.PY33: + # asyncio Task object? get the result of the coroutine + result = exc.value + else: + if isinstance(exc, ReturnException): + exc.raised = True + result = exc.value + else: + result = None + self.set_result(result) + except futures.CancelledError as exc: + super(Task, self).cancel() # I.e., Future.cancel(self). + except BaseException as exc: + if exc is init_exc: + self._set_exception_with_tb(exc, exc_tb) + exc_tb = None + else: + self.set_exception(exc) + + if not isinstance(exc, Exception): + # reraise BaseException + raise + else: + if coroutines._DEBUG: + if not coroutines._coroutine_at_yield_from(self._coro): + # trollius coroutine must "yield From(...)" + if not isinstance(result, coroutines.FromWrapper): + self._loop.call_soon( + self._step, None, + RuntimeError("yield used without From")) + return + result = result.obj + else: + # asyncio coroutine using "yield from ..." + if isinstance(result, coroutines.FromWrapper): + result = result.obj + elif isinstance(result, coroutines.FromWrapper): + result = result.obj + + if coroutines.iscoroutine(result): + # "yield coroutine" creates a task, the current task + # will wait until the new task is done + result = self._loop.create_task(result) + # FIXME: faster check. common base class? hasattr? + elif isinstance(result, (Lock, Condition, Semaphore)): + coro = _lock_coroutine(result) + result = self._loop.create_task(coro) + + if isinstance(result, futures._FUTURE_CLASSES): + # Yielded Future must come from Future.__iter__(). + result.add_done_callback(self._wakeup) + self._fut_waiter = result + if self._must_cancel: + if self._fut_waiter.cancel(): + self._must_cancel = False + elif result is None: + # Bare yield relinquishes control for one event loop iteration. + self._loop.call_soon(self._step) + else: + # Yielding something else is an error. + self._loop.call_soon( + self._step, None, + RuntimeError( + 'Task got bad yield: {0!r}'.format(result))) + finally: + self.__class__._current_tasks.pop(self._loop) + self = None # Needed to break cycles when an exception occurs. + + def _wakeup(self, future): + if (future._state == futures._FINISHED + and future._exception is not None): + # Get the traceback before calling exception(), because calling + # the exception() method clears the traceback + exc_tb = future._get_exception_tb() + exc = future.exception() + self._step(None, exc, exc_tb) + exc_tb = None + else: + try: + value = future.result() + except Exception as exc: + # This may also be a cancellation. + self._step(None, exc) + else: + self._step(value, None) + self = None # Needed to break cycles when an exception occurs. + + +# wait() and as_completed() similar to those in PEP 3148. + +# Export symbols in trollius.tasks for compatibility with asyncio +FIRST_COMPLETED = executor.FIRST_COMPLETED +FIRST_EXCEPTION = executor.FIRST_EXCEPTION +ALL_COMPLETED = executor.ALL_COMPLETED + + +@coroutine +def wait(fs, loop=None, timeout=None, return_when=ALL_COMPLETED): + """Wait for the Futures and coroutines given by fs to complete. + + The sequence futures must not be empty. + + Coroutines will be wrapped in Tasks. + + Returns two sets of Future: (done, pending). + + Usage: + + done, pending = yield From(asyncio.wait(fs)) + + Note: This does not raise TimeoutError! Futures that aren't done + when the timeout occurs are returned in the second set. + """ + if isinstance(fs, futures._FUTURE_CLASSES) or coroutines.iscoroutine(fs): + raise TypeError("expect a list of futures, not %s" % type(fs).__name__) + if not fs: + raise ValueError('Set of coroutines/Futures is empty.') + if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): + raise ValueError('Invalid return_when value: {0}'.format(return_when)) + + if loop is None: + loop = events.get_event_loop() + + fs = set(ensure_future(f, loop=loop) for f in set(fs)) + + result = yield From(_wait(fs, timeout, return_when, loop)) + raise Return(result) + + +def _release_waiter(waiter, *args): + if not waiter.done(): + waiter.set_result(None) + + +@coroutine +def wait_for(fut, timeout, loop=None): + """Wait for the single Future or coroutine to complete, with timeout. + + Coroutine will be wrapped in Task. + + Returns result of the Future or coroutine. When a timeout occurs, + it cancels the task and raises TimeoutError. To avoid the task + cancellation, wrap it in shield(). + + If the wait is cancelled, the task is also cancelled. + + This function is a coroutine. + """ + if loop is None: + loop = events.get_event_loop() + + if timeout is None: + result = yield From(fut) + raise Return(result) + + waiter = futures.Future(loop=loop) + timeout_handle = loop.call_later(timeout, _release_waiter, waiter) + cb = functools.partial(_release_waiter, waiter) + + fut = ensure_future(fut, loop=loop) + fut.add_done_callback(cb) + + try: + # wait until the future completes or the timeout + try: + yield From(waiter) + except futures.CancelledError: + fut.remove_done_callback(cb) + fut.cancel() + raise + + if fut.done(): + raise Return(fut.result()) + else: + fut.remove_done_callback(cb) + fut.cancel() + raise futures.TimeoutError() + finally: + timeout_handle.cancel() + + +@coroutine +def _wait(fs, timeout, return_when, loop): + """Internal helper for wait() and _wait_for(). + + The fs argument must be a collection of Futures. + """ + assert fs, 'Set of Futures is empty.' + waiter = futures.Future(loop=loop) + timeout_handle = None + if timeout is not None: + timeout_handle = loop.call_later(timeout, _release_waiter, waiter) + non_local = {'counter': len(fs)} + + def _on_completion(f): + non_local['counter'] -= 1 + if (non_local['counter'] <= 0 or + return_when == FIRST_COMPLETED or + return_when == FIRST_EXCEPTION and (not f.cancelled() and + f.exception() is not None)): + if timeout_handle is not None: + timeout_handle.cancel() + if not waiter.done(): + waiter.set_result(None) + + for f in fs: + f.add_done_callback(_on_completion) + + try: + yield From(waiter) + finally: + if timeout_handle is not None: + timeout_handle.cancel() + + done, pending = set(), set() + for f in fs: + f.remove_done_callback(_on_completion) + if f.done(): + done.add(f) + else: + pending.add(f) + raise Return(done, pending) + + +# This is *not* a @coroutine! It is just an iterator (yielding Futures). +def as_completed(fs, loop=None, timeout=None): + """Return an iterator whose values are coroutines. + + When waiting for the yielded coroutines you'll get the results (or + exceptions!) of the original Futures (or coroutines), in the order + in which and as soon as they complete. + + This differs from PEP 3148; the proper way to use this is: + + for f in as_completed(fs): + result = yield From(f) # The 'yield' may raise. + # Use result. + + If a timeout is specified, the 'yield' will raise + TimeoutError when the timeout occurs before all Futures are done. + + Note: The futures 'f' are not necessarily members of fs. + """ + if isinstance(fs, futures._FUTURE_CLASSES) or coroutines.iscoroutine(fs): + raise TypeError("expect a list of futures, not %s" % type(fs).__name__) + loop = loop if loop is not None else events.get_event_loop() + todo = set(ensure_future(f, loop=loop) for f in set(fs)) + from .queues import Queue # Import here to avoid circular import problem. + done = Queue(loop=loop) + timeout_handle = None + + def _on_timeout(): + for f in todo: + f.remove_done_callback(_on_completion) + done.put_nowait(None) # Queue a dummy value for _wait_for_one(). + todo.clear() # Can't do todo.remove(f) in the loop. + + def _on_completion(f): + if not todo: + return # _on_timeout() was here first. + todo.remove(f) + done.put_nowait(f) + if not todo and timeout_handle is not None: + timeout_handle.cancel() + + @coroutine + def _wait_for_one(): + f = yield From(done.get()) + if f is None: + # Dummy value from _on_timeout(). + raise futures.TimeoutError + raise Return(f.result()) # May raise f.exception(). + + for f in todo: + f.add_done_callback(_on_completion) + if todo and timeout is not None: + timeout_handle = loop.call_later(timeout, _on_timeout) + for _ in range(len(todo)): + yield _wait_for_one() + + +@coroutine +def sleep(delay, result=None, loop=None): + """Coroutine that completes after a given time (in seconds).""" + future = futures.Future(loop=loop) + h = future._loop.call_later(delay, + future._set_result_unless_cancelled, result) + try: + result = yield From(future) + raise Return(result) + finally: + h.cancel() + + +def async(coro_or_future, loop=None): + """Wrap a coroutine in a future. + + If the argument is a Future, it is returned directly. + + This function is deprecated in 3.5. Use asyncio.ensure_future() instead. + """ + + warnings.warn("asyncio.async() function is deprecated, use ensure_future()", + DeprecationWarning) + + return ensure_future(coro_or_future, loop=loop) + + +def ensure_future(coro_or_future, loop=None): + """Wrap a coroutine in a future. + + If the argument is a Future, it is returned directly. + """ + # FIXME: only check if coroutines._DEBUG is True? + if isinstance(coro_or_future, coroutines.FromWrapper): + coro_or_future = coro_or_future.obj + if isinstance(coro_or_future, futures._FUTURE_CLASSES): + if loop is not None and loop is not coro_or_future._loop: + raise ValueError('loop argument must agree with Future') + return coro_or_future + elif coroutines.iscoroutine(coro_or_future): + if loop is None: + loop = events.get_event_loop() + task = loop.create_task(coro_or_future) + if task._source_traceback: + del task._source_traceback[-1] + return task + else: + raise TypeError('A Future or coroutine is required') + + +class _GatheringFuture(futures.Future): + """Helper for gather(). + + This overrides cancel() to cancel all the children and act more + like Task.cancel(), which doesn't immediately mark itself as + cancelled. + """ + + def __init__(self, children, loop=None): + super(_GatheringFuture, self).__init__(loop=loop) + self._children = children + + def cancel(self): + if self.done(): + return False + for child in self._children: + child.cancel() + return True + + +def gather(*coros_or_futures, **kw): + """Return a future aggregating results from the given coroutines + or futures. + + All futures must share the same event loop. If all the tasks are + done successfully, the returned future's result is the list of + results (in the order of the original sequence, not necessarily + the order of results arrival). If *return_exceptions* is True, + exceptions in the tasks are treated the same as successful + results, and gathered in the result list; otherwise, the first + raised exception will be immediately propagated to the returned + future. + + Cancellation: if the outer Future is cancelled, all children (that + have not completed yet) are also cancelled. If any child is + cancelled, this is treated as if it raised CancelledError -- + the outer Future is *not* cancelled in this case. (This is to + prevent the cancellation of one child to cause other children to + be cancelled.) + """ + loop = kw.pop('loop', None) + return_exceptions = kw.pop('return_exceptions', False) + if kw: + raise TypeError("unexpected keyword") + + if not coros_or_futures: + outer = futures.Future(loop=loop) + outer.set_result([]) + return outer + + arg_to_fut = {} + for arg in set(coros_or_futures): + if not isinstance(arg, futures._FUTURE_CLASSES): + fut = ensure_future(arg, loop=loop) + if loop is None: + loop = fut._loop + # The caller cannot control this future, the "destroy pending task" + # warning should not be emitted. + fut._log_destroy_pending = False + else: + fut = arg + if loop is None: + loop = fut._loop + elif fut._loop is not loop: + raise ValueError("futures are tied to different event loops") + arg_to_fut[arg] = fut + + children = [arg_to_fut[arg] for arg in coros_or_futures] + nchildren = len(children) + outer = _GatheringFuture(children, loop=loop) + non_local = {'nfinished': 0} + results = [None] * nchildren + + def _done_callback(i, fut): + if outer.done(): + if not fut.cancelled(): + # Mark exception retrieved. + fut.exception() + return + + if fut.cancelled(): + res = futures.CancelledError() + if not return_exceptions: + outer.set_exception(res) + return + elif fut._exception is not None: + res = fut.exception() # Mark exception retrieved. + if not return_exceptions: + outer.set_exception(res) + return + else: + res = fut._result + results[i] = res + non_local['nfinished'] += 1 + if non_local['nfinished'] == nchildren: + outer.set_result(results) + + for i, fut in enumerate(children): + fut.add_done_callback(functools.partial(_done_callback, i)) + return outer + + +def shield(arg, loop=None): + """Wait for a future, shielding it from cancellation. + + The statement + + res = yield From(shield(something())) + + is exactly equivalent to the statement + + res = yield From(something()) + + *except* that if the coroutine containing it is cancelled, the + task running in something() is not cancelled. From the POV of + something(), the cancellation did not happen. But its caller is + still cancelled, so the yield-from expression still raises + CancelledError. Note: If something() is cancelled by other means + this will still cancel shield(). + + If you want to completely ignore cancellation (not recommended) + you can combine shield() with a try/except clause, as follows: + + try: + res = yield From(shield(something())) + except CancelledError: + res = None + """ + inner = ensure_future(arg, loop=loop) + if inner.done(): + # Shortcut. + return inner + loop = inner._loop + outer = futures.Future(loop=loop) + + def _done_callback(inner): + if outer.cancelled(): + if not inner.cancelled(): + # Mark inner's result as retrieved. + inner.exception() + return + + if inner.cancelled(): + outer.cancel() + else: + exc = inner.exception() + if exc is not None: + outer.set_exception(exc) + else: + outer.set_result(inner.result()) + + inner.add_done_callback(_done_callback) + return outer diff --git a/.local/lib/python2.7/site-packages/trollius/tasks.pyc b/.local/lib/python2.7/site-packages/trollius/tasks.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03551475b9fa6d71a6e8360965104ab4b0446760 GIT binary patch literal 23775 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/test_support.py b/.local/lib/python2.7/site-packages/trollius/test_support.py new file mode 100644 index 00000000..b40576a4 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/test_support.py @@ -0,0 +1,309 @@ +# Subset of test.support from CPython 3.5, just what we need to run asyncio +# test suite. The code is copied from CPython 3.5 to not depend on the test +# module because it is rarely installed. + +# Ignore symbol TEST_HOME_DIR: test_events works without it + +from __future__ import absolute_import +import functools +import gc +import os +import platform +import re +import socket +import subprocess +import sys +import time + +from trollius import test_utils + +# A constant likely larger than the underlying OS pipe buffer size, to +# make writes blocking. +# Windows limit seems to be around 512 B, and many Unix kernels have a +# 64 KiB pipe buffer size or 16 * PAGE_SIZE: take a few megs to be sure. +# (see issue #17835 for a discussion of this number). +PIPE_MAX_SIZE = 4 * 1024 * 1024 + 1 + +def strip_python_stderr(stderr): + """Strip the stderr of a Python process from potential debug output + emitted by the interpreter. + + This will typically be run on the result of the communicate() method + of a subprocess.Popen object. + """ + stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip() + return stderr + + +# Executing the interpreter in a subprocess +def _assert_python(expected_success, *args, **env_vars): + if '__isolated' in env_vars: + isolated = env_vars.pop('__isolated') + else: + isolated = not env_vars + cmd_line = [sys.executable] + if sys.version_info >= (3, 3): + cmd_line.extend(('-X', 'faulthandler')) + if isolated and sys.version_info >= (3, 4): + # isolated mode: ignore Python environment variables, ignore user + # site-packages, and don't add the current directory to sys.path + cmd_line.append('-I') + elif not env_vars: + # ignore Python environment variables + cmd_line.append('-E') + # Need to preserve the original environment, for in-place testing of + # shared library builds. + env = os.environ.copy() + # But a special flag that can be set to override -- in this case, the + # caller is responsible to pass the full environment. + if env_vars.pop('__cleanenv', None): + env = {} + env.update(env_vars) + cmd_line.extend(args) + p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + env=env) + try: + out, err = p.communicate() + finally: + subprocess._cleanup() + p.stdout.close() + p.stderr.close() + rc = p.returncode + err = strip_python_stderr(err) + if (rc and expected_success) or (not rc and not expected_success): + raise AssertionError( + "Process return code is %d, " + "stderr follows:\n%s" % (rc, err.decode('ascii', 'ignore'))) + return rc, out, err + + +def assert_python_ok(*args, **env_vars): + """ + Assert that running the interpreter with `args` and optional environment + variables `env_vars` succeeds (rc == 0) and return a (return code, stdout, + stderr) tuple. + + If the __cleanenv keyword is set, env_vars is used a fresh environment. + + Python is started in isolated mode (command line option -I), + except if the __isolated keyword is set to False. + """ + return _assert_python(True, *args, **env_vars) + + +is_jython = sys.platform.startswith('java') + +def gc_collect(): + """Force as many objects as possible to be collected. + + In non-CPython implementations of Python, this is needed because timely + deallocation is not guaranteed by the garbage collector. (Even in CPython + this can be the case in case of reference cycles.) This means that __del__ + methods may be called later than expected and weakrefs may remain alive for + longer than expected. This function tries its best to force all garbage + objects to disappear. + """ + gc.collect() + if is_jython: + time.sleep(0.1) + gc.collect() + gc.collect() + + +HOST = "127.0.0.1" +HOSTv6 = "::1" + + +def _is_ipv6_enabled(): + """Check whether IPv6 is enabled on this host.""" + if socket.has_ipv6: + sock = None + try: + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.bind((HOSTv6, 0)) + return True + except OSError: + pass + finally: + if sock: + sock.close() + return False + +IPV6_ENABLED = _is_ipv6_enabled() + + +def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): + """Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to + the specified host address (defaults to 0.0.0.0) with the port set to 0, + eliciting an unused ephemeral port from the OS. The temporary socket is + then closed and deleted, and the ephemeral port is returned. + + Either this method or bind_port() should be used for any tests where a + server socket needs to be bound to a particular port for the duration of + the test. Which one to use depends on whether the calling code is creating + a python socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the -accept argument to openssl's + s_server mode). Always prefer bind_port() over find_unused_port() where + possible. Hard coded ports should *NEVER* be used. As soon as a server + socket is bound to a hard coded port, the ability to run multiple instances + of the test simultaneously on the same host is compromised, which makes the + test a ticking time bomb in a buildbot environment. On Unix buildbots, this + may simply manifest as a failed test, which can be recovered from without + intervention in most cases, but on Windows, the entire python process can + completely and utterly wedge, requiring someone to log in to the buildbot + and manually kill the affected process. + + (This is easy to reproduce on Windows, unfortunately, and can be traced to + the SO_REUSEADDR socket option having different semantics on Windows versus + Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, + listen and then accept connections on identical host/ports. An EADDRINUSE + OSError will be raised at some point (depending on the platform and + the order bind and listen were called on each socket). + + However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE + will ever be raised when attempting to bind two identical host/ports. When + accept() is called on each socket, the second caller's process will steal + the port from the first caller, leaving them both in an awkwardly wedged + state where they'll no longer respond to any signals or graceful kills, and + must be forcibly killed via OpenProcess()/TerminateProcess(). + + The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option + instead of SO_REUSEADDR, which effectively affords the same semantics as + SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open + Source world compared to Windows ones, this is a common mistake. A quick + look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when + openssl.exe is called with the 's_server' option, for example. See + http://bugs.python.org/issue2550 for more info. The following site also + has a very thorough description about the implications of both REUSEADDR + and EXCLUSIVEADDRUSE on Windows: + http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) + + XXX: although this approach is a vast improvement on previous attempts to + elicit unused ports, it rests heavily on the assumption that the ephemeral + port returned to us by the OS won't immediately be dished back out to some + other process when we close and delete our temporary socket but before our + calling code has a chance to bind the returned port. We can deal with this + issue if/when we come across it. + """ + + tempsock = socket.socket(family, socktype) + port = bind_port(tempsock) + tempsock.close() + del tempsock + return port + +def bind_port(sock, host=HOST): + """Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the sock.family + is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR + or SO_REUSEPORT set on it. Tests should *never* set these socket options + for TCP/IP sockets. The only case for setting these options is testing + multicasting via multiple UDP sockets. + + Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. + on Windows), it will be set on the socket. This will prevent anyone else + from bind()'ing to our host/port for the duration of the test. + """ + + if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: + if hasattr(socket, 'SO_REUSEADDR'): + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: + raise TestFailed("tests should never set the SO_REUSEADDR " + "socket option on TCP/IP sockets!") + if hasattr(socket, 'SO_REUSEPORT'): + try: + reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) + if reuse == 1: + raise TestFailed("tests should never set the SO_REUSEPORT " + "socket option on TCP/IP sockets!") + except OSError: + # Python's socket module was compiled using modern headers + # thus defining SO_REUSEPORT but this process is running + # under an older kernel that does not support SO_REUSEPORT. + pass + if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + + sock.bind((host, 0)) + port = sock.getsockname()[1] + return port + +def requires_mac_ver(*min_version): + """Decorator raising SkipTest if the OS is Mac OS X and the OS X + version if less than min_version. + + For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version + is lesser than 10.5. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + if sys.platform == 'darwin': + version_txt = platform.mac_ver()[0] + try: + version = tuple(map(int, version_txt.split('.'))) + except ValueError: + pass + else: + if version < min_version: + min_version_txt = '.'.join(map(str, min_version)) + raise test_utils.SkipTest( + "Mac OS X %s or higher required, not %s" + % (min_version_txt, version_txt)) + return func(*args, **kw) + wrapper.min_version = min_version + return wrapper + return decorator + +def _requires_unix_version(sysname, min_version): + """Decorator raising SkipTest if the OS is `sysname` and the version is + less than `min_version`. + + For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if + the FreeBSD version is less than 7.2. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + if platform.system() == sysname: + version_txt = platform.release().split('-', 1)[0] + try: + version = tuple(map(int, version_txt.split('.'))) + except ValueError: + pass + else: + if version < min_version: + min_version_txt = '.'.join(map(str, min_version)) + raise test_utils.SkipTest( + "%s version %s or higher required, not %s" + % (sysname, min_version_txt, version_txt)) + return func(*args, **kw) + wrapper.min_version = min_version + return wrapper + return decorator + +def requires_freebsd_version(*min_version): + """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version + is less than `min_version`. + + For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD + version is less than 7.2. + """ + return _requires_unix_version('FreeBSD', min_version) + +# Use test.support if available +try: + from test.support import * +except ImportError: + pass + +# Use test.script_helper if available +try: + from test.script_helper import assert_python_ok +except ImportError: + pass diff --git a/.local/lib/python2.7/site-packages/trollius/test_support.pyc b/.local/lib/python2.7/site-packages/trollius/test_support.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45a9bc498451c36ac73f1a312206d5a4fd23d0d6 GIT binary patch literal 12909 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 E0aL!hP5=M^ literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/test_utils.py b/.local/lib/python2.7/site-packages/trollius/test_utils.py new file mode 100644 index 00000000..ebebb25c --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/test_utils.py @@ -0,0 +1,563 @@ +"""Utilities shared by tests.""" + +import collections +import contextlib +import io +import logging +import os +import re +import socket +import sys +import tempfile +import threading +import time + +from wsgiref.simple_server import WSGIRequestHandler, WSGIServer + +import six + +try: + import socketserver + from http.server import HTTPServer +except ImportError: + # Python 2 + import SocketServer as socketserver + from BaseHTTPServer import HTTPServer + +try: + from unittest import mock +except ImportError: + # Python < 3.3 + import mock + +try: + import ssl + from .py3_ssl import SSLContext, wrap_socket +except ImportError: # pragma: no cover + # SSL support disabled in Python + ssl = None + +from . import base_events +from . import compat +from . import events +from . import futures +from . import selectors +from . import tasks +from .coroutines import coroutine +from .log import logger + + +if sys.platform == 'win32': # pragma: no cover + from .windows_utils import socketpair +else: + from socket import socketpair # pragma: no cover + +try: + # Prefer unittest2 if available (on Python 2) + import unittest2 as unittest +except ImportError: + import unittest + +skipIf = unittest.skipIf +skipUnless = unittest.skipUnless +SkipTest = unittest.SkipTest + + +if not hasattr(unittest.TestCase, 'assertRaisesRegex'): + class _BaseTestCaseContext: + + def __init__(self, test_case): + self.test_case = test_case + + def _raiseFailure(self, standardMsg): + msg = self.test_case._formatMessage(self.msg, standardMsg) + raise self.test_case.failureException(msg) + + + class _AssertRaisesBaseContext(_BaseTestCaseContext): + + def __init__(self, expected, test_case, callable_obj=None, + expected_regex=None): + _BaseTestCaseContext.__init__(self, test_case) + self.expected = expected + self.test_case = test_case + if callable_obj is not None: + try: + self.obj_name = callable_obj.__name__ + except AttributeError: + self.obj_name = str(callable_obj) + else: + self.obj_name = None + if isinstance(expected_regex, (bytes, str)): + expected_regex = re.compile(expected_regex) + self.expected_regex = expected_regex + self.msg = None + + def handle(self, name, callable_obj, args, kwargs): + """ + If callable_obj is None, assertRaises/Warns is being used as a + context manager, so check for a 'msg' kwarg and return self. + If callable_obj is not None, call it passing args and kwargs. + """ + if callable_obj is None: + self.msg = kwargs.pop('msg', None) + return self + with self: + callable_obj(*args, **kwargs) + + + class _AssertRaisesContext(_AssertRaisesBaseContext): + """A context manager used to implement TestCase.assertRaises* methods.""" + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_type is None: + try: + exc_name = self.expected.__name__ + except AttributeError: + exc_name = str(self.expected) + if self.obj_name: + self._raiseFailure("{0} not raised by {1}".format(exc_name, + self.obj_name)) + else: + self._raiseFailure("{0} not raised".format(exc_name)) + if not issubclass(exc_type, self.expected): + # let unexpected exceptions pass through + return False + self.exception = exc_value + if self.expected_regex is None: + return True + + expected_regex = self.expected_regex + if not expected_regex.search(str(exc_value)): + self._raiseFailure('"{0}" does not match "{1}"'.format( + expected_regex.pattern, str(exc_value))) + return True + + +def dummy_ssl_context(): + if ssl is None: + return None + else: + return SSLContext(ssl.PROTOCOL_SSLv23) + + +def run_briefly(loop, steps=1): + @coroutine + def once(): + pass + for step in range(steps): + gen = once() + t = loop.create_task(gen) + # Don't log a warning if the task is not done after run_until_complete(). + # It occurs if the loop is stopped or if a task raises a BaseException. + t._log_destroy_pending = False + try: + loop.run_until_complete(t) + finally: + gen.close() + + +def run_until(loop, pred, timeout=30): + deadline = time.time() + timeout + while not pred(): + if timeout is not None: + timeout = deadline - time.time() + if timeout <= 0: + raise futures.TimeoutError() + loop.run_until_complete(tasks.sleep(0.001, loop=loop)) + + +def run_once(loop): + """loop.stop() schedules _raise_stop_error() + and run_forever() runs until _raise_stop_error() callback. + this wont work if test waits for some IO events, because + _raise_stop_error() runs before any of io events callbacks. + """ + loop.stop() + loop.run_forever() + + +class SilentWSGIRequestHandler(WSGIRequestHandler): + + def get_stderr(self): + return io.StringIO() + + def log_message(self, format, *args): + pass + + +class SilentWSGIServer(WSGIServer, object): + + request_timeout = 2 + + def get_request(self): + request, client_addr = super(SilentWSGIServer, self).get_request() + request.settimeout(self.request_timeout) + return request, client_addr + + def handle_error(self, request, client_address): + pass + + +class SSLWSGIServerMixin: + + def finish_request(self, request, client_address): + # The relative location of our test directory (which + # contains the ssl key and certificate files) differs + # between the stdlib and stand-alone asyncio. + # Prefer our own if we can find it. + here = os.path.join(os.path.dirname(__file__), '..', 'tests') + if not os.path.isdir(here): + here = os.path.join(os.path.dirname(os.__file__), + 'test', 'test_asyncio') + keyfile = os.path.join(here, 'ssl_key.pem') + certfile = os.path.join(here, 'ssl_cert.pem') + ssock = wrap_socket(request, + keyfile=keyfile, + certfile=certfile, + server_side=True) + try: + self.RequestHandlerClass(ssock, client_address, self) + ssock.close() + except OSError: + # maybe socket has been closed by peer + pass + + +class SSLWSGIServer(SSLWSGIServerMixin, SilentWSGIServer): + pass + + +def _run_test_server(address, use_ssl, server_cls, server_ssl_cls): + + def app(environ, start_response): + status = '200 OK' + headers = [('Content-type', 'text/plain')] + start_response(status, headers) + return [b'Test message'] + + # Run the test WSGI server in a separate thread in order not to + # interfere with event handling in the main thread + server_class = server_ssl_cls if use_ssl else server_cls + httpd = server_class(address, SilentWSGIRequestHandler) + httpd.set_app(app) + httpd.address = httpd.server_address + server_thread = threading.Thread( + target=lambda: httpd.serve_forever(poll_interval=0.05)) + server_thread.start() + try: + yield httpd + finally: + httpd.shutdown() + httpd.server_close() + server_thread.join() + + +if hasattr(socket, 'AF_UNIX'): + + class UnixHTTPServer(socketserver.UnixStreamServer, HTTPServer, object): + + def server_bind(self): + socketserver.UnixStreamServer.server_bind(self) + self.server_name = '127.0.0.1' + self.server_port = 80 + + + class UnixWSGIServer(UnixHTTPServer, WSGIServer, object): + + request_timeout = 2 + + def server_bind(self): + UnixHTTPServer.server_bind(self) + self.setup_environ() + + def get_request(self): + request, client_addr = super(UnixWSGIServer, self).get_request() + request.settimeout(self.request_timeout) + # Code in the stdlib expects that get_request + # will return a socket and a tuple (host, port). + # However, this isn't true for UNIX sockets, + # as the second return value will be a path; + # hence we return some fake data sufficient + # to get the tests going + return request, ('127.0.0.1', '') + + + class SilentUnixWSGIServer(UnixWSGIServer): + + def handle_error(self, request, client_address): + pass + + + class UnixSSLWSGIServer(SSLWSGIServerMixin, SilentUnixWSGIServer): + pass + + + def gen_unix_socket_path(): + with tempfile.NamedTemporaryFile() as file: + return file.name + + + @contextlib.contextmanager + def unix_socket_path(): + path = gen_unix_socket_path() + try: + yield path + finally: + try: + os.unlink(path) + except OSError: + pass + + + @contextlib.contextmanager + def run_test_unix_server(use_ssl=False): + with unix_socket_path() as path: + for item in _run_test_server(address=path, use_ssl=use_ssl, + server_cls=SilentUnixWSGIServer, + server_ssl_cls=UnixSSLWSGIServer): + yield item + + +@contextlib.contextmanager +def run_test_server(host='127.0.0.1', port=0, use_ssl=False): + for item in _run_test_server(address=(host, port), use_ssl=use_ssl, + server_cls=SilentWSGIServer, + server_ssl_cls=SSLWSGIServer): + yield item + + +def make_test_protocol(base): + dct = {} + for name in dir(base): + if name.startswith('__') and name.endswith('__'): + # skip magic names + continue + dct[name] = MockCallback(return_value=None) + return type('TestProtocol', (base,) + base.__bases__, dct)() + + +class TestSelector(selectors.BaseSelector): + + def __init__(self): + self.keys = {} + + def register(self, fileobj, events, data=None): + key = selectors.SelectorKey(fileobj, 0, events, data) + self.keys[fileobj] = key + return key + + def unregister(self, fileobj): + return self.keys.pop(fileobj) + + def select(self, timeout): + return [] + + def get_map(self): + return self.keys + + +class TestLoop(base_events.BaseEventLoop): + """Loop for unittests. + + It manages self time directly. + If something scheduled to be executed later then + on next loop iteration after all ready handlers done + generator passed to __init__ is calling. + + Generator should be like this: + + def gen(): + ... + when = yield ... + ... = yield time_advance + + Value returned by yield is absolute time of next scheduled handler. + Value passed to yield is time advance to move loop's time forward. + """ + + def __init__(self, gen=None): + super(TestLoop, self).__init__() + + if gen is None: + def gen(): + yield + self._check_on_close = False + else: + self._check_on_close = True + + self._gen = gen() + next(self._gen) + self._time = 0 + self._clock_resolution = 1e-9 + self._timers = [] + self._selector = TestSelector() + + self.readers = {} + self.writers = {} + self.reset_counters() + + def time(self): + return self._time + + def advance_time(self, advance): + """Move test time forward.""" + if advance: + self._time += advance + + def close(self): + super(TestLoop, self).close() + if self._check_on_close: + try: + self._gen.send(0) + except StopIteration: + pass + else: # pragma: no cover + raise AssertionError("Time generator is not finished") + + def add_reader(self, fd, callback, *args): + self.readers[fd] = events.Handle(callback, args, self) + + def remove_reader(self, fd): + self.remove_reader_count[fd] += 1 + if fd in self.readers: + del self.readers[fd] + return True + else: + return False + + def assert_reader(self, fd, callback, *args): + assert fd in self.readers, 'fd {0} is not registered'.format(fd) + handle = self.readers[fd] + assert handle._callback == callback, '{0!r} != {1!r}'.format( + handle._callback, callback) + assert handle._args == args, '{0!r} != {1!r}'.format( + handle._args, args) + + def add_writer(self, fd, callback, *args): + self.writers[fd] = events.Handle(callback, args, self) + + def remove_writer(self, fd): + self.remove_writer_count[fd] += 1 + if fd in self.writers: + del self.writers[fd] + return True + else: + return False + + def assert_writer(self, fd, callback, *args): + assert fd in self.writers, 'fd {0} is not registered'.format(fd) + handle = self.writers[fd] + assert handle._callback == callback, '{0!r} != {1!r}'.format( + handle._callback, callback) + assert handle._args == args, '{0!r} != {1!r}'.format( + handle._args, args) + + def reset_counters(self): + self.remove_reader_count = collections.defaultdict(int) + self.remove_writer_count = collections.defaultdict(int) + + def _run_once(self): + super(TestLoop, self)._run_once() + for when in self._timers: + advance = self._gen.send(when) + self.advance_time(advance) + self._timers = [] + + def call_at(self, when, callback, *args): + self._timers.append(when) + return super(TestLoop, self).call_at(when, callback, *args) + + def _process_events(self, event_list): + return + + def _write_to_self(self): + pass + + +def MockCallback(**kwargs): + return mock.Mock(spec=['__call__'], **kwargs) + + +class MockPattern(str): + """A regex based str with a fuzzy __eq__. + + Use this helper with 'mock.assert_called_with', or anywhere + where a regex comparison between strings is needed. + + For instance: + mock_call.assert_called_with(MockPattern('spam.*ham')) + """ + def __eq__(self, other): + return bool(re.search(str(self), other, re.S)) + + +def get_function_source(func): + source = events._get_function_source(func) + if source is None: + raise ValueError("unable to get the source of %r" % (func,)) + return source + + +class TestCase(unittest.TestCase): + def set_event_loop(self, loop, cleanup=True): + assert loop is not None + # ensure that the event loop is passed explicitly in asyncio + events.set_event_loop(None) + if cleanup: + self.addCleanup(loop.close) + + def new_test_loop(self, gen=None): + loop = TestLoop(gen) + self.set_event_loop(loop) + return loop + + def tearDown(self): + events.set_event_loop(None) + + # Detect CPython bug #23353: ensure that yield/yield-from is not used + # in an except block of a generator + if sys.exc_info()[0] == SkipTest: + if six.PY2: + sys.exc_clear() + else: + pass #self.assertEqual(sys.exc_info(), (None, None, None)) + + def check_soure_traceback(self, source_traceback, lineno_delta): + frame = sys._getframe(1) + filename = frame.f_code.co_filename + lineno = frame.f_lineno + lineno_delta + name = frame.f_code.co_name + self.assertIsInstance(source_traceback, list) + self.assertEqual(source_traceback[-1][:3], + (filename, + lineno, + name)) + + +@contextlib.contextmanager +def disable_logger(): + """Context manager to disable asyncio logger. + + For example, it can be used to ignore warnings in debug mode. + """ + old_level = logger.level + try: + logger.setLevel(logging.CRITICAL+1) + yield + finally: + logger.setLevel(old_level) + +def mock_nonblocking_socket(): + """Create a mock of a non-blocking socket.""" + sock = mock.Mock(socket.socket) + sock.gettimeout.return_value = 0.0 + return sock + + +def force_legacy_ssl_support(): + return mock.patch('trollius.sslproto._is_sslproto_available', + return_value=False) diff --git a/.local/lib/python2.7/site-packages/trollius/test_utils.pyc b/.local/lib/python2.7/site-packages/trollius/test_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..958657f404b850bd12bd74a281e7c6ea44b56806 GIT binary patch literal 24227 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
oR@0LmeuzJBJ0r*Z%;}I@H+%X8a-s_#%NI z*A)8`uL)@_k4q4JKQhX2+?=pm3zmI#tR9dPWnn=a9gm_~eIi%~Md_5dL)r~~cZIH9 z9Fx$K4!3(dtOR^z@a|BjPIlE7d3lsF+ir;FgXj}B)T3eUtKvjf&j-PjRh7naP$Z2z z7+Y0-79;&8u>C9XN9Y+8GiZ(S>pOa^G6@!~u!28AdlXl65Q%a*KA#3WUdI72^c?7b zdKe7nlO6`+3^*?b9&!du8Ww*GSB9O*>KsM}$mVjCOf*7j#tJ~0fLV<~Y8J4r!v{s* z5VeBei$H1WxFYpW={F5z7ZHtH)`IRH`dO208SePhJu+DfyhghvTTDmE()V;l3(@)> zt%LI~0PO1>q>to=a1<{RVi{_-p&1Al*df)bjtNQ?HJnIEg#&RZyOMO=HJ_8LIF6)8 z6A}MjBe<*q20ZVu084U&Os{f`i@@<2-;6ADqlxxr|7RmLj2Ie%+$lm`z?#U97fvT8K{3qIyOCKl|Ll z^dlPZ@#AY5JvT%Iuoxp9LqvU%7*l6fxNDphCEGPL&i#kQy6IJ&X%ITfdF9D0?2-c<3S>lpZWLJbiU#G1lJDZr=- zfrfx;yPgK!Y{oEpzC=h7dy@jXfeSr?T9vYVqhJ`uRUUsg9JC)os}4asU*+xBne>C1 zI?OD&Rox<-f5s?ZOGQ)B8tlVC``QW$g^fjoBOh^dSAx8XK*?>A7cB<7j9p+01vF@k z!ISzDq)0E8c75L~L?_8tnbPlYafkJ*k!-ff`-V72<@X!A^s?ZJ$IoEw;g_{49(B3S zH<;!ce3>6-tqoP{8aQ5_Y0u$A)(`abRh-tz*Q)3!7J8{+kEjV>V#9b!Zb+~k8vRJc zq;u-rsmUWxiFgnuXx4mJ9_*~hsxF2YQVBNraS&i(TP7`vdWccVWs5_pDAHmFX9Z5z zZB(`ktP+-m?4ReGBgiBQ`A$BB!vdUudq5Jte+G@l!(mTj?+gz-F?*;w{Fdj$9Gc2c z9awqfoxepQB0$^7{tD5+^Kg9L!udH=E569xy?mXLmWQb4fII~}3H;qnoRRxYZUjtM zVU9n7G>I#sL7GWd(koGxnq%^^TKcKX3B0%@adZ=IHR3x?a^rfJ@LfpKtWH=k!$e36 zVaJtuJ^esY7x%6%t!zc#h%%@IAjvteqF?NZ+AT(d9v}udU4F5rL#*S^pu`b9{m+q; z#Y?{NgYSkq&$4zcWPyY*tI@HZx7-Ds_b|E6gjQ`#v3EI|LvYIML?mBAgW=CtzZ_H; z2ag%&Kbib65)tuyIc_3pL(-MPQw$f^!DpBB=a*4LD%&mDzE+Ih=L7&8rrn0`23}tYA4p_L&Agl@dAs!Nvq--iu&Xha!RX zyOg(~)Y;4AQ6_I-@-&lkOt^T`FJcDaERatkI2G2knY^9Jk1%-$lUJEA9!f&2B{E&a zOS0a{XAqtDvc&-=KgHx{n0x? zxdD9ra@k*gJwhi?kMbcXYZ5q-AF(zLjM`&&l==pT2M0<6qouK-jbmel(%Aak9sRd$ j8Z9EfW@NBvjlf3T+*cYH+cb8mR2Us9^^M&%g7kj?oW=6p literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/time_monotonic.py b/.local/lib/python2.7/site-packages/trollius/time_monotonic.py new file mode 100644 index 00000000..e99364cc --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/time_monotonic.py @@ -0,0 +1,192 @@ +""" +Backport of time.monotonic() of Python 3.3 (PEP 418) for Python 2.7. + +- time_monotonic(). This clock may or may not be monotonic depending on the + operating system. +- time_monotonic_resolution: Resolution of time_monotonic() clock in second + +Support Windows, Mac OS X, Linux, FreeBSD, OpenBSD and Solaris, but requires +the ctypes module. +""" +import os +import sys +from .log import logger +from .py33_exceptions import get_error_class + +__all__ = ('time_monotonic',) + +# default implementation: system clock (non monotonic!) +from time import time as time_monotonic +# the worst resolution is 15.6 ms on Windows +time_monotonic_resolution = 0.050 + +if os.name == "nt": + # Windows: use GetTickCount64() or GetTickCount() + try: + import ctypes + from ctypes import windll + from ctypes.wintypes import DWORD + except ImportError: + logger.error("time_monotonic import error", exc_info=True) + else: + # GetTickCount64() requires Windows Vista, Server 2008 or later + if hasattr(windll.kernel32, 'GetTickCount64'): + ULONGLONG = ctypes.c_uint64 + + GetTickCount64 = windll.kernel32.GetTickCount64 + GetTickCount64.restype = ULONGLONG + GetTickCount64.argtypes = () + + def time_monotonic(): + return GetTickCount64() * 1e-3 + time_monotonic_resolution = 1e-3 + else: + GetTickCount = windll.kernel32.GetTickCount + GetTickCount.restype = DWORD + GetTickCount.argtypes = () + + # Detect GetTickCount() integer overflow (32 bits, roll-over after 49.7 + # days). It increases an internal epoch (reference time) by 2^32 each + # time that an overflow is detected. The epoch is stored in the + # process-local state and so the value of time_monotonic() may be + # different in two Python processes running for more than 49 days. + def time_monotonic(): + ticks = GetTickCount() + if ticks < time_monotonic.last: + # Integer overflow detected + time_monotonic.delta += 2**32 + time_monotonic.last = ticks + return (ticks + time_monotonic.delta) * 1e-3 + time_monotonic.last = 0 + time_monotonic.delta = 0 + time_monotonic_resolution = 1e-3 + +elif sys.platform == 'darwin': + # Mac OS X: use mach_absolute_time() and mach_timebase_info() + try: + import ctypes + import ctypes.util + libc_name = ctypes.util.find_library('c') + except ImportError: + logger.error("time_monotonic import error", exc_info=True) + libc_name = None + if libc_name: + libc = ctypes.CDLL(libc_name, use_errno=True) + + mach_absolute_time = libc.mach_absolute_time + mach_absolute_time.argtypes = () + mach_absolute_time.restype = ctypes.c_uint64 + + class mach_timebase_info_data_t(ctypes.Structure): + _fields_ = ( + ('numer', ctypes.c_uint32), + ('denom', ctypes.c_uint32), + ) + mach_timebase_info_data_p = ctypes.POINTER(mach_timebase_info_data_t) + + mach_timebase_info = libc.mach_timebase_info + mach_timebase_info.argtypes = (mach_timebase_info_data_p,) + mach_timebase_info.restype = ctypes.c_int + + def time_monotonic(): + return mach_absolute_time() * time_monotonic.factor + + timebase = mach_timebase_info_data_t() + mach_timebase_info(ctypes.byref(timebase)) + time_monotonic.factor = float(timebase.numer) / timebase.denom * 1e-9 + time_monotonic_resolution = time_monotonic.factor + del timebase + +elif sys.platform.startswith(("linux", "freebsd", "openbsd", "sunos")): + # Linux, FreeBSD, OpenBSD: use clock_gettime(CLOCK_MONOTONIC) + # Solaris: use clock_gettime(CLOCK_HIGHRES) + + library = None + try: + import ctypes + import ctypes.util + except ImportError: + logger.error("time_monotonic import error", exc_info=True) + libraries = () + else: + if sys.platform.startswith(("freebsd", "openbsd")): + libraries = ('c',) + elif sys.platform.startswith("linux"): + # Linux: in glibc 2.17+, clock_gettime() is provided by the libc, + # on older versions, it is provided by librt + libraries = ('c', 'rt') + else: + # Solaris + libraries = ('rt',) + + for name in libraries: + filename = ctypes.util.find_library(name) + if not filename: + continue + library = ctypes.CDLL(filename, use_errno=True) + if not hasattr(library, 'clock_gettime'): + library = None + + if library is not None: + if sys.platform.startswith("openbsd"): + import platform + release = platform.release() + release = tuple(map(int, release.split('.'))) + if release >= (5, 5): + time_t = ctypes.c_int64 + else: + time_t = ctypes.c_int32 + else: + time_t = ctypes.c_long + clockid_t = ctypes.c_int + + class timespec(ctypes.Structure): + _fields_ = ( + ('tv_sec', time_t), + ('tv_nsec', ctypes.c_long), + ) + timespec_p = ctypes.POINTER(timespec) + + clock_gettime = library.clock_gettime + clock_gettime.argtypes = (clockid_t, timespec_p) + clock_gettime.restype = ctypes.c_int + + def ctypes_oserror(): + errno = ctypes.get_errno() + message = os.strerror(errno) + error_class = get_error_class(errno, OSError) + return error_class(errno, message) + + def time_monotonic(): + ts = timespec() + err = clock_gettime(time_monotonic.clk_id, ctypes.byref(ts)) + if err: + raise ctypes_oserror() + return ts.tv_sec + ts.tv_nsec * 1e-9 + + if sys.platform.startswith("linux"): + time_monotonic.clk_id = 1 # CLOCK_MONOTONIC + elif sys.platform.startswith("freebsd"): + time_monotonic.clk_id = 4 # CLOCK_MONOTONIC + elif sys.platform.startswith("openbsd"): + time_monotonic.clk_id = 3 # CLOCK_MONOTONIC + else: + assert sys.platform.startswith("sunos") + time_monotonic.clk_id = 4 # CLOCK_HIGHRES + + def get_resolution(): + _clock_getres = library.clock_getres + _clock_getres.argtypes = (clockid_t, timespec_p) + _clock_getres.restype = ctypes.c_int + + ts = timespec() + err = _clock_getres(time_monotonic.clk_id, ctypes.byref(ts)) + if err: + raise ctypes_oserror() + return ts.tv_sec + ts.tv_nsec * 1e-9 + time_monotonic_resolution = get_resolution() + del get_resolution + +else: + logger.error("time_monotonic: unspported platform %r", sys.platform) + diff --git a/.local/lib/python2.7/site-packages/trollius/time_monotonic.pyc b/.local/lib/python2.7/site-packages/trollius/time_monotonic.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ade36f6d16764ddf1378e5e52ad041d19860c3c GIT binary patch literal 5501 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 tV)vIutTF7ye!Q= low >= 0: + raise ValueError('high (%r) must be >= low (%r) must be >= 0' % + (high, low)) + self._high_water = high + self._low_water = low + + def set_write_buffer_limits(self, high=None, low=None): + self._set_write_buffer_limits(high=high, low=low) + self._maybe_pause_protocol() + + def get_write_buffer_size(self): + raise NotImplementedError diff --git a/.local/lib/python2.7/site-packages/trollius/transports.pyc b/.local/lib/python2.7/site-packages/trollius/transports.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8c67c699e1ca54ba5b2c6121364522345f9510c GIT binary patch literal 13836 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 QKYIDO%QrrL8Na{ypB$g|ZU6uP literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/unix_events.py b/.local/lib/python2.7/site-packages/trollius/unix_events.py new file mode 100644 index 00000000..cdefacad --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/unix_events.py @@ -0,0 +1,1034 @@ +"""Selector event loop for Unix with signal handling.""" +from __future__ import absolute_import + +import errno +import os +import signal +import socket +import stat +import subprocess +import sys +import threading +import warnings + + +from . import base_events +from . import base_subprocess +from . import compat +from . import constants +from . import coroutines +from . import events +from . import futures +from . import selector_events +from . import selectors +from . import transports +from .compat import flatten_bytes +from .coroutines import coroutine, From, Return +from .log import logger +from .py33_exceptions import ( + reraise, wrap_error, + BlockingIOError, BrokenPipeError, ConnectionResetError, + InterruptedError, ChildProcessError) + + +__all__ = ['SelectorEventLoop', + 'AbstractChildWatcher', 'SafeChildWatcher', + 'FastChildWatcher', 'DefaultEventLoopPolicy', + ] + +if sys.platform == 'win32': # pragma: no cover + raise ImportError('Signals are not really supported on Windows') + + +if compat.PY33: + def _sighandler_noop(signum, frame): + """Dummy signal handler.""" + pass + + +class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): + """Unix event loop. + + Adds signal handling and UNIX Domain Socket support to SelectorEventLoop. + """ + + def __init__(self, selector=None): + super(_UnixSelectorEventLoop, self).__init__(selector) + self._signal_handlers = {} + + def _socketpair(self): + return socket.socketpair() + + def close(self): + super(_UnixSelectorEventLoop, self).close() + for sig in list(self._signal_handlers): + self.remove_signal_handler(sig) + + # On Python <= 3.2, the C signal handler of Python writes a null byte into + # the wakeup file descriptor. We cannot retrieve the signal numbers from + # the file descriptor. + if compat.PY33: + def _process_self_data(self, data): + for signum in data: + if not signum: + # ignore null bytes written by _write_to_self() + continue + self._handle_signal(signum) + + def add_signal_handler(self, sig, callback, *args): + """Add a handler for a signal. UNIX only. + + Raise ValueError if the signal number is invalid or uncatchable. + Raise RuntimeError if there is a problem setting up the handler. + """ + if (coroutines.iscoroutine(callback) + or coroutines.iscoroutinefunction(callback)): + raise TypeError("coroutines cannot be used " + "with add_signal_handler()") + self._check_signal(sig) + self._check_closed() + try: + # set_wakeup_fd() raises ValueError if this is not the + # main thread. By calling it early we ensure that an + # event loop running in another thread cannot add a signal + # handler. + signal.set_wakeup_fd(self._csock.fileno()) + except (ValueError, OSError) as exc: + raise RuntimeError(str(exc)) + + handle = events.Handle(callback, args, self) + self._signal_handlers[sig] = handle + + try: + if compat.PY33: + # On Python 3.3 and newer, the C signal handler writes the + # signal number into the wakeup file descriptor and then calls + # Py_AddPendingCall() to schedule the Python signal handler. + # + # Register a dummy signal handler to ask Python to write the + # signal number into the wakup file descriptor. + # _process_self_data() will read signal numbers from this file + # descriptor to handle signals. + signal.signal(sig, _sighandler_noop) + else: + # On Python 3.2 and older, the C signal handler first calls + # Py_AddPendingCall() to schedule the Python signal handler, + # and then write a null byte into the wakeup file descriptor. + signal.signal(sig, self._handle_signal) + + # Set SA_RESTART to limit EINTR occurrences. + signal.siginterrupt(sig, False) + except (RuntimeError, OSError) as exc: + # On Python 2, signal.signal(signal.SIGKILL, signal.SIG_IGN) raises + # RuntimeError(22, 'Invalid argument'). On Python 3, + # OSError(22, 'Invalid argument') is raised instead. + exc_type, exc_value, tb = sys.exc_info() + + del self._signal_handlers[sig] + if not self._signal_handlers: + try: + signal.set_wakeup_fd(-1) + except (ValueError, OSError) as nexc: + logger.info('set_wakeup_fd(-1) failed: %s', nexc) + + if isinstance(exc, RuntimeError) or exc.errno == errno.EINVAL: + raise RuntimeError('sig {0} cannot be caught'.format(sig)) + else: + reraise(exc_type, exc_value, tb) + + def _handle_signal(self, sig, frame=None): + """Internal helper that is the actual signal handler.""" + handle = self._signal_handlers.get(sig) + if handle is None: + return # Assume it's some race condition. + if handle._cancelled: + self.remove_signal_handler(sig) # Remove it properly. + else: + self._add_callback_signalsafe(handle) + + def remove_signal_handler(self, sig): + """Remove a handler for a signal. UNIX only. + + Return True if a signal handler was removed, False if not. + """ + self._check_signal(sig) + try: + del self._signal_handlers[sig] + except KeyError: + return False + + if sig == signal.SIGINT: + handler = signal.default_int_handler + else: + handler = signal.SIG_DFL + + try: + signal.signal(sig, handler) + except OSError as exc: + if exc.errno == errno.EINVAL: + raise RuntimeError('sig {0} cannot be caught'.format(sig)) + else: + raise + + if not self._signal_handlers: + try: + signal.set_wakeup_fd(-1) + except (ValueError, OSError) as exc: + logger.info('set_wakeup_fd(-1) failed: %s', exc) + + return True + + def _check_signal(self, sig): + """Internal helper to validate a signal. + + Raise ValueError if the signal number is invalid or uncatchable. + Raise RuntimeError if there is a problem setting up the handler. + """ + if not isinstance(sig, int): + raise TypeError('sig must be an int, not {0!r}'.format(sig)) + + if not (1 <= sig < signal.NSIG): + raise ValueError( + 'sig {0} out of range(1, {1})'.format(sig, signal.NSIG)) + + def _make_read_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + return _UnixReadPipeTransport(self, pipe, protocol, waiter, extra) + + def _make_write_pipe_transport(self, pipe, protocol, waiter=None, + extra=None): + return _UnixWritePipeTransport(self, pipe, protocol, waiter, extra) + + @coroutine + def _make_subprocess_transport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + with events.get_child_watcher() as watcher: + waiter = futures.Future(loop=self) + transp = _UnixSubprocessTransport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + waiter=waiter, extra=extra, + **kwargs) + + watcher.add_child_handler(transp.get_pid(), + self._child_watcher_callback, transp) + try: + yield From(waiter) + except Exception as exc: + # Workaround CPython bug #23353: using yield/yield-from in an + # except block of a generator doesn't clear properly + # sys.exc_info() + err = exc + else: + err = None + + if err is not None: + transp.close() + yield From(transp._wait()) + raise err + + raise Return(transp) + + def _child_watcher_callback(self, pid, returncode, transp): + self.call_soon_threadsafe(transp._process_exited, returncode) + + @coroutine + def create_unix_connection(self, protocol_factory, path, + ssl=None, sock=None, + server_hostname=None): + assert server_hostname is None or isinstance(server_hostname, str) + if ssl: + if server_hostname is None: + raise ValueError( + 'you have to pass server_hostname when using ssl') + else: + if server_hostname is not None: + raise ValueError('server_hostname is only meaningful with ssl') + + if path is not None: + if sock is not None: + raise ValueError( + 'path and sock can not be specified at the same time') + + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) + try: + sock.setblocking(False) + yield From(self.sock_connect(sock, path)) + except: + sock.close() + raise + + else: + if sock is None: + raise ValueError('no path and sock were specified') + sock.setblocking(False) + + transport, protocol = yield From(self._create_connection_transport( + sock, protocol_factory, ssl, server_hostname)) + raise Return(transport, protocol) + + @coroutine + def create_unix_server(self, protocol_factory, path=None, + sock=None, backlog=100, ssl=None): + if isinstance(ssl, bool): + raise TypeError('ssl argument must be an SSLContext or None') + + if path is not None: + if sock is not None: + raise ValueError( + 'path and sock can not be specified at the same time') + + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + + try: + sock.bind(path) + except socket.error as exc: + sock.close() + if exc.errno == errno.EADDRINUSE: + # Let's improve the error message by adding + # with what exact address it occurs. + msg = 'Address {0!r} is already in use'.format(path) + raise OSError(errno.EADDRINUSE, msg) + else: + raise + except: + sock.close() + raise + else: + if sock is None: + raise ValueError( + 'path was not specified, and no sock specified') + + if sock.family != socket.AF_UNIX: + raise ValueError( + 'A UNIX Domain Socket was expected, got {0!r}'.format(sock)) + + server = base_events.Server(self, [sock]) + sock.listen(backlog) + sock.setblocking(False) + self._start_serving(protocol_factory, sock, ssl, server) + return server + + +if hasattr(os, 'set_blocking'): + # Python 3.5 and newer + def _set_nonblocking(fd): + os.set_blocking(fd, False) +else: + import fcntl + + def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) + + +class _UnixReadPipeTransport(transports.ReadTransport): + + max_size = 256 * 1024 # max bytes we read in one event loop iteration + + def __init__(self, loop, pipe, protocol, waiter=None, extra=None): + super(_UnixReadPipeTransport, self).__init__(extra) + self._extra['pipe'] = pipe + self._loop = loop + self._pipe = pipe + self._fileno = pipe.fileno() + mode = os.fstat(self._fileno).st_mode + if not (stat.S_ISFIFO(mode) or + stat.S_ISSOCK(mode) or + stat.S_ISCHR(mode)): + raise ValueError("Pipe transport is for pipes/sockets only.") + _set_nonblocking(self._fileno) + self._protocol = protocol + self._closing = False + self._loop.call_soon(self._protocol.connection_made, self) + # only start reading when connection_made() has been called + self._loop.call_soon(self._loop.add_reader, + self._fileno, self._read_ready) + if waiter is not None: + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) + + def __repr__(self): + info = [self.__class__.__name__] + if self._pipe is None: + info.append('closed') + elif self._closing: + info.append('closing') + info.append('fd=%s' % self._fileno) + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_READ) + if polling: + info.append('polling') + else: + info.append('idle') + else: + info.append('closed') + return '<%s>' % ' '.join(info) + + def _read_ready(self): + try: + data = wrap_error(os.read, self._fileno, self.max_size) + except (BlockingIOError, InterruptedError): + pass + except OSError as exc: + self._fatal_error(exc, 'Fatal read error on pipe transport') + else: + if data: + self._protocol.data_received(data) + else: + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) + self._closing = True + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._protocol.eof_received) + self._loop.call_soon(self._call_connection_lost, None) + + def pause_reading(self): + self._loop.remove_reader(self._fileno) + + def resume_reading(self): + self._loop.add_reader(self._fileno, self._read_ready) + + def close(self): + if not self._closing: + self._close(None) + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if self._pipe is not None: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self._pipe.close() + + def _fatal_error(self, exc, message='Fatal error on pipe transport'): + # should be called by exception handler only + if (isinstance(exc, OSError) and exc.errno == errno.EIO): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: + self._loop.call_exception_handler({ + 'message': message, + 'exception': exc, + 'transport': self, + 'protocol': self._protocol, + }) + self._close(exc) + + def _close(self, exc): + self._closing = True + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._pipe.close() + self._pipe = None + self._protocol = None + self._loop = None + + +class _UnixWritePipeTransport(transports._FlowControlMixin, + transports.WriteTransport): + + def __init__(self, loop, pipe, protocol, waiter=None, extra=None): + super(_UnixWritePipeTransport, self).__init__(extra, loop) + self._extra['pipe'] = pipe + self._pipe = pipe + self._fileno = pipe.fileno() + mode = os.fstat(self._fileno).st_mode + is_socket = stat.S_ISSOCK(mode) + if not (is_socket or + stat.S_ISFIFO(mode) or + stat.S_ISCHR(mode)): + raise ValueError("Pipe transport is only for " + "pipes, sockets and character devices") + _set_nonblocking(self._fileno) + self._protocol = protocol + self._buffer = [] + self._conn_lost = 0 + self._closing = False # Set when close() or write_eof() called. + + self._loop.call_soon(self._protocol.connection_made, self) + + # On AIX, the reader trick (to be notified when the read end of the + # socket is closed) only works for sockets. On other platforms it + # works for pipes and sockets. (Exception: OS X 10.4? Issue #19294.) + if is_socket or not sys.platform.startswith("aix"): + # only start reading when connection_made() has been called + self._loop.call_soon(self._loop.add_reader, + self._fileno, self._read_ready) + + if waiter is not None: + # only wake up the waiter when connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) + + def __repr__(self): + info = [self.__class__.__name__] + if self._pipe is None: + info.append('closed') + elif self._closing: + info.append('closing') + info.append('fd=%s' % self._fileno) + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_WRITE) + if polling: + info.append('polling') + else: + info.append('idle') + + bufsize = self.get_write_buffer_size() + info.append('bufsize=%s' % bufsize) + else: + info.append('closed') + return '<%s>' % ' '.join(info) + + def get_write_buffer_size(self): + return sum(len(data) for data in self._buffer) + + def _read_ready(self): + # Pipe was closed by peer. + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) + if self._buffer: + self._close(BrokenPipeError()) + else: + self._close() + + def write(self, data): + data = flatten_bytes(data) + if not data: + return + + if self._conn_lost or self._closing: + if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES: + logger.warning('pipe closed by peer or ' + 'os.write(pipe, data) raised exception.') + self._conn_lost += 1 + return + + if not self._buffer: + # Attempt to send it right away first. + try: + n = wrap_error(os.write, self._fileno, data) + except (BlockingIOError, InterruptedError): + n = 0 + except Exception as exc: + self._conn_lost += 1 + self._fatal_error(exc, 'Fatal write error on pipe transport') + return + if n == len(data): + return + elif n > 0: + data = data[n:] + self._loop.add_writer(self._fileno, self._write_ready) + + self._buffer.append(data) + self._maybe_pause_protocol() + + def _write_ready(self): + data = b''.join(self._buffer) + assert data, 'Data should not be empty' + + del self._buffer[:] + try: + n = wrap_error(os.write, self._fileno, data) + except (BlockingIOError, InterruptedError): + self._buffer.append(data) + except Exception as exc: + self._conn_lost += 1 + # Remove writer here, _fatal_error() doesn't it + # because _buffer is empty. + self._loop.remove_writer(self._fileno) + self._fatal_error(exc, 'Fatal write error on pipe transport') + else: + if n == len(data): + self._loop.remove_writer(self._fileno) + self._maybe_resume_protocol() # May append to buffer. + if not self._buffer and self._closing: + self._loop.remove_reader(self._fileno) + self._call_connection_lost(None) + return + elif n > 0: + data = data[n:] + + self._buffer.append(data) # Try again later. + + def can_write_eof(self): + return True + + def write_eof(self): + if self._closing: + return + assert self._pipe + self._closing = True + if not self._buffer: + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, None) + + def close(self): + if self._pipe is not None and not self._closing: + # write_eof is all what we needed to close the write pipe + self.write_eof() + + # On Python 3.3 and older, objects with a destructor part of a reference + # cycle are never destroyed. It's not more the case on Python 3.4 thanks + # to the PEP 442. + if compat.PY34: + def __del__(self): + if self._pipe is not None: + warnings.warn("unclosed transport %r" % self, ResourceWarning) + self._pipe.close() + + def abort(self): + self._close(None) + + def _fatal_error(self, exc, message='Fatal error on pipe transport'): + # should be called by exception handler only + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: + self._loop.call_exception_handler({ + 'message': message, + 'exception': exc, + 'transport': self, + 'protocol': self._protocol, + }) + self._close(exc) + + def _close(self, exc=None): + self._closing = True + if self._buffer: + self._loop.remove_writer(self._fileno) + del self._buffer[:] + self._loop.remove_reader(self._fileno) + self._loop.call_soon(self._call_connection_lost, exc) + + def _call_connection_lost(self, exc): + try: + self._protocol.connection_lost(exc) + finally: + self._pipe.close() + self._pipe = None + self._protocol = None + self._loop = None + + +if hasattr(os, 'set_inheritable'): + # Python 3.4 and newer + _set_inheritable = os.set_inheritable +else: + import fcntl + + def _set_inheritable(fd, inheritable): + cloexec_flag = getattr(fcntl, 'FD_CLOEXEC', 1) + + old = fcntl.fcntl(fd, fcntl.F_GETFD) + if not inheritable: + fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) + else: + fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag) + + +class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport): + + def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): + stdin_w = None + if stdin == subprocess.PIPE: + # Use a socket pair for stdin, since not all platforms + # support selecting read events on the write end of a + # socket (which we use in order to detect closing of the + # other end). Notably this is needed on AIX, and works + # just fine on other platforms. + stdin, stdin_w = self._loop._socketpair() + + # Mark the write end of the stdin pipe as non-inheritable, + # needed by close_fds=False on Python 3.3 and older + # (Python 3.4 implements the PEP 446, socketpair returns + # non-inheritable sockets) + _set_inheritable(stdin_w.fileno(), False) + self._proc = subprocess.Popen( + args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, + universal_newlines=False, bufsize=bufsize, **kwargs) + if stdin_w is not None: + # Retrieve the file descriptor from stdin_w, stdin_w should not + # "own" the file descriptor anymore: closing stdin_fd file + # descriptor must close immediatly the file + stdin.close() + if hasattr(stdin_w, 'detach'): + stdin_fd = stdin_w.detach() + self._proc.stdin = os.fdopen(stdin_fd, 'wb', bufsize) + else: + stdin_dup = os.dup(stdin_w.fileno()) + stdin_w.close() + self._proc.stdin = os.fdopen(stdin_dup, 'wb', bufsize) + + +class AbstractChildWatcher(object): + """Abstract base class for monitoring child processes. + + Objects derived from this class monitor a collection of subprocesses and + report their termination or interruption by a signal. + + New callbacks are registered with .add_child_handler(). Starting a new + process must be done within a 'with' block to allow the watcher to suspend + its activity until the new process if fully registered (this is needed to + prevent a race condition in some implementations). + + Example: + with watcher: + proc = subprocess.Popen("sleep 1") + watcher.add_child_handler(proc.pid, callback) + + Notes: + Implementations of this class must be thread-safe. + + Since child watcher objects may catch the SIGCHLD signal and call + waitpid(-1), there should be only one active object per process. + """ + + def add_child_handler(self, pid, callback, *args): + """Register a new child handler. + + Arrange for callback(pid, returncode, *args) to be called when + process 'pid' terminates. Specifying another callback for the same + process replaces the previous handler. + + Note: callback() must be thread-safe. + """ + raise NotImplementedError() + + def remove_child_handler(self, pid): + """Removes the handler for process 'pid'. + + The function returns True if the handler was successfully removed, + False if there was nothing to remove.""" + + raise NotImplementedError() + + def attach_loop(self, loop): + """Attach the watcher to an event loop. + + If the watcher was previously attached to an event loop, then it is + first detached before attaching to the new loop. + + Note: loop may be None. + """ + raise NotImplementedError() + + def close(self): + """Close the watcher. + + This must be called to make sure that any underlying resource is freed. + """ + raise NotImplementedError() + + def __enter__(self): + """Enter the watcher's context and allow starting new processes + + This function must return self""" + raise NotImplementedError() + + def __exit__(self, a, b, c): + """Exit the watcher's context""" + raise NotImplementedError() + + +class BaseChildWatcher(AbstractChildWatcher): + + def __init__(self): + self._loop = None + + def close(self): + self.attach_loop(None) + + def _do_waitpid(self, expected_pid): + raise NotImplementedError() + + def _do_waitpid_all(self): + raise NotImplementedError() + + def attach_loop(self, loop): + assert loop is None or isinstance(loop, events.AbstractEventLoop) + + if self._loop is not None: + self._loop.remove_signal_handler(signal.SIGCHLD) + + self._loop = loop + if loop is not None: + loop.add_signal_handler(signal.SIGCHLD, self._sig_chld) + + # Prevent a race condition in case a child terminated + # during the switch. + self._do_waitpid_all() + + def _sig_chld(self): + try: + self._do_waitpid_all() + except Exception as exc: + # self._loop should always be available here + # as '_sig_chld' is added as a signal handler + # in 'attach_loop' + self._loop.call_exception_handler({ + 'message': 'Unknown exception in SIGCHLD handler', + 'exception': exc, + }) + + def _compute_returncode(self, status): + if os.WIFSIGNALED(status): + # The child process died because of a signal. + return -os.WTERMSIG(status) + elif os.WIFEXITED(status): + # The child process exited (e.g sys.exit()). + return os.WEXITSTATUS(status) + else: + # The child exited, but we don't understand its status. + # This shouldn't happen, but if it does, let's just + # return that status; perhaps that helps debug it. + return status + + +class SafeChildWatcher(BaseChildWatcher): + """'Safe' child watcher implementation. + + This implementation avoids disrupting other code spawning processes by + polling explicitly each process in the SIGCHLD handler instead of calling + os.waitpid(-1). + + This is a safe solution but it has a significant overhead when handling a + big number of children (O(n) each time SIGCHLD is raised) + """ + + def __init__(self): + super(SafeChildWatcher, self).__init__() + self._callbacks = {} + + def close(self): + self._callbacks.clear() + super(SafeChildWatcher, self).close() + + def __enter__(self): + return self + + def __exit__(self, a, b, c): + pass + + def add_child_handler(self, pid, callback, *args): + self._callbacks[pid] = (callback, args) + + # Prevent a race condition in case the child is already terminated. + self._do_waitpid(pid) + + def remove_child_handler(self, pid): + try: + del self._callbacks[pid] + return True + except KeyError: + return False + + def _do_waitpid_all(self): + + for pid in list(self._callbacks): + self._do_waitpid(pid) + + def _do_waitpid(self, expected_pid): + assert expected_pid > 0 + + try: + pid, status = os.waitpid(expected_pid, os.WNOHANG) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + pid = expected_pid + returncode = 255 + logger.warning( + "Unknown child process pid %d, will report returncode 255", + pid) + else: + if pid == 0: + # The child process is still alive. + return + + returncode = self._compute_returncode(status) + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + expected_pid, returncode) + + try: + callback, args = self._callbacks.pop(pid) + except KeyError: # pragma: no cover + # May happen if .remove_child_handler() is called + # after os.waitpid() returns. + if self._loop.get_debug(): + logger.warning("Child watcher got an unexpected pid: %r", + pid, exc_info=True) + else: + callback(pid, returncode, *args) + + +class FastChildWatcher(BaseChildWatcher): + """'Fast' child watcher implementation. + + This implementation reaps every terminated processes by calling + os.waitpid(-1) directly, possibly breaking other code spawning processes + and waiting for their termination. + + There is no noticeable overhead when handling a big number of children + (O(1) each time a child terminates). + """ + def __init__(self): + super(FastChildWatcher, self).__init__() + self._callbacks = {} + self._lock = threading.Lock() + self._zombies = {} + self._forks = 0 + + def close(self): + self._callbacks.clear() + self._zombies.clear() + super(FastChildWatcher, self).close() + + def __enter__(self): + with self._lock: + self._forks += 1 + + return self + + def __exit__(self, a, b, c): + with self._lock: + self._forks -= 1 + + if self._forks or not self._zombies: + return + + collateral_victims = str(self._zombies) + self._zombies.clear() + + logger.warning( + "Caught subprocesses termination from unknown pids: %s", + collateral_victims) + + def add_child_handler(self, pid, callback, *args): + assert self._forks, "Must use the context manager" + with self._lock: + try: + returncode = self._zombies.pop(pid) + except KeyError: + # The child is running. + self._callbacks[pid] = callback, args + return + + # The child is dead already. We can fire the callback. + callback(pid, returncode, *args) + + def remove_child_handler(self, pid): + try: + del self._callbacks[pid] + return True + except KeyError: + return False + + def _do_waitpid_all(self): + # Because of signal coalescing, we must keep calling waitpid() as + # long as we're able to reap a child. + while True: + try: + pid, status = wrap_error(os.waitpid, -1, os.WNOHANG) + except ChildProcessError: + # No more child processes exist. + return + else: + if pid == 0: + # A child process is still alive. + return + + returncode = self._compute_returncode(status) + + with self._lock: + try: + callback, args = self._callbacks.pop(pid) + except KeyError: + # unknown child + if self._forks: + # It may not be registered yet. + self._zombies[pid] = returncode + if self._loop.get_debug(): + logger.debug('unknown process %s exited ' + 'with returncode %s', + pid, returncode) + continue + callback = None + else: + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + pid, returncode) + + if callback is None: + logger.warning( + "Caught subprocess termination from unknown pid: " + "%d -> %d", pid, returncode) + else: + callback(pid, returncode, *args) + + +class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): + """UNIX event loop policy with a watcher for child processes.""" + _loop_factory = _UnixSelectorEventLoop + + def __init__(self): + super(_UnixDefaultEventLoopPolicy, self).__init__() + self._watcher = None + + def _init_watcher(self): + with events._lock: + if self._watcher is None: # pragma: no branch + self._watcher = SafeChildWatcher() + if isinstance(threading.current_thread(), + threading._MainThread): + self._watcher.attach_loop(self._local._loop) + + def set_event_loop(self, loop): + """Set the event loop. + + As a side effect, if a child watcher was set before, then calling + .set_event_loop() from the main thread will call .attach_loop(loop) on + the child watcher. + """ + + super(_UnixDefaultEventLoopPolicy, self).set_event_loop(loop) + + if self._watcher is not None and \ + isinstance(threading.current_thread(), threading._MainThread): + self._watcher.attach_loop(loop) + + def get_child_watcher(self): + """Get the watcher for child processes. + + If not yet set, a SafeChildWatcher object is automatically created. + """ + if self._watcher is None: + self._init_watcher() + + return self._watcher + + def set_child_watcher(self, watcher): + """Set the watcher for child processes.""" + + assert watcher is None or isinstance(watcher, AbstractChildWatcher) + + if self._watcher is not None: + self._watcher.close() + + self._watcher = watcher + +SelectorEventLoop = _UnixSelectorEventLoop +DefaultEventLoopPolicy = _UnixDefaultEventLoopPolicy diff --git a/.local/lib/python2.7/site-packages/trollius/unix_events.pyc b/.local/lib/python2.7/site-packages/trollius/unix_events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0454b822648060aef86c5448afb784141684bcf5 GIT binary patch literal 36439 zcmds=3vgW5dEd|71wbwc@J&jTC~--VA}CR$9+qU;k_-|6DM~b`T+o7qv9en1UXTke zcEP<1k+8*NYSQCO(~M`D=GA06wXGy=oIcVfZQ3-MI(FT}ZJf5rB$+lDHy*diIBC;I zJWXHY{{G*&_wEHjDXObwJ0-b?=iYnnd3@)4pYNPo{LiDqAAj%zuhv}hXOREL$DNB0 z6`iX)H%A({dcidVw^VR*1sCYL=$b`0SF~s32i)91njds?gK2)q%?+jb4Q_5jn&0T= zHm3QKn=7UHVK+CN<~O;yO|DM0gRVK^mPXy&C~b2+WY?SB+-85h!LGNsxh?*Bqg`)x zb6fp&$*#A#xo!S>*siy`x$XXXlU?s{b36R?h+Xe=b36U@s9o=JbG!WYX1m_)=63t* zEv~u6E#2Yf?(o-JU2~gTy3@_w>6Z4mxjk;_E;o0Vf40pv?{-Uj-P~S(z1=nMaZC5Q zxqIExJ~y||EtTC|*)8pNbNk)W0XKKRE#2ql?sH2A-P}Rm+2QItU456U?{@V&+y#Jr z$VDZ$c)zRP=`Iyq=N|>pVOQVdt_SX8fonMzZE=fZuJbR0`d#h@6M959>vy|or(1l$ zEijpTb^p3^ugpE@qN6SX#`n1E)U~-#zt`S*$hBzF&-*bqcg)rICHL!P7wvY7$E~9M zSw#=K`T=|Jh^3FZg@UW!mpy(gZReo1^Ll|c7vJON9$(kaA#3MxSHIsyo896Q*3RLq zq9+B8=)HD#EW7)Zs~>UEQ+D@(?C$#nx9EL#_rdJ$`vuD6?$PY-)2{xIi?+MPXRP?K z?7_1xdeF^%z(voxxpC3K%-C^ACVrG;CTd2tZo5;CUXNPca4RJY-A=U?YbeRRQB~NicDqrlGQZlTTDXks`tBut=?-w~RHwbv z)hNP<=39Ogx^A{FT!=bj>RDGwC+buian#jtu5_x)m8jF9J$3YCvt7Fcl+T=->fP(K zFGZ~v8_SWux07-c?N*C)JcB)o$%#)ak0`nd(Bc?&hg#ytd?SN=`-#)s<#9tM|orvr${^ zicMc>v>tmjeo)mJTE*pRCn~qv-Et?YHk+&Ecx73zkLu-it32Ci)!SF%T7mNV3AHB1 znKgkM(w-U9-FO$tKvOM?|5#<>GbG0^wwI#g zi|u$N>OB13vt!jB^fJ9x=tcL-sCWYJ=SzarKRs8MUVrD7hO5 z&CTiMuw8C(5s&z{Nw34GkxcawdvSaE$QKxOH;PtZNAA9_ZHv1xV2^gXaAr)H88aql zyvAtQ_|LK7;WB?t)a&t@356`mFro5?rq8@wo@_5w8?EvTHF zB;qw3x{pkke}Q`gNm6i&1^0%HEND30s-P)=rbfooV*@HJ3zSa`7Wj|FXGzmW!L_j-dos54vtqbGK+{ zHu>rfcg?1EaWI|R%lEn2dT-RmuJ==$pHWS4t=Wd73VO{(+zky)#9=zoQv3BtRGph* zn_+_s4b$Pqg?_;&JVN~%cdS0UV27qQ1xf~(V?4TgSc9E>b)UNiN*7$b$6ekaHXy)| z7DR#pxAK4xf^;{NB*>eL(`20=pCD4NcB|n%WcoGA?sjz{(F-b~nu^*y&E0q-i3>)9 zp~6s5(};z~0>Bu(Y1nnX+XdGKT+khH-BI_3pV)fVbBo(u=U1%BA>Hln5HAW^J9@YD#!kDdj_tBiyX|_m^(DGQ z^I4aEKJZ<-!!6#aj(?bDhupOd?%Kv)%g^{e#FvBBZOLFUmTZidF9&PKxI~2|#<<5V z-X$sX2JoPNlzSPB>fWt!(*y3se?B0;xYu>}y2X1;um1_brq0cK)oB{=;JN$@L3f{f zgYg38jSkQREg*)`G&838j6Y8T`!83$)){q7C9NjX;8@vdM`K4-e z#p_As#zMJ!F-k=Uf`6Wh8gaSNdcE3gpkQ>$E3KL|oa%ft@?xS_QMl6THkQ^@g{H#m z)iUVG3rl6#1d8Z|^2)L`lyLoCMe$>dqt;IK)pD)clBP2sl~-aE9Mi6=_4>^$dBurFtn^S*|S9#~ym*NO_^!Xh!w-l@G=7ohs0{Q2yw{*K$?Ysw)>RcBjY6 zJPpOqjIlQ2tRG;QbGhpUfFMQEG}`m4sg^0Vw}SFlyOi_~9MA3;kE~}pRkdjk*YwsN zR%&ACmR+FVj9xU`n7 zz59@EsTQEpNcCV7+NY{bI;U6S)!5{4bhU=$UTBBXx~(2vS@#-o!>o>4WbdL*({J@* z>df>@C(ioOv^z`HZYVu(OhYmj8A`>o+R+=E^C*c{akX&2q$ zyx)orB;|q@td;j*oTgRElar|ZGGEQyG4nKPqL)F3)vkzCgpU!kg5l}~cFIYx2{e^n ztP3G7K*Z|obi3s(vI=Bci<(ebC_AMqGOGwk>7*v~5MvLSTG*TW@LtM>FOc+W#tg^5 zn+9UxxhrfBMuGw0zqMexfCi%B8PxxTjEA}hd9b?Ku5AjQnQd)Hc6dQ{+yy}Ziq5<& z2?W0$H1_?1()qiZ&K2{+HMRraPB z5tFw#vQ`#+)_u%5v43?naPc2I2_^b~J(3EgKc@1{qO3&l{s-R#7Biw$LJ8E6Q2JwM zLTMWqB1ptnNJ3NF;Mxg$en+Cj4EXZ-&I%lVfp^#9Q29zV#$J^=SU*}e-lAe~i5%~L zJMR3>82p%Yp-?i!W2^L^7ot^Tmf^T=KTcvCW#-K3Gt=jdv)8@x4Rh^i zvl$g|u&^ZJqJwmj^&S3ElW}BSrnuQ_>b%f&H9`Ou|HC5B#s9|8wsxpz% zFJq&v`4VN|WlUw1xrB^plj%&29anfOPO?6zy|rV;U# zD!!$T*Ez1@gX`C@(dCh7OQ@90pFQ?9IhY`I6Ai{5_ zR9I2+nvyC>-$r~FmHQE2QI~ES@)voU4!J~L{7=01(m40OM#kHf*PZ+17u_{1K%7OU zyMPbZ5k;HCCT_wFS$byRh@T+%;4@fYCHFlW3)hfaJ~etqoXAPPsR5uF=_&>wH;tEb=CHtm@!`I?a52 zDWI4)d}k^BZ7<7Y<)K-_-0%`}nt{k)-CoX3io60|2baeVeF?Jwe=>%NIfp~@Yl~D) zncLkfOy=CoJp36UVDPeJAZ5y`NMwk~6IHz2sCNx}*0hjmUZG47QYzQUo2!qF3?iJ*SyOtF0ACBgSRdZdJM$#Y&_S+cHMx z!HKRyZuOq}V4%?~i{o}o&8oHQQMkfozrYnDzTNNhOWlc@u8sWke{G!mlQ3}zmLXz| z#QUWra0!`9Rp7EH$^jaksa~m#(46h&g-m%Tx`eP7E3SXD;J{{eh~Rj;<#x`LN^z|j+2k4ycAVi zlv`M7dY_5POLVhTc+pk_GD^gJuu%iT&1l0sG`4`{JR;-13^hrLoEKSZiaR2DFN z+nrToV95AyR=8q9;yb0LGRWl{PSZ2TI(N@2b!L4ZBtT)0xP{$r7aRd84v;?@=yzw&ZO4Hk*DAW5pIE78`@8Nw$ zmj7CKF7kjxr;I#u)VrQ6!FtSGY*ledWUUp3_zvMfg?hcj{$(Wgkhg`0O)5h%5G?qB zU{>VA=gpdc(Cl^mw6b&UDZWupSeJiC7BcmUsA9SX#^IysW9$*GQIaYTstSl+8AZJ0$%$#NUx*J`^Q0SE9cllPS*$DYWz0O*Hj2jet z#2mCu$)Z&(75Q0Xc?FHqWwp!yn$h@CV;(R9;~&}W_$Y6jxYaVFYKX4FT##u;%NMB2 z8Xc43@2#5wa`WwW)0;QOJ~9pwUQ@B}ATdguXK|aUVR2V0{YLj@mz!vuIx#sJo|*p8 z%#^p0WVM@`u~1!VG*?6LI3 zKrTc#bm7NIyuO3Sl30cChVDMEyHX04;tN*2XBd5B3fpNa&lG%fn;B@V!MmayktrLv z6U%=ay3KH~o%_335Hg0qb1{kSq`Ty(_+gqE z7dRvt9Ul78AbgcvO_%zknL9a70r95DN0|_{h)~3+r4kn zQ89gT^u)&{?4qt$t&fe#GZOAsBD@F>kQleGAf7u_L-C6I0Y0Z1!uP6-u}r_F=P_Os zv4F7Y+M~ED?&`xR?B+%u&s5ILoH}#robh5^NJX~dx|nz_^zLUNt*N83BF#PK#hI$8 zXyp+>X3sP8(`?S37Kx{arbUACG)NghW8b8=mA7Qo_&h7s+|;rq8Uzt*m6cW#Rid{7 z6E^pp*du=8!|B5 z%=GA=5^_i*rUqO6Q6{A@S+Y`4`e_Pt#iV%XbMb1Amd?Y8LnInK7Zm zwBc&98ZDGe&?7c%tUq%oHuPFnlpaVUcr;i+j+J@(Q2Z>+#JTd=W>SxF;1|X!YQXn# zEBuTSDFoI`b$K~z)x)3E%{P^(2j&N<5EUvN%ZGOPIKc4JdMbS@dl2f%t9LI=O`oq| z8ctfD7Tb+hFVe=AUPAe$`-M`8GSrEdJC(|7LM<&^Izy$cT1~WNl_7H5vBI_%wz2}8 zA(cdlA=OvOtnN#AvZCjhXO9+4Df1k-+167yFEPG`(v`dSYNfIDW8B?fF3mX%q=Xfk z4J8B=Tf4z}AVE9b92VKU2dzcBWhT;fTu9%q*qcR@RJ5P4MEC(070;I`YL*RsOL3K3 z#+`+q#M>kooZTf@-B-nb32TkT7*7$2)Ks8qy=*$WLR7^Odz{unQ4e*>G88;kmgiT? z%MsDPW+TY^>Di?)P&FAQ*?cTjud=d?yHT2OD4o^T>P$Psrl)BiCmep3M;33P$S62h zEo!h3*~2$EQtQ$D%7xxSUigZt6Xx2BNhq7=jNxC?ZE3Ahdm*c?s}7jsHD{h935bXj zLFBMi3TJ;80skf~#KO|OWE>jnKBC{`%G`+#y93AO4lvc?;Y7~*75EvB_MDmWWP+fc zkJ-ek;ItozXf^zTk~c|iL$ITKKg(6jQcimz{*}U{dM0BFYVh%)6A|fU?B7wl; zt=Nu9|Hvbt0A!YIznG+%e&4M@2&@hiGZv_Jvx#|<3qLXRS&pN}5+edW#{J!JcTJHm zf;@#|Wdjr}rj20`fTftzdXJBk4|RN)%4aC#C6I&-%MWsd#wIj$VTuns0NN{^S~TmQ zTEB0@j3-8O)T~s#S5WdM21FUenqAK<--1up1VQ~WVe&~X(C%USiKp(I$^SwEPx;EY z1EQe)8XP;{A+drE??H`9fldx1yZI;2p(U~bz{ET8S;GSitEsMwWYR|33qrGob%PLv5X%vU?{qUD5lw-cntDZ0G9>0EA*x~1>_Xjn< z5=)K%uPwno{45*n?`9u%BvjV$CdMiE1R2dF??g3} zHPVo!K0UTo9Wved`<45LO01Iyl=}rG5=h}cR`N?qY#c%!V`>C*z9;+@-T#~t!QM|c znf^_&Oy5%)m4dbiFE4D_UD{FFjsvY&+JFmfaAb37Fs$)VKl`H|pB(3vzeEPxP}_5G z3-HgG%fy@!H@J^cwQiFRJV=k=UEYa;@5DP%@R4{Y3T(;m%Gu;1R`Ew&r(+v)%xfYM zi7SOX%@JFG69u;lk#JnH`^N9h*=z;2%d?_MF@K6=$N)b>Sq*r-KShWuiIuAJaM!2( zg?FiV<|~ZFq|59)bCjS>%adZxAMZM0J%eQo`BS(_)I;V^;WBlv$e&{BJ3RPfwrb(E zce!lDExbQvtGnP?3cHT{o$U&hS3f+}?MnS8EM(lF`!zBb|Fp zAZKroVdd5{BhtO*dI82g@5{;D3&@{)Q~My*Rm27o@5=|suJ^v!GG^w2Icf_I^1*03 z6XECDZ%6QIJ$k*ten?1(nGu3j8&}7)R_Pry!aZ{agr8FGGfL!(@qAHk$M8p${Fss- zSMpbt{1qiXq2wtg@~(K+B0gIo#$f^P$guL_GhW3XS0R}Tp8Fcl{p-3sL1Na*GCLv} z(2~7rYYegC*}dXvByME?QOV{FCihDC_jJ$j?M>yxr^3IlfC*G9#PG-Y1=cmj_mAUJq zx;!p>Bl_nl-U~bFxm3cA9`NgnvLpfbTf!|N*<1TlMp2+7IM*8#vR7fsaNQdox!A}B z8|0r4dY`se3X~Fmh{yTeO$Ic4b(=gcyz8gyrQouy3#S?do$@?|T^Ob;*m}*ehr?q$ z=odUcVbxX!bdG2a$NnV_KM<8i!|SC{KZgY_oft$jk`z#hdvubgx}kEw!) zSAKSoyA7}r$NrCkjp)~_mZAbWwLS4BM6!idWj#WitG~C^;V@R3-L36*?fm<-GqvWXvfEl zpN;AH(XzaJM~J6pcN>1k)Yv>`k=G5)R(v0cH@EG*w{lK;7o^rf!rxS4{C0p`cR$J5 zbEhlkp9`mEo;!DTvU2KNSeZCCJ$?4v%=wD(+8J-I3S|>Fgwbu-b7^W|)&Z}OZ0FLu zF`LSLPRZ{m`80{C4O*SC7dqa_X?b%Wt(rveKFFo&>O2v<<}6DWgmRo+{0o->0bTud zLVlGd{u}N1@Fc>KhJpc916Ew1mI2#~u-6=sQX#emgFG3a)M&7`u+{S#fm(*$#5lFQ zKvmEI%7f6u5GA3egJL?_`l5gOsEDB`6KRdzoDjn$bEiWr2{9~-82pRqsi91we3L`|XOzg?C6WMqL&?5=x!$_|AY_59vdp#m)F`+KeH+(V5}99KMO$-J^VuAk62( znx)V@aiOMo?rHQ3YD1Q{_k0SEygDu15C5%_=Slh{#lx>r`JMuheSnMuv9}jCVEPN) zcSv6@?m(MCOC}sgceZ-OFPN$#%GA%0UOi`y@;Zq*dipQmY}un$Z6%r_D;X-l z*3n|x(QhXs%w^7qR_F;gsL+C4p+z3!y-}e77tdM7;_P(C0t*b`xs|SjQca>ks6rd^ z^q6sDW5l1K$&i;5*OzGk!kq96O5RkGxxPFe2&{e8n9LyaOc{W^R{+~gn{tH@Fz<5v z;0sG-)Io2h{y&4 z5>1Ff$XtsJopiB*(i`7)u>tp9Zm|Ki)+>kxMk!Y778}g9AO0$j!cQoH<2cVVCUq&} zAl#|s(@H+C#Egi4uG}k1{)LjyD*0uS+rDxTYI39rI^r?^w3UMoQ%tr6oHboJU=NKj z&gMZG@5g|3=%U~rO&;RK$Q~xQd>j?b7Z|TyB`wiRZhfK0X@6f2-c<4hB^kTDUCwpQ z&}#zN2pMtN62U$j#AAit`bot$9;@l^$9hBfYgFv{usF~Eodt%AJs9*B7^cSz+k0yZ z;xpj^CAO^a+sc{a@vF*xP081lNQ(4U8Ny%JrPy8ghe|%DM1a2y%M3M|`5DBeMcWJ& zx0Fk}SzsuY_LcV9|BBWfEEPvKk8HGsT?M8!TAaVu=<0+L!-4_o$grTn1q1`*f-lKr zFoS?g3<}6V8RKT&-4|nj=O3ZN@UP%b@>;;=rCUDSGOnj}X)Hxrn>NGk)MRDi?769z zrzZSqf9jO2i{gtT0I(DONP5Eu#ZKD8QxyfkPI}wT0$?{$EH^;20q?FLI^Xvp>wBJ2_4v$-{_M7;{|QAXCt4iyqg+ z%{4l4;}^y$TjDlQ^t&qj#K_Gs-eYgqo%^uuDWMF)hRqbR!VIutVDLP>W(-YI$V8A# zGv<&rCYHF_dxkp-uPxk=e;eHQ1Vdm!1w)AiCLfMG%jJNda)WC9{(4;^Fu1GwioIuZ#_25tgkG4 zVSG@<&M3LXkgV@vtV)CxY&C6QhS(yC&o9(X(e@XrlT!WgPTLs#evli&@q5({_`PLl z*U)bMzn6g0k%3{v^hj_om_HnNb)m;{iy(2Ycb0p1ri#b)aK&3B0GJO124-um6WJG;y*1~da2F9e(etNHZ0Mx z-&w~#>9o=)PR?vNH^0bEpqOR5jsoz?3!MMSZbO2teI-c+d+}WWa`+u9oJ(=j+JM$Gf2a$mZ3B2MKZ)}w^p6aSylymsjB6}s_byt_E~6OCt)h> zE4IHf*$u6m@d_KMT6L?gp(Ren{d%Lj%2`|8M$<~uS_;fE=ccf)lTDtvK93m?fnzI* z>I#c$C!OILVcwjThwKYLdD;o+tMIolo$U`!m$2eHC=ezX>Txd_L~X zRZMu#_Tp@ODOw-q)x#NeLCED9+bO(iRKVUqhMrBBHJWZ7URM?L+5`*zNmI)mR_@y? zaeBs3ZUma|_hogC9mz;*&72CE^d~t;M4B!yX2_A8<(u<*e}od@b4nz3dOZ1EX2%UG z|GAVMyHaL{Xo@Gs-+GGwGSB_NOCCV^vzOLPMh;TvIkGD~i!PboI6Hz#^N?1e;Ocm# zCSIJf4u2F=Hc8o$Oqx&_nBVw$QL_w^csDEufoT-s0BO#^6JYxVPTMPxIDyxkfAPf( z#6#~G#Ij>fbfpX#iKh%eY`K*?%sU6*GvY0RhA}OJN{YDfU-TX7GH$!J2IB~v`=fK! zG6*j;I-CgPl`-C#kB9|<`fdf^E|H_KvDP^@+U_YTgw^|T=J`!_98 z)P2`&tJ9aW+1QvlH~%z*Z&JmCf_U>F&W-xK)Pi&mbi$&TDjmWDE(1C{xUSlgm_(mw z8b@L=zyf;#Jjw;K@YYZ=G?oh5FT6Fq__s2s48CKi)alfel$ShI4x=9>+rK4_3@igR3BObTPK>`b zcf3nr;b4?oLnS{L)n+b!Oh4hM(s@h!cP8XU+F*F}uTuFp+2{&>>v+!=_yKiI@*y0g zSK*M7Bf8w6+$NG9I$G{s7EM~^dsE%pOa=?4P};Fu+g-_66UtUh z{5~Yz8IYncPf>OZ(wXEER~Ft6yjRy1C}kDNHHDkY*T^d2pHUtklP{-Qa3?7gnVdh; zjQ4UxBqzBiqDkfCps~}%QhPr8{Dfas{j>@_sN`{#l=+{SMRuNp=jxnw$jM~QdbkDn z=d{9psvpKW|3r`%Cv(9;;z@RMsLe>Qd%#$VW@3<^&B7@%$vLiOSp~DLM+oc)EU@DQ zfgQkC5VIWz4fBuS8L^Eo?0+%n>!@wf%m7tQ+os|VwJx>VS5O<%=ptMW<d>e^vH{Ioxoz`;6=P(AL=NEUZ?xe^KgU~zMj$qvRykd^mlV< zWW6ANiOxcyy)UGEOFqG5=Y{#aZ&2H?ocSfHj?oI-VSWDQ@J-&9wGO95-8WTr?UQo# z^>%}=nbaGxKFuRNH}N%aZUE;IRj+7UU+PZ5sW884mR7QFU1tvQ1)WA0GcA(AmzvN} zsjRG7$x`Nt+@oJle@sM=~%Tw%}Av!=JW>B{mh;YZ_JPUdFh7*{k@9N~JzH!nC( zt;Uy_${c#!xv1Lh05@X}>U-6im~WuL`-Aq?xYVx>$GnZ58*3f$UDqLOS%k_asPu7tknnUeG*EN zi;l^LbdcVOK^s%jU|7rW;Y0{KVu^I?W~Q?T1hi#}S~IG4a-)>OeH(_QW{&rUl?z;_ zV}7Ov{IF6Dm#f>+G1(fAsbgaJE?94YsarW{s#MO4wvpFEt;~hPBt4Gy?y_MshMvgv zlC0T@`v3Gey+25X1wEGLh(7Vif$Vu&xm0lFaYBO)g%hEeb8bAh(JT0r#v|zRC7NO; zcQZ9biq@)+@HA!b8Ay00f8_lA*^%?P=}~=tU>3XbAzhA>_C z+eid&riE$3Cg_lzR;iB-c~UmzA@{MNRJ#Z+Z*{Y|;pz480VTc3v$;H|dwm_5w6#;& zlogUs2T2LerfeHUz&eE8r2$9G4uktxU6}LDD5V6N+VWwh3G>5WzJX zw6@VVyG=VRTK~B;WJn;IM&1yp@J*6f3&^Ruyk=RDlR)a_L##|(X*6|6h%M*!bguHF zk3Vj7p33e+I!aK7OTuHV~9i|m?Uf`wm-dY_th+}s}TWRe4LAA%G^p0&x_dBbA zN}`~u*NLn*OJ{ca+;bXrn;UV(uWMQN3iG z#ujous*0Xdaz^F&^+T04PWOTk_^4VSGDD|;j24Gjx7Oi*o7kZ@fZ?R5)KQ-8<(cw3 z3x0+ECco7I>bS{U6>5^bFUw3DW36hdZ$pxvQr3_ZA2(D&%N^jawA>-QSc5e+u0O!r zogAm!2g$sPdM@hiMrw>_Y2dIv(%6t$Q`Y*22G zmY3Uc+?Yqrou^8D2lMUqWYan2L>8{Aw6@ry5wBfB&oo`F1!+~ett|oUv{g{mTk5mr zTkEpcB>F6$Vlq|S^jTK;EkYn&w~w^;EVuP~jrIf(e>;s9W~v}Z6D(}81}ULxPOXD$ zDr12>$;L9{O5SkWPp#oyN({4&hD&P6j^ze2RO{SXeTzx_o@EYln*7Q~+Dr2dPOp+R zS^<2QZkL*TRhaMPtd8#yv95>KBlJqVo_`2gNI@5<$^HVhnQ?JTnsaX3od_oR%#R7$ zySNeVw}dAiPDjYyCe8UfHB!M>AFs>l&SKIN<2)0$_oMveoi;?wo;L#y+-NE(aJSxH=7NY7Yj zx_H5sLD8eh(}JvFO(rXQU+@UmS`8MlrT`z#>h2J-#uk2fLf?EkW=#B9O@gF`LqpwC z*unlY4#BchaBDm=olfL`dYp1s$aw7Hupv}9I0;}zwbRXl`{V?lobX3a`Y3CAj4n3Y zI)rY=4lH!L51THPw@?T$#6ppB`?8-QG%@Z-dn)#{C&N}dw(ElmW#POlb6BM7e@oRC zr|9@EBO4NXSFO#4(d#|JZc{=;$hkQ%{o^@C=ELr!g!D~Li_iX`AikB14pHS}XgY-v zxNrLZ%JlhB4e}PIk9e2RX=0q`Q%uCwX9HwdXFOOvAdJF;fn5MzDPwB76mqi!yvgU0 z=mSC`!x)(ve0dBj;Kj@e0HHkn`&iQr?vtMaF}_$r zVDc>W(|Y&wN{pqNsiEb>@OMf4S!Wu~?Kdo>?EjXDh+n`Aupv`}!$r&J{Z#ie9%Je8r0i!})`sDdk?`0(VT;?lM zd$0T9;XJl8D75F47dR1*HC7nwD~Wj5Hfd_HLz!To!R1%P>OAkt0mc?nH9KCRJS6BC zdCEu)CzagGJsc)%ZdmEy)bA$W{PFAFALL`~=gru#Wg>4*U}aRB=3nSPNZEA2WZSpc zlWF{l;Hz<&lEiYV{$`#^9(s9pp3F_y<0XyR8Yb4XhxNs`fb)w6UNom{JGxe>adw)| zG8Uhk;RE$rrs<)3E->tbUteJvDB>Wd8sF9eORTdr2?y!DmtudURx1 zv9|TFhd~+gg!c=p4l7YKNzSPYW9gsz_5f}Do^W9!t+z;7gniFpq%*!{-44D%Ex=FJL2$s=6m zFb~S_8|GOwipavqDE(aCHw8dL#o~TYaqF$Mhcf;0EKP)&e$vScEX{T(tPV9H;e(od zGP&ekRwX1We^cES_cxELT$LM9C5FdNs0)e(^oy;P1^Wgd2dHz)*}+<`qRnF__=d4K+kaKHGGr z?2A3ms;G|VvvX=r5^p$@oB%)dI`Z)>6Bm|M=6@>rVI@C8V$&MJiqEHC2enTx7`9YS zv7=^!=-5uX`N76jHvS0Yv-)ObuXIf{{W~S!P<3~ZSmW!zwrJa_Ocs0I5*jfmwjwmS zE*-I}MDO2P6AU%^q1p(gGxinHObdJ3f0gH1AwqnSLVLo$e@nxA4(vX)`-$DtyBm8R9SZ&zL^@bZ literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/windows_events.py b/.local/lib/python2.7/site-packages/trollius/windows_events.py new file mode 100644 index 00000000..3102d230 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/windows_events.py @@ -0,0 +1,777 @@ +"""Selector and proactor event loops for Windows.""" + +import errno +import math +import socket +import struct +import weakref + +from . import events +from . import base_subprocess +from . import futures +from . import proactor_events +from . import py33_winapi as _winapi +from . import selector_events +from . import tasks +from . import windows_utils +from . import _overlapped +from .coroutines import coroutine, From, Return +from .log import logger +from .py33_exceptions import wrap_error, BrokenPipeError, ConnectionResetError + + +__all__ = ['SelectorEventLoop', 'ProactorEventLoop', 'IocpProactor', + 'DefaultEventLoopPolicy', + ] + + +NULL = 0 +INFINITE = 0xffffffff +ERROR_CONNECTION_REFUSED = 1225 +ERROR_CONNECTION_ABORTED = 1236 + +# Initial delay in seconds for connect_pipe() before retrying to connect +CONNECT_PIPE_INIT_DELAY = 0.001 + +# Maximum delay in seconds for connect_pipe() before retrying to connect +CONNECT_PIPE_MAX_DELAY = 0.100 + + +class _OverlappedFuture(futures.Future): + """Subclass of Future which represents an overlapped operation. + + Cancelling it will immediately cancel the overlapped operation. + """ + + def __init__(self, ov, loop=None): + super(_OverlappedFuture, self).__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] + self._ov = ov + + def _repr_info(self): + info = super(_OverlappedFuture, self)._repr_info() + if self._ov is not None: + state = 'pending' if self._ov.pending else 'completed' + info.insert(1, 'overlapped=<%s, %#x>' % (state, self._ov.address)) + return info + + def _cancel_overlapped(self): + if self._ov is None: + return + try: + self._ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + self._ov = None + + def cancel(self): + self._cancel_overlapped() + return super(_OverlappedFuture, self).cancel() + + def set_exception(self, exception): + super(_OverlappedFuture, self).set_exception(exception) + self._cancel_overlapped() + + def set_result(self, result): + super(_OverlappedFuture, self).set_result(result) + self._ov = None + + +class _BaseWaitHandleFuture(futures.Future): + """Subclass of Future which represents a wait handle.""" + + def __init__(self, ov, handle, wait_handle, loop=None): + super(_BaseWaitHandleFuture, self).__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] + # Keep a reference to the Overlapped object to keep it alive until the + # wait is unregistered + self._ov = ov + self._handle = handle + self._wait_handle = wait_handle + + # Should we call UnregisterWaitEx() if the wait completes + # or is cancelled? + self._registered = True + + def _poll(self): + # non-blocking wait: use a timeout of 0 millisecond + return (_winapi.WaitForSingleObject(self._handle, 0) == + _winapi.WAIT_OBJECT_0) + + def _repr_info(self): + info = super(_BaseWaitHandleFuture, self)._repr_info() + info.append('handle=%#x' % self._handle) + if self._handle is not None: + state = 'signaled' if self._poll() else 'waiting' + info.append(state) + if self._wait_handle is not None: + info.append('wait_handle=%#x' % self._wait_handle) + return info + + def _unregister_wait_cb(self, fut): + # The wait was unregistered: it's not safe to destroy the Overlapped + # object + self._ov = None + + def _unregister_wait(self): + if not self._registered: + return + self._registered = False + + wait_handle = self._wait_handle + self._wait_handle = None + try: + _overlapped.UnregisterWait(wait_handle) + except OSError as exc: + if exc.winerror != _overlapped.ERROR_IO_PENDING: + context = { + 'message': 'Failed to unregister the wait handle', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + return + # ERROR_IO_PENDING means that the unregister is pending + + self._unregister_wait_cb(None) + + def cancel(self): + self._unregister_wait() + return super(_BaseWaitHandleFuture, self).cancel() + + def set_exception(self, exception): + self._unregister_wait() + super(_BaseWaitHandleFuture, self).set_exception(exception) + + def set_result(self, result): + self._unregister_wait() + super(_BaseWaitHandleFuture, self).set_result(result) + + +class _WaitCancelFuture(_BaseWaitHandleFuture): + """Subclass of Future which represents a wait for the cancellation of a + _WaitHandleFuture using an event. + """ + + def __init__(self, ov, event, wait_handle, loop=None): + super(_WaitCancelFuture, self).__init__(ov, event, wait_handle, + loop=loop) + + self._done_callback = None + + def cancel(self): + raise RuntimeError("_WaitCancelFuture must not be cancelled") + + def _schedule_callbacks(self): + super(_WaitCancelFuture, self)._schedule_callbacks() + if self._done_callback is not None: + self._done_callback(self) + + +class _WaitHandleFuture(_BaseWaitHandleFuture): + def __init__(self, ov, handle, wait_handle, proactor, loop=None): + super(_WaitHandleFuture, self).__init__(ov, handle, wait_handle, + loop=loop) + self._proactor = proactor + self._unregister_proactor = True + self._event = _overlapped.CreateEvent(None, True, False, None) + self._event_fut = None + + def _unregister_wait_cb(self, fut): + if self._event is not None: + _winapi.CloseHandle(self._event) + self._event = None + self._event_fut = None + + # If the wait was cancelled, the wait may never be signalled, so + # it's required to unregister it. Otherwise, IocpProactor.close() will + # wait forever for an event which will never come. + # + # If the IocpProactor already received the event, it's safe to call + # _unregister() because we kept a reference to the Overlapped object + # which is used as an unique key. + self._proactor._unregister(self._ov) + self._proactor = None + + super(_WaitHandleFuture, self)._unregister_wait_cb(fut) + + def _unregister_wait(self): + if not self._registered: + return + self._registered = False + + wait_handle = self._wait_handle + self._wait_handle = None + try: + _overlapped.UnregisterWaitEx(wait_handle, self._event) + except OSError as exc: + if exc.winerror != _overlapped.ERROR_IO_PENDING: + context = { + 'message': 'Failed to unregister the wait handle', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + return + # ERROR_IO_PENDING is not an error, the wait was unregistered + + self._event_fut = self._proactor._wait_cancel(self._event, + self._unregister_wait_cb) + + +class PipeServer(object): + """Class representing a pipe server. + + This is much like a bound, listening socket. + """ + def __init__(self, address): + self._address = address + self._free_instances = weakref.WeakSet() + # initialize the pipe attribute before calling _server_pipe_handle() + # because this function can raise an exception and the destructor calls + # the close() method + self._pipe = None + self._accept_pipe_future = None + self._pipe = self._server_pipe_handle(True) + + def _get_unconnected_pipe(self): + # Create new instance and return previous one. This ensures + # that (until the server is closed) there is always at least + # one pipe handle for address. Therefore if a client attempt + # to connect it will not fail with FileNotFoundError. + tmp, self._pipe = self._pipe, self._server_pipe_handle(False) + return tmp + + def _server_pipe_handle(self, first): + # Return a wrapper for a new pipe handle. + if self.closed(): + return None + flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED + if first: + flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE + h = wrap_error(_winapi.CreateNamedPipe, + self._address, flags, + _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | + _winapi.PIPE_WAIT, + _winapi.PIPE_UNLIMITED_INSTANCES, + windows_utils.BUFSIZE, windows_utils.BUFSIZE, + _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL) + pipe = windows_utils.PipeHandle(h) + self._free_instances.add(pipe) + return pipe + + def closed(self): + return (self._address is None) + + def close(self): + if self._accept_pipe_future is not None: + self._accept_pipe_future.cancel() + self._accept_pipe_future = None + # Close all instances which have not been connected to by a client. + if self._address is not None: + for pipe in self._free_instances: + pipe.close() + self._pipe = None + self._address = None + self._free_instances.clear() + + __del__ = close + + +class _WindowsSelectorEventLoop(selector_events.BaseSelectorEventLoop): + """Windows version of selector event loop.""" + + def _socketpair(self): + return windows_utils.socketpair() + + +class ProactorEventLoop(proactor_events.BaseProactorEventLoop): + """Windows version of proactor event loop using IOCP.""" + + def __init__(self, proactor=None): + if proactor is None: + proactor = IocpProactor() + super(ProactorEventLoop, self).__init__(proactor) + + def _socketpair(self): + return windows_utils.socketpair() + + @coroutine + def create_pipe_connection(self, protocol_factory, address): + f = self._proactor.connect_pipe(address) + pipe = yield From(f) + protocol = protocol_factory() + trans = self._make_duplex_pipe_transport(pipe, protocol, + extra={'addr': address}) + raise Return(trans, protocol) + + @coroutine + def start_serving_pipe(self, protocol_factory, address): + server = PipeServer(address) + + def loop_accept_pipe(f=None): + pipe = None + try: + if f: + pipe = f.result() + server._free_instances.discard(pipe) + + if server.closed(): + # A client connected before the server was closed: + # drop the client (close the pipe) and exit + pipe.close() + return + + protocol = protocol_factory() + self._make_duplex_pipe_transport( + pipe, protocol, extra={'addr': address}) + + pipe = server._get_unconnected_pipe() + if pipe is None: + return + + f = self._proactor.accept_pipe(pipe) + except OSError as exc: + if pipe and pipe.fileno() != -1: + self.call_exception_handler({ + 'message': 'Pipe accept failed', + 'exception': exc, + 'pipe': pipe, + }) + pipe.close() + elif self._debug: + logger.warning("Accept pipe failed on pipe %r", + pipe, exc_info=True) + except futures.CancelledError: + if pipe: + pipe.close() + else: + server._accept_pipe_future = f + f.add_done_callback(loop_accept_pipe) + + self.call_soon(loop_accept_pipe) + return [server] + + @coroutine + def _make_subprocess_transport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + extra=None, **kwargs): + waiter = futures.Future(loop=self) + transp = _WindowsSubprocessTransport(self, protocol, args, shell, + stdin, stdout, stderr, bufsize, + waiter=waiter, extra=extra, + **kwargs) + try: + yield From(waiter) + except Exception as exc: + # Workaround CPython bug #23353: using yield/yield-from in an + # except block of a generator doesn't clear properly sys.exc_info() + err = exc + else: + err = None + + if err is not None: + transp.close() + yield From(transp._wait()) + raise err + + raise Return(transp) + + +class IocpProactor(object): + """Proactor implementation using IOCP.""" + + def __init__(self, concurrency=0xffffffff): + self._loop = None + self._results = [] + self._iocp = _overlapped.CreateIoCompletionPort( + _overlapped.INVALID_HANDLE_VALUE, NULL, 0, concurrency) + self._cache = {} + self._registered = weakref.WeakSet() + self._unregistered = [] + self._stopped_serving = weakref.WeakSet() + + def __repr__(self): + return ('<%s overlapped#=%s result#=%s>' + % (self.__class__.__name__, len(self._cache), + len(self._results))) + + def set_loop(self, loop): + self._loop = loop + + def select(self, timeout=None): + if not self._results: + self._poll(timeout) + tmp = self._results + self._results = [] + return tmp + + def _result(self, value): + fut = futures.Future(loop=self._loop) + fut.set_result(value) + return fut + + def recv(self, conn, nbytes, flags=0): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + try: + if isinstance(conn, socket.socket): + wrap_error(ov.WSARecv, conn.fileno(), nbytes, flags) + else: + wrap_error(ov.ReadFile, conn.fileno(), nbytes) + except BrokenPipeError: + return self._result(b'') + + def finish_recv(trans, key, ov): + try: + return wrap_error(ov.getresult) + except WindowsError as exc: + if exc.winerror == _overlapped.ERROR_NETNAME_DELETED: + raise ConnectionResetError(*exc.args) + else: + raise + + return self._register(ov, conn, finish_recv) + + def send(self, conn, buf, flags=0): + self._register_with_iocp(conn) + ov = _overlapped.Overlapped(NULL) + if isinstance(conn, socket.socket): + ov.WSASend(conn.fileno(), buf, flags) + else: + ov.WriteFile(conn.fileno(), buf) + + def finish_send(trans, key, ov): + try: + return wrap_error(ov.getresult) + except WindowsError as exc: + if exc.winerror == _overlapped.ERROR_NETNAME_DELETED: + raise ConnectionResetError(*exc.args) + else: + raise + + return self._register(ov, conn, finish_send) + + def accept(self, listener): + self._register_with_iocp(listener) + conn = self._get_accept_socket(listener.family) + ov = _overlapped.Overlapped(NULL) + ov.AcceptEx(listener.fileno(), conn.fileno()) + + def finish_accept(trans, key, ov): + wrap_error(ov.getresult) + # Use SO_UPDATE_ACCEPT_CONTEXT so getsockname() etc work. + buf = struct.pack('@P', listener.fileno()) + conn.setsockopt(socket.SOL_SOCKET, + _overlapped.SO_UPDATE_ACCEPT_CONTEXT, buf) + conn.settimeout(listener.gettimeout()) + return conn, conn.getpeername() + + @coroutine + def accept_coro(future, conn): + # Coroutine closing the accept socket if the future is cancelled + try: + yield From(future) + except futures.CancelledError: + conn.close() + raise + + future = self._register(ov, listener, finish_accept) + coro = accept_coro(future, conn) + tasks.ensure_future(coro, loop=self._loop) + return future + + def connect(self, conn, address): + self._register_with_iocp(conn) + # The socket needs to be locally bound before we call ConnectEx(). + try: + _overlapped.BindLocal(conn.fileno(), conn.family) + except WindowsError as e: + if e.winerror != errno.WSAEINVAL: + raise + # Probably already locally bound; check using getsockname(). + if conn.getsockname()[1] == 0: + raise + ov = _overlapped.Overlapped(NULL) + ov.ConnectEx(conn.fileno(), address) + + def finish_connect(trans, key, ov): + wrap_error(ov.getresult) + # Use SO_UPDATE_CONNECT_CONTEXT so getsockname() etc work. + conn.setsockopt(socket.SOL_SOCKET, + _overlapped.SO_UPDATE_CONNECT_CONTEXT, 0) + return conn + + return self._register(ov, conn, finish_connect) + + def accept_pipe(self, pipe): + self._register_with_iocp(pipe) + ov = _overlapped.Overlapped(NULL) + connected = ov.ConnectNamedPipe(pipe.fileno()) + + if connected: + # ConnectNamePipe() failed with ERROR_PIPE_CONNECTED which means + # that the pipe is connected. There is no need to wait for the + # completion of the connection. + return self._result(pipe) + + def finish_accept_pipe(trans, key, ov): + wrap_error(ov.getresult) + return pipe + + return self._register(ov, pipe, finish_accept_pipe) + + @coroutine + def connect_pipe(self, address): + delay = CONNECT_PIPE_INIT_DELAY + while True: + # Unfortunately there is no way to do an overlapped connect to a pipe. + # Call CreateFile() in a loop until it doesn't fail with + # ERROR_PIPE_BUSY + try: + handle = wrap_error(_overlapped.ConnectPipe, address) + break + except WindowsError as exc: + if exc.winerror != _overlapped.ERROR_PIPE_BUSY: + raise + + # ConnectPipe() failed with ERROR_PIPE_BUSY: retry later + delay = min(delay * 2, CONNECT_PIPE_MAX_DELAY) + yield From(tasks.sleep(delay, loop=self._loop)) + + raise Return(windows_utils.PipeHandle(handle)) + + def wait_for_handle(self, handle, timeout=None): + """Wait for a handle. + + Return a Future object. The result of the future is True if the wait + completed, or False if the wait did not complete (on timeout). + """ + return self._wait_for_handle(handle, timeout, False) + + def _wait_cancel(self, event, done_callback): + fut = self._wait_for_handle(event, None, True) + # add_done_callback() cannot be used because the wait may only complete + # in IocpProactor.close(), while the event loop is not running. + fut._done_callback = done_callback + return fut + + def _wait_for_handle(self, handle, timeout, _is_cancel): + if timeout is None: + ms = _winapi.INFINITE + else: + # RegisterWaitForSingleObject() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + ms = int(math.ceil(timeout * 1e3)) + + # We only create ov so we can use ov.address as a key for the cache. + ov = _overlapped.Overlapped(NULL) + wait_handle = _overlapped.RegisterWaitWithQueue( + handle, self._iocp, ov.address, ms) + if _is_cancel: + f = _WaitCancelFuture(ov, handle, wait_handle, loop=self._loop) + else: + f = _WaitHandleFuture(ov, handle, wait_handle, self, + loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] + + def finish_wait_for_handle(trans, key, ov): + # Note that this second wait means that we should only use + # this with handles types where a successful wait has no + # effect. So events or processes are all right, but locks + # or semaphores are not. Also note if the handle is + # signalled and then quickly reset, then we may return + # False even though we have not timed out. + return f._poll() + + self._cache[ov.address] = (f, ov, 0, finish_wait_for_handle) + return f + + def _register_with_iocp(self, obj): + # To get notifications of finished ops on this objects sent to the + # completion port, were must register the handle. + if obj not in self._registered: + self._registered.add(obj) + _overlapped.CreateIoCompletionPort(obj.fileno(), self._iocp, 0, 0) + # XXX We could also use SetFileCompletionNotificationModes() + # to avoid sending notifications to completion port of ops + # that succeed immediately. + + def _register(self, ov, obj, callback): + # Return a future which will be set with the result of the + # operation when it completes. The future's value is actually + # the value returned by callback(). + f = _OverlappedFuture(ov, loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] + if not ov.pending: + # The operation has completed, so no need to postpone the + # work. We cannot take this short cut if we need the + # NumberOfBytes, CompletionKey values returned by + # PostQueuedCompletionStatus(). + try: + value = callback(None, None, ov) + except OSError as e: + f.set_exception(e) + else: + f.set_result(value) + # Even if GetOverlappedResult() was called, we have to wait for the + # notification of the completion in GetQueuedCompletionStatus(). + # Register the overlapped operation to keep a reference to the + # OVERLAPPED object, otherwise the memory is freed and Windows may + # read uninitialized memory. + + # Register the overlapped operation for later. Note that + # we only store obj to prevent it from being garbage + # collected too early. + self._cache[ov.address] = (f, ov, obj, callback) + return f + + def _unregister(self, ov): + """Unregister an overlapped object. + + Call this method when its future has been cancelled. The event can + already be signalled (pending in the proactor event queue). It is also + safe if the event is never signalled (because it was cancelled). + """ + self._unregistered.append(ov) + + def _get_accept_socket(self, family): + s = socket.socket(family) + s.settimeout(0) + return s + + def _poll(self, timeout=None): + if timeout is None: + ms = INFINITE + elif timeout < 0: + raise ValueError("negative timeout") + else: + # GetQueuedCompletionStatus() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + ms = int(math.ceil(timeout * 1e3)) + if ms >= INFINITE: + raise ValueError("timeout too big") + + while True: + status = _overlapped.GetQueuedCompletionStatus(self._iocp, ms) + if status is None: + break + ms = 0 + + err, transferred, key, address = status + try: + f, ov, obj, callback = self._cache.pop(address) + except KeyError: + if self._loop.get_debug(): + self._loop.call_exception_handler({ + 'message': ('GetQueuedCompletionStatus() returned an ' + 'unexpected event'), + 'status': ('err=%s transferred=%s key=%#x address=%#x' + % (err, transferred, key, address)), + }) + + # key is either zero, or it is used to return a pipe + # handle which should be closed to avoid a leak. + if key not in (0, _overlapped.INVALID_HANDLE_VALUE): + _winapi.CloseHandle(key) + continue + + if obj in self._stopped_serving: + f.cancel() + # Don't call the callback if _register() already read the result or + # if the overlapped has been cancelled + elif not f.done(): + try: + value = callback(transferred, key, ov) + except OSError as e: + f.set_exception(e) + self._results.append(f) + else: + f.set_result(value) + self._results.append(f) + + # Remove unregisted futures + for ov in self._unregistered: + self._cache.pop(ov.address, None) + del self._unregistered[:] + + def _stop_serving(self, obj): + # obj is a socket or pipe handle. It will be closed in + # BaseProactorEventLoop._stop_serving() which will make any + # pending operations fail quickly. + self._stopped_serving.add(obj) + + def close(self): + # Cancel remaining registered operations. + for address, (fut, ov, obj, callback) in list(self._cache.items()): + if fut.cancelled(): + # Nothing to do with cancelled futures + pass + elif isinstance(fut, _WaitCancelFuture): + # _WaitCancelFuture must not be cancelled + pass + else: + try: + fut.cancel() + except OSError as exc: + if self._loop is not None: + context = { + 'message': 'Cancelling a future failed', + 'exception': exc, + 'future': fut, + } + if fut._source_traceback: + context['source_traceback'] = fut._source_traceback + self._loop.call_exception_handler(context) + + while self._cache: + if not self._poll(1): + logger.debug('taking long time to close proactor') + + self._results = [] + if self._iocp is not None: + _winapi.CloseHandle(self._iocp) + self._iocp = None + + def __del__(self): + self.close() + + +class _WindowsSubprocessTransport(base_subprocess.BaseSubprocessTransport): + + def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): + self._proc = windows_utils.Popen( + args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, + bufsize=bufsize, **kwargs) + + def callback(f): + returncode = self._proc.poll() + self._process_exited(returncode) + + f = self._loop._proactor.wait_for_handle(int(self._proc._handle)) + f.add_done_callback(callback) + + +SelectorEventLoop = _WindowsSelectorEventLoop + + +class _WindowsDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): + _loop_factory = SelectorEventLoop + + +DefaultEventLoopPolicy = _WindowsDefaultEventLoopPolicy diff --git a/.local/lib/python2.7/site-packages/trollius/windows_events.pyc b/.local/lib/python2.7/site-packages/trollius/windows_events.pyc new file mode 100644 index 0000000000000000000000000000000000000000..081b27c8076b8c09ca03bc2bc338c7e35dcd8236 GIT binary patch literal 28072 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python2.7/site-packages/trollius/windows_utils.py b/.local/lib/python2.7/site-packages/trollius/windows_utils.py new file mode 100644 index 00000000..288d5478 --- /dev/null +++ b/.local/lib/python2.7/site-packages/trollius/windows_utils.py @@ -0,0 +1,238 @@ +""" +Various Windows specific bits and pieces +""" +from __future__ import absolute_import + +import sys + +if sys.platform != 'win32': # pragma: no cover + raise ImportError('win32 only') + +import itertools +import msvcrt +import os +import socket +import subprocess +import tempfile +import warnings + +import six + +from . import py33_winapi as _winapi +from . import compat +from .py33_exceptions import wrap_error, BlockingIOError, InterruptedError + + +__all__ = ['socketpair', 'pipe', 'Popen', 'PIPE', 'PipeHandle'] + + +# Constants/globals + + +BUFSIZE = 8192 +PIPE = subprocess.PIPE +STDOUT = subprocess.STDOUT +_mmap_counter = itertools.count() + + +if hasattr(socket, 'socketpair'): + # Since Python 3.5, socket.socketpair() is now also available on Windows + socketpair = socket.socketpair +else: + # Replacement for socket.socketpair() + def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): + """A socket pair usable as a self-pipe, for Windows. + + Origin: https://gist.github.com/4325783, by Geert Jansen. + Public domain. + """ + if family == socket.AF_INET: + host = '127.0.0.1' + elif family == socket.AF_INET6: + host = '::1' + else: + raise ValueError("Only AF_INET and AF_INET6 socket address " + "families are supported") + if type != socket.SOCK_STREAM: + raise ValueError("Only SOCK_STREAM socket type is supported") + if proto != 0: + raise ValueError("Only protocol zero is supported") + + # We create a connected TCP socket. Note the trick with setblocking(0) + # that prevents us from having to create a thread. + lsock = socket.socket(family, type, proto) + try: + lsock.bind((host, 0)) + lsock.listen(1) + # On IPv6, ignore flow_info and scope_id + addr, port = lsock.getsockname()[:2] + csock = socket.socket(family, type, proto) + try: + csock.setblocking(False) + try: + wrap_error(csock.connect, (addr, port)) + except (BlockingIOError, InterruptedError): + pass + csock.setblocking(True) + ssock, _ = lsock.accept() + except: + csock.close() + raise + finally: + lsock.close() + return (ssock, csock) + + +# Replacement for os.pipe() using handles instead of fds + + +def pipe(duplex=False, overlapped=(True, True), bufsize=BUFSIZE): + """Like os.pipe() but with overlapped support and using handles not fds.""" + address = tempfile.mktemp(prefix=r'\\.\pipe\python-pipe-%d-%d-' % + (os.getpid(), next(_mmap_counter))) + + if duplex: + openmode = _winapi.PIPE_ACCESS_DUPLEX + access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE + obsize, ibsize = bufsize, bufsize + else: + openmode = _winapi.PIPE_ACCESS_INBOUND + access = _winapi.GENERIC_WRITE + obsize, ibsize = 0, bufsize + + openmode |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE + + if overlapped[0]: + openmode |= _winapi.FILE_FLAG_OVERLAPPED + + if overlapped[1]: + flags_and_attribs = _winapi.FILE_FLAG_OVERLAPPED + else: + flags_and_attribs = 0 + + h1 = h2 = None + try: + h1 = _winapi.CreateNamedPipe( + address, openmode, _winapi.PIPE_WAIT, + 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL) + + h2 = _winapi.CreateFile( + address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING, + flags_and_attribs, _winapi.NULL) + + ov = _winapi.ConnectNamedPipe(h1, overlapped=True) + if hasattr(ov, 'GetOverlappedResult'): + # _winapi module of Python 3.3 + ov.GetOverlappedResult(True) + else: + # _overlapped module + wrap_error(ov.getresult, True) + return h1, h2 + except: + if h1 is not None: + _winapi.CloseHandle(h1) + if h2 is not None: + _winapi.CloseHandle(h2) + raise + + +# Wrapper for a pipe handle + + +class PipeHandle(object): + """Wrapper for an overlapped pipe handle which is vaguely file-object like. + + The IOCP event loop can use these instead of socket objects. + """ + def __init__(self, handle): + self._handle = handle + + def __repr__(self): + if self._handle is not None: + handle = 'handle=%r' % self._handle + else: + handle = 'closed' + return '<%s %s>' % (self.__class__.__name__, handle) + + @property + def handle(self): + return self._handle + + def fileno(self): + if self._handle is None: + raise ValueError("I/O operatioon on closed pipe") + return self._handle + + def close(self, CloseHandle=_winapi.CloseHandle): + if self._handle is not None: + CloseHandle(self._handle) + self._handle = None + + def __del__(self): + if self._handle is not None: + if six.PY3: + warnings.warn("unclosed %r" % self, ResourceWarning) + self.close() + + def __enter__(self): + return self + + def __exit__(self, t, v, tb): + self.close() + + +# Replacement for subprocess.Popen using overlapped pipe handles + + +class Popen(subprocess.Popen): + """Replacement for subprocess.Popen using overlapped pipe handles. + + The stdin, stdout, stderr are None or instances of PipeHandle. + """ + def __init__(self, args, stdin=None, stdout=None, stderr=None, **kwds): + assert not kwds.get('universal_newlines') + assert kwds.get('bufsize', 0) == 0 + stdin_rfd = stdout_wfd = stderr_wfd = None + stdin_wh = stdout_rh = stderr_rh = None + if stdin == PIPE: + stdin_rh, stdin_wh = pipe(overlapped=(False, True), duplex=True) + stdin_rfd = msvcrt.open_osfhandle(stdin_rh, os.O_RDONLY) + else: + stdin_rfd = stdin + if stdout == PIPE: + stdout_rh, stdout_wh = pipe(overlapped=(True, False)) + stdout_wfd = msvcrt.open_osfhandle(stdout_wh, 0) + else: + stdout_wfd = stdout + if stderr == PIPE: + stderr_rh, stderr_wh = pipe(overlapped=(True, False)) + stderr_wfd = msvcrt.open_osfhandle(stderr_wh, 0) + elif stderr == STDOUT: + stderr_wfd = stdout_wfd + else: + stderr_wfd = stderr + try: + super(Popen, self).__init__(args, + stdin=stdin_rfd, + stdout=stdout_wfd, + stderr=stderr_wfd, + **kwds) + except: + for h in (stdin_wh, stdout_rh, stderr_rh): + if h is not None: + _winapi.CloseHandle(h) + raise + else: + if stdin_wh is not None: + self.stdin = PipeHandle(stdin_wh) + if stdout_rh is not None: + self.stdout = PipeHandle(stdout_rh) + if stderr_rh is not None: + self.stderr = PipeHandle(stderr_rh) + finally: + if stdin == PIPE: + os.close(stdin_rfd) + if stdout == PIPE: + os.close(stdout_wfd) + if stderr == PIPE: + os.close(stderr_wfd) diff --git a/.local/lib/python2.7/site-packages/trollius/windows_utils.pyc b/.local/lib/python2.7/site-packages/trollius/windows_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3a4c4fe0cf29690715d1a5d0cfa1b931036ccd3 GIT binary patch literal 7570 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 +* Bob Ippolito +* ChangBo Guo +* Christoph Gohlke +* Denis Bilenko +* Dirk Mueller +* Donovan Preston +* Fantix King +* Floris Bruynooghe +* Fredrik Fornwall +* Gerd Woetzel +* Giel van Schijndel +* Gökhan Karabulut +* Gustavo Niemeyer +* Guy Rozendorn +* Hye-Shik Chang +* Jared Kuolt +* Jason Madden +* Josh Snyder +* Kyle Ambroff +* Laszlo Boszormenyi +* Mao Han +* Marc Abramowitz +* Marc Schlaich +* Marcin Bachry +* Matt Madison +* Matt Turner +* Michael Ellerman +* Michael Matz +* Ralf Schmitt +* Robie Basak +* Ronny Pfannschmidt +* Samual M. Rushing +* Tony Bowles +* Tony Breeds +* Trevor Bowen +* Tulio Magno Quites Machado Filho +* Ulrich Weigand +* Victor Stinner diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/INSTALLER b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE new file mode 100644 index 00000000..5e009e3c --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE @@ -0,0 +1,30 @@ +The following files are derived from Stackless Python and are subject to the +same license as Stackless Python: + + slp_platformselect.h + files in platform/ directory + +See LICENSE.PSF and http://www.stackless.com/ for details. + +Unless otherwise noted, the files in greenlet have been released under the +following MIT license: + +Copyright (c) Armin Rigo, Christian Tismer and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF new file mode 100644 index 00000000..d3b509a2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/LICENSE.PSF @@ -0,0 +1,47 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011 Python Software Foundation; All Rights Reserved" are retained in Python +alone or in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/METADATA b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/METADATA new file mode 100644 index 00000000..a656817d --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/METADATA @@ -0,0 +1,92 @@ +Metadata-Version: 2.1 +Name: greenlet +Version: 0.4.17 +Summary: Lightweight in-process concurrent programming +Home-page: https://github.com/python-greenlet/greenlet +Author: UNKNOWN +Author-email: UNKNOWN +License: MIT License +Platform: any +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.0 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +.. image:: https://secure.travis-ci.org/python-greenlet/greenlet.png + :target: http://travis-ci.org/python-greenlet/greenlet + +The greenlet package is a spin-off of Stackless, a version of CPython +that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other +words. This is useful when you want to control exactly when your code +runs. You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. Additionally, you don't need a "yield" keyword. See +the example in tests/test_generator.py. + +Greenlets are provided as a C extension module for the regular +unmodified interpreter. + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip or +easy_install:: + + pip install greenlet + easy_install greenlet + + +Source code archives and windows installers are available on the +python package index at https://pypi.python.org/pypi/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io + + diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/RECORD b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/RECORD new file mode 100644 index 00000000..2bc59154 --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/RECORD @@ -0,0 +1,10 @@ +../../../include/python3.9/greenlet/greenlet.h,sha256=lMxw5Z2sk1jjSXhqzBI13iCh4wQsv70PYnOVVam6kZI,4176 +greenlet-0.4.17.dist-info/AUTHORS,sha256=swW28t2knVRxRkaEQNZtO7MP9Sgnompb7B6cNgJM8Gk,849 +greenlet-0.4.17.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +greenlet-0.4.17.dist-info/LICENSE,sha256=u95V1UVqHpEmM-0_ZtHb2VBOPj3OT0wgFQQ83LxW5pc,1408 +greenlet-0.4.17.dist-info/LICENSE.PSF,sha256=5f88I8EQ5JTNfXNsEP2W1GJFe6_soxCEDbZScpjH1Gs,2424 +greenlet-0.4.17.dist-info/METADATA,sha256=1JfIvgi_IrGEShdtXql0SnoBTO20gM-UFaAskiMksOg,3378 +greenlet-0.4.17.dist-info/RECORD,, +greenlet-0.4.17.dist-info/WHEEL,sha256=MPzLoODanKXQG5ZYPOvHn6Z_wVzQEe1kTJVxw9nhrDM,108 +greenlet-0.4.17.dist-info/top_level.txt,sha256=YSnRsCRoO61JGlP57o8iKL6rdLWDWuiyKD8ekpWUsDc,9 +greenlet.cpython-39-x86_64-linux-gnu.so,sha256=drFnGAq74zn8aqMdsmGcmK2m87Rk5fYMGIvPDAWUFgE,112560 diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/WHEEL b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/WHEEL new file mode 100644 index 00000000..4c6672ae --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: false +Tag: cp39-cp39-manylinux1_x86_64 + diff --git a/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/top_level.txt b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/top_level.txt new file mode 100644 index 00000000..46725be4 --- /dev/null +++ b/.local/lib/python3.9/site-packages/greenlet-0.4.17.dist-info/top_level.txt @@ -0,0 +1 @@ +greenlet diff --git a/.local/lib/python3.9/site-packages/greenlet.cpython-39-x86_64-linux-gnu.so b/.local/lib/python3.9/site-packages/greenlet.cpython-39-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..9e3b09b1d5d26729d5e7a3600505f3fab5b7d4f5 GIT binary patch literal 112560 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 ZcC=N@<^|n_6V&AWg6>SRBWsqW{|AKSyxaf) literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/PKG-INFO b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/PKG-INFO new file mode 100644 index 00000000..4cc4ba1a --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: neovim +Version: 0.3.1 +Summary: Transition packgage for pynvim +Home-page: http://github.com/neovim/python-client +Author: Thiago de Arruda +Author-email: tpadilha84@gmail.com +License: Apache +Description: UNKNOWN +Platform: UNKNOWN diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/SOURCES.txt b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/SOURCES.txt new file mode 100644 index 00000000..c8c7e9f7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/SOURCES.txt @@ -0,0 +1,8 @@ +setup.cfg +setup.py +neovim.egg-info/PKG-INFO +neovim.egg-info/SOURCES.txt +neovim.egg-info/dependency_links.txt +neovim.egg-info/not-zip-safe +neovim.egg-info/requires.txt +neovim.egg-info/top_level.txt \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/dependency_links.txt b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/installed-files.txt b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/installed-files.txt new file mode 100644 index 00000000..b1be01d6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/installed-files.txt @@ -0,0 +1,6 @@ +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/not-zip-safe b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/requires.txt b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/requires.txt new file mode 100644 index 00000000..a7390439 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/requires.txt @@ -0,0 +1 @@ +pynvim>=0.3.1 diff --git a/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/top_level.txt b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/top_level.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim-0.3.1-py3.9.egg-info/top_level.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/neovim/__init__.py b/.local/lib/python3.9/site-packages/neovim/__init__.py new file mode 100644 index 00000000..31ce7c8f --- /dev/null +++ b/.local/lib/python3.9/site-packages/neovim/__init__.py @@ -0,0 +1,8 @@ +"""Python client for Nvim. + +This is a transition package. New projects should instead import pynvim package. +""" +import pynvim +from pynvim import * + +__all__ = pynvim.__all__ diff --git a/.local/lib/python3.9/site-packages/neovim/__pycache__/__init__.cpython-39.pyc b/.local/lib/python3.9/site-packages/neovim/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..385bae6790a4b623708f8a28cd2fa8445fff9321 GIT binary patch literal 332 zcmYjLK}y9i5KZ#Sw-o*rB-;u$f*S=97p{xoUv(2>6K!gmgd|n!iFD%uJW98&yn-vI zUlE6ydCc(U%@dnVfgs*rZulGE$1?m60>cGV+=nJngCv&3;06P(4BjGzd(sd|u2Gpi z_g7QuoTaVN$|ic}0<9nQP!+|t(~&|7nu4%VCk-?&+6Qs3Dq5>2>VxZ5n<9;!8;zve z#-s$`;9W@6PZpH^PKrhnqX7YBs8f~zetyE{giH9`3tVR z^?_b)&dK4vj##ZS1o8TG!(V{kCh+O>)`F7&E9IAXbRl`zccE%QUHojuHt8TeKEKW+oF%7GOI#~J6^>d1NShjDq* SI@ud_ieY(}1ElE=UXoAFoMn>$ literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/PKG-INFO b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/PKG-INFO new file mode 100644 index 00000000..8215e2a4 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/PKG-INFO @@ -0,0 +1,13 @@ +Metadata-Version: 2.1 +Name: pynvim +Version: 0.4.2 +Summary: Python client to neovim +Home-page: http://github.com/neovim/pynvim +Author: Thiago de Arruda +Author-email: tpadilha84@gmail.com +License: Apache +Download-URL: https://github.com/neovim/pynvim/archive/0.4.2.tar.gz +Description: UNKNOWN +Platform: UNKNOWN +Provides-Extra: pyuv +Provides-Extra: test diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/SOURCES.txt b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/SOURCES.txt new file mode 100644 index 00000000..995a2f20 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/SOURCES.txt @@ -0,0 +1,45 @@ +LICENSE +MANIFEST.in +README.md +setup.cfg +setup.py +neovim/__init__.py +neovim/api/__init__.py +pynvim/__init__.py +pynvim/compat.py +pynvim/util.py +pynvim.egg-info/PKG-INFO +pynvim.egg-info/SOURCES.txt +pynvim.egg-info/dependency_links.txt +pynvim.egg-info/not-zip-safe +pynvim.egg-info/requires.txt +pynvim.egg-info/top_level.txt +pynvim/api/__init__.py +pynvim/api/buffer.py +pynvim/api/common.py +pynvim/api/nvim.py +pynvim/api/tabpage.py +pynvim/api/window.py +pynvim/msgpack_rpc/__init__.py +pynvim/msgpack_rpc/async_session.py +pynvim/msgpack_rpc/msgpack_stream.py +pynvim/msgpack_rpc/session.py +pynvim/msgpack_rpc/event_loop/__init__.py +pynvim/msgpack_rpc/event_loop/asyncio.py +pynvim/msgpack_rpc/event_loop/base.py +pynvim/msgpack_rpc/event_loop/uv.py +pynvim/plugin/__init__.py +pynvim/plugin/decorators.py +pynvim/plugin/host.py +pynvim/plugin/script_host.py +test/conftest.py +test/test_buffer.py +test/test_client_rpc.py +test/test_concurrency.py +test/test_decorators.py +test/test_events.py +test/test_host.py +test/test_logging.py +test/test_tabpage.py +test/test_vim.py +test/test_window.py \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/dependency_links.txt b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/installed-files.txt b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/installed-files.txt new file mode 100644 index 00000000..b366f559 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/installed-files.txt @@ -0,0 +1,52 @@ +../neovim/__init__.py +../neovim/__pycache__/__init__.cpython-39.pyc +../neovim/api/__init__.py +../neovim/api/__pycache__/__init__.cpython-39.pyc +../pynvim/__init__.py +../pynvim/__pycache__/__init__.cpython-39.pyc +../pynvim/__pycache__/compat.cpython-39.pyc +../pynvim/__pycache__/util.cpython-39.pyc +../pynvim/api/__init__.py +../pynvim/api/__pycache__/__init__.cpython-39.pyc +../pynvim/api/__pycache__/buffer.cpython-39.pyc +../pynvim/api/__pycache__/common.cpython-39.pyc +../pynvim/api/__pycache__/nvim.cpython-39.pyc +../pynvim/api/__pycache__/tabpage.cpython-39.pyc +../pynvim/api/__pycache__/window.cpython-39.pyc +../pynvim/api/buffer.py +../pynvim/api/common.py +../pynvim/api/nvim.py +../pynvim/api/tabpage.py +../pynvim/api/window.py +../pynvim/compat.py +../pynvim/msgpack_rpc/__init__.py +../pynvim/msgpack_rpc/__pycache__/__init__.cpython-39.pyc +../pynvim/msgpack_rpc/__pycache__/async_session.cpython-39.pyc +../pynvim/msgpack_rpc/__pycache__/msgpack_stream.cpython-39.pyc +../pynvim/msgpack_rpc/__pycache__/session.cpython-39.pyc +../pynvim/msgpack_rpc/async_session.py +../pynvim/msgpack_rpc/event_loop/__init__.py +../pynvim/msgpack_rpc/event_loop/__pycache__/__init__.cpython-39.pyc +../pynvim/msgpack_rpc/event_loop/__pycache__/asyncio.cpython-39.pyc +../pynvim/msgpack_rpc/event_loop/__pycache__/base.cpython-39.pyc +../pynvim/msgpack_rpc/event_loop/__pycache__/uv.cpython-39.pyc +../pynvim/msgpack_rpc/event_loop/asyncio.py +../pynvim/msgpack_rpc/event_loop/base.py +../pynvim/msgpack_rpc/event_loop/uv.py +../pynvim/msgpack_rpc/msgpack_stream.py +../pynvim/msgpack_rpc/session.py +../pynvim/plugin/__init__.py +../pynvim/plugin/__pycache__/__init__.cpython-39.pyc +../pynvim/plugin/__pycache__/decorators.cpython-39.pyc +../pynvim/plugin/__pycache__/host.cpython-39.pyc +../pynvim/plugin/__pycache__/script_host.cpython-39.pyc +../pynvim/plugin/decorators.py +../pynvim/plugin/host.py +../pynvim/plugin/script_host.py +../pynvim/util.py +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/not-zip-safe b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/requires.txt b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/requires.txt new file mode 100644 index 00000000..8a685cc6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/requires.txt @@ -0,0 +1,8 @@ +msgpack>=0.5.0 +greenlet + +[pyuv] +pyuv>=1.0.0 + +[test] +pytest>=3.4.0 diff --git a/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/top_level.txt b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/top_level.txt new file mode 100644 index 00000000..e6bb79fa --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim-0.4.2-py3.9.egg-info/top_level.txt @@ -0,0 +1,2 @@ +neovim +pynvim diff --git a/.local/lib/python3.9/site-packages/pynvim/__init__.py b/.local/lib/python3.9/site-packages/pynvim/__init__.py new file mode 100644 index 00000000..17967ce2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/__init__.py @@ -0,0 +1,156 @@ +"""Python client for Nvim. + +Client library for talking with Nvim processes via its msgpack-rpc API. +""" +import logging +import os +import sys + +from pynvim.api import Nvim, NvimError +from pynvim.compat import IS_PYTHON3 +from pynvim.msgpack_rpc import (ErrorResponse, child_session, socket_session, + stdio_session, tcp_session) +from pynvim.plugin import (Host, autocmd, command, decode, encoding, function, + plugin, rpc_export, shutdown_hook) +from pynvim.util import VERSION, Version + + +__all__ = ('tcp_session', 'socket_session', 'stdio_session', 'child_session', + 'start_host', 'autocmd', 'command', 'encoding', 'decode', + 'function', 'plugin', 'rpc_export', 'Host', 'Nvim', 'NvimError', + 'Version', 'VERSION', 'shutdown_hook', 'attach', 'setup_logging', + 'ErrorResponse') + + +def start_host(session=None): + """Promote the current process into python plugin host for Nvim. + + Start msgpack-rpc event loop for `session`, listening for Nvim requests + and notifications. It registers Nvim commands for loading/unloading + python plugins. + + The sys.stdout and sys.stderr streams are redirected to Nvim through + `session`. That means print statements probably won't work as expected + while this function doesn't return. + + This function is normally called at program startup and could have been + defined as a separate executable. It is exposed as a library function for + testing purposes only. + """ + plugins = [] + for arg in sys.argv: + _, ext = os.path.splitext(arg) + if ext == '.py': + plugins.append(arg) + elif os.path.isdir(arg): + init = os.path.join(arg, '__init__.py') + if os.path.isfile(init): + plugins.append(arg) + + # This is a special case to support the old workaround of + # adding an empty .py file to make a package directory + # visible, and it should be removed soon. + for path in list(plugins): + dup = path + ".py" + if os.path.isdir(path) and dup in plugins: + plugins.remove(dup) + + # Special case: the legacy scripthost receives a single relative filename + # while the rplugin host will receive absolute paths. + if plugins == ["script_host.py"]: + name = "script" + else: + name = "rplugin" + + setup_logging(name) + + if not session: + session = stdio_session() + nvim = Nvim.from_session(session) + + if nvim.version.api_level < 1: + sys.stderr.write("This version of pynvim " + "requires nvim 0.1.6 or later") + sys.exit(1) + + host = Host(nvim) + host.start(plugins) + + +def attach(session_type, address=None, port=None, + path=None, argv=None, decode=None): + """Provide a nicer interface to create python api sessions. + + Previous machinery to create python api sessions is still there. This only + creates a facade function to make things easier for the most usual cases. + Thus, instead of: + from pynvim import socket_session, Nvim + session = tcp_session(address=
, port=) + nvim = Nvim.from_session(session) + You can now do: + from pynvim import attach + nvim = attach('tcp', address=
, port=) + And also: + nvim = attach('socket', path=) + nvim = attach('child', argv=) + nvim = attach('stdio') + + When the session is not needed anymore, it is recommended to explicitly + close it: + nvim.close() + It is also possible to use the session as a context mangager: + with attach('socket', path=thepath) as nvim: + print(nvim.funcs.getpid()) + print(nvim.current.line) + This will automatically close the session when you're done with it, or + when an error occured. + + + """ + session = (tcp_session(address, port) if session_type == 'tcp' else + socket_session(path) if session_type == 'socket' else + stdio_session() if session_type == 'stdio' else + child_session(argv) if session_type == 'child' else + None) + + if not session: + raise Exception('Unknown session type "%s"' % session_type) + + if decode is None: + decode = IS_PYTHON3 + + return Nvim.from_session(session).with_decode(decode) + + +def setup_logging(name): + """Setup logging according to environment variables.""" + logger = logging.getLogger(__name__) + if 'NVIM_PYTHON_LOG_FILE' in os.environ: + prefix = os.environ['NVIM_PYTHON_LOG_FILE'].strip() + major_version = sys.version_info[0] + logfile = '{}_py{}_{}'.format(prefix, major_version, name) + handler = logging.FileHandler(logfile, 'w', 'utf-8') + handler.formatter = logging.Formatter( + '%(asctime)s [%(levelname)s @ ' + '%(filename)s:%(funcName)s:%(lineno)s] %(process)s - %(message)s') + logging.root.addHandler(handler) + level = logging.INFO + env_log_level = os.environ.get('NVIM_PYTHON_LOG_LEVEL', None) + if env_log_level is not None: + lvl = getattr(logging, env_log_level.strip(), None) + if isinstance(lvl, int): + level = lvl + else: + logger.warning('Invalid NVIM_PYTHON_LOG_LEVEL: %r, using INFO.', + env_log_level) + logger.setLevel(level) + + +# Required for python 2.6 +class NullHandler(logging.Handler): + def emit(self, record): + pass + + +if not logging.root.handlers: + logging.root.addHandler(NullHandler()) diff --git a/.local/lib/python3.9/site-packages/pynvim/__pycache__/__init__.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c351859766e72d3e118b949c419831e34b81759f GIT binary patch literal 4935 zcma)AOLN@D5eBeWU>Dq_DC%YT6<7&N+=N=nRw{NJ%cYbp*{o71m8B>#Vh4gS!zD;O z)-$uDNMkRde?xM~fx0=zj8E}DUK`H+5zU((>>Gu^#?@# zzGvWi^N$b1zn(LUe^BM*)kft8{_^iAm=PGvWL9bhroLN&rSGkvg?lTtvv$zVoWL<@ zoSnK^C+O(scG}Inz{?hbg{&9!vVPFd7K26I=cK2yrC=#L9h}aVgXQc@a3(t&oXyS! z=d$y``Rqb)A$uWsL63FQi`k38i`h%TOQ?5(m)U97W!@KN@CsXI3#^ByS6QDeeqjXP z`M_YO*wPmUTjJ)9f7A+I!~N3Ecje#ce*8WD+L7_ZgdFRhF*tJ=-91p-MefIG!gJ+s z6~f=#OR}Noy;rxS$s-Yo1Kp#dbT`RI{(hpi^)P=dikM5urN5U%exjtG$o8{b3P+Q##DN zU`*Xcii5Ff>6Yf6fxCI^m9Aa|�~wZCNcw3FMcJ?*H4vU3C-N<;od^^T0Gq58** zCA@XoExS9Xc9xj4Ylwfsp3}$6OiNP6@fn6yOhcV5yGQ2KE4|}$rKvr<0}t;;zs9cK z6-8Dk?yGI?#}gsQ)f?CKlUx=4xQ>F_0em{NlcC__x<|+PjCb=r5|b9iSdV?!IO@YS zKTV|KIYr7Wo_xVSn{cV5N3!6EeqN|#D~TiWJUR3?6o!mwo{)8DH6AOqjI@ZzS=T3d z^Q7fGqqRiLlJNVmQ69)4!lRfdy;f7@Liq4T9%a&x1jm9b5j<9$`Pc%AOKgxRCZlaF zXl~FDG9%c|qg-O!uwf7rDW1W8YA7B>kJ1BwzsN5ulw#M9q>uQ~qP3`fL^ADu0&ALR z^I5?qO%QNtk?iBoQ<2q-AqlKpq8d^dUT@WiJ;-qFY@$YsJjkZ z!|}o4LKr4_qQa0Wi!v6;xDJ2RE2pjpuBct?D~j5~YxikK_G%pQi!HcePNzW5f|G&u zRJ%HSefT3Ez??#Vu{k(jwQ!)79f{FiWfgcDM{2w3$Z?t|{#XGm#$yhwYbO#1T-iGX zK+Q?y77n4Z$vG=W@T|bX7obKBT7*4SZwrAkL($4@Gz+@XI0;kudkRAogCAAxeSyU) zn?FvJ2Cu5E&ttGqxlJGhZf&cqT2Qqz!>UEv*|baI6nBb^Ai*0K z@t1F)FizQ~XD*o?vxnazmF*sCXU(4NnT};!9m_Ty)3eZHc~-~N^J7Bv*+n={7_BjO zjE53=A4s;WjM6NvBP+j(77Hzxlv%cp%-l!4h5A)x9U1vDYBp*&RI9YnYXSR!oASQ0 znNu3)jU)3nX4z)#i6I`UHgMNDc1vK~vBq9tnj2lTHKy$)jKjC{B<6x}jEk)(Mw}IX zj3|e*Hvoa-LjdSBIzx%Og6}281o;|y1z~~=|E<$}I4S}lO$kE zXb?fGd6+|L7VYZb&qoNhNG4F0aFM_`Bcz?kNt7bMp<*3S_qQi<4F&-XBZjzmTdzUj zM*caAk|d)H?LSKk)-;aI$2V5{*ZmXpU^QY4(Iv0H(>%Pp=98%F?@;;fU_M)i-*qi< zcrr3p8?p7skBbSE&jD5Y0JU$`wNB&D%dcBkFGI!4YySVE+)t4}qEwz(tWk9)s@@bx zBWQqKDF558*$vC<5gpK=;9o3{L<3H!9K2gT$vk~AxFUK8#_tsx6&=g|Y; zazJ7PQW0Y@&X7WNXV8Kp0jM=y4gkxb$yHk)^5)^ipXa-9)O@~O>R`lj0FLQHA67cbF#O@4nsPXzLH z@k4q#kK!)=k{*m#mjTm@_*?(B92;QVF>Onad4}*3^PUslKcfOdXeyA`DPGo8YsUuh z{1e@odC@p-KQTapogJ517maC)wE(GB*#gA`8OF>m2r;NAYHid!B9>)4Tma$h9rua& zf@T^!i&KXr9-m?^>wp-$CGHbbe5sa@0$f^!b&gsfw5Q9CT0XMG@5|2A$$KEcXIK{$ z*aFElkIxdQ(+eFS-8+2!9#MPHNloqjD2@w3luw5W{7w`(@hyKZ5(%*vISkHjKG^tK z^ZpdxzVktNYvcA!p_zsE`7|6Kp!j@Rnfr(BiQ2mI*5M~BtC7UJPR0k)|JBN>PU)0> zQN7`>tP(+}t8b$MH{aBKsE`-u#Xx?FQ4Mj%oGYkh08&KQKnCZYSLgQ42RCnT9u7D1 zy(mqX|Bd}``zvA%K}@D@Y~H#v9Gt7%W*4e1qU<(ygo~;ZhNM~;ikETBmCNfrA=&|^ zC0?Y)UPD+w#I}mcL6Sj~RSUOZ)`#HSDa3Sd=|-f=s$2Kdqb-U;RUUkHHqItpsutF- zTogbIQF#fp1k1@|UbT>JD|bH_tNL%gecn-f4Pdnusjf&Mg3niZPWVNY4t#07C~y3 z(CSzY+7LN3E2ar2FXDVR@R#(u$qjtqFzSyR_>h3;fM43x!saARn_Y=%!tA1F@-@wa z2pX7y3FfBOmtOZJPq&C@k|RH71bAbXsNZ3d)FREpr4!2xsdIB+i|ZIrd106pY?9*W zt6ms>2CmRJ!UJ@l5UlY;L&-gK{B|ZB9FFSHY|!4MYp_zeVaSRYzVs6kK@O!IDDY|m zIRs&P`Z6B$n^vSRBnSzDr%-vS7r<^pOyT)*o-{U)FhQGXbC z?wbI;`UeZmLKBd$`ilS^7FmGg0Sk!VYFyMuT)E9rX`97O8ro@mOp04H_9^VnH>~Qs qQ*ZIRbfEGQ3fu0$g*w&}IP%NZnzhujUGGgC_}AW*&c)?+$NUdgvy@u^ literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/__pycache__/compat.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/__pycache__/compat.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..649cde0697938f31c9871ac4052146bc2da9cf9e GIT binary patch literal 1443 zcmZWp-EJc_6t-t3lVqCiqVglSvx>xSR*;}AViyUaLKlg>pj4yaC-z`_ zT2iGqERVngw3l4+I+nQNYF~j1#IYy4D&WY+_Q^N)Ip_QAe0w_~*dF};L-un_$e(U; zvxT_W$F9Fe!%0dwc=1ra15((8KoUcfIf|RblOR~&{g}q!{c8_8bL4Z^KP1m z9(2-(_tFG<(1)#Am=1WKCy3eR!GsLAE=C8E1Di?33c0LvQ%=jOG%J=DN@~rHR%Rgu zI|HRlDfH+$#zYQ>)Naj6!Lz00O$Ec?xeHoRG)3SLn-<~N!G3^U*Jun`6GNW`YG+NZ zf@^Z=Jk)#MSyS(!V&D5hM9t>pGFa0`xIM^5RjG}Q zU7&*7*Q6@vrO2!7#*xFw_GV30iF^q*Lf#g(E8x7HKm{($--x<}HUI0g@j@+O3e*N!0QUC% z2OkVap4-QU>4iK;sW3!~Qq0*Bw8omYXa7GsJhsumnUPFL18$*oyV;@b_*gGK-1Xxw z%Z*Xxv_Tkt#-YZdVww4fooHY!DBH!6wPa>HMfx`yHzZpIL$oz9y;_68WQ)Af7b&V{2fI}px#37@Rsdn8J9(t z*-)>vdKH~E#CzwZqWW$**gP&-DP}TF9#68PC&yoWb-0H>Vem3YF;CxU+8dMsYD?*C z6P)eLDw&(Ke|Yj`cKqb%^NBzAM$GO8C?9z5jq}kGu=GmTK@6Gpp?>WABu}h$R@#nA6J%^CL z@ME>P@bLh;dI*M-KH-$JjP@x!t&GjAzC{V&;5K)TY2W^yaF=_>gnLJ<@9+*^J0^Ws zIIz0QFYtAK@prrLarT%5mlj)($FUULpX)SB^?^T}=ZQ{>T!pW|8QBe}xjZc7EY^{D zo`@3X5{6T!4TJNb??6{yfzjlIF3B%e&1$Q*HLJ)G{gyoK)=p(lU}WzKrzf^{DppyQ zUC|?ZNl)A*fpFMj`(Zj2zLs$!25~YC&t3b2x%T5ME1vmknwDjnk9<8A{xFqF`$HMe zgbED_JY%T?WjYXTl;*?2I5N&h!gzWR<>I+E_M}L2iB~W#Y?WylxW>jajgzIbR2xU= zgHjl4Kh6x(14Gl7L|%ps|2*i8i<#(63N;t<&b?lk6-k`+vUJcZ5A?Xm?}lIYRI0`8 z5~7bsLcw^xpU!%SZ&)6fOXoL=&?iEtI$#LfpzE|lM!!HICk?3$YV5SpAJWX^I8FyZCSO{ab z64}tW(`T_9sRqy1yaOI^Lz<_s;azl!5fHYxe0p+tHu*-F7$T|4a(P1-wrHs}oS)k}fd?oJH_R=()^&(1I^TDTNZbj#21-FtIk+6`hbNvOpKtcg7-_`swgon95fWnjb5_0GY`!pr>H9K|0Oo z|Apj6k=To(57Eu3j5f~U!l~WBlOMyh=|<74;PVV_Z`Pw|ZyskY7RCel772iI71qg5 z(cD0T$*^J&4~c@s@g|Eq)Mg#K<2IuSD)X#CVJFy|``>~WsDeb(3FB-FuvkL18wZyDm ztbGH;2-0-_v&Gd>s>ky|m=v>KE($D6ZG8d(dRdx?T#3H-OboDw1x_OrX~Q9AeZMUi zZB6x_eD~<_k3a9Wd^n(&H0Q=aMMeD!GXbTLN2(Nwu@TXJH`Y*Sp@NII693Xj=%@|8 zIr}@l#&hatS|OeuH+u z8A*RbcC4+c>w#PN*g`Hx!6Z}8LIMZA8<<%McFRQcxq&!%Fl4k)+FkIh%-F;A6|xhMVZOziqhof;4n*Aeg)D$gi=bbO(Z;)q zYvK`iEChV#it0mCn7L0h;VYRkND(9tG7FMTTBw-4oFXzUjuJ8?<`ezUwS^Z1wn0te+1goj*s1F<0DS+>Xbod@nWK3--ZZCSYqX NSzag4{Zl9P>>o<=s_y^* literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/buffer.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/buffer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffac41bd52b6d2075433594d2f49e26c2abc731e GIT binary patch literal 7645 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 V*%pvuEZdIln2uekEdS0}{y$^i5PARr literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/common.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/common.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..657e6289824ccef038091f67ea20e62ac625f89a GIT binary patch literal 8031 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/nvim.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/nvim.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d90ba9b9703ac05b01d178e432e540594d6ae330 GIT binary patch literal 21678 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/tabpage.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/api/__pycache__/tabpage.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f61e48fdec113c72f998f0149688fbfc1baec5d GIT binary patch literal 1552 zcmb7DzmMBC6ecBE{&DB)B}gtq7Xn>sppk=iXbTiUk`9+!4n=Z60WLgQqsjyLw7$)Gh;{(~S>A1T|l3v>tpK0Wz8KYseYkLhqYK(K!N`<#6W5&Ga> zwpRo%PhgwxAaFzx$2`b!5zwFrX^0UIX>^Qu#KRlNMQ|O`4)44~qj>Sn)89_WRB3Xh z^eb7;$d$Ag&vt95oE$oZ!8 z9R5_=RF(!NX+Jo%Zk{YbhN8_iP%E|IPMOV|!py2Pd-YIP8OhQ-Hwihhq^ON06R`!r zsrjs)PK72g29Vo1vC0daY=+UJ9h!1!EV}|wr=w2OF?A)hXSwMyCV>FPv?Gpop@*w0 z18#_n$fr$|>Y2I4O`owWPmN*h7JWV*U#LQiFO{iBrWS)xBd z(7!N987#g(7M572#_#?sK#E#xQQCYCL}#@D!a)evvBp5}?a(w6o~2u`sgp<;dyBPm zliu5eeaM=)<>?4=<6MWr#laeRTlxar-@XvG)+IU9HRwFu21tyRc}~O|(9b0F{tjAc z*lUoVYe%6zaN$2NJHGxkRMsemYm~n71t1@+$z4%L%DR{cozMq6m>h#`<^NH|Z3EeY zwIQ!9jrN=|%d`-TH3P;9#p~SV`;0luuPR-}xXKu#dkl=lDlMk+jW<=(tF!`>+qwSA z@p9_@IN(8`&Tp; ziv^7nc=#Qth~{ZTCq|@?4A0OtVtVEijabBd2R1d{nw~}MXIjUZ-g^A|Z)lJ(G)~yd zFg`=$FdL%N*Wn1Pm?UHFet;RZj$SxV=_tu);rtfkmjsqlMT|6NRu`JY0p|V*(6&M z*?^h1$&R#JVDFMWX}7`NCkN8r1p6BKO4?iGI*4${1oP>^W5lF`i{86lBL*!nXn_MA zhE+w_;8Onwf^?u3+1Il_R$Qh$?7EMr}3YkgB)5xDt zg8CCVQmO5F+q3n~Xomaw;6nFmjK0b#&o1=B;xrmuXbkp%_VL&5Fd5PAi-hNt-TkiX zMoHjD-6-sL(@8c=;`{EyE)O$$och5_|BQ0z7xQ=hH0+iurjx>fWq{?T@Wp^iGpB78 zWLF_;xc+_R`W=>xk5G_A9hBv1MAgm`qLf;QH;0{Fytg;a?4mH@`=Je6sW60X{oRTAy#K$~f zl*VO>pPfLl^*chNGCQGwMiF<5gG*vn=aq>ZxLPz5Cc8K1J8hPdLHGZ{U1pjq+}RdT z`0xd$@aZ?7U<%!}_DUHF3)5AUrSXDN9nyvI%Rz3Nob^4jkr;GL^{W5#AQquBgN< z#r8#YAgcLQCM|KF$$ufj;18gx8y5Twy=jTZTJf%M^*-&`>=3^7cGNBJ0$(>sMx!KV h;`%GV6+enFmP>t#Ls9=hsqmvXF self.end: + index = self.end + return index diff --git a/.local/lib/python3.9/site-packages/pynvim/api/common.py b/.local/lib/python3.9/site-packages/pynvim/api/common.py new file mode 100644 index 00000000..21f5b2da --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/api/common.py @@ -0,0 +1,205 @@ +"""Code shared between the API classes.""" +import functools + +from msgpack import unpackb + +from pynvim.compat import unicode_errors_default + +__all__ = () + + +class NvimError(Exception): + pass + + +class Remote(object): + + """Base class for Nvim objects(buffer/window/tabpage). + + Each type of object has it's own specialized class with API wrappers around + the msgpack-rpc session. This implements equality which takes the remote + object handle into consideration. + """ + + def __init__(self, session, code_data): + """Initialize from session and code_data immutable object. + + The `code_data` contains serialization information required for + msgpack-rpc calls. It must be immutable for Buffer equality to work. + """ + self._session = session + self.code_data = code_data + self.handle = unpackb(code_data[1]) + self.api = RemoteApi(self, self._api_prefix) + self.vars = RemoteMap(self, self._api_prefix + 'get_var', + self._api_prefix + 'set_var', + self._api_prefix + 'del_var') + self.options = RemoteMap(self, self._api_prefix + 'get_option', + self._api_prefix + 'set_option') + + def __repr__(self): + """Get text representation of the object.""" + return '<%s(handle=%r)>' % ( + self.__class__.__name__, + self.handle, + ) + + def __eq__(self, other): + """Return True if `self` and `other` are the same object.""" + return (hasattr(other, 'code_data') + and other.code_data == self.code_data) + + def __hash__(self): + """Return hash based on remote object id.""" + return self.code_data.__hash__() + + def request(self, name, *args, **kwargs): + """Wrapper for nvim.request.""" + return self._session.request(name, self, *args, **kwargs) + + +class RemoteApi(object): + + """Wrapper to allow api methods to be called like python methods.""" + + def __init__(self, obj, api_prefix): + """Initialize a RemoteApi with object and api prefix.""" + self._obj = obj + self._api_prefix = api_prefix + + def __getattr__(self, name): + """Return wrapper to named api method.""" + return functools.partial(self._obj.request, self._api_prefix + name) + + +def transform_keyerror(exc): + if isinstance(exc, NvimError): + if exc.args[0].startswith('Key not found:'): + return KeyError(exc.args[0]) + if exc.args[0].startswith('Invalid option name:'): + return KeyError(exc.args[0]) + return exc + + +class RemoteMap(object): + """Represents a string->object map stored in Nvim. + + This is the dict counterpart to the `RemoteSequence` class, but it is used + as a generic way of retrieving values from the various map-like data + structures present in Nvim. + + It is used to provide a dict-like API to vim variables and options. + """ + + _set = None + _del = None + + def __init__(self, obj, get_method, set_method=None, del_method=None): + """Initialize a RemoteMap with session, getter/setter.""" + self._get = functools.partial(obj.request, get_method) + if set_method: + self._set = functools.partial(obj.request, set_method) + if del_method: + self._del = functools.partial(obj.request, del_method) + + def __getitem__(self, key): + """Return a map value by key.""" + try: + return self._get(key) + except NvimError as exc: + raise transform_keyerror(exc) + + def __setitem__(self, key, value): + """Set a map value by key(if the setter was provided).""" + if not self._set: + raise TypeError('This dict is read-only') + self._set(key, value) + + def __delitem__(self, key): + """Delete a map value by associating None with the key.""" + if not self._del: + raise TypeError('This dict is read-only') + try: + return self._del(key) + except NvimError as exc: + raise transform_keyerror(exc) + + def __contains__(self, key): + """Check if key is present in the map.""" + try: + self._get(key) + return True + except Exception: + return False + + def get(self, key, default=None): + """Return value for key if present, else a default value.""" + try: + return self.__getitem__(key) + except KeyError: + return default + + +class RemoteSequence(object): + + """Represents a sequence of objects stored in Nvim. + + This class is used to wrap msgapck-rpc functions that work on Nvim + sequences(of lines, buffers, windows and tabpages) with an API that + is similar to the one provided by the python-vim interface. + + For example, the 'windows' property of the `Nvim` class is a RemoteSequence + sequence instance, and the expression `nvim.windows[0]` is translated to + session.request('nvim_list_wins')[0]. + + One important detail about this class is that all methods will fetch the + sequence into a list and perform the necessary manipulation + locally(iteration, indexing, counting, etc). + """ + + def __init__(self, session, method): + """Initialize a RemoteSequence with session, method.""" + self._fetch = functools.partial(session.request, method) + + def __len__(self): + """Return the length of the remote sequence.""" + return len(self._fetch()) + + def __getitem__(self, idx): + """Return a sequence item by index.""" + if not isinstance(idx, slice): + return self._fetch()[idx] + return self._fetch()[idx.start:idx.stop] + + def __iter__(self): + """Return an iterator for the sequence.""" + items = self._fetch() + for item in items: + yield item + + def __contains__(self, item): + """Check if an item is present in the sequence.""" + return item in self._fetch() + + +def _identity(obj, session, method, kind): + return obj + + +def decode_if_bytes(obj, mode=True): + """Decode obj if it is bytes.""" + if mode is True: + mode = unicode_errors_default + if isinstance(obj, bytes): + return obj.decode("utf-8", errors=mode) + return obj + + +def walk(fn, obj, *args, **kwargs): + """Recursively walk an object graph applying `fn`/`args` to objects.""" + if type(obj) in [list, tuple]: + return list(walk(fn, o, *args) for o in obj) + if type(obj) is dict: + return dict((walk(fn, k, *args), walk(fn, v, *args)) for k, v in + obj.items()) + return fn(obj, *args, **kwargs) diff --git a/.local/lib/python3.9/site-packages/pynvim/api/nvim.py b/.local/lib/python3.9/site-packages/pynvim/api/nvim.py new file mode 100644 index 00000000..487478ac --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/api/nvim.py @@ -0,0 +1,577 @@ +"""Main Nvim interface.""" +import os +import sys +import threading +from functools import partial +from traceback import format_stack + +from msgpack import ExtType + +from pynvim.api.buffer import Buffer +from pynvim.api.common import (NvimError, Remote, RemoteApi, RemoteMap, RemoteSequence, + decode_if_bytes, walk) +from pynvim.api.tabpage import Tabpage +from pynvim.api.window import Window +from pynvim.compat import IS_PYTHON3 +from pynvim.util import Version, format_exc_skip + +__all__ = ('Nvim') + + +os_chdir = os.chdir + +lua_module = """ +local a = vim.api +local function update_highlights(buf, src_id, hls, clear_first, clear_end) + if clear_first ~= nil then + a.nvim_buf_clear_highlight(buf, src_id, clear_first, clear_end) + end + for _,hl in pairs(hls) do + local group, line, col_start, col_end = unpack(hl) + if col_start == nil then + col_start = 0 + end + if col_end == nil then + col_end = -1 + end + a.nvim_buf_add_highlight(buf, src_id, group, line, col_start, col_end) + end +end + +local chid = ... +local mod = {update_highlights=update_highlights} +_G["_pynvim_"..chid] = mod +""" + + +class Nvim(object): + + """Class that represents a remote Nvim instance. + + This class is main entry point to Nvim remote API, it is a wrapper + around Session instances. + + The constructor of this class must not be called directly. Instead, the + `from_session` class method should be used to create the first instance + from a raw `Session` instance. + + Subsequent instances for the same session can be created by calling the + `with_decode` instance method to change the decoding behavior or + `SubClass.from_nvim(nvim)` where `SubClass` is a subclass of `Nvim`, which + is useful for having multiple `Nvim` objects that behave differently + without one affecting the other. + + When this library is used on python3.4+, asyncio event loop is guaranteed + to be used. It is available as the "loop" attribute of this class. Note + that asyncio callbacks cannot make blocking requests, which includes + accessing state-dependent attributes. They should instead schedule another + callback using nvim.async_call, which will not have this restriction. + """ + + @classmethod + def from_session(cls, session): + """Create a new Nvim instance for a Session instance. + + This method must be called to create the first Nvim instance, since it + queries Nvim metadata for type information and sets a SessionHook for + creating specialized objects from Nvim remote handles. + """ + session.error_wrapper = lambda e: NvimError(decode_if_bytes(e[1])) + channel_id, metadata = session.request(b'nvim_get_api_info') + + if IS_PYTHON3: + # decode all metadata strings for python3 + metadata = walk(decode_if_bytes, metadata) + + types = { + metadata['types']['Buffer']['id']: Buffer, + metadata['types']['Window']['id']: Window, + metadata['types']['Tabpage']['id']: Tabpage, + } + + return cls(session, channel_id, metadata, types) + + @classmethod + def from_nvim(cls, nvim): + """Create a new Nvim instance from an existing instance.""" + return cls(nvim._session, nvim.channel_id, nvim.metadata, + nvim.types, nvim._decode, nvim._err_cb) + + def __init__(self, session, channel_id, metadata, types, + decode=False, err_cb=None): + """Initialize a new Nvim instance. This method is module-private.""" + self._session = session + self.channel_id = channel_id + self.metadata = metadata + version = metadata.get("version", {"api_level": 0}) + self.version = Version(**version) + self.types = types + self.api = RemoteApi(self, 'nvim_') + self.vars = RemoteMap(self, 'nvim_get_var', 'nvim_set_var', 'nvim_del_var') + self.vvars = RemoteMap(self, 'nvim_get_vvar', None, None) + self.options = RemoteMap(self, 'nvim_get_option', 'nvim_set_option') + self.buffers = Buffers(self) + self.windows = RemoteSequence(self, 'nvim_list_wins') + self.tabpages = RemoteSequence(self, 'nvim_list_tabpages') + self.current = Current(self) + self.session = CompatibilitySession(self) + self.funcs = Funcs(self) + self.lua = LuaFuncs(self) + self.error = NvimError + self._decode = decode + self._err_cb = err_cb + + # only on python3.4+ we expose asyncio + if IS_PYTHON3: + self.loop = self._session.loop._loop + + def _from_nvim(self, obj, decode=None): + if decode is None: + decode = self._decode + if type(obj) is ExtType: + cls = self.types[obj.code] + return cls(self, (obj.code, obj.data)) + if decode: + obj = decode_if_bytes(obj, decode) + return obj + + def _to_nvim(self, obj): + if isinstance(obj, Remote): + return ExtType(*obj.code_data) + return obj + + def _get_lua_private(self): + if not getattr(self._session, "_has_lua", False): + self.exec_lua(lua_module, self.channel_id) + self._session._has_lua = True + return getattr(self.lua, "_pynvim_{}".format(self.channel_id)) + + def request(self, name, *args, **kwargs): + r"""Send an API request or notification to nvim. + + It is rarely needed to call this function directly, as most API + functions have python wrapper functions. The `api` object can + be also be used to call API functions as methods: + + vim.api.err_write('ERROR\n', async_=True) + vim.current.buffer.api.get_mark('.') + + is equivalent to + + vim.request('nvim_err_write', 'ERROR\n', async_=True) + vim.request('nvim_buf_get_mark', vim.current.buffer, '.') + + + Normally a blocking request will be sent. If the `async_` flag is + present and True, a asynchronous notification is sent instead. This + will never block, and the return value or error is ignored. + """ + if (self._session._loop_thread is not None + and threading.current_thread() != self._session._loop_thread): + + msg = ("Request from non-main thread.\n" + "Requests from different threads should be wrapped " + "with nvim.async_call(cb, ...) \n{}\n" + .format('\n'.join(format_stack(None, 5)[:-1]))) + + self.async_call(self._err_cb, msg) + raise NvimError("request from non-main thread") + + decode = kwargs.pop('decode', self._decode) + args = walk(self._to_nvim, args) + res = self._session.request(name, *args, **kwargs) + return walk(self._from_nvim, res, decode=decode) + + def next_message(self): + """Block until a message(request or notification) is available. + + If any messages were previously enqueued, return the first in queue. + If not, run the event loop until one is received. + """ + msg = self._session.next_message() + if msg: + return walk(self._from_nvim, msg) + + def run_loop(self, request_cb, notification_cb, + setup_cb=None, err_cb=None): + """Run the event loop to receive requests and notifications from Nvim. + + This should not be called from a plugin running in the host, which + already runs the loop and dispatches events to plugins. + """ + if err_cb is None: + err_cb = sys.stderr.write + self._err_cb = err_cb + + def filter_request_cb(name, args): + name = self._from_nvim(name) + args = walk(self._from_nvim, args) + try: + result = request_cb(name, args) + except Exception: + msg = ("error caught in request handler '{} {}'\n{}\n\n" + .format(name, args, format_exc_skip(1))) + self._err_cb(msg) + raise + return walk(self._to_nvim, result) + + def filter_notification_cb(name, args): + name = self._from_nvim(name) + args = walk(self._from_nvim, args) + try: + notification_cb(name, args) + except Exception: + msg = ("error caught in notification handler '{} {}'\n{}\n\n" + .format(name, args, format_exc_skip(1))) + self._err_cb(msg) + raise + + self._session.run(filter_request_cb, filter_notification_cb, setup_cb) + + def stop_loop(self): + """Stop the event loop being started with `run_loop`.""" + self._session.stop() + + def close(self): + """Close the nvim session and release its resources.""" + self._session.close() + + def __enter__(self): + """Enter nvim session as a context manager.""" + return self + + def __exit__(self, *exc_info): + """Exit nvim session as a context manager. + + Closes the event loop. + """ + self.close() + + def with_decode(self, decode=True): + """Initialize a new Nvim instance.""" + return Nvim(self._session, self.channel_id, + self.metadata, self.types, decode, self._err_cb) + + def ui_attach(self, width, height, rgb=None, **kwargs): + """Register as a remote UI. + + After this method is called, the client will receive redraw + notifications. + """ + options = kwargs + if rgb is not None: + options['rgb'] = rgb + return self.request('nvim_ui_attach', width, height, options) + + def ui_detach(self): + """Unregister as a remote UI.""" + return self.request('nvim_ui_detach') + + def ui_try_resize(self, width, height): + """Notify nvim that the client window has resized. + + If possible, nvim will send a redraw request to resize. + """ + return self.request('ui_try_resize', width, height) + + def subscribe(self, event): + """Subscribe to a Nvim event.""" + return self.request('nvim_subscribe', event) + + def unsubscribe(self, event): + """Unsubscribe to a Nvim event.""" + return self.request('nvim_unsubscribe', event) + + def command(self, string, **kwargs): + """Execute a single ex command.""" + return self.request('nvim_command', string, **kwargs) + + def command_output(self, string): + """Execute a single ex command and return the output.""" + return self.request('nvim_command_output', string) + + def eval(self, string, **kwargs): + """Evaluate a vimscript expression.""" + return self.request('nvim_eval', string, **kwargs) + + def call(self, name, *args, **kwargs): + """Call a vimscript function.""" + return self.request('nvim_call_function', name, args, **kwargs) + + def exec_lua(self, code, *args, **kwargs): + """Execute lua code. + + Additional parameters are available as `...` inside the lua chunk. + Only statements are executed. To evaluate an expression, prefix it + with `return`: `return my_function(...)` + + There is a shorthand syntax to call lua functions with arguments: + + nvim.lua.func(1,2) + nvim.lua.mymod.myfunction(data, async_=True) + + is equivalent to + + nvim.exec_lua("return func(...)", 1, 2) + nvim.exec_lua("mymod.myfunction(...)", data, async_=True) + + Note that with `async_=True` there is no return value. + """ + return self.request('nvim_execute_lua', code, args, **kwargs) + + def strwidth(self, string): + """Return the number of display cells `string` occupies. + + Tab is counted as one cell. + """ + return self.request('nvim_strwidth', string) + + def list_runtime_paths(self): + """Return a list of paths contained in the 'runtimepath' option.""" + return self.request('nvim_list_runtime_paths') + + def foreach_rtp(self, cb): + """Invoke `cb` for each path in 'runtimepath'. + + Call the given callable for each path in 'runtimepath' until either + callable returns something but None, the exception is raised or there + are no longer paths. If stopped in case callable returned non-None, + vim.foreach_rtp function returns the value returned by callable. + """ + for path in self.request('nvim_list_runtime_paths'): + try: + if cb(path) is not None: + break + except Exception: + break + + def chdir(self, dir_path): + """Run os.chdir, then all appropriate vim stuff.""" + os_chdir(dir_path) + return self.request('nvim_set_current_dir', dir_path) + + def feedkeys(self, keys, options='', escape_csi=True): + """Push `keys` to Nvim user input buffer. + + Options can be a string with the following character flags: + - 'm': Remap keys. This is default. + - 'n': Do not remap keys. + - 't': Handle keys as if typed; otherwise they are handled as if coming + from a mapping. This matters for undo, opening folds, etc. + """ + return self.request('nvim_feedkeys', keys, options, escape_csi) + + def input(self, bytes): + """Push `bytes` to Nvim low level input buffer. + + Unlike `feedkeys()`, this uses the lowest level input buffer and the + call is not deferred. It returns the number of bytes actually + written(which can be less than what was requested if the buffer is + full). + """ + return self.request('nvim_input', bytes) + + def replace_termcodes(self, string, from_part=False, do_lt=True, + special=True): + r"""Replace any terminal code strings by byte sequences. + + The returned sequences are Nvim's internal representation of keys, + for example: + + -> '\x1b' + -> '\r' + -> '\x0c' + -> '\x80ku' + + The returned sequences can be used as input to `feedkeys`. + """ + return self.request('nvim_replace_termcodes', string, + from_part, do_lt, special) + + def out_write(self, msg, **kwargs): + r"""Print `msg` as a normal message. + + The message is buffered (won't display) until linefeed ("\n"). + """ + return self.request('nvim_out_write', msg, **kwargs) + + def err_write(self, msg, **kwargs): + r"""Print `msg` as an error message. + + The message is buffered (won't display) until linefeed ("\n"). + """ + if self._thread_invalid(): + # special case: if a non-main thread writes to stderr + # i.e. due to an uncaught exception, pass it through + # without raising an additional exception. + self.async_call(self.err_write, msg, **kwargs) + return + return self.request('nvim_err_write', msg, **kwargs) + + def _thread_invalid(self): + return (self._session._loop_thread is not None + and threading.current_thread() != self._session._loop_thread) + + def quit(self, quit_command='qa!'): + """Send a quit command to Nvim. + + By default, the quit command is 'qa!' which will make Nvim quit without + saving anything. + """ + try: + self.command(quit_command) + except OSError: + # sending a quit command will raise an IOError because the + # connection is closed before a response is received. Safe to + # ignore it. + pass + + def new_highlight_source(self): + """Return new src_id for use with Buffer.add_highlight.""" + return self.current.buffer.add_highlight("", 0, src_id=0) + + def async_call(self, fn, *args, **kwargs): + """Schedule `fn` to be called by the event loop soon. + + This function is thread-safe, and is the only way code not + on the main thread could interact with nvim api objects. + + This function can also be called in a synchronous + event handler, just before it returns, to defer execution + that shouldn't block neovim. + """ + call_point = ''.join(format_stack(None, 5)[:-1]) + + def handler(): + try: + fn(*args, **kwargs) + except Exception as err: + msg = ("error caught while executing async callback:\n" + "{!r}\n{}\n \nthe call was requested at\n{}" + .format(err, format_exc_skip(1), call_point)) + self._err_cb(msg) + raise + self._session.threadsafe_call(handler) + + +class Buffers(object): + + """Remote NVim buffers. + + Currently the interface for interacting with remote NVim buffers is the + `nvim_list_bufs` msgpack-rpc function. Most methods fetch the list of + buffers from NVim. + + Conforms to *python-buffers*. + """ + + def __init__(self, nvim): + """Initialize a Buffers object with Nvim object `nvim`.""" + self._fetch_buffers = nvim.api.list_bufs + + def __len__(self): + """Return the count of buffers.""" + return len(self._fetch_buffers()) + + def __getitem__(self, number): + """Return the Buffer object matching buffer number `number`.""" + for b in self._fetch_buffers(): + if b.number == number: + return b + raise KeyError(number) + + def __contains__(self, b): + """Return whether Buffer `b` is a known valid buffer.""" + return isinstance(b, Buffer) and b.valid + + def __iter__(self): + """Return an iterator over the list of buffers.""" + return iter(self._fetch_buffers()) + + +class CompatibilitySession(object): + + """Helper class for API compatibility.""" + + def __init__(self, nvim): + self.threadsafe_call = nvim.async_call + + +class Current(object): + + """Helper class for emulating vim.current from python-vim.""" + + def __init__(self, session): + self._session = session + self.range = None + + @property + def line(self): + return self._session.request('nvim_get_current_line') + + @line.setter + def line(self, line): + return self._session.request('nvim_set_current_line', line) + + @line.deleter + def line(self): + return self._session.request('nvim_del_current_line') + + @property + def buffer(self): + return self._session.request('nvim_get_current_buf') + + @buffer.setter + def buffer(self, buffer): + return self._session.request('nvim_set_current_buf', buffer) + + @property + def window(self): + return self._session.request('nvim_get_current_win') + + @window.setter + def window(self, window): + return self._session.request('nvim_set_current_win', window) + + @property + def tabpage(self): + return self._session.request('nvim_get_current_tabpage') + + @tabpage.setter + def tabpage(self, tabpage): + return self._session.request('nvim_set_current_tabpage', tabpage) + + +class Funcs(object): + + """Helper class for functional vimscript interface.""" + + def __init__(self, nvim): + self._nvim = nvim + + def __getattr__(self, name): + return partial(self._nvim.call, name) + + +class LuaFuncs(object): + + """Wrapper to allow lua functions to be called like python methods.""" + + def __init__(self, nvim, name=""): + self._nvim = nvim + self.name = name + + def __getattr__(self, name): + """Return wrapper to named api method.""" + prefix = self.name + "." if self.name else "" + return LuaFuncs(self._nvim, prefix + name) + + def __call__(self, *args, **kwargs): + # first new function after keyword rename, be a bit noisy + if 'async' in kwargs: + raise ValueError('"async" argument is not allowed. ' + 'Use "async_" instead.') + async_ = kwargs.get('async_', False) + pattern = "return {}(...)" if not async_ else "{}(...)" + code = pattern.format(self.name) + return self._nvim.exec_lua(code, *args, **kwargs) diff --git a/.local/lib/python3.9/site-packages/pynvim/api/tabpage.py b/.local/lib/python3.9/site-packages/pynvim/api/tabpage.py new file mode 100644 index 00000000..f8a6bba5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/api/tabpage.py @@ -0,0 +1,35 @@ +"""API for working with Nvim tabpages.""" +from pynvim.api.common import Remote, RemoteSequence + + +__all__ = ('Tabpage') + + +class Tabpage(Remote): + """A remote Nvim tabpage.""" + + _api_prefix = "nvim_tabpage_" + + def __init__(self, *args): + """Initialize from session and code_data immutable object. + + The `code_data` contains serialization information required for + msgpack-rpc calls. It must be immutable for Buffer equality to work. + """ + super(Tabpage, self).__init__(*args) + self.windows = RemoteSequence(self, 'nvim_tabpage_list_wins') + + @property + def window(self): + """Get the `Window` currently focused on the tabpage.""" + return self.request('nvim_tabpage_get_win') + + @property + def valid(self): + """Return True if the tabpage still exists.""" + return self.request('nvim_tabpage_is_valid') + + @property + def number(self): + """Get the tabpage number.""" + return self.request('nvim_tabpage_get_number') diff --git a/.local/lib/python3.9/site-packages/pynvim/api/window.py b/.local/lib/python3.9/site-packages/pynvim/api/window.py new file mode 100644 index 00000000..14810609 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/api/window.py @@ -0,0 +1,72 @@ +"""API for working with Nvim windows.""" +from pynvim.api.common import Remote + + +__all__ = ('Window') + + +class Window(Remote): + + """A remote Nvim window.""" + + _api_prefix = "nvim_win_" + + @property + def buffer(self): + """Get the `Buffer` currently being displayed by the window.""" + return self.request('nvim_win_get_buf') + + @property + def cursor(self): + """Get the (row, col) tuple with the current cursor position.""" + return self.request('nvim_win_get_cursor') + + @cursor.setter + def cursor(self, pos): + """Set the (row, col) tuple as the new cursor position.""" + return self.request('nvim_win_set_cursor', pos) + + @property + def height(self): + """Get the window height in rows.""" + return self.request('nvim_win_get_height') + + @height.setter + def height(self, height): + """Set the window height in rows.""" + return self.request('nvim_win_set_height', height) + + @property + def width(self): + """Get the window width in rows.""" + return self.request('nvim_win_get_width') + + @width.setter + def width(self, width): + """Set the window height in rows.""" + return self.request('nvim_win_set_width', width) + + @property + def row(self): + """0-indexed, on-screen window position(row) in display cells.""" + return self.request('nvim_win_get_position')[0] + + @property + def col(self): + """0-indexed, on-screen window position(col) in display cells.""" + return self.request('nvim_win_get_position')[1] + + @property + def tabpage(self): + """Get the `Tabpage` that contains the window.""" + return self.request('nvim_win_get_tabpage') + + @property + def valid(self): + """Return True if the window still exists.""" + return self.request('nvim_win_is_valid') + + @property + def number(self): + """Get the window number.""" + return self.request('nvim_win_get_number') diff --git a/.local/lib/python3.9/site-packages/pynvim/compat.py b/.local/lib/python3.9/site-packages/pynvim/compat.py new file mode 100644 index 00000000..01e45db1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/compat.py @@ -0,0 +1,57 @@ +"""Code for compatibility across Python versions.""" + +import sys +import warnings +from imp import find_module as original_find_module + + +IS_PYTHON3 = sys.version_info >= (3, 0) + + +if IS_PYTHON3: + def find_module(fullname, path): + """Compatibility wrapper for imp.find_module. + + Automatically decodes arguments of find_module, in Python3 + they must be Unicode + """ + if isinstance(fullname, bytes): + fullname = fullname.decode() + if isinstance(path, bytes): + path = path.decode() + elif isinstance(path, list): + newpath = [] + for element in path: + if isinstance(element, bytes): + newpath.append(element.decode()) + else: + newpath.append(element) + path = newpath + return original_find_module(fullname, path) + + # There is no 'long' type in Python3 just int + long = int + unicode_errors_default = 'surrogateescape' +else: + find_module = original_find_module + unicode_errors_default = 'ignore' + +NUM_TYPES = (int, long, float) + + +def check_async(async_, kwargs, default): + """Return a value of 'async' in kwargs or default when async_ is None. + + This helper function exists for backward compatibility (See #274). + It shows a warning message when 'async' in kwargs is used to note users. + """ + if async_ is not None: + return async_ + elif 'async' in kwargs: + warnings.warn( + '"async" attribute is deprecated. Use "async_" instead.', + DeprecationWarning, + ) + return kwargs.pop('async') + else: + return default diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__init__.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__init__.py new file mode 100644 index 00000000..8da22e04 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__init__.py @@ -0,0 +1,45 @@ +"""Msgpack-rpc subpackage. + +This package implements a msgpack-rpc client. While it was designed for +handling some Nvim particularities(server->client requests for example), the +code here should work with other msgpack-rpc servers. +""" +from pynvim.msgpack_rpc.async_session import AsyncSession +from pynvim.msgpack_rpc.event_loop import EventLoop +from pynvim.msgpack_rpc.msgpack_stream import MsgpackStream +from pynvim.msgpack_rpc.session import ErrorResponse, Session +from pynvim.util import get_client_info + + +__all__ = ('tcp_session', 'socket_session', 'stdio_session', 'child_session', + 'ErrorResponse') + + +def session(transport_type='stdio', *args, **kwargs): + loop = EventLoop(transport_type, *args, **kwargs) + msgpack_stream = MsgpackStream(loop) + async_session = AsyncSession(msgpack_stream) + session = Session(async_session) + session.request(b'nvim_set_client_info', + *get_client_info('client', 'remote', {}), async_=True) + return session + + +def tcp_session(address, port=7450): + """Create a msgpack-rpc session from a tcp address/port.""" + return session('tcp', address, port) + + +def socket_session(path): + """Create a msgpack-rpc session from a unix domain socket.""" + return session('socket', path) + + +def stdio_session(): + """Create a msgpack-rpc session from stdin/stdout.""" + return session('stdio') + + +def child_session(argv): + """Create a msgpack-rpc session from a new Nvim instance.""" + return session('child', argv) diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/__init__.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8aa8e5a4057a8a9cb6a04604528a21edde9860b GIT binary patch literal 1885 zcmb7EOOG5i5N`KtW_xG$m9R(=k(>)+1lx^-ARwU#6y*jB+C)O~rRlW2GtPFm2ivoc zXmZ+|`4Naqj{KeG2$%c?E}_cZlgvgd1>ADEs%@9QDu3l-JWf1lcmMb~|1P@x@`hbo2 zdwhc@&j}mzeLmu2(6;y%-+u0~ZN9^IVcg++{05A>{N_V%^8VAmzc)e_&c?mi8CZrvGYc87dp)f|O2JDRorvUytrRHFa z`%FBvS`_ufZ^sX`R{BVoxoV7P2XFRmPle4pu(@oG)g)>+Z8^_P=egZ7syu-uD|>7# zm+FmKLbCYE)IblfjogxwAkw}KV2q*v0Noscu-?*}k|p_#9C^}P`oEK3$+N(cWpGKJ zh1Oq&Fh(|5Mli<9_({mgl-P*-JdoaHfctpJBMJM6w~T=R@u9g1o*TFoz;h)i7IzV{ zSc_U&!Quk5mp_`s8riEu6g~<>$p-zkX~aDluq~^L26CruZZGDd4GTRrZG3WuBMU3Y zI@{{0lpB|HHtvpCCrDeFHo~*@W}L&fdnh0dsetudtzALch`wx5I{!Aht{5kY(>ihQ-okAl1UA z8uRbqtieFOXqP99{6pv~ENK6aJbm$QGzD$MS@*KZ#@M1MMcPKL$X{m(NPoHp&mr3c zBpFYe$~Rt%2hvNE~+Ze9g`h1HBvxh?lp$FmWtOm)egU|6<<{1 Y9x~VLg9zgh!Ec9*f-p>yBpSl^FW61+LI3~& literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/async_session.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/async_session.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b6114211ea2845b9fb3ce96207fb1ed755ccc53 GIT binary patch literal 4926 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 F{SOmNYlHv* literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/session.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/__pycache__/session.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7238ccadfcf27e399ec0adf76b749d9c2312eda1 GIT binary patch literal 7862 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 PJd2{Jz;j&01Q=w*_x)bCTd$i6 zey{)azVr7DMfnGHCVxxl+`<$84S*@O!c?XOYEQE@mEQG0w{_VXwjtY+T|#RFV9qsVfszQJHZP~8=LJ76&)GGzGUfr&%3fGTU`09yjH+W-j z4Nnu#DP7SNd(Cdz>%6+RVQ+F{?=&kv(8QO(tpsO!XYI53s^{!;m~-CV{HemKZ0V`O zmUtZ_7w}wsQnD{G{hrb?-7i%|xwFs1#0sLQZ~47`zP2i2@V04wGW9(hwhr9bav9^yN+PR&nCxQ75o+M?2v;0h7`xH_ z{>v6twEV>Ei)i0x*wMB61HlWl8N#9t=39JBc)nWOdOxxJm}q7u?QV74AlPxe2bLdN zo*UDGgMFG3Mv3L_yMEyA1pFGP$O)X@DYhc8E=))wwBEied1!&(JFWog} z2F<&EpT7rr2i&7YCVv__xA4S&2H=XV!s<1q!pb$KKUHAm1}mX0u`;WmEoatcSD49` z(XX-^tD{|FD{K|5$r@}8?J{e!Q)p{!oo%44vrTpy?Fu`?&Z1pq=h%6)4R(QDM7zc= zvCC+i%wo@>J;koD=h3dStLz1|8|+2)653664R+j08@Dst9Pv8*(fujjVYGuCFK}bB z<-)4Rf|j;II^ZE|dnAS8NAEhGxADZ+0FKln#mS(WXh&+I?-@@tarH<&hVP%quS^3~ z`tZk}!Vby!W4{}^!AP;~yCO;=FADCHx?Pawc|49ggTV5lFytP2Ut7R8mF-qJHJwDb zVNBXhR~+FUO!Q$ren?K`@wAdVsD0|*UM zriePW{g=J98}<0sUK9_wxc)%o>K@=x*3Q6@lAHBQ%OiP!XD0H|Gkw^_!bmNvL zYS=r~`6ExtFas+zHpwxq`U4Ec(#o`N=9MPT@j5cctCH6}MXYBWOCHsG;D1j&hG`c4 zmNvZct$6lBFY5VW*J5tswzpe)S|u*2m)0D_lmTa1uk7~w@Resd(*{kM<+@ITj^G~m z_c?omcrLVTs)jneG^gb$1dsSEe)K-CV+}gi7V7x+*YP`cjTt9gsBO`}zT09Au%&1E z)jCY9qd&{-y7a9HJEaA0VPc`^7v|VqgfYkUNZYSrts~eo5`Ly{Y182)(zbXJ7N8zw zBQ=a@$9mTLZ=vXGEB0m#K8$p6GS0u)Cke4r`0 zozn0-m=VhoOsm4};riO}`NdM2!t*FH7C(9)$%wp-e1QTn{5=c9|C22o>~bo6xaIBo z0kilcKZ)C!8MF{mu>Lbu8p14pD|y6q2!*o`F|*M8<$0d6=$y}8$Pe)(6HcN$QNBYzoNW&{Q$G^UDLgUx&KH>UOx>O!+`{ODimEpQx3|OG zH$TDnKk+ETYjdPKe&{Fdn=&87Z{j6GL7u8opm)3=PD?W83t~Z92nIT?mk27Tg+)Lb zhkTO(vLsjiIlg2eLapMzq7F9~Z$ITE#99f@+k|}u0On8504G4M)=u=tx*XAubZHcj zf}m+FL%fJ4UGoHYQ9q4cSG+{yO)&_aL74afK2c$uaG=N-UqM+bkX=(lCgmkBLZO%V zA)k<~LgzOGps5Vp{PxDcyXS!oC2CV74%7tqu_TFodhl~1Hpyd)s;O1;a+>J zg$+4U0?bEbznljHvH)#ckhofvRExkt==Qi2guR&yVkRs}X^cJ&LjO_06si>Q9a<_6 zjYi)^$@>aMX63M2pg3`aA}jeN=H!|-)uz^1l=5d#rkrF-=YPRsBZ*jvmgvVuQrasY zS5A}@^@;je4a?MjOg2$HUIH{TY03U_CYwY#u3=U^!+NZvzk>cM^+)44_lstv71 zJ#{!A7pK>la{_V%>E`d@C0B$lt|Z8ICvbbmfWVDoGX65TI<{xt+>C?N5%q_y9}{jmK-5K6Txuv8wDnDrhJ5AKRr@lLmBQ32Qxk=V#$paR5S?m8}or4v*zd}kx5l$H4KSsnl4Qe zffHL2^%w3AS>e-fY5QDfi)4iSHN;ryT*9gejfgk54*+eChk2_hG5P6Xt%MYs#$10!J>G9m@9n%`!Wr0Fx5Vl*VA!SD!smx|-C$a5UAN_61nSP|z5TqJOrz;gty5oi;*LEt9@ZWDNmz&ixq zB|ync{EWZ{1nv@`Qh0*HQHT*0d}!g3M}w+vXw^#9kk1m@vV1>-zK(w>f6NT)viKB; z#8+pK;BplVke1R)5OuqV_L;5GF*9ApGJ#Xj`5DX^;o`lh>PM! zS*KcDZ`xO~d!Y8jJy3gm57geljieyMNSBacKfun2r5{tjOk{9Dx0gGEZff{pCrT>^ zt_VR}YS4?lc8?QTkr-X{i5Gw?ODB87%`O4k2Yv`Uh#i#VK`bjOK{qb;8jk!phD>0m z)#4VwZqA>CrPvl}A+6rbOyf-z>q=D^W(|i}`qwm#3LI@ktHE!m^f6KFR7+*Op&I}G E4>PJli~s-t literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/base.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/__pycache__/base.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ead59cda462d02d91fcb8308a201621b98660d0 GIT binary patch literal 6927 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 GV&ne@;%1%z literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py new file mode 100644 index 00000000..997095e6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/asyncio.py @@ -0,0 +1,163 @@ +"""Event loop implementation that uses the `asyncio` standard module. + +The `asyncio` module was added to python standard library on 3.4, and it +provides a pure python implementation of an event loop library. It is used +as a fallback in case pyuv is not available(on python implementations other +than CPython). + +Earlier python versions are supported through the `trollius` package, which +is a backport of `asyncio` that works on Python 2.6+. +""" +from __future__ import absolute_import + +import logging +import os +import sys +from collections import deque + +try: + # For python 3.4+, use the standard library module + import asyncio +except (ImportError, SyntaxError): + # Fallback to trollius + import trollius as asyncio + +from pynvim.msgpack_rpc.event_loop.base import BaseEventLoop + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + +loop_cls = asyncio.SelectorEventLoop +if os.name == 'nt': + from asyncio.windows_utils import PipeHandle + import msvcrt + + # On windows use ProactorEventLoop which support pipes and is backed by the + # more powerful IOCP facility + # NOTE: we override in the stdio case, because it doesn't work. + loop_cls = asyncio.ProactorEventLoop + + +class AsyncioEventLoop(BaseEventLoop, asyncio.Protocol, + asyncio.SubprocessProtocol): + + """`BaseEventLoop` subclass that uses `asyncio` as a backend.""" + + def connection_made(self, transport): + """Used to signal `asyncio.Protocol` of a successful connection.""" + self._transport = transport + self._raw_transport = transport + if isinstance(transport, asyncio.SubprocessTransport): + self._transport = transport.get_pipe_transport(0) + + def connection_lost(self, exc): + """Used to signal `asyncio.Protocol` of a lost connection.""" + self._on_error(exc.args[0] if exc else 'EOF') + + def data_received(self, data): + """Used to signal `asyncio.Protocol` of incoming data.""" + if self._on_data: + self._on_data(data) + return + self._queued_data.append(data) + + def pipe_connection_lost(self, fd, exc): + """Used to signal `asyncio.SubprocessProtocol` of a lost connection.""" + self._on_error(exc.args[0] if exc else 'EOF') + + def pipe_data_received(self, fd, data): + """Used to signal `asyncio.SubprocessProtocol` of incoming data.""" + if fd == 2: # stderr fd number + self._on_stderr(data) + elif self._on_data: + self._on_data(data) + else: + self._queued_data.append(data) + + def process_exited(self): + """Used to signal `asyncio.SubprocessProtocol` when the child exits.""" + self._on_error('EOF') + + def _init(self): + self._loop = loop_cls() + self._queued_data = deque() + self._fact = lambda: self + self._raw_transport = None + + def _connect_tcp(self, address, port): + coroutine = self._loop.create_connection(self._fact, address, port) + self._loop.run_until_complete(coroutine) + + def _connect_socket(self, path): + if os.name == 'nt': + coroutine = self._loop.create_pipe_connection(self._fact, path) + else: + coroutine = self._loop.create_unix_connection(self._fact, path) + self._loop.run_until_complete(coroutine) + + def _connect_stdio(self): + if os.name == 'nt': + pipe = PipeHandle(msvcrt.get_osfhandle(sys.stdin.fileno())) + else: + pipe = sys.stdin + coroutine = self._loop.connect_read_pipe(self._fact, pipe) + self._loop.run_until_complete(coroutine) + pass # replaces next logging statement + #debug("native stdin connection successful") + + # Make sure subprocesses don't clobber stdout, + # send the output to stderr instead. + rename_stdout = os.dup(sys.stdout.fileno()) + os.dup2(sys.stderr.fileno(), sys.stdout.fileno()) + + if os.name == 'nt': + pipe = PipeHandle(msvcrt.get_osfhandle(rename_stdout)) + else: + pipe = os.fdopen(rename_stdout, 'wb') + coroutine = self._loop.connect_write_pipe(self._fact, pipe) + self._loop.run_until_complete(coroutine) + pass # replaces next logging statement + #debug("native stdout connection successful") + + def _connect_child(self, argv): + if os.name != 'nt': + self._child_watcher = asyncio.get_child_watcher() + self._child_watcher.attach_loop(self._loop) + coroutine = self._loop.subprocess_exec(self._fact, *argv) + self._loop.run_until_complete(coroutine) + + def _start_reading(self): + pass + + def _send(self, data): + self._transport.write(data) + + def _run(self): + while self._queued_data: + self._on_data(self._queued_data.popleft()) + self._loop.run_forever() + + def _stop(self): + self._loop.stop() + + def _close(self): + if self._raw_transport is not None: + self._raw_transport.close() + self._loop.close() + + def _threadsafe_call(self, fn): + self._loop.call_soon_threadsafe(fn) + + def _setup_signals(self, signals): + if os.name == 'nt': + # add_signal_handler is not supported in win32 + self._signals = [] + return + + self._signals = list(signals) + for signum in self._signals: + self._loop.add_signal_handler(signum, self._on_signal, signum) + + def _teardown_signals(self): + for signum in self._signals: + self._loop.remove_signal_handler(signum) diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/base.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/base.py new file mode 100644 index 00000000..cabb8c63 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/base.py @@ -0,0 +1,192 @@ +"""Common code for event loop implementations.""" +import logging +import signal +import threading + + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + + +# When signals are restored, the event loop library may reset SIGINT to SIG_DFL +# which exits the program. To be able to restore the python interpreter to it's +# default state, we keep a reference to the default handler +default_int_handler = signal.getsignal(signal.SIGINT) +main_thread = threading.current_thread() + + +class BaseEventLoop(object): + + """Abstract base class for all event loops. + + Event loops act as the bottom layer for Nvim sessions created by this + library. They hide system/transport details behind a simple interface for + reading/writing bytes to the connected Nvim instance. + + This class exposes public methods for interacting with the underlying + event loop and delegates implementation-specific work to the following + methods, which subclasses are expected to implement: + + - `_init()`: Implementation-specific initialization + - `_connect_tcp(address, port)`: connect to Nvim using tcp/ip + - `_connect_socket(path)`: Same as tcp, but use a UNIX domain socket or + named pipe. + - `_connect_stdio()`: Use stdin/stdout as the connection to Nvim + - `_connect_child(argv)`: Use the argument vector `argv` to spawn an + embedded Nvim that has its stdin/stdout connected to the event loop. + - `_start_reading()`: Called after any of _connect_* methods. Can be used + to perform any post-connection setup or validation. + - `_send(data)`: Send `data`(byte array) to Nvim. The data is only + - `_run()`: Runs the event loop until stopped or the connection is closed. + calling the following methods when some event happens: + actually sent when the event loop is running. + - `_on_data(data)`: When Nvim sends some data. + - `_on_signal(signum)`: When a signal is received. + - `_on_error(message)`: When a non-recoverable error occurs(eg: + connection lost) + - `_stop()`: Stop the event loop + - `_interrupt(data)`: Like `stop()`, but may be called from other threads + this. + - `_setup_signals(signals)`: Add implementation-specific listeners for + for `signals`, which is a list of OS-specific signal numbers. + - `_teardown_signals()`: Removes signal listeners set by `_setup_signals` + """ + + def __init__(self, transport_type, *args): + """Initialize and connect the event loop instance. + + The only arguments are the transport type and transport-specific + configuration, like this: + + >>> BaseEventLoop('tcp', '127.0.0.1', 7450) + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('socket', '/tmp/nvim-socket') + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('stdio') + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + >>> BaseEventLoop('child', + ['nvim', '--embed', '--headless', '-u', 'NONE']) + Traceback (most recent call last): + ... + AttributeError: 'BaseEventLoop' object has no attribute '_init' + + This calls the implementation-specific initialization + `_init`, one of the `_connect_*` methods(based on `transport_type`) + and `_start_reading()` + """ + self._transport_type = transport_type + self._signames = dict((k, v) for v, k in signal.__dict__.items() + if v.startswith('SIG')) + self._on_data = None + self._error = None + self._init() + try: + getattr(self, '_connect_{}'.format(transport_type))(*args) + except Exception as e: + self.close() + raise e + self._start_reading() + + def connect_tcp(self, address, port): + """Connect to tcp/ip `address`:`port`. Delegated to `_connect_tcp`.""" + pass # replaces next logging statement + #info('Connecting to TCP address: %s:%d', address, port) + self._connect_tcp(address, port) + + def connect_socket(self, path): + """Connect to socket at `path`. Delegated to `_connect_socket`.""" + pass # replaces next logging statement + #info('Connecting to %s', path) + self._connect_socket(path) + + def connect_stdio(self): + """Connect using stdin/stdout. Delegated to `_connect_stdio`.""" + pass # replaces next logging statement + #info('Preparing stdin/stdout for streaming data') + self._connect_stdio() + + def connect_child(self, argv): + """Connect a new Nvim instance. Delegated to `_connect_child`.""" + pass # replaces next logging statement + #info('Spawning a new nvim instance') + self._connect_child(argv) + + def send(self, data): + """Queue `data` for sending to Nvim.""" + pass # replaces next logging statement + #debug("Sending '%s'", data) + self._send(data) + + def threadsafe_call(self, fn): + """Call a function in the event loop thread. + + This is the only safe way to interact with a session from other + threads. + """ + self._threadsafe_call(fn) + + def run(self, data_cb): + """Run the event loop.""" + if self._error: + err = self._error + if isinstance(self._error, KeyboardInterrupt): + # KeyboardInterrupt is not destructive(it may be used in + # the REPL). + # After throwing KeyboardInterrupt, cleanup the _error field + # so the loop may be started again + self._error = None + raise err + self._on_data = data_cb + if threading.current_thread() == main_thread: + self._setup_signals([signal.SIGINT, signal.SIGTERM]) + pass # replaces next logging statement + #debug('Entering event loop') + self._run() + pass # replaces next logging statement + #debug('Exited event loop') + if threading.current_thread() == main_thread: + self._teardown_signals() + signal.signal(signal.SIGINT, default_int_handler) + self._on_data = None + + def stop(self): + """Stop the event loop.""" + self._stop() + pass # replaces next logging statement + #debug('Stopped event loop') + + def close(self): + """Stop the event loop.""" + self._close() + pass # replaces next logging statement + #debug('Closed event loop') + + def _on_signal(self, signum): + msg = 'Received {}'.format(self._signames[signum]) + pass # replaces next logging statement + #debug(msg) + if signum == signal.SIGINT and self._transport_type == 'stdio': + # When the transport is stdio, we are probably running as a Nvim + # child process. In that case, we don't want to be killed by + # ctrl+C + return + cls = Exception + if signum == signal.SIGINT: + cls = KeyboardInterrupt + self._error = cls(msg) + self.stop() + + def _on_error(self, error): + pass # replaces next logging statement + #debug(error) + self._error = OSError(error) + self.stop() + + def _on_interrupt(self): + self.stop() diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/uv.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/uv.py new file mode 100644 index 00000000..969187ee --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/event_loop/uv.py @@ -0,0 +1,124 @@ +"""Event loop implementation that uses pyuv(libuv-python bindings).""" +import sys +from collections import deque + +import pyuv + +from pynvim.msgpack_rpc.event_loop.base import BaseEventLoop + + +class UvEventLoop(BaseEventLoop): + + """`BaseEventLoop` subclass that uses `pvuv` as a backend.""" + + def _init(self): + self._loop = pyuv.Loop() + self._async = pyuv.Async(self._loop, self._on_async) + self._connection_error = None + self._error_stream = None + self._callbacks = deque() + + def _on_connect(self, stream, error): + self.stop() + if error: + msg = 'Cannot connect to {}: {}'.format( + self._connect_address, pyuv.errno.strerror(error)) + self._connection_error = OSError(msg) + return + self._read_stream = self._write_stream = stream + + def _on_read(self, handle, data, error): + if error or not data: + msg = pyuv.errno.strerror(error) if error else 'EOF' + self._on_error(msg) + return + if handle == self._error_stream: + return + self._on_data(data) + + def _on_write(self, handle, error): + if error: + msg = pyuv.errno.strerror(error) + self._on_error(msg) + + def _on_exit(self, handle, exit_status, term_signal): + self._on_error('EOF') + + def _disconnected(self, *args): + raise OSError('Not connected to Nvim') + + def _connect_tcp(self, address, port): + stream = pyuv.TCP(self._loop) + self._connect_address = '{}:{}'.format(address, port) + stream.connect((address, port), self._on_connect) + + def _connect_socket(self, path): + stream = pyuv.Pipe(self._loop) + self._connect_address = path + stream.connect(path, self._on_connect) + + def _connect_stdio(self): + self._read_stream = pyuv.Pipe(self._loop) + self._read_stream.open(sys.stdin.fileno()) + self._write_stream = pyuv.Pipe(self._loop) + self._write_stream.open(sys.stdout.fileno()) + + def _connect_child(self, argv): + self._write_stream = pyuv.Pipe(self._loop) + self._read_stream = pyuv.Pipe(self._loop) + self._error_stream = pyuv.Pipe(self._loop) + stdin = pyuv.StdIO(self._write_stream, + flags=pyuv.UV_CREATE_PIPE + pyuv.UV_READABLE_PIPE) + stdout = pyuv.StdIO(self._read_stream, + flags=pyuv.UV_CREATE_PIPE + pyuv.UV_WRITABLE_PIPE) + stderr = pyuv.StdIO(self._error_stream, + flags=pyuv.UV_CREATE_PIPE + pyuv.UV_WRITABLE_PIPE) + pyuv.Process.spawn(self._loop, + args=argv, + exit_callback=self._on_exit, + flags=pyuv.UV_PROCESS_WINDOWS_HIDE, + stdio=(stdin, stdout, stderr,)) + self._error_stream.start_read(self._on_read) + + def _start_reading(self): + if self._transport_type in ['tcp', 'socket']: + self._loop.run() + if self._connection_error: + self.run = self.send = self._disconnected + raise self._connection_error + self._read_stream.start_read(self._on_read) + + def _send(self, data): + self._write_stream.write(data, self._on_write) + + def _run(self): + self._loop.run(pyuv.UV_RUN_DEFAULT) + + def _stop(self): + self._loop.stop() + + def _close(self): + pass + + def _threadsafe_call(self, fn): + self._callbacks.append(fn) + self._async.send() + + def _on_async(self, handle): + while self._callbacks: + self._callbacks.popleft()() + + def _setup_signals(self, signals): + self._signal_handles = [] + + def handler(h, signum): + self._on_signal(signum) + + for signum in signals: + handle = pyuv.Signal(self._loop) + handle.start(handler, signum) + self._signal_handles.append(handle) + + def _teardown_signals(self): + for handle in self._signal_handles: + handle.stop() diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/msgpack_stream.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/msgpack_stream.py new file mode 100644 index 00000000..1a192f25 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/msgpack_stream.py @@ -0,0 +1,68 @@ +"""Msgpack handling in the event loop pipeline.""" +import logging + +from msgpack import Packer, Unpacker + +from pynvim.compat import unicode_errors_default + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) + + +class MsgpackStream(object): + + """Two-way msgpack stream that wraps a event loop byte stream. + + This wraps the event loop interface for reading/writing bytes and + exposes an interface for reading/writing msgpack documents. + """ + + def __init__(self, event_loop): + """Wrap `event_loop` on a msgpack-aware interface.""" + self.loop = event_loop + self._packer = Packer(unicode_errors=unicode_errors_default) + self._unpacker = Unpacker(unicode_errors=unicode_errors_default) + self._message_cb = None + + def threadsafe_call(self, fn): + """Wrapper around `BaseEventLoop.threadsafe_call`.""" + self.loop.threadsafe_call(fn) + + def send(self, msg): + """Queue `msg` for sending to Nvim.""" + pass # replaces next logging statement + #debug('sent %s', msg) + self.loop.send(self._packer.pack(msg)) + + def run(self, message_cb): + """Run the event loop to receive messages from Nvim. + + While the event loop is running, `message_cb` will be called whenever + a message has been successfully parsed from the input stream. + """ + self._message_cb = message_cb + self.loop.run(self._on_data) + self._message_cb = None + + def stop(self): + """Stop the event loop.""" + self.loop.stop() + + def close(self): + """Close the event loop.""" + self.loop.close() + + def _on_data(self, data): + self._unpacker.feed(data) + while True: + try: + pass # replaces next logging statement + #debug('waiting for message...') + msg = next(self._unpacker) + pass # replaces next logging statement + #debug('received message: %s', msg) + self._message_cb(msg) + except StopIteration: + pass # replaces next logging statement + #debug('unpacker needs more data...') + break diff --git a/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/session.py b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/session.py new file mode 100644 index 00000000..446e4673 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/msgpack_rpc/session.py @@ -0,0 +1,253 @@ +"""Synchronous msgpack-rpc session layer.""" +import logging +import threading +from collections import deque +from traceback import format_exc + +import greenlet + +from pynvim.compat import check_async + +logger = logging.getLogger(__name__) +error, debug, info, warn = (logger.error, logger.debug, logger.info, + logger.warning,) + + +class Session(object): + + """Msgpack-rpc session layer that uses coroutines for a synchronous API. + + This class provides the public msgpack-rpc API required by this library. + It uses the greenlet module to handle requests and notifications coming + from Nvim with a synchronous API. + """ + + def __init__(self, async_session): + """Wrap `async_session` on a synchronous msgpack-rpc interface.""" + self._async_session = async_session + self._request_cb = self._notification_cb = None + self._pending_messages = deque() + self._is_running = False + self._setup_exception = None + self.loop = async_session.loop + self._loop_thread = None + + def threadsafe_call(self, fn, *args, **kwargs): + """Wrapper around `AsyncSession.threadsafe_call`.""" + def handler(): + try: + fn(*args, **kwargs) + except Exception: + pass # replaces next logging statement + #warn("error caught while excecuting async callback\n%s\n", + #format_exc()) + + def greenlet_wrapper(): + gr = greenlet.greenlet(handler) + gr.switch() + + self._async_session.threadsafe_call(greenlet_wrapper) + + def next_message(self): + """Block until a message(request or notification) is available. + + If any messages were previously enqueued, return the first in queue. + If not, run the event loop until one is received. + """ + if self._is_running: + raise Exception('Event loop already running') + if self._pending_messages: + return self._pending_messages.popleft() + self._async_session.run(self._enqueue_request_and_stop, + self._enqueue_notification_and_stop) + if self._pending_messages: + return self._pending_messages.popleft() + + def request(self, method, *args, **kwargs): + """Send a msgpack-rpc request and block until as response is received. + + If the event loop is running, this method must have been called by a + request or notification handler running on a greenlet. In that case, + send the quest and yield to the parent greenlet until a response is + available. + + When the event loop is not running, it will perform a blocking request + like this: + - Send the request + - Run the loop until the response is available + - Put requests/notifications received while waiting into a queue + + If the `async_` flag is present and True, a asynchronous notification + is sent instead. This will never block, and the return value or error + is ignored. + """ + async_ = check_async(kwargs.pop('async_', None), kwargs, False) + if async_: + self._async_session.notify(method, args) + return + + if kwargs: + raise ValueError("request got unsupported keyword argument(s): {}" + .format(', '.join(kwargs.keys()))) + + if self._is_running: + v = self._yielding_request(method, args) + else: + v = self._blocking_request(method, args) + if not v: + # EOF + raise OSError('EOF') + err, rv = v + if err: + pass # replaces next logging statement + #info("'Received error: %s", err) + raise self.error_wrapper(err) + return rv + + def run(self, request_cb, notification_cb, setup_cb=None): + """Run the event loop to receive requests and notifications from Nvim. + + Like `AsyncSession.run()`, but `request_cb` and `notification_cb` are + inside greenlets. + """ + self._request_cb = request_cb + self._notification_cb = notification_cb + self._is_running = True + self._setup_exception = None + self._loop_thread = threading.current_thread() + + def on_setup(): + try: + setup_cb() + except Exception as e: + self._setup_exception = e + self.stop() + + if setup_cb: + # Create a new greenlet to handle the setup function + gr = greenlet.greenlet(on_setup) + gr.switch() + + if self._setup_exception: + pass # replaces next logging statement + #error('Setup error: {}'.format(self._setup_exception)) + raise self._setup_exception + + # Process all pending requests and notifications + while self._pending_messages: + msg = self._pending_messages.popleft() + getattr(self, '_on_{}'.format(msg[0]))(*msg[1:]) + self._async_session.run(self._on_request, self._on_notification) + self._is_running = False + self._request_cb = None + self._notification_cb = None + self._loop_thread = None + + if self._setup_exception: + raise self._setup_exception + + def stop(self): + """Stop the event loop.""" + self._async_session.stop() + + def close(self): + """Close the event loop.""" + self._async_session.close() + + def _yielding_request(self, method, args): + gr = greenlet.getcurrent() + parent = gr.parent + + def response_cb(err, rv): + pass # replaces next logging statement + #debug('response is available for greenlet %s, switching back', gr) + gr.switch(err, rv) + + self._async_session.request(method, args, response_cb) + pass # replaces next logging statement + #debug('yielding from greenlet %s to wait for response', gr) + return parent.switch() + + def _blocking_request(self, method, args): + result = [] + + def response_cb(err, rv): + result.extend([err, rv]) + self.stop() + + self._async_session.request(method, args, response_cb) + self._async_session.run(self._enqueue_request, + self._enqueue_notification) + return result + + def _enqueue_request_and_stop(self, name, args, response): + self._enqueue_request(name, args, response) + self.stop() + + def _enqueue_notification_and_stop(self, name, args): + self._enqueue_notification(name, args) + self.stop() + + def _enqueue_request(self, name, args, response): + self._pending_messages.append(('request', name, args, response,)) + + def _enqueue_notification(self, name, args): + self._pending_messages.append(('notification', name, args,)) + + def _on_request(self, name, args, response): + def handler(): + try: + rv = self._request_cb(name, args) + pass # replaces next logging statement + #debug('greenlet %s finished executing, ' + #+ 'sending %s as response', gr, rv) + response.send(rv) + except ErrorResponse as err: + pass # replaces next logging statement + #warn("error response from request '%s %s': %s", name, + #args, format_exc()) + response.send(err.args[0], error=True) + except Exception as err: + pass # replaces next logging statement + #warn("error caught while processing request '%s %s': %s", name, + #args, format_exc()) + response.send(repr(err) + "\n" + format_exc(5), error=True) + pass # replaces next logging statement + #debug('greenlet %s is now dying...', gr) + + # Create a new greenlet to handle the request + gr = greenlet.greenlet(handler) + pass # replaces next logging statement + #debug('received rpc request, greenlet %s will handle it', gr) + gr.switch() + + def _on_notification(self, name, args): + def handler(): + try: + self._notification_cb(name, args) + pass # replaces next logging statement + #debug('greenlet %s finished executing', gr) + except Exception: + pass # replaces next logging statement + #warn("error caught while processing notification '%s %s': %s", + #name, args, format_exc()) + + pass # replaces next logging statement + #debug('greenlet %s is now dying...', gr) + + gr = greenlet.greenlet(handler) + pass # replaces next logging statement + #debug('received rpc notification, greenlet %s will handle it', gr) + gr.switch() + + +class ErrorResponse(BaseException): + + """Raise this in a request handler to respond with a given error message. + + Unlike when other exceptions are caught, this gives full control off the + error response sent. When "ErrorResponse(msg)" is caught "msg" will be + sent verbatim as the error response.No traceback will be appended. + """ + + pass diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/__init__.py b/.local/lib/python3.9/site-packages/pynvim/plugin/__init__.py new file mode 100644 index 00000000..9365438b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/plugin/__init__.py @@ -0,0 +1,9 @@ +"""Nvim plugin/host subpackage.""" + +from pynvim.plugin.decorators import (autocmd, command, decode, encoding, function, + plugin, rpc_export, shutdown_hook) +from pynvim.plugin.host import Host + + +__all__ = ('Host', 'plugin', 'rpc_export', 'command', 'autocmd', + 'function', 'encoding', 'decode', 'shutdown_hook') diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/__init__.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d43b41414cdf2a00dc9935730ad595acf117f47f GIT binary patch literal 511 zcmY+By-ve06os9iCTU9+CI*I%WFSFe03?JMk&wEuc`<41wxRxsYzHWB#K`M-W#Sc> z@J%ZLmhw4{e9t-erq1&T^6TQ`kt_p*KH>0ph5m5s9|NEWBO1_<2O`9wh;Srg9E%Yi zi3BGi#i__}CdPOiz`cl1#1v2cdyEh0=m8bU+wuIl6|;`_t5#NPW$euKi>_`q^@^2W z-UAhxOY7dMMo^bFN{Cugmr&Ly%3Q{z-&?tI*|L|7ZIyJ%PR&hp*AVvFDQ#VD*1e_b zMUu5rn<8-Wo%brn8oJdfAOl1I=uszt5g-PPJ?2I3QbMR|2*F3)R{H4W&a8wyy0%K2 zUHKq1R1O-0+OG|$;luw5(EJbwJZjDfc}F@2Z@~AxpN?SFlQKQiXO~sURa5hdw~MOV x+O?AB=TB9q?`^(BvP1Fr#HK!e~NTME}wjg;?$RiGUvVeKR_L$QKQQH$^GENUp0UHi^gqrb&$qU#(2PmfMo*4 z+u@!xBDjC~Sn!MOE;P9VgprXE7>qLW*f=6Nc}hpdh@8+pJRhEBHCF6;`Mj8>q!=c$#xPSY!@ECU4L&|#yP*$52J@+hfCB<#l-8Lg16%*L5Z_|n0Kc{k@l3TOV2K2>B-ufXh>y(o4<|X=@dtt@^AR!Jc#EGhOycQ zHB;PxIpP&0J`%m)%gAZ>*uZ@gnnXVtbkz~q6X`v$2c9Kp_>O*&I2L^}rekw#jqR~B zu8iGrwe6KY@ua0Y8gR81fGAu1GXr0p1Z$ zCJywwz*BKNp}<#xx5V!!7VsYMRr$rl5MQvRBbr*1>Jeqj6MKXsSN>#ye2&JJ&)P`2%)d(>-dvFxK>xe)L&m*F3mvLZ^Y#j%?&mRZ+;4Mz!=ZJ+C z?5ksePRtX`O#~2mnx~3rVCKY(2}A@DZ$U28=$}~f1HkJC%+`3d0Iv?<8u41uc(pZN z-NtaGtONkB8nPA0R{+hlFkcP!7ZoJ00;xG-8~Fuz6K~*$H-SuTF*m=4&D;2C0a!kU zew}L!vRZ(}w7#+|gvdo$lwvM`g;T&{zRP@jA9vQ?e+N13ebnaH(8^@EaZT&@f4lzu z=Xd>Snp}7~oy&oJ5U}ujnFB9)UFSek>_V2q{P$*=|IAtb12p_pqX9FYB|ic*e8ikn zG*n77xM#9gwJ}_p$%t4G-$0}3Ak(p=!Qf&af){BZ@_CXiYMUs9Ab||1Z&!Bh+{{gqh++$EY{RQ@&laoRRVnydAlyhvr z6{Dz~Ao_JadgE@Ew&Tt~a3A9a&WJejXZ5`@?vI-H_U_=_3+`Q5ZPyD4Z`SJP zH^3VJ8eSJD=Pe@MgMM)bNnr?q7tm+y@E7Qs+u_R073VC0H@jFuX`Y8^1eXMuQlrIU z{^^Q8Ku+5Qclk3kiAXk}(zehx*jpp}wW>go8;!<3JdK(qz7MaO)9<8NyQ(Tdz_KU^ z1Zt%!N!EeeW~a4MngWXwC@xTKfnZZrxGnq)20`KC2D%Im0_ET|EM*u!7<7~sr|nEt z9)}{utE7btZUhAeY-HhDc&O?Vw>VgILP3;kzn(FkM$##q;K~E|8YFxd6_Y*?tSnr* a2C82rmgR1EO9nB%^6K6V?-jSQ?EVMA(V7VW literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/host.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/host.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8970a21cef5565851c4bb2280af868a23dbaf8d9 GIT binary patch literal 7795 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 Tw-}&s83)J$q&=ydE%W~XH6dde literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/script_host.cpython-39.pyc b/.local/lib/python3.9/site-packages/pynvim/plugin/__pycache__/script_host.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb6ef15d1ad18737f6caafcca06f936b25c091f GIT binary patch literal 8695 zcma)B%a7bfdS{VrHk;kk(;7WSlJ%gq)}w8y<(2H%YiJ#}=rCLNbs|f*^muOis}uhvbp~0rr$bZrM{7AaV`T3N}%GU$LJv zW7yrOV)0`=zWUzvRda66Qt*54ZyvaZPAkg4(aZF&fS0Q%@g=4xTyYf6xEe5r$*1b5 z@~JtReCm!ap9QCYrxqBUqElovMi0zR$tiU#$CB@bpxmiA71=g|xlYxo%62iB@6?=H zXP>iAzMH{9XTP%_?UHlA)3y$Jhqjrs=qt00h89}q(AJ!@e1Y$OrZ{zsIKU5L#6how{%`U_d=c=s_+fqo&+}Ye zR_aIlZ`|_Mnyn4HyOFF%;l=!M`NCtrV|$%m&`kU&Ypks8B0;zL z)kt)j2>>lOe&}~;p5>PCyUC3xPU`Ac8dm;FM@3)mG?VpD{E&OXDGo6mH7>OX$LSvp zx{4D21u9R0OeiD|kOh@%pn%SGUcj@!4PM04@QU2zC2sv(y!X(wvuM8MyF6Wap2du)6^4GA|96tu?9~UIu{cCqb^w{TKY&S#O z3m^L;3Oiny*r1IqdSU2?YeW9nIT2&KCA?6#jRDmD?Pkxu?u%>d&2SCWc++k*gTRJ_g;Ck86Bw@PBoUo z>$ajW@t!7`?mhKdv>WcX64%X2xw?U6PH9y{9T%JKWL8cMm)aUOniccu&}c=SPBY}0 zkt>R0wXoOF3tXSSga*c5u$t*K$xB5X11A5oba6fEco*AI-1EfS?_X>L5jJ))@K;94 z-T2kf3QY~hxRaRjY zwW{h2|5qwg|IaYZy!EQTf1<^W(F}VEDJgi|M)d+>>Ow$YK=DXG6RoXp6-ekva5>1uL5JC4*epNJH7$T^$1OWK?G9dA4f zB+zRmk?^ImbGzG2TI*6D!1du!JC5wLUEznxSt-uLWmhJ%V8JI%!6EQTWG{hrjqw7G zMMC6a-gUPHpE&+en@GJMB_^};f^34a&6bsy45r;FMZLs*A|MzqS*G)5(tOFpYv?G& zN*qTkGp_{A&I)gS_!-`QjiU5VP4QXkL*t4RxcEaf^3LBD4{;I`5+M7afLfe?4ZE@rNkhTaKxH?VSA1PeZ5s_?aObKh>RpQ`n$pxl- zjwjb3rut6G6Sgyy&#C(k&|Iop;$1v5J%U0@7uiMcOoz?pJD4Cyb*9K~78Xgank-lG>u^$F=e0Bj8u7T>>s(MHn7~qM49`KOFfxML#jwk~JZ>joF`7R>)Crt|3>M%U6BH+qWr_p~B@nVLyCt!!chXNQ%+zVXbMC*8*jX=PgnUc+8A z^Lxs`q;(pr{i;hAA09)szXu#zyipB0dIP5sei1Ces;Vb^#X1S1QsH+n-oJ(JkURa@L(yT zv8z!JA;#(0_QM#)j@S1~InM3v4&$M9a8@b~?Mr5?^j24K>d~5AKPw>$bqS9+D|unB z;|bXHObfiwDUngiKUscE%QVB5msu;#7*2rj5$CYItVAa`c|yxduGip$HSsFe7AWyuRHTUpJgJUnRfSd-bokc;G8#3Z zp%kI&cvcaS>S_%!stQ;IFqIjv)K`XPFbi)6%;+I}HPrsm-P$}-+^jsZrjMJ!t~gc$ zI#P?tL?p13q`htE9ORAlU!RpX4>LTl5vAE9f;H+I4hjHIoJU>FIe_y+SL~$2?_!m| zLWwCzP_+J`-FVY%S!IZ`Jo$X`O;~Ti;*%~8!-f&oPa^S<~SwVW#q0<$&2!4CqV~3q5m-4qLv5YbxS^eWvXzq6RI0A|vqJL)L ztSV1`P@#(JKI%1tT#d3K&V5nKb;Su(;L`%dAY&HOz|F3qgJ zI2&7k{pnG|Ac+KN-6X{^Mnus5M=QUM_Kuaaf;{g01HO#bKCokL*N zB_+(GmQU4Q;zOMLJCv9LKO90dQ_H!F&}00g_L#5~s=}P%P!4y!fS?0zc^U7^6K>Zv z@hN&`B{(8Cfmex3O_uL#nl%I` z+-QH&1wPl2?Lch!%=}V&uA)sEY<{UC^(%Fl8wq0WFO^S~=gM>SxwfiNjP=aqri8QS z3^S;dwtQwHvZCW+d1+4`5NF6`k|b3jCl6yhKFUur43pk7o`cLQ>8Qjy zMI&XTqubJVaP^@s0))j%s{Kqw$c!L6h4DiutH}34!nSbaA@71f8*V(smjq|-O;(mY zQUug%EH(a;-BtbsAvYzi5SkYejN>RHM&&z~aehZro=3F>I89U+4U=v@Uz zkI9@9`P#tj|B4dR2~{c`BA*({8;GC!C-)-n)I__)f~4>&igZT1RMU{jbp~%jr@LbR z)E?8{_dB}!^0^&C-TE@o=l+BWy&BUI3(v%GSU)5=A{H# zrOf=Hw;^M2K|yU+4nT&HC=icE=BJ0Ymz-w>?~qw;Z8CG$tjp+sN9Y%{1pBF z7bVv)t^ek?LtM^HIp^JB4AQJfQu?iqB)O!KpjC3Z{o%MJoyFV?>wis%5VuWG@_?x_ z@daLHa;jv5i9}K!^1$E)Yby^`QGEeDPLK>72anji%y$mZA3LW+C_pr2eq5h0@(f@| z!i=1i#dNj5xCbRjY#}QK!Xn%OV6xX}G8!#+2Nfi}$(NW2jO-+}{WQM*3ra39tWv0y zYn8+ERYTC1nT?VRkn6lg-S4A9<^^&l6jaBNT2{;uDW5oF#|@@a5bg}{%I3eB%Pawjf+jKwAKGQ)d{ z&v7=F-x0gZzw^=cn|B3e)?`is`=`BTs(9>ZBIzQF&|5*gu&3n<(G%&RVQwAa0a-q> ze{?5RWrDufFNhVITpCx^kFsJAt>FfGEl27gEmn{btGvQd;bkT8vSWykUBai)4WpSab OBN=09X0cW@-~E582mH7I literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/decorators.py b/.local/lib/python3.9/site-packages/pynvim/plugin/decorators.py new file mode 100644 index 00000000..e7cc5280 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/plugin/decorators.py @@ -0,0 +1,175 @@ +"""Decorators used by python host plugin system.""" + +import inspect +import logging + +from pynvim.compat import IS_PYTHON3, unicode_errors_default + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warning,) +__all__ = ('plugin', 'rpc_export', 'command', 'autocmd', 'function', + 'encoding', 'decode', 'shutdown_hook') + + +def plugin(cls): + """Tag a class as a plugin. + + This decorator is required to make the class methods discoverable by the + plugin_load method of the host. + """ + cls._nvim_plugin = True + # the _nvim_bind attribute is set to True by default, meaning that + # decorated functions have a bound Nvim instance as first argument. + # For methods in a plugin-decorated class this is not required, because + # the class initializer will already receive the nvim object. + predicate = lambda fn: hasattr(fn, '_nvim_bind') + for _, fn in inspect.getmembers(cls, predicate): + if IS_PYTHON3: + fn._nvim_bind = False + else: + fn.im_func._nvim_bind = False + return cls + + +def rpc_export(rpc_method_name, sync=False): + """Export a function or plugin method as a msgpack-rpc request handler.""" + def dec(f): + f._nvim_rpc_method_name = rpc_method_name + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = False + return f + return dec + + +def command(name, nargs=0, complete=None, range=None, count=None, bang=False, + register=False, sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim command handler.""" + def dec(f): + f._nvim_rpc_method_name = 'command:{}'.format(name) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = {} + + if range is not None: + opts['range'] = '' if range is True else str(range) + elif count is not None: + opts['count'] = count + + if bang: + opts['bang'] = '' + + if register: + opts['register'] = '' + + if nargs: + opts['nargs'] = nargs + + if complete: + opts['complete'] = complete + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'command', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def autocmd(name, pattern='*', sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim autocommand handler.""" + def dec(f): + f._nvim_rpc_method_name = 'autocmd:{}:{}'.format(name, pattern) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = { + 'pattern': pattern + } + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'autocmd', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def function(name, range=False, sync=False, allow_nested=False, eval=None): + """Tag a function or plugin method as a Nvim function handler.""" + def dec(f): + f._nvim_rpc_method_name = 'function:{}'.format(name) + f._nvim_rpc_sync = sync + f._nvim_bind = True + f._nvim_prefix_plugin_path = True + + opts = {} + + if range: + opts['range'] = '' if range is True else str(range) + + if eval: + opts['eval'] = eval + + if not sync and allow_nested: + rpc_sync = "urgent" + else: + rpc_sync = sync + + f._nvim_rpc_spec = { + 'type': 'function', + 'name': name, + 'sync': rpc_sync, + 'opts': opts + } + return f + return dec + + +def shutdown_hook(f): + """Tag a function or method as a shutdown hook.""" + f._nvim_shutdown_hook = True + f._nvim_bind = True + return f + + +def decode(mode=unicode_errors_default): + """Configure automatic encoding/decoding of strings.""" + def dec(f): + f._nvim_decode = mode + return f + return dec + + +def encoding(encoding=True): + """DEPRECATED: use pynvim.decode().""" + if isinstance(encoding, str): + encoding = True + + def dec(f): + f._nvim_decode = encoding + return f + return dec diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/host.py b/.local/lib/python3.9/site-packages/pynvim/plugin/host.py new file mode 100644 index 00000000..00af6351 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/plugin/host.py @@ -0,0 +1,276 @@ +"""Implements a Nvim host for python plugins.""" +import imp +import inspect +import logging +import os +import os.path +import re +from functools import partial +from traceback import format_exc + +from pynvim.api import decode_if_bytes, walk +from pynvim.compat import IS_PYTHON3, find_module +from pynvim.msgpack_rpc import ErrorResponse +from pynvim.plugin import script_host +from pynvim.util import format_exc_skip, get_client_info + +__all__ = ('Host') + +logger = logging.getLogger(__name__) +error, debug, info, warn = (logger.error, logger.debug, logger.info, + logger.warning,) + +host_method_spec = {"poll": {}, "specs": {"nargs": 1}, "shutdown": {}} + + +class Host(object): + + """Nvim host for python plugins. + + Takes care of loading/unloading plugins and routing msgpack-rpc + requests/notifications to the appropriate handlers. + """ + + def __init__(self, nvim): + """Set handlers for plugin_load/plugin_unload.""" + self.nvim = nvim + self._specs = {} + self._loaded = {} + self._load_errors = {} + self._notification_handlers = { + 'nvim_error_event': self._on_error_event + } + self._request_handlers = { + 'poll': lambda: 'ok', + 'specs': self._on_specs_request, + 'shutdown': self.shutdown + } + + # Decode per default for Python3 + self._decode_default = IS_PYTHON3 + + def _on_async_err(self, msg): + # uncaught python exception + self.nvim.err_write(msg, async_=True) + + def _on_error_event(self, kind, msg): + # error from nvim due to async request + # like nvim.command(..., async_=True) + errmsg = "{}: Async request caused an error:\n{}\n".format( + self.name, decode_if_bytes(msg)) + self.nvim.err_write(errmsg, async_=True) + return errmsg + + def start(self, plugins): + """Start listening for msgpack-rpc requests and notifications.""" + self.nvim.run_loop(self._on_request, + self._on_notification, + lambda: self._load(plugins), + err_cb=self._on_async_err) + + def shutdown(self): + """Shutdown the host.""" + self._unload() + self.nvim.stop_loop() + + def _wrap_delayed_function(self, cls, delayed_handlers, name, sync, + module_handlers, path, *args): + # delete the delayed handlers to be sure + for handler in delayed_handlers: + method_name = handler._nvim_registered_name + if handler._nvim_rpc_sync: + del self._request_handlers[method_name] + else: + del self._notification_handlers[method_name] + # create an instance of the plugin and pass the nvim object + plugin = cls(self._configure_nvim_for(cls)) + + # discover handlers in the plugin instance + self._discover_functions(plugin, module_handlers, path, False) + + if sync: + self._request_handlers[name](*args) + else: + self._notification_handlers[name](*args) + + def _wrap_function(self, fn, sync, decode, nvim_bind, name, *args): + if decode: + args = walk(decode_if_bytes, args, decode) + if nvim_bind is not None: + args.insert(0, nvim_bind) + try: + return fn(*args) + except Exception: + if sync: + msg = ("error caught in request handler '{} {}':\n{}" + .format(name, args, format_exc_skip(1))) + raise ErrorResponse(msg) + else: + msg = ("error caught in async handler '{} {}'\n{}\n" + .format(name, args, format_exc_skip(1))) + self._on_async_err(msg + "\n") + + def _on_request(self, name, args): + """Handle a msgpack-rpc request.""" + if IS_PYTHON3: + name = decode_if_bytes(name) + handler = self._request_handlers.get(name, None) + if not handler: + msg = self._missing_handler_error(name, 'request') + pass # replaces next logging statement + #error(msg) + raise ErrorResponse(msg) + + pass # replaces next logging statement + #debug('calling request handler for "%s", args: "%s"', name, args) + rv = handler(*args) + pass # replaces next logging statement + #debug("request handler for '%s %s' returns: %s", name, args, rv) + return rv + + def _on_notification(self, name, args): + """Handle a msgpack-rpc notification.""" + if IS_PYTHON3: + name = decode_if_bytes(name) + handler = self._notification_handlers.get(name, None) + if not handler: + msg = self._missing_handler_error(name, 'notification') + pass # replaces next logging statement + #error(msg) + self._on_async_err(msg + "\n") + return + + pass # replaces next logging statement + #debug('calling notification handler for "%s", args: "%s"', name, args) + handler(*args) + + def _missing_handler_error(self, name, kind): + msg = 'no {} handler registered for "{}"'.format(kind, name) + pathmatch = re.match(r'(.+):[^:]+:[^:]+', name) + if pathmatch: + loader_error = self._load_errors.get(pathmatch.group(1)) + if loader_error is not None: + msg = msg + "\n" + loader_error + return msg + + def _load(self, plugins): + has_script = False + for path in plugins: + err = None + if path in self._loaded: + pass # replaces next logging statement + #error('{} is already loaded'.format(path)) + continue + try: + if path == "script_host.py": + module = script_host + has_script = True + else: + directory, name = os.path.split(os.path.splitext(path)[0]) + file, pathname, descr = find_module(name, [directory]) + module = imp.load_module(name, file, pathname, descr) + handlers = [] + self._discover_classes(module, handlers, path) + self._discover_functions(module, handlers, path, False) + if not handlers: + pass # replaces next logging statement + #error('{} exports no handlers'.format(path)) + continue + self._loaded[path] = {'handlers': handlers, 'module': module} + except Exception as e: + err = ('Encountered {} loading plugin at {}: {}\n{}' + .format(type(e).__name__, path, e, format_exc(5))) + pass # replaces next logging statement + #error(err) + self._load_errors[path] = err + + kind = ("script-host" if len(plugins) == 1 and has_script + else "rplugin-host") + info = get_client_info(kind, 'host', host_method_spec) + self.name = info[0] + self.nvim.api.set_client_info(*info, async_=True) + + def _unload(self): + for path, plugin in self._loaded.items(): + handlers = plugin['handlers'] + for handler in handlers: + method_name = handler._nvim_registered_name + if hasattr(handler, '_nvim_shutdown_hook'): + handler() + elif handler._nvim_rpc_sync: + del self._request_handlers[method_name] + else: + del self._notification_handlers[method_name] + self._specs = {} + self._loaded = {} + + def _discover_classes(self, module, handlers, plugin_path): + for _, cls in inspect.getmembers(module, inspect.isclass): + if getattr(cls, '_nvim_plugin', False): + # discover handlers in the plugin instance + self._discover_functions(cls, handlers, plugin_path, True) + + def _discover_functions(self, obj, handlers, plugin_path, delay): + def predicate(o): + return hasattr(o, '_nvim_rpc_method_name') + + cls_handlers = [] + specs = [] + objdecode = getattr(obj, '_nvim_decode', self._decode_default) + for _, fn in inspect.getmembers(obj, predicate): + method = fn._nvim_rpc_method_name + if fn._nvim_prefix_plugin_path: + method = '{}:{}'.format(plugin_path, method) + sync = fn._nvim_rpc_sync + if delay: + fn_wrapped = partial(self._wrap_delayed_function, obj, + cls_handlers, method, sync, + handlers, plugin_path) + else: + decode = getattr(fn, '_nvim_decode', objdecode) + nvim_bind = None + if fn._nvim_bind: + nvim_bind = self._configure_nvim_for(fn) + + fn_wrapped = partial(self._wrap_function, fn, + sync, decode, nvim_bind, method) + self._copy_attributes(fn, fn_wrapped) + fn_wrapped._nvim_registered_name = method + # register in the rpc handler dict + if sync: + if method in self._request_handlers: + raise Exception(('Request handler for "{}" is ' + + 'already registered').format(method)) + self._request_handlers[method] = fn_wrapped + else: + if method in self._notification_handlers: + raise Exception(('Notification handler for "{}" is ' + + 'already registered').format(method)) + self._notification_handlers[method] = fn_wrapped + if hasattr(fn, '_nvim_rpc_spec'): + specs.append(fn._nvim_rpc_spec) + handlers.append(fn_wrapped) + cls_handlers.append(fn_wrapped) + if specs: + self._specs[plugin_path] = specs + + def _copy_attributes(self, fn, fn2): + # Copy _nvim_* attributes from the original function + for attr in dir(fn): + if attr.startswith('_nvim_'): + setattr(fn2, attr, getattr(fn, attr)) + + def _on_specs_request(self, path): + if IS_PYTHON3: + path = decode_if_bytes(path) + if path in self._load_errors: + self.nvim.out_write(self._load_errors[path] + '\n') + return self._specs.get(path, 0) + + def _configure_nvim_for(self, obj): + # Configure a nvim instance for obj (checks encoding configuration) + nvim = self.nvim + decode = getattr(obj, '_nvim_decode', self._decode_default) + if decode: + nvim = nvim.with_decode(decode) + return nvim diff --git a/.local/lib/python3.9/site-packages/pynvim/plugin/script_host.py b/.local/lib/python3.9/site-packages/pynvim/plugin/script_host.py new file mode 100644 index 00000000..a3a0d2d3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/plugin/script_host.py @@ -0,0 +1,276 @@ +"""Legacy python/python3-vim emulation.""" +import imp +import io +import logging +import os +import sys +from types import ModuleType + +from pynvim.api import Nvim, walk +from pynvim.compat import IS_PYTHON3 +from pynvim.msgpack_rpc import ErrorResponse +from pynvim.plugin.decorators import plugin, rpc_export +from pynvim.util import format_exc_skip + +__all__ = ('ScriptHost',) + + +logger = logging.getLogger(__name__) +debug, info, warn = (logger.debug, logger.info, logger.warn,) + +if IS_PYTHON3: + basestring = str + + if sys.version_info >= (3, 4): + from importlib.machinery import PathFinder + + PYTHON_SUBDIR = 'python3' +else: + PYTHON_SUBDIR = 'python2' + + +@plugin +class ScriptHost(object): + + """Provides an environment for running python plugins created for Vim.""" + + def __init__(self, nvim): + """Initialize the legacy python-vim environment.""" + self.setup(nvim) + # context where all code will run + self.module = ModuleType('__main__') + nvim.script_context = self.module + # it seems some plugins assume 'sys' is already imported, so do it now + exec('import sys', self.module.__dict__) + self.legacy_vim = LegacyVim.from_nvim(nvim) + sys.modules['vim'] = self.legacy_vim + # mimic Vim by importing vim module by default. + exec('import vim', self.module.__dict__) + # Handle DirChanged. #296 + nvim.command( + 'au DirChanged * call rpcnotify({}, "python_chdir", v:event.cwd)' + .format(nvim.channel_id), async_=True) + # XXX: Avoid race condition. + # https://github.com/neovim/pynvim/pull/296#issuecomment-358970531 + # TODO(bfredl): when host initialization has been refactored, + # to make __init__ safe again, the following should work: + # os.chdir(nvim.eval('getcwd()', async_=False)) + nvim.command('call rpcnotify({}, "python_chdir", getcwd())' + .format(nvim.channel_id), async_=True) + + def setup(self, nvim): + """Setup import hooks and global streams. + + This will add import hooks for importing modules from runtime + directories and patch the sys module so 'print' calls will be + forwarded to Nvim. + """ + self.nvim = nvim + pass # replaces next logging statement + #info('install import hook/path') + self.hook = path_hook(nvim) + sys.path_hooks.append(self.hook) + nvim.VIM_SPECIAL_PATH = '_vim_path_' + sys.path.append(nvim.VIM_SPECIAL_PATH) + pass # replaces next logging statement + #info('redirect sys.stdout and sys.stderr') + self.saved_stdout = sys.stdout + self.saved_stderr = sys.stderr + sys.stdout = RedirectStream(lambda data: nvim.out_write(data)) + sys.stderr = RedirectStream(lambda data: nvim.err_write(data)) + + def teardown(self): + """Restore state modified from the `setup` call.""" + nvim = self.nvim + pass # replaces next logging statement + #info('uninstall import hook/path') + sys.path.remove(nvim.VIM_SPECIAL_PATH) + sys.path_hooks.remove(self.hook) + pass # replaces next logging statement + #info('restore sys.stdout and sys.stderr') + sys.stdout = self.saved_stdout + sys.stderr = self.saved_stderr + + @rpc_export('python_execute', sync=True) + def python_execute(self, script, range_start, range_stop): + """Handle the `python` ex command.""" + self._set_current_range(range_start, range_stop) + try: + exec(script, self.module.__dict__) + except Exception: + raise ErrorResponse(format_exc_skip(1)) + + @rpc_export('python_execute_file', sync=True) + def python_execute_file(self, file_path, range_start, range_stop): + """Handle the `pyfile` ex command.""" + self._set_current_range(range_start, range_stop) + with open(file_path) as f: + script = compile(f.read(), file_path, 'exec') + try: + exec(script, self.module.__dict__) + except Exception: + raise ErrorResponse(format_exc_skip(1)) + + @rpc_export('python_do_range', sync=True) + def python_do_range(self, start, stop, code): + """Handle the `pydo` ex command.""" + self._set_current_range(start, stop) + nvim = self.nvim + start -= 1 + fname = '_vim_pydo' + + # define the function + function_def = 'def %s(line, linenr):\n %s' % (fname, code,) + exec(function_def, self.module.__dict__) + # get the function + function = self.module.__dict__[fname] + while start < stop: + # Process batches of 5000 to avoid the overhead of making multiple + # API calls for every line. Assuming an average line length of 100 + # bytes, approximately 488 kilobytes will be transferred per batch, + # which can be done very quickly in a single API call. + sstart = start + sstop = min(start + 5000, stop) + lines = nvim.current.buffer.api.get_lines(sstart, sstop, True) + + exception = None + newlines = [] + linenr = sstart + 1 + for i, line in enumerate(lines): + result = function(line, linenr) + if result is None: + # Update earlier lines, and skip to the next + if newlines: + end = sstart + len(newlines) - 1 + nvim.current.buffer.api.set_lines(sstart, end, + True, newlines) + sstart += len(newlines) + 1 + newlines = [] + pass + elif isinstance(result, basestring): + newlines.append(result) + else: + exception = TypeError('pydo should return a string ' + + 'or None, found %s instead' + % result.__class__.__name__) + break + linenr += 1 + + start = sstop + if newlines: + end = sstart + len(newlines) + nvim.current.buffer.api.set_lines(sstart, end, True, newlines) + if exception: + raise exception + # delete the function + del self.module.__dict__[fname] + + @rpc_export('python_eval', sync=True) + def python_eval(self, expr): + """Handle the `pyeval` vim function.""" + return eval(expr, self.module.__dict__) + + @rpc_export('python_chdir', sync=False) + def python_chdir(self, cwd): + """Handle working directory changes.""" + os.chdir(cwd) + + def _set_current_range(self, start, stop): + current = self.legacy_vim.current + current.range = current.buffer.range(start, stop) + + +class RedirectStream(io.IOBase): + def __init__(self, redirect_handler): + self.redirect_handler = redirect_handler + + def write(self, data): + self.redirect_handler(data) + + def writelines(self, seq): + self.redirect_handler('\n'.join(seq)) + + +if IS_PYTHON3: + num_types = (int, float) +else: + num_types = (int, long, float) # noqa: F821 + + +def num_to_str(obj): + if isinstance(obj, num_types): + return str(obj) + else: + return obj + + +class LegacyVim(Nvim): + def eval(self, expr): + obj = self.request("vim_eval", expr) + return walk(num_to_str, obj) + + +# Copied/adapted from :help if_pyth. +def path_hook(nvim): + def _get_paths(): + if nvim._thread_invalid(): + return [] + return discover_runtime_directories(nvim) + + def _find_module(fullname, oldtail, path): + idx = oldtail.find('.') + if idx > 0: + name = oldtail[:idx] + tail = oldtail[idx + 1:] + fmr = imp.find_module(name, path) + module = imp.find_module(fullname[:-len(oldtail)] + name, *fmr) + return _find_module(fullname, tail, module.__path__) + else: + return imp.find_module(fullname, path) + + class VimModuleLoader(object): + def __init__(self, module): + self.module = module + + def load_module(self, fullname, path=None): + # Check sys.modules, required for reload (see PEP302). + try: + return sys.modules[fullname] + except KeyError: + pass + return imp.load_module(fullname, *self.module) + + class VimPathFinder(object): + @staticmethod + def find_module(fullname, path=None): + """Method for Python 2.7 and 3.3.""" + try: + return VimModuleLoader( + _find_module(fullname, fullname, path or _get_paths())) + except ImportError: + return None + + @staticmethod + def find_spec(fullname, target=None): + """Method for Python 3.4+.""" + return PathFinder.find_spec(fullname, _get_paths(), target) + + def hook(path): + if path == nvim.VIM_SPECIAL_PATH: + return VimPathFinder + else: + raise ImportError + + return hook + + +def discover_runtime_directories(nvim): + rv = [] + for rtp in nvim.list_runtime_paths(): + if not os.path.exists(rtp): + continue + for subdir in ['pythonx', PYTHON_SUBDIR]: + path = os.path.join(rtp, subdir) + if os.path.exists(path): + rv.append(path) + return rv diff --git a/.local/lib/python3.9/site-packages/pynvim/util.py b/.local/lib/python3.9/site-packages/pynvim/util.py new file mode 100644 index 00000000..dcc979df --- /dev/null +++ b/.local/lib/python3.9/site-packages/pynvim/util.py @@ -0,0 +1,42 @@ +"""Shared utility functions.""" + +import sys +from traceback import format_exception + + +def format_exc_skip(skip, limit=None): + """Like traceback.format_exc but allow skipping the first frames.""" + etype, val, tb = sys.exc_info() + for i in range(skip): + tb = tb.tb_next + return (''.join(format_exception(etype, val, tb, limit))).rstrip() + + +# Taken from SimpleNamespace in python 3 +class Version: + """Helper class for version info.""" + + def __init__(self, **kwargs): + """Create the Version object.""" + self.__dict__.update(kwargs) + + def __repr__(self): + """Return str representation of the Version.""" + keys = sorted(self.__dict__) + items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) + return "{}({})".format(type(self).__name__, ", ".join(items)) + + def __eq__(self, other): + """Check if version is same as other.""" + return self.__dict__ == other.__dict__ + + +def get_client_info(kind, type_, method_spec): + """Returns a tuple describing the client.""" + name = "python{}-{}".format(sys.version_info[0], kind) + attributes = {"license": "Apache v2", + "website": "github.com/neovim/pynvim"} + return (name, VERSION.__dict__, type_, method_spec, attributes) + + +VERSION = Version(major=0, minor=4, patch=2, prerelease='') diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/PKG-INFO b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/PKG-INFO new file mode 100644 index 00000000..f0eb0dd1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/PKG-INFO @@ -0,0 +1,44 @@ +Metadata-Version: 2.1 +Name: pywal +Version: 3.3.0 +Summary: Generate and change color-schemes on the fly +Home-page: https://github.com/dylanaraps/pywal +Author: Dylan Araps +Author-email: dylan.araps@gmail.com +License: MIT +Download-URL: https://github.com/dylanaraps/pywal/archive/3.3.0.tar.gz +Description:

+

Generate and change color-schemes on the fly.

+ +
+ + img + + Pywal is a tool that generates a color palette from the dominant colors in an image. It then applies the colors system-wide and on-the-fly in all of your favourite programs. + + There are currently 5 supported color generation backends, each providing a different palette of colors from each image. You're bound to find an appealing color-scheme. + + Pywal also supports predefined themes and has over 250 themes built-in. You can also create your own theme files to share with others. + + The goal of Pywal was to be as out of the way as possible. It doesn't modify any of your existing configuration files. Instead it works around them and provides tools to integrate your system as you see fit. + + Terminal emulators and TTYs have their color-schemes updated in real-time with no delay. With minimal configuration this functionality can be extended to almost anything running on your system. + + ### More: \[[Installation](https://github.com/dylanaraps/pywal/wiki/Installation)\] \[[Getting Started](https://github.com/dylanaraps/pywal/wiki/Getting-Started)\] \[[Customization](https://github.com/dylanaraps/pywal/wiki/Customization)\] \[[Wiki](https://github.com/dylanaraps/pywal/wiki)\] \[[Screenshots](https://www.reddit.com/r/unixporn/search?q=wal&restrict_sr=on&sort=relevance&t=all)\] + +Keywords: wal colorscheme terminal-emulators changing-colorschemes +Platform: UNKNOWN +Classifier: Environment :: X11 Applications +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX :: Linux +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Python: >=3.5 +Description-Content-Type: text/markdown diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/SOURCES.txt b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/SOURCES.txt new file mode 100644 index 00000000..84c7fcb3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/SOURCES.txt @@ -0,0 +1,321 @@ +.pylintrc +LICENSE.md +MANIFEST.in +README.md +setup.cfg +setup.py +pywal/__init__.py +pywal/__main__.py +pywal/colors.py +pywal/export.py +pywal/image.py +pywal/reload.py +pywal/sequences.py +pywal/settings.py +pywal/theme.py +pywal/util.py +pywal/wallpaper.py +pywal.egg-info/PKG-INFO +pywal.egg-info/SOURCES.txt +pywal.egg-info/dependency_links.txt +pywal.egg-info/entry_points.txt +pywal.egg-info/not-zip-safe +pywal.egg-info/top_level.txt +pywal/backends/__init__.py +pywal/backends/colorthief.py +pywal/backends/colorz.py +pywal/backends/haishoku.py +pywal/backends/schemer2.py +pywal/backends/wal.py +pywal/colorschemes/dark/3024.json +pywal/colorschemes/dark/ashes.json +pywal/colorschemes/dark/base16-3024.json +pywal/colorschemes/dark/base16-apathy.json +pywal/colorschemes/dark/base16-ashes.json +pywal/colorschemes/dark/base16-atelier-cave.json +pywal/colorschemes/dark/base16-atelier-dune.json +pywal/colorschemes/dark/base16-atelier-estuary.json +pywal/colorschemes/dark/base16-atelier-forest.json +pywal/colorschemes/dark/base16-atelier-heath.json +pywal/colorschemes/dark/base16-atelier-lakeside.json +pywal/colorschemes/dark/base16-atelier-plateau.json +pywal/colorschemes/dark/base16-atelier-savanna.json +pywal/colorschemes/dark/base16-atelier-seaside.json +pywal/colorschemes/dark/base16-atelier-sulphurpool.json +pywal/colorschemes/dark/base16-bespin.json +pywal/colorschemes/dark/base16-black-metal-bathory.json +pywal/colorschemes/dark/base16-black-metal-burzum.json +pywal/colorschemes/dark/base16-black-metal-funeral.json +pywal/colorschemes/dark/base16-black-metal-gorgoroth.json +pywal/colorschemes/dark/base16-black-metal-immortal.json +pywal/colorschemes/dark/base16-black-metal-khold.json +pywal/colorschemes/dark/base16-black-metal-marduk.json +pywal/colorschemes/dark/base16-black-metal-mayhem.json +pywal/colorschemes/dark/base16-black-metal-nile.json +pywal/colorschemes/dark/base16-black-metal-venom.json +pywal/colorschemes/dark/base16-black-metal.json +pywal/colorschemes/dark/base16-brewer.json +pywal/colorschemes/dark/base16-bright.json +pywal/colorschemes/dark/base16-brushtrees.json +pywal/colorschemes/dark/base16-chalk.json +pywal/colorschemes/dark/base16-circus.json +pywal/colorschemes/dark/base16-classic.json +pywal/colorschemes/dark/base16-codeschool.json +pywal/colorschemes/dark/base16-default.json +pywal/colorschemes/dark/base16-dracula.json +pywal/colorschemes/dark/base16-eighties.json +pywal/colorschemes/dark/base16-embers.json +pywal/colorschemes/dark/base16-flat.json +pywal/colorschemes/dark/base16-google.json +pywal/colorschemes/dark/base16-grayscale.json +pywal/colorschemes/dark/base16-greenscreen.json +pywal/colorschemes/dark/base16-gruvbox-hard.json +pywal/colorschemes/dark/base16-gruvbox-medium.json +pywal/colorschemes/dark/base16-gruvbox-pale.json +pywal/colorschemes/dark/base16-gruvbox-soft.json +pywal/colorschemes/dark/base16-harmonic.json +pywal/colorschemes/dark/base16-hopscotch.json +pywal/colorschemes/dark/base16-icy.json +pywal/colorschemes/dark/base16-irblack.json +pywal/colorschemes/dark/base16-isotope.json +pywal/colorschemes/dark/base16-macintosh.json +pywal/colorschemes/dark/base16-marrakesh.json +pywal/colorschemes/dark/base16-materia.json +pywal/colorschemes/dark/base16-material-palenight.json +pywal/colorschemes/dark/base16-material.json +pywal/colorschemes/dark/base16-materialer.json +pywal/colorschemes/dark/base16-mellow-purple.json +pywal/colorschemes/dark/base16-mocha.json +pywal/colorschemes/dark/base16-monokai.json +pywal/colorschemes/dark/base16-nord.json +pywal/colorschemes/dark/base16-ocean.json +pywal/colorschemes/dark/base16-oceanicnext.json +pywal/colorschemes/dark/base16-onedark.json +pywal/colorschemes/dark/base16-outrun.json +pywal/colorschemes/dark/base16-paraiso.json +pywal/colorschemes/dark/base16-phd.json +pywal/colorschemes/dark/base16-pico.json +pywal/colorschemes/dark/base16-pop.json +pywal/colorschemes/dark/base16-porple.json +pywal/colorschemes/dark/base16-railscasts.json +pywal/colorschemes/dark/base16-rebecca.json +pywal/colorschemes/dark/base16-seti.json +pywal/colorschemes/dark/base16-solarflare.json +pywal/colorschemes/dark/base16-solarized.json +pywal/colorschemes/dark/base16-spacemacs.json +pywal/colorschemes/dark/base16-summerfruit.json +pywal/colorschemes/dark/base16-tomorrow-night.json +pywal/colorschemes/dark/base16-tube.json +pywal/colorschemes/dark/base16-twilight.json +pywal/colorschemes/dark/base16-unikitty.json +pywal/colorschemes/dark/base16-woodland.json +pywal/colorschemes/dark/base16-xcode-dusk.json +pywal/colorschemes/dark/base16-zenburn.json +pywal/colorschemes/dark/base16tooth.json +pywal/colorschemes/dark/darktooth.json +pywal/colorschemes/dark/dkeg-5725.json +pywal/colorschemes/dark/dkeg-amiox.json +pywal/colorschemes/dark/dkeg-bark.json +pywal/colorschemes/dark/dkeg-blend.json +pywal/colorschemes/dark/dkeg-blok.json +pywal/colorschemes/dark/dkeg-bluetype.json +pywal/colorschemes/dark/dkeg-blumune.json +pywal/colorschemes/dark/dkeg-book.json +pywal/colorschemes/dark/dkeg-branch.json +pywal/colorschemes/dark/dkeg-brownstone.json +pywal/colorschemes/dark/dkeg-bulb.json +pywal/colorschemes/dark/dkeg-chaires.json +pywal/colorschemes/dark/dkeg-coco.json +pywal/colorschemes/dark/dkeg-corduroy.json +pywal/colorschemes/dark/dkeg-depth.json +pywal/colorschemes/dark/dkeg-designr.json +pywal/colorschemes/dark/dkeg-diner.json +pywal/colorschemes/dark/dkeg-escen.json +pywal/colorschemes/dark/dkeg-fendr.json +pywal/colorschemes/dark/dkeg-flapr.json +pywal/colorschemes/dark/dkeg-forst.json +pywal/colorschemes/dark/dkeg-fury.json +pywal/colorschemes/dark/dkeg-harbing.json +pywal/colorschemes/dark/dkeg-kit.json +pywal/colorschemes/dark/dkeg-leaf.json +pywal/colorschemes/dark/dkeg-link.json +pywal/colorschemes/dark/dkeg-mattd.json +pywal/colorschemes/dark/dkeg-novmbr.json +pywal/colorschemes/dark/dkeg-owl.json +pywal/colorschemes/dark/dkeg-paints.json +pywal/colorschemes/dark/dkeg-parkd.json +pywal/colorschemes/dark/dkeg-pastely.json +pywal/colorschemes/dark/dkeg-petal.json +pywal/colorschemes/dark/dkeg-poly.json +pywal/colorschemes/dark/dkeg-prevail.json +pywal/colorschemes/dark/dkeg-provrb.json +pywal/colorschemes/dark/dkeg-raild.json +pywal/colorschemes/dark/dkeg-relax.json +pywal/colorschemes/dark/dkeg-scag.json +pywal/colorschemes/dark/dkeg-scape.json +pywal/colorschemes/dark/dkeg-shade.json +pywal/colorschemes/dark/dkeg-simplicity.json +pywal/colorschemes/dark/dkeg-skigh.json +pywal/colorschemes/dark/dkeg-slate.json +pywal/colorschemes/dark/dkeg-soundwave.json +pywal/colorschemes/dark/dkeg-spire.json +pywal/colorschemes/dark/dkeg-sprout.json +pywal/colorschemes/dark/dkeg-squares.json +pywal/colorschemes/dark/dkeg-stv.json +pywal/colorschemes/dark/dkeg-subtle.json +pywal/colorschemes/dark/dkeg-sundr.json +pywal/colorschemes/dark/dkeg-tealights.json +pywal/colorschemes/dark/dkeg-traffic.json +pywal/colorschemes/dark/dkeg-transposet.json +pywal/colorschemes/dark/dkeg-urban.json +pywal/colorschemes/dark/dkeg-vans.json +pywal/colorschemes/dark/dkeg-victory.json +pywal/colorschemes/dark/dkeg-view.json +pywal/colorschemes/dark/dkeg-wintry.json +pywal/colorschemes/dark/gruvbox.json +pywal/colorschemes/dark/hybrid-material.json +pywal/colorschemes/dark/monokai.json +pywal/colorschemes/dark/sexy-astromouse.json +pywal/colorschemes/dark/sexy-belge.json +pywal/colorschemes/dark/sexy-bitmute.json +pywal/colorschemes/dark/sexy-cloud.json +pywal/colorschemes/dark/sexy-colorfulcolors.json +pywal/colorschemes/dark/sexy-dawn.json +pywal/colorschemes/dark/sexy-deafened.json +pywal/colorschemes/dark/sexy-derp.json +pywal/colorschemes/dark/sexy-digerati.json +pywal/colorschemes/dark/sexy-doomicideocean.json +pywal/colorschemes/dark/sexy-dotshare.json +pywal/colorschemes/dark/sexy-dwmrob.json +pywal/colorschemes/dark/sexy-eqie6.json +pywal/colorschemes/dark/sexy-euphrasia.json +pywal/colorschemes/dark/sexy-gjm.json +pywal/colorschemes/dark/sexy-gnometerm.json +pywal/colorschemes/dark/sexy-gotham.json +pywal/colorschemes/dark/sexy-gslob-nature-suede.json +pywal/colorschemes/dark/sexy-hund.json +pywal/colorschemes/dark/sexy-hybrid.json +pywal/colorschemes/dark/sexy-insignificato.json +pywal/colorschemes/dark/sexy-invisibone.json +pywal/colorschemes/dark/sexy-jasonwryan.json +pywal/colorschemes/dark/sexy-kasugano.json +pywal/colorschemes/dark/sexy-material.json +pywal/colorschemes/dark/sexy-mikado.json +pywal/colorschemes/dark/sexy-mikazuki.json +pywal/colorschemes/dark/sexy-monokai.json +pywal/colorschemes/dark/sexy-muse.json +pywal/colorschemes/dark/sexy-nancy.json +pywal/colorschemes/dark/sexy-navy-and-ivory.json +pywal/colorschemes/dark/sexy-neon.json +pywal/colorschemes/dark/sexy-numixdarkest.json +pywal/colorschemes/dark/sexy-orangish.json +pywal/colorschemes/dark/sexy-parker_brothers.json +pywal/colorschemes/dark/sexy-phrak1.json +pywal/colorschemes/dark/sexy-pretty-and-pastel.json +pywal/colorschemes/dark/sexy-rasi.json +pywal/colorschemes/dark/sexy-rezza.json +pywal/colorschemes/dark/sexy-rydgel.json +pywal/colorschemes/dark/sexy-s3r0-modified.json +pywal/colorschemes/dark/sexy-sexcolors.json +pywal/colorschemes/dark/sexy-simple_rainbow.json +pywal/colorschemes/dark/sexy-splurge.json +pywal/colorschemes/dark/sexy-swayr.json +pywal/colorschemes/dark/sexy-sweetlove.json +pywal/colorschemes/dark/sexy-tango.json +pywal/colorschemes/dark/sexy-tangoesque.json +pywal/colorschemes/dark/sexy-tartan.json +pywal/colorschemes/dark/sexy-theme2.json +pywal/colorschemes/dark/sexy-thwump.json +pywal/colorschemes/dark/sexy-tlh.json +pywal/colorschemes/dark/sexy-trim-yer-beard.json +pywal/colorschemes/dark/sexy-user-77-mashup-colors.json +pywal/colorschemes/dark/sexy-vacuous2.json +pywal/colorschemes/dark/sexy-visibone-alt-2.json +pywal/colorschemes/dark/sexy-visibone.json +pywal/colorschemes/dark/sexy-x-dotshare.json +pywal/colorschemes/dark/sexy-zenburn.json +pywal/colorschemes/dark/solarized.json +pywal/colorschemes/dark/tempus_autumn.json +pywal/colorschemes/dark/tempus_dusk.json +pywal/colorschemes/dark/tempus_future.json +pywal/colorschemes/dark/tempus_rift.json +pywal/colorschemes/dark/tempus_spring.json +pywal/colorschemes/dark/tempus_summer.json +pywal/colorschemes/dark/tempus_warp.json +pywal/colorschemes/dark/tempus_winter.json +pywal/colorschemes/dark/vscode.json +pywal/colorschemes/dark/zenburn.json +pywal/colorschemes/light/3024.json +pywal/colorschemes/light/ashes.json +pywal/colorschemes/light/base16-atelier-cave.json +pywal/colorschemes/light/base16-atelier-dune.json +pywal/colorschemes/light/base16-atelier-estuary.json +pywal/colorschemes/light/base16-atelier-forest.json +pywal/colorschemes/light/base16-atelier-heath.json +pywal/colorschemes/light/base16-atelier-lakeside.json +pywal/colorschemes/light/base16-atelier-plateau.json +pywal/colorschemes/light/base16-atelier-savanna.json +pywal/colorschemes/light/base16-atelier-seaside.json +pywal/colorschemes/light/base16-atelier-sulphurpool.json +pywal/colorschemes/light/base16-classic.json +pywal/colorschemes/light/base16-cupcake.json +pywal/colorschemes/light/base16-cupertino.json +pywal/colorschemes/light/base16-default.json +pywal/colorschemes/light/base16-github.json +pywal/colorschemes/light/base16-google.json +pywal/colorschemes/light/base16-grayscale.json +pywal/colorschemes/light/base16-gruvbox-hard.json +pywal/colorschemes/light/base16-gruvbox-medium.json +pywal/colorschemes/light/base16-gruvbox-soft.json +pywal/colorschemes/light/base16-harmonic.json +pywal/colorschemes/light/base16-materialer.json +pywal/colorschemes/light/base16-mexico.json +pywal/colorschemes/light/base16-one.json +pywal/colorschemes/light/base16-shapeshifter.json +pywal/colorschemes/light/base16-solarized.json +pywal/colorschemes/light/base16-summerfruit.json +pywal/colorschemes/light/base16-tomorrow.json +pywal/colorschemes/light/base16-unikitty.json +pywal/colorschemes/light/github.json +pywal/colorschemes/light/sexy-mostly-bright.json +pywal/colorschemes/light/solarized.json +pywal/colorschemes/light/tempus_dawn.json +pywal/colorschemes/light/tempus_fugit.json +pywal/colorschemes/light/tempus_past.json +pywal/colorschemes/light/tempus_totus.json +pywal/scripts/gtk_reload.py +pywal/templates/colors +pywal/templates/colors-kitty.conf +pywal/templates/colors-konsole.colorscheme +pywal/templates/colors-oomox +pywal/templates/colors-putty.reg +pywal/templates/colors-rofi-dark.rasi +pywal/templates/colors-rofi-light.rasi +pywal/templates/colors-speedcrunch.json +pywal/templates/colors-sway +pywal/templates/colors-tty.sh +pywal/templates/colors-wal-dmenu.h +pywal/templates/colors-wal-dwm.h +pywal/templates/colors-wal-st.h +pywal/templates/colors-wal-tabbed.h +pywal/templates/colors-wal.vim +pywal/templates/colors-waybar.css +pywal/templates/colors.Xresources +pywal/templates/colors.css +pywal/templates/colors.hs +pywal/templates/colors.json +pywal/templates/colors.scss +pywal/templates/colors.sh +pywal/templates/colors.yml +tests/__init__.py +tests/test_colors.py +tests/test_export.py +tests/test_image.py +tests/test_sequences.py +tests/test_util.py +tests/test_files/test.jpg +tests/test_files/test.png +tests/test_files/test2.jpg +tests/test_files/test_file +tests/test_files/test_file.json +tests/test_files/test_file2.json \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/dependency_links.txt b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/entry_points.txt b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/entry_points.txt new file mode 100644 index 00000000..57523291 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +wal = pywal.__main__:main + diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/installed-files.txt b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/installed-files.txt new file mode 100644 index 00000000..448dd526 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/installed-files.txt @@ -0,0 +1,322 @@ +../../../../bin/wal +../pywal/__init__.py +../pywal/__main__.py +../pywal/__pycache__/__init__.cpython-39.pyc +../pywal/__pycache__/__main__.cpython-39.pyc +../pywal/__pycache__/colors.cpython-39.pyc +../pywal/__pycache__/export.cpython-39.pyc +../pywal/__pycache__/image.cpython-39.pyc +../pywal/__pycache__/reload.cpython-39.pyc +../pywal/__pycache__/sequences.cpython-39.pyc +../pywal/__pycache__/settings.cpython-39.pyc +../pywal/__pycache__/theme.cpython-39.pyc +../pywal/__pycache__/util.cpython-39.pyc +../pywal/__pycache__/wallpaper.cpython-39.pyc +../pywal/backends/__init__.py +../pywal/backends/__pycache__/__init__.cpython-39.pyc +../pywal/backends/__pycache__/colorthief.cpython-39.pyc +../pywal/backends/__pycache__/colorz.cpython-39.pyc +../pywal/backends/__pycache__/haishoku.cpython-39.pyc +../pywal/backends/__pycache__/schemer2.cpython-39.pyc +../pywal/backends/__pycache__/wal.cpython-39.pyc +../pywal/backends/colorthief.py +../pywal/backends/colorz.py +../pywal/backends/haishoku.py +../pywal/backends/schemer2.py +../pywal/backends/wal.py +../pywal/colors.py +../pywal/colorschemes/dark/3024.json +../pywal/colorschemes/dark/ashes.json +../pywal/colorschemes/dark/base16-3024.json +../pywal/colorschemes/dark/base16-apathy.json +../pywal/colorschemes/dark/base16-ashes.json +../pywal/colorschemes/dark/base16-atelier-cave.json +../pywal/colorschemes/dark/base16-atelier-dune.json +../pywal/colorschemes/dark/base16-atelier-estuary.json +../pywal/colorschemes/dark/base16-atelier-forest.json +../pywal/colorschemes/dark/base16-atelier-heath.json +../pywal/colorschemes/dark/base16-atelier-lakeside.json +../pywal/colorschemes/dark/base16-atelier-plateau.json +../pywal/colorschemes/dark/base16-atelier-savanna.json +../pywal/colorschemes/dark/base16-atelier-seaside.json +../pywal/colorschemes/dark/base16-atelier-sulphurpool.json +../pywal/colorschemes/dark/base16-bespin.json +../pywal/colorschemes/dark/base16-black-metal-bathory.json +../pywal/colorschemes/dark/base16-black-metal-burzum.json +../pywal/colorschemes/dark/base16-black-metal-funeral.json +../pywal/colorschemes/dark/base16-black-metal-gorgoroth.json +../pywal/colorschemes/dark/base16-black-metal-immortal.json +../pywal/colorschemes/dark/base16-black-metal-khold.json +../pywal/colorschemes/dark/base16-black-metal-marduk.json +../pywal/colorschemes/dark/base16-black-metal-mayhem.json +../pywal/colorschemes/dark/base16-black-metal-nile.json +../pywal/colorschemes/dark/base16-black-metal-venom.json +../pywal/colorschemes/dark/base16-black-metal.json +../pywal/colorschemes/dark/base16-brewer.json +../pywal/colorschemes/dark/base16-bright.json +../pywal/colorschemes/dark/base16-brushtrees.json +../pywal/colorschemes/dark/base16-chalk.json +../pywal/colorschemes/dark/base16-circus.json +../pywal/colorschemes/dark/base16-classic.json +../pywal/colorschemes/dark/base16-codeschool.json +../pywal/colorschemes/dark/base16-default.json +../pywal/colorschemes/dark/base16-dracula.json +../pywal/colorschemes/dark/base16-eighties.json +../pywal/colorschemes/dark/base16-embers.json +../pywal/colorschemes/dark/base16-flat.json +../pywal/colorschemes/dark/base16-google.json +../pywal/colorschemes/dark/base16-grayscale.json +../pywal/colorschemes/dark/base16-greenscreen.json +../pywal/colorschemes/dark/base16-gruvbox-hard.json +../pywal/colorschemes/dark/base16-gruvbox-medium.json +../pywal/colorschemes/dark/base16-gruvbox-pale.json +../pywal/colorschemes/dark/base16-gruvbox-soft.json +../pywal/colorschemes/dark/base16-harmonic.json +../pywal/colorschemes/dark/base16-hopscotch.json +../pywal/colorschemes/dark/base16-icy.json +../pywal/colorschemes/dark/base16-irblack.json +../pywal/colorschemes/dark/base16-isotope.json +../pywal/colorschemes/dark/base16-macintosh.json +../pywal/colorschemes/dark/base16-marrakesh.json +../pywal/colorschemes/dark/base16-materia.json +../pywal/colorschemes/dark/base16-material-palenight.json +../pywal/colorschemes/dark/base16-material.json +../pywal/colorschemes/dark/base16-materialer.json +../pywal/colorschemes/dark/base16-mellow-purple.json +../pywal/colorschemes/dark/base16-mocha.json +../pywal/colorschemes/dark/base16-monokai.json +../pywal/colorschemes/dark/base16-nord.json +../pywal/colorschemes/dark/base16-ocean.json +../pywal/colorschemes/dark/base16-oceanicnext.json +../pywal/colorschemes/dark/base16-onedark.json +../pywal/colorschemes/dark/base16-outrun.json +../pywal/colorschemes/dark/base16-paraiso.json +../pywal/colorschemes/dark/base16-phd.json +../pywal/colorschemes/dark/base16-pico.json +../pywal/colorschemes/dark/base16-pop.json +../pywal/colorschemes/dark/base16-porple.json +../pywal/colorschemes/dark/base16-railscasts.json +../pywal/colorschemes/dark/base16-rebecca.json +../pywal/colorschemes/dark/base16-seti.json +../pywal/colorschemes/dark/base16-solarflare.json +../pywal/colorschemes/dark/base16-solarized.json +../pywal/colorschemes/dark/base16-spacemacs.json +../pywal/colorschemes/dark/base16-summerfruit.json +../pywal/colorschemes/dark/base16-tomorrow-night.json +../pywal/colorschemes/dark/base16-tube.json +../pywal/colorschemes/dark/base16-twilight.json +../pywal/colorschemes/dark/base16-unikitty.json +../pywal/colorschemes/dark/base16-woodland.json +../pywal/colorschemes/dark/base16-xcode-dusk.json +../pywal/colorschemes/dark/base16-zenburn.json +../pywal/colorschemes/dark/base16tooth.json +../pywal/colorschemes/dark/darktooth.json +../pywal/colorschemes/dark/dkeg-5725.json +../pywal/colorschemes/dark/dkeg-amiox.json +../pywal/colorschemes/dark/dkeg-bark.json +../pywal/colorschemes/dark/dkeg-blend.json +../pywal/colorschemes/dark/dkeg-blok.json +../pywal/colorschemes/dark/dkeg-bluetype.json +../pywal/colorschemes/dark/dkeg-blumune.json +../pywal/colorschemes/dark/dkeg-book.json +../pywal/colorschemes/dark/dkeg-branch.json +../pywal/colorschemes/dark/dkeg-brownstone.json +../pywal/colorschemes/dark/dkeg-bulb.json +../pywal/colorschemes/dark/dkeg-chaires.json +../pywal/colorschemes/dark/dkeg-coco.json +../pywal/colorschemes/dark/dkeg-corduroy.json +../pywal/colorschemes/dark/dkeg-depth.json +../pywal/colorschemes/dark/dkeg-designr.json +../pywal/colorschemes/dark/dkeg-diner.json +../pywal/colorschemes/dark/dkeg-escen.json +../pywal/colorschemes/dark/dkeg-fendr.json +../pywal/colorschemes/dark/dkeg-flapr.json +../pywal/colorschemes/dark/dkeg-forst.json +../pywal/colorschemes/dark/dkeg-fury.json +../pywal/colorschemes/dark/dkeg-harbing.json +../pywal/colorschemes/dark/dkeg-kit.json +../pywal/colorschemes/dark/dkeg-leaf.json +../pywal/colorschemes/dark/dkeg-link.json +../pywal/colorschemes/dark/dkeg-mattd.json +../pywal/colorschemes/dark/dkeg-novmbr.json +../pywal/colorschemes/dark/dkeg-owl.json +../pywal/colorschemes/dark/dkeg-paints.json +../pywal/colorschemes/dark/dkeg-parkd.json +../pywal/colorschemes/dark/dkeg-pastely.json +../pywal/colorschemes/dark/dkeg-petal.json +../pywal/colorschemes/dark/dkeg-poly.json +../pywal/colorschemes/dark/dkeg-prevail.json +../pywal/colorschemes/dark/dkeg-provrb.json +../pywal/colorschemes/dark/dkeg-raild.json +../pywal/colorschemes/dark/dkeg-relax.json +../pywal/colorschemes/dark/dkeg-scag.json +../pywal/colorschemes/dark/dkeg-scape.json +../pywal/colorschemes/dark/dkeg-shade.json +../pywal/colorschemes/dark/dkeg-simplicity.json +../pywal/colorschemes/dark/dkeg-skigh.json +../pywal/colorschemes/dark/dkeg-slate.json +../pywal/colorschemes/dark/dkeg-soundwave.json +../pywal/colorschemes/dark/dkeg-spire.json +../pywal/colorschemes/dark/dkeg-sprout.json +../pywal/colorschemes/dark/dkeg-squares.json +../pywal/colorschemes/dark/dkeg-stv.json +../pywal/colorschemes/dark/dkeg-subtle.json +../pywal/colorschemes/dark/dkeg-sundr.json +../pywal/colorschemes/dark/dkeg-tealights.json +../pywal/colorschemes/dark/dkeg-traffic.json +../pywal/colorschemes/dark/dkeg-transposet.json +../pywal/colorschemes/dark/dkeg-urban.json +../pywal/colorschemes/dark/dkeg-vans.json +../pywal/colorschemes/dark/dkeg-victory.json +../pywal/colorschemes/dark/dkeg-view.json +../pywal/colorschemes/dark/dkeg-wintry.json +../pywal/colorschemes/dark/gruvbox.json +../pywal/colorschemes/dark/hybrid-material.json +../pywal/colorschemes/dark/monokai.json +../pywal/colorschemes/dark/sexy-astromouse.json +../pywal/colorschemes/dark/sexy-belge.json +../pywal/colorschemes/dark/sexy-bitmute.json +../pywal/colorschemes/dark/sexy-cloud.json +../pywal/colorschemes/dark/sexy-colorfulcolors.json +../pywal/colorschemes/dark/sexy-dawn.json +../pywal/colorschemes/dark/sexy-deafened.json +../pywal/colorschemes/dark/sexy-derp.json +../pywal/colorschemes/dark/sexy-digerati.json +../pywal/colorschemes/dark/sexy-doomicideocean.json +../pywal/colorschemes/dark/sexy-dotshare.json +../pywal/colorschemes/dark/sexy-dwmrob.json +../pywal/colorschemes/dark/sexy-eqie6.json +../pywal/colorschemes/dark/sexy-euphrasia.json +../pywal/colorschemes/dark/sexy-gjm.json +../pywal/colorschemes/dark/sexy-gnometerm.json +../pywal/colorschemes/dark/sexy-gotham.json +../pywal/colorschemes/dark/sexy-gslob-nature-suede.json +../pywal/colorschemes/dark/sexy-hund.json +../pywal/colorschemes/dark/sexy-hybrid.json +../pywal/colorschemes/dark/sexy-insignificato.json +../pywal/colorschemes/dark/sexy-invisibone.json +../pywal/colorschemes/dark/sexy-jasonwryan.json +../pywal/colorschemes/dark/sexy-kasugano.json +../pywal/colorschemes/dark/sexy-material.json +../pywal/colorschemes/dark/sexy-mikado.json +../pywal/colorschemes/dark/sexy-mikazuki.json +../pywal/colorschemes/dark/sexy-monokai.json +../pywal/colorschemes/dark/sexy-muse.json +../pywal/colorschemes/dark/sexy-nancy.json +../pywal/colorschemes/dark/sexy-navy-and-ivory.json +../pywal/colorschemes/dark/sexy-neon.json +../pywal/colorschemes/dark/sexy-numixdarkest.json +../pywal/colorschemes/dark/sexy-orangish.json +../pywal/colorschemes/dark/sexy-parker_brothers.json +../pywal/colorschemes/dark/sexy-phrak1.json +../pywal/colorschemes/dark/sexy-pretty-and-pastel.json +../pywal/colorschemes/dark/sexy-rasi.json +../pywal/colorschemes/dark/sexy-rezza.json +../pywal/colorschemes/dark/sexy-rydgel.json +../pywal/colorschemes/dark/sexy-s3r0-modified.json +../pywal/colorschemes/dark/sexy-sexcolors.json +../pywal/colorschemes/dark/sexy-simple_rainbow.json +../pywal/colorschemes/dark/sexy-splurge.json +../pywal/colorschemes/dark/sexy-swayr.json +../pywal/colorschemes/dark/sexy-sweetlove.json +../pywal/colorschemes/dark/sexy-tango.json +../pywal/colorschemes/dark/sexy-tangoesque.json +../pywal/colorschemes/dark/sexy-tartan.json +../pywal/colorschemes/dark/sexy-theme2.json +../pywal/colorschemes/dark/sexy-thwump.json +../pywal/colorschemes/dark/sexy-tlh.json +../pywal/colorschemes/dark/sexy-trim-yer-beard.json +../pywal/colorschemes/dark/sexy-user-77-mashup-colors.json +../pywal/colorschemes/dark/sexy-vacuous2.json +../pywal/colorschemes/dark/sexy-visibone-alt-2.json +../pywal/colorschemes/dark/sexy-visibone.json +../pywal/colorschemes/dark/sexy-x-dotshare.json +../pywal/colorschemes/dark/sexy-zenburn.json +../pywal/colorschemes/dark/solarized.json +../pywal/colorschemes/dark/tempus_autumn.json +../pywal/colorschemes/dark/tempus_dusk.json +../pywal/colorschemes/dark/tempus_future.json +../pywal/colorschemes/dark/tempus_rift.json +../pywal/colorschemes/dark/tempus_spring.json +../pywal/colorschemes/dark/tempus_summer.json +../pywal/colorschemes/dark/tempus_warp.json +../pywal/colorschemes/dark/tempus_winter.json +../pywal/colorschemes/dark/vscode.json +../pywal/colorschemes/dark/zenburn.json +../pywal/colorschemes/light/3024.json +../pywal/colorschemes/light/ashes.json +../pywal/colorschemes/light/base16-atelier-cave.json +../pywal/colorschemes/light/base16-atelier-dune.json +../pywal/colorschemes/light/base16-atelier-estuary.json +../pywal/colorschemes/light/base16-atelier-forest.json +../pywal/colorschemes/light/base16-atelier-heath.json +../pywal/colorschemes/light/base16-atelier-lakeside.json +../pywal/colorschemes/light/base16-atelier-plateau.json +../pywal/colorschemes/light/base16-atelier-savanna.json +../pywal/colorschemes/light/base16-atelier-seaside.json +../pywal/colorschemes/light/base16-atelier-sulphurpool.json +../pywal/colorschemes/light/base16-classic.json +../pywal/colorschemes/light/base16-cupcake.json +../pywal/colorschemes/light/base16-cupertino.json +../pywal/colorschemes/light/base16-default.json +../pywal/colorschemes/light/base16-github.json +../pywal/colorschemes/light/base16-google.json +../pywal/colorschemes/light/base16-grayscale.json +../pywal/colorschemes/light/base16-gruvbox-hard.json +../pywal/colorschemes/light/base16-gruvbox-medium.json +../pywal/colorschemes/light/base16-gruvbox-soft.json +../pywal/colorschemes/light/base16-harmonic.json +../pywal/colorschemes/light/base16-materialer.json +../pywal/colorschemes/light/base16-mexico.json +../pywal/colorschemes/light/base16-one.json +../pywal/colorschemes/light/base16-shapeshifter.json +../pywal/colorschemes/light/base16-solarized.json +../pywal/colorschemes/light/base16-summerfruit.json +../pywal/colorschemes/light/base16-tomorrow.json +../pywal/colorschemes/light/base16-unikitty.json +../pywal/colorschemes/light/github.json +../pywal/colorschemes/light/sexy-mostly-bright.json +../pywal/colorschemes/light/solarized.json +../pywal/colorschemes/light/tempus_dawn.json +../pywal/colorschemes/light/tempus_fugit.json +../pywal/colorschemes/light/tempus_past.json +../pywal/colorschemes/light/tempus_totus.json +../pywal/export.py +../pywal/image.py +../pywal/reload.py +../pywal/scripts/__pycache__/gtk_reload.cpython-39.pyc +../pywal/scripts/gtk_reload.py +../pywal/sequences.py +../pywal/settings.py +../pywal/templates/colors +../pywal/templates/colors-kitty.conf +../pywal/templates/colors-konsole.colorscheme +../pywal/templates/colors-oomox +../pywal/templates/colors-putty.reg +../pywal/templates/colors-rofi-dark.rasi +../pywal/templates/colors-rofi-light.rasi +../pywal/templates/colors-speedcrunch.json +../pywal/templates/colors-sway +../pywal/templates/colors-tty.sh +../pywal/templates/colors-wal-dmenu.h +../pywal/templates/colors-wal-dwm.h +../pywal/templates/colors-wal-st.h +../pywal/templates/colors-wal-tabbed.h +../pywal/templates/colors-wal.vim +../pywal/templates/colors-waybar.css +../pywal/templates/colors.Xresources +../pywal/templates/colors.css +../pywal/templates/colors.hs +../pywal/templates/colors.json +../pywal/templates/colors.scss +../pywal/templates/colors.sh +../pywal/templates/colors.yml +../pywal/theme.py +../pywal/util.py +../pywal/wallpaper.py +PKG-INFO +SOURCES.txt +dependency_links.txt +entry_points.txt +not-zip-safe +top_level.txt diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/not-zip-safe b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/not-zip-safe new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/top_level.txt b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/top_level.txt new file mode 100644 index 00000000..28e33d34 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal-3.3.0-py3.9.egg-info/top_level.txt @@ -0,0 +1 @@ +pywal diff --git a/.local/lib/python3.9/site-packages/pywal/__init__.py b/.local/lib/python3.9/site-packages/pywal/__init__.py new file mode 100644 index 00000000..8a00b5af --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/__init__.py @@ -0,0 +1,31 @@ +""" + '|| +... ... .... ... ... ... ... .... || + ||' || '|. | || || | '' .|| || + || | '|.| ||| ||| .|' || || + ||...' '| | | '|..'|' .||. + || .. | +'''' '' +Created by Dylan Araps. +""" + +from .settings import __version__, __cache_version__ +from . import colors +from . import export +from . import image +from . import reload +from . import sequences +from . import theme +from . import wallpaper + +__all__ = [ + "__version__", + "__cache_version__", + "colors", + "export", + "image", + "reload", + "sequences", + "theme", + "wallpaper", +] diff --git a/.local/lib/python3.9/site-packages/pywal/__main__.py b/.local/lib/python3.9/site-packages/pywal/__main__.py new file mode 100644 index 00000000..2e50ca93 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/__main__.py @@ -0,0 +1,212 @@ +""" + '|| +... ... .... ... ... ... ... .... || + ||' || '|. | || || | '' .|| || + || | '|.| ||| ||| .|' || || + ||...' '| | | '|..'|' .||. + || .. | +'''' '' +Created by Dylan Araps. +""" + +import argparse +import logging +import os +import shutil +import sys + +from .settings import __version__, CACHE_DIR, CONF_DIR +from . import colors +from . import export +from . import image +from . import reload +from . import sequences +from . import theme +from . import util +from . import wallpaper + + +def get_args(): + """Get the script arguments.""" + description = "wal - Generate colorschemes on the fly" + arg = argparse.ArgumentParser(description=description) + + arg.add_argument("-a", metavar="\"alpha\"", + help="Set terminal background transparency. \ + *Only works in URxvt*") + + arg.add_argument("-b", metavar="background", + help="Custom background color to use.") + + arg.add_argument("--backend", metavar="backend", + help="Which color backend to use. \ + Use 'wal --backend' to list backends.", + const="list_backends", type=str, nargs="?") + + arg.add_argument("--theme", "-f", metavar="/path/to/file or theme_name", + help="Which colorscheme file to use. \ + Use 'wal --theme' to list builtin themes.", + const="list_themes", nargs="?") + + arg.add_argument("--iterative", action="store_true", + help="When pywal is given a directory as input and this " + "flag is used: Go through the images in order " + "instead of shuffled.") + + arg.add_argument("--saturate", metavar="0.0-1.0", + help="Set the color saturation.") + + arg.add_argument("--preview", action="store_true", + help="Print the current color palette.") + + arg.add_argument("--vte", action="store_true", + help="Fix text-artifacts printed in VTE terminals.") + + arg.add_argument("-c", action="store_true", + help="Delete all cached colorschemes.") + + arg.add_argument("-i", metavar="\"/path/to/img.jpg\"", + help="Which image or directory to use.") + + arg.add_argument("-l", action="store_true", + help="Generate a light colorscheme.") + + arg.add_argument("-n", action="store_true", + help="Skip setting the wallpaper.") + + arg.add_argument("-o", metavar="\"script_name\"", action="append", + help="External script to run after \"wal\".") + + arg.add_argument("-q", action="store_true", + help="Quiet mode, don\'t print anything.") + + arg.add_argument("-r", action="store_true", + help="'wal -r' is deprecated: Use \ + (cat ~/.cache/wal/sequences &) instead.") + + arg.add_argument("-R", action="store_true", + help="Restore previous colorscheme.") + + arg.add_argument("-s", action="store_true", + help="Skip changing colors in terminals.") + + arg.add_argument("-t", action="store_true", + help="Skip changing colors in tty.") + + arg.add_argument("-v", action="store_true", + help="Print \"wal\" version.") + + arg.add_argument("-e", action="store_true", + help="Skip reloading gtk/xrdb/i3/sway/polybar") + + return arg + + +def parse_args_exit(parser): + """Process args that exit.""" + args = parser.parse_args() + + if len(sys.argv) <= 1: + parser.print_help() + sys.exit(1) + + if args.v: + parser.exit(0, "wal %s\n" % __version__) + + if args.preview: + print("Current colorscheme:", sep='') + colors.palette() + sys.exit(0) + + if args.i and args.theme: + parser.error("Conflicting arguments -i and -f.") + + if args.r: + reload.colors() + sys.exit(0) + + if args.c: + scheme_dir = os.path.join(CACHE_DIR, "schemes") + shutil.rmtree(scheme_dir, ignore_errors=True) + sys.exit(0) + + if not args.i and \ + not args.theme and \ + not args.R and \ + not args.backend: + parser.error("No input specified.\n" + "--backend, --theme, -i or -R are required.") + + if args.theme == "list_themes": + theme.list_out() + sys.exit(0) + + if args.backend == "list_backends": + print("\n - ".join(["\033[1;32mBackends\033[0m:", + *colors.list_backends()])) + sys.exit(0) + + +def parse_args(parser): + """Process args.""" + args = parser.parse_args() + + if args.q: + logging.getLogger().disabled = True + sys.stdout = sys.stderr = open(os.devnull, "w") + + if args.a: + util.Color.alpha_num = args.a + + if args.i: + image_file = image.get(args.i, iterative=args.iterative) + colors_plain = colors.get(image_file, args.l, args.backend, + sat=args.saturate) + + if args.theme: + colors_plain = theme.file(args.theme, args.l) + + if args.R: + colors_plain = theme.file(os.path.join(CACHE_DIR, "colors.json")) + + if args.b: + args.b = "#%s" % (args.b.strip("#")) + colors_plain["special"]["background"] = args.b + colors_plain["colors"]["color0"] = args.b + + if not args.n: + wallpaper.change(colors_plain["wallpaper"]) + + sequences.send(colors_plain, to_send=not args.s, vte_fix=args.vte) + + if sys.stdout.isatty(): + colors.palette() + + export.every(colors_plain) + + if not args.e: + reload.env(tty_reload=not args.t) + + if args.o: + for cmd in args.o: + util.disown([cmd]) + + if not args.e: + reload.gtk() + + +def main(): + """Main script function.""" + util.create_dir(os.path.join(CONF_DIR, "templates")) + util.create_dir(os.path.join(CONF_DIR, "colorschemes/light/")) + util.create_dir(os.path.join(CONF_DIR, "colorschemes/dark/")) + + util.setup_logging() + parser = get_args() + + parse_args_exit(parser) + parse_args(parser) + + +if __name__ == "__main__": + main() diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/__init__.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..376e7187d395c9942ac11b08e77d150f19c127fd GIT binary patch literal 788 zcma))y^ho{5XYVD=6hFsJVClB#W_ecARz=gY8pE0B+HjrySa1XV0(d;@-%cvJW<-K zcm*nE9HiUwCi36Enfx=8SP}buP9Sc6Kd?C@)H?wk zNM1fEs(H>Sr6n$ul`i+S3eCU?t3oKtY6d^-KEVRks*)o9cjA1^z=|7|XTM+&w7GD? zIA{w|t;Y2^&+ssPlco6|I0{mS zOTqa!X>6}Y&X*UQx1v4D$5I_EajTU!7D@h?v~fUDKZt|Gl95V_4k)wo>q(BSL}%oV za=`o9ccIiICTZ%-;4fe{C|i^WB}Pe5Qj`n@f27a#en~j*bPMm5TIpOr9_(X_MK^c}d?5x;rWP9?#Lf1lbnPgWcs7{sXzIvK9aU literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/__main__.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/__main__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75cfaf264ec100cfebf8dab34df1a81bd3f70612 GIT binary patch literal 5167 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 literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/colors.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/colors.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d43dbb0cd9236de4f5270167982d610155cf195 GIT binary patch literal 3998 zcmZu!&2QYs73U1eC6`)Bs}C#wNP~46p;@$E$+6wov1%uk?Z&C=wl>lr>jW&lL#-(9 zlIt0+4K27Q`A`&Sf%cZb2dTH-`Umu1DB4pGJO#+5x)eF}P@o^bH{{Ba?Ahg;$H$rB z%=`Gg$6$KeGtlH;{`%nWb;J0YZVopKH}B(8e*zIk+Yn6f9&0n*^ETJL**0}=wJqJ- zZCjYa>Q(wq+hGQH8@$_gHDBpf`(E4YPqnA|wRR0MN4U?7_Oz%95B-do5;gR*Vp`0g zuZ!13UCcdW?Kv?o79g1yi{b?O1+gSv3q3KrVTqIC6hT32|Amh|0I+uN@Cp7I)|Hsn{{034G_}MGb1&2 zS!!(YT{E?WxySd|4P%F4&(>)1PNdRCC+Q{f#pXJ+t4ZTvD!A_BQg4BDjm-G`^)VAh z#Ufv z@z#1cNhj$KuFcU-$(da4{daVhi%90yAV@cJ zYb%LjNjlKGJw#?9%cqaLfJBPM8oa{h|0kEgbx4PkM*Jc!ZKGd-$;dWri)XObDd<-4 z2^HpZ^FV58sjX>6Q%6%*)2gPPrc;{MG@aITM$=hM>zdAKiZ_Y*=XJ60oNTr@`p$Y1 z!?V%`9jTFQ6po=9Y0}X8Zfqp7AEYfw4zf>2g`qvtURNf=SmYiCge70;45dn>qyz73 zViHG&*|&+1miEbA_gx}YB7_k8Q$%V+riqY?H0yaq8+*0v&zJo>Wq+aUFP8nKvj2YB zzgzZ~%l=C4==IL8PMGr(=A8+1VZvOTFqfKEUWMcJ2EibdxgGQdn*sb~5O$)VS1zrZ zrleEm_BzE?Ue%-gc-U`pd6gcRQNMfKjb;j8_S3`{Q70w8QL7+^$yvp$F#P^wIl3qQ z)xU47f642ZbHw9F?WAz+aeoGrF*(SL8x+NyuptAo?s3g?@SOO^E}oG0neY*7kG#`d zBP7urWVV)7j>sG>bJxg=3m>hn8S#gQW_gEJnyh|!rHSm7D`fzo=G16e!)(+kVJi?@ zLzVW!I3@RNXe5=Y)xDtG*Vnr^G1^zxwbynxbo=K-{EzFhfv4r5zg?GSaVK9R(U)IP z+rQql3Ukh=ARQ9C``T1_O#~8XUfux)x|`|b7A~MIZEI<6>lrVZyi55a>iESG-o;DR zX%K^3%w;t;!xtI-X3V0mad{I@j~JI6jRHv<_ZAo!_lGIy4gmQP@hk(_!`N?s2D6S$ zGB7~d?z+E`LmKCcNm7 zUr!pL$bp});U?qK6)eVq$2R#n)d`ugXO1gbC9^Y@St;+@V<$t+AS%df&L7x4W69{6 z@H1z0W?hDq%;8au4rSfOM$`)%l*(F?^qpJe0VC(ZO7>aS`dofQG9(Ym~tT` zDaVf*x1#P)hK*#HHlA)qoy|!NK^bGH!d709$fQYM`wC)$P)&XU0yS+8H#T~x1?102 zNJ;ypQ*^_F%{&a&too^pF-Bbbi!chqFRhc2{ z*g_E;4RE8%<*S#jE~`=P%!7-|s=utxJXr0ItOlC)X4HQss>7UlcTpnQP+d37?SYKq zw8`XcT8wgGL3Himlx1cFv7%=N>|0|M?m|CHT$0vq?+h~Kb`bY}b44Eo2YX<=*KR>u5OBj&5cYEFhMgr~Dx^X@2d837wt=5uPaQ4xuTU5Ig zA&yQPP{(jvcWqs7Vc zNsPt&1AH=st>y_GpmH8FB~^;@1V~BiD5VZS7xlRqG#(@VNt>@>Hc7@3fw zBlmni>JJi``hGrjTXQ$1L{Va@Z4|owL=1Z&80;oUQ>lvw4X-(}-ILJQ5TlW+Kq?JT zMa2G`UQ9s-eA3?}1t^usLt7=VKjyJAfb1zQ^)`rM)>#dx0+-U|JTGSyk-L;TzAuuF?@K|eY2y*l$-6{0 ziBQ5S-bIGXU4;)sm`h25tm6BEazX);RK@9RUnDz%Y;92;(pn$-{fG9bp+Td9yH?os i8fi(r31XQ5gyIK<*4U!yI__EbgzI@#*K=p)-~2ypNVIkU literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/export.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/export.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7e0e828d321c277f47704c899e60f57805d0c8c GIT binary patch literal 2830 zcma)8%a0pH6QAyRcs%xQvYTW{cxl8#!4jE`cq8SDKC~MI5iE!Wge;IXJKbxKcOIs@ zoz0HCr*Qnlg)0XeeH{2N_&fT_2{>{?;!)Kz-gqMpjNLum)z#fq^{dCkYiof8Px<5a z=g)R5>nEJ7J~mAL3r&uoV^-f{gwc%jiFwmLWj1p%J9qj{?)Kf>>wClknwzz9zwg8N zBJ)`5E7ET>pS8cT`T+}A2i_g-91_-LYp~X38*H6jfYBPG`&MtWdN#Ooe^Lq+CS_I% z8Ky;eFBWMzmEmD2@>t0z_!&g9_I@VN_iWwXd28pLJA>VKKhnYbAMAeeUOo1AKG=I3 zsXd~dsY)KlvJ{u;v5Y)?+qs4QNN-rSa{;x{I7aug4_ z1o|;>a05&)%ZI`M?QZP+3Jhl8NY}8Z*T7xAr7&`? zS>F?QyZAmO#%-(_nOh5M*Lpy})_(Qrhk{RH!Iy5K%J6`PwM3jnOZ&bJNGM)}EKQU# zJn$Fy_(OMsedr6(4tm!MJ>3SyvPnGQLc4J`8O1#+E`gZhGIY8nCp<~xOmty(PA}96 z_1=djpM(xQ<%`Ro(^GOvXT*3DU660+m(G4|cR1MK>zb>lOs*;8CdFW15VPx zEfhZ~^U3WeVE!94t9s_JR&7v&9^Epi$=lIGW^i;DV9O<3g#zmUbZht@y<`3Saj30C z@33r-cz-$6`;*$NCO*elU-t$ z*%h|+?Ugy$X=W`jf*z}0+-cBR`ctS*CJ-Q{i4lkVD!Hm4z%b z9@W!i#B*M4EZ0({PGF@tGY4n-kvYd*9%d@K_>eQ~8A~~ua zYxu$cI7`H|NJh0djchmMaePv(HC%WLY+8x~O9!!t@W_U=dgbz#kvuc#NuKqtXd5^Rp{D(%%)(heF2k`b6hw;Ee$_Xri&F62MRQLa%}JE)^}P$TWi5zjK+Sy2O4 zKt65bMz5As2lvk`qP_chS;R~`CoxDxv_0esUY$DB2k0M<`tk)}8LX_M%Sz1YmQBgO z{Qc@}IlqY4U{8W6Yx!WrwxAhj{~rt#IPU{;YAG_Nb6Yu#Ea)k1X0Dmp%A2>afDpqq zwojcQjOIQR5Aq!`BUt^8>{?$uck0gEahuU2TkNR-Lc<-?nKL6ueLx@B#QJhib>>}G zpNAs{Pi8IzkXJo^r!JNd=;sTOjC6Y$RNz_B?*3q3m4a87>K&YgxChIOjH;{Wh*QZ$ zv$EG)GZ{eBQfg-stC47f6$F+};bLcUT981|QhdNt0XZ{)f(HW!qt;Xe-O9@0FfE4K zNsGg>=QZi6sa43_T?%W?*jSwnP#$xwc2M3&;dePC_>(t57HvN%6kV8gm|f2p)PtT|J-q}jlwg+(a^C7^L?m7ZajNbaEYAZ- zPky{)x&FMo9vauK#)So@Wq}r1LCc1z_EKp~h;>^02fN!yZXL&> z067|D#H+Znj@?tZ{O~&hAzhjNBOE3v-GzO1L7_eXagl7&F2J!)#XGRlBYXH?*R8>T zmC0aG%YtHSUvi~D7Aa8T6;H!BH11}6YDHVb&m6nr8Cc7Nsiyv|ykygi-^RivQE|ui RiBB(+t{t@fz<;8<@i&NM{jLB2 literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/image.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/image.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18630921a92752d8787ad6797468a2dbe3690741 GIT binary patch literal 2433 zcmah~O>-MH7?!lV_Il%d5SlbiKX73fFtkoO?La$ZGG&@l%AvzhJ_d)5*;ul(&U)9C zJE4qy*Yt>~~A` zl5H2D9n=G87rB2->T|rr1E|Y^%MkI&NP_F%G^6BFGmLctxX zJ76>!(+L?-%{tE5&FF-VV3)sFaV6&syY^@ZHLyHShNW*Be8(cVUHp!d_{cJ1DVinO@d3!4Xkxq@*3bHgT} z)*F~$D~^2D{u}Dloif(!+OfgQ|?I>v*Pe_?cvTu`Vyj^uahTy9X_cgFoc!a z1%#dkG++Uh@4?s%_z1iY#e$zfV;X#5xD}aWkdNO1%Hi@U^xVBjM$Qi;S#^na20N7C z%e|5FBT3jM8J07eIhV-D1)p{BaR+hk18MMZJonRHr!X!;a$K93!tlzY6NO2{kv_@G z>2a>jM2=`<^iQEEgau{q*h&a@Kq44Q1j@scnQ5n*W2aSMnmyiYc)Z7CLgZS`xCFSC zA8w1bJpqbGZAh6DCA!KaingIg=aM0j^f#c`gIEB<5AR@la65T&rcYwn-Qyu1Nj&v4 zXLIO(xVw4t-m{OZs2~!AMfKuHSE-zX#n1iJ_*-$l)YPAYH^a*R{TZa$IS_*>`uaJ2 zU6o30yeQ$~$OPYqabG;N)D0fvkZqq)RbGdfs-9)4M9H)?H9@{SL?OP3r*m!S?A0|uAr0+YAk%NI=t9ZnupJGe7*`W{0=lMbo_3iNUY6ix2h5hMha zpJYtl&@QUW$a(&ihMNRi$psB0BCU@U+=zO`qwf4=MH?uRp`OW)qP^owZJb(Pz`1$XW zVf=-i$;X7wb$G>ZAehlI7-2LfEuvf6qPjI(rf#j4#Y|?!cHe0^eYfTIORW+yz-Gtg zzSr_VcbNOaXic$Gti;MMNNbvTYzizDHq9!~&afGF4BBICmd!ys%jVevv~!`eN!TJg z4&ThP)9fVs2($%89~jj$*}S(F#%aL(0Z+R;=!?4d3J@F3R|I6$ROOW$D?i+7ul~5E zyu0^SAKuAzdhbD%C~GLAxPvqIA3V1O?+U!)G6-pGkujBU&OQ2!K+hW6jP8+VbY$>L zBg)Ke$}dT0>@sUax-bG~wE>%xE!;t1oit9l@T0_+a<`sU@_r3FqNl9&TWfcf9Y@LV zsiLCStdiebnvTyE6kv=hXQINE3oc4aS3mg`pw{fo!afz`2OP&R=nR>r(}bS@{Rov53@*Hy%G;ofjKTaQon7+G zkOiImrgVTxliwT}tHv)UfNFPKVw73T23jqo_3?S;0I_a%)+_D(PA^tg=!$3Q5P50ffY9xmG6jAGmX8_j+$j^pH$AdoVF zYZ}xdGjFIlPfA3ObkMl}pnu{9n#kNI#}J2mgrApm%N$!0Jd&AvCeVp~NJd8PhlwXk z<1*9a6+ZcK5iZ}a|Ac(?Lq7$_1R^)%-MVsf7r3b0+;v1&>B{ZGr{LlOQM|<;h8K50D2GKN-AR-ir`>Lpbd|dk@B|bH zP495yx2S^%klQ|dpZlNfky$cp^3TC?gf{3OhVnV+NTZ@>vY>Ygvul+1&HFyQG zV9-Uv(egpK@!~b^uEFT<(8ELvxUKAjUjW~ZAVl}E`^wh+s>Q3Y*K2Y;^F%0Xc_d_Z ztro;_lP|&8J0aso%kUmTM$7*Nxj;NfkW)bHN_-?`xF>I8R!@dQ2kuYbdL+BgJ zgv#>`Sl2sPZuTG4O?WkhUxOl{_&kR|k>t4nl4@ycX=!PX9n7dO=8g!?)c-HcZ2!uO z>e~+!S7qW3|b;i@$(433YIEqR%vs+x~SZCo28w0Tknx4Tb+A#IVwS0YGZrUuBJ+D+L JIr(pT>K~tyUa$ZF literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/sequences.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/sequences.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8edc77b8ef8dfd202f57a1da387b425d848de2a GIT binary patch literal 2430 zcmZ`)&2Jk;6yKTs^g3~zkEUu<2`dng1GSwNXsVP7lu(sRK}}C?BeV8Q*4wOi-I+<6 zTI-W5!Il5O;nx2HiT{AZUb)~aCsZNId%I4W7P_l>Gw;ot-S_z$Z+6zz;PGplkA8*K z@5r2gbYQ-OA^Sj>*3=kbG$c)u&9q6gS#Ro0XGUoB%%<71nikQ3H$%JUG#ywkF^3hN zlV*XrtoU4Ox@?Bc!dzq**c>av&I~u%JS*+%Y=JETKg;N@R$U%^JS#u{~o_23SfL3W**#2t!?$@oIZ|ew9v&V9w+hs%fdd(P#{2SN7KA*26Uk)5;^%1{Rkus6aPTQz{Ykt43-D5#z_H znf*0&0}NCv@_IZqy|CZ)UT9(w4!qo{cjF$fKaS-g7mdw&EsQ%}SPz4Cz5h&g>N}&W__3Ns`_#yqaNr-4B_IPAL%eZ}Q4<9e z6j$~>g&<~e6tf_yQZWaUC?mlrP29s1w;cM7pOqKgVlHX;QGu*Jj{p> zevV0^osgf&eGO}-N(U>uTvdVxkf3W7<+bZj2P}S?doXygviJGc##Y)OSt@f%=ob zO>J9xt<6ek3GOR{T>zZ;Gtt$l?O^GM+|Y(PTOL~p;09#);^4}*;GW_Y)#Vi~J6@lk zwZ5#01qjd^g@esu!@$y$t3Z4Jp1sRMqQE3DL<84JLY843(VyrO1IsA2vZ|B=JDb-e zWE4vhc4)1U74!=tE`#J;HM_UMK&npM>)-wue};*(2z@p9pp#kLI&C0XyOjZhybX)f zBNJ?p3ATD_Pn$n=_hZ3*5g$e@CBDcu-8Mi+E)&==6NCt`_fW`Kq$HeRtxV>Tpv#j# zkZ9080^u)f-BhdEsVTh3=cxt#4L3ptDw&HJ^krq38js^3sv4P}sePn)Yd<*7B8;6o zy+QH-T)}T=Jzaj=*$-h$t^?7iqr1d6YoPt$ zje7-Ch$FjKzK6vW<4TMUjmTj7&`^K{i9Vu3Goj*^qGOssW$kEt<)NkYv5}aGbwY{u zWIgAU`PdrU38ErJxpKw@W@0Te3yQ!VtY&v*UJ38GD6@DD=Ie|f)s=cC8;ysJt2g)7 z2XmRIuVg(Jhz+oLu!QJzdd=pbBy0DoZXR^>IyL+-Zs&+nklqo-Jme{jWoq<2)fIJA zvcuT-gUC;fAli?scAla_$Ln-?iv=RJ0f;2#wSnqIFs%ir;m=WKNNS)FZ^N;HC+@-l ziCqNgB9?AYS2sur?ww^Kz5pq}9hRNIWK_wWYALl_Ef#lLEpZ*?H;{Y=By|Ap6c{N5 zLRaqMC%8hmJXdfCd0ED@@1HX&yDhS!a&Glvb{O*8cnwGt8M;H@h1+6AcZ-hW*zW4T D5bigB literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/settings.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dad9a892c48ce1e6672acb7c4891ffa7dd119cd GIT binary patch literal 771 zcma)4Pm9_>6rV|=iE-_2mmb<%Zeb6dxOi!yl#06Sg1d^cl!n4EW=4&Ti6n80;)l^= zztUWLD*XmM_03ookA3j|{oe2W2^rRCxCrF;r1y1bAoNour{X~J3AD(;a1T06lCgEz%;*ZRMI=lcuz82lqW$e;oHl!_na8uHOsKhhILo`?S;U z-1cbqZnUkEh(&WD&F?JP+9b--X*|2SkT#_}izt;wR!C=+uyUH^OIfG%N#sSGrBHfF zsct@jsxwiF^eKl2gQT@$@oTqFlq(kX6P6SMH?+4w-zP?C0ox#J6 zx=mKrnq~~fKT!S(CTjDi6U?)v2o_nf7J2hsK$0wCNsz>oV6`ddS=u7+gCZ`)+ZBtx wv6(0UhtCTNQI>H!E68dioe#^5uM_bR-ViD-!B}+%JEny#^Af+tXZQmD1(dhOng9R* literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/__pycache__/theme.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/__pycache__/theme.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..847cc8634e8db0faa061e3bc1ed892d884c3e002 GIT binary patch literal 3964 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 U0xmXVv<}R6;Df(mziMy&3vtrLO#lD@ literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/colorz.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/colorz.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ba0ed770387f108570ea5e5ca6c47162541e6ff GIT binary patch literal 1446 zcma)5O=~1Y7_N_=nNDZ2ne}5eDof)ox-Fz9w-en08PMnGWv_VX{_{J{zN z6*o7B51Wr*n(sjfk`O@!D``UA$`aP}9pVZ9iqs>INN@fHCHP5t-VywQu8`*tJMW4P zqOVEKMnrT)uk2NR;#0&v;I(88@R|rtNfL;4(T8A>8B zY3_rtA&tXT63uW~ zj(9q6gPpQ4HdEDf_Z86nJ518t&t*Mc<~H7O%FQl-tB2Q_Z@@iXR5^H@9<6?GE-pnM zbhW`hx?Y66@z4SvQ2hd|8CL0PK>HKCbrpLD09I>@zs07h;^OrwqV4!9+CkwNJWXU0an^&nu=cFH23SbZ1X z{5z8F^66`EWddE*Nss zA;(zj0e2l^Z5M+)!5}-$;IXtf*%oVT$L7(pp5fE9D5VIk3SD%V4q2;NK3V+}H}C%k z$3msAX;)OxF1JXh9p8GcWGydc-S$eA=RowfBehn#k-;7z%x8TX;K%eEu#f0|w9)p)W1+I~SicHK8q=;fLA2|iR#TR literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/haishoku.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/haishoku.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b89212b63137be9d91a5b4c2472c7621374ac586 GIT binary patch literal 1325 zcmaJ=&u`Q?6t#5Io{ykC`|oXh%R%U^ znVfGPOn!wfUxJ}1Mif(0;27JH#H8*6atfz(V;7@8P_^YE)|x)S$b1aX+tfY9OVqN6 z%saGg&{I^AEkrxiE4*?gUcm;h0QO@auuoS{P`paJv zWfc>NVnGt5yx>BnBUZ9tBJ(N>?j^Y#@qR+cnYF(O2Hv;PkQaeg#a1 zX6VoLBW!QM6m7swugP;4{9|EwghZGF+85d0Q1Ri2y$FdW(Ux`~ihq$XwekMJV8lx{ z*ynP>#MaG0RPZz@21UL%7*ExRS2va@TsXux4y6|m?_95tqAJCIbc&^${_paZ`1z&C2VU~a-lv~f0{qn zy&}&>s-Z4ga7wR1C`{z(FroVssX|A)AeGcDyEpbla=6s)OA*?O6C2<~num|zE01DzhwlSONj!ks9?%!qV{7Z`^Y literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/schemer2.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/schemer2.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efaee202a4a6295565f67ba61bab60bc22cb540a GIT binary patch literal 1347 zcmaJ=&u`pB6rLZp*Ksxhl>$Ok$U;Sp59_Up3Z;r7M5^?HdP%uhpq1A%^*XUV+nKS# zTANeDkwgE3U2aJHMRV;bXKtK$Gn>$;l^AQ@d^4UO-+S+S`OZ#+p#A*Un`}xEdSfRy z8?2%4p{ooGLm6V2ks4>%jU*#(q#1RimwAjbulAcD3orug10G}pzyTXvpe$q|+k$b6 z?XYb&yuew+$T3QG`@QHXZ@J7hkMpb`$v^jV^%+dUi>`CfEd< zt$@5vS9O8y->YV~c+d}_t1rNmK>rVXjx}205-kBQ(QCZME3!sFg7kO)m&2iD)u%~d z!VNe1pdXB02-)Pi->#bS@#77fJ{mPu`-7~?na;?!4|_VQ+Ju@&bN1y{-p!J*=G zB04?qH2j&@m9DFntArQ|cNtnV>`x@Of%iW@j%T9b;}fAeF7H1Yr?n{ZdR$l2@qD3Y zqWwDkZmcTJNAtWm%}cIe{S0!1+F4i7c}udyYnxuL|KLz^o7;I_bFFy_ z38SZcaT&s;&l2BwN=Pm3TPBj_bfU#%QN5IwfY}AUTvo*-XD6M~5J(T$E92KLz>&<) zuH13a+L)m|8Ej5`1Xu-N5ZT3di2NAP(R+^Cx13a-0I(8aAPu#r$%-FA-a~uqKy}# zld)PT&6~8p`&=&KycK%JWqg&&G~R>6#-q{IJh`-ze^2-JnPcec6EHSUzwDmlC0;=h zukma0(gS+9_kVhRGeUP50-wkE7Usp;OqM09j30M9N9rd4g2!@9D`MI^%RBe$@$loEWDY@5Mk!bCBdNL%pojx{#(G6rLi6O@zL+h^V38&BDa elTJS2ej`{{^8*`VbqkC~L+m~>#6ubeVfZh2V@C}D literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/wal.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/backends/__pycache__/wal.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bc57451ae3d18faa1ee393edd83fb90984518a4 GIT binary patch literal 2531 zcmZuz&u<$=6yBNHU2kkB4WSfT5Ul!(8iB z&N$8=rZHU@8lOPaIx6mT98NgRNQc-j?NIw=9cI67$F*Ot<8j8_%}Yp_0sU&`VEl_8EFwlVO(T|RB>1IL^x1s zo`h*HN(3a0H`?_B9L%|SKvB0y=?-+7#pcwL;zIEuS0U;mDsw{4v@>#c33s`d_&aPw zxc`x}Lp0f=i8G>4$cQ{9Bld*slRdWY;8eBY*{e~Og`Yp)Jk&*)JU?i4#`dtbD1}Og zV#wbA@C;hj1%`8rgFM|Fh)LVi5A?^2L-ytJot9fNrDa)HgS&lM#6qdEi5tfoYsEnK z2O2&7EY(?>3)ONv4ZGx8Tnutuvb2|!bCo+_>h+?Wm)?37CF*BKHgMyAZY*_+o>;n9 zsDY5nmzLUD5l7ilmfl_JZ|iQ6Uua)mQmGb;{V3jma~14c7;zU(k#n_#M!UaVHl|!Z zYaD9PLz~2X>e7HpV~Zh&iiw8x{xvAt*#ma=iCi#oNDyypp|G4po1jhi7-##0RGMow zchBRV(YSA8@y=D_9TNa0M3}CJx@*uOWY~=q01~FT(g>H}?T%mhrmV$9eqTsEJU1P~ ztw`l>>u?>ubJYFla1YY$J~mfK;J7g$|}V`sF(bMQvExHxXN4hZgbv*nk* z>Kgc!-c~n_yJamak_31yJt1Ww5#nuCy5d2qZB(YJCKf1toO~_q9fPjsP&u?t0*DW( z6KU+R*=bS^0sDJcwXTmgKSU32byy+bwS?ufn$xR1y#+hLlGm;wHVD=!geQ*JJd zDEBs~{6ZTi`_|q5Uabnj<^rrB?l=em531GnDdsLzL>?hryzw19?py<<5T54n+Vw*A zB5k8mAvj!@1)?%Vo-{}FqA*L9u7_1A*2AuNFlKyPn%f>6MJ10IZQfKbqZ*!{4j@>N zaTCI6Dh^T|-OWVUk20aPXdjOG|4n%|@-4*NWEmVSk_qBI?g7a7 ziR{uPta{)RZiH*tUP-z3ZSiY2(Z0%bDrW^2Y`sPtr%<64HQ zCCfxE7obVwS809yis`6rMKXsMTCNOC58ei+BxzZf(bjmA{~YT1{--cn8NfQsr}JbU z3BsoVP~2p7vOwio^u)$>lVYyzL2R1%6UxY@X@e*KV zyMaT0pYE{D_t2sk>m7H1Tnc;#D`swh)hM4?F)4?Q`|Gx!P4zccoctRz2eYv&Z*DO8 zlbuo7su@@jHZY6NV9cytWwLT*o13gW9@ls_4m*s@Lw95tf6DI-RK=4CeEAsv$U8h# zx{$)q$YeA?lBcm59X+GWmI${}JWClKOXRKSKC)pR-c!hA>z0GydUGv1_+t+ssY&h6;?~n&XH%#dY-kth%7&{Ub>7C>J3y5JI!1YkU4sk zG|5pi=gyO((D9@40{X8X0+%_dk*g48z+S!mNR4D<_-R5xhVwUsp8l`VZdEw73$|EA zgY%dzmrZ5f)vB_|n= 8: + break + + elif i == 10: + logging.error("ColorThief couldn't generate a suitable palette.") + sys.exit(1) + + else: + logging.warning("ColorThief couldn't generate a palette.") + logging.warning("Trying a larger palette size %s", 8 + i) + + return [util.rgb_to_hex(color) for color in raw_colors] + + +def adjust(cols, light): + """Create palette.""" + cols.sort(key=util.rgb_to_yiq) + raw_colors = [*cols, *cols] + + if light: + raw_colors[0] = util.lighten_color(cols[0], 0.90) + raw_colors[7] = util.darken_color(cols[0], 0.75) + + else: + for color in raw_colors: + color = util.lighten_color(color, 0.40) + + raw_colors[0] = util.darken_color(cols[0], 0.80) + raw_colors[7] = util.lighten_color(cols[0], 0.60) + + raw_colors[8] = util.lighten_color(cols[0], 0.20) + raw_colors[15] = raw_colors[7] + + return raw_colors + + +def get(img, light=False): + """Get colorscheme.""" + cols = gen_colors(img) + return adjust(cols, light) diff --git a/.local/lib/python3.9/site-packages/pywal/backends/colorz.py b/.local/lib/python3.9/site-packages/pywal/backends/colorz.py new file mode 100644 index 00000000..b789a3af --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/backends/colorz.py @@ -0,0 +1,43 @@ +""" +Generate a colorscheme using Colorz. +""" +import logging +import sys + +try: + import colorz + +except ImportError: + logging.error("colorz wasn't found on your system.") + logging.error("Try another backend. (wal --backend)") + sys.exit(1) + +from .. import colors +from .. import util + + +def gen_colors(img): + """Generate a colorscheme using Colorz.""" + # pylint: disable=not-callable + raw_colors = colorz.colorz(img, n=6, bold_add=0) + return [util.rgb_to_hex([*color[0]]) for color in raw_colors] + + +def adjust(cols, light): + """Create palette.""" + raw_colors = [cols[0], *cols, "#FFFFFF", + "#000000", *cols, "#FFFFFF"] + + return colors.generic_adjust(raw_colors, light) + + +def get(img, light=False): + """Get colorscheme.""" + cols = gen_colors(img) + + if len(cols) < 6: + logging.error("colorz failed to generate enough colors.") + logging.error("Try another backend or another image. (wal --backend)") + sys.exit(1) + + return adjust(cols, light) diff --git a/.local/lib/python3.9/site-packages/pywal/backends/haishoku.py b/.local/lib/python3.9/site-packages/pywal/backends/haishoku.py new file mode 100644 index 00000000..00025b29 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/backends/haishoku.py @@ -0,0 +1,37 @@ +""" +Generate a colorscheme using Haishoku. +""" +import logging +import sys + +try: + from haishoku.haishoku import Haishoku + +except ImportError: + logging.error("Haishoku wasn't found on your system.") + logging.error("Try another backend. (wal --backend)") + sys.exit(1) + +from .. import colors +from .. import util + + +def gen_colors(img): + """Generate a colorscheme using Colorz.""" + palette = Haishoku.getPalette(img) + return [util.rgb_to_hex(col[1]) for col in palette] + + +def adjust(cols, light): + """Create palette.""" + cols.sort(key=util.rgb_to_yiq) + raw_colors = [*cols, *cols] + raw_colors[0] = util.lighten_color(cols[0], 0.40) + + return colors.generic_adjust(raw_colors, light) + + +def get(img, light=False): + """Get colorscheme.""" + cols = gen_colors(img) + return adjust(cols, light) diff --git a/.local/lib/python3.9/site-packages/pywal/backends/schemer2.py b/.local/lib/python3.9/site-packages/pywal/backends/schemer2.py new file mode 100644 index 00000000..adae6502 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/backends/schemer2.py @@ -0,0 +1,35 @@ +""" +Generate a colorscheme using Schemer2. +""" +import logging +import shutil +import subprocess +import sys + +from .. import colors +from .. import util + + +def gen_colors(img): + """Generate a colorscheme using Colorz.""" + cmd = ["schemer2", "-format", "img::colors", "-minBright", "75", "-in"] + return subprocess.check_output([*cmd, img]).splitlines() + + +def adjust(cols, light): + """Create palette.""" + cols.sort(key=util.rgb_to_yiq) + raw_colors = [*cols[8:], *cols[8:]] + + return colors.generic_adjust(raw_colors, light) + + +def get(img, light=False): + """Get colorscheme.""" + if not shutil.which("schemer2"): + logging.error("Schemer2 wasn't found on your system.") + logging.error("Try another backend. (wal --backend)") + sys.exit(1) + + cols = [col.decode('UTF-8') for col in gen_colors(img)] + return adjust(cols, light) diff --git a/.local/lib/python3.9/site-packages/pywal/backends/wal.py b/.local/lib/python3.9/site-packages/pywal/backends/wal.py new file mode 100644 index 00000000..a75fdc54 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/backends/wal.py @@ -0,0 +1,87 @@ +""" +Generate a colorscheme using imagemagick. +""" +import logging +import re +import shutil +import subprocess +import sys + +from .. import util + + +def imagemagick(color_count, img, magick_command): + """Call Imagemagick to generate a scheme.""" + flags = ["-resize", "25%", "-colors", str(color_count), + "-unique-colors", "txt:-"] + img += "[0]" + + return subprocess.check_output([*magick_command, img, *flags]).splitlines() + + +def has_im(): + """Check to see if the user has im installed.""" + if shutil.which("magick"): + return ["magick", "convert"] + + if shutil.which("convert"): + return ["convert"] + + logging.error("Imagemagick wasn't found on your system.") + logging.error("Try another backend. (wal --backend)") + sys.exit(1) + + +def gen_colors(img): + """Format the output from imagemagick into a list + of hex colors.""" + magick_command = has_im() + + for i in range(0, 20, 1): + raw_colors = imagemagick(16 + i, img, magick_command) + + if len(raw_colors) > 16: + break + + elif i == 19: + logging.error("Imagemagick couldn't generate a suitable palette.") + sys.exit(1) + + else: + logging.warning("Imagemagick couldn't generate a palette.") + logging.warning("Trying a larger palette size %s", 16 + i) + + return [re.search("#.{6}", str(col)).group(0) for col in raw_colors[1:]] + + +def adjust(colors, light): + """Adjust the generated colors and store them in a dict that + we will later save in json format.""" + raw_colors = colors[:1] + colors[8:16] + colors[8:-1] + + # Manually adjust colors. + if light: + for color in raw_colors: + color = util.saturate_color(color, 0.5) + + raw_colors[0] = util.lighten_color(colors[-1], 0.85) + raw_colors[7] = colors[0] + raw_colors[8] = util.darken_color(colors[-1], 0.4) + raw_colors[15] = colors[0] + + else: + # Darken the background color slightly. + if raw_colors[0][1] != "0": + raw_colors[0] = util.darken_color(raw_colors[0], 0.40) + + raw_colors[7] = util.blend_color(raw_colors[7], "#EEEEEE") + raw_colors[8] = util.darken_color(raw_colors[7], 0.30) + raw_colors[15] = util.blend_color(raw_colors[15], "#EEEEEE") + + return raw_colors + + +def get(img, light=False): + """Get colorscheme.""" + colors = gen_colors(img) + return adjust(colors, light) diff --git a/.local/lib/python3.9/site-packages/pywal/colors.py b/.local/lib/python3.9/site-packages/pywal/colors.py new file mode 100644 index 00000000..86db9c48 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colors.py @@ -0,0 +1,155 @@ +""" +Generate a palette using various backends. +""" +import logging +import os +import random +import re +import sys + +from . import theme +from . import util +from .settings import CACHE_DIR, MODULE_DIR, __cache_version__ + + +def list_backends(): + """List color backends.""" + return [b.name.replace(".py", "") for b in + os.scandir(os.path.join(MODULE_DIR, "backends")) + if "__" not in b.name] + + +def colors_to_dict(colors, img): + """Convert list of colors to pywal format.""" + return { + "wallpaper": img, + "alpha": util.Color.alpha_num, + + "special": { + "background": colors[0], + "foreground": colors[15], + "cursor": colors[15] + }, + + "colors": { + "color0": colors[0], + "color1": colors[1], + "color2": colors[2], + "color3": colors[3], + "color4": colors[4], + "color5": colors[5], + "color6": colors[6], + "color7": colors[7], + "color8": colors[8], + "color9": colors[9], + "color10": colors[10], + "color11": colors[11], + "color12": colors[12], + "color13": colors[13], + "color14": colors[14], + "color15": colors[15] + } + } + + +def generic_adjust(colors, light): + """Generic color adjustment for themers.""" + if light: + for color in colors: + color = util.saturate_color(color, 0.60) + color = util.darken_color(color, 0.5) + + colors[0] = util.lighten_color(colors[0], 0.95) + colors[7] = util.darken_color(colors[0], 0.75) + colors[8] = util.darken_color(colors[0], 0.25) + colors[15] = colors[7] + + else: + colors[0] = util.darken_color(colors[0], 0.80) + colors[7] = util.lighten_color(colors[0], 0.75) + colors[8] = util.lighten_color(colors[0], 0.25) + colors[15] = colors[7] + + return colors + + +def saturate_colors(colors, amount): + """Saturate all colors.""" + if amount and float(amount) <= 1.0: + for i, _ in enumerate(colors): + if i not in [0, 7, 8, 15]: + colors[i] = util.saturate_color(colors[i], float(amount)) + + return colors + + +def cache_fname(img, backend, light, cache_dir, sat=""): + """Create the cache file name.""" + color_type = "light" if light else "dark" + file_name = re.sub("[/|\\|.]", "_", img) + + file_parts = [file_name, color_type, backend, sat, __cache_version__] + return [cache_dir, "schemes", "%s_%s_%s_%s_%s.json" % (*file_parts,)] + + +def get_backend(backend): + """Figure out which backend to use.""" + if backend == "random": + backends = list_backends() + random.shuffle(backends) + return backends[0] + + return backend + + +def palette(): + """Generate a palette from the colors.""" + for i in range(0, 16): + if i % 8 == 0: + print() + + if i > 7: + i = "8;5;%s" % i + + print("\033[4%sm%s\033[0m" % (i, " " * (80 // 20)), end="") + + print("\n") + + +def get(img, light=False, backend="wal", cache_dir=CACHE_DIR, sat=""): + """Generate a palette.""" + # home_dylan_img_jpg_backend_1.2.2.json + cache_name = cache_fname(img, backend, light, cache_dir, sat) + cache_file = os.path.join(*cache_name) + + if os.path.isfile(cache_file): + colors = theme.file(cache_file) + colors["alpha"] = util.Color.alpha_num + logging.info("Found cached colorscheme.") + + else: + logging.info("Generating a colorscheme.") + backend = get_backend(backend) + + # Dynamically import the backend we want to use. + # This keeps the dependencies "optional". + try: + __import__("pywal.backends.%s" % backend) + except ImportError: + __import__("pywal.backends.wal") + backend = "wal" + + logging.info("Using %s backend.", backend) + backend = sys.modules["pywal.backends.%s" % backend] + colors = getattr(backend, "get")(img, light) + colors = colors_to_dict(saturate_colors(colors, sat), img) + + util.save_file_json(colors, cache_file) + logging.info("Generation complete.") + + return colors + + +def file(input_file): + """Deprecated: symbolic link to --> theme.file""" + return theme.file(input_file) diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/3024.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/3024.json new file mode 100644 index 00000000..b84f41bb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/3024.json @@ -0,0 +1 @@ +{"special":{"background":"#090300","foreground":"#a5a2a2","cursor":"#db2d20"},"colors":{"color0":"#090300","color1":"#db2d20","color2":"#01a252","color3":"#fded02","color4":"#01a0e4","color5":"#a16a94","color6":"#b5e4f4","color7":"#a5a2a2","color8":"#5c5855","color9":"#db2d20","color10":"#01a252","color11":"#fded02","color12":"#01a0e4","color13":"#a16a94","color14":"#b5e4f4","color15":"#f7f7f7"}} diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/ashes.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/ashes.json new file mode 100644 index 00000000..c1024a35 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/ashes.json @@ -0,0 +1 @@ +{"special":{"background":"#1c2023","foreground":"#c7ccd1","cursor":"#c7ae95"},"colors":{"color0":"#1c2023","color1":"#c7ae95","color2":"#95c7ae","color3":"#aec795","color4":"#ae95c7","color5":"#c795ae","color6":"#95aec7","color7":"#c7ccd1","color8":"#747c84","color9":"#c7ae95","color10":"#95c7ae","color11":"#aec795","color12":"#ae95c7","color13":"#c795ae","color14":"#95aec7","color15":"#f3f4f5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-3024.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-3024.json new file mode 100644 index 00000000..0d724157 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-3024.json @@ -0,0 +1 @@ +{"special":{"background":"#090300","foreground":"#a5a2a2","cursor":"#a5a2a2"},"colors":{"color0":"#090300","color1":"#db2d20","color2":"#01a252","color3":"#fded02","color4":"#01a0e4","color5":"#a16a94","color6":"#b5e4f4","color7":"#a5a2a2","color8":"#5c5855","color9":"#db2d20","color10":"#01a252","color11":"#fded02","color12":"#01a0e4","color13":"#a16a94","color14":"#b5e4f4","color15":"#f7f7f7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-apathy.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-apathy.json new file mode 100644 index 00000000..3d004edd --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-apathy.json @@ -0,0 +1 @@ +{"special":{"background":"#031A16","foreground":"#81B5AC","cursor":"#81B5AC"},"colors":{"color0":"#031A16","color1":"#3E9688","color2":"#883E96","color3":"#3E4C96","color4":"#96883E","color5":"#4C963E","color6":"#963E4C","color7":"#81B5AC","color8":"#2B685E","color9":"#3E9688","color10":"#883E96","color11":"#3E4C96","color12":"#96883E","color13":"#4C963E","color14":"#963E4C","color15":"#D2E7E4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ashes.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ashes.json new file mode 100644 index 00000000..97edfa35 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ashes.json @@ -0,0 +1 @@ +{"special":{"background":"#1C2023","foreground":"#C7CCD1","cursor":"#C7CCD1"},"colors":{"color0":"#1C2023","color1":"#C7AE95","color2":"#95C7AE","color3":"#AEC795","color4":"#AE95C7","color5":"#C795AE","color6":"#95AEC7","color7":"#C7CCD1","color8":"#747C84","color9":"#C7AE95","color10":"#95C7AE","color11":"#AEC795","color12":"#AE95C7","color13":"#C795AE","color14":"#95AEC7","color15":"#F3F4F5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-cave.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-cave.json new file mode 100644 index 00000000..f9dab483 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-cave.json @@ -0,0 +1 @@ +{"special":{"background":"#19171c","foreground":"#8b8792","cursor":"#8b8792"},"colors":{"color0":"#19171c","color1":"#be4678","color2":"#2a9292","color3":"#a06e3b","color4":"#576ddb","color5":"#955ae7","color6":"#398bc6","color7":"#8b8792","color8":"#655f6d","color9":"#be4678","color10":"#2a9292","color11":"#a06e3b","color12":"#576ddb","color13":"#955ae7","color14":"#398bc6","color15":"#efecf4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-dune.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-dune.json new file mode 100644 index 00000000..1ac1b84e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-dune.json @@ -0,0 +1 @@ +{"special":{"background":"#20201d","foreground":"#a6a28c","cursor":"#a6a28c"},"colors":{"color0":"#20201d","color1":"#d73737","color2":"#60ac39","color3":"#ae9513","color4":"#6684e1","color5":"#b854d4","color6":"#1fad83","color7":"#a6a28c","color8":"#7d7a68","color9":"#d73737","color10":"#60ac39","color11":"#ae9513","color12":"#6684e1","color13":"#b854d4","color14":"#1fad83","color15":"#fefbec"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-estuary.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-estuary.json new file mode 100644 index 00000000..f00cfd08 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-estuary.json @@ -0,0 +1 @@ +{"special":{"background":"#22221b","foreground":"#929181","cursor":"#929181"},"colors":{"color0":"#22221b","color1":"#ba6236","color2":"#7d9726","color3":"#a5980d","color4":"#36a166","color5":"#5f9182","color6":"#5b9d48","color7":"#929181","color8":"#6c6b5a","color9":"#ba6236","color10":"#7d9726","color11":"#a5980d","color12":"#36a166","color13":"#5f9182","color14":"#5b9d48","color15":"#f4f3ec"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-forest.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-forest.json new file mode 100644 index 00000000..b45fd403 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-forest.json @@ -0,0 +1 @@ +{"special":{"background":"#1b1918","foreground":"#a8a19f","cursor":"#a8a19f"},"colors":{"color0":"#1b1918","color1":"#f22c40","color2":"#7b9726","color3":"#c38418","color4":"#407ee7","color5":"#6666ea","color6":"#3d97b8","color7":"#a8a19f","color8":"#766e6b","color9":"#f22c40","color10":"#7b9726","color11":"#c38418","color12":"#407ee7","color13":"#6666ea","color14":"#3d97b8","color15":"#f1efee"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-heath.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-heath.json new file mode 100644 index 00000000..f4daee6c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-heath.json @@ -0,0 +1 @@ +{"special":{"background":"#1b181b","foreground":"#ab9bab","cursor":"#ab9bab"},"colors":{"color0":"#1b181b","color1":"#ca402b","color2":"#918b3b","color3":"#bb8a35","color4":"#516aec","color5":"#7b59c0","color6":"#159393","color7":"#ab9bab","color8":"#776977","color9":"#ca402b","color10":"#918b3b","color11":"#bb8a35","color12":"#516aec","color13":"#7b59c0","color14":"#159393","color15":"#f7f3f7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-lakeside.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-lakeside.json new file mode 100644 index 00000000..3e5f4209 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-lakeside.json @@ -0,0 +1 @@ +{"special":{"background":"#161b1d","foreground":"#7ea2b4","cursor":"#7ea2b4"},"colors":{"color0":"#161b1d","color1":"#d22d72","color2":"#568c3b","color3":"#8a8a0f","color4":"#257fad","color5":"#6b6bb8","color6":"#2d8f6f","color7":"#7ea2b4","color8":"#5a7b8c","color9":"#d22d72","color10":"#568c3b","color11":"#8a8a0f","color12":"#257fad","color13":"#6b6bb8","color14":"#2d8f6f","color15":"#ebf8ff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-plateau.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-plateau.json new file mode 100644 index 00000000..9883391d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-plateau.json @@ -0,0 +1 @@ +{"special":{"background":"#1b1818","foreground":"#8a8585","cursor":"#8a8585"},"colors":{"color0":"#1b1818","color1":"#ca4949","color2":"#4b8b8b","color3":"#a06e3b","color4":"#7272ca","color5":"#8464c4","color6":"#5485b6","color7":"#8a8585","color8":"#655d5d","color9":"#ca4949","color10":"#4b8b8b","color11":"#a06e3b","color12":"#7272ca","color13":"#8464c4","color14":"#5485b6","color15":"#f4ecec"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-savanna.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-savanna.json new file mode 100644 index 00000000..6e061e70 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-savanna.json @@ -0,0 +1 @@ +{"special":{"background":"#171c19","foreground":"#87928a","cursor":"#87928a"},"colors":{"color0":"#171c19","color1":"#b16139","color2":"#489963","color3":"#a07e3b","color4":"#478c90","color5":"#55859b","color6":"#1c9aa0","color7":"#87928a","color8":"#5f6d64","color9":"#b16139","color10":"#489963","color11":"#a07e3b","color12":"#478c90","color13":"#55859b","color14":"#1c9aa0","color15":"#ecf4ee"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-seaside.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-seaside.json new file mode 100644 index 00000000..765b0d16 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-seaside.json @@ -0,0 +1 @@ +{"special":{"background":"#131513","foreground":"#8ca68c","cursor":"#8ca68c"},"colors":{"color0":"#131513","color1":"#e6193c","color2":"#29a329","color3":"#98981b","color4":"#3d62f5","color5":"#ad2bee","color6":"#1999b3","color7":"#8ca68c","color8":"#687d68","color9":"#e6193c","color10":"#29a329","color11":"#98981b","color12":"#3d62f5","color13":"#ad2bee","color14":"#1999b3","color15":"#f4fbf4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-sulphurpool.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-sulphurpool.json new file mode 100644 index 00000000..857610e5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-atelier-sulphurpool.json @@ -0,0 +1 @@ +{"special":{"background":"#202746","foreground":"#979db4","cursor":"#979db4"},"colors":{"color0":"#202746","color1":"#c94922","color2":"#ac9739","color3":"#c08b30","color4":"#3d8fd1","color5":"#6679cc","color6":"#22a2c9","color7":"#979db4","color8":"#6b7394","color9":"#c94922","color10":"#ac9739","color11":"#c08b30","color12":"#3d8fd1","color13":"#6679cc","color14":"#22a2c9","color15":"#f5f7ff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bespin.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bespin.json new file mode 100644 index 00000000..e3fd09f9 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bespin.json @@ -0,0 +1 @@ +{"special":{"background":"#28211c","foreground":"#8a8986","cursor":"#8a8986"},"colors":{"color0":"#28211c","color1":"#cf6a4c","color2":"#54be0d","color3":"#f9ee98","color4":"#5ea6ea","color5":"#9b859d","color6":"#afc4db","color7":"#8a8986","color8":"#666666","color9":"#cf6a4c","color10":"#54be0d","color11":"#f9ee98","color12":"#5ea6ea","color13":"#9b859d","color14":"#afc4db","color15":"#baae9e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-bathory.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-bathory.json new file mode 100644 index 00000000..2c1e9912 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-bathory.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#fbcb97","color3":"#e78a53","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#fbcb97","color11":"#e78a53","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-burzum.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-burzum.json new file mode 100644 index 00000000..d14f2107 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-burzum.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#ddeecc","color3":"#99bbaa","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#ddeecc","color11":"#99bbaa","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-funeral.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-funeral.json new file mode 100644 index 00000000..0d1e0acc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-funeral.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#d0dfee","color3":"#5f81a5","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#d0dfee","color11":"#5f81a5","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-gorgoroth.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-gorgoroth.json new file mode 100644 index 00000000..21f022f2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-gorgoroth.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#9b8d7f","color3":"#8c7f70","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#9b8d7f","color11":"#8c7f70","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-immortal.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-immortal.json new file mode 100644 index 00000000..8a212af7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-immortal.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#7799bb","color3":"#556677","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#7799bb","color11":"#556677","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-khold.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-khold.json new file mode 100644 index 00000000..fea256a8 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-khold.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#eceee3","color3":"#974b46","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#eceee3","color11":"#974b46","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-marduk.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-marduk.json new file mode 100644 index 00000000..f40c9781 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-marduk.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#a5aaa7","color3":"#626b67","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#a5aaa7","color11":"#626b67","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-mayhem.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-mayhem.json new file mode 100644 index 00000000..8590ef4f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-mayhem.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#f3ecd4","color3":"#eecc6c","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#f3ecd4","color11":"#eecc6c","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-nile.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-nile.json new file mode 100644 index 00000000..592ad610 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-nile.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#aa9988","color3":"#777755","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#aa9988","color11":"#777755","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-venom.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-venom.json new file mode 100644 index 00000000..017b16fd --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal-venom.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#f8f7f2","color3":"#79241f","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#f8f7f2","color11":"#79241f","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal.json new file mode 100644 index 00000000..35516016 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-black-metal.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c1c1c1","cursor":"#c1c1c1"},"colors":{"color0":"#000000","color1":"#5f8787","color2":"#dd9999","color3":"#a06666","color4":"#888888","color5":"#999999","color6":"#aaaaaa","color7":"#c1c1c1","color8":"#333333","color9":"#5f8787","color10":"#dd9999","color11":"#a06666","color12":"#888888","color13":"#999999","color14":"#aaaaaa","color15":"#c1c1c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brewer.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brewer.json new file mode 100644 index 00000000..98b5ef40 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brewer.json @@ -0,0 +1 @@ +{"special":{"background":"#0c0d0e","foreground":"#b7b8b9","cursor":"#b7b8b9"},"colors":{"color0":"#0c0d0e","color1":"#e31a1c","color2":"#31a354","color3":"#dca060","color4":"#3182bd","color5":"#756bb1","color6":"#80b1d3","color7":"#b7b8b9","color8":"#737475","color9":"#e31a1c","color10":"#31a354","color11":"#dca060","color12":"#3182bd","color13":"#756bb1","color14":"#80b1d3","color15":"#fcfdfe"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bright.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bright.json new file mode 100644 index 00000000..d230b2d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-bright.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#e0e0e0","cursor":"#e0e0e0"},"colors":{"color0":"#000000","color1":"#fb0120","color2":"#a1c659","color3":"#fda331","color4":"#6fb3d2","color5":"#d381c3","color6":"#76c7b7","color7":"#e0e0e0","color8":"#b0b0b0","color9":"#fb0120","color10":"#a1c659","color11":"#fda331","color12":"#6fb3d2","color13":"#d381c3","color14":"#76c7b7","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brushtrees.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brushtrees.json new file mode 100644 index 00000000..037f2c67 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-brushtrees.json @@ -0,0 +1 @@ +{"special":{"background":"#485867","foreground":"#B0C5C8","cursor":"#B0C5C8"},"colors":{"color0":"#485867","color1":"#b38686","color2":"#87b386","color3":"#aab386","color4":"#868cb3","color5":"#b386b2","color6":"#86b3b3","color7":"#B0C5C8","color8":"#8299A1","color9":"#b38686","color10":"#87b386","color11":"#aab386","color12":"#868cb3","color13":"#b386b2","color14":"#86b3b3","color15":"#E3EFEF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-chalk.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-chalk.json new file mode 100644 index 00000000..6786db62 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-chalk.json @@ -0,0 +1 @@ +{"special":{"background":"#151515","foreground":"#d0d0d0","cursor":"#d0d0d0"},"colors":{"color0":"#151515","color1":"#fb9fb1","color2":"#acc267","color3":"#ddb26f","color4":"#6fc2ef","color5":"#e1a3ee","color6":"#12cfc0","color7":"#d0d0d0","color8":"#505050","color9":"#fb9fb1","color10":"#acc267","color11":"#ddb26f","color12":"#6fc2ef","color13":"#e1a3ee","color14":"#12cfc0","color15":"#f5f5f5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-circus.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-circus.json new file mode 100644 index 00000000..c50727d6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-circus.json @@ -0,0 +1 @@ +{"special":{"background":"#191919","foreground":"#a7a7a7","cursor":"#a7a7a7"},"colors":{"color0":"#191919","color1":"#dc657d","color2":"#84b97c","color3":"#c3ba63","color4":"#639ee4","color5":"#b888e2","color6":"#4bb1a7","color7":"#a7a7a7","color8":"#5f5a60","color9":"#dc657d","color10":"#84b97c","color11":"#c3ba63","color12":"#639ee4","color13":"#b888e2","color14":"#4bb1a7","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-classic.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-classic.json new file mode 100644 index 00000000..69485ac0 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-classic.json @@ -0,0 +1 @@ +{"special":{"background":"#151515","foreground":"#D0D0D0","cursor":"#D0D0D0"},"colors":{"color0":"#151515","color1":"#AC4142","color2":"#90A959","color3":"#F4BF75","color4":"#6A9FB5","color5":"#AA759F","color6":"#75B5AA","color7":"#D0D0D0","color8":"#505050","color9":"#AC4142","color10":"#90A959","color11":"#F4BF75","color12":"#6A9FB5","color13":"#AA759F","color14":"#75B5AA","color15":"#F5F5F5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-codeschool.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-codeschool.json new file mode 100644 index 00000000..17a0d833 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-codeschool.json @@ -0,0 +1 @@ +{"special":{"background":"#232c31","foreground":"#9ea7a6","cursor":"#9ea7a6"},"colors":{"color0":"#232c31","color1":"#2a5491","color2":"#237986","color3":"#a03b1e","color4":"#484d79","color5":"#c59820","color6":"#b02f30","color7":"#9ea7a6","color8":"#3f4944","color9":"#2a5491","color10":"#237986","color11":"#a03b1e","color12":"#484d79","color13":"#c59820","color14":"#b02f30","color15":"#b5d8f6"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-default.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-default.json new file mode 100644 index 00000000..adceb5ba --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-default.json @@ -0,0 +1 @@ +{"special":{"background":"#181818","foreground":"#d8d8d8","cursor":"#d8d8d8"},"colors":{"color0":"#181818","color1":"#ab4642","color2":"#a1b56c","color3":"#f7ca88","color4":"#7cafc2","color5":"#ba8baf","color6":"#86c1b9","color7":"#d8d8d8","color8":"#585858","color9":"#ab4642","color10":"#a1b56c","color11":"#f7ca88","color12":"#7cafc2","color13":"#ba8baf","color14":"#86c1b9","color15":"#f8f8f8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-dracula.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-dracula.json new file mode 100644 index 00000000..34606818 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-dracula.json @@ -0,0 +1 @@ +{"special":{"background":"#282936","foreground":"#e9e9f4","cursor":"#e9e9f4"},"colors":{"color0":"#282936","color1":"#ea51b2","color2":"#00f769","color3":"#ebff87","color4":"#62d6e8","color5":"#b45bcf","color6":"#a1efe4","color7":"#e9e9f4","color8":"#4d4f68","color9":"#ea51b2","color10":"#00f769","color11":"#ebff87","color12":"#62d6e8","color13":"#b45bcf","color14":"#a1efe4","color15":"#f7f7fb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-eighties.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-eighties.json new file mode 100644 index 00000000..b81cb88e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-eighties.json @@ -0,0 +1 @@ +{"special":{"background":"#2d2d2d","foreground":"#d3d0c8","cursor":"#d3d0c8"},"colors":{"color0":"#2d2d2d","color1":"#f2777a","color2":"#99cc99","color3":"#ffcc66","color4":"#6699cc","color5":"#cc99cc","color6":"#66cccc","color7":"#d3d0c8","color8":"#747369","color9":"#f2777a","color10":"#99cc99","color11":"#ffcc66","color12":"#6699cc","color13":"#cc99cc","color14":"#66cccc","color15":"#f2f0ec"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-embers.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-embers.json new file mode 100644 index 00000000..b3c9d16c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-embers.json @@ -0,0 +1 @@ +{"special":{"background":"#16130F","foreground":"#A39A90","cursor":"#A39A90"},"colors":{"color0":"#16130F","color1":"#826D57","color2":"#57826D","color3":"#6D8257","color4":"#6D5782","color5":"#82576D","color6":"#576D82","color7":"#A39A90","color8":"#5A5047","color9":"#826D57","color10":"#57826D","color11":"#6D8257","color12":"#6D5782","color13":"#82576D","color14":"#576D82","color15":"#DBD6D1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-flat.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-flat.json new file mode 100644 index 00000000..1e8b6c92 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-flat.json @@ -0,0 +1 @@ +{"special":{"background":"#2C3E50","foreground":"#e0e0e0","cursor":"#e0e0e0"},"colors":{"color0":"#2C3E50","color1":"#E74C3C","color2":"#2ECC71","color3":"#F1C40F","color4":"#3498DB","color5":"#9B59B6","color6":"#1ABC9C","color7":"#e0e0e0","color8":"#95A5A6","color9":"#E74C3C","color10":"#2ECC71","color11":"#F1C40F","color12":"#3498DB","color13":"#9B59B6","color14":"#1ABC9C","color15":"#ECF0F1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-google.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-google.json new file mode 100644 index 00000000..043c63c6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-google.json @@ -0,0 +1 @@ +{"special":{"background":"#1d1f21","foreground":"#c5c8c6","cursor":"#c5c8c6"},"colors":{"color0":"#1d1f21","color1":"#CC342B","color2":"#198844","color3":"#FBA922","color4":"#3971ED","color5":"#A36AC7","color6":"#3971ED","color7":"#c5c8c6","color8":"#969896","color9":"#CC342B","color10":"#198844","color11":"#FBA922","color12":"#3971ED","color13":"#A36AC7","color14":"#3971ED","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-grayscale.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-grayscale.json new file mode 100644 index 00000000..3b999aad --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-grayscale.json @@ -0,0 +1 @@ +{"special":{"background":"#101010","foreground":"#b9b9b9","cursor":"#b9b9b9"},"colors":{"color0":"#101010","color1":"#7c7c7c","color2":"#8e8e8e","color3":"#a0a0a0","color4":"#686868","color5":"#747474","color6":"#868686","color7":"#b9b9b9","color8":"#525252","color9":"#7c7c7c","color10":"#8e8e8e","color11":"#a0a0a0","color12":"#686868","color13":"#747474","color14":"#868686","color15":"#f7f7f7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-greenscreen.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-greenscreen.json new file mode 100644 index 00000000..6479ff91 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-greenscreen.json @@ -0,0 +1 @@ +{"special":{"background":"#001100","foreground":"#00bb00","cursor":"#00bb00"},"colors":{"color0":"#001100","color1":"#007700","color2":"#00bb00","color3":"#007700","color4":"#009900","color5":"#00bb00","color6":"#005500","color7":"#00bb00","color8":"#007700","color9":"#007700","color10":"#00bb00","color11":"#007700","color12":"#009900","color13":"#00bb00","color14":"#005500","color15":"#00ff00"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-hard.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-hard.json new file mode 100644 index 00000000..fb55620a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-hard.json @@ -0,0 +1 @@ +{"special":{"background":"#1d2021","foreground":"#d5c4a1","cursor":"#d5c4a1"},"colors":{"color0":"#1d2021","color1":"#fb4934","color2":"#b8bb26","color3":"#fabd2f","color4":"#83a598","color5":"#d3869b","color6":"#8ec07c","color7":"#d5c4a1","color8":"#665c54","color9":"#fb4934","color10":"#b8bb26","color11":"#fabd2f","color12":"#83a598","color13":"#d3869b","color14":"#8ec07c","color15":"#fbf1c7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-medium.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-medium.json new file mode 100644 index 00000000..cc019a56 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-medium.json @@ -0,0 +1 @@ +{"special":{"background":"#282828","foreground":"#d5c4a1","cursor":"#d5c4a1"},"colors":{"color0":"#282828","color1":"#fb4934","color2":"#b8bb26","color3":"#fabd2f","color4":"#83a598","color5":"#d3869b","color6":"#8ec07c","color7":"#d5c4a1","color8":"#665c54","color9":"#fb4934","color10":"#b8bb26","color11":"#fabd2f","color12":"#83a598","color13":"#d3869b","color14":"#8ec07c","color15":"#fbf1c7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-pale.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-pale.json new file mode 100644 index 00000000..f71836af --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-pale.json @@ -0,0 +1 @@ +{"special":{"background":"#262626","foreground":"#dab997","cursor":"#dab997"},"colors":{"color0":"#262626","color1":"#d75f5f","color2":"#afaf00","color3":"#ffaf00","color4":"#83adad","color5":"#d485ad","color6":"#85ad85","color7":"#dab997","color8":"#8a8a8a","color9":"#d75f5f","color10":"#afaf00","color11":"#ffaf00","color12":"#83adad","color13":"#d485ad","color14":"#85ad85","color15":"#ebdbb2"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-soft.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-soft.json new file mode 100644 index 00000000..ba842ce7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-gruvbox-soft.json @@ -0,0 +1 @@ +{"special":{"background":"#32302f","foreground":"#d5c4a1","cursor":"#d5c4a1"},"colors":{"color0":"#32302f","color1":"#fb4934","color2":"#b8bb26","color3":"#fabd2f","color4":"#83a598","color5":"#d3869b","color6":"#8ec07c","color7":"#d5c4a1","color8":"#665c54","color9":"#fb4934","color10":"#b8bb26","color11":"#fabd2f","color12":"#83a598","color13":"#d3869b","color14":"#8ec07c","color15":"#fbf1c7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-harmonic.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-harmonic.json new file mode 100644 index 00000000..a2589646 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-harmonic.json @@ -0,0 +1 @@ +{"special":{"background":"#0b1c2c","foreground":"#cbd6e2","cursor":"#cbd6e2"},"colors":{"color0":"#0b1c2c","color1":"#bf8b56","color2":"#56bf8b","color3":"#8bbf56","color4":"#8b56bf","color5":"#bf568b","color6":"#568bbf","color7":"#cbd6e2","color8":"#627e99","color9":"#bf8b56","color10":"#56bf8b","color11":"#8bbf56","color12":"#8b56bf","color13":"#bf568b","color14":"#568bbf","color15":"#f7f9fb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-hopscotch.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-hopscotch.json new file mode 100644 index 00000000..1f2b108d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-hopscotch.json @@ -0,0 +1 @@ +{"special":{"background":"#322931","foreground":"#b9b5b8","cursor":"#b9b5b8"},"colors":{"color0":"#322931","color1":"#dd464c","color2":"#8fc13e","color3":"#fdcc59","color4":"#1290bf","color5":"#c85e7c","color6":"#149b93","color7":"#b9b5b8","color8":"#797379","color9":"#dd464c","color10":"#8fc13e","color11":"#fdcc59","color12":"#1290bf","color13":"#c85e7c","color14":"#149b93","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-icy.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-icy.json new file mode 100644 index 00000000..52c2d84c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-icy.json @@ -0,0 +1 @@ +{"special":{"background":"#021012","foreground":"#095b67","cursor":"#095b67"},"colors":{"color0":"#021012","color1":"#16c1d9","color2":"#4dd0e1","color3":"#80deea","color4":"#00bcd4","color5":"#00acc1","color6":"#26c6da","color7":"#095b67","color8":"#052e34","color9":"#16c1d9","color10":"#4dd0e1","color11":"#80deea","color12":"#00bcd4","color13":"#00acc1","color14":"#26c6da","color15":"#109cb0"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-irblack.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-irblack.json new file mode 100644 index 00000000..aeaf6a5b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-irblack.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#b5b3aa","cursor":"#b5b3aa"},"colors":{"color0":"#000000","color1":"#ff6c60","color2":"#a8ff60","color3":"#ffffb6","color4":"#96cbfe","color5":"#ff73fd","color6":"#c6c5fe","color7":"#b5b3aa","color8":"#6c6c66","color9":"#ff6c60","color10":"#a8ff60","color11":"#ffffb6","color12":"#96cbfe","color13":"#ff73fd","color14":"#c6c5fe","color15":"#fdfbee"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-isotope.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-isotope.json new file mode 100644 index 00000000..190c9707 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-isotope.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#d0d0d0","cursor":"#d0d0d0"},"colors":{"color0":"#000000","color1":"#ff0000","color2":"#33ff00","color3":"#ff0099","color4":"#0066ff","color5":"#cc00ff","color6":"#00ffff","color7":"#d0d0d0","color8":"#808080","color9":"#ff0000","color10":"#33ff00","color11":"#ff0099","color12":"#0066ff","color13":"#cc00ff","color14":"#00ffff","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-macintosh.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-macintosh.json new file mode 100644 index 00000000..1b042e9a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-macintosh.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#c0c0c0","cursor":"#c0c0c0"},"colors":{"color0":"#000000","color1":"#dd0907","color2":"#1fb714","color3":"#fbf305","color4":"#0000d3","color5":"#4700a5","color6":"#02abea","color7":"#c0c0c0","color8":"#808080","color9":"#dd0907","color10":"#1fb714","color11":"#fbf305","color12":"#0000d3","color13":"#4700a5","color14":"#02abea","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-marrakesh.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-marrakesh.json new file mode 100644 index 00000000..4e0d90c1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-marrakesh.json @@ -0,0 +1 @@ +{"special":{"background":"#201602","foreground":"#948e48","cursor":"#948e48"},"colors":{"color0":"#201602","color1":"#c35359","color2":"#18974e","color3":"#a88339","color4":"#477ca1","color5":"#8868b3","color6":"#75a738","color7":"#948e48","color8":"#6c6823","color9":"#c35359","color10":"#18974e","color11":"#a88339","color12":"#477ca1","color13":"#8868b3","color14":"#75a738","color15":"#faf0a5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materia.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materia.json new file mode 100644 index 00000000..8fbbf834 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materia.json @@ -0,0 +1 @@ +{"special":{"background":"#263238","foreground":"#CDD3DE","cursor":"#CDD3DE"},"colors":{"color0":"#263238","color1":"#EC5F67","color2":"#8BD649","color3":"#FFCC00","color4":"#89DDFF","color5":"#82AAFF","color6":"#80CBC4","color7":"#CDD3DE","color8":"#707880","color9":"#EC5F67","color10":"#8BD649","color11":"#FFCC00","color12":"#89DDFF","color13":"#82AAFF","color14":"#80CBC4","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material-palenight.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material-palenight.json new file mode 100644 index 00000000..64adbeef --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material-palenight.json @@ -0,0 +1 @@ +{"special":{"background":"#292D3E","foreground":"#959DCB","cursor":"#959DCB"},"colors":{"color0":"#292D3E","color1":"#F07178","color2":"#C3E88D","color3":"#FFCB6B","color4":"#82AAFF","color5":"#C792EA","color6":"#89DDFF","color7":"#959DCB","color8":"#676E95","color9":"#F07178","color10":"#C3E88D","color11":"#FFCB6B","color12":"#82AAFF","color13":"#C792EA","color14":"#89DDFF","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material.json new file mode 100644 index 00000000..5b210f6f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-material.json @@ -0,0 +1 @@ +{"special":{"background":"#263238","foreground":"#EEFFFF","cursor":"#EEFFFF"},"colors":{"color0":"#263238","color1":"#F07178","color2":"#C3E88D","color3":"#FFCB6B","color4":"#82AAFF","color5":"#C792EA","color6":"#89DDFF","color7":"#EEFFFF","color8":"#546E7A","color9":"#F07178","color10":"#C3E88D","color11":"#FFCB6B","color12":"#82AAFF","color13":"#C792EA","color14":"#89DDFF","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materialer.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materialer.json new file mode 100644 index 00000000..a251717e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-materialer.json @@ -0,0 +1 @@ +{"special":{"background":"#212121","foreground":"#EEFFFF","cursor":"#EEFFFF"},"colors":{"color0":"#212121","color1":"#F07178","color2":"#C3E88D","color3":"#FFCB6B","color4":"#82AAFF","color5":"#C792EA","color6":"#89DDFF","color7":"#EEFFFF","color8":"#4A4A4A","color9":"#F07178","color10":"#C3E88D","color11":"#FFCB6B","color12":"#82AAFF","color13":"#C792EA","color14":"#89DDFF","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mellow-purple.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mellow-purple.json new file mode 100644 index 00000000..d42b10cc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mellow-purple.json @@ -0,0 +1 @@ +{"special":{"background":"#1e0528","foreground":"#ffeeff","cursor":"#ffeeff"},"colors":{"color0":"#1e0528","color1":"#00d9e9","color2":"#05cb0d","color3":"#955ae7","color4":"#550068","color5":"#8991bb","color6":"#b900b1","color7":"#ffeeff","color8":"#320f55","color9":"#00d9e9","color10":"#05cb0d","color11":"#955ae7","color12":"#550068","color13":"#8991bb","color14":"#b900b1","color15":"#f8c0ff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mocha.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mocha.json new file mode 100644 index 00000000..73b5ca75 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-mocha.json @@ -0,0 +1 @@ +{"special":{"background":"#3B3228","foreground":"#d0c8c6","cursor":"#d0c8c6"},"colors":{"color0":"#3B3228","color1":"#cb6077","color2":"#beb55b","color3":"#f4bc87","color4":"#8ab3b5","color5":"#a89bb9","color6":"#7bbda4","color7":"#d0c8c6","color8":"#7e705a","color9":"#cb6077","color10":"#beb55b","color11":"#f4bc87","color12":"#8ab3b5","color13":"#a89bb9","color14":"#7bbda4","color15":"#f5eeeb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-monokai.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-monokai.json new file mode 100644 index 00000000..e175ca82 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-monokai.json @@ -0,0 +1 @@ +{"special":{"background":"#272822","foreground":"#f8f8f2","cursor":"#f8f8f2"},"colors":{"color0":"#272822","color1":"#f92672","color2":"#a6e22e","color3":"#f4bf75","color4":"#66d9ef","color5":"#ae81ff","color6":"#a1efe4","color7":"#f8f8f2","color8":"#75715e","color9":"#f92672","color10":"#a6e22e","color11":"#f4bf75","color12":"#66d9ef","color13":"#ae81ff","color14":"#a1efe4","color15":"#f9f8f5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-nord.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-nord.json new file mode 100644 index 00000000..012c4a02 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-nord.json @@ -0,0 +1 @@ +{"special":{"background":"#2E3440","foreground":"#E5E9F0","cursor":"#E5E9F0"},"colors":{"color0":"#2E3440","color1":"#88C0D0","color2":"#BF616A","color3":"#5E81AC","color4":"#EBCB8B","color5":"#A3BE8C","color6":"#D08770","color7":"#E5E9F0","color8":"#4C566A","color9":"#88C0D0","color10":"#BF616A","color11":"#5E81AC","color12":"#EBCB8B","color13":"#A3BE8C","color14":"#D08770","color15":"#8FBCBB"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ocean.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ocean.json new file mode 100644 index 00000000..ad94ceef --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-ocean.json @@ -0,0 +1 @@ +{"special":{"background":"#2b303b","foreground":"#c0c5ce","cursor":"#c0c5ce"},"colors":{"color0":"#2b303b","color1":"#bf616a","color2":"#a3be8c","color3":"#ebcb8b","color4":"#8fa1b3","color5":"#b48ead","color6":"#96b5b4","color7":"#c0c5ce","color8":"#65737e","color9":"#bf616a","color10":"#a3be8c","color11":"#ebcb8b","color12":"#8fa1b3","color13":"#b48ead","color14":"#96b5b4","color15":"#eff1f5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-oceanicnext.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-oceanicnext.json new file mode 100644 index 00000000..ba0d7678 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-oceanicnext.json @@ -0,0 +1 @@ +{"special":{"background":"#1B2B34","foreground":"#C0C5CE","cursor":"#C0C5CE"},"colors":{"color0":"#1B2B34","color1":"#EC5f67","color2":"#99C794","color3":"#FAC863","color4":"#6699CC","color5":"#C594C5","color6":"#5FB3B3","color7":"#C0C5CE","color8":"#65737E","color9":"#EC5f67","color10":"#99C794","color11":"#FAC863","color12":"#6699CC","color13":"#C594C5","color14":"#5FB3B3","color15":"#D8DEE9"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-onedark.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-onedark.json new file mode 100644 index 00000000..9e49a657 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-onedark.json @@ -0,0 +1 @@ +{"special":{"background":"#282c34","foreground":"#abb2bf","cursor":"#abb2bf"},"colors":{"color0":"#282c34","color1":"#e06c75","color2":"#98c379","color3":"#e5c07b","color4":"#61afef","color5":"#c678dd","color6":"#56b6c2","color7":"#abb2bf","color8":"#545862","color9":"#e06c75","color10":"#98c379","color11":"#e5c07b","color12":"#61afef","color13":"#c678dd","color14":"#56b6c2","color15":"#c8ccd4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-outrun.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-outrun.json new file mode 100644 index 00000000..8fe83a2e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-outrun.json @@ -0,0 +1 @@ +{"special":{"background":"#00002A","foreground":"#D0D0FA","cursor":"#D0D0FA"},"colors":{"color0":"#00002A","color1":"#FF4242","color2":"#59F176","color3":"#F3E877","color4":"#66B0FF","color5":"#F10596","color6":"#0EF0F0","color7":"#D0D0FA","color8":"#50507A","color9":"#FF4242","color10":"#59F176","color11":"#F3E877","color12":"#66B0FF","color13":"#F10596","color14":"#0EF0F0","color15":"#F5F5FF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-paraiso.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-paraiso.json new file mode 100644 index 00000000..2960f48e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-paraiso.json @@ -0,0 +1 @@ +{"special":{"background":"#2f1e2e","foreground":"#a39e9b","cursor":"#a39e9b"},"colors":{"color0":"#2f1e2e","color1":"#ef6155","color2":"#48b685","color3":"#fec418","color4":"#06b6ef","color5":"#815ba4","color6":"#5bc4bf","color7":"#a39e9b","color8":"#776e71","color9":"#ef6155","color10":"#48b685","color11":"#fec418","color12":"#06b6ef","color13":"#815ba4","color14":"#5bc4bf","color15":"#e7e9db"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-phd.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-phd.json new file mode 100644 index 00000000..276be2b1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-phd.json @@ -0,0 +1 @@ +{"special":{"background":"#061229","foreground":"#b8bbc2","cursor":"#b8bbc2"},"colors":{"color0":"#061229","color1":"#d07346","color2":"#99bf52","color3":"#fbd461","color4":"#5299bf","color5":"#9989cc","color6":"#72b9bf","color7":"#b8bbc2","color8":"#717885","color9":"#d07346","color10":"#99bf52","color11":"#fbd461","color12":"#5299bf","color13":"#9989cc","color14":"#72b9bf","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pico.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pico.json new file mode 100644 index 00000000..e7118a84 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pico.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#5f574f","cursor":"#5f574f"},"colors":{"color0":"#000000","color1":"#ff004d","color2":"#00e756","color3":"#fff024","color4":"#83769c","color5":"#ff77a8","color6":"#29adff","color7":"#5f574f","color8":"#008751","color9":"#ff004d","color10":"#00e756","color11":"#fff024","color12":"#83769c","color13":"#ff77a8","color14":"#29adff","color15":"#fff1e8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pop.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pop.json new file mode 100644 index 00000000..26e628f3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-pop.json @@ -0,0 +1 @@ +{"special":{"background":"#000000","foreground":"#d0d0d0","cursor":"#d0d0d0"},"colors":{"color0":"#000000","color1":"#eb008a","color2":"#37b349","color3":"#f8ca12","color4":"#0e5a94","color5":"#b31e8d","color6":"#00aabb","color7":"#d0d0d0","color8":"#505050","color9":"#eb008a","color10":"#37b349","color11":"#f8ca12","color12":"#0e5a94","color13":"#b31e8d","color14":"#00aabb","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-porple.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-porple.json new file mode 100644 index 00000000..d646e5a0 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-porple.json @@ -0,0 +1 @@ +{"special":{"background":"#292c36","foreground":"#d8d8d8","cursor":"#d8d8d8"},"colors":{"color0":"#292c36","color1":"#f84547","color2":"#95c76f","color3":"#efa16b","color4":"#8485ce","color5":"#b74989","color6":"#64878f","color7":"#d8d8d8","color8":"#65568a","color9":"#f84547","color10":"#95c76f","color11":"#efa16b","color12":"#8485ce","color13":"#b74989","color14":"#64878f","color15":"#f8f8f8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-railscasts.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-railscasts.json new file mode 100644 index 00000000..b9e7abad --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-railscasts.json @@ -0,0 +1 @@ +{"special":{"background":"#2b2b2b","foreground":"#e6e1dc","cursor":"#e6e1dc"},"colors":{"color0":"#2b2b2b","color1":"#da4939","color2":"#a5c261","color3":"#ffc66d","color4":"#6d9cbe","color5":"#b6b3eb","color6":"#519f50","color7":"#e6e1dc","color8":"#5a647e","color9":"#da4939","color10":"#a5c261","color11":"#ffc66d","color12":"#6d9cbe","color13":"#b6b3eb","color14":"#519f50","color15":"#f9f7f3"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-rebecca.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-rebecca.json new file mode 100644 index 00000000..2431d2b5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-rebecca.json @@ -0,0 +1 @@ +{"special":{"background":"#292a44","foreground":"#f1eff8","cursor":"#f1eff8"},"colors":{"color0":"#292a44","color1":"#a0a0c5","color2":"#6dfedf","color3":"#ae81ff","color4":"#2de0a7","color5":"#7aa5ff","color6":"#8eaee0","color7":"#f1eff8","color8":"#666699","color9":"#a0a0c5","color10":"#6dfedf","color11":"#ae81ff","color12":"#2de0a7","color13":"#7aa5ff","color14":"#8eaee0","color15":"#53495d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-seti.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-seti.json new file mode 100644 index 00000000..cf8c0f09 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-seti.json @@ -0,0 +1 @@ +{"special":{"background":"#151718","foreground":"#d6d6d6","cursor":"#d6d6d6"},"colors":{"color0":"#151718","color1":"#Cd3f45","color2":"#9fca56","color3":"#e6cd69","color4":"#55b5db","color5":"#a074c4","color6":"#55dbbe","color7":"#d6d6d6","color8":"#41535B","color9":"#Cd3f45","color10":"#9fca56","color11":"#e6cd69","color12":"#55b5db","color13":"#a074c4","color14":"#55dbbe","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarflare.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarflare.json new file mode 100644 index 00000000..d43a8f23 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarflare.json @@ -0,0 +1 @@ +{"special":{"background":"#18262F","foreground":"#A6AFB8","cursor":"#A6AFB8"},"colors":{"color0":"#18262F","color1":"#EF5253","color2":"#7CC844","color3":"#E4B51C","color4":"#33B5E1","color5":"#A363D5","color6":"#52CBB0","color7":"#A6AFB8","color8":"#667581","color9":"#EF5253","color10":"#7CC844","color11":"#E4B51C","color12":"#33B5E1","color13":"#A363D5","color14":"#52CBB0","color15":"#F5F7FA"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarized.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarized.json new file mode 100644 index 00000000..9b0136e6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-solarized.json @@ -0,0 +1 @@ +{"special":{"background":"#002b36","foreground":"#93a1a1","cursor":"#93a1a1"},"colors":{"color0":"#002b36","color1":"#dc322f","color2":"#859900","color3":"#b58900","color4":"#268bd2","color5":"#6c71c4","color6":"#2aa198","color7":"#93a1a1","color8":"#657b83","color9":"#dc322f","color10":"#859900","color11":"#b58900","color12":"#268bd2","color13":"#6c71c4","color14":"#2aa198","color15":"#fdf6e3"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-spacemacs.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-spacemacs.json new file mode 100644 index 00000000..8480734c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-spacemacs.json @@ -0,0 +1 @@ +{"special":{"background":"#1f2022","foreground":"#a3a3a3","cursor":"#a3a3a3"},"colors":{"color0":"#1f2022","color1":"#f2241f","color2":"#67b11d","color3":"#b1951d","color4":"#4f97d7","color5":"#a31db1","color6":"#2d9574","color7":"#a3a3a3","color8":"#585858","color9":"#f2241f","color10":"#67b11d","color11":"#b1951d","color12":"#4f97d7","color13":"#a31db1","color14":"#2d9574","color15":"#f8f8f8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-summerfruit.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-summerfruit.json new file mode 100644 index 00000000..8cbc1032 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-summerfruit.json @@ -0,0 +1 @@ +{"special":{"background":"#151515","foreground":"#D0D0D0","cursor":"#D0D0D0"},"colors":{"color0":"#151515","color1":"#FF0086","color2":"#00C918","color3":"#ABA800","color4":"#3777E6","color5":"#AD00A1","color6":"#1FAAAA","color7":"#D0D0D0","color8":"#505050","color9":"#FF0086","color10":"#00C918","color11":"#ABA800","color12":"#3777E6","color13":"#AD00A1","color14":"#1FAAAA","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tomorrow-night.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tomorrow-night.json new file mode 100644 index 00000000..98d829d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tomorrow-night.json @@ -0,0 +1 @@ +{"special":{"background":"#1d1f21","foreground":"#c5c8c6","cursor":"#c5c8c6"},"colors":{"color0":"#1d1f21","color1":"#cc6666","color2":"#b5bd68","color3":"#f0c674","color4":"#81a2be","color5":"#b294bb","color6":"#8abeb7","color7":"#c5c8c6","color8":"#969896","color9":"#cc6666","color10":"#b5bd68","color11":"#f0c674","color12":"#81a2be","color13":"#b294bb","color14":"#8abeb7","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tube.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tube.json new file mode 100644 index 00000000..e3813ff6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-tube.json @@ -0,0 +1 @@ +{"special":{"background":"#231f20","foreground":"#d9d8d8","cursor":"#d9d8d8"},"colors":{"color0":"#231f20","color1":"#ee2e24","color2":"#00853e","color3":"#ffd204","color4":"#009ddc","color5":"#98005d","color6":"#85cebc","color7":"#d9d8d8","color8":"#737171","color9":"#ee2e24","color10":"#00853e","color11":"#ffd204","color12":"#009ddc","color13":"#98005d","color14":"#85cebc","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-twilight.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-twilight.json new file mode 100644 index 00000000..68ca2ad6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-twilight.json @@ -0,0 +1 @@ +{"special":{"background":"#1e1e1e","foreground":"#a7a7a7","cursor":"#a7a7a7"},"colors":{"color0":"#1e1e1e","color1":"#cf6a4c","color2":"#8f9d6a","color3":"#f9ee98","color4":"#7587a6","color5":"#9b859d","color6":"#afc4db","color7":"#a7a7a7","color8":"#5f5a60","color9":"#cf6a4c","color10":"#8f9d6a","color11":"#f9ee98","color12":"#7587a6","color13":"#9b859d","color14":"#afc4db","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-unikitty.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-unikitty.json new file mode 100644 index 00000000..28f4a483 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-unikitty.json @@ -0,0 +1 @@ +{"special":{"background":"#2e2a31","foreground":"#bcbabe","cursor":"#bcbabe"},"colors":{"color0":"#2e2a31","color1":"#d8137f","color2":"#17ad98","color3":"#dc8a0e","color4":"#796af5","color5":"#bb60ea","color6":"#149bda","color7":"#bcbabe","color8":"#838085","color9":"#d8137f","color10":"#17ad98","color11":"#dc8a0e","color12":"#796af5","color13":"#bb60ea","color14":"#149bda","color15":"#f5f4f7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-woodland.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-woodland.json new file mode 100644 index 00000000..e1e200c5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-woodland.json @@ -0,0 +1 @@ +{"special":{"background":"#231e18","foreground":"#cabcb1","cursor":"#cabcb1"},"colors":{"color0":"#231e18","color1":"#d35c5c","color2":"#b7ba53","color3":"#e0ac16","color4":"#88a4d3","color5":"#bb90e2","color6":"#6eb958","color7":"#cabcb1","color8":"#9d8b70","color9":"#d35c5c","color10":"#b7ba53","color11":"#e0ac16","color12":"#88a4d3","color13":"#bb90e2","color14":"#6eb958","color15":"#e4d4c8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-xcode-dusk.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-xcode-dusk.json new file mode 100644 index 00000000..54794ea2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-xcode-dusk.json @@ -0,0 +1 @@ +{"special":{"background":"#282B35","foreground":"#939599","cursor":"#939599"},"colors":{"color0":"#282B35","color1":"#B21889","color2":"#DF0002","color3":"#438288","color4":"#790EAD","color5":"#B21889","color6":"#00A0BE","color7":"#939599","color8":"#686A71","color9":"#B21889","color10":"#DF0002","color11":"#438288","color12":"#790EAD","color13":"#B21889","color14":"#00A0BE","color15":"#BEBFC2"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-zenburn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-zenburn.json new file mode 100644 index 00000000..2a81374b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16-zenburn.json @@ -0,0 +1 @@ +{"special":{"background":"#3f3f3f","foreground":"#dcdccc","cursor":"#dcdccc"},"colors":{"color0":"#3f3f3f","color1":"#dca3a3","color2":"#5f7f5f","color3":"#e0cf9f","color4":"#7cb8bb","color5":"#dc8cc3","color6":"#93e0e3","color7":"#dcdccc","color8":"#4f4f4f","color9":"#dca3a3","color10":"#5f7f5f","color11":"#e0cf9f","color12":"#7cb8bb","color13":"#dc8cc3","color14":"#93e0e3","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16tooth.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16tooth.json new file mode 100644 index 00000000..4da83d34 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/base16tooth.json @@ -0,0 +1 @@ +{"special":{"background":"#1D2021","foreground":"#A89984","cursor":"#A89984"},"colors":{"color0":"#1D2021","color1":"#FB543F","color2":"#95C085","color3":"#FAC03B","color4":"#0D6678","color5":"#8F4673","color6":"#8BA59B","color7":"#A89984","color8":"#665C54","color9":"#FB543F","color10":"#95C085","color11":"#FAC03B","color12":"#0D6678","color13":"#8F4673","color14":"#8BA59B","color15":"#FDF4C1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/darktooth.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/darktooth.json new file mode 100644 index 00000000..c24ca83e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/darktooth.json @@ -0,0 +1 @@ +{"special":{"background":"#1d2021","foreground":"#a89984","cursor":"#fb543f"},"colors":{"color0":"#1d2021","color1":"#fb543f","color2":"#95c085","color3":"#fac03b","color4":"#0d6678","color5":"#8f4673","color6":"#8ba59b","color7":"#a89984","color8":"#665c54","color9":"#fb543f","color10":"#95c085","color11":"#fac03b","color12":"#0d6678","color13":"#8f4673","color14":"#8ba59b","color15":"#fdf4c1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-5725.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-5725.json new file mode 100644 index 00000000..136a6bf1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-5725.json @@ -0,0 +1 @@ +{"special":{"background":"#353234","foreground":"#c29f6f","cursor":"#363334"},"colors":{"color0":"#353234","color1":"#97544d","color2":"#97a293","color3":"#c29f6f","color4":"#5e606c","color5":"#7a6054","color6":"#78746c","color7":"#c3c1b8","color7":"#c3c1b8","color8":"#5c575b","color9":"#97544d","color10":"#97a293","color11":"#c29f6f","color12":"#5e606c","color13":"#7a6054","color14":"#78746c","color15":"#c3c1b8","color15":"#c3c1b8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-amiox.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-amiox.json new file mode 100644 index 00000000..a35afc13 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-amiox.json @@ -0,0 +1 @@ +{"special":{"background":"#262020","foreground":"#aa9a71","cursor":"#b1a89c"},"colors":{"color0":"#262020","color1":"#925633","color2":"#55634f","color3":"#aa9a71","color4":"#5e6676","color5":"#57464d","color6":"#47676e","color7":"#b1a89c","color7":"#b1a89c","color8":"#514c4c","color9":"#925633","color10":"#55634f","color11":"#aa9a71","color12":"#5e6676","color13":"#57464d","color14":"#47676e","color15":"#b1a89c","color15":"#c8c1b9"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bark.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bark.json new file mode 100644 index 00000000..1dd332ec --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bark.json @@ -0,0 +1 @@ +{"special":{"background":"#30272b","foreground":"#978341","cursor":"#bcb8ba"},"colors":{"color0":"#30272b","color1":"#925633","color2":"#697234","color3":"#978341","color4":"#5e6676","color5":"#694e63","color6":"#47676e","color7":"#bcb8ba","color7":"#bcb8ba","color8":"#443c40","color9":"#925633","color10":"#697234","color11":"#978341","color12":"#5e6676","color13":"#694e63","color14":"#47676e","color15":"#bcb8ba","color15":"#bcb8ba"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blend.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blend.json new file mode 100644 index 00000000..e863b33f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blend.json @@ -0,0 +1 @@ +{"special":{"background":"#272725","foreground":"#bc9f67","cursor":"#282826"},"colors":{"color0":"#272725","color1":"#7d5151","color2":"#959c4f","color3":"#a78749","color4":"#455563","color5":"#9f908d","color6":"#4a5e5b","color7":"#f2f2f2","color7":"#f2f2f2","color8":"#4f4f4b","color9":"#7d5151","color10":"#959c4f","color11":"#a78749","color12":"#455563","color13":"#9f908d","color14":"#4a5e5b","color15":"#f2f2f2","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blok.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blok.json new file mode 100644 index 00000000..de2d386c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blok.json @@ -0,0 +1 @@ +{"special":{"background":"#2c2a2b","foreground":"#baad8a","cursor":"#bab9ba"},"colors":{"color0":"#2c2a2b","color1":"#a67979","color2":"#809f7b","color3":"#baad8a","color4":"#6d7575","color5":"#7d6969","color6":"#7b9899","color7":"#bab9ba","color7":"#bab9ba","color8":"#545253","color9":"#a67979","color10":"#809f7b","color11":"#baad8a","color12":"#6d7575","color13":"#7d6969","color14":"#7b9899","color15":"#bab9ba","color15":"#bab9ba"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bluetype.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bluetype.json new file mode 100644 index 00000000..6e16cafb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bluetype.json @@ -0,0 +1 @@ +{"special":{"background":"#272a2a","foreground":"#80807e","cursor":"#eaeaed"},"colors":{"color0":"#272a2a","color1":"#b05f5f","color2":"#b05f5f","color3":"#88aa55","color4":"#88aa55","color5":"#ccb05f","color6":"#ccb05f","color7":"#556973","color7":"#556973","color8":"#484c4e","color9":"#b05f5f","color10":"#b05f5f","color11":"#88aa55","color12":"#88aa55","color13":"#ccb05f","color14":"#ccb05f","color15":"#556973","color15":"#f6f7f8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blumune.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blumune.json new file mode 100644 index 00000000..acf973a7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-blumune.json @@ -0,0 +1 @@ +{"special":{"background":"#1c1f23","foreground":"#7e6b5f","cursor":"#202428"},"colors":{"color0":"#1c1f23","color1":"#234640","color2":"#555552","color3":"#7e6b5f","color4":"#384758","color5":"#444d4d","color6":"#415459","color7":"#ccc7bf","color7":"#ccc7bf","color8":"#33383f","color9":"#234640","color10":"#555552","color11":"#7e6b5f","color12":"#384758","color13":"#444d4d","color14":"#415459","color15":"#ccc7bf","color15":"#e3e0db"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-book.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-book.json new file mode 100644 index 00000000..d0542254 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-book.json @@ -0,0 +1 @@ +{"special":{"background":"#2b2b28","foreground":"#937b5a","cursor":"#2c2c29"},"colors":{"color0":"#2b2b28","color1":"#993f3c","color2":"#78855e","color3":"#937b5a","color4":"#415265","color5":"#885458","color6":"#646666","color7":"#c4c3c0","color7":"#c4c3c0","color8":"#c4c3c0","color9":"#993f3c","color10":"#78855e","color11":"#937b5a","color12":"#415265","color13":"#885458","color14":"#646666","color15":"#c4c3c0","color15":"#c4c3c0"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-branch.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-branch.json new file mode 100644 index 00000000..bf4e6c0d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-branch.json @@ -0,0 +1 @@ +{"special":{"background":"#32221a","foreground":"#d29b5a","cursor":"#cfc1a9"},"colors":{"color0":"#32221a","color1":"#c2562d","color2":"#96a65e","color3":"#d29b5a","color4":"#3b8e8c","color5":"#c47e5b","color6":"#639a90","color7":"#cfc1a9","color7":"#cfc1a9","color8":"#564a45","color9":"#c2562d","color10":"#96a65e","color11":"#d29b5a","color12":"#3b8e8c","color13":"#c47e5b","color14":"#639a90","color15":"#cfc1a9","color15":"#cfc1a9"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-brownstone.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-brownstone.json new file mode 100644 index 00000000..5a871537 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-brownstone.json @@ -0,0 +1 @@ +{"special":{"background":"#272825","foreground":"#7e744d","cursor":"#282926"},"colors":{"color0":"#272825","color1":"#674839","color2":"#6e794f","color3":"#7e744d","color4":"#3b474e","color5":"#554c41","color6":"#495355","color7":"#b0b0af","color7":"#b0b0af","color8":"#b0b0af","color9":"#674839","color10":"#6e794f","color11":"#7e744d","color12":"#3b474e","color13":"#554c41","color14":"#495355","color15":"#b0b0af","color15":"#c7c7c7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bulb.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bulb.json new file mode 100644 index 00000000..fba6e235 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-bulb.json @@ -0,0 +1 @@ +{"special":{"background":"#2c292b","foreground":"#c8a168","cursor":"#312e30"},"colors":{"color0":"#2c292b","color1":"#ab6d4e","color2":"#88885d","color3":"#c8a168","color4":"#45626e","color5":"#7c5545","color6":"#456e66","color7":"#c3b495","color7":"#c3b495","color8":"#c3b495","color9":"#ab6d4e","color10":"#88885d","color11":"#c8a168","color12":"#45626e","color13":"#7c5545","color14":"#456e66","color15":"#c3b495","color15":"#c3b495"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-chaires.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-chaires.json new file mode 100644 index 00000000..915c1c9b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-chaires.json @@ -0,0 +1 @@ +{"special":{"background":"#383844","foreground":"#cba264","cursor":"#cdc5b7"},"colors":{"color0":"#383844","color1":"#a7664a","color2":"#6e8c6e","color3":"#cba264","color4":"#535f6b","color5":"#775a62","color6":"#576e68","color7":"#cdc5b7","color7":"#cdc5b7","color8":"#4f4f60","color9":"#a7664a","color10":"#6e8c6e","color11":"#cba264","color12":"#535f6b","color13":"#775a62","color14":"#576e68","color15":"#cdc5b7","color15":"#cdc5b7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-coco.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-coco.json new file mode 100644 index 00000000..13b4cee4 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-coco.json @@ -0,0 +1 @@ +{"special":{"background":"#1f1d1d","foreground":"#856237","cursor":"#ccbaad"},"colors":{"color0":"#1f1d1d","color1":"#6b4747","color2":"#8d7138","color3":"#856237","color4":"#3c3c49","color5":"#3c342e","color6":"#5d5a4b","color7":"#ccbaad","color7":"#ccbaad","color8":"#4a4a4a","color9":"#6b4747","color10":"#8d7138","color11":"#856237","color12":"#3c3c49","color13":"#3c342e","color14":"#5d5a4b","color15":"#ccbaad","color15":"#eae2dc"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-corduroy.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-corduroy.json new file mode 100644 index 00000000..95188f18 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-corduroy.json @@ -0,0 +1 @@ +{"special":{"background":"#27201d","foreground":"#987f4b","cursor":"#b7afa4"},"colors":{"color0":"#27201d","color1":"#663c23","color2":"#5c5933","color3":"#987f4b","color4":"#4b484b","color5":"#9c8065","color6":"#685a50","color7":"#b7afa4","color7":"#b7afa4","color8":"#3c3633","color9":"#663c23","color10":"#5c5933","color11":"#987f4b","color12":"#4b484b","color13":"#9c8065","color14":"#685a50","color15":"#b7afa4","color15":"#b7afa4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-depth.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-depth.json new file mode 100644 index 00000000..7bc48502 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-depth.json @@ -0,0 +1 @@ +{"special":{"background":"#2c2833","foreground":"#b7a16c","cursor":"#dbd7b8"},"colors":{"color0":"#2c2833","color1":"#bf6257","color2":"#82a37c","color3":"#b7a16c","color4":"#6d6a80","color5":"#825969","color6":"#938e8f","color7":"#dbd7b8","color7":"#dbd7b8","color8":"#4e4955","color9":"#bf6257","color10":"#82a37c","color11":"#b7a16c","color12":"#6d6a80","color13":"#825969","color14":"#938e8f","color15":"#dbd7b8","color15":"#dbd7b8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-designr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-designr.json new file mode 100644 index 00000000..d82100a1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-designr.json @@ -0,0 +1 @@ +{"special":{"background":"#242e32","foreground":"#ac8d6e","cursor":"#c4c4b5"},"colors":{"color0":"#242e32","color1":"#a66959","color2":"#769070","color3":"#ac8d6e","color4":"#607a86","color5":"#8a757e","color6":"#60867f","color7":"#c4c4b5","color7":"#c4c4b5","color8":"#35444b","color9":"#a66959","color10":"#769070","color11":"#ac8d6e","color12":"#607a86","color13":"#8a757e","color14":"#60867f","color15":"#c4c4b5","color15":"#c4c4b5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-diner.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-diner.json new file mode 100644 index 00000000..245edcba --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-diner.json @@ -0,0 +1 @@ +{"special":{"background":"#2e3738","foreground":"#b8af97","cursor":"#aba599"},"colors":{"color0":"#2e3738","color1":"#9c7f5d","color2":"#8e958f","color3":"#b8af97","color4":"#828882","color5":"#bb9a7f","color6":"#9daba2","color7":"#aba599","color7":"#aba599","color8":"#485152","color9":"#9c7f5d","color10":"#8e958f","color11":"#b8af97","color12":"#828882","color13":"#bb9a7f","color14":"#9daba2","color15":"#aba599","color15":"#aba599"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-escen.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-escen.json new file mode 100644 index 00000000..74bfa306 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-escen.json @@ -0,0 +1 @@ +{"special":{"background":"#1c2319","foreground":"#be9e61","cursor":"#bcbebb"},"colors":{"color0":"#1c2319","color1":"#c14d38","color2":"#a0ce52","color3":"#be9e61","color4":"#4c7e89","color5":"#814d61","color6":"#79a69d","color7":"#bcbebb","color7":"#bcbebb","color8":"#35422f","color9":"#c14d38","color10":"#a0ce52","color11":"#be9e61","color12":"#4c7e89","color13":"#814d61","color14":"#79a69d","color15":"#bcbebb","color15":"#bcbebb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fendr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fendr.json new file mode 100644 index 00000000..b1d6f282 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fendr.json @@ -0,0 +1 @@ +{"special":{"background":"#262c1b","foreground":"#d6caaa","cursor":"#c1c5bd"},"colors":{"color0":"#262c1b","color1":"#7f5545","color2":"#677c54","color3":"#bba772","color4":"#6e6a5b","color5":"#92887e","color6":"#7c7562","color7":"#cccdbd","color7":"#cccdbd","color8":"#474c3e","color9":"#7f5545","color10":"#677c54","color11":"#bba772","color12":"#6e6a5b","color13":"#92887e","color14":"#7c7562","color15":"#cccdbd","color15":"#e0e1d7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-flapr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-flapr.json new file mode 100644 index 00000000..1cb3b322 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-flapr.json @@ -0,0 +1 @@ +{"special":{"background":"#2f2832","foreground":"#9a8e80","cursor":"#302833"},"colors":{"color0":"#2f2832","color1":"#885d50","color2":"#747965","color3":"#9a8e80","color4":"#4a4e5a","color5":"#76675b","color6":"#59555c","color7":"#bcb5b5","color7":"#bcb5b5","color8":"#4a3f4e","color9":"#885d50","color10":"#747965","color11":"#9a8e80","color12":"#4a4e5a","color13":"#76675b","color14":"#59555c","color15":"#bcb5b5","color15":"#dddada"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-forst.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-forst.json new file mode 100644 index 00000000..f681485c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-forst.json @@ -0,0 +1 @@ +{"special":{"background":"#161f14","foreground":"#806420","cursor":"#172015"},"colors":{"color0":"#161f14","color1":"#744425","color2":"#50703f","color3":"#806420","color4":"#56535d","color5":"#71532f","color6":"#45605d","color7":"#aca173","color7":"#aca173","color8":"#2d352b","color9":"#744425","color10":"#50703f","color11":"#806420","color12":"#56535d","color13":"#71532f","color14":"#45605d","color15":"#aca173","color15":"#aca173"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fury.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fury.json new file mode 100644 index 00000000..7a4e94d6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-fury.json @@ -0,0 +1 @@ +{"special":{"background":"#1e1e1e","foreground":"#4c6640","cursor":"#9e9e91"},"colors":{"color0":"#1e1e1e","color1":"#98442f","color2":"#9d8554","color3":"#4c6640","color4":"#4c596b","color5":"#7b6072","color6":"#385853","color7":"#9e9e91","color7":"#9e9e91","color8":"#363636","color9":"#98442f","color10":"#9d8554","color11":"#4c6640","color12":"#4c596b","color13":"#7b6072","color14":"#385853","color15":"#9e9e91","color15":"#9e9e91"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-harbing.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-harbing.json new file mode 100644 index 00000000..1cfe34e8 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-harbing.json @@ -0,0 +1 @@ +{"special":{"background":"#322b26","foreground":"#d7b18a","cursor":"#c8b49d"},"colors":{"color0":"#322b26","color1":"#bd6151","color2":"#6e9383","color3":"#d7b18a","color4":"#8a8f94","color5":"#bd9a81","color6":"#91a1a5","color7":"#c8b49d","color7":"#c8b49d","color8":"#63554c","color9":"#bd6151","color10":"#6e9383","color11":"#d7b18a","color12":"#8a8f94","color13":"#bd9a81","color14":"#91a1a5","color15":"#c8b49d","color15":"#c8b49d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-kit.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-kit.json new file mode 100644 index 00000000..bf60d7ee --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-kit.json @@ -0,0 +1 @@ +{"special":{"background":"#272733","foreground":"#dabe72","cursor":"#cac5b7"},"colors":{"color0":"#272733","color1":"#d65f2f","color2":"#aabf7f","color3":"#dabe72","color4":"#5e7e9b","color5":"#bf6c68","color6":"#5a7273","color7":"#cac5b7","color7":"#cac5b7","color8":"#48485e","color9":"#d65f2f","color10":"#aabf7f","color11":"#dabe72","color12":"#5e7e9b","color13":"#bf6c68","color14":"#5a7273","color15":"#cac5b7","color15":"#d5d1c6"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-leaf.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-leaf.json new file mode 100644 index 00000000..11bbe6d1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-leaf.json @@ -0,0 +1 @@ +{"special":{"background":"#303728","foreground":"#d4b06c","cursor":"#b9bcb7"},"colors":{"color0":"#303728","color1":"#d06e5c","color2":"#abbb52","color3":"#d4b06c","color4":"#4c7e89","color5":"#814d61","color6":"#79a69d","color7":"#b9bcb7","color7":"#b9bcb7","color8":"#505847","color9":"#d06e5c","color10":"#abbb52","color11":"#d4b06c","color12":"#4c7e89","color13":"#814d61","color14":"#79a69d","color15":"#b9bcb7","color15":"#b9bcb7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-link.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-link.json new file mode 100644 index 00000000..0135693a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-link.json @@ -0,0 +1 @@ +{"special":{"background":"#222222","foreground":"#c5c5b2","cursor":"#242424"},"colors":{"color0":"#222222","color1":"#4d4d4d","color2":"#8a8c84","color3":"#c5c5b2","color4":"#5d5d5d","color5":"#707070","color6":"#898989","color7":"#c2c2c2","color7":"#c2c2c2","color8":"#484848","color9":"#4d4d4d","color10":"#8a8c84","color11":"#c5c5b2","color12":"#5d5d5d","color13":"#707070","color14":"#898989","color15":"#c2c2c2","color15":"#f1f1f1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-mattd.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-mattd.json new file mode 100644 index 00000000..92897c32 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-mattd.json @@ -0,0 +1 @@ +{"special":{"background":"#20201f","foreground":"#799c6a","cursor":"#b0b0a2"},"colors":{"color0":"#20201f","color1":"#996140","color2":"#9d8554","color3":"#799c6a","color4":"#5f656a","color5":"#7b6064","color6":"#566e6b","color7":"#b0b0a2","color7":"#b0b0a2","color8":"#3a3a38","color9":"#996140","color10":"#9d8554","color11":"#799c6a","color12":"#5f656a","color13":"#7b6064","color14":"#566e6b","color15":"#b0b0a2","color15":"#d3d3cb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-novmbr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-novmbr.json new file mode 100644 index 00000000..f688df0e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-novmbr.json @@ -0,0 +1 @@ +{"special":{"background":"#241d1a","foreground":"#cca75f","cursor":"#251e1b"},"colors":{"color0":"#241d1a","color1":"#9f6434","color2":"#9dac5f","color3":"#cca75f","color4":"#2f7d7c","color5":"#b5896e","color6":"#52877f","color7":"#c7b8ac","color7":"#c7b8ac","color8":"#50413a","color9":"#9f6434","color10":"#9dac5f","color11":"#cca75f","color12":"#2f7d7c","color13":"#b5896e","color14":"#52877f","color15":"#c7b8ac","color15":"#c7b8ac"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-owl.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-owl.json new file mode 100644 index 00000000..b78631fa --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-owl.json @@ -0,0 +1 @@ +{"special":{"background":"#2f2b2c","foreground":"#cacaca","cursor":"#dedede"},"colors":{"color0":"#2f2b2c","color1":"#5a5a5a","color2":"#989898","color3":"#cacaca","color4":"#656565","color5":"#b1b1b1","color6":"#7f7f7f","color7":"#dedede","color7":"#dedede","color8":"#504c4e","color9":"#5a5a5a","color10":"#989898","color11":"#cacaca","color12":"#656565","color13":"#b1b1b1","color14":"#7f7f7f","color15":"#dedede","color15":"#FFFFFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-paints.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-paints.json new file mode 100644 index 00000000..3a530631 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-paints.json @@ -0,0 +1 @@ +{"special":{"background":"#2f2a2a","foreground":"#b2885d","cursor":"#332e2e"},"colors":{"color0":"#2f2a2a","color1":"#854340","color2":"#668c71","color3":"#b2885d","color4":"#41647b","color5":"#915556","color6":"#477578","color7":"#c9c8c8","color7":"#c9c8c8","color8":"#c9c8c8","color9":"#854340","color10":"#668c71","color11":"#b2885d","color12":"#41647b","color13":"#915556","color14":"#477578","color15":"#c9c8c8","color15":"#c9c8c8"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-parkd.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-parkd.json new file mode 100644 index 00000000..bbebdd30 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-parkd.json @@ -0,0 +1 @@ +{"special":{"background":"#2b2428","foreground":"#b29d6a","cursor":"#c2b7aa"},"colors":{"color0":"#2b2428","color1":"#89453c","color2":"#59713f","color3":"#b29d6a","color4":"#464e59","color5":"#614e44","color6":"#4f545b","color7":"#c2b7aa","color7":"#c2b7aa","color8":"#413c40","color9":"#89453c","color10":"#59713f","color11":"#b29d6a","color12":"#464e59","color13":"#614e44","color14":"#4f545b","color15":"#c2b7aa","color15":"#c2b7aa"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-pastely.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-pastely.json new file mode 100644 index 00000000..d2850d4b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-pastely.json @@ -0,0 +1 @@ +{"special":{"background":"#2c2c2e","foreground":"#87835d","cursor":"#2e2e30"},"colors":{"color0":"#2c2c2e","color1":"#645446","color2":"#59674f","color3":"#87835d","color4":"#4d554f","color5":"#70614f","color6":"#666755","color7":"#aba786","color7":"#aba786","color8":"#aba786","color9":"#645446","color10":"#59674f","color11":"#87835d","color12":"#4d554f","color13":"#70614f","color14":"#666755","color15":"#aba786","color15":"#c4c1aa"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-petal.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-petal.json new file mode 100644 index 00000000..0b3ef0c9 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-petal.json @@ -0,0 +1 @@ +{"special":{"background":"#22211f","foreground":"#827834","cursor":"#252422"},"colors":{"color0":"#22211f","color1":"#785326","color2":"#516941","color3":"#827834","color4":"#42514f","color5":"#6a5632","color6":"#4e5d4d","color7":"#b4b399","color7":"#b4b399","color8":"#b4b399","color9":"#785326","color10":"#516941","color11":"#827834","color12":"#42514f","color13":"#6a5632","color14":"#4e5d4d","color15":"#b4b399","color15":"#c9c9b6"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-poly.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-poly.json new file mode 100644 index 00000000..48dcca3a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-poly.json @@ -0,0 +1 @@ +{"special":{"background":"#231c0d","foreground":"#aead5d","cursor":"#a5a39d"},"colors":{"color0":"#231c0d","color1":"#a47b3d","color2":"#7b9764","color3":"#aead5d","color4":"#628e8f","color5":"#ad9d52","color6":"#709681","color7":"#a5a39d","color7":"#a5a39d","color8":"#3f392a","color9":"#a47b3d","color10":"#7b9764","color11":"#aead5d","color12":"#628e8f","color13":"#ad9d52","color14":"#709681","color15":"#a5a39d","color15":"#a5a39d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-prevail.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-prevail.json new file mode 100644 index 00000000..4e0f2318 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-prevail.json @@ -0,0 +1 @@ +{"special":{"background":"#263139","foreground":"#dac99d","cursor":"#28343c"},"colors":{"color0":"#263139","color1":"#f36f62","color2":"#c5e19c","color3":"#ccb478","color4":"#4c7e89","color5":"#814d61","color6":"#79a69d","color7":"#c4c4b5","color7":"#c4c4b5","color8":"#455867","color9":"#f36f62","color10":"#c5e19c","color11":"#ccb478","color12":"#4c7e89","color13":"#814d61","color14":"#79a69d","color15":"#c4c4b5","color15":"#dbdbd1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-provrb.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-provrb.json new file mode 100644 index 00000000..5ccf8932 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-provrb.json @@ -0,0 +1 @@ +{"special":{"background":"#322f30","foreground":"#8d7766","cursor":"#353233"},"colors":{"color0":"#322f30","color1":"#654c51","color2":"#7f8281","color3":"#8d7766","color4":"#5b697e","color5":"#7b6b75","color6":"#7d8592","color7":"#c0bfbf","color7":"#c0bfbf","color8":"#c0bfbf","color9":"#654c51","color10":"#7f8281","color11":"#8d7766","color12":"#5b697e","color13":"#7b6b75","color14":"#7d8592","color15":"#c0bfbf","color15":"#dfdfdf"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-raild.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-raild.json new file mode 100644 index 00000000..d9e99d92 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-raild.json @@ -0,0 +1 @@ +{"special":{"background":"#282623","foreground":"#ad8b67","cursor":"#2b2825"},"colors":{"color0":"#282623","color1":"#935334","color2":"#66604d","color3":"#ad8b67","color4":"#504b44","color5":"#634737","color6":"#505349","color7":"#bcbba4","color7":"#bcbba4","color8":"#43403b","color9":"#935334","color10":"#66604d","color11":"#ad8b67","color12":"#504b44","color13":"#634737","color14":"#505349","color15":"#bcbba4","color15":"#dbdace"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-relax.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-relax.json new file mode 100644 index 00000000..ce881fcc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-relax.json @@ -0,0 +1 @@ +{"special":{"background":"#322835","foreground":"#b08960","cursor":"#332836"},"colors":{"color0":"#322835","color1":"#674f4a","color2":"#67786d","color3":"#b08960","color4":"#5e6d79","color5":"#7d6969","color6":"#6a7a76","color7":"#ccbfb3","color7":"#ccbfb3","color8":"#4b3f4e","color9":"#674f4a","color10":"#67786d","color11":"#b08960","color12":"#5e6d79","color13":"#7d6969","color14":"#6a7a76","color15":"#ccbfb3","color15":"#ccbfb3"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scag.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scag.json new file mode 100644 index 00000000..80068b85 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scag.json @@ -0,0 +1 @@ +{"special":{"background":"#252326","foreground":"#7a8648","cursor":"#c4bbb0"},"colors":{"color0":"#252326","color1":"#93503e","color2":"#9d8554","color3":"#7a8648","color4":"#5f656a","color5":"#7b6064","color6":"#566e6b","color7":"#c4bbb0","color7":"#c4bbb0","color8":"#413f43","color9":"#93503e","color10":"#9d8554","color11":"#7a8648","color12":"#5f656a","color13":"#7b6064","color14":"#566e6b","color15":"#c4bbb0","color15":"#c4bbb0"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scape.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scape.json new file mode 100644 index 00000000..87973c66 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-scape.json @@ -0,0 +1 @@ +{"special":{"background":"#282423","foreground":"#987f4b","cursor":"#b7afa4"},"colors":{"color0":"#282423","color1":"#925633","color2":"#757c60","color3":"#987f4b","color4":"#515962","color5":"#685054","color6":"#506168","color7":"#b7afa4","color7":"#b7afa4","color8":"#3f3d3c","color9":"#925633","color10":"#757c60","color11":"#987f4b","color12":"#515962","color13":"#685054","color14":"#506168","color15":"#b7afa4","color15":"#b7afa4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-shade.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-shade.json new file mode 100644 index 00000000..7b775065 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-shade.json @@ -0,0 +1 @@ +{"special":{"background":"#2c2c2c","foreground":"#d0c57a","cursor":"#ededb7"},"colors":{"color0":"#2c2c2c","color1":"#c77369","color2":"#93988a","color3":"#d0c57a","color4":"#747f89","color5":"#825969","color6":"#938e8f","color7":"#ddddb5","color7":"#ddddb5","color8":"#4e4e4e","color9":"#c77369","color10":"#93988a","color11":"#d0c57a","color12":"#747f89","color13":"#825969","color14":"#938e8f","color15":"#ddddb5","color15":"#ededb7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-simplicity.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-simplicity.json new file mode 100644 index 00000000..31d249eb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-simplicity.json @@ -0,0 +1 @@ +{"special":{"background":"#28282C","foreground":"#A18673","cursor":"#F3F3F3"},"colors":{"color0":"#28282C","color1":"#BF5C56","color2":"#BF5C56","color3":"#97B19C","color4":"#97B19C","color5":"#D7BD8A","color6":"#D7BD8A","color7":"#545F72","color7":"#545F72","color8":"#404047","color9":"#BF5C56","color10":"#BF5C56","color11":"#97B19C","color12":"#97B19C","color13":"#D7BD8A","color14":"#D7BD8A","color15":"#545F72","color15":"#F4F4F2"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-skigh.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-skigh.json new file mode 100644 index 00000000..b7938e99 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-skigh.json @@ -0,0 +1 @@ +{"special":{"background":"#252a32","foreground":"#b39580","cursor":"#272c34"},"colors":{"color0":"#252a32","color1":"#876058","color2":"#6f7f71","color3":"#b39580","color4":"#546780","color5":"#84787d","color6":"#556f86","color7":"#bab7b5","color7":"#bab7b5","color8":"#bab7b5","color9":"#876058","color10":"#6f7f71","color11":"#b39580","color12":"#546780","color13":"#84787d","color14":"#556f86","color15":"#bab7b5","color15":"#dfdedd"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-slate.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-slate.json new file mode 100644 index 00000000..9a9a4bb2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-slate.json @@ -0,0 +1 @@ +{"special":{"background":"#242a2b","foreground":"#8d8150","cursor":"#242b2c"},"colors":{"color0":"#242a2b","color1":"#674839","color2":"#6e794f","color3":"#8d8150","color4":"#3b474e","color5":"#554c41","color6":"#495355","color7":"#939381","color7":"#939381","color8":"#939381","color9":"#674839","color10":"#6e794f","color11":"#8d8150","color12":"#3b474e","color13":"#554c41","color14":"#495355","color15":"#939381","color15":"#abab9c"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-soundwave.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-soundwave.json new file mode 100644 index 00000000..e0f6637b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-soundwave.json @@ -0,0 +1 @@ +{"special":{"background":"#29231f","foreground":"#aa8f5f","cursor":"#bcb7aa"},"colors":{"color0":"#29231f","color1":"#675141","color2":"#625438","color3":"#aa8f5f","color4":"#6e6051","color5":"#514540","color6":"#5e4e3c","color7":"#bcb7aa","color7":"#bcb7aa","color8":"#514b49","color9":"#675141","color10":"#625438","color11":"#aa8f5f","color12":"#6e6051","color13":"#514540","color14":"#5e4e3c","color15":"#bcb7aa","color15":"#dedbd5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-spire.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-spire.json new file mode 100644 index 00000000..5f823ffc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-spire.json @@ -0,0 +1 @@ +{"special":{"background":"#262f33","foreground":"#948d65","cursor":"#b5b699"},"colors":{"color0":"#262f33","color1":"#804f4e","color2":"#68786c","color3":"#948d65","color4":"#47575f","color5":"#74636a","color6":"#526562","color7":"#b5b699","color7":"#b5b699","color8":"#464c50","color9":"#804f4e","color10":"#68786c","color11":"#948d65","color12":"#47575f","color13":"#74636a","color14":"#526562","color15":"#b5b699","color15":"#cbcbb7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sprout.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sprout.json new file mode 100644 index 00000000..560d9701 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sprout.json @@ -0,0 +1 @@ +{"special":{"background":"#2d3144","foreground":"#96915d","cursor":"#cfccbe"},"colors":{"color0":"#2d3144","color1":"#8d6d5c","color2":"#6d806d","color3":"#96915d","color4":"#68758d","color5":"#8a747b","color6":"#8d97a8","color7":"#cfccbe","color7":"#cfccbe","color8":"#525a69","color9":"#8d6d5c","color10":"#6d806d","color11":"#96915d","color12":"#68758d","color13":"#8a747b","color14":"#8d97a8","color15":"#cfccbe","color15":"#f0efeb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-squares.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-squares.json new file mode 100644 index 00000000..feab3211 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-squares.json @@ -0,0 +1 @@ +{"special":{"background":"#27201f","foreground":"#978341","cursor":"#bebcbc"},"colors":{"color0":"#27201f","color1":"#9b5208","color2":"#75922c","color3":"#978341","color4":"#5e6676","color5":"#824219","color6":"#4e7479","color7":"#bebcbc","color7":"#bebcbc","color8":"#3b3436","color9":"#9b5208","color10":"#75922c","color11":"#978341","color12":"#5e6676","color13":"#824219","color14":"#4e7479","color15":"#bebcbc","color15":"#bebcbc"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-stv.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-stv.json new file mode 100644 index 00000000..45678795 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-stv.json @@ -0,0 +1 @@ +{"special":{"background":"#2c373d","foreground":"#baad8a","cursor":"#c4c0bb"},"colors":{"color0":"#2c373d","color1":"#a67979","color2":"#809f7b","color3":"#baad8a","color4":"#6d7575","color5":"#8e7d79","color6":"#7b9899","color7":"#c4c0bb","color7":"#c4c0bb","color8":"#4d5459","color9":"#a67979","color10":"#809f7b","color11":"#baad8a","color12":"#6d7575","color13":"#8e7d79","color14":"#7b9899","color15":"#c4c0bb","color15":"#c4c0bb"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-subtle.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-subtle.json new file mode 100644 index 00000000..df48caac --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-subtle.json @@ -0,0 +1 @@ +{"special":{"background":"#2c2c35","foreground":"#6b925a","cursor":"#2d2d36"},"colors":{"color0":"#2c2c35","color1":"#b56550","color2":"#b79b58","color3":"#6b925a","color4":"#6e747b","color5":"#96787d","color6":"#7b8889","color7":"#b4ada4","color7":"#b4ada4","color8":"#45454d","color9":"#b56550","color10":"#b79b58","color11":"#6b925a","color12":"#6e747b","color13":"#96787d","color14":"#7b8889","color15":"#b4ada4","color15":"#b4ada4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sundr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sundr.json new file mode 100644 index 00000000..f400a74d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-sundr.json @@ -0,0 +1 @@ +{"special":{"background":"#2b2320","foreground":"#aa9375","cursor":"#2e2522"},"colors":{"color0":"#2b2320","color1":"#734948","color2":"#768157","color3":"#aa9375","color4":"#585b63","color5":"#6f5a56","color6":"#7d8486","color7":"#bab1a1","color7":"#bab1a1","color8":"#bab1a1","color9":"#734948","color10":"#768157","color11":"#aa9375","color12":"#585b63","color13":"#6f5a56","color14":"#7d8486","color15":"#bab1a1","color15":"#bab1a1"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-tealights.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-tealights.json new file mode 100644 index 00000000..2403348e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-tealights.json @@ -0,0 +1 @@ +{"special":{"background":"#25231b","foreground":"#988871","cursor":"#26241c"},"colors":{"color0":"#25231b","color1":"#8e2f34","color2":"#55654a","color3":"#988871","color4":"#848f89","color5":"#9f8c7c","color6":"#9cb4a6","color7":"#c4c1b0","color7":"#c4c1b0","color8":"#423f31","color9":"#8e2f34","color10":"#55654a","color11":"#988871","color12":"#848f89","color13":"#9f8c7c","color14":"#9cb4a6","color15":"#c4c1b0","color15":"#d8d4c5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-traffic.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-traffic.json new file mode 100644 index 00000000..9c03c8d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-traffic.json @@ -0,0 +1 @@ +{"special":{"background":"#272c30","foreground":"#c79e84","cursor":"#cfb9a8"},"colors":{"color0":"#272c30","color1":"#934e46","color2":"#637268","color3":"#c79e84","color4":"#515e67","color5":"#715f5e","color6":"#5c6f7d","color7":"#cfb9a8","color7":"#cfb9a8","color8":"#414a51","color9":"#934e46","color10":"#637268","color11":"#c79e84","color12":"#515e67","color13":"#715f5e","color14":"#5c6f7d","color15":"#cfb9a8","color15":"#ddcec2"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-transposet.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-transposet.json new file mode 100644 index 00000000..87400115 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-transposet.json @@ -0,0 +1 @@ +{"special":{"background":"#2a2725","foreground":"#bdac8c","cursor":"#2b2927"},"colors":{"color0":"#2a2725","color1":"#8e6f64","color2":"#849385","color3":"#bdac8c","color4":"#4c5467","color5":"#757580","color6":"#64697f","color7":"#b8b2a7","color7":"#b8b2a7","color8":"#474543","color9":"#8e6f64","color10":"#849385","color11":"#bdac8c","color12":"#4c5467","color13":"#757580","color14":"#64697f","color15":"#b8b2a7","color15":"#b8b2a7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-urban.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-urban.json new file mode 100644 index 00000000..4ec21019 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-urban.json @@ -0,0 +1 @@ +{"special":{"background":"#312e39","foreground":"#ae835a","cursor":"#33303b"},"colors":{"color0":"#312e39","color1":"#87404f","color2":"#74934e","color3":"#ae835a","color4":"#615772","color5":"#783e57","color6":"#554757","color7":"#c0a79a","color7":"#c0a79a","color8":"#4f4b58","color9":"#87404f","color10":"#74934e","color11":"#ae835a","color12":"#615772","color13":"#783e57","color14":"#554757","color15":"#c0a79a","color15":"#c0a79a"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-vans.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-vans.json new file mode 100644 index 00000000..d287a213 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-vans.json @@ -0,0 +1 @@ +{"special":{"background":"#2b2c33","foreground":"#e8dfcd","cursor":"#303139"},"colors":{"color0":"#2b2c33","color1":"#b16c7f","color2":"#92ab75","color3":"#bdab77","color4":"#485476","color5":"#746081","color6":"#636f7d","color7":"#d9c1a9","color7":"#d9c1a9","color8":"#d9c1a9","color9":"#b16c7f","color10":"#92ab75","color11":"#bdab77","color12":"#485476","color13":"#746081","color14":"#636f7d","color15":"#d9c1a9","color15":"#e9dbce"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-victory.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-victory.json new file mode 100644 index 00000000..0a2c7f15 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-victory.json @@ -0,0 +1 @@ +{"special":{"background":"#2d2d33","foreground":"#a29474","cursor":"#303036"},"colors":{"color0":"#2d2d33","color1":"#9c6647","color2":"#708684","color3":"#a29474","color4":"#697284","color5":"#796a70","color6":"#47676e","color7":"#c4c4b5","color7":"#c4c4b5","color8":"#44444a","color9":"#9c6647","color10":"#708684","color11":"#a29474","color12":"#697284","color13":"#796a70","color14":"#47676e","color15":"#c4c4b5","color15":"#c4c4b5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-view.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-view.json new file mode 100644 index 00000000..0e5c7b89 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-view.json @@ -0,0 +1 @@ +{"special":{"background":"#2a2d34","foreground":"#86733b","cursor":"#2e3239"},"colors":{"color0":"#2a2d34","color1":"#a2462e","color2":"#5e713d","color3":"#86733b","color4":"#394c5d","color5":"#855646","color6":"#6e727d","color7":"#cababa","color7":"#cababa","color8":"#414550","color9":"#a2462e","color10":"#5e713d","color11":"#86733b","color12":"#394c5d","color13":"#855646","color14":"#6e727d","color15":"#cababa","color15":"#cababa"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-wintry.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-wintry.json new file mode 100644 index 00000000..ea57a717 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/dkeg-wintry.json @@ -0,0 +1 @@ +{"special":{"background":"#37273a","foreground":"#b3a67d","cursor":"#c3bec3"},"colors":{"color0":"#37273a","color1":"#9c595c","color2":"#8ba07a","color3":"#b3a67d","color4":"#7B6677","color5":"#83466D","color6":"#899079","color7":"#c3bec3","color7":"#c3bec3","color8":"#5e5261","color9":"#9c595c","color10":"#8ba07a","color11":"#b3a67d","color12":"#7B6677","color13":"#83466D","color14":"#899079","color15":"#c3bec3","color15":"#c3bec3"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/gruvbox.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/gruvbox.json new file mode 100644 index 00000000..3b7e3a54 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/gruvbox.json @@ -0,0 +1 @@ +{"special":{"background":"#282828","foreground":"#a89984","cursor":"#ebdbb2"},"colors":{"color0":"#282828","color1":"#cc241d","color2":"#d79921","color3":"#b58900","color4":"#458588","color5":"#b16286","color6":"#689d6a","color7":"#a89984","color8":"#928374","color9":"#cc241d","color10":"#d79921","color11":"#b58900","color12":"#458588","color13":"#b16286","color14":"#689d6a","color15":"#a89984"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/hybrid-material.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/hybrid-material.json new file mode 100644 index 00000000..9e598559 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/hybrid-material.json @@ -0,0 +1 @@ +{"special":{"background":"#263238","foreground":"#ffffff","cursor":"#cc6666"},"colors":{"color0":"#263238","color1":"#cc6666","color2":"#f0c674","color3":"#b5bd68","color4":"#8abeb7","color5":"#81a2be","color6":"#b294bb","color7":"#ffffff","color8":"#707880","color9":"#cc6666","color10":"#f0c674","color11":"#b5bd68","color12":"#8abeb7","color13":"#81a2be","color14":"#b294bb","color15":"#ffffff"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/monokai.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/monokai.json new file mode 100644 index 00000000..5219d849 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/monokai.json @@ -0,0 +1 @@ +{"special":{"background":"#272822","foreground":"#f8f8f2","cursor":"#f92672"},"colors":{"color0":"#272822","color1":"#f92672","color2":"#a6e22e","color3":"#f4bf75","color4":"#66d9ef","color5":"#ae81ff","color6":"#a1efe4","color7":"#f8f8f2","color8":"#75715e","color9":"#f92672","color10":"#a6e22e","color11":"#f4bf75","color12":"#66d9ef","color13":"#ae81ff","color14":"#a1efe4","color15":"#f9f8f5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-astromouse.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-astromouse.json new file mode 100644 index 00000000..2fe5f53a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-astromouse.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1c1c1c","color1":"#d770af","color2":"#9acc79","color3":"#d0d26b","color4":"#77b6c5","color5":"#a488d9","color6":"#7fcab3","color7":"#8d8d8d","color8":"#3d3a3a","color9":"#d770af","color10":"#9acc79","color11":"#d0d26b","color12":"#77b6c5","color13":"#a488d9","color14":"#7fcab3","color15":"#8d8d8d","color16":"#3d3a3a","color17":"#d28abf"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#d28abf"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-belge.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-belge.json new file mode 100644 index 00000000..2be72e2b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-belge.json @@ -0,0 +1 @@ +{"colors":{"color0":"#252525","color1":"#ef6769","color2":"#a6e22e","color3":"#fd971f","color4":"#6495ed","color5":"#deb887","color6":"#b0c4de","color7":"#dbdcdc","color8":"#454545","color9":"#ef6769","color10":"#a6e22e","color11":"#fd971f","color12":"#6495ed","color13":"#deb887","color14":"#b0c4de","color15":"#dbdcdc","color16":"#454545","color17":"#fc7ca5"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#fc7ca5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-bitmute.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-bitmute.json new file mode 100644 index 00000000..d61ca9cd --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-bitmute.json @@ -0,0 +1 @@ +{"colors":{"color0":"#282828","color1":"#b76969","color2":"#719d72","color3":"#909858","color4":"#68668f","color5":"#966894","color6":"#688891","color7":"#8e8e8e","color8":"#494949","color9":"#b76969","color10":"#719d72","color11":"#909858","color12":"#68668f","color13":"#966894","color14":"#688891","color15":"#8e8e8e","color16":"#494949","color17":"#b87e7e"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#b87e7e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-cloud.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-cloud.json new file mode 100644 index 00000000..3e773f8e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-cloud.json @@ -0,0 +1 @@ +{"colors":{"color0":"#222827","color1":"#d5a8e3","color2":"#9c75dd","color3":"#9898ae","color4":"#654a96","color5":"#625566","color6":"#a9d1df","color7":"#e6ebe5","color8":"#5d6f74","color9":"#d5a8e3","color10":"#9c75dd","color11":"#9898ae","color12":"#654a96","color13":"#625566","color14":"#a9d1df","color15":"#e6ebe5","color16":"#5d6f74","color17":"#cd749c"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#cd749c"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-colorfulcolors.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-colorfulcolors.json new file mode 100644 index 00000000..3d76ccdb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-colorfulcolors.json @@ -0,0 +1 @@ +{"colors":{"color0":"#151515","color1":"#ff8eaf","color2":"#a6e25f","color3":"#f8e578","color4":"#a6e2f0","color5":"#e85b92","color6":"#5f868f","color7":"#d5f1f2","color8":"#696969","color9":"#ff8eaf","color10":"#a6e25f","color11":"#f8e578","color12":"#a6e2f0","color13":"#e85b92","color14":"#5f868f","color15":"#d5f1f2","color16":"#696969","color17":"#ed4c7a"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ed4c7a"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dawn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dawn.json new file mode 100644 index 00000000..ba741219 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dawn.json @@ -0,0 +1 @@ +{"colors":{"color0":"#353535","color1":"#744B40","color2":"#6D6137","color3":"#765636","color4":"#61564B","color5":"#6B4A49","color6":"#435861","color7":"#B3B3B3","color8":"#5F5F5F","color9":"#744B40","color10":"#6D6137","color11":"#765636","color12":"#61564B","color13":"#6B4A49","color14":"#435861","color15":"#B3B3B3","color16":"#5F5F5F","color17":"#785850"},"special":{"foreground":"#9B9081","background":"#181B20","cursor":"#785850"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-deafened.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-deafened.json new file mode 100644 index 00000000..f2b7ed90 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-deafened.json @@ -0,0 +1 @@ +{"colors":{"color0":"#3d3e3d","color1":"#755a5b","color2":"#68755a","color3":"#756e5a","color4":"#5b6976","color5":"#755b76","color6":"#465457","color7":"#ccccc6","color8":"#5a5b5c","color9":"#755a5b","color10":"#68755a","color11":"#756e5a","color12":"#5b6976","color13":"#755b76","color14":"#465457","color15":"#ccccc6","color16":"#5a5b5c","color17":"#a37679"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#a37679"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-derp.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-derp.json new file mode 100644 index 00000000..a1f5c2b4 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-derp.json @@ -0,0 +1 @@ +{"colors":{"color0":"#111111","color1":"#d36265","color2":"#aece91","color3":"#e7e18c","color4":"#5297cf","color5":"#963c59","color6":"#5e7175","color7":"#bebebe","color8":"#666666","color9":"#d36265","color10":"#aece91","color11":"#e7e18c","color12":"#5297cf","color13":"#963c59","color14":"#5e7175","color15":"#bebebe","color16":"#666666","color17":"#ef8171"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ef8171"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-digerati.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-digerati.json new file mode 100644 index 00000000..289b7fd1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-digerati.json @@ -0,0 +1 @@ +{"colors":{"color0":"#303030","color1":"#c03000","color2":"#b1d631","color3":"#fecf35","color4":"#426870","color5":"#6d506d","color6":"#4bb5c1","color7":"#e2e2e5","color8":"#5f5f5f","color9":"#c03000","color10":"#b1d631","color11":"#fecf35","color12":"#426870","color13":"#6d506d","color14":"#4bb5c1","color15":"#e2e2e5","color16":"#5f5f5f","color17":"#ff3a78"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ff3a78"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-doomicideocean.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-doomicideocean.json new file mode 100644 index 00000000..e408e30c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-doomicideocean.json @@ -0,0 +1 @@ +{"colors":{"color0":"#000000","color1":"#571dc2","color2":"#14db49","color3":"#403d70","color4":"#385a70","color5":"#384894","color6":"#4f3a5e","color7":"#999999","color8":"#38372c","color9":"#571dc2","color10":"#14db49","color11":"#403d70","color12":"#385a70","color13":"#384894","color14":"#4f3a5e","color15":"#999999","color16":"#38372c","color17":"#7c54b0"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#7c54b0"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dotshare.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dotshare.json new file mode 100644 index 00000000..682f2a6c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dotshare.json @@ -0,0 +1 @@ +{"colors":{"color0":"#101010","color1":"#e84f4f","color2":"#b8d68c","color3":"#e1aa5d","color4":"#7dc1cf","color5":"#9b64fb","color6":"#6d878d","color7":"#dddddd","color8":"#404040","color9":"#e84f4f","color10":"#b8d68c","color11":"#e1aa5d","color12":"#7dc1cf","color13":"#9b64fb","color14":"#6d878d","color15":"#dddddd","color16":"#404040","color17":"#d23d3d"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#d23d3d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dwmrob.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dwmrob.json new file mode 100644 index 00000000..3a820fb2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-dwmrob.json @@ -0,0 +1 @@ +{"colors":{"color0":"#151515","color1":"#bf7979","color2":"#97b26b","color3":"#cdcda1","color4":"#4a5463","color5":"#9c3885","color6":"#88aadd","color7":"#ffffff","color8":"#505450","color9":"#bf7979","color10":"#97b26b","color11":"#cdcda1","color12":"#4a5463","color13":"#9c3885","color14":"#88aadd","color15":"#ffffff","color16":"#505450","color17":"#f4a45f"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#f4a45f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-eqie6.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-eqie6.json new file mode 100644 index 00000000..f9e7481c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-eqie6.json @@ -0,0 +1 @@ +{"colors":{"color0":"#222222","color1":"#e84f4f","color2":"#b7ce42","color3":"#fea63c","color4":"#66a9b9","color5":"#b7416e","color6":"#6d878d","color7":"#cccccc","color8":"#666666","color9":"#e84f4f","color10":"#b7ce42","color11":"#fea63c","color12":"#66a9b9","color13":"#b7416e","color14":"#6d878d","color15":"#cccccc","color16":"#666666","color17":"#d23d3d"},"special":{"foreground":"#cccccc","background":"#111111","cursor":"#d23d3d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-euphrasia.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-euphrasia.json new file mode 100644 index 00000000..7b1d82fd --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-euphrasia.json @@ -0,0 +1 @@ +{"colors":{"color0":"#192033","color1":"#a62a3e","color2":"#38912b","color3":"#b27d12","color4":"#355c9a","color5":"#7c4f9f","color6":"#258f8f","color7":"#77858c","color8":"#666666","color9":"#a62a3e","color10":"#38912b","color11":"#b27d12","color12":"#355c9a","color13":"#7c4f9f","color14":"#258f8f","color15":"#77858c","color16":"#666666","color17":"#f04758"},"special":{"foreground":"#1c2027","background":"#cfcfd9","cursor":"#f04758"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gjm.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gjm.json new file mode 100644 index 00000000..860d5ea8 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gjm.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1c1c1c","color1":"#ff005b","color2":"#cee318","color3":"#ffe755","color4":"#048ac7","color5":"#833c9f","color6":"#0ac1cd","color7":"#e5e5e5","color8":"#666666","color9":"#ff005b","color10":"#cee318","color11":"#ffe755","color12":"#048ac7","color13":"#833c9f","color14":"#0ac1cd","color15":"#e5e5e5","color16":"#666666","color17":"#ff00a0"},"special":{"foreground":"#c5c5c5","background":"#1c1c1c","cursor":"#ff00a0"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gnometerm.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gnometerm.json new file mode 100644 index 00000000..544145b5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gnometerm.json @@ -0,0 +1 @@ +{"colors":{"color0":"#000000","color1":"#cc0000","color2":"#4e9a06","color3":"#c4a000","color4":"#3465a4","color5":"#75507b","color6":"#06989a","color7":"#d3d7cf","color8":"#555753","color9":"#cc0000","color10":"#4e9a06","color11":"#c4a000","color12":"#3465a4","color13":"#75507b","color14":"#06989a","color15":"#d3d7cf","color16":"#555753","color17":"#ef2929"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ef2929"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gotham.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gotham.json new file mode 100644 index 00000000..3cf5b0f2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gotham.json @@ -0,0 +1 @@ +{"colors":{"color0":"#0a0f14","color1":"#c33027","color2":"#26a98b","color3":"#edb54b","color4":"#195465","color5":"#4e5165","color6":"#33859d","color7":"#98d1ce","color8":"#364b61","color9":"#c33027","color10":"#26a98b","color11":"#edb54b","color12":"#195465","color13":"#4e5165","color14":"#33859d","color15":"#98d1ce","color16":"#10151b","color17":"#d26939"},"special":{"foreground":"#98d1ce","background":"#0a0f14","cursor":"#d26939"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gslob-nature-suede.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gslob-nature-suede.json new file mode 100644 index 00000000..3c389a68 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-gslob-nature-suede.json @@ -0,0 +1 @@ +{"colors":{"color0":"#392925","color1":"#98724c","color2":"#908f32","color3":"#aa964c","color4":"#7b854e","color5":"#6b5644","color6":"#5c5142","color7":"#c8b55b","color8":"#544b2e","color9":"#98724c","color10":"#908f32","color11":"#aa964c","color12":"#7b854e","color13":"#6b5644","color14":"#5c5142","color15":"#c8b55b","color16":"#544b2e","color17":"#af652f"},"special":{"foreground":"#746c48","background":"#170f0d","cursor":"#af652f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hund.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hund.json new file mode 100644 index 00000000..234bc409 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hund.json @@ -0,0 +1 @@ +{"colors":{"color0":"#222222","color1":"#E84F4F","color2":"#B7CE42","color3":"#FEA63C","color4":"#66AABB","color5":"#B7416E","color6":"#6D878D","color7":"#DDDDDD","color8":"#666666","color9":"#E84F4F","color10":"#B7CE42","color11":"#FEA63C","color12":"#66AABB","color13":"#B7416E","color14":"#6D878D","color15":"#DDDDDD","color16":"#666666","color17":"#D23D3D"},"special":{"foreground":"#FFFFFF","background":"#161616","cursor":"#D23D3D"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hybrid.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hybrid.json new file mode 100644 index 00000000..cf2e9f19 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-hybrid.json @@ -0,0 +1 @@ +{"colors":{"color0":"#393939","color1":"#da4939","color2":"#9acc79","color3":"#d0d26b","color4":"#6d9cbe","color5":"#9f5079","color6":"#435d75","color7":"#c2c2c2","color8":"#474747","color9":"#da4939","color10":"#9acc79","color11":"#d0d26b","color12":"#6d9cbe","color13":"#9f5079","color14":"#435d75","color15":"#c2c2c2","color16":"#474747","color17":"#ff6c5c"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ff6c5c"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-insignificato.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-insignificato.json new file mode 100644 index 00000000..ebcb981f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-insignificato.json @@ -0,0 +1 @@ +{"colors":{"color0":"#3d3e3d","color1":"#755a5b","color2":"#68755a","color3":"#756e5a","color4":"#5b6976","color5":"#755b76","color6":"#5b7674","color7":"#808080","color8":"#5a5b5c","color9":"#755a5b","color10":"#68755a","color11":"#756e5a","color12":"#5b6976","color13":"#755b76","color14":"#5b7674","color15":"#808080","color16":"#5a5b5c","color17":"#a37679"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#a37679"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-invisibone.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-invisibone.json new file mode 100644 index 00000000..9a93cb02 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-invisibone.json @@ -0,0 +1 @@ +{"colors":{"color0":"#303030","color1":"#D370A3","color2":"#6D9E3F","color3":"#B58858","color4":"#6095C5","color5":"#AC7BDE","color6":"#3BA275","color7":"#CFCFCF","color8":"#686868","color9":"#D370A3","color10":"#6D9E3F","color11":"#B58858","color12":"#6095C5","color13":"#AC7BDE","color14":"#3BA275","color15":"#CFCFCF","color16":"#686868","color17":"#FFA7DA"},"special":{"foreground":"#A0A0A0","background":"#232323","cursor":"#FFA7DA"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-jasonwryan.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-jasonwryan.json new file mode 100644 index 00000000..713b8b55 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-jasonwryan.json @@ -0,0 +1 @@ +{"colors":{"color0":"#222222","color1":"#9e5641","color2":"#6c7e55","color3":"#caaf2b","color4":"#4c8ea1","color5":"#956d9d","color6":"#7c9aa6","color7":"#909090","color8":"#454545","color9":"#9e5641","color10":"#6c7e55","color11":"#caaf2b","color12":"#4c8ea1","color13":"#956d9d","color14":"#7c9aa6","color15":"#909090","color16":"#454545","color17":"#cc896d"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#cc896d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-kasugano.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-kasugano.json new file mode 100644 index 00000000..1c24bc71 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-kasugano.json @@ -0,0 +1 @@ +{"colors":{"color0":"#3D3D3D","color1":"#6673BF","color2":"#3EA290","color3":"#B0EAD9","color4":"#31658C","color5":"#596196","color6":"#8292B2","color7":"#C8CACC","color8":"#4D4D4D","color9":"#6673BF","color10":"#3EA290","color11":"#B0EAD9","color12":"#31658C","color13":"#596196","color14":"#8292B2","color15":"#C8CACC","color16":"#4D4D4D","color17":"#899AFF"},"special":{"foreground":"#ffffff","background":"#1b1b1b","cursor":"#899AFF"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-material.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-material.json new file mode 100644 index 00000000..bbe3f613 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-material.json @@ -0,0 +1 @@ +{"colors":{"color0":"#263238","color1":"#ff9800","color2":"#8bc34a","color3":"#ffc107","color4":"#03a9f4","color5":"#e91e63","color6":"#009688","color7":"#cfd8dc","color8":"#37474f","color9":"#ff9800","color10":"#8bc34a","color11":"#ffc107","color12":"#03a9f4","color13":"#e91e63","color14":"#009688","color15":"#cfd8dc","color16":"#37474f","color17":"#ffa74d"},"special":{"foreground":"#eceff1","background":"#263238","cursor":"#ffa74d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikado.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikado.json new file mode 100644 index 00000000..f842a736 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikado.json @@ -0,0 +1 @@ +{"colors":{"color0":"#322a2c","color1":"#a04363","color2":"#9b9329","color3":"#bf7a29","color4":"#6a8c8c","color5":"#856774","color6":"#757978","color7":"#bcbcaf","color8":"#46423b","color9":"#a04363","color10":"#9b9329","color11":"#bf7a29","color12":"#6a8c8c","color13":"#856774","color14":"#757978","color15":"#bcbcaf","color16":"#46423b","color17":"#ae837a"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ae837a"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikazuki.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikazuki.json new file mode 100644 index 00000000..b617e431 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-mikazuki.json @@ -0,0 +1 @@ +{"colors":{"color0":"#2a1d17","color1":"#da1657","color2":"#3ea250","color3":"#e3d33d","color4":"#3ea290","color5":"#ff850d","color6":"#8c16da","color7":"#e9e9e9","color8":"#4f362b","color9":"#da1657","color10":"#3ea250","color11":"#e3d33d","color12":"#3ea290","color13":"#ff850d","color14":"#8c16da","color15":"#e9e9e9","color16":"#4f362b","color17":"#da4375"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#da4375"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-monokai.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-monokai.json new file mode 100644 index 00000000..b8669f67 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-monokai.json @@ -0,0 +1 @@ +{"colors":{"color0":"#48483e","color1":"#dc2566","color2":"#8fc029","color3":"#d4c96e","color4":"#55bcce","color5":"#9358fe","color6":"#56b7a5","color7":"#acada1","color8":"#76715e","color9":"#dc2566","color10":"#8fc029","color11":"#d4c96e","color12":"#55bcce","color13":"#9358fe","color14":"#56b7a5","color15":"#acada1","color16":"#76715e","color17":"#fa2772"},"special":{"foreground":"#f1ebeb","background":"#272822","cursor":"#fa2772"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-muse.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-muse.json new file mode 100644 index 00000000..cee7079f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-muse.json @@ -0,0 +1 @@ +{"colors":{"color0":"#2e3436","color1":"#a31604","color2":"#447241","color3":"#c1951a","color4":"#425387","color5":"#965d98","color6":"#06989a","color7":"#d3d7cf","color8":"#555753","color9":"#a31604","color10":"#447241","color11":"#c1951a","color12":"#425387","color13":"#965d98","color14":"#06989a","color15":"#d3d7cf","color16":"#555753","color17":"#c60001"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#c60001"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-nancy.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-nancy.json new file mode 100644 index 00000000..a606bd58 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-nancy.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1b1d1e","color1":"#f92672","color2":"#82b414","color3":"#fd971f","color4":"#4e82aa","color5":"#8c54fe","color6":"#465457","color7":"#ccccc6","color8":"#505354","color9":"#f92672","color10":"#82b414","color11":"#fd971f","color12":"#4e82aa","color13":"#8c54fe","color14":"#465457","color15":"#ccccc6","color16":"#505354","color17":"#ff5995"},"special":{"foreground":"#ffffff","background":"#010101","cursor":"#ff5995"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-navy-and-ivory.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-navy-and-ivory.json new file mode 100644 index 00000000..a3745a56 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-navy-and-ivory.json @@ -0,0 +1 @@ +{"colors":{"color0":"#032c36","color1":"#c2454e","color2":"#7cbf9e","color3":"#8a7a63","color4":"#2e3340","color5":"#ff5879","color6":"#44b5b1","color7":"#f2f1b9","color8":"#065f73","color9":"#c2454e","color10":"#7cbf9e","color11":"#8a7a63","color12":"#2e3340","color13":"#ff5879","color14":"#44b5b1","color15":"#f2f1b9","color16":"#065f73","color17":"#ef5847"},"special":{"foreground":"#e8dfd6","background":"#021b21","cursor":"#ef5847"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-neon.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-neon.json new file mode 100644 index 00000000..2382d012 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-neon.json @@ -0,0 +1 @@ +{"colors":{"color0":"#171717","color1":"#d81765","color2":"#97d01a","color3":"#ffa800","color4":"#16b1fb","color5":"#ff2491","color6":"#0fdcb6","color7":"#ebebeb","color8":"#38252c","color9":"#d81765","color10":"#97d01a","color11":"#ffa800","color12":"#16b1fb","color13":"#ff2491","color14":"#0fdcb6","color15":"#ebebeb","color16":"#38252c","color17":"#ff0000"},"special":{"foreground":"#f8f8f8","background":"#171717","cursor":"#ff0000"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-numixdarkest.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-numixdarkest.json new file mode 100644 index 00000000..800d2683 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-numixdarkest.json @@ -0,0 +1 @@ +{"colors":{"color0":"#555555","color1":"#9c3528","color2":"#61bc3b","color3":"#f3b43a","color4":"#0d68a8","color5":"#744560","color6":"#288e9c","color7":"#a2a2a2","color8":"#888888","color9":"#9c3528","color10":"#61bc3b","color11":"#f3b43a","color12":"#0d68a8","color13":"#744560","color14":"#288e9c","color15":"#a2a2a2","color16":"#888888","color17":"#d64937"},"special":{"foreground":"#a2a2a2","background":"#282828","cursor":"#d64937"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-orangish.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-orangish.json new file mode 100644 index 00000000..c2e3a20f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-orangish.json @@ -0,0 +1 @@ +{"colors":{"color0":"#251f1f","color1":"#eb4509","color2":"#94e76b","color3":"#ffac18","color4":"#46aede","color5":"#e32c57","color6":"#d6dbac","color7":"#efefef","color8":"#5e5e5e","color9":"#eb4509","color10":"#94e76b","color11":"#ffac18","color12":"#46aede","color13":"#e32c57","color14":"#d6dbac","color15":"#efefef","color16":"#5e5e5e","color17":"#eb4509"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#eb4509"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-parker_brothers.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-parker_brothers.json new file mode 100644 index 00000000..cb28085a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-parker_brothers.json @@ -0,0 +1 @@ +{"colors":{"color0":"#322a2c","color1":"#79220e","color2":"#344b1b","color3":"#b45b00","color4":"#434045","color5":"#5c1e25","color6":"#394745","color7":"#ae8842","color8":"#46423b","color9":"#79220e","color10":"#344b1b","color11":"#b45b00","color12":"#434045","color13":"#5c1e25","color14":"#394745","color15":"#ae8842","color16":"#46423b","color17":"#aa261f"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#aa261f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-phrak1.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-phrak1.json new file mode 100644 index 00000000..9e18e24c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-phrak1.json @@ -0,0 +1 @@ +{"colors":{"color0":"#000000","color1":"#a80000","color2":"#00a800","color3":"#a85400","color4":"#0000a8","color5":"#a800a8","color6":"#00a8a8","color7":"#a8a8a8","color8":"#545054","color9":"#a80000","color10":"#00a800","color11":"#a85400","color12":"#0000a8","color13":"#a800a8","color14":"#00a8a8","color15":"#a8a8a8","color16":"#545054","color17":"#f85450"},"special":{"foreground":"#a8a8a8","background":"#000000","cursor":"#f85450"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-pretty-and-pastel.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-pretty-and-pastel.json new file mode 100644 index 00000000..8b9ea24d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-pretty-and-pastel.json @@ -0,0 +1 @@ +{"colors":{"color0":"#292929","color1":"#CF6A4C","color2":"#19CB00","color3":"#FAD07A","color4":"#8197BF","color5":"#8787AF","color6":"#668799","color7":"#888888","color8":"#525252","color9":"#CF6A4C","color10":"#19CB00","color11":"#FAD07A","color12":"#8197BF","color13":"#8787AF","color14":"#668799","color15":"#888888","color16":"#525252","color17":"#FF9D80"},"special":{"foreground":"#888888","background":"#151515","cursor":"#FF9D80"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rasi.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rasi.json new file mode 100644 index 00000000..8e19308f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rasi.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1b1d1e","color1":"#f92672","color2":"#82b414","color3":"#fd971f","color4":"#4e82aa","color5":"#8c54fe","color6":"#465457","color7":"#ccccc6","color8":"#505354","color9":"#f92672","color10":"#82b414","color11":"#fd971f","color12":"#4e82aa","color13":"#8c54fe","color14":"#465457","color15":"#ccccc6","color16":"#505354","color17":"#ff5995"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ff5995"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rezza.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rezza.json new file mode 100644 index 00000000..611f2992 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rezza.json @@ -0,0 +1 @@ +{"colors":{"color0":"#191919","color1":"#803232","color2":"#5b762f","color3":"#aa9943","color4":"#324c80","color5":"#706c9a","color6":"#92b19e","color7":"#ffffff","color8":"#252525","color9":"#803232","color10":"#5b762f","color11":"#aa9943","color12":"#324c80","color13":"#706c9a","color14":"#92b19e","color15":"#ffffff","color16":"#252525","color17":"#982b2b"},"special":{"foreground":"#dddddd","background":"#222222","cursor":"#982b2b"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rydgel.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rydgel.json new file mode 100644 index 00000000..2bf32cf6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-rydgel.json @@ -0,0 +1 @@ +{"colors":{"color0":"#303430","color1":"#bf7979","color2":"#97b26b","color3":"#cdcdc1","color4":"#86a2be","color5":"#d9b798","color6":"#a1b5cd","color7":"#ffffff","color8":"#cdb5cd","color9":"#bf7979","color10":"#97b26b","color11":"#cdcdc1","color12":"#86a2be","color13":"#d9b798","color14":"#a1b5cd","color15":"#ffffff","color16":"#cdb5cd","color17":"#f4a45f"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#f4a45f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-s3r0-modified.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-s3r0-modified.json new file mode 100644 index 00000000..fdddb391 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-s3r0-modified.json @@ -0,0 +1 @@ +{"colors":{"color0":"#4A3637","color1":"#D17B49","color2":"#7B8748","color3":"#AF865A","color4":"#535C5C","color5":"#775759","color6":"#6D715E","color7":"#C0B18B","color8":"#785f60","color9":"#D17B49","color10":"#7B8748","color11":"#AF865A","color12":"#535C5C","color13":"#775759","color14":"#6D715E","color15":"#C0B18B","color16":"#4A3637","color17":"#D17B49"},"special":{"foreground":"#C0B18B","background":"#1F1F1F","cursor":"#D17B49"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sexcolors.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sexcolors.json new file mode 100644 index 00000000..ac3b0f88 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sexcolors.json @@ -0,0 +1 @@ +{"colors":{"color0":"#252525","color1":"#ff9f95","color2":"#a6e22e","color3":"#fd971f","color4":"#435e87","color5":"#789ec6","color6":"#5e7175","color7":"#dbdcdc","color8":"#454545","color9":"#ff9f95","color10":"#a6e22e","color11":"#fd971f","color12":"#435e87","color13":"#789ec6","color14":"#5e7175","color15":"#dbdcdc","color16":"#454545","color17":"#ff8d80"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ff8d80"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-simple_rainbow.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-simple_rainbow.json new file mode 100644 index 00000000..401ff41c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-simple_rainbow.json @@ -0,0 +1 @@ +{"colors":{"color0":"#666666","color1":"#ff8278","color2":"#bde077","color3":"#eadc84","color4":"#77bee0","color5":"#dd91f3","color6":"#ffc178","color7":"#dddddd","color8":"#888888","color9":"#ff8278","color10":"#bde077","color11":"#eadc84","color12":"#77bee0","color13":"#dd91f3","color14":"#ffc178","color15":"#dddddd","color16":"#888888","color17":"#ff8278"},"special":{"foreground":"#dcdccc","background":"#575757","cursor":"#ff8278"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-splurge.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-splurge.json new file mode 100644 index 00000000..5d62989c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-splurge.json @@ -0,0 +1 @@ +{"colors":{"color0":"#4a4b4a","color1":"#d7699a","color2":"#80d468","color3":"#d7a169","color4":"#6985d7","color5":"#c86ad4","color6":"#6fccd1","color7":"#dbdcdc","color8":"#696969","color9":"#d7699a","color10":"#80d468","color11":"#d7a169","color12":"#6985d7","color13":"#c86ad4","color14":"#6fccd1","color15":"#dbdcdc","color16":"#696969","color17":"#f5a2b5"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#f5a2b5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-swayr.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-swayr.json new file mode 100644 index 00000000..a31680d7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-swayr.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1c1709","color1":"#8e4317","color2":"#787200","color3":"#945c00","color4":"#315094","color5":"#5c2e40","color6":"#00617d","color7":"#c2b9a1","color8":"#4f4939","color9":"#8e4317","color10":"#787200","color11":"#945c00","color12":"#315094","color13":"#5c2e40","color14":"#00617d","color15":"#c2b9a1","color16":"#4f4939","color17":"#f07935"},"special":{"foreground":"#c2b9a1","background":"#1c1709","cursor":"#f07935"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sweetlove.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sweetlove.json new file mode 100644 index 00000000..46632a64 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-sweetlove.json @@ -0,0 +1 @@ +{"colors":{"color0":"#4A3637","color1":"#D17B49","color2":"#7B8748","color3":"#AF865A","color4":"#535C5C","color5":"#775759","color6":"#6D715E","color7":"#C0B18B","color8":"#7e5c5e","color9":"#D17B49","color10":"#7B8748","color11":"#AF865A","color12":"#535C5C","color13":"#775759","color14":"#6D715E","color15":"#C0B18B","color16":"#402E2E","color17":"#AC5D2F"},"special":{"foreground":"#C0B18B","background":"#1F1F1F","cursor":"#AC5D2F"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tango.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tango.json new file mode 100644 index 00000000..149ae771 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tango.json @@ -0,0 +1 @@ +{"colors":{"color0":"#2e3436","color1":"#cc0000","color2":"#4e9a06","color3":"#c4a000","color4":"#3465a4","color5":"#75507b","color6":"#06989a","color7":"#d3d7cf","color8":"#555753","color9":"#cc0000","color10":"#4e9a06","color11":"#c4a000","color12":"#3465a4","color13":"#75507b","color14":"#06989a","color15":"#d3d7cf","color16":"#555753","color17":"#ef2929"},"special":{"foreground":"#babdb6","background":"#000000","cursor":"#ef2929"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tangoesque.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tangoesque.json new file mode 100644 index 00000000..9657f1fb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tangoesque.json @@ -0,0 +1 @@ +{"colors":{"color0":"#202020","color1":"#ff6565","color2":"#93d44f","color3":"#eab93d","color4":"#204a87","color5":"#ce5c00","color6":"#89b6e2","color7":"#cccccc","color8":"#606060","color9":"#ff6565","color10":"#93d44f","color11":"#eab93d","color12":"#204a87","color13":"#ce5c00","color14":"#89b6e2","color15":"#cccccc","color16":"#606060","color17":"#ff8d8d"},"special":{"foreground":"#aaaaaa","background":"#000000","cursor":"#ff8d8d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tartan.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tartan.json new file mode 100644 index 00000000..473bcaee --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tartan.json @@ -0,0 +1 @@ +{"colors":{"color0":"#2e3436","color1":"#cc0000","color2":"#4e9a06","color3":"#c4a000","color4":"#3465a4","color5":"#75507b","color6":"#06989a","color7":"#d3d7cf","color8":"#555753","color9":"#cc0000","color10":"#4e9a06","color11":"#c4a000","color12":"#3465a4","color13":"#75507b","color14":"#06989a","color15":"#d3d7cf","color16":"#555753","color17":"#ef2929"},"special":{"foreground":"#dedede","background":"#2b2b2b","cursor":"#ef2929"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-theme2.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-theme2.json new file mode 100644 index 00000000..73c70fb1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-theme2.json @@ -0,0 +1 @@ +{"colors":{"color0":"#191919","color1":"#eb3d51","color2":"#66b61a","color3":"#d98e1d","color4":"#23ffa8","color5":"#ff00da","color6":"#68a783","color7":"#eaeaea","color8":"#484848","color9":"#eb3d51","color10":"#66b61a","color11":"#d98e1d","color12":"#23ffa8","color13":"#ff00da","color14":"#68a783","color15":"#eaeaea","color16":"#484848","color17":"#be6262"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#be6262"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-thwump.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-thwump.json new file mode 100644 index 00000000..2bba6a53 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-thwump.json @@ -0,0 +1 @@ +{"colors":{"color0":"#202020","color1":"#a07070","color2":"#70a070","color3":"#a0a070","color4":"#7070a0","color5":"#a070a0","color6":"#70a0a0","color7":"#a0a0a0","color8":"#505050","color9":"#a07070","color10":"#70a070","color11":"#a0a070","color12":"#7070a0","color13":"#a070a0","color14":"#70a0a0","color15":"#a0a0a0","color16":"#505050","color17":"#d07070"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#d07070"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tlh.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tlh.json new file mode 100644 index 00000000..c1154286 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-tlh.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1c1c1c","color1":"#d81860","color2":"#60ff60","color3":"#f9fd75","color4":"#4695c8","color5":"#a78edb","color6":"#43afce","color7":"#f3ebe2","color8":"#4d4d4d","color9":"#d81860","color10":"#60ff60","color11":"#f9fd75","color12":"#4695c8","color13":"#a78edb","color14":"#43afce","color15":"#f3ebe2","color16":"#4d4d4d","color17":"#f00060"},"special":{"foreground":"#66ff66","background":"#101010","cursor":"#f00060"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-trim-yer-beard.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-trim-yer-beard.json new file mode 100644 index 00000000..54206826 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-trim-yer-beard.json @@ -0,0 +1 @@ +{"colors":{"color0":"#0F0E0D","color1":"#845336","color2":"#57553C","color3":"#A17E3E","color4":"#43454F","color5":"#604848","color6":"#5C6652","color7":"#A18B62","color8":"#383332","color9":"#845336","color10":"#57553C","color11":"#A17E3E","color12":"#43454F","color13":"#604848","color14":"#5C6652","color15":"#A18B62","color16":"#383332","color17":"#8C4F4A"},"special":{"foreground":"#DABA8B","background":"#191716","cursor":"#8C4F4A"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-user-77-mashup-colors.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-user-77-mashup-colors.json new file mode 100644 index 00000000..5fa72654 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-user-77-mashup-colors.json @@ -0,0 +1 @@ +{"colors":{"color0":"#202020","color1":"#bf3f34","color2":"#707d22","color3":"#bf7a29","color4":"#627a92","color5":"#75507b","color6":"#757978","color7":"#b2a191","color8":"#404040","color9":"#bf3f34","color10":"#707d22","color11":"#bf7a29","color12":"#627a92","color13":"#75507b","color14":"#757978","color15":"#b2a191","color16":"#404040","color17":"#ff6c5f"},"special":{"foreground":"#b2a191","background":"#171717","cursor":"#ff6c5f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-vacuous2.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-vacuous2.json new file mode 100644 index 00000000..d249a034 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-vacuous2.json @@ -0,0 +1 @@ +{"colors":{"color0":"#202020","color1":"#b91e2e","color2":"#81957c","color3":"#f9bb80","color4":"#356579","color5":"#2d2031","color6":"#0b3452","color7":"#909090","color8":"#606060","color9":"#b91e2e","color10":"#81957c","color11":"#f9bb80","color12":"#356579","color13":"#2d2031","color14":"#0b3452","color15":"#909090","color16":"#606060","color17":"#d14548"},"special":{"foreground":"#d2c5bc","background":"#101010","cursor":"#d14548"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone-alt-2.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone-alt-2.json new file mode 100644 index 00000000..5656da50 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone-alt-2.json @@ -0,0 +1 @@ +{"colors":{"color0":"#666666","color1":"#CC6699","color2":"#99CC66","color3":"#CC9966","color4":"#6699CC","color5":"#9966CC","color6":"#66CC99","color7":"#CCCCCC","color8":"#999999","color9":"#CC6699","color10":"#99CC66","color11":"#CC9966","color12":"#6699CC","color13":"#9966CC","color14":"#66CC99","color15":"#CCCCCC","color16":"#999999","color17":"#FF99CC"},"special":{"foreground":"#CCCCCC","background":"#333333","cursor":"#FF99CC"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone.json new file mode 100644 index 00000000..67fb535d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-visibone.json @@ -0,0 +1 @@ +{"colors":{"color0":"#666666","color1":"#cc6666","color2":"#66cc99","color3":"#cc9966","color4":"#6699cc","color5":"#cc6699","color6":"#66cccc","color7":"#cccccc","color8":"#999999","color9":"#cc6666","color10":"#66cc99","color11":"#cc9966","color12":"#6699cc","color13":"#cc6699","color14":"#66cccc","color15":"#cccccc","color16":"#999999","color17":"#ff9999"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#ff9999"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-x-dotshare.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-x-dotshare.json new file mode 100644 index 00000000..4a390e4d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-x-dotshare.json @@ -0,0 +1 @@ +{"colors":{"color0":"#101010","color1":"#E84F4F","color2":"#B8D68C","color3":"#E1AA5D","color4":"#7DC1CF","color5":"#9B64FB","color6":"#6D878D","color7":"#DDDDDD","color8":"#404040","color9":"#E84F4F","color10":"#B8D68C","color11":"#E1AA5D","color12":"#7DC1CF","color13":"#9B64FB","color14":"#6D878D","color15":"#DDDDDD","color16":"#404040","color17":"#D23D3D"},"special":{"foreground":"#D7D0C7","background":"#151515","cursor":"#D23D3D"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-zenburn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-zenburn.json new file mode 100644 index 00000000..70e80717 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/sexy-zenburn.json @@ -0,0 +1 @@ +{"colors":{"color0":"#1e2320","color1":"#705050","color2":"#60b48a","color3":"#dfaf8f","color4":"#506070","color5":"#dc8cc3","color6":"#8cd0d3","color7":"#dcdccc","color8":"#709080","color9":"#705050","color10":"#60b48a","color11":"#dfaf8f","color12":"#506070","color13":"#dc8cc3","color14":"#8cd0d3","color15":"#dcdccc","color16":"#709080","color17":"#dca3a3"},"special":{"foreground":"#ffffff","background":"#000000","cursor":"#dca3a3"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/solarized.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/solarized.json new file mode 100644 index 00000000..a97c89d7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/solarized.json @@ -0,0 +1 @@ +{"special":{"background":"#073642","foreground":"#fdf6e3","cursor":"#dc322f"},"colors":{"color0":"#073642","color1":"#dc322f","color2":"#859900","color3":"#b58900","color4":"#268bd2","color5":"#d33682","color6":"#2aa198","color7":"#eee8d5","color8":"#6c7c80","color9":"#dc322f","color10":"#859900","color11":"#b58900","color12":"#268bd2","color13":"#d33682","color14":"#2aa198","color15":"#eee8d5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_autumn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_autumn.json new file mode 100644 index 00000000..dee35d05 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_autumn.json @@ -0,0 +1 @@ +{"special":{"background":"#322622","foreground":"#8e8f8d","cursor":"#8e8f8d"},"colors":{"color0":"#322622","color1":"#fc5526","color2":"#83973f","color3":"#9e9022","color4":"#7f8dbf","color5":"#ce7673","color6":"#6e978b","color7":"#8e8f8d","color8":"#919078","color9":"#dc721a","color10":"#609d59","color11":"#b1891a","color12":"#6b8ed6","color13":"#9d80d3","color14":"#229ea0","color15":"#8e8f8d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_dusk.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_dusk.json new file mode 100644 index 00000000..c9a8e027 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_dusk.json @@ -0,0 +1 @@ +{"special":{"background":"#1f252d","foreground":"#a2a8ba","cursor":"#a2a8ba"},"colors":{"color0":"#1f252d","color1":"#cb8d56","color2":"#8ba089","color3":"#a79c46","color4":"#8c9abe","color5":"#b190af","color6":"#8e9aba","color7":"#a2a8ba","color8":"#a29899","color9":"#d39d74","color10":"#80b48f","color11":"#bda75a","color12":"#9ca5de","color13":"#c69ac6","color14":"#8caeb6","color15":"#a2a8ba"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_future.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_future.json new file mode 100644 index 00000000..383e304e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_future.json @@ -0,0 +1 @@ +{"special":{"background":"#18161d","foreground":"#a4a0ac","cursor":"#a4a0ac"},"colors":{"color0":"#18161d","color1":"#ff7780","color2":"#68b183","color3":"#bda014","color4":"#54a5ff","color5":"#da89b2","color6":"#79a8c3","color7":"#a4a0ac","color8":"#bd9b87","color9":"#ef873d","color10":"#08b885","color11":"#d39710","color12":"#a294fe","color13":"#ec7aca","color14":"#4ab0b9","color15":"#a4a0ac"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_rift.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_rift.json new file mode 100644 index 00000000..61860bae --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_rift.json @@ -0,0 +1 @@ +{"special":{"background":"#2b353c","foreground":"#abacac","cursor":"#abacac"},"colors":{"color0":"#2b353c","color1":"#be9604","color2":"#0eb40e","color3":"#79aa00","color4":"#00acb3","color5":"#ba964c","color6":"#5fa98f","color7":"#abacac","color8":"#ab9699","color9":"#bdae13","color10":"#3ac53a","color11":"#9ab800","color12":"#20bdce","color13":"#cca57a","color14":"#6fb9ae","color15":"#abacac"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_spring.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_spring.json new file mode 100644 index 00000000..4ae79bfd --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_spring.json @@ -0,0 +1 @@ +{"special":{"background":"#34403c","foreground":"#a5a8a7","cursor":"#a5a8a7"},"colors":{"color0":"#34403c","color1":"#ff855a","color2":"#6ab78a","color3":"#b6aa1a","color4":"#5daeee","color5":"#d495b4","color6":"#6eb2bc","color7":"#a5a8a7","color8":"#96aca7","color9":"#df993a","color10":"#4abb88","color11":"#99b22a","color12":"#3caffe","color13":"#d091db","color14":"#4ab4d3","color15":"#a5a8a7"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_summer.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_summer.json new file mode 100644 index 00000000..5015ff6a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_summer.json @@ -0,0 +1 @@ +{"special":{"background":"#293345","foreground":"#9b999e","cursor":"#9b999e"},"colors":{"color0":"#293345","color1":"#fe6d32","color2":"#6ba86d","color3":"#af9a0a","color4":"#679ed7","color5":"#bc8ab6","color6":"#6ea590","color7":"#9b999e","color8":"#a39799","color9":"#df8251","color10":"#7aa747","color11":"#ba953a","color12":"#3ba1e8","color13":"#c97ed7","color14":"#52a6b1","color15":"#9b999e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_warp.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_warp.json new file mode 100644 index 00000000..a219aa92 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_warp.json @@ -0,0 +1 @@ +{"special":{"background":"#141a19","foreground":"#928f90","cursor":"#928f90"},"colors":{"color0":"#141a19","color1":"#ff1414","color2":"#009600","color3":"#928100","color4":"#4f76ff","color5":"#dd38bc","color6":"#358aaa","color7":"#928f90","color8":"#927b80","color9":"#ff5500","color10":"#3aa43a","color11":"#b38a00","color12":"#8082ff","color13":"#d159fd","color14":"#1da190","color15":"#928f90"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_winter.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_winter.json new file mode 100644 index 00000000..472fb3d0 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/tempus_winter.json @@ -0,0 +1 @@ +{"special":{"background":"#202427","foreground":"#798ba5","cursor":"#798ba5"},"colors":{"color0":"#202427","color1":"#ca7162","color2":"#589584","color3":"#988b21","color4":"#2b92c8","color5":"#b572b6","color6":"#4f91b5","color7":"#798ba5","color8":"#888a8a","color9":"#c47818","color10":"#2c9a81","color11":"#a2864b","color12":"#6987d7","color13":"#987dc2","color14":"#1f96b0","color15":"#798ba5"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/vscode.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/vscode.json new file mode 100644 index 00000000..9830e4da --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/vscode.json @@ -0,0 +1 @@ +{"special":{"background":"#1e1e1e","foreground":"#d4d4d4","cursor":"#f44747"},"colors":{"color0":"#1e1e1e","color1":"#f44747","color2":"#d7ba7d","color3":"#608b4e","color4":"#569cd6","color5":"#4ec9b0","color6":"#c586c0","color7":"#d4d4d4","color8":"#808080","color9":"#f44747","color10":"#d7ba7d","color11":"#608b4e","color12":"#569cd6","color13":"#4ec9b0","color14":"#c586c0","color15":"#d4d4d4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/zenburn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/zenburn.json new file mode 100644 index 00000000..79a28422 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/dark/zenburn.json @@ -0,0 +1 @@ +{"special":{"background":"#3f3f3f","foreground":"#dcdccc","cursor":"#cc9393"},"colors":{"color0":"#3f3f3f","color1":"#cc9393","color2":"#7f9f7f","color3":"#d0bf8f","color4":"#6ca0a3","color5":"#dc8cc3","color6":"#93e0e3","color7":"#dcdccc","color8":"#828282","color9":"#cc9393","color10":"#7f9f7f","color11":"#d0bf8f","color12":"#6ca0a3","color13":"#dc8cc3","color14":"#93e0e3","color15":"#dcdccc"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/3024.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/3024.json new file mode 100644 index 00000000..e4859f35 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/3024.json @@ -0,0 +1 @@ +{"special":{"background":"#f7f7f7","foreground":"#090300","cursor":"#db2d20"},"colors":{"color0":"#f7f7f7","color1":"#db2d20","color2":"#01a252","color3":"#fded02","color4":"#01a0e4","color5":"#a16a94","color6":"#b5e4f4","color7":"#090300","color8":"#5c5855","color9":"#db2d20","color10":"#01a252","color11":"#fded02","color12":"#01a0e4","color13":"#a16a94","color14":"#b5e4f4","color15":"#090300"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/ashes.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/ashes.json new file mode 100644 index 00000000..2ffd2367 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/ashes.json @@ -0,0 +1 @@ +{"special":{"background":"#f3f4f5","foreground":"#565e65","cursor":"#c7ae95"},"colors":{"color0":"#f3f4f5","color1":"#c7ae95","color2":"#95c7ae","color3":"#aec795","color4":"#ae95c7","color5":"#c795ae","color6":"#95aec7","color7":"#1c2023","color8":"#747c84","color9":"#c7ae95","color10":"#95c7ae","color11":"#aec795","color12":"#ae95c7","color13":"#c795ae","color14":"#95aec7","color15":"#1c2023"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-cave.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-cave.json new file mode 100644 index 00000000..ce0866d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-cave.json @@ -0,0 +1 @@ +{"special":{"background":"#efecf4","foreground":"#585260","cursor":"#585260"},"colors":{"color0":"#efecf4","color1":"#be4678","color2":"#2a9292","color3":"#a06e3b","color4":"#576ddb","color5":"#955ae7","color6":"#398bc6","color7":"#585260","color8":"#7e7887","color9":"#be4678","color10":"#2a9292","color11":"#a06e3b","color12":"#576ddb","color13":"#955ae7","color14":"#398bc6","color15":"#19171c"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-dune.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-dune.json new file mode 100644 index 00000000..2da310e5 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-dune.json @@ -0,0 +1 @@ +{"special":{"background":"#fefbec","foreground":"#6e6b5e","cursor":"#6e6b5e"},"colors":{"color0":"#fefbec","color1":"#d73737","color2":"#60ac39","color3":"#ae9513","color4":"#6684e1","color5":"#b854d4","color6":"#1fad83","color7":"#6e6b5e","color8":"#999580","color9":"#d73737","color10":"#60ac39","color11":"#ae9513","color12":"#6684e1","color13":"#b854d4","color14":"#1fad83","color15":"#20201d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-estuary.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-estuary.json new file mode 100644 index 00000000..226eabda --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-estuary.json @@ -0,0 +1 @@ +{"special":{"background":"#f4f3ec","foreground":"#5f5e4e","cursor":"#5f5e4e"},"colors":{"color0":"#f4f3ec","color1":"#ba6236","color2":"#7d9726","color3":"#a5980d","color4":"#36a166","color5":"#5f9182","color6":"#5b9d48","color7":"#5f5e4e","color8":"#878573","color9":"#ba6236","color10":"#7d9726","color11":"#a5980d","color12":"#36a166","color13":"#5f9182","color14":"#5b9d48","color15":"#22221b"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-forest.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-forest.json new file mode 100644 index 00000000..a75e80e2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-forest.json @@ -0,0 +1 @@ +{"special":{"background":"#f1efee","foreground":"#68615e","cursor":"#68615e"},"colors":{"color0":"#f1efee","color1":"#f22c40","color2":"#7b9726","color3":"#c38418","color4":"#407ee7","color5":"#6666ea","color6":"#3d97b8","color7":"#68615e","color8":"#9c9491","color9":"#f22c40","color10":"#7b9726","color11":"#c38418","color12":"#407ee7","color13":"#6666ea","color14":"#3d97b8","color15":"#1b1918"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-heath.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-heath.json new file mode 100644 index 00000000..e48065b3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-heath.json @@ -0,0 +1 @@ +{"special":{"background":"#f7f3f7","foreground":"#695d69","cursor":"#695d69"},"colors":{"color0":"#f7f3f7","color1":"#ca402b","color2":"#918b3b","color3":"#bb8a35","color4":"#516aec","color5":"#7b59c0","color6":"#159393","color7":"#695d69","color8":"#9e8f9e","color9":"#ca402b","color10":"#918b3b","color11":"#bb8a35","color12":"#516aec","color13":"#7b59c0","color14":"#159393","color15":"#1b181b"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-lakeside.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-lakeside.json new file mode 100644 index 00000000..41d08a18 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-lakeside.json @@ -0,0 +1 @@ +{"special":{"background":"#ebf8ff","foreground":"#516d7b","cursor":"#516d7b"},"colors":{"color0":"#ebf8ff","color1":"#d22d72","color2":"#568c3b","color3":"#8a8a0f","color4":"#257fad","color5":"#6b6bb8","color6":"#2d8f6f","color7":"#516d7b","color8":"#7195a8","color9":"#d22d72","color10":"#568c3b","color11":"#8a8a0f","color12":"#257fad","color13":"#6b6bb8","color14":"#2d8f6f","color15":"#161b1d"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-plateau.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-plateau.json new file mode 100644 index 00000000..a6f72a04 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-plateau.json @@ -0,0 +1 @@ +{"special":{"background":"#f4ecec","foreground":"#585050","cursor":"#585050"},"colors":{"color0":"#f4ecec","color1":"#ca4949","color2":"#4b8b8b","color3":"#a06e3b","color4":"#7272ca","color5":"#8464c4","color6":"#5485b6","color7":"#585050","color8":"#7e7777","color9":"#ca4949","color10":"#4b8b8b","color11":"#a06e3b","color12":"#7272ca","color13":"#8464c4","color14":"#5485b6","color15":"#1b1818"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-savanna.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-savanna.json new file mode 100644 index 00000000..edfffd5a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-savanna.json @@ -0,0 +1 @@ +{"special":{"background":"#ecf4ee","foreground":"#526057","cursor":"#526057"},"colors":{"color0":"#ecf4ee","color1":"#b16139","color2":"#489963","color3":"#a07e3b","color4":"#478c90","color5":"#55859b","color6":"#1c9aa0","color7":"#526057","color8":"#78877d","color9":"#b16139","color10":"#489963","color11":"#a07e3b","color12":"#478c90","color13":"#55859b","color14":"#1c9aa0","color15":"#171c19"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-seaside.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-seaside.json new file mode 100644 index 00000000..5b584fdc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-seaside.json @@ -0,0 +1 @@ +{"special":{"background":"#f4fbf4","foreground":"#5e6e5e","cursor":"#5e6e5e"},"colors":{"color0":"#f4fbf4","color1":"#e6193c","color2":"#29a329","color3":"#98981b","color4":"#3d62f5","color5":"#ad2bee","color6":"#1999b3","color7":"#5e6e5e","color8":"#809980","color9":"#e6193c","color10":"#29a329","color11":"#98981b","color12":"#3d62f5","color13":"#ad2bee","color14":"#1999b3","color15":"#131513"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-sulphurpool.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-sulphurpool.json new file mode 100644 index 00000000..ac7a0ed9 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-atelier-sulphurpool.json @@ -0,0 +1 @@ +{"special":{"background":"#f5f7ff","foreground":"#5e6687","cursor":"#5e6687"},"colors":{"color0":"#f5f7ff","color1":"#c94922","color2":"#ac9739","color3":"#c08b30","color4":"#3d8fd1","color5":"#6679cc","color6":"#22a2c9","color7":"#5e6687","color8":"#898ea4","color9":"#c94922","color10":"#ac9739","color11":"#c08b30","color12":"#3d8fd1","color13":"#6679cc","color14":"#22a2c9","color15":"#202746"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-classic.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-classic.json new file mode 100644 index 00000000..ee1e6f50 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-classic.json @@ -0,0 +1 @@ +{"special":{"background":"#F5F5F5","foreground":"#303030","cursor":"#303030"},"colors":{"color0":"#F5F5F5","color1":"#AC4142","color2":"#90A959","color3":"#F4BF75","color4":"#6A9FB5","color5":"#AA759F","color6":"#75B5AA","color7":"#303030","color8":"#B0B0B0","color9":"#AC4142","color10":"#90A959","color11":"#F4BF75","color12":"#6A9FB5","color13":"#AA759F","color14":"#75B5AA","color15":"#151515"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupcake.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupcake.json new file mode 100644 index 00000000..357f8d3a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupcake.json @@ -0,0 +1 @@ +{"special":{"background":"#fbf1f2","foreground":"#8b8198","cursor":"#8b8198"},"colors":{"color0":"#fbf1f2","color1":"#D57E85","color2":"#A3B367","color3":"#DCB16C","color4":"#7297B9","color5":"#BB99B4","color6":"#69A9A7","color7":"#8b8198","color8":"#bfb9c6","color9":"#D57E85","color10":"#A3B367","color11":"#DCB16C","color12":"#7297B9","color13":"#BB99B4","color14":"#69A9A7","color15":"#585062"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupertino.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupertino.json new file mode 100644 index 00000000..b6a0cfc7 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-cupertino.json @@ -0,0 +1 @@ +{"special":{"background":"#ffffff","foreground":"#404040","cursor":"#404040"},"colors":{"color0":"#ffffff","color1":"#c41a15","color2":"#007400","color3":"#826b28","color4":"#0000ff","color5":"#a90d91","color6":"#318495","color7":"#404040","color8":"#808080","color9":"#c41a15","color10":"#007400","color11":"#826b28","color12":"#0000ff","color13":"#a90d91","color14":"#318495","color15":"#5e5e5e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-default.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-default.json new file mode 100644 index 00000000..5effc00c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-default.json @@ -0,0 +1 @@ +{"special":{"background":"#f8f8f8","foreground":"#383838","cursor":"#383838"},"colors":{"color0":"#f8f8f8","color1":"#ab4642","color2":"#a1b56c","color3":"#f7ca88","color4":"#7cafc2","color5":"#ba8baf","color6":"#86c1b9","color7":"#383838","color8":"#b8b8b8","color9":"#ab4642","color10":"#a1b56c","color11":"#f7ca88","color12":"#7cafc2","color13":"#ba8baf","color14":"#86c1b9","color15":"#181818"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-github.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-github.json new file mode 100644 index 00000000..cdab6779 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-github.json @@ -0,0 +1 @@ +{"special":{"background":"#ffffff","foreground":"#333333","cursor":"#333333"},"colors":{"color0":"#ffffff","color1":"#ed6a43","color2":"#183691","color3":"#795da3","color4":"#795da3","color5":"#a71d5d","color6":"#183691","color7":"#333333","color8":"#969896","color9":"#ed6a43","color10":"#183691","color11":"#795da3","color12":"#795da3","color13":"#a71d5d","color14":"#183691","color15":"#333333"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-google.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-google.json new file mode 100644 index 00000000..d697d9fc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-google.json @@ -0,0 +1 @@ +{"special":{"background":"#ffffff","foreground":"#373b41","cursor":"#373b41"},"colors":{"color0":"#ffffff","color1":"#CC342B","color2":"#198844","color3":"#FBA922","color4":"#3971ED","color5":"#A36AC7","color6":"#3971ED","color7":"#373b41","color8":"#b4b7b4","color9":"#CC342B","color10":"#198844","color11":"#FBA922","color12":"#3971ED","color13":"#A36AC7","color14":"#3971ED","color15":"#1d1f21"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-grayscale.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-grayscale.json new file mode 100644 index 00000000..0f2a24e6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-grayscale.json @@ -0,0 +1 @@ +{"special":{"background":"#f7f7f7","foreground":"#464646","cursor":"#464646"},"colors":{"color0":"#f7f7f7","color1":"#7c7c7c","color2":"#8e8e8e","color3":"#a0a0a0","color4":"#686868","color5":"#747474","color6":"#868686","color7":"#464646","color8":"#ababab","color9":"#7c7c7c","color10":"#8e8e8e","color11":"#a0a0a0","color12":"#686868","color13":"#747474","color14":"#868686","color15":"#101010"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-hard.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-hard.json new file mode 100644 index 00000000..cc0930d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-hard.json @@ -0,0 +1 @@ +{"special":{"background":"#f9f5d7","foreground":"#504945","cursor":"#504945"},"colors":{"color0":"#f9f5d7","color1":"#9d0006","color2":"#79740e","color3":"#b57614","color4":"#076678","color5":"#8f3f71","color6":"#427b58","color7":"#504945","color8":"#bdae93","color9":"#9d0006","color10":"#79740e","color11":"#b57614","color12":"#076678","color13":"#8f3f71","color14":"#427b58","color15":"#282828"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-medium.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-medium.json new file mode 100644 index 00000000..168f02bf --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-medium.json @@ -0,0 +1 @@ +{"special":{"background":"#fbf1c7","foreground":"#504945","cursor":"#504945"},"colors":{"color0":"#fbf1c7","color1":"#9d0006","color2":"#79740e","color3":"#b57614","color4":"#076678","color5":"#8f3f71","color6":"#427b58","color7":"#504945","color8":"#bdae93","color9":"#9d0006","color10":"#79740e","color11":"#b57614","color12":"#076678","color13":"#8f3f71","color14":"#427b58","color15":"#282828"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-soft.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-soft.json new file mode 100644 index 00000000..386c0bc8 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-gruvbox-soft.json @@ -0,0 +1 @@ +{"special":{"background":"#f2e5bc","foreground":"#504945","cursor":"#504945"},"colors":{"color0":"#f2e5bc","color1":"#9d0006","color2":"#79740e","color3":"#b57614","color4":"#076678","color5":"#8f3f71","color6":"#427b58","color7":"#504945","color8":"#bdae93","color9":"#9d0006","color10":"#79740e","color11":"#b57614","color12":"#076678","color13":"#8f3f71","color14":"#427b58","color15":"#282828"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-harmonic.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-harmonic.json new file mode 100644 index 00000000..80660d46 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-harmonic.json @@ -0,0 +1 @@ +{"special":{"background":"#f7f9fb","foreground":"#405c79","cursor":"#405c79"},"colors":{"color0":"#f7f9fb","color1":"#bf8b56","color2":"#56bf8b","color3":"#8bbf56","color4":"#8b56bf","color5":"#bf568b","color6":"#568bbf","color7":"#405c79","color8":"#aabcce","color9":"#bf8b56","color10":"#56bf8b","color11":"#8bbf56","color12":"#8b56bf","color13":"#bf568b","color14":"#568bbf","color15":"#0b1c2c"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-materialer.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-materialer.json new file mode 100644 index 00000000..a1ce29f3 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-materialer.json @@ -0,0 +1 @@ +{"special":{"background":"#FAFAFA","foreground":"#80CBC4","cursor":"#80CBC4"},"colors":{"color0":"#FAFAFA","color1":"#FF5370","color2":"#91B859","color3":"#FFB62C","color4":"#6182B8","color5":"#7C4DFF","color6":"#39ADB5","color7":"#80CBC4","color8":"#CCD7DA","color9":"#FF5370","color10":"#91B859","color11":"#FFB62C","color12":"#6182B8","color13":"#7C4DFF","color14":"#39ADB5","color15":"#80CBC4"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-mexico.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-mexico.json new file mode 100644 index 00000000..663c7343 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-mexico.json @@ -0,0 +1 @@ +{"special":{"background":"#f8f8f8","foreground":"#383838","cursor":"#383838"},"colors":{"color0":"#f8f8f8","color1":"#ab4642","color2":"#538947","color3":"#f79a0e","color4":"#7cafc2","color5":"#96609e","color6":"#4b8093","color7":"#383838","color8":"#b8b8b8","color9":"#ab4642","color10":"#538947","color11":"#f79a0e","color12":"#7cafc2","color13":"#96609e","color14":"#4b8093","color15":"#181818"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-one.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-one.json new file mode 100644 index 00000000..3b6690d6 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-one.json @@ -0,0 +1 @@ +{"special":{"background":"#fafafa","foreground":"#383a42","cursor":"#383a42"},"colors":{"color0":"#fafafa","color1":"#ca1243","color2":"#50a14f","color3":"#c18401","color4":"#4078f2","color5":"#a626a4","color6":"#0184bc","color7":"#383a42","color8":"#a0a1a7","color9":"#ca1243","color10":"#50a14f","color11":"#c18401","color12":"#4078f2","color13":"#a626a4","color14":"#0184bc","color15":"#090a0b"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-shapeshifter.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-shapeshifter.json new file mode 100644 index 00000000..72932687 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-shapeshifter.json @@ -0,0 +1 @@ +{"special":{"background":"#f9f9f9","foreground":"#102015","cursor":"#102015"},"colors":{"color0":"#f9f9f9","color1":"#e92f2f","color2":"#0ed839","color3":"#dddd13","color4":"#3b48e3","color5":"#f996e2","color6":"#23edda","color7":"#102015","color8":"#555555","color9":"#e92f2f","color10":"#0ed839","color11":"#dddd13","color12":"#3b48e3","color13":"#f996e2","color14":"#23edda","color15":"#000000"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-solarized.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-solarized.json new file mode 100644 index 00000000..c56326d2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-solarized.json @@ -0,0 +1 @@ +{"special":{"background":"#fdf6e3","foreground":"#586e75","cursor":"#586e75"},"colors":{"color0":"#fdf6e3","color1":"#dc322f","color2":"#859900","color3":"#b58900","color4":"#268bd2","color5":"#6c71c4","color6":"#2aa198","color7":"#586e75","color8":"#839496","color9":"#dc322f","color10":"#859900","color11":"#b58900","color12":"#268bd2","color13":"#6c71c4","color14":"#2aa198","color15":"#002b36"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-summerfruit.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-summerfruit.json new file mode 100644 index 00000000..5aceb865 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-summerfruit.json @@ -0,0 +1 @@ +{"special":{"background":"#FFFFFF","foreground":"#101010","cursor":"#101010"},"colors":{"color0":"#FFFFFF","color1":"#FF0086","color2":"#00C918","color3":"#ABA800","color4":"#3777E6","color5":"#AD00A1","color6":"#1FAAAA","color7":"#101010","color8":"#B0B0B0","color9":"#FF0086","color10":"#00C918","color11":"#ABA800","color12":"#3777E6","color13":"#AD00A1","color14":"#1FAAAA","color15":"#202020"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-tomorrow.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-tomorrow.json new file mode 100644 index 00000000..6b3dc1db --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-tomorrow.json @@ -0,0 +1 @@ +{"special":{"background":"#ffffff","foreground":"#4d4d4c","cursor":"#4d4d4c"},"colors":{"color0":"#ffffff","color1":"#c82829","color2":"#718c00","color3":"#eab700","color4":"#4271ae","color5":"#8959a8","color6":"#3e999f","color7":"#4d4d4c","color8":"#8e908c","color9":"#c82829","color10":"#718c00","color11":"#eab700","color12":"#4271ae","color13":"#8959a8","color14":"#3e999f","color15":"#1d1f21"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-unikitty.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-unikitty.json new file mode 100644 index 00000000..1f8e1065 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/base16-unikitty.json @@ -0,0 +1 @@ +{"special":{"background":"#ffffff","foreground":"#6c696e","cursor":"#6c696e"},"colors":{"color0":"#ffffff","color1":"#d8137f","color2":"#17ad98","color3":"#dc8a0e","color4":"#775dff","color5":"#aa17e6","color6":"#149bda","color7":"#6c696e","color8":"#a7a5a8","color9":"#d8137f","color10":"#17ad98","color11":"#dc8a0e","color12":"#775dff","color13":"#aa17e6","color14":"#149bda","color15":"#322d34"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/github.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/github.json new file mode 100644 index 00000000..da7278ce --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/github.json @@ -0,0 +1 @@ +{"special":{"background":"#f4f4f4","foreground":"#3e3e3e","cursor":"#970b16"},"colors":{"color0":"#ffffff","color1":"#970b16","color2":"#07962a","color3":"#f8eec7","color4":"#003e8a","color5":"#e94691","color6":"#89d1ec","color7":"#3e3e3e","color8":"#666666","color9":"#970b16","color10":"#07962a","color11":"#f8eec7","color12":"#003e8a","color13":"#e94691","color14":"#89d1ec","color15":"#3e3e3e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/sexy-mostly-bright.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/sexy-mostly-bright.json new file mode 100644 index 00000000..2d6f8acc --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/sexy-mostly-bright.json @@ -0,0 +1 @@ +{"colors":{"color0":"#D3D3D3","color1":"#EF6B7B","color2":"#A1D569","color3":"#F59335","color4":"#4EC2E8","color5":"#FEC7CD","color6":"#95C1C0","color7":"#707070","color8":"#B3B3B3","color9":"#EF6B7B","color10":"#A1D569","color11":"#F59335","color12":"#4EC2E8","color13":"#FEC7CD","color14":"#95C1C0","color15":"#707070","color16":"#B3B3B3","color17":"#ED5466"},"special":{"foreground":"#707070","background":"#F3F3F3","cursor":"#ED5466"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/solarized.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/solarized.json new file mode 100644 index 00000000..53186fe0 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/solarized.json @@ -0,0 +1 @@ +{"special":{"background":"#eee8d5","foreground":"#002b36","cursor":"#dc322f"},"colors":{"color0":"#eee8d5","color1":"#dc322f","color2":"#859900","color3":"#b58900","color4":"#268bd2","color5":"#d33682","color6":"#2aa198","color7":"#073642","color8":"#6c7c80","color9":"#dc322f","color10":"#859900","color11":"#b58900","color12":"#268bd2","color13":"#d33682","color14":"#2aa198","color15":"#073642"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_dawn.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_dawn.json new file mode 100644 index 00000000..babb8101 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_dawn.json @@ -0,0 +1 @@ +{"special":{"background":"#f3f1f5","foreground":"#53575a","cursor":"#53575a"},"colors":{"color0":"#f3f1f5","color1":"#9b3132","color2":"#306130","color3":"#73500a","color4":"#4c547e","color5":"#883c64","color6":"#186060","color7":"#53575a","color8":"#735e3f","color9":"#9b474d","color10":"#4e6938","color11":"#8e5319","color12":"#5c5d8c","color13":"#a24055","color14":"#2d6978","color15":"#53575a"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_fugit.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_fugit.json new file mode 100644 index 00000000..2c766724 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_fugit.json @@ -0,0 +1 @@ +{"special":{"background":"#fff5f3","foreground":"#4d696f","cursor":"#4d696f"},"colors":{"color0":"#fff5f3","color1":"#df2014","color2":"#587d0a","color3":"#8a6f00","color4":"#196bec","color5":"#c83884","color6":"#2a79a2","color7":"#4d696f","color8":"#8b6781","color9":"#9a511a","color10":"#11742f","color11":"#8d590a","color12":"#004fff","color13":"#9536c0","color14":"#046c92","color15":"#4d696f"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_past.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_past.json new file mode 100644 index 00000000..2115eff2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_past.json @@ -0,0 +1 @@ +{"special":{"background":"#dadce8","foreground":"#63606b","cursor":"#63606b"},"colors":{"color0":"#dadce8","color1":"#c01c10","color2":"#2a7000","color3":"#825a0a","color4":"#025ccd","color5":"#a43878","color6":"#49628d","color7":"#63606b","color8":"#80565d","color9":"#b43036","color10":"#007214","color11":"#91520a","color12":"#5046eb","color13":"#ba166b","color14":"#076c76","color15":"#63606b"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_totus.json b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_totus.json new file mode 100644 index 00000000..fb8dc2a9 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/colorschemes/light/tempus_totus.json @@ -0,0 +1 @@ +{"special":{"background":"#f4f1f0","foreground":"#52505e","cursor":"#52505e"},"colors":{"color0":"#f4f1f0","color1":"#a01c10","color2":"#0b5d46","color3":"#545422","color4":"#1c4f9f","color5":"#942166","color6":"#185870","color7":"#52505e","color8":"#575050","color9":"#913210","color10":"#2a5d08","color11":"#774611","color12":"#5440a7","color13":"#8d0e9b","color14":"#0e577b","color15":"#52505e"}} \ No newline at end of file diff --git a/.local/lib/python3.9/site-packages/pywal/export.py b/.local/lib/python3.9/site-packages/pywal/export.py new file mode 100644 index 00000000..83dd15cb --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/export.py @@ -0,0 +1,86 @@ +""" +Export colors in various formats. +""" +import logging +import os + +from .settings import CACHE_DIR, MODULE_DIR, CONF_DIR +from . import util + + +def template(colors, input_file, output_file=None): + """Read template file, substitute markers and + save the file elsewhere.""" + template_data = util.read_file_raw(input_file) + template_data = "".join(template_data).format(**colors) + + util.save_file(template_data, output_file) + + +def flatten_colors(colors): + """Prepare colors to be exported. + Flatten dicts and convert colors to util.Color()""" + all_colors = {"wallpaper": colors["wallpaper"], + "alpha": colors["alpha"], + **colors["special"], + **colors["colors"]} + return {k: util.Color(v) for k, v in all_colors.items()} + + +def get_export_type(export_type): + """Convert template type to the right filename.""" + return { + "css": "colors.css", + "dmenu": "colors-wal-dmenu.h", + "dwm": "colors-wal-dwm.h", + "st": "colors-wal-st.h", + "tabbed": "colors-wal-tabbed.h", + "gtk2": "colors-gtk2.rc", + "json": "colors.json", + "konsole": "colors-konsole.colorscheme", + "kitty": "colors-kitty.conf", + "plain": "colors", + "putty": "colors-putty.reg", + "rofi": "colors-rofi.Xresources", + "scss": "colors.scss", + "shell": "colors.sh", + "speedcrunch": "colors-speedcrunch.json", + "sway": "colors-sway", + "tty": "colors-tty.sh", + "waybar": "colors-waybar.css", + "xresources": "colors.Xresources", + "xmonad": "colors.hs", + "yaml": "colors.yml", + }.get(export_type, export_type) + + +def every(colors, output_dir=CACHE_DIR): + """Export all template files.""" + colors = flatten_colors(colors) + template_dir = os.path.join(MODULE_DIR, "templates") + template_dir_user = os.path.join(CONF_DIR, "templates") + util.create_dir(template_dir_user) + + join = os.path.join # Minor optimization. + for file in [*os.scandir(template_dir), + *os.scandir(template_dir_user)]: + if file.name != ".DS_Store": + template(colors, file.path, join(output_dir, file.name)) + + logging.info("Exported all files.") + logging.info("Exported all user files.") + + +def color(colors, export_type, output_file=None): + """Export a single template file.""" + all_colors = flatten_colors(colors) + + template_name = get_export_type(export_type) + template_file = os.path.join(MODULE_DIR, "templates", template_name) + output_file = output_file or os.path.join(CACHE_DIR, template_name) + + if os.path.isfile(template_file): + template(all_colors, template_file, output_file) + logging.info("Exported %s.", export_type) + else: + logging.warning("Template '%s' doesn't exist.", export_type) diff --git a/.local/lib/python3.9/site-packages/pywal/image.py b/.local/lib/python3.9/site-packages/pywal/image.py new file mode 100644 index 00000000..897f443c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/image.py @@ -0,0 +1,84 @@ +""" +Get the image file. +""" +import logging +import os +import random +import re +import sys + +from .settings import CACHE_DIR +from . import util +from . import wallpaper + + +def get_image_dir(img_dir): + """Get all images in a directory.""" + current_wall = wallpaper.get() + current_wall = os.path.basename(current_wall) + + file_types = (".png", ".jpg", ".jpeg", ".jpe", ".gif") + + return [img.name for img in os.scandir(img_dir) + if img.name.lower().endswith(file_types)], current_wall + + +def get_random_image(img_dir): + """Pick a random image file from a directory.""" + images, current_wall = get_image_dir(img_dir) + + if len(images) > 2 and current_wall in images: + images.remove(current_wall) + + elif not images: + logging.error("No images found in directory.") + sys.exit(1) + + random.shuffle(images) + return os.path.join(img_dir, images[0]) + + +def get_next_image(img_dir): + """Get the next image in a dir.""" + images, current_wall = get_image_dir(img_dir) + images.sort(key=lambda img: [int(x) if x.isdigit() else x + for x in re.split('([0-9]+)', img)]) + + try: + next_index = images.index(current_wall) + 1 + + except ValueError: + next_index = 0 + + try: + image = images[next_index] + + except IndexError: + image = images[0] + + return os.path.join(img_dir, image) + + +def get(img, cache_dir=CACHE_DIR, iterative=False): + """Validate image input.""" + if os.path.isfile(img): + wal_img = img + + elif os.path.isdir(img): + if iterative: + wal_img = get_next_image(img) + + else: + wal_img = get_random_image(img) + + else: + logging.error("No valid image file found.") + sys.exit(1) + + wal_img = os.path.abspath(wal_img) + + # Cache the image file path. + util.save_file(wal_img, os.path.join(cache_dir, "wal")) + + logging.info("Using image \033[1;37m%s\033[0m.", os.path.basename(wal_img)) + return wal_img diff --git a/.local/lib/python3.9/site-packages/pywal/reload.py b/.local/lib/python3.9/site-packages/pywal/reload.py new file mode 100644 index 00000000..6ea5c439 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/reload.py @@ -0,0 +1,88 @@ +""" +Reload programs. +""" +import logging +import os +import shutil +import subprocess + +from .settings import CACHE_DIR, MODULE_DIR, OS +from . import util + + +def tty(tty_reload): + """Load colors in tty.""" + tty_script = os.path.join(CACHE_DIR, "colors-tty.sh") + term = os.environ.get("TERM") + + if tty_reload and term == "linux": + subprocess.Popen(["sh", tty_script]) + + +def xrdb(xrdb_files=None): + """Merge the colors into the X db so new terminals use them.""" + xrdb_files = xrdb_files or \ + [os.path.join(CACHE_DIR, "colors.Xresources")] + + if shutil.which("xrdb") and OS != "Darwin": + for file in xrdb_files: + subprocess.run(["xrdb", "-merge", "-quiet", file]) + + +def gtk(): + """Reload GTK theme on the fly.""" + # Here we call a Python 2 script to reload the GTK themes. + # This is done because the Python 3 GTK/Gdk libraries don't + # provide a way of doing this. + if shutil.which("python2"): + gtk_reload = os.path.join(MODULE_DIR, "scripts", "gtk_reload.py") + util.disown(["python2", gtk_reload]) + + else: + logging.warning("GTK2 reload support requires Python 2.") + + +def i3(): + """Reload i3 colors.""" + if shutil.which("i3-msg") and util.get_pid("i3"): + util.disown(["i3-msg", "reload"]) + + +def kitty(): + """ Reload kitty colors. """ + if shutil.which("kitty") and util.get_pid("kitty"): + util.disown(["kitty", "@", "set-colors", "--all"]) + + +def polybar(): + """Reload polybar colors.""" + if shutil.which("polybar") and util.get_pid("polybar"): + util.disown(["pkill", "-USR1", "polybar"]) + + +def sway(): + """Reload sway colors.""" + if shutil.which("swaymsg") and util.get_pid("sway"): + util.disown(["swaymsg", "reload"]) + + +def colors(cache_dir=CACHE_DIR): + """Reload colors. (Deprecated)""" + sequences = os.path.join(cache_dir, "sequences") + + logging.error("'wal -r' is deprecated: " + "Use 'cat %s' instead.", sequences) + + if os.path.isfile(sequences): + print("".join(util.read_file(sequences)), end="") + + +def env(xrdb_file=None, tty_reload=True): + """Reload environment.""" + xrdb(xrdb_file) + i3() + kitty() + sway() + polybar() + logging.info("Reloaded environment.") + tty(tty_reload) diff --git a/.local/lib/python3.9/site-packages/pywal/scripts/__pycache__/gtk_reload.cpython-39.pyc b/.local/lib/python3.9/site-packages/pywal/scripts/__pycache__/gtk_reload.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69b93c35e54dcbcb86e6b4297d9e16427e46d3ca GIT binary patch literal 890 zcmZ`&%TC-d6t$DgFoXdWb<<_k4V^_31QjZXzC=TXN&yX{R!v()CUz%=Bu;GyIwM%o zPv{50vQob&>W&q^&{eNz%0sGZ%O|?dJ@LKgIAnU-MKC`8yokPA2wj-q_Gm%y9F|%K zpeRDaHpSG+aD?BX;=Y5JHCVvNOlDL26vNY@j(NUEg*A_8gEqgRsKFYikVCCq)R`Fm za(8o*W!}y}r=su{Je5dZYEKJKvP=-_z3RPQ@N~*@rhM1!rCfQHV(Kpg2)sxbB*4C8 zUn(x)-JD_tjgySCLIY2cK8v-0a~^c&+@q8ysmE0@r#*5=ct-Xz=JDdHhDA7LTk<|H zNaiU~$%L(Vsn(@h34%mcMUw83qVEgY4?YW7`04}Cw`fh&p3UuxV-de$-M-n z(ALoZ5O%xU-A`U$AH?IXR!m!09bT8cGk{(H5(6tS)T;q@AP3eOEVT-t(LO%24DQ?K z_+%VA#*TCA1XKGM#SQ8JHjgpj#4$Q+og2{`AbN9nxBIWO(QFKd$KCM7%ecF?zOfnZ zu3s9@dt05!+J@32yH5}5MtBIKM(wrDjc}_Mhi?I+DWXLl^FlLOL{pS#5`!{1(UCiH zf{i)XRt!oO-TR+M9jk7R2>r+y%5>iGR8NJY+qeW5BQ=N|`tCK8eb8Q%-a(d}9E zmjlH$dsvd>04!Iqe*_uhE2V-P`TcTGyEoyi(X|bLtUGuHH%C*N-=Wj2C*qijB#xzV zpq|>uOCfbArI2-_l+bhSu&-Q?(np2ff=NSZt>%JO8GCAMR5Jih%ffA#Ej(kl+&{vR B`vw32 literal 0 HcmV?d00001 diff --git a/.local/lib/python3.9/site-packages/pywal/scripts/gtk_reload.py b/.local/lib/python3.9/site-packages/pywal/scripts/gtk_reload.py new file mode 100644 index 00000000..e4c2bdf2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/scripts/gtk_reload.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python2 +""" +Small Python 2 script to reload GTK2 themes. + +This uses Python2 since this requires 'send_clientmessage_toall()' +which isn't available in Python 3. + +Original source: https://crunchbang.org/forums/viewtopic.php?id=39646 +""" +try: + import gtk +except ImportError: + print("[ERROR] gtk_reload: GTK reload requires PyGTK.") + exit(1) + + +def gtk_reload(): + """Reload GTK2 themes.""" + events = gtk.gdk.Event(gtk.gdk.CLIENT_EVENT) + data = gtk.gdk.atom_intern("_GTK_READ_RCFILES", False) + events.data_format = 8 + events.send_event = True + events.message_type = data + events.send_clientmessage_toall() + + +gtk_reload() diff --git a/.local/lib/python3.9/site-packages/pywal/sequences.py b/.local/lib/python3.9/site-packages/pywal/sequences.py new file mode 100644 index 00000000..b42c3b79 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/sequences.py @@ -0,0 +1,88 @@ +""" +Send sequences to all open terminals. +""" +import glob +import logging +import os + +from .settings import CACHE_DIR, OS +from . import util + + +def set_special(index, color, iterm_name="h", alpha=100): + """Convert a hex color to a special sequence.""" + if OS == "Darwin": + return "\033]P%s%s\033\\" % (iterm_name, color.strip("#")) + + if index in [11, 708] and alpha != "100": + return "\033]%s;[%s]%s\033\\" % (index, alpha, color) + + return "\033]%s;%s\033\\" % (index, color) + + +def set_color(index, color): + """Convert a hex color to a text color sequence.""" + if OS == "Darwin" and index < 20: + return "\033]P%1x%s\033\\" % (index, color.strip("#")) + + return "\033]4;%s;%s\033\\" % (index, color) + + +def set_iterm_tab_color(color): + """Set iTerm2 tab/window color""" + return ("\033]6;1;bg;red;brightness;%s\a" + "\033]6;1;bg;green;brightness;%s\a" + "\033]6;1;bg;blue;brightness;%s\a") % (*util.hex_to_rgb(color),) + + +def create_sequences(colors, vte_fix=False): + """Create the escape sequences.""" + alpha = colors["alpha"] + + # Colors 0-15. + sequences = [set_color(index, colors["colors"]["color%s" % index]) + for index in range(16)] + + # Special colors. + # Source: https://goo.gl/KcoQgP + # 10 = foreground, 11 = background, 12 = cursor foregound + # 13 = mouse foreground, 708 = background border color. + sequences.extend([ + set_special(10, colors["special"]["foreground"], "g"), + set_special(11, colors["special"]["background"], "h", alpha), + set_special(12, colors["special"]["cursor"], "l"), + set_special(13, colors["special"]["foreground"], "l"), + set_special(17, colors["special"]["foreground"], "l"), + set_special(19, colors["special"]["background"], "l"), + set_color(232, colors["special"]["background"]), + set_color(256, colors["special"]["foreground"]) + ]) + + if not vte_fix: + sequences.extend( + set_special(708, colors["special"]["background"], "l", alpha) + ) + + if OS == "Darwin": + sequences += set_iterm_tab_color(colors["special"]["background"]) + + return "".join(sequences) + + +def send(colors, cache_dir=CACHE_DIR, to_send=True, vte_fix=False): + """Send colors to all open terminals.""" + if OS == "Darwin": + tty_pattern = "/dev/ttys00[0-9]*" + + else: + tty_pattern = "/dev/pts/[0-9]*" + + sequences = create_sequences(colors, vte_fix) + + # Writing to "/dev/pts/[0-9] lets you send data to open terminals. + if to_send: + for term in glob.glob(tty_pattern): + util.save_file(sequences, term) + + util.save_file(sequences, os.path.join(cache_dir, "sequences")) + logging.info("Set terminal colors.") diff --git a/.local/lib/python3.9/site-packages/pywal/settings.py b/.local/lib/python3.9/site-packages/pywal/settings.py new file mode 100644 index 00000000..4adb2497 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/settings.py @@ -0,0 +1,24 @@ +""" + '|| +... ... .... ... ... ... ... .... || + ||' || '|. | || || | '' .|| || + || | '|.| ||| ||| .|' || || + ||...' '| | | '|..'|' .||. + || .. | +'''' '' +Created by Dylan Araps. +""" + +import os +import platform + + +__version__ = "3.3.0" +__cache_version__ = "1.1.0" + + +HOME = os.getenv("HOME", os.getenv("USERPROFILE")) +CACHE_DIR = os.getenv("PYWAL_CACHE_DIR", os.path.join(HOME, ".cache", "wal")) +MODULE_DIR = os.path.dirname(__file__) +CONF_DIR = os.path.join(HOME, ".config", "wal") +OS = platform.uname()[0] diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors b/.local/lib/python3.9/site-packages/pywal/templates/colors new file mode 100644 index 00000000..228f4c89 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors @@ -0,0 +1,16 @@ +{color0} +{color1} +{color2} +{color3} +{color4} +{color5} +{color6} +{color7} +{color8} +{color9} +{color10} +{color11} +{color12} +{color13} +{color14} +{color15} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-kitty.conf b/.local/lib/python3.9/site-packages/pywal/templates/colors-kitty.conf new file mode 100644 index 00000000..f744418c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-kitty.conf @@ -0,0 +1,20 @@ +foreground {foreground} +background {background} +cursor {cursor} + +color0 {color0} +color8 {color8} +color1 {color1} +color9 {color9} +color2 {color2} +color10 {color10} +color3 {color3} +color11 {color11} +color4 {color4} +color12 {color12} +color5 {color5} +color13 {color13} +color6 {color6} +color14 {color14} +color7 {color7} +color15 {color15} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-konsole.colorscheme b/.local/lib/python3.9/site-packages/pywal/templates/colors-konsole.colorscheme new file mode 100644 index 00000000..c44d36a2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-konsole.colorscheme @@ -0,0 +1,63 @@ +[Background] +Color={background.rgb} + +[BackgroundIntense] +Color={background.rgb} + +[Color0] +Color={color0.rgb} + +[Color0Intense] +Color={color8.rgb} + +[Color1] +Color={color1.rgb} + +[Color1Intense] +Color={color9.rgb} + +[Color2] +Color={color2.rgb} + +[Color2Intense] +Color={color10.rgb} + +[Color3] +Color={color3.rgb} + +[Color3Intense] +Color={color11.rgb} + +[Color4] +Color={color4.rgb} + +[Color4Intense] +Color={color12.rgb} + +[Color5] +Color={color5.rgb} + +[Color5Intense] +Color={color13.rgb} + +[Color6] +Color={color6.rgb} + +[Color6Intense] +Color={color14.rgb} + +[Color7] +Color={color7.rgb} + +[Color7Intense] +Color={color15.rgb} + +[Foreground] +Color={foreground.rgb} + +[ForegroundIntense] +Color={foreground.rgb} + +[General] +Description=Colorscheme generated by wal +Opacity=1 diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-oomox b/.local/lib/python3.9/site-packages/pywal/templates/colors-oomox new file mode 100644 index 00000000..16823f7c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-oomox @@ -0,0 +1,17 @@ +NAME=wal +BG={color0.strip} +FG={color15.strip} +MENU_BG={color0.strip} +MENU_FG={color15.strip} +SEL_BG={color1.strip} +SEL_FG={color0.strip} +TXT_BG={color0.strip} +TXT_FG={color15.strip} +BTN_BG={color2.strip} +BTN_FG={color15.strip} +HDR_BTN_BG={color3.strip} +HDR_BTN_FG={color15.strip} +GTK3_GENERATE_DARK=True +ROUNDNESS=0 +SPACING=3 +GRADIENT=0.0 diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-putty.reg b/.local/lib/python3.9/site-packages/pywal/templates/colors-putty.reg new file mode 100644 index 00000000..fcd10a20 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-putty.reg @@ -0,0 +1,26 @@ +Windows Registry Editor Version 5.00 + +[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\wal] +"Colour0"="{foreground.rgb}" ; Default Foreground +"Colour1"="{foreground.rgb}" ; Default Bold Foreground +"Colour2"="{background.rgb}" ; Default Background +"Colour3"="{background.rgb}" ; Default Bold Background +"Colour4"="{background.rgb}" ; Cursor Text +"Colour5"="{cursor.rgb}" ; Cursor Color +"Colour6"="{color0.rgb}" ; ANSI Black +"Colour7"="{color8.rgb}" ; ANSI Black Bold +"Colour8"="{color1.rgb}" ; ANSI Red +"Colour9"="{color9.rgb}" ; ANSI Red Bold +"Colour10"="{color2.rgb}" ; ANSI Green +"Colour11"="{color10.rgb}" ; ANSI Green Bold +"Colour12"="{color3.rgb}" ; ANSI Yellow +"Colour13"="{color11.rgb}" ; ANSI Yellow Bold +"Colour14"="{color4.rgb}" ; ANSI Blue +"Colour15"="{color12.rgb}" ; ANSI Blue Bold +"Colour16"="{color5.rgb}" ; ANSI Magenta +"Colour17"="{color13.rgb}" ; ANSI Magenta Bold +"Colour18"="{color6.rgb}" ; ANSI Cyan +"Colour19"="{color14.rgb}" ; ANSI Cyan Bold +"Colour20"="{color7.rgb}" ; ANSI White +"Colour21"="{color15.rgb}" ; ANSI White Bold + diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-dark.rasi b/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-dark.rasi new file mode 100644 index 00000000..302d44f1 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-dark.rasi @@ -0,0 +1,161 @@ +* {{ + active-background: {color2}; + active-foreground: @foreground; + normal-background: @background; + normal-foreground: @foreground; + urgent-background: {color1}; + urgent-foreground: @foreground; + + alternate-active-background: @background; + alternate-active-foreground: @foreground; + alternate-normal-background: @background; + alternate-normal-foreground: @foreground; + alternate-urgent-background: @background; + alternate-urgent-foreground: @foreground; + + selected-active-background: {color1}; + selected-active-foreground: @foreground; + selected-normal-background: {color2}; + selected-normal-foreground: @foreground; + selected-urgent-background: {color3}; + selected-urgent-foreground: @foreground; + + background-color: @background; + background: {background}; + foreground: {foreground}; + border-color: @background; + spacing: 2; +}} + +#window {{ + background-color: @background; + border: 0; + padding: 2.5ch; +}} + +#mainbox {{ + border: 0; + padding: 0; +}} + +#message {{ + border: 2px 0px 0px; + border-color: @border-color; + padding: 1px; +}} + +#textbox {{ + text-color: @foreground; +}} + +#inputbar {{ + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +}} + +#textbox-prompt-colon {{ + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +}} + +#listview {{ + fixed-height: 0; + border: 2px 0px 0px; + border-color: @border-color; + spacing: 2px; + scrollbar: true; + padding: 2px 0px 0px; +}} + +#element {{ + border: 0; + padding: 1px; +}} + +#element.normal.normal {{ + background-color: @normal-background; + text-color: @normal-foreground; +}} + +#element.normal.urgent {{ + background-color: @urgent-background; + text-color: @urgent-foreground; +}} + +#element.normal.active {{ + background-color: @active-background; + text-color: @active-foreground; +}} + +#element.selected.normal {{ + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +}} + +#element.selected.urgent {{ + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +}} + +#element.selected.active {{ + background-color: @selected-active-background; + text-color: @selected-active-foreground; +}} + +#element.alternate.normal {{ + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +}} + +#element.alternate.urgent {{ + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +}} + +#element.alternate.active {{ + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +}} + +#scrollbar {{ + width: 4px; + border: 0; + handle-width: 8px; + padding: 0; +}} + +#sidebar {{ + border: 2px 0px 0px; + border-color: @border-color; +}} + +#button {{ + text-color: @normal-foreground; +}} + +#button.selected {{ + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +}} + +#inputbar {{ + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +}} + +#case-indicator {{ + spacing: 0; + text-color: @normal-foreground; +}} + +#entry {{ + spacing: 0; + text-color: @normal-foreground; +}} + +#prompt {{ + spacing: 0; + text-color: @normal-foreground; +}} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-light.rasi b/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-light.rasi new file mode 100644 index 00000000..d4f89af4 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-rofi-light.rasi @@ -0,0 +1,161 @@ +* {{ + active-background: {color2}; + active-foreground: @foreground; + normal-background: @background; + normal-foreground: @foreground; + urgent-background: {color1}; + urgent-foreground: @foreground; + + alternate-active-background: @background; + alternate-active-foreground: @foreground; + alternate-normal-background: @background; + alternate-normal-foreground: @foreground; + alternate-urgent-background: @background; + alternate-urgent-foreground: @foreground; + + selected-active-background: {color1}; + selected-active-foreground: @foreground; + selected-normal-background: {color2}; + selected-normal-foreground: @foreground; + selected-urgent-background: {color3}; + selected-urgent-foreground: @foreground; + + background-color: @background; + background: {foreground}; + foreground: {background}; + border-color: @background; + spacing: 2; +}} + +#window {{ + background-color: @background; + border: 0; + padding: 2.5ch; +}} + +#mainbox {{ + border: 0; + padding: 0; +}} + +#message {{ + border: 2px 0px 0px; + border-color: @border-color; + padding: 1px; +}} + +#textbox {{ + text-color: @foreground; +}} + +#inputbar {{ + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +}} + +#textbox-prompt-colon {{ + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +}} + +#listview {{ + fixed-height: 0; + border: 2px 0px 0px; + border-color: @border-color; + spacing: 2px; + scrollbar: true; + padding: 2px 0px 0px; +}} + +#element {{ + border: 0; + padding: 1px; +}} + +#element.normal.normal {{ + background-color: @normal-background; + text-color: @normal-foreground; +}} + +#element.normal.urgent {{ + background-color: @urgent-background; + text-color: @urgent-foreground; +}} + +#element.normal.active {{ + background-color: @active-background; + text-color: @active-foreground; +}} + +#element.selected.normal {{ + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +}} + +#element.selected.urgent {{ + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +}} + +#element.selected.active {{ + background-color: @selected-active-background; + text-color: @selected-active-foreground; +}} + +#element.alternate.normal {{ + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +}} + +#element.alternate.urgent {{ + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +}} + +#element.alternate.active {{ + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +}} + +#scrollbar {{ + width: 4px; + border: 0; + handle-width: 8px; + padding: 0; +}} + +#sidebar {{ + border: 2px 0px 0px; + border-color: @border-color; +}} + +#button {{ + text-color: @normal-foreground; +}} + +#button.selected {{ + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +}} + +#inputbar {{ + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +}} + +#case-indicator {{ + spacing: 0; + text-color: @normal-foreground; +}} + +#entry {{ + spacing: 0; + text-color: @normal-foreground; +}} + +#prompt {{ + spacing: 0; + text-color: @normal-foreground; +}} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-speedcrunch.json b/.local/lib/python3.9/site-packages/pywal/templates/colors-speedcrunch.json new file mode 100644 index 00000000..c9182c4e --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-speedcrunch.json @@ -0,0 +1,15 @@ +{{ + "cursor": "{cursor}", + "number": "{foreground}", + "parens": "{color13}", + "result": "{color12}", + "comment": "{color8}", + "matched": "{color4}", + "function": "{color1}", + "operator": "{color3}", + "variable": "{color2}", + "scrollbar": "{color3}", + "separator": "{color3}", + "background": "{background}", + "editorbackground": "{background}" +}} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-sway b/.local/lib/python3.9/site-packages/pywal/templates/colors-sway new file mode 100644 index 00000000..1f366a8d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-sway @@ -0,0 +1,21 @@ +set $wallpaper {wallpaper} + +set $background {background} +set $foreground {foreground} + +set $color0 {color0} +set $color1 {color1} +set $color2 {color2} +set $color3 {color3} +set $color4 {color4} +set $color5 {color5} +set $color6 {color6} +set $color7 {color7} +set $color8 {color8} +set $color9 {color9} +set $color10 {color10} +set $color11 {color11} +set $color12 {color12} +set $color13 {color13} +set $color14 {color14} +set $color15 {color15} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-tty.sh b/.local/lib/python3.9/site-packages/pywal/templates/colors-tty.sh new file mode 100644 index 00000000..5eb5487a --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-tty.sh @@ -0,0 +1,19 @@ +#!/bin/sh +[ "${{TERM:-none}}" = "linux" ] && \ + printf '%b' '\e]P0{color0.strip} + \e]P1{color1.strip} + \e]P2{color2.strip} + \e]P3{color3.strip} + \e]P4{color4.strip} + \e]P5{color5.strip} + \e]P6{color6.strip} + \e]P7{color7.strip} + \e]P8{color8.strip} + \e]P9{color9.strip} + \e]PA{color10.strip} + \e]PB{color11.strip} + \e]PC{color12.strip} + \e]PD{color13.strip} + \e]PE{color14.strip} + \e]PF{color15.strip} + \ec' diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dmenu.h b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dmenu.h new file mode 100644 index 00000000..aeab7a5f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dmenu.h @@ -0,0 +1,6 @@ +static const char *colors[SchemeLast][2] = {{ + /* fg bg */ + [SchemeNorm] = {{ "{color15}", "{color0}" }}, + [SchemeSel] = {{ "{color15}", "{color1}" }}, + [SchemeOut] = {{ "{color15}", "{color14}" }}, +}}; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dwm.h b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dwm.h new file mode 100644 index 00000000..ad0d1b07 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-dwm.h @@ -0,0 +1,18 @@ +static const char norm_fg[] = "{color15}"; +static const char norm_bg[] = "{color0}"; +static const char norm_border[] = "{color8}"; + +static const char sel_fg[] = "{color15}"; +static const char sel_bg[] = "{color2}"; +static const char sel_border[] = "{color15}"; + +static const char urg_fg[] = "{color15}"; +static const char urg_bg[] = "{color1}"; +static const char urg_border[] = "{color1}"; + +static const char *colors[][3] = {{ + /* fg bg border */ + [SchemeNorm] = {{ norm_fg, norm_bg, norm_border }}, // unfocused wins + [SchemeSel] = {{ sel_fg, sel_bg, sel_border }}, // the focused win + [SchemeUrg] = {{ urg_fg, urg_bg, urg_border }}, +}}; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-st.h b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-st.h new file mode 100644 index 00000000..fcf85388 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-st.h @@ -0,0 +1,34 @@ +const char *colorname[] = {{ + + /* 8 normal colors */ + [0] = "{color0}", /* black */ + [1] = "{color1}", /* red */ + [2] = "{color2}", /* green */ + [3] = "{color3}", /* yellow */ + [4] = "{color4}", /* blue */ + [5] = "{color5}", /* magenta */ + [6] = "{color6}", /* cyan */ + [7] = "{color7}", /* white */ + + /* 8 bright colors */ + [8] = "{color8}", /* black */ + [9] = "{color9}", /* red */ + [10] = "{color10}", /* green */ + [11] = "{color11}", /* yellow */ + [12] = "{color12}", /* blue */ + [13] = "{color13}", /* magenta */ + [14] = "{color14}", /* cyan */ + [15] = "{color15}", /* white */ + + /* special colors */ + [256] = "{background}", /* background */ + [257] = "{foreground}", /* foreground */ + [258] = "{cursor}", /* cursor */ +}}; + +/* Default colors (colorname index) + * foreground, background, cursor */ + unsigned int defaultbg = 0; + unsigned int defaultfg = 257; + unsigned int defaultcs = 258; + unsigned int defaultrcs= 258; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-tabbed.h b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-tabbed.h new file mode 100644 index 00000000..90623c54 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal-tabbed.h @@ -0,0 +1,6 @@ +static const char* selbgcolor = "{color0}"; +static const char* selfgcolor = "{color15}"; +static const char* normbgcolor = "{color2}"; +static const char* normfgcolor = "{color15}"; +static const char* urgbgcolor = "{color1}"; +static const char* urgfgcolor = "{color15}"; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-wal.vim b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal.vim new file mode 100644 index 00000000..1879c228 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-wal.vim @@ -0,0 +1,23 @@ +" Special +let wallpaper = "{wallpaper}" +let background = "{background}" +let foreground = "{foreground}" +let cursor = "{cursor}" + +" Colors +let color0 = "{color0}" +let color1 = "{color1}" +let color2 = "{color2}" +let color3 = "{color3}" +let color4 = "{color4}" +let color5 = "{color5}" +let color6 = "{color6}" +let color7 = "{color7}" +let color8 = "{color8}" +let color9 = "{color9}" +let color10 = "{color10}" +let color11 = "{color11}" +let color12 = "{color12}" +let color13 = "{color13}" +let color14 = "{color14}" +let color15 = "{color15}" diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors-waybar.css b/.local/lib/python3.9/site-packages/pywal/templates/colors-waybar.css new file mode 100644 index 00000000..c9cced6b --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors-waybar.css @@ -0,0 +1,20 @@ +@define-color foreground {foreground}; +@define-color background {background}; +@define-color cursor {cursor}; + +@define-color color0 {color0}; +@define-color color1 {color1}; +@define-color color2 {color2}; +@define-color color3 {color3}; +@define-color color4 {color4}; +@define-color color5 {color5}; +@define-color color6 {color6}; +@define-color color7 {color7}; +@define-color color8 {color8}; +@define-color color9 {color9}; +@define-color color10 {color10}; +@define-color color11 {color11}; +@define-color color12 {color12}; +@define-color color13 {color13}; +@define-color color14 {color14}; +@define-color color15 {color15}; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.Xresources b/.local/lib/python3.9/site-packages/pywal/templates/colors.Xresources new file mode 100644 index 00000000..018c1e61 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.Xresources @@ -0,0 +1,68 @@ +! X colors. +! Generated by 'wal' +*foreground: {foreground} +*background: {background} +*.foreground: {foreground} +*.background: {background} +emacs*foreground: {foreground} +emacs*background: {background} +URxvt*foreground: {foreground} +XTerm*foreground: {foreground} +UXTerm*foreground: {foreground} +URxvt*background: {background.alpha} +XTerm*background: {background} +UXTerm*background: {background} +URxvt*cursorColor: {cursor} +XTerm*cursorColor: {cursor} +UXTerm*cursorColor: {cursor} +URxvt*borderColor: {background.alpha} + +! Colors 0-15. +*.color0: {color0} +*color0: {color0} +*.color1: {color1} +*color1: {color1} +*.color2: {color2} +*color2: {color2} +*.color3: {color3} +*color3: {color3} +*.color4: {color4} +*color4: {color4} +*.color5: {color5} +*color5: {color5} +*.color6: {color6} +*color6: {color6} +*.color7: {color7} +*color7: {color7} +*.color8: {color8} +*color8: {color8} +*.color9: {color9} +*color9: {color9} +*.color10: {color10} +*color10: {color10} +*.color11: {color11} +*color11: {color11} +*.color12: {color12} +*color12: {color12} +*.color13: {color13} +*color13: {color13} +*.color14: {color14} +*color14: {color14} +*.color15: {color15} +*color15: {color15} + +! Black color that will not be affected by bold highlighting. +*.color66: {color0} +*color66: {color0} + +! Xclock colors. +XClock*foreground: {foreground} +XClock*background: {background} +XClock*majorColor: rgba:{color15.xrgba} +XClock*minorColor: rgba:{color15.xrgba} +XClock*hourColor: rgba:{color15.xrgba} +XClock*minuteColor: rgba:{color15.xrgba} +XClock*secondColor: rgba:{color15.xrgba} + +! Set depth to make transparency work. +URxvt*depth: 32 diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.css b/.local/lib/python3.9/site-packages/pywal/templates/colors.css new file mode 100644 index 00000000..f348e636 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.css @@ -0,0 +1,28 @@ +/* CSS variables + Generated by 'wal' */ +:root {{ + --wallpaper: url("{wallpaper}"); + + /* Special */ + --background: {background}; + --foreground: {foreground}; + --cursor: {cursor}; + + /* Colors */ + --color0: {color0}; + --color1: {color1}; + --color2: {color2}; + --color3: {color3}; + --color4: {color4}; + --color5: {color5}; + --color6: {color6}; + --color7: {color7}; + --color8: {color8}; + --color9: {color9}; + --color10: {color10}; + --color11: {color11}; + --color12: {color12}; + --color13: {color13}; + --color14: {color14}; + --color15: {color15}; +}} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.hs b/.local/lib/python3.9/site-packages/pywal/templates/colors.hs new file mode 100644 index 00000000..6ffa1a6d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.hs @@ -0,0 +1,37 @@ +--Place this file in your .xmonad/lib directory and import module Colors into .xmonad/xmonad.hs config +--The easy way is to create a soft link from this file to the file in .xmonad/lib using ln -s +--Then recompile and restart xmonad. + +module Colors + ( wallpaper + , background, foreground, cursor + , color0, color1, color2, color3, color4, color5, color6, color7 + , color8, color9, color10, color11, color12, color13, color14, color15 + ) where + +-- Shell variables +-- Generated by 'wal' +wallpaper="{wallpaper}" + +-- Special +background="{background}" +foreground="{foreground}" +cursor="{cursor}" + +-- Colors +color0="{color0}" +color1="{color1}" +color2="{color2}" +color3="{color3}" +color4="{color4}" +color5="{color5}" +color6="{color6}" +color7="{color7}" +color8="{color8}" +color9="{color9}" +color10="{color10}" +color11="{color11}" +color12="{color12}" +color13="{color13}" +color14="{color14}" +color15="{color15}" diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.json b/.local/lib/python3.9/site-packages/pywal/templates/colors.json new file mode 100644 index 00000000..537a534f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.json @@ -0,0 +1,28 @@ +{{ + "wallpaper": "{wallpaper}", + "alpha": "{alpha}", + + "special": {{ + "background": "{background}", + "foreground": "{foreground}", + "cursor": "{cursor}" + }}, + "colors": {{ + "color0": "{color0}", + "color1": "{color1}", + "color2": "{color2}", + "color3": "{color3}", + "color4": "{color4}", + "color5": "{color5}", + "color6": "{color6}", + "color7": "{color7}", + "color8": "{color8}", + "color9": "{color9}", + "color10": "{color10}", + "color11": "{color11}", + "color12": "{color12}", + "color13": "{color13}", + "color14": "{color14}", + "color15": "{color15}" + }} +}} diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.scss b/.local/lib/python3.9/site-packages/pywal/templates/colors.scss new file mode 100644 index 00000000..001be1f2 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.scss @@ -0,0 +1,26 @@ +// SCSS Variables +// Generated by 'wal' +$wallpaper: "{wallpaper}"; + +// Special +$background: {background}; +$foreground: {foreground}; +$cursor: {cursor}; + +// Colors +$color0: {color0}; +$color1: {color1}; +$color2: {color2}; +$color3: {color3}; +$color4: {color4}; +$color5: {color5}; +$color6: {color6}; +$color7: {color7}; +$color8: {color8}; +$color9: {color9}; +$color10: {color10}; +$color11: {color11}; +$color12: {color12}; +$color13: {color13}; +$color14: {color14}; +$color15: {color15}; diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.sh b/.local/lib/python3.9/site-packages/pywal/templates/colors.sh new file mode 100644 index 00000000..b607b93f --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.sh @@ -0,0 +1,36 @@ +# Shell variables +# Generated by 'wal' +wallpaper='{wallpaper}' + +# Special +background='{background}' +foreground='{foreground}' +cursor='{cursor}' + +# Colors +color0='{color0}' +color1='{color1}' +color2='{color2}' +color3='{color3}' +color4='{color4}' +color5='{color5}' +color6='{color6}' +color7='{color7}' +color8='{color8}' +color9='{color9}' +color10='{color10}' +color11='{color11}' +color12='{color12}' +color13='{color13}' +color14='{color14}' +color15='{color15}' + +# FZF colors +export FZF_DEFAULT_OPTS=" + $FZF_DEFAULT_OPTS + --color fg:7,bg:0,hl:1,fg+:232,bg+:1,hl+:255 + --color info:7,prompt:2,spinner:1,pointer:232,marker:1 +" + +# Fix LS_COLORS being unreadable. +export LS_COLORS="${{LS_COLORS}}:su=30;41:ow=30;42:st=30;44:" diff --git a/.local/lib/python3.9/site-packages/pywal/templates/colors.yml b/.local/lib/python3.9/site-packages/pywal/templates/colors.yml new file mode 100644 index 00000000..c3d6e47d --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/templates/colors.yml @@ -0,0 +1,24 @@ +wallpaper: "{wallpaper}" + +special: + background: "{background}" + foreground: "{foreground}" + cursor: "{cursor}" + +colors: + color0: "{color0}" + color1: "{color1}" + color2: "{color2}" + color3: "{color3}" + color4: "{color4}" + color5: "{color5}" + color6: "{color6}" + color7: "{color7}" + color8: "{color8}" + color9: "{color9}" + color10: "{color10}" + color11: "{color11}" + color12: "{color12}" + color13: "{color13}" + color14: "{color14}" + color15: "{color15}" diff --git a/.local/lib/python3.9/site-packages/pywal/theme.py b/.local/lib/python3.9/site-packages/pywal/theme.py new file mode 100644 index 00000000..fcd1dd15 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/theme.py @@ -0,0 +1,124 @@ +""" +Theme file handling. +""" +import logging +import os +import random +import sys + +from .settings import CONF_DIR, MODULE_DIR +from . import util + + +def list_out(): + """List all themes in a pretty format.""" + dark_themes = [theme.name.replace(".json", "") + for theme in list_themes()] + ligh_themes = [theme.name.replace(".json", "") + for theme in list_themes(dark=False)] + user_themes = [theme.name.replace(".json", "") + for theme in list_themes_user()] + + if user_themes: + print("\033[1;32mUser Themes\033[0m:") + print(" -", "\n - ".join(sorted(user_themes))) + + print("\033[1;32mDark Themes\033[0m:") + print(" -", "\n - ".join(sorted(dark_themes))) + + print("\033[1;32mLight Themes\033[0m:") + print(" -", "\n - ".join(sorted(ligh_themes))) + + print("\033[1;32mExtra\033[0m:") + print(" - random (select a random dark theme)") + print(" - random_dark (select a random dark theme)") + print(" - random_light (select a random light theme)") + + +def list_themes(dark=True): + """List all installed theme files.""" + dark = "dark" if dark else "light" + themes = os.scandir(os.path.join(MODULE_DIR, "colorschemes", dark)) + return [t for t in themes if os.path.isfile(t.path)] + + +def list_themes_user(): + """List user theme files.""" + themes = [*os.scandir(os.path.join(CONF_DIR, "colorschemes/dark/")), + *os.scandir(os.path.join(CONF_DIR, "colorschemes/light/"))] + return [t for t in themes if os.path.isfile(t.path)] + + +def terminal_sexy_to_wal(data): + """Convert terminal.sexy json schema to wal.""" + data["colors"] = {} + data["special"] = { + "foreground": data["foreground"], + "background": data["background"], + "cursor": data["color"][9] + } + + for i, color in enumerate(data["color"]): + data["colors"]["color%s" % i] = color + + return data + + +def parse(theme_file): + """Parse the theme file.""" + data = util.read_file_json(theme_file) + + if "wallpaper" not in data: + data["wallpaper"] = "None" + + if "alpha" not in data: + data["alpha"] = util.Color.alpha_num + + # Terminal.sexy format. + if "color" in data: + data = terminal_sexy_to_wal(data) + + return data + + +def get_random_theme(dark=True): + """Get a random theme file.""" + themes = [theme.path for theme in list_themes(dark)] + random.shuffle(themes) + return themes[0] + + +def file(input_file, light=False): + """Import colorscheme from json file.""" + util.create_dir(os.path.join(CONF_DIR, "colorschemes/light/")) + util.create_dir(os.path.join(CONF_DIR, "colorschemes/dark/")) + + theme_name = ".".join((input_file, "json")) + bri = "light" if light else "dark" + + user_theme_file = os.path.join(CONF_DIR, "colorschemes", bri, theme_name) + theme_file = os.path.join(MODULE_DIR, "colorschemes", bri, theme_name) + + # Find the theme file. + if input_file in ("random", "random_dark"): + theme_file = get_random_theme() + + elif input_file == "random_light": + theme_file = get_random_theme(light) + + elif os.path.isfile(user_theme_file): + theme_file = user_theme_file + + elif os.path.isfile(input_file): + theme_file = input_file + + # Parse the theme file. + if os.path.isfile(theme_file): + logging.info("Set theme to \033[1;37m%s\033[0m.", + os.path.basename(theme_file)) + return parse(theme_file) + + logging.error("No %s colorscheme file found.", bri) + logging.error("Try adding '-l' to set light themes.") + logging.error("Try removing '-l' to set dark themes.") + sys.exit(1) diff --git a/.local/lib/python3.9/site-packages/pywal/util.py b/.local/lib/python3.9/site-packages/pywal/util.py new file mode 100644 index 00000000..de8eb09c --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/util.py @@ -0,0 +1,186 @@ +""" +Misc helper functions. +""" +import colorsys +import json +import logging +import os +import subprocess +import sys + + +class Color: + """Color formats.""" + alpha_num = "100" + + def __init__(self, hex_color): + self.hex_color = hex_color + + def __str__(self): + return self.hex_color + + @property + def rgb(self): + """Convert a hex color to rgb.""" + return "%s,%s,%s" % (*hex_to_rgb(self.hex_color),) + + @property + def xrgba(self): + """Convert a hex color to xrdb rgba.""" + return hex_to_xrgba(self.hex_color) + + @property + def rgba(self): + """Convert a hex color to rgba.""" + return "rgba(%s,%s,%s,%s)" % (*hex_to_rgb(self.hex_color), + int(self.alpha_num)/100) + + @property + def alpha(self): + """Add URxvt alpha value to color.""" + return "[%s]%s" % (self.alpha_num, self.hex_color) + + @property + def octal(self): + """Export color in octal""" + return "%s%s" % ("#", oct(int(self.hex_color[1:], 16))[2:]) + + @property + def octal_strip(self): + """Strip '#' from octal color.""" + return oct(int(self.hex_color[1:], 16))[2:] + + @property + def strip(self): + """Strip '#' from color.""" + return self.hex_color[1:] + + +def read_file(input_file): + """Read data from a file and trim newlines.""" + with open(input_file, "r") as file: + return file.read().splitlines() + + +def read_file_json(input_file): + """Read data from a json file.""" + with open(input_file, "r") as json_file: + return json.load(json_file) + + +def read_file_raw(input_file): + """Read data from a file as is, don't strip + newlines or other special characters..""" + with open(input_file, "r") as file: + return file.readlines() + + +def save_file(data, export_file): + """Write data to a file.""" + create_dir(os.path.dirname(export_file)) + + try: + with open(export_file, "w") as file: + file.write(data) + except PermissionError: + logging.warning("Couldn't write to %s.", export_file) + + +def save_file_json(data, export_file): + """Write data to a json file.""" + create_dir(os.path.dirname(export_file)) + + with open(export_file, "w") as file: + json.dump(data, file, indent=4) + + +def create_dir(directory): + """Alias to create the cache dir.""" + os.makedirs(directory, exist_ok=True) + + +def setup_logging(): + """Logging config.""" + logging.basicConfig(format=("[%(levelname)s\033[0m] " + "\033[1;31m%(module)s\033[0m: " + "%(message)s"), + level=logging.INFO, + stream=sys.stdout) + logging.addLevelName(logging.ERROR, '\033[1;31mE') + logging.addLevelName(logging.INFO, '\033[1;32mI') + logging.addLevelName(logging.WARNING, '\033[1;33mW') + + +def hex_to_rgb(color): + """Convert a hex color to rgb.""" + return tuple(bytes.fromhex(color.strip("#"))) + + +def hex_to_xrgba(color): + """Convert a hex color to xrdb rgba.""" + col = color.lower().strip("#") + return "%s%s/%s%s/%s%s/ff" % (*col,) + + +def rgb_to_hex(color): + """Convert an rgb color to hex.""" + return "#%02x%02x%02x" % (*color,) + + +def darken_color(color, amount): + """Darken a hex color.""" + color = [int(col * (1 - amount)) for col in hex_to_rgb(color)] + return rgb_to_hex(color) + + +def lighten_color(color, amount): + """Lighten a hex color.""" + color = [int(col + (255 - col) * amount) for col in hex_to_rgb(color)] + return rgb_to_hex(color) + + +def blend_color(color, color2): + """Blend two colors together.""" + r1, g1, b1 = hex_to_rgb(color) + r2, g2, b2 = hex_to_rgb(color2) + + r3 = int(0.5 * r1 + 0.5 * r2) + g3 = int(0.5 * g1 + 0.5 * g2) + b3 = int(0.5 * b1 + 0.5 * b2) + + return rgb_to_hex((r3, g3, b3)) + + +def saturate_color(color, amount): + """Saturate a hex color.""" + r, g, b = hex_to_rgb(color) + r, g, b = [x/255.0 for x in (r, g, b)] + h, l, s = colorsys.rgb_to_hls(r, g, b) + s = amount + r, g, b = colorsys.hls_to_rgb(h, l, s) + r, g, b = [x*255.0 for x in (r, g, b)] + + return rgb_to_hex((int(r), int(g), int(b))) + + +def rgb_to_yiq(color): + """Sort a list of colors.""" + return colorsys.rgb_to_yiq(*hex_to_rgb(color)) + + +def disown(cmd): + """Call a system command in the background, + disown it and hide it's output.""" + subprocess.Popen(cmd, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + + +def get_pid(name): + """Check if process is running by name.""" + try: + subprocess.check_output(["pidof", "-s", name]) + except subprocess.CalledProcessError: + return False + + return True diff --git a/.local/lib/python3.9/site-packages/pywal/wallpaper.py b/.local/lib/python3.9/site-packages/pywal/wallpaper.py new file mode 100644 index 00000000..ba61e668 --- /dev/null +++ b/.local/lib/python3.9/site-packages/pywal/wallpaper.py @@ -0,0 +1,156 @@ +"""Set the wallpaper.""" +import ctypes +import logging +import os +import shutil +import subprocess +import urllib.parse + +from .settings import CACHE_DIR, HOME, OS +from . import util + + +def get_desktop_env(): + """Identify the current running desktop environment.""" + desktop = os.environ.get("XDG_CURRENT_DESKTOP") + if desktop: + return desktop + + desktop = os.environ.get("DESKTOP_SESSION") + if desktop: + return desktop + + desktop = os.environ.get("GNOME_DESKTOP_SESSION_ID") + if desktop: + return "GNOME" + + desktop = os.environ.get("MATE_DESKTOP_SESSION_ID") + if desktop: + return "MATE" + + desktop = os.environ.get("SWAYSOCK") + if desktop: + return "SWAY" + + desktop = os.environ.get("DESKTOP_STARTUP_ID") + if desktop and "awesome" in desktop: + return "AWESOME" + + return None + + +def xfconf(path, img): + """Call xfconf to set the wallpaper on XFCE.""" + util.disown(["xfconf-query", "--channel", "xfce4-desktop", + "--property", path, "--set", img]) + + +def set_wm_wallpaper(img): + """Set the wallpaper for non desktop environments.""" + if shutil.which("feh"): + util.disown(["feh", "--bg-fill", img]) + + elif shutil.which("nitrogen"): + util.disown(["nitrogen", "--set-zoom-fill", img]) + + elif shutil.which("bgs"): + util.disown(["bgs", "-z", img]) + + elif shutil.which("hsetroot"): + util.disown(["hsetroot", "-fill", img]) + + elif shutil.which("habak"): + util.disown(["habak", "-mS", img]) + + elif shutil.which("display"): + util.disown(["display", "-backdrop", "-window", "root", img]) + + else: + logging.error("No wallpaper setter found.") + return + + +def set_desktop_wallpaper(desktop, img): + """Set the wallpaper for the desktop environment.""" + desktop = str(desktop).lower() + + if "xfce" in desktop or "xubuntu" in desktop: + # XFCE requires two commands since they differ between versions. + xfconf("/backdrop/screen0/monitor0/image-path", img) + xfconf("/backdrop/screen0/monitor0/workspace0/last-image", img) + + elif "muffin" in desktop or "cinnamon" in desktop: + util.disown(["gsettings", "set", + "org.cinnamon.desktop.background", + "picture-uri", "file://" + urllib.parse.quote(img)]) + + elif "gnome" in desktop or "unity" in desktop: + util.disown(["gsettings", "set", + "org.gnome.desktop.background", + "picture-uri", "file://" + urllib.parse.quote(img)]) + + elif "mate" in desktop: + util.disown(["gsettings", "set", "org.mate.background", + "picture-filename", img]) + + elif "sway" in desktop: + util.disown(["swaymsg", "output", "*", "bg", img, "fill"]) + + elif "awesome" in desktop: + util.disown(["awesome-client", "gears.wallpaper.maximized(", img, ")"]) + + else: + set_wm_wallpaper(img) + + +def set_mac_wallpaper(img): + """Set the wallpaper on macOS.""" + db_file = "Library/Application Support/Dock/desktoppicture.db" + db_path = os.path.join(HOME, db_file) + subprocess.call(["sqlite3", db_path, "update data set value = '%s'" % img]) + + # Kill the dock to fix issues with cached wallpapers. + # macOS caches wallpapers and if a wallpaper is set that shares + # the filename with a cached wallpaper, the cached wallpaper is + # used instead. + subprocess.call(["killall", "Dock"]) + + +def set_win_wallpaper(img): + """Set the wallpaper on Windows.""" + # There's a different command depending on the architecture + # of Windows. We check the PROGRAMFILES envar since using + # platform is unreliable. + if "x86" in os.environ["PROGRAMFILES"]: + ctypes.windll.user32.SystemParametersInfoW(20, 0, img, 3) + else: + ctypes.windll.user32.SystemParametersInfoA(20, 0, img, 3) + + +def change(img): + """Set the wallpaper.""" + if not os.path.isfile(img): + return + + desktop = get_desktop_env() + + if OS == "Darwin": + set_mac_wallpaper(img) + + elif OS == "Windows": + set_win_wallpaper(img) + + else: + set_desktop_wallpaper(desktop, img) + + logging.info("Set the new wallpaper.") + + +def get(cache_dir=CACHE_DIR): + """Get the current wallpaper.""" + current_wall = os.path.join(cache_dir, "wal") + + if os.path.isfile(current_wall): + return util.read_file(current_wall)[0] + + return "None" diff --git a/.urlview b/.urlview index b28b8518..5d96dde7 100644 --- a/.urlview +++ b/.urlview @@ -1 +1 @@ -COMMAND brave +COMMAND qutebrowser diff --git a/.vim/.netrwhist b/.vim/.netrwhist deleted file mode 100644 index c58ff5a6..00000000 --- a/.vim/.netrwhist +++ /dev/null @@ -1,5 +0,0 @@ -let g:netrw_dirhistmax =10 -let g:netrw_dirhist_cnt =3 -let g:netrw_dirhist_1='/home/josuer08/Documents/josuexyz' -let g:netrw_dirhist_2='/home/josuer08/Documents/josuexyz/routes' -let g:netrw_dirhist_3='/home/josuer08' diff --git a/.vim/plugged/coc.nvim b/.vim/plugged/coc.nvim deleted file mode 160000 index 02a058c5..00000000 --- a/.vim/plugged/coc.nvim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 02a058c5fb563ce79bead38a49bbff21664c016e diff --git a/.vim/plugged/codi.vim b/.vim/plugged/codi.vim deleted file mode 160000 index 90efda30..00000000 --- a/.vim/plugged/codi.vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 90efda306a13d227808b079d1bb142e6b9e26f6d diff --git a/.vim/plugged/dracula b/.vim/plugged/dracula deleted file mode 160000 index ba00ac04..00000000 --- a/.vim/plugged/dracula +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ba00ac0432541811955e50b8420c25b22762c7c9 diff --git a/.vim/plugged/nerdcommenter b/.vim/plugged/nerdcommenter deleted file mode 160000 index 85750560..00000000 --- a/.vim/plugged/nerdcommenter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 85750560a680907c50c1545abc4dd0e0b2452ff4 diff --git a/.vim/plugged/nerdtree b/.vim/plugged/nerdtree deleted file mode 160000 index 14af8974..00000000 --- a/.vim/plugged/nerdtree +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 14af89743ac1c31ff9bb43682025eda50333a7d5 diff --git a/.vim/plugged/nerdtree-git-plugin b/.vim/plugged/nerdtree-git-plugin deleted file mode 160000 index 9e33a3fe..00000000 --- a/.vim/plugged/nerdtree-git-plugin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9e33a3fe8aa90f5ece2439f3b1b3a98fe7e35f85 diff --git a/.vim/plugged/vim-devicons b/.vim/plugged/vim-devicons deleted file mode 160000 index 383159d3..00000000 --- a/.vim/plugged/vim-devicons +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 383159d338024f09e4d56585a9301958b6fefad6 diff --git a/.vim/plugged/vim-gitgutter b/.vim/plugged/vim-gitgutter deleted file mode 160000 index 987a3335..00000000 --- a/.vim/plugged/vim-gitgutter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 987a33355ef424161fdbc4e5d625b5b5aed9704c diff --git a/.vim/plugged/vim-nerdtree-syntax-highlight b/.vim/plugged/vim-nerdtree-syntax-highlight deleted file mode 160000 index 1acc12aa..00000000 --- a/.vim/plugged/vim-nerdtree-syntax-highlight +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1acc12aa7f773ede38538293332905f1ba3fea6a diff --git a/.vim/plugged/yats.vim b/.vim/plugged/yats.vim deleted file mode 160000 index d4f95eeb..00000000 --- a/.vim/plugged/yats.vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d4f95eebcf8b765bf1198b57045e45f976ab0c19 diff --git a/vimusage.txt b/vimusage.txt deleted file mode 100644 index 2f1bf346..00000000 --- a/vimusage.txt +++ /dev/null @@ -1,167 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 1 SUMMARY - - - 1. The cursor is moved using either the arrow keys or the hjkl keys. - h (left) j (down) k (up) l (right) - - 2. To start Vim from the shell prompt type: vim FILENAME - - 3. To exit Vim type: :q! to trash all changes. - OR type: :wq to save the changes. - - 4. To delete the character at the cursor type: x - - 5. To insert or append text type: - i type inserted text insert before the cursor - A type appended text append after the line - -NOTE: Pressing will place you in Normal mode or will cancel - an unwanted and partially completed command. - -Now continue with lesson 2. - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 2 SUMMARY - - - 1. To delete from the cursor up to the next word type: dw - 2. To delete from the cursor to the end of a line type: d$ - 3. To delete a whole line type: dd - - 4. To repeat a motion prepend it with a number: 2w - 5. The format for a change command is: - operator [number] motion - where: - operator - is what to do, such as d for delete - [number] - is an optional count to repeat the motion - motion - moves over the text to operate on, such as w (word), - $ (to the end of line), etc. - - 6. To move to the start of the line use a zero: 0 - - 7. To undo previous actions, type: u (lowercase u) - To undo all the changes on a line, type: U (capital U) - To undo the undo's, type: CTRL-R - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 3 SUMMARY - - - 1. To put back text that has just been deleted, type p . This puts the - deleted text AFTER the cursor (if a line was deleted it will go on the - line below the cursor). - - 2. To replace the character under the cursor, type r and then the - character you want to have there. - - 3. The change operator allows you to change from the cursor to where the - motion takes you. eg. Type ce to change from the cursor to the end of - the word, c$ to change to the end of a line. - - 4. The format for change is: - - c [number] motion - -Now go on to the next lesson. - - - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 4 SUMMARY - - - 1. CTRL-G displays your location in the file and the file status. - G moves to the end of the file. - number G moves to that line number. - gg moves to the first line. - - 2. Typing / followed by a phrase searches FORWARD for the phrase. - Typing ? followed by a phrase searches BACKWARD for the phrase. - After a search type n to find the next occurrence in the same direction - or N to search in the opposite direction. - CTRL-O takes you back to older positions, CTRL-I to newer positions. - - 3. Typing % while the cursor is on a (,),[,],{, or } goes to its match. - - 4. To substitute new for the first old in a line type :s/old/new - To substitute new for all 'old's on a line type :s/old/new/g - To substitute phrases between two line #'s type :#,#s/old/new/g - To substitute all occurrences in the file type :%s/old/new/g - To ask for confirmation each time add 'c' :%s/old/new/gc - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 5 SUMMARY - - - 1. :!command executes an external command. - - Some useful examples are: - (Windows) (Unix) - :!dir :!ls - shows a directory listing. - :!del FILENAME :!rm FILENAME - removes file FILENAME. - - 2. :w FILENAME writes the current Vim file to disk with name FILENAME. - - 3. v motion :w FILENAME saves the Visually selected lines in file - FILENAME. - - 4. :r FILENAME retrieves disk file FILENAME and puts it below the - cursor position. - - 5. :r !dir reads the output of the dir command and puts it below the - cursor position. - - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 6 SUMMARY - - 1. Type o to open a line BELOW the cursor and start Insert mode. - Type O to open a line ABOVE the cursor. - - 2. Type a to insert text AFTER the cursor. - Type A to insert text after the end of the line. - - 3. The e command moves to the end of a word. - - 4. The y operator yanks (copies) text, p puts (pastes) it. - - 5. Typing a capital R enters Replace mode until is pressed. - - 6. Typing ":set xxx" sets the option "xxx". Some options are: - 'ic' 'ignorecase' ignore upper/lower case when searching - 'is' 'incsearch' show partial matches for a search phrase - 'hls' 'hlsearch' highlight all matching phrases - You can either use the long or the short option name. - - 7. Prepend "no" to switch an option off: :set noic - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 7 SUMMARY - - - 1. Type :help or press or to open a help window. - - 2. Type :help cmd to find help on cmd . - - 3. Type CTRL-W CTRL-W to jump to another window. - - 4. Type :q to close the help window. - - 5. Create a vimrc startup script to keep your preferred settings. - - 6. When typing a : command, press CTRL-D to see possible completions. - Press to use one completion. - - - - - - - -- 2.25.1

+ + + + + + +