From 4bd8275dcf13c8b244fc7bacdab5c8b22e4dfd7c Mon Sep 17 00:00:00 2001 From: coasteen Date: Fri, 24 Jul 2026 16:13:22 +0330 Subject: [PATCH] updates --- .zprofile | 41 +-- nvim/init.lua | 10 + nvim/lazy-lock.json | 40 +++ nvim/lua/config.lua | 89 +++++ nvim/lua/plugins/catppuccin/init.lua | 90 ++++++ nvim/lua/plugins/lazy/init.lua | 17 + nvim/lua/plugins/lazy/plugins.lua | 130 ++++++++ nvim/lua/plugins/lsp/init.lua | 305 ++++++++++++++++++ nvim/lua/plugins/lualine/init.lua | 50 +++ nvim/lua/plugins/nvim-tree/init.lua | 2 + nvim/lua/plugins/render-markdown/init.lua | 139 ++++++++ nvim/lua/plugins/telescope/init.lua | 3 + nvim/lua/plugins/treesitter/init.lua | 305 ++++++++++++++++++ nvim/lua/plugins/whichkey/init.lua | 2 + nvim/lua/status_line/init.lua | 102 ++++++ ...%.config%nvim%lua%plugins%lazy%plugins.lua | Bin 0 -> 2202 bytes ...g.vinegarhq.Sober%config%sober%config.json | Bin 0 -> 14840 bytes nvim/undo/%home%coast%.zprofile | Bin 0 -> 1801 bytes nvim/undo/%home%coast%Projects%cvox%main.c | Bin 0 -> 6442 bytes nvim/undo/%home%coast%Projects%cvox%makefile | Bin 0 -> 8554 bytes .../undo/%home%coast%Projects%cvox%platform.h | Bin 0 -> 597 bytes nvim/undo/%home%coast%Projects%cvox%wayland.c | Bin 0 -> 963 bytes nvim/undo/%home%coast%Projects%cvox%window.h | Bin 0 -> 5987 bytes ...%home%coast%Projects%cvox%window_wayland.c | Bin 0 -> 58874 bytes .../%home%coast%Projects%cvox%window_x11.c | Bin 0 -> 32902 bytes nvim/undo/%home%coast%Projects%cvox%x11.c | Bin 0 -> 717 bytes nvim/undo/%home%coast%Projects%ns%makefile | Bin 0 -> 4144 bytes nvim/undo/%home%coast%Projects%ns%src%main.c | Bin 0 -> 25199 bytes nvim/undo/%home%coast%Projects%ns%src%shell.c | Bin 0 -> 29854 bytes nvim/undo/%home%coast%Projects%ns%test.sh | Bin 0 -> 6463 bytes nvim/undo/%home%coast%medals.md | Bin 0 -> 88970 bytes 31 files changed, 1285 insertions(+), 40 deletions(-) create mode 100755 nvim/init.lua create mode 100755 nvim/lazy-lock.json create mode 100755 nvim/lua/config.lua create mode 100755 nvim/lua/plugins/catppuccin/init.lua create mode 100755 nvim/lua/plugins/lazy/init.lua create mode 100755 nvim/lua/plugins/lazy/plugins.lua create mode 100755 nvim/lua/plugins/lsp/init.lua create mode 100755 nvim/lua/plugins/lualine/init.lua create mode 100755 nvim/lua/plugins/nvim-tree/init.lua create mode 100755 nvim/lua/plugins/render-markdown/init.lua create mode 100755 nvim/lua/plugins/telescope/init.lua create mode 100755 nvim/lua/plugins/treesitter/init.lua create mode 100755 nvim/lua/plugins/whichkey/init.lua create mode 100755 nvim/lua/status_line/init.lua create mode 100644 nvim/undo/%home%coast%.config%nvim%lua%plugins%lazy%plugins.lua create mode 100644 nvim/undo/%home%coast%.var%app%org.vinegarhq.Sober%config%sober%config.json create mode 100644 nvim/undo/%home%coast%.zprofile create mode 100644 nvim/undo/%home%coast%Projects%cvox%main.c create mode 100644 nvim/undo/%home%coast%Projects%cvox%makefile create mode 100644 nvim/undo/%home%coast%Projects%cvox%platform.h create mode 100644 nvim/undo/%home%coast%Projects%cvox%wayland.c create mode 100644 nvim/undo/%home%coast%Projects%cvox%window.h create mode 100644 nvim/undo/%home%coast%Projects%cvox%window_wayland.c create mode 100644 nvim/undo/%home%coast%Projects%cvox%window_x11.c create mode 100644 nvim/undo/%home%coast%Projects%cvox%x11.c create mode 100644 nvim/undo/%home%coast%Projects%ns%makefile create mode 100644 nvim/undo/%home%coast%Projects%ns%src%main.c create mode 100644 nvim/undo/%home%coast%Projects%ns%src%shell.c create mode 100644 nvim/undo/%home%coast%Projects%ns%test.sh create mode 100644 nvim/undo/%home%coast%medals.md diff --git a/.zprofile b/.zprofile index be3dbf7..9b709a5 100755 --- a/.zprofile +++ b/.zprofile @@ -1,4 +1,5 @@ export TERM=xterm-256color +export PROTON_ENABLE_WAYLAND=1 grep --color=auto < /dev/null &>/dev/null && alias grep='grep --color=auto' export PATH="$HOME/.local/bin:$PATH" @@ -32,11 +33,6 @@ alias \ # startx=starth alias startx="dbus-run-session startx" -alias \ - elog="doas tail -f /var/log/emerge-fetch.log"\ - emerge="doas px emerge"\ - eu="doas etc-update" - alias pgrep="pgrep -a" alias qb=qbittorrent-nox alias s=ssh\ laptop @@ -106,38 +102,3 @@ noipv6(){ doas sysctl -w net.ipv6.conf.default.disable_ipv6=1 doas sysctl -w net.ipv6.conf.lo.disable_ipv6=1 } - -#PROXYCHAINS_IGNORE=( -# cd exit clear fg bg jobs history -# ssh scp sftp -# proxychains -#) -# -#autoload -U add-zsh-hook -# -#_proxychains_auto() { -# local cmd="$BUFFER" -# [[ -z "$cmd" ]] && return -# -# # get first word of command -# local first=${cmd%% *} -# -# # ignore listed commands -# for ignore in "${PROXYCHAINS_IGNORE[@]}"; do -# [[ "$first" == "$ignore" ]] && return -# done -# -# # sudo/doas handling -# if [[ "$cmd" == sudo\ * ]]; then -# BUFFER="sudo proxychains ${cmd#sudo }" -# elif [[ "$cmd" == doas\ * ]]; then -# BUFFER="doas proxychains ${cmd#doas }" -# else -# BUFFER="proxychains $cmd" -# fi -#} -# -#add-zsh-hook preexec _proxychains_auto -if test -z "$XDG_RUNTIME_DIR"; then - export XDG_RUNTIME_DIR=$(mktemp -d /tmp/$(id -u)-runtime-dir.XXX) -fi diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100755 index 0000000..ab02259 --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,10 @@ +require("plugins/lazy") +require("plugins/lsp") +require("plugins/nvim-tree") +require("plugins/telescope") +require("plugins/treesitter") +require("config") +require("plugins/render-markdown") +--require("status_line").setup() +require("plugins/lualine") +require("plugins/catppuccin") diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json new file mode 100755 index 0000000..f47b8d2 --- /dev/null +++ b/nvim/lazy-lock.json @@ -0,0 +1,40 @@ +{ + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, + "cmp-nvim-lua": { "branch": "main", "commit": "e3a22cb071eb9d6508a156306b102c45cd2d573d" }, + "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, + "cmp-spell": { "branch": "master", "commit": "694a4e50809d6d645c1ea29015dad0c293f019d6" }, + "cmp-vsnip": { "branch": "main", "commit": "989a8a73c44e926199bfd05fa7a516d51f2d2752" }, + "comfy-line-numbers.nvim": { "branch": "main", "commit": "9adedbaf1f410cdaacf4fb2ca8eb44f3d5f6d010" }, + "fterm.nvim": { "branch": "master", "commit": "d1320892cc2ebab472935242d9d992a2c9570180" }, + "gentoo-syntax": { "branch": "master", "commit": "1b3a81ec62e5c843245dc431be0fe072add7eca8" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lsp_signature.nvim": { "branch": "master", "commit": "b7ace9ddb1640ce266012a45a672dfdaedfa5ec6" }, + "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, + "mason.nvim": { "branch": "main", "commit": "16ba83bfc8a25f52bb545134f5bee082b195c460" }, + "mini.nvim": { "branch": "main", "commit": "d5e6f5b843f1d813d9c4bfb242b751dc5ab6f8ae" }, + "moonfly": { "branch": "master", "commit": "261664f92ed51cf0c077555b2d4b2530307eac17" }, + "none-ls-extras.nvim": { "branch": "main", "commit": "27681d797a26f1b4d6119296df42f5204c88a2dc" }, + "none-ls.nvim": { "branch": "main", "commit": "01f8e62ea11603e59ad9ff7afcfa94fd183f76d6" }, + "nvim": { "branch": "main", "commit": "0303a7208dba448c459767486a38a6ec05c4216b" }, + "nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" }, + "nvim-cmp": { "branch": "main", "commit": "a1d504892f2bc56c2e79b65c6faded2fd21f3eca" }, + "nvim-lspconfig": { "branch": "master", "commit": "229b79051b380377664edc4cbd534930154921a1" }, + "nvim-numbertoggle": { "branch": "main", "commit": "c5c0d305aee8532b5515914a08396b9154394c55" }, + "nvim-toggler": { "branch": "main", "commit": "467808600882fd6c9e33b9dbc4889b1b80cfd917" }, + "nvim-tree.lua": { "branch": "master", "commit": "07f541fcaa4a5ae019598240362449ab7e9812b3" }, + "nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" }, + "nvim-web-devicons": { "branch": "master", "commit": "dfbfaa967a6f7ec50789bead7ef87e336c1fa63c" }, + "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, + "presence.nvim": { "branch": "main", "commit": "87c857a56b7703f976d3a5ef15967d80508df6e6" }, + "render-markdown.nvim": { "branch": "main", "commit": "5adf0895310c1904e5abfaad40a2baad7fe44a07" }, + "telescope-undo.nvim": { "branch": "main", "commit": "928d0c2dc9606e01e2cc547196f48d2eaecf58e5" }, + "telescope.nvim": { "branch": "master", "commit": "d90956833d7c27e73c621a61f20b29fdb7122709" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "twilight.nvim": { "branch": "main", "commit": "664e752f4a219801265cc3fc18782b457b58c1e1" }, + "typst-preview.nvim": { "branch": "master", "commit": "325036ee145ca51d9efb145c09ac16bce3bc8b7d" }, + "vim-closetag": { "branch": "master", "commit": "d0a562f8bdb107a50595aefe53b1a690460c3822" }, + "vim-vsnip": { "branch": "master", "commit": "9bcfabea653abdcdac584283b5097c3f8760abaa" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/nvim/lua/config.lua b/nvim/lua/config.lua new file mode 100755 index 0000000..9835875 --- /dev/null +++ b/nvim/lua/config.lua @@ -0,0 +1,89 @@ +local opt = vim.opt +local map = vim.keymap.set +local g = vim.g + +--filetypes +vim.cmd("autocmd BufRead,BufNewFile *.m set filetype=objc") + +g.mapleader = " " + +opt.shiftwidth = 4 +opt.tabstop = 4 +opt.softtabstop = 4 +opt.smarttab = true +opt.smartindent = true + +opt.undofile = true +opt.undodir = vim.fn.stdpath("config") .. "/undo" + +opt.number = true +opt.relativenumber = true + +opt.fillchars = "eob: " + +g.loaded_netrw = 1 +g.loaded_netrwPlugin = 1 + +opt.termguicolors = true + +opt.spell = false +opt.spelllang = { "en_us" } + +opt.shell = "/usr/bin/zsh" + + +vim.lsp.handlers["textDocument/hover"] = function(err, result, ctx, config) + config = config or {} + config.border = "single" + return vim.lsp.handlers.hover(err, result, ctx, config) +end +vim.diagnostic.config({ float = { border = "single" } }) + +map("n", "u", ":Telescope") +map("n", "t", ":tabnew") +map("n", "", ":tabn") +map("n", "", ":tabp") +map("n", "", ":bw") + +map("n", ".", vim.diagnostic.open_float) + +map("n", "=", "=") + +map("n", "x", "!chmod +x %") + +vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), + callback = function(ev) + vim.bo[ev.buf].omnifunc = "v:lua.vim.lsp.omnifunc" + + local opts = { buffer = ev.buf } + map("n", "K", function() + vim.lsp.buf.hover({ border = "single" }) + end, opts) + map("n", "gi", vim.lsp.buf.implementation, opts) + map("n", "", vim.lsp.buf.signature_help, opts) + map("n", "wa", vim.lsp.buf.add_workspace_folder, opts) + map("n", "wr", vim.lsp.buf.remove_workspace_folder, opts) + map("n", "wl", function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, opts) + map("n", "D", vim.lsp.buf.type_definition, opts) + map("n", "rn", vim.lsp.buf.rename, opts) + map({ "n", "v" }, "ca", vim.lsp.buf.code_action, opts) + map("n", "gr", vim.lsp.buf.references, opts) + map("n", "f", function() + vim.lsp.buf.format({ async = true }) + end, opts) + end, +}) + +local builtin = require("telescope.builtin") +map("n", "ff", builtin.find_files, {}) +map("n", "fg", builtin.live_grep, {}) +map("n", "fb", builtin.buffers, {}) +map("n", "fh", builtin.help_tags, {}) +local treeapi = require("nvim-tree.api") +map("n", "e", treeapi.tree.toggle, {}) + +map("n", "", 'lua require("FTerm").toggle()') +map("t", "", 'lua require("FTerm").toggle()') diff --git a/nvim/lua/plugins/catppuccin/init.lua b/nvim/lua/plugins/catppuccin/init.lua new file mode 100755 index 0000000..c497b4d --- /dev/null +++ b/nvim/lua/plugins/catppuccin/init.lua @@ -0,0 +1,90 @@ +local colors = { + black = "#121212", + white = "#ffffff", + gray = "#7e7e7e", + light_gray = "#d0d0d0", + dark_gray = "#505050", + red = "#ff5c57", + green = "#5af78e", + yellow = "#f3f99d", + blue = "#57c7ff", + purple = "#d183e8", + cyan = "#9aedfe", +} + +local highlights = { + Normal = { fg = colors.light_gray, bg = "NONE" }, + NormalNC = { fg = colors.light_gray, bg = "NONE" }, + SignColumn = { bg = "NONE" }, + FoldColumn = { bg = "NONE" }, + Comment = { fg = colors.gray, italic = true }, + Constant = { fg = colors.blue }, + String = { fg = colors.green }, + Identifier = { fg = colors.blue }, + Function = { fg = colors.purple }, + Statement = { fg = colors.yellow }, + PreProc = { fg = colors.cyan }, + Type = { fg = colors.blue }, + Special = { fg = colors.red }, + Underlined = { fg = colors.white, underline = true }, + Todo = { fg = colors.black, bg = colors.yellow, bold = true }, + StatusLine = { fg = colors.white, bg = "NONE" }, + StatusLineNC = { fg = colors.light_gray, bg = "NONE" }, + NvimTreeNormal = { fg = colors.light_gray, bg = "NONE" }, + NvimTreeNormalNC = { fg = colors.light_gray, bg = "NONE" }, + NvimTreeWinSeparator = { fg = colors.dark_gray, bg = "NONE" }, + NvimTreeFolderName = { fg = colors.blue, bold = true }, + NvimTreeOpenedFolderName = { fg = colors.green, bold = true }, + NvimTreeRootFolder = { fg = colors.yellow, bold = true, underline = true }, + NvimTreeFileIcon = { fg = colors.light_gray }, + NvimTreeGitDirty = { fg = colors.red }, + NvimTreeGitStaged = { fg = colors.green }, + NvimTreeGitNew = { fg = colors.blue }, + NvimTreeGitRenamed = { fg = colors.purple }, + NvimTreeGitDeleted = { fg = colors.red }, + CursorLine = { bg = colors.dark_gray }, +} + +for group, opts in pairs(highlights) do + vim.api.nvim_set_hl(0, group, opts) +end + +local inactive_style = { fg = colors.dark_gray, bg = "NONE" } + +require("lualine").setup({ + options = { + theme = { + normal = { + a = { fg = colors.black, bg = colors.white, gui = "bold" }, + b = { fg = colors.white, bg = colors.dark_gray }, + c = { fg = colors.white, bg = "NONE" }, + }, + inactive = { + a = { fg = colors.dark_gray, bg = "NONE", gui = "bold" }, + b = inactive_style, + c = inactive_style, + }, + }, + }, +}) + +require("nvim-tree").setup({ + view = { + width = 30, + side = "left", + }, + renderer = { + highlight_git = true, + root_folder_modifier = ":~", + icons = { + show = { + file = true, + folder = true, + git = true, + }, + }, + }, + filters = { + dotfiles = false, + }, +}) diff --git a/nvim/lua/plugins/lazy/init.lua b/nvim/lua/plugins/lazy/init.lua new file mode 100755 index 0000000..497cf69 --- /dev/null +++ b/nvim/lua/plugins/lazy/init.lua @@ -0,0 +1,17 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +local lazy_plugins = require("plugins/lazy/plugins") + +require("lazy").setup(lazy_plugins) +require("mason").setup() diff --git a/nvim/lua/plugins/lazy/plugins.lua b/nvim/lua/plugins/lazy/plugins.lua new file mode 100755 index 0000000..4a3c91a --- /dev/null +++ b/nvim/lua/plugins/lazy/plugins.lua @@ -0,0 +1,130 @@ +return { + "andweeb/presence.nvim", + "catppuccin/nvim", + "neovim/nvim-lspconfig", + "gentoo/gentoo-syntax", + "williamboman/mason.nvim", + { + "nvim-telescope/telescope.nvim", + tag = "0.1.5", + dependencies = { "nvim-lua/plenary.nvim" }, + }, + { + "nvim-tree/nvim-tree.lua", + dependencies = { "nvim-tree/nvim-web-devicons" }, + }, + { + "folke/todo-comments.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + opts = {}, + }, + { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + }, + { + "nvimtools/none-ls.nvim", + dependencies = { + "nvimtools/none-ls-extras.nvim", + }, + }, + { + "windwp/nvim-autopairs", + event = "InsertEnter", + }, + { + "hrsh7th/nvim-cmp", + dependencies = { + "neovim/nvim-lspconfig", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-nvim-lua", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-cmdline", + "hrsh7th/cmp-vsnip", + "hrsh7th/vim-vsnip", + }, + }, + { + "ray-x/lsp_signature.nvim", + event = "VeryLazy", + }, + { + "nvim-treesitter/nvim-treesitter", + lazy = false, + priority = 1000, + build = ":TSUpdate", + }, + "f3fora/cmp-spell", + { + "debugloop/telescope-undo.nvim", + dependencies = { + { + "nvim-telescope/telescope.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + }, + }, + }, + { + "chomosuke/typst-preview.nvim", + lazy = false, + version = "1.*", + opts = {}, + }, + { + "MeanderingProgrammer/render-markdown.nvim", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "nvim-mini/mini.nvim", + }, + opts = {}, + }, + "sitiom/nvim-numbertoggle", + "mluders/comfy-line-numbers.nvim", + { + "folke/which-key.nvim", + event = "VeryLazy", + init = function() + vim.o.timeout = true + vim.o.timeoutlen = 300 + end, + }, + { + "folke/twilight.nvim", + opts = { + dimming = { + alpha = 0.35, + color = { "Normal" }, + term_bg = "#282828", + inactive = false, + }, + context = 15, + treesitter = true, + expand = { + "function", + "method", + "table", + "if_statement", + }, + exclude = { + "md", + }, + }, + }, + "nguyenvukhang/nvim-toggler", + "alvan/vim-closetag", + { + "numtostr/fterm.nvim", + border = "double", + dimensions = { + height = 0.9, + width = 0.9, + }, + }, + { + "bluz71/vim-moonfly-colors", + name = "moonfly", + lazy = false, + priority = 1000, + }, +} diff --git a/nvim/lua/plugins/lsp/init.lua b/nvim/lua/plugins/lsp/init.lua new file mode 100755 index 0000000..c5245d9 --- /dev/null +++ b/nvim/lua/plugins/lsp/init.lua @@ -0,0 +1,305 @@ +local lsp = require("lspconfig") +local cmp = require("cmp") + +vim.lsp.config('*', { + root_markers = { '.git' }, +}) + +vim.diagnostic.config({ + virtual_text = true, + severity_sort = true, + float = { + style = 'minimal', + border = 'rounded', + source = 'if_many', + header = '', + prefix = '', + }, + signs = { + text = { + [vim.diagnostic.severity.ERROR] = '✘', + [vim.diagnostic.severity.WARN] = '▲', + [vim.diagnostic.severity.HINT] = '⚑', + [vim.diagnostic.severity.INFO] = '»', + }, + }, +}) + +local orig = vim.lsp.util.open_floating_preview +---@diagnostic disable-next-line: duplicate-set-field +function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) + opts = opts or {} + opts.border = opts.border or 'rounded' + opts.max_width = opts.max_width or 80 + opts.max_height = opts.max_height or 24 + opts.wrap = opts.wrap ~= false + return orig(contents, syntax, opts, ...) +end + +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('my.lsp', {}), + callback = function(args) + local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) + local buf = args.buf + local map = function(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = buf }) end + + map('n', 'K', vim.lsp.buf.hover) + map('n', 'gd', vim.lsp.buf.definition) + map('n', 'gD', vim.lsp.buf.declaration) + map('n', 'gi', vim.lsp.buf.implementation) + map('n', 'go', vim.lsp.buf.type_definition) + map('n', 'gr', vim.lsp.buf.references) + map('n', 'gs', vim.lsp.buf.signature_help) + map('n', 'gl', vim.diagnostic.open_float) + map('n', '', vim.lsp.buf.rename) + map({ 'n', 'x' }, '', function() vim.lsp.buf.format({ async = true }) end) + map('n', '', vim.lsp.buf.code_action) + + if client:supports_method('textDocument/documentHighlight') then + local highlight_augroup = vim.api.nvim_create_augroup('my.lsp.highlight', { clear = false }) + vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { + buffer = buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { + buffer = buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + end + + local excluded_filetypes = { php = true, c = true, cpp = true } + if not client:supports_method('textDocument/willSaveWaitUntil') + and client:supports_method('textDocument/formatting') + and not excluded_filetypes[vim.bo[buf].filetype] + then + vim.api.nvim_create_autocmd('BufWritePre', { + group = vim.api.nvim_create_augroup('my.lsp.format', { clear = false }), + buffer = buf, + callback = function() + vim.lsp.buf.format({ bufnr = buf, id = client.id, timeout_ms = 1000 }) + end, + }) + end + end, +}) + +require("nvim-autopairs").setup({}) +require("lsp_signature").setup({ hint_enable = false }) + +cmp.setup({ + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ select = true }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end, { "i", "s" }), + }), + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered() + }, + sources = cmp.config.sources({ + { name = "nvim_lsp", keyword_length = 1 }, + { name = "vsnip" }, + }, { + { name = "buffer", keyword_length = 1 }, + { name = "spell" }, + }), +}) + +local caps = require("cmp_nvim_lsp").default_capabilities() + +vim.lsp.config['luals'] = { + cmd = { 'lua-language-server' }, + filetypes = { 'lua' }, + root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' }, + capabilities = caps, + settings = { + Lua = { + runtime = { version = 'LuaJIT' }, + diagnostics = { globals = { 'vim' } }, + workspace = { + checkThirdParty = false, + library = vim.list_extend( + vim.api.nvim_get_runtime_file('', true), + { '/home/tony/repos/oxwm/templates' } + ), + }, + telemetry = { enable = false }, + }, + }, +} + +vim.lsp.config['cssls'] = { + cmd = { 'vscode-css-language-server', '--stdio' }, + filetypes = { 'css', 'scss', 'less' }, + root_markers = { 'package.json', '.git' }, + capabilities = caps, + settings = { + css = { validate = true }, + scss = { validate = true }, + less = { validate = true }, + }, +} + +vim.lsp.config['phpls'] = { + cmd = { 'intelephense', '--stdio' }, + filetypes = { 'php' }, + root_markers = { 'composer.json', '.git' }, + capabilities = caps, + settings = { + intelephense = { + files = { maxSize = 5000000 }, + }, + }, +} + +vim.lsp.config['ts_ls'] = { + cmd = { 'typescript-language-server', '--stdio' }, + filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx' }, + root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json', '.git' }, + capabilities = caps, + settings = { + completions = { completeFunctionCalls = true }, + }, +} + +vim.lsp.config['zls'] = { + cmd = { 'zls' }, + filetypes = { 'zig', 'zir' }, + root_markers = { 'zls.json', 'build.zig', '.git' }, + capabilities = caps, + settings = { + zls = { + enable_build_on_save = true, + build_on_save_step = "install", + warn_style = false, + enable_snippets = true, + } + } +} + +vim.lsp.config['nil_ls'] = { + cmd = { 'nil' }, + filetypes = { 'nix' }, + root_markers = { 'flake.nix', 'default.nix', '.git' }, + capabilities = caps, + settings = { + ['nil'] = { + formatting = { + command = { "nixpkgs-fmt" } + } + } + } +} + +vim.lsp.config['rust_analyzer'] = { + cmd = { 'rust-analyzer' }, + filetypes = { 'rust' }, + root_markers = { 'Cargo.toml', 'rust-project.json', '.git' }, + capabilities = caps, + settings = { + ['rust-analyzer'] = { + cargo = { allFeatures = true }, + formatting = { command = { "rustfmt" } }, + }, + }, +} + +vim.lsp.config['clangd'] = { + cmd = { 'clangd', '--background-index', '--clang-tidy' }, + filetypes = { 'c', 'cpp', 'objc', 'objcpp' }, + root_markers = { 'compile_commands.json', '.clangd', 'configure.ac', 'Makefile', '.git' }, + capabilities = caps, +} + +vim.lsp.config['c3lsp'] = { + cmd = { 'c3-lsp' }, + filetypes = { 'c3' }, + root_markers = { 'project.json', '.git' }, + capabilities = caps, +} + +vim.lsp.config['serve_d'] = { + cmd = { 'serve-d' }, + filetypes = { 'd' }, + root_markers = { 'dub.sdl', 'dub.json', '.git' }, + capabilities = caps, +} + +vim.lsp.config['jsonls'] = { + cmd = { 'vscode-json-languageserver', '--stdio' }, + filetypes = { 'json', 'jsonc' }, + root_markers = { 'package.json', '.git', 'config.jsonc' }, + capabilities = caps, +} + +vim.lsp.config['hls'] = { + cmd = { 'haskell-language-server-wrapper', '--lsp' }, + filetypes = { 'haskell', 'lhaskell' }, + root_markers = { 'stack.yaml', 'cabal.project', 'package.yaml', '*.cabal', 'hie.yaml', '.git' }, + capabilities = caps, + settings = { + haskell = { + formattingProvider = 'fourmolu', + plugin = { semanticTokens = { globalOn = false } }, + }, + }, +} + +vim.lsp.config['gopls'] = { + cmd = { 'gopls' }, + filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' }, + root_markers = { 'go.mod', 'go.work', '.git' }, + capabilities = caps, + settings = { + gopls = { + analyses = { unusedparams = false, ST1003 = false, ST1000 = false }, + staticcheck = true, + }, + }, +} + +vim.lsp.config['templ'] = { + cmd = { 'templ', 'lsp' }, + filetypes = { 'templ' }, + root_markers = { 'go.mod', '.git' }, + capabilities = caps, +} + +vim.filetype.add({ + extension = { + h = 'c', + c3 = 'c3', + d = 'd', + templ = 'templ', + }, +}) + +---@diagnostic disable-next-line: invisible +for name, _ in pairs(vim.lsp.config._configs) do + if name ~= '*' then + vim.lsp.enable(name) + end +end diff --git a/nvim/lua/plugins/lualine/init.lua b/nvim/lua/plugins/lualine/init.lua new file mode 100755 index 0000000..d23b323 --- /dev/null +++ b/nvim/lua/plugins/lualine/init.lua @@ -0,0 +1,50 @@ +local lualine = require("lualine") + +lualine.setup({ + options = { + icons_enabled = true, + theme = "auto", + component_separators = { left = "|", right = "|" }, + section_separators = { left = "", right = "" }, + disabled_filetypes = { + statusline = {}, + winbar = {}, + }, + ignore_focus = {}, + always_divide_middle = true, + globalstatus = false, + refresh = { + statusline = 1000, + tabline = 1000, + winbar = 1000, + }, + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { + { "branch", color = { bg = "NONE" } }, + { "diff", color = { bg = "NONE" } }, + { "diagnostics", color = { bg = "NONE" } } + }, + lualine_c = { { "filename", color = { bg = "NONE" } } }, + lualine_x = { + { "encoding", color = { bg = "NONE" } }, + { "fileformat", color = { bg = "NONE" } }, + { "filetype", color = { bg = "NONE" } } + }, + lualine_y = {}, + lualine_z = { "location" }, + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { { "filename", color = { bg = "NONE" } } }, + lualine_x = { { "location", color = { bg = "NONE" } } }, + lualine_y = {}, + lualine_z = {}, + }, + tabline = {}, + winbar = {}, + inactive_winbar = {}, + extensions = {}, +}) diff --git a/nvim/lua/plugins/nvim-tree/init.lua b/nvim/lua/plugins/nvim-tree/init.lua new file mode 100755 index 0000000..c7174f7 --- /dev/null +++ b/nvim/lua/plugins/nvim-tree/init.lua @@ -0,0 +1,2 @@ +local tree = require("nvim-tree") +tree.setup() \ No newline at end of file diff --git a/nvim/lua/plugins/render-markdown/init.lua b/nvim/lua/plugins/render-markdown/init.lua new file mode 100755 index 0000000..ab078ce --- /dev/null +++ b/nvim/lua/plugins/render-markdown/init.lua @@ -0,0 +1,139 @@ +require("render-markdown").setup({ + link = { + -- Turn on / off inline link icon rendering. + enabled = true, + -- Additional modes to render links. + render_modes = false, + -- How to handle footnote links, start with a '^'. + footnote = { + -- Turn on / off footnote rendering. + enabled = true, + -- Replace value with superscript equivalent. + superscript = true, + -- Added before link content. + prefix = "", + -- Added after link content. + suffix = "", + }, + -- Inlined with 'image' elements. + image = "󰥶 ", + -- Inlined with 'email_autolink' elements. + email = "󰀓 ", + -- Fallback icon for 'inline_link' and 'uri_autolink' elements. + hyperlink = "󰌹 ", + -- Applies to the inlined icon as a fallback. + highlight = "RenderMarkdownLink", + -- Applies to WikiLink elements. + wiki = { + icon = "󱗖 ", + body = function() + return nil + end, + highlight = "RenderMarkdownWikiLink", + }, + -- Define custom destination patterns so icons can quickly inform you of what a link + -- contains. Applies to 'inline_link', 'uri_autolink', and wikilink nodes. When multiple + -- patterns match a link the one with the longer pattern is used. + -- The key is for healthcheck and to allow users to change its values, value type below. + -- | pattern | matched against the destination text | + -- | icon | gets inlined before the link text | + -- | kind | optional determines how pattern is checked | + -- | | pattern | @see :h lua-patterns, is the default if not set | + -- | | suffix | @see :h vim.endswith() | + -- | priority | optional used when multiple match, uses pattern length if empty | + -- | highlight | optional highlight for 'icon', uses fallback highlight if empty | + custom = { + web = { pattern = "^http", icon = "󰖟 " }, + github = { pattern = "github%.com", icon = "󰊤 " }, + gitlab = { pattern = "gitlab%.com", icon = "󰮠 " }, + stackoverflow = { pattern = "stackoverflow%.com", icon = "󰓌 " }, + wikipedia = { pattern = "wikipedia%.org", icon = "󰖬 " }, + youtube = { pattern = "youtube%.com", icon = "󰗃 " }, + }, + }, + callout = { + -- Callouts are a special instance of a 'block_quote' that start with a 'shortcut_link'. + -- The key is for healthcheck and to allow users to change its values, value type below. + -- | raw | matched against the raw text of a 'shortcut_link', case insensitive | + -- | rendered | replaces the 'raw' value when rendering | + -- | highlight | highlight for the 'rendered' text and quote markers | + -- | quote_icon | optional override for quote.icon value for individual callout | + -- | category | optional metadata useful for filtering | + + note = { raw = "[!NOTE]", rendered = "󰋽 Note", highlight = "RenderMarkdownInfo" }, + tip = { raw = "[!TIP]", rendered = "󰌶 Tip", highlight = "RenderMarkdownSuccess" }, + important = { raw = "[!IMPORTANT]", rendered = "󰅾 Important", highlight = "RenderMarkdownHint" }, + warning = { raw = "[!WARNING]", rendered = "󰀪 Warning", highlight = "RenderMarkdownWarn" }, + caution = { raw = "[!CAUTION]", rendered = "󰳦 Caution", highlight = "RenderMarkdownError" }, + abstract = { raw = "[!ABSTRACT]", rendered = "󰨸 Abstract", highlight = "RenderMarkdownInfo" }, + summary = { raw = "[!SUMMARY]", rendered = "󰨸 Summary", highlight = "RenderMarkdownInfo" }, + tldr = { raw = "[!TLDR]", rendered = "󰨸 Tldr", highlight = "RenderMarkdownInfo" }, + info = { raw = "[!INFO]", rendered = "󰋽 Info", highlight = "RenderMarkdownInfo" }, + todo = { raw = "[!TODO]", rendered = "󰗡 Todo", highlight = "RenderMarkdownInfo" }, + hint = { raw = "[!HINT]", rendered = "󰌶 Hint", highlight = "RenderMarkdownSuccess" }, + success = { raw = "[!SUCCESS]", rendered = "󰄬 Success", highlight = "RenderMarkdownSuccess" }, + check = { raw = "[!CHECK]", rendered = "󰄬 Check", highlight = "RenderMarkdownSuccess" }, + done = { raw = "[!DONE]", rendered = "󰄬 Done", highlight = "RenderMarkdownSuccess" }, + question = { raw = "[!QUESTION]", rendered = "󰘥 Question", highlight = "RenderMarkdownWarn" }, + help = { raw = "[!HELP]", rendered = "󰘥 Help", highlight = "RenderMarkdownWarn" }, + faq = { raw = "[!FAQ]", rendered = "󰘥 Faq", highlight = "RenderMarkdownWarn" }, + attention = { raw = "[!ATTENTION]", rendered = "󰀪 Attention", highlight = "RenderMarkdownWarn" }, + failure = { raw = "[!FAILURE]", rendered = "󰅖 Failure", highlight = "RenderMarkdownError" }, + fail = { raw = "[!FAIL]", rendered = "󰅖 Fail", highlight = "RenderMarkdownError" }, + missing = { raw = "[!MISSING]", rendered = "󰅖 Missing", highlight = "RenderMarkdownError" }, + danger = { raw = "[!DANGER]", rendered = "󱐌 Danger", highlight = "RenderMarkdownError" }, + error = { raw = "[!ERROR]", rendered = "󱐌 Error", highlight = "RenderMarkdownError" }, + bug = { raw = "[!BUG]", rendered = "󰨰 Bug", highlight = "RenderMarkdownError" }, + example = { raw = "[!EXAMPLE]", rendered = "󰉹 Example", highlight = "RenderMarkdownHint" }, + quote = { raw = "[!QUOTE]", rendered = "󱆨 Quote", highlight = "RenderMarkdownQuote" }, + cite = { raw = "[!CITE]", rendered = "󱆨 Cite", highlight = "RenderMarkdownQuote" }, + }, + checkbox = { + enabled = true, + render_modes = false, + bullet = false, + right_pad = 1, + unchecked = { + icon = "󰄱 ", + highlight = "RenderMarkdownUnchecked", + scope_highlight = nil, + }, + checked = { + icon = "󰱒 ", + highlight = "RenderMarkdownChecked", + scope_highlight = nil, + }, + custom = { + todo = { raw = "[-]", rendered = "󰥔 ", highlight = "RenderMarkdownTodo", scope_highlight = nil }, + }, + }, + bullet = { + enabled = true, + render_modes = false, + icons = { "●", "○", "◆", "◇" }, + ordered_icons = function(ctx) + local value = vim.trim(ctx.value) + local index = tonumber(value:sub(1, #value - 1)) + return ("%d."):format(index > 1 and index or ctx.index) + end, + left_pad = 0, + right_pad = 0, + highlight = "RenderMarkdownBullet", + scope_highlight = {}, + }, + quote = { icon = "▋" }, + anti_conceal = { + enabled = true, + -- Which elements to always show, ignoring anti conceal behavior. Values can either be + -- booleans to fix the behavior or string lists representing modes where anti conceal + -- behavior will be ignored. Valid values are: + -- head_icon, head_background, head_border, code_language, code_background, code_border, + -- dash, bullet, check_icon, check_scope, quote, table_border, callout, link, sign + ignore = { + code_background = true, + sign = true, + }, + above = 0, + below = 0, + }, +}) diff --git a/nvim/lua/plugins/telescope/init.lua b/nvim/lua/plugins/telescope/init.lua new file mode 100755 index 0000000..2cb0f77 --- /dev/null +++ b/nvim/lua/plugins/telescope/init.lua @@ -0,0 +1,3 @@ +local tel = require("telescope") +tel.setup({}) +tel.load_extension("undo") diff --git a/nvim/lua/plugins/treesitter/init.lua b/nvim/lua/plugins/treesitter/init.lua new file mode 100755 index 0000000..ffc8b17 --- /dev/null +++ b/nvim/lua/plugins/treesitter/init.lua @@ -0,0 +1,305 @@ +local lsp = require("lspconfig") +local cmp = require("cmp") + +vim.lsp.config('*', { + root_markers = { '.git' }, +}) + +vim.diagnostic.config({ + virtual_text = true, + severity_sort = true, + float = { + style = 'minimal', + border = 'rounded', + source = 'if_many', + header = '', + prefix = '', + }, + signs = { + text = { + [vim.diagnostic.severity.ERROR] = '✘', + [vim.diagnostic.severity.WARN] = '▲', + [vim.diagnostic.severity.HINT] = '⚑', + [vim.diagnostic.severity.INFO] = '»', + }, + }, +}) + +local orig = vim.lsp.util.open_floating_preview +---@diagnostic disable-next-line: duplicate-set-field +function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) + opts = opts or {} + opts.border = opts.border or 'rounded' + opts.max_width = opts.max_width or 80 + opts.max_height = opts.max_height or 24 + opts.wrap = opts.wrap ~= false + return orig(contents, syntax, opts, ...) +end + +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('my.lsp', {}), + callback = function(args) + local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) + local buf = args.buf + local map = function(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = buf }) end + + map('n', 'K', vim.lsp.buf.hover) + map('n', 'gd', vim.lsp.buf.definition) + map('n', 'gD', vim.lsp.buf.declaration) + map('n', 'gi', vim.lsp.buf.implementation) + map('n', 'go', vim.lsp.buf.type_definition) + map('n', 'gr', vim.lsp.buf.references) + map('n', 'gs', vim.lsp.buf.signature_help) + map('n', 'gl', vim.diagnostic.open_float) + map('n', '', vim.lsp.buf.rename) + map({ 'n', 'x' }, '', function() vim.lsp.buf.format({ async = true }) end) + map('n', '', vim.lsp.buf.code_action) + + if client:supports_method('textDocument/documentHighlight') then + local highlight_augroup = vim.api.nvim_create_augroup('my.lsp.highlight', { clear = false }) + vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { + buffer = buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { + buffer = buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + end + + local excluded_filetypes = { php = true, c = true, cpp = true } + if not client:supports_method('textDocument/willSaveWaitUntil') + and client:supports_method('textDocument/formatting') + and not excluded_filetypes[vim.bo[buf].filetype] + then + vim.api.nvim_create_autocmd('BufWritePre', { + group = vim.api.nvim_create_augroup('my.lsp.format', { clear = false }), + buffer = buf, + callback = function() + vim.lsp.buf.format({ bufnr = buf, id = client.id, timeout_ms = 1000 }) + end, + }) + end + end, +}) + +require("nvim-autopairs").setup({}) +require("lsp_signature").setup({ hint_enable = false }) + +cmp.setup({ + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ select = true }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end, { "i", "s" }), + }), + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered() + }, + sources = cmp.config.sources({ + { name = "nvim_lsp", keyword_length = 1 }, + { name = "vsnip" }, + }, { + { name = "buffer", keyword_length = 1 }, + { name = "spell" }, + }), +}) + +local caps = require("cmp_nvim_lsp").default_capabilities() + +vim.lsp.config['luals'] = { + cmd = { 'lua-language-server' }, + filetypes = { 'lua' }, + root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' }, + capabilities = caps, + settings = { + Lua = { + runtime = { version = 'LuaJIT' }, + diagnostics = { globals = { 'vim' } }, + workspace = { + checkThirdParty = false, + library = vim.list_extend( + vim.api.nvim_get_runtime_file('', true), + { '/home/tony/repos/oxwm/templates' } + ), + }, + telemetry = { enable = false }, + }, + }, +} + +vim.lsp.config['cssls'] = { + cmd = { 'vscode-css-language-server', '--stdio' }, + filetypes = { 'css', 'scss', 'less' }, + root_markers = { 'package.json', '.git' }, + capabilities = caps, + settings = { + css = { validate = true }, + scss = { validate = true }, + less = { validate = true }, + }, +} + +vim.lsp.config['phpls'] = { + cmd = { 'intelephense', '--stdio' }, + filetypes = { 'php' }, + root_markers = { 'composer.json', '.git' }, + capabilities = caps, + settings = { + intelephense = { + files = { maxSize = 5000000 }, + }, + }, +} + +vim.lsp.config['ts_ls'] = { + cmd = { 'typescript-language-server', '--stdio' }, + filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx' }, + root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json', '.git' }, + capabilities = caps, + settings = { + completions = { completeFunctionCalls = true }, + }, +} + +vim.lsp.config['zls'] = { + cmd = { 'zls' }, + filetypes = { 'zig', 'zir' }, + root_markers = { 'zls.json', 'build.zig', '.git' }, + capabilities = caps, + settings = { + zls = { + enable_build_on_save = true, + build_on_save_step = "install", + warn_style = false, + enable_snippets = true, + } + } +} + +vim.lsp.config['nil_ls'] = { + cmd = { 'nil' }, + filetypes = { 'nix' }, + root_markers = { 'flake.nix', 'default.nix', '.git' }, + capabilities = caps, + settings = { + ['nil'] = { + formatting = { + command = { "nixpkgs-fmt" } + } + } + } +} + +vim.lsp.config['rust_analyzer'] = { + cmd = { 'rust-analyzer' }, + filetypes = { 'rust' }, + root_markers = { 'Cargo.toml', 'rust-project.json', '.git' }, + capabilities = caps, + settings = { + ['rust-analyzer'] = { + cargo = { allFeatures = true }, + formatting = { command = { "rustfmt" } }, + }, + }, +} + +vim.lsp.config['clangd'] = { + cmd = { 'clangd', '--background-index', '--clang-tidy' }, + filetypes = { 'c', 'cpp', 'objc', 'objcpp' }, + root_markers = { 'compile_commands.json', '.clangd', 'configure.ac', 'Makefile', '.git' }, + capabilities = caps, +} + +vim.lsp.config['c3lsp'] = { + cmd = { 'c3-lsp' }, + filetypes = { 'c3' }, + root_markers = { 'project.json', '.git' }, + capabilities = caps, +} + +vim.lsp.config['serve_d'] = { + cmd = { 'serve-d' }, + filetypes = { 'd' }, + root_markers = { 'dub.sdl', 'dub.json', '.git' }, + capabilities = caps, +} + +vim.lsp.config['jsonls'] = { + cmd = { 'vscode-json-languageserver', '--stdio' }, + filetypes = { 'json', 'jsonc' }, + root_markers = { 'package.json', '.git', 'config.jsonc' }, + capabilities = caps, +} + +vim.lsp.config['hls'] = { + cmd = { 'haskell-language-server-wrapper', '--lsp' }, + filetypes = { 'haskell', 'lhaskell' }, + root_markers = { 'stack.yaml', 'cabal.project', 'package.yaml', '*.cabal', 'hie.yaml', '.git' }, + capabilities = caps, + settings = { + haskell = { + formattingProvider = 'fourmolu', + plugin = { semanticTokens = { globalOn = false } }, + }, + }, +} + +vim.lsp.config['gopls'] = { + cmd = { 'gopls' }, + filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' }, + root_markers = { 'go.mod', 'go.work', '.git' }, + capabilities = caps, + settings = { + gopls = { + analyses = { unusedparams = false, ST1003 = false, ST1000 = false }, + staticcheck = true, + }, + }, +} + +vim.lsp.config['templ'] = { + cmd = { 'templ', 'lsp' }, + filetypes = { 'templ' }, + root_markers = { 'go.mod', '.git' }, + capabilities = caps, +} + +vim.filetype.add({ + extension = { + h = 'c', + c3 = 'c3', + d = 'd', + templ = 'templ', + }, +}) + +---@diagnostic disable-next-line: invisible +for name, _ in pairs(vim.lsp.config._configs) do + if name ~= '*' then + vim.lsp.enable(name) + end +end diff --git a/nvim/lua/plugins/whichkey/init.lua b/nvim/lua/plugins/whichkey/init.lua new file mode 100755 index 0000000..e6b9906 --- /dev/null +++ b/nvim/lua/plugins/whichkey/init.lua @@ -0,0 +1,2 @@ +local wk = require("which-key") +wk.setup({}) diff --git a/nvim/lua/status_line/init.lua b/nvim/lua/status_line/init.lua new file mode 100755 index 0000000..904684b --- /dev/null +++ b/nvim/lua/status_line/init.lua @@ -0,0 +1,102 @@ +local colors = { + foreground = "#ebdbb2", + pink = "#b16286", + red = "#cc241d", + green = "#98971a", + yellow = "#d79921", + orange = "#d65d0e", + magenta = "#b16286", + cyan = "#458588", + bg_darken = "#1d2021", + dark_text = "#1d2021", +} + +local M = {} + +function M.setup() + vim.cmd("hi StatusBackground guifg=" .. colors.foreground .. " guibg=" .. colors.bg_darken) + vim.cmd("hi Moden guifg=" .. colors.dark_text .. " guibg=" .. colors.pink .. " gui=bold") + vim.cmd("hi Modei guifg=" .. colors.dark_text .. " guibg=" .. colors.green .. " gui=bold") + vim.cmd("hi Modev guifg=" .. colors.dark_text .. " guibg=" .. colors.yellow .. " gui=bold") + vim.cmd("hi Modet guifg=" .. colors.dark_text .. " guibg=" .. colors.orange .. " gui=bold") + vim.cmd("hi Modec guifg=" .. colors.dark_text .. " guibg=" .. colors.magenta .. " gui=bold") + vim.cmd("hi Moder guifg=" .. colors.dark_text .. " guibg=" .. colors.red .. " gui=bold") + vim.cmd("hi Filetype guifg=" .. colors.cyan .. " guibg=" .. colors.bg_darken .. " gui=bold") + vim.cmd("hi Position guifg=" .. colors.yellow .. " guibg=" .. colors.bg_darken .. " gui=bold") + vim.cmd("hi GitBranch guifg=" .. colors.orange .. " guibg=" .. colors.bg_darken .. " gui=bold") + vim.cmd("hi GitDiff guifg=" .. colors.green .. " guibg=" .. colors.bg_darken) + vim.cmd("hi GitDiffDel guifg=" .. colors.red .. " guibg=" .. colors.bg_darken) + vim.cmd("hi Separator guifg=" .. colors.foreground .. " guibg=" .. colors.bg_darken) + vim.cmd("hi LSPError guifg=" .. colors.red .. " guibg=" .. colors.bg_darken) + vim.cmd("hi LSPWarn guifg=" .. colors.yellow .. " guibg=" .. colors.bg_darken) + vim.cmd("hi LSPInfo guifg=" .. colors.cyan .. " guibg=" .. colors.bg_darken) + vim.cmd("hi LSPOk guifg=" .. colors.green .. " guibg=" .. colors.bg_darken) + + vim.o.statusline = table.concat({ + "%{%v:lua.themeStatuslineMode()%} ", + "%f ", + "%{%v:lua.themeGitBranch()%} ", + "%{%v:lua.themeGitDiff()%} ", + "%{%v:lua.themeLSP()%} ", + "%=", + "%{%v:lua.themeStatuslineFiletype()%} ", + "%{%v:lua.themeStatuslinePosition()%}", + }) +end + +function themeStatuslineMode() + local mode = vim.fn.mode() + local mode_highlight = "Mode" .. mode:sub(1, 1) + return string.format("%%#%s# %s %%#StatusBackground#", mode_highlight, mode:upper()) +end + +function themeStatuslineFiletype() + return string.format("%%#Filetype# %s %%#Separator#│%%#StatusBackground#", vim.bo.filetype) +end + +function themeStatuslinePosition() + local row, col = unpack(vim.api.nvim_win_get_cursor(0)) + return string.format("%%#Position# %03d:%02d ", row, col) +end + +function themeGitBranch() + local branch = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD 2>/dev/null")[1] or "" + if branch ~= "" then + return string.format("%%#GitBranch# %s %%#Separator#│%%#StatusBackground#", branch) + end + return "" +end + +function themeGitDiff() + local diff = vim.fn.systemlist("git diff --shortstat 2>/dev/null")[1] or "" + local added, removed = diff:match("(%d+) insertions?"), diff:match("(%d+) deletions?") + added = added or "0" + removed = removed or "0" + if diff ~= "" then + return string.format("%%#GitDiff#+%s %%#GitDiffDel#-%s %%#StatusBackground#", added, removed) + end + return "" +end + +function themeLSP() + local errors = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.ERROR }) + local warns = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.WARN }) + local info = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.INFO }) + local hints = #vim.diagnostic.get(0, { severity = vim.diagnostic.severity.HINT }) + local str = "" + if errors > 0 then + str = str .. string.format("%%#LSPError#E:%d ", errors) + end + if warns > 0 then + str = str .. string.format("%%#LSPWarn#W:%d ", warns) + end + if info > 0 then + str = str .. string.format("%%#LSPInfo#I:%d ", info) + end + if hints > 0 then + str = str .. string.format("%%#LSPOk#H:%d ", hints) + end + return str +end + +return M diff --git a/nvim/undo/%home%coast%.config%nvim%lua%plugins%lazy%plugins.lua b/nvim/undo/%home%coast%.config%nvim%lua%plugins%lazy%plugins.lua new file mode 100644 index 0000000000000000000000000000000000000000..8b1e02015e6fbbda60eaebec44be15209d77d483 GIT binary patch literal 2202 zcmWH`%$*;a=aT=Ff!Q;zSfKwu2-*Bn46|0pk4!0&6vkx9)1WLa@yGAwP&Yic4iDL2xPlG_M#o{GQB&NPfd1Jc319J zSN3LAP0wKY;2!{gfCCp!Z~=+O)e>ARUl1Tm`~YNe;DCfr7(sklnbp}nv%S63_+Yj| z>aMKJjC@3V6%iR#yR!e2>q%4nwRWoU@7>|wt}mUvf9>4AetK*3FaO;9@E@(~AH4JZ z5C488e)qTEsnu#v(a+I2Dx9F-XKe+p?pM3PfBgH?XgyPF|G{=RX|K3A#?!d@50RZsK|c!Vm?($DD)s@Pzb>dmdKnD?%U{VdnwdpVC~ zc5r1+Xe~qWQo=j22oeovnTZWq96;}%p`SBnzyvJC zC+Jr>3JBpNCGy*m?t^V`O8G#YGiagnvIUAc+^HNQ<&*CLs+u8akvYoapN7d**W zrdUTX5z0)2taHF3o`ftrDP-!YV)Ul5p=L56+9o31|KJBe16M+FU)$7F=JP8|fM}#g~(1|zb?Xb$_^9@3LyOU?xQBxMfnAP=Fh&fH*MN4|r zjAq*-84je^xa2qXRfnF-cBJ~EosyQt*w)UPu3dvT8Ub=KyEWA&6ntr)_Xn|?o7&Hy z?M=vK+4SmZK8R$Hw$*?zBY$A@)VAxb-zq}LI{KTCqMiy(@nkzzLD7>mDygXSQBr%v zOp&QPh{_>Vw`+#`s%ayu&<<3RD%zyjCk0Bf8e{7DQrRz-ofJsVXse}S9xj{dsZM&a zYoi69c+iR#DK^Q6KZ%ac?X>u4Jm?=K2g;ZQJwEk{s3PGoR0RrmrS%tMeQ6ahkc$&_lf zJy#}$zhT0c`wE5Q9S)*>mo$B>zn2u_?NA#1&yH;-MO*WCF%cxERK0 zkghH;JwxSh*&Dx(sx8>S^(=0QTn{|%-=5%dCcr|-w-;aqoUqyRxG|}c`%tRrSQ3~8 zLccQ*I&;`&07hpim|0w`BH$_lo;3z0&{PpH3E^WC0h{>Q^AaZa)zp00x_J;%9PQi# z?de#FQ{wZpYe=}>-Vv2?s?Rb@LXKuJM;yBmV%g^VFKeErO_^rA2$I)UFKi$*pUCeN zesG%)b_501IZj@*>5bKIJaIHx8JR=gE3_bzlG&HncVb0F>iktPyo~kJG4!e&2s-rpSbDq|yc~Y);05W7)VWmx z0K(aBJ^y^moYD}ve4TpUV`nrkcj#gxoV*Zcm6^{faw2KWL!~5X5Wno@kmY-mxx+{8 zj8*Qi${i9Es@!3fJG_T-ht@B_4hmGljy!;Jsc$8^z8uV`HG$F%XF>2NvOWct-i|rzy2zB^k)3-vV~tmvJFJ31v*X6 xe3l@qaU$@0f_4?REJE&3n(iE`R@L{{@lsJAMEF literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%.zprofile b/nvim/undo/%home%coast%.zprofile new file mode 100644 index 0000000000000000000000000000000000000000..41566cb663146dfc7cef8685a7378b9ed484653a GIT binary patch literal 1801 zcmWH`%$*;a=aT=Ffq8SmueB38bE9UaElQkgzU(vS=c^xhY$q6QTRwqh`$E1R1_p)< zAcg@sAcGNznV|w88ipCNlI;UnAhPinpbD6vG>8I8!TJAz04#!}V3bMC5CBGpBRD!3 z7`{qCgPsLQgW?ku6{w==AQ96>uu4QMfdqj7tQ<(ofO!Z4CXQVfNF4_dqw4~RfdE1m zJ466(4>ypnj71D2gwVwgRRK$kY(Ty?7BP?zLYEMl3LYR|4~rN`$g~lhkU`#rSppIU zCF0S93+aRKeXBa=TcBCfyyaRi3DQHrB)Q=7nLXk1o?;f`^CHZIXd~c#)msb`Z)Tz c*cu{7J~+mJT0j66*_IG4oP>#+Ha=ek09unszyJUM literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%cvox%main.c b/nvim/undo/%home%coast%Projects%cvox%main.c new file mode 100644 index 0000000000000000000000000000000000000000..9db433a92465577534cd3be41e5f0dff2a7d0c9b GIT binary patch literal 6442 zcmeHM&2JM|5O?^fpoQ`!psk>KO-gGM$M!lnBtSsHaYDdJXzUQ$G;%lgTYF)>YpvJB zHXy;F$Es4*o_nX)-h1i|Rh4?|8MXgF4?VRr^Y-l*frJ)rJZ1fM=gs`yyqVdVw=XyJ z=J(6ywDlymv-0t7=bNj4{`Sick9XgDrp@$8b$C zXlko9a%~$!3d{vfbf{^8m6A z*Cn_H;MxTjHtgjUyH&la?84EVvC6MF3T=nz=og3ZqV^9oV0_(PnFVfD=bn%|24a7` z6PbnFKvd5m$dP;a6ekJZgWnJ%QDd=h-xfEyhvaZ%3Az-W?}?Gay(bsob@vi20Po*E za(K*lxP1Ta!#qcZYFyJz&MLDD%azjN@>0G47u3Rb1&0Z;sArw96^jaLO#M+MCsXFW~ z&~lhOb<<(%hE=`YUiBf@R)Z*O!4XWDd+xJ*qhsF2du*G5A4YJ^uvCY2lMHfiAGr_t zR2#^44~csLPHl2qm3ZJT)zPc$j-}UF%~m%m)y_JPduZYYFvU$jNvpsWCTL;r;Vinw z;z(kXlPr^9Hg`I`^VANoBPp%cREXH>)Mivviux+G@KE>Q168 zH`+WjMK%nOBhgXONrY+Lb^svd0R*QUBMJE{rYt#@$w30!F_fwsmw8<`<50dnS)Q6M zQT^J7BcR}n4Mh()Cj{pWZbJ!#<+%1|!%P9#y5SEXNjOIgg78#S*yRyjU+{%M03b97 zAaA)ET~@2N;ZccVia8_7_&Btxr&bYGBqHn%LYR@TRG`Q;w8*v<0C}-O5PC`hUqQk1 z3@e0uvZU7=oBAZEa0tj95S>`fi~Gb!$2-#KP1h%7tM&ZFMJyX#H3gP0YYD!gczf<#g|iux`;T<$T`3D7D8zj zkwn&G3hKEV3Em3vfs#0@%2a*|X-(d2b5NV8kOY&g4U<_~oCpbmKaGr_HE1wyoC83u)@2RAHuMEwL#7w$IiwO6kd zKCKi=`LzUFhmS0;{F9a_CdzTU#UWN9CQ?dH!&PLrfLsAUuu2M2?<6DX?MRh8sgW0u znsTMO>_w!eJ*l9EV_U4NbbTsca3!Hc2DC)KQOZCBe1|sln$rNA`34u1i!1{n7p0z~ ze1b;Gdny1(gJZD?p}3?dj7vU;83|$H5(YL0I^SqnwiAapAO1*y zI=0@Ow`%lSTwhweTF95@78i*3U7xRLskONpHyz#Si6l?&A~J|*RUzPDKRn6A_A(*t zo|ccoQfQ;g5>&`()*TSS)v+{lR8xze&Edmoi2EFNqbcQ#lAFL`WgK5=QtfycrMaq% zVKTc56UY(j0X{8MBR7yUfX7=IG650T+;JH6UR`$(#z*2x2In4zmr+ZkCni!8;FA$0 z3GAViNfQ8j7MM>9nbRSe3`o!x0>LRcdAigMw6gGs7H@j)8bVfVbtCMq`Nio%@y1+X zWovK2tg)m(L7XKElN%HxNEi44f%XRjc)tYrEPnW45S+dg@sIfUWm`4d22C-7bHEhT zgDCZ4KZZ(q*4uU+^a2m3^Q3y2hx0uWXi3agzWOjMYn3K#zW01ZEd zVfDZMhal4qB42f73>Oz5Ts&=jr*SJMN#K7w$fI@bjrp|1#ctdGpN@9n&^{kPOG=8Bcf%|GYhfrj1ZHx2UMSXsV= z(lV!YovlZj6qT0WSjS!MIbOxz+XT6WMIE_J1NS?zdg(PT9@vY9wP5(TDs0cd_KOUb zAf_-(LDt647=DqR;iFII3R9)hG^}2zZJOy8E6g+9XN5({Kbe@K2%I1gMLd}^0~S~z zFtWl8$$P?bZPP14@A+KNV0u;ZXDs8Sv37O!^>>O4t;C0=gA`4REgf6$O9IhlkfKM7 z@&V$20ZS~}Fe@iCGmuLN(r^ADKR}I>r$STZO;zO$Y$3?6=F04tJ`M94j5D>7WzAZWwUDFH&}QpjO>PD3qio? zSiY!X@iOX|mG^Q~;zG;xKptdXEOojRQ7BBc)x}*iaLg^&UI1#vjLeD?sH#ZI3#Vto z2$^P-@c7DTHQczAJgYe3by>Ks-HvrN17{bM0VTR(vjH#bLY`gr!kxfYx+Im`EhmgZ zwq;j+xC>Rk>9~$pQzjDTfDN3NZlOG(nDz}T;Ts*cff-)OD#fW;EiB9_8u?W|>6l7- z5;qui5c5(OF@iZ3fqk0(Y=-FoMr2SCl`LjS$>PNgWzb3Lb0Tz#B7_J4@r@L+L~wSl zrM8%xP~j#4%m&8Yi)sc8Z3un4Nr?tcXOHl@X~Y_yBRhDoHFuD3nmlU@lc<962%+(qV;JQ0TkI#L}g~ z(ZG_z>1h0RgR7nxH$3)J1Mq_Ag@d4w0fPQ#P^kXsP$;lnGjeuqz3Dq%WC!|=C%}Wg zI~!wyo*+{`0h!)jDzgpoST7MFt2(Ydghc#x1{Iutfz-|>l)El%#@2+*Vw6NWp6P1V zj#`L_@52tn*B2y8?$oiO4norN+EMCM*WHjZ4GvsC=-5U-fNMW?aUiG-8Ar7}fZ9eH zYARSsFt;nHWnJ~y;T7N%Lk#RDlAx?mYhBf-+!4TdZ;Xh~s|xxi-uv}99C31Qtp8~g z|4H9ae0Obh_<47BWluB{w!qKbo$@yPdPSNT)ENx^W%A(wRgceW^YG_!$6t)& zBRf%rV-O$zOikZLl-+;5c7##~Bk2fgiZYl4#$fzUU^OqED&hGqk5bUMvzpp6B*||Lh-(zi7w+ literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%cvox%platform.h b/nvim/undo/%home%coast%Projects%cvox%platform.h new file mode 100644 index 0000000000000000000000000000000000000000..ff7d8c857d66b8ce8b08f10acf84a1fc860d5a13 GIT binary patch literal 597 zcmWH`%$*;a=aT=Ffmz5lptVb-_QqYKs7J-Z4Bwfe`wsFj%)0&ISgxg}>)ja)3=GOZ z3<8W03QVK3!ThXbH%S%{i;*Gz0#q?F1(AY^{09OCW@PD6Hg!V)7#$MO==dsuW;8gy fz@lIlOxCm!LnT;B2}rWR6d}>=&_{11d{Y9%+XsKOq-b~TUU*F|2Ffh6@ zFfa%z06}VcPH=f*foEPxYEc~Xh#VvlkP+g=C5a`O$qHrpnJEed`I(?J7N1s>2-Xfvg$Mu^L2w~S z4q_#83&A1KBJNSA}5w~yJ15i~k*#sa1ltX^V j!$cr7sxAefyFsd8Kn2JEdF8u4Oawyvu|R0k#^wRP|6! z<;)M@gv8^M!8L0e1G`tP`hFQF8N2>5O;2o!Qw*=3DonQ+d7N75raH z`ptvt=Z{Z~ABSdsMr+>s`QhNs^`iaa-P@Nl!#jVzy;2lKBOe$;Oi($(b&%qtY?*f( z!+=UF`gaaUaR~xU!in;ijP{d+O4L4`z?M1xg_c86exKz&MLD3RqncxT7P8fq`}y_x z<<%v9fzFaC$3xLsSU!ThdPUtO+Nw&%y}3tvDMv+~i8Uq){AndWJIB!;5 zn@r3uZxq*w*VNu^2t!5&x2gzs7T{Xl#5Cp^i0OD(Z8{b%=hQNCo|Q4I7!#JD?AKjO zH(ftKU^pub+o%;hhW*k|Pr!B_Y?fc&bdg%|>jBcOot)5GfB*mu$jmOXu>jOW=**tF z;u_fYYn3%@U>cPyRmM9K5TFnZ0Z#MmLgOx(9EGS2-?7x}reSU)&jKjTMBr#7ax^^N z<#5GBw(7gCjvC0r!Q_O%tJ&%#IJqJLgQii{H|w^IYB9)h327m+O~2Lcu3fGIl%>kg zLEo90(jCvia{L^t922B?rtbwjFf6tV9(M*30?2HYCydcLJoBf2F;AsNKtjcUlHo+^`^E>MXc`UnGj4 zZ!rfF@dEOKLxG1SJ6J>i33*E=GZ2;BrBX+ccSewRX|Y&XE>Y^vXq>vGIoMo6++DtB+af@fMi#!UTn>7DNTBc)EgzY&>PL73qwgQiqR;gNqz*G zMPcwoUXu1ND3x9{Lg+DbU^fmPTX>AgBNi8v3%hZ2`0Jg|F{#;(r)HQv0ms7!bnR%T z=IaC?k^MY@uv4c7M$ON80Xa28fn^4V;ztV}KJ_!v#1}gOQt*00%>#RzR`3oo~C7rhDHJ%JnYl-g({(GIF|v9 QuxqCWM$?}{nm&C05AveZaR2}S literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%cvox%window_wayland.c b/nvim/undo/%home%coast%Projects%cvox%window_wayland.c new file mode 100644 index 0000000000000000000000000000000000000000..4ab89ec1a0e0839244fb09b223b0bceae907786e GIT binary patch literal 58874 zcmeHQU5sSMRh~`OArTI-<0K>`kZU{M%&dFH`{TdZ-i_y{cRlg$%w%Tlwc|K9J>7S9 z+uPGU^v}*tHWmbgka*x3kq6#+KpWgW$)Zub?WcbsZ*y;)pzUl_THbo)?MlSbmqg)|K$5$`0J1T)!CnY|%&a8#HyHLu&0%u8bv-@UOLrQBEIF+Y z7m|Zc+Rv`HL3Ehzw7acYeXAwi#vbzd5%a?TC-DDA@jrk3tN+iu(_H=jNyeU>Nq@{( z{61v<$iIx@|ML48e*R5EtH19Z2i|F3`muD!%*=m()@EzF<3t_rpMJdEZFWYjEO~6d z(-`jd`g;pE9z(?EUBpWVjl)i(+nR57+F5tFaN{DPKRX_sUGJEQY4-N^dflholgV**BF+5G>~L_nH!!rmMK28w2T$$oHM%C^5ueGZ3lVRP z1tYA}-YE#~x4YL(@F|zcV;Dm7gBw|=V;M8Q-|r23%^tWw27bj;_A{`yeJh*a@3p(b ztUo{M4u*}LPBwq*Y;oe3d}2-0>>*LVfeZ#mr$_lS4-F6ZvsSj7*dc!hVPB*cuPF9o@?_KqfaA>FAQ-LSXc$!=wx?!5qcA}QciY!T{jBAJH>?Upm*I)Q55AjR>nt_E%dU_i zXy!@g)ow~AC>yE^Qjp?lmIY}@a&s`3+yVK+QmKRXuz4ey)xc*M$X}B)_#3Y-rLWfC zOb=d&->V$`iJ730I^f9BHr3qT&^=gtuR4-&}{6-De7Cxq!;lWW8&E;^RwlI=OV&$<%H)W!t*2)iD%JJ z(2Y@N=qTo;zy}!hF6d71AO5zj(A?^^TZuK;(tXTJvl4Q;)fhHvPIe2dyIL}W)Sf?= z4wFIFZ#Ozdx<0{@B#${}!McgU3iL6Q0E)3?q70Lolv2B^wq~M13u=&dFxh6^tnaGr z0xl$XTp-($yvtnqdn0Uapinuu&8RDDw^zf1k|uwaO?IO)IlYryNVM&z85fp^p&OKW z8+iup{|u>j<}bQRwUCu`pm64`GS1jKdd`F;DtA)kbtkHeE5`F_IpmYhB|(KtghMHl z)5A^;?0%CCneQ}B1t#0_VpV>CwDL@8vQ;E3RWw#3QT0(h}f|6q7^nn z!0w*Z9iq0|yUDDSn_NuJB&SX#rc}Ne8Fu3sT|vb=e^GK@Fp03LVWnBrm$ivGLYv_Q zn=?tbm6WA}+|OroTqXHeSR{k?ce0qKX3DJD3~R|5{5QvZ z8HrW4Z|lP$d;C00_ti}Y*)VO6`h#A77KW$llUlO&+LbGTpoj($vje7r3}fXJEiqm4o zmep*iHH(=o_4`&){dPvfp|4*!Tl&6%-Bu(@e&!su_cBV>#R7?PL2jNkMTUJrt!UUj zOLEgVl&Os|bBn&QG%|gXhP=RhXpZhf4-GO-K(lN<2J(gE+Ld%;eRXZSzL_q)w!OW+ zmTqk?Zr9U|&HC0>eMJ7Y02H;>3S6sh7ejAUW>var|73xk5bJN_Du%7kjl3R`GG+z=J3 zQabsYr8U87u!*(G^bJQ3s};huralvund?~6yS{zNRwhul2-YS;(Pof50> zP(7A=5cXMFXDG4KV?Q?_Z?prU?ewDI*@`FH)*(OXloJ8uxkDqfj@tZYNKQ58WCNy|mRE!Ob_zDvGk5koK@F zEnDNH_1i_#TGB&abj2@bd_6vp_F1m`{kmc!6cV^3#LGnA1iU7yFhU_ge<&4vQ9D6j z)1}-PvPZuXcHr2v4(8ofkeHUW>B_*!y}3hnOzNVqF?UW$rtsuZnF`?pSz2G*T%oJv z>f%OvX?^qR;&w{s$?KS{?j&LW&+fM7UbJo#qdsNtqsGRlZpJ)Ov)F zLR@_Odm-_GX*WAacl*6P){4#mFeX~dK~6~xFIX+H#n#ka6!2iX{>C<#5JfGoU)?~( z(zW&U(v`)_TOx$Nq4nDvb&;Po1?C=miv99wrC>{qz?i1Jq!Iip_JXM!B@La-YRY3e z>h`l;uBTj(Wb9azORr@FT#0h9@vPh9VHIovCK_Bd4z=0Fr1q!cMKLnAPwZtgf!j;EOGk5|&HXem!lf{W1NG@VoF}5N=c7wNW zzK!(Jnk7`!1uGVjv#mlo+v~O3yX~y+77f$QQMOmXpl`CqlYXu3it$iZ*5106gNIo>_#+p z+MV{Wot25H-zE*D2Q_%*sOLioeUuO>d zSs4#Db4|@en-~(QU0~IshJ{A3-yD{jJ9Af?pk1rE@-HeI6ph-s%1brh3TX=qy>&Ki zks0Co!m=c{QO*8C?d$|;m?RortBA;W)7J7yyFiAOIa7d*@RYRL zfwUwSH6Q&;R>XVd!X8_JkX6>5iA-MB#QOIe*I*r6uhjDT+Sc~wB3x8kFhA2PtC#BA zt5@Nms&8(sZf)1swuR>rQ=Dxj1|c~!LDY3Bak8$1*l^2PdT5!({I(PXgU$W@^~#HxpyRf}e6LSoY>IU|r$w9arNnNzRo7|N?x zDP6}WHoP$K-5ZyU5)$e$ObH}n=6(&i9yUl%kEGW-y`4r!=aSs~tWng7Wq#%;)Cb{%lYNM8O|? z!E9*@Uyxog1-jh`$eO1$(x&ZphwkLO9afd6N;0k`Ps_-VMb*1W*1^tAdDWzI3M=Jg z8I>Z{6xE3{t0m7!MV$SM3JXPE1u_urkvJ75ReCRzvy)p9?nf84dm0)x#?t@>K|2<);!j((R#rRH=~TOg}c`)-cnOaD5OA<$fy>7O_8p3 zwk*kTR{u#NEQcNNS}xE)R>SZWV(LN&FAv%xtf zG1Zd;^9MWop$;9khaEeo$ks{j%tW)%fyFQjuMwR;z1>+CKPMyTA@(!GlXXDH?voXA zdTM|E;*L2IgB)WTRvoQrQ^HO5gpitPHGH zGZUC}P_7oJjdo40(bD^*)*eA=5A&Trdn)Y=MZ%3!)<>2v$Vr_(vhwitO0h@8HLi_j z(|x4ydX?EDI5<(mj`jzlWFZj5G7qQ5eaVuUahLeBonsvrYz+Zd=sh4s-$R7f9PZL~6SCLzj+rxIkmYr&cp2R1|vu&d-a z4kvhX5R)d)9@I&WYwSm{l@4ySJDKrDK}hUjNjW~FLd?Gn9BgD3HcVRTvOu^$YGX#6 zf49;Ql#hKNoVjsX)U7ZuiOn8);O%lYTrp~9b{5A{*W`G%4cW%A>A75e7MKyztwMX^ z=p57?3k|Z>;~U%&kmAKV27)D=hh5xQWhv?UMtu!`@ak!jym>gwk1^|Ud>klq=* zMW5ImaAA(|{4xF3YnzvF)G^(Da|0U-47s+twz7ULU0U6ybu5ENi8t#j>DKBuK={0& zy}Vhk;{ZSyv~=aQx(h)D;+@hAR_Ytuuh`ggPdhJ&MsL>FR_dFJOV}as^|39q^>HeI zRb5+OBjDg8OfP$pvQdDTWf2W~oR(51r|J+vo^(fh_B0z~WM2nNUB1!7Q6-abtRn(8 zVh9+)gH3>EpPA#oSb4T9z0P3~qG+zkY33~>?&Bp%&B+<@&9P-u{k+JT{8i#8Pv-oz z5hqv6NJ@sc$D~A5K8q%!bppG(__g)T^mVSJ*Vk&vIo7k7aCI#tJWImYwIN}Sws*19 zb%`58R~NTlHKL_OS_1AIEpD%>x5<)EB^2UavHgLrlhfcbVoiUb%NbPG6ViT6+_pZj zW<0ZmnOkfY*nG8dGg}_@`*8n_eTZ zm}LccJM*io1&kos0r003DdDpIbW#3XBIEdz4xGjcAhGP3+Nsu`N@dKPId_sb4)=SV zPG}sOd0(~_oNZ^$%X$-zHT$)wLFS+kHpAiaFO8*rC$ZvM4O&D!%_$+>$B}t%X@ZYd zcMGq@;tuF{JEOta{2>mN2@M^fqwc1mGH=?BUK;K0a;G8R&$0YSon3Wm#e8q!pk=>z zcsDhYWiJgl6dU{c=ENl$htbQYg^ed*XNk#U^9%fxCNl)cOsP)7Ty`Nn^O|O~QNLis z+NsT`lY)0UqJ^7ch@%r$4A;uEb3s4kQkH2Gn=%~XG7m%Qs0oaU4*BRqrGjE8N7hxq z^Dtbf#RO-l)i7bkL9oz1&Vhz%6p-2=A(IpQ!5G2#L1SbAg|>yG=|N@~Sm-C-edc=( zD98acQ@3bM2ila-nVCyZn+FYl=6izo6#Wa)G+1@2SLj<8~e-=f4ed zHn7!B5F!$WsZ&UaNp?R8ac_7K!IMyV(x|+MYdA|OlFtA8grP9`=c%?3Nl3I(8QPhd zpGB$2EmG<4+juyS|Nl4aA-u<_zKD90N`Ft_flc`zV!DIhyC=c zbZvNb|Neca`O2#@2uncM9*O*znM*3jH8JI$EjW`~L9T(KQokULDY5+hxh?PZsvy?} zNo@@v@=EL<%d61dGKA{cBBi)#JXh`XR6(xA69n6Q%eX!SksUBt=6Gc=-RX9z{&R&~ ziv!7cQ1A_tb{Bgag9>z=R-kLa!dIZ{3Um#qyZ_vgRbOr|B!X7!Zd(Pqw!1uZ0Zjy5 zyPXLv^;G$exil4cExWaLU6?2KPEG-nb5?ekBI}3>{44Z+_*ZPHa_?DvaL5`TAHgP& zL8+UZ15E7$tOC#Hi$m_`555*xPXWIw0Ji(MPK4x&abXnzTP3#wU|$pqwB#RmDqjJX zEL!5+`VfUt`*sesrO5Ig>`gkX!g zS5N`5D$_}7y1~n5ODkSn)4u$Ic zZ72NzMF972IBnV0A$27{Gmqd6(1a)G>6^*z0Bl(x)ez#sTjFl{~4DBmk|(FLa%soJKt3rJj!*M35FZ*q2{ptYUdSdP{9 z1|4lY!D_o|yS?%dtDTSiIbpR68!1TbV>eP^js)c24Nlv9o-W641@RucHWfyDtKk-{UC+OBMcC^ zm>xpS;=d54x6cZWHW2DO)i*&!XtPpj1~C|#d?JC*}I*i@ANR?i@6#Ue~H5(p9$$j zF>>EHlgkmjpxm+V3KiWCeUfD&v7(7r?58~gM-TJX=w*u{X0%tjgm}J=5v3}j1Q2*;sB?M9>oWjJ3owDoEwLoMz@u_$~n62Byd~WZ`R>*XtR1Nmwf#Udj~d#Z!7GA_&Z@s zT>IwlUkFQbyCFq^0;WVk0>@u)#h{ds+J%GC-<$Bewq#lODq{a=wkjnqwzb!+`@1MC zDiGZ}{oS=95awW`W=Ph_hfGbdcn9SEnrTqrK)rT(9UC1{O6T(T(eo!sey)*2C$sq-$| zgRXLQ|IMPhmtVYy@i(EXM}; z?VU^h3MJDZ2i2T}-IU{jrcD!tN-xbiQW;#}pya%Nx3}oN-$0xYyP1AbcM;=v{Laet zja*b3${xOVIoG3_>*&8!nm0xeunYJ!cnls$eU0IngqQ7SdjE|+TPOa3C(BS)?P zpJBwpu&a6fnre$?T@>O-$%GvJBOK9=+2xuAGc0cQw3D# zqTJ4v9-82qtuo)_q;LF`4u!1b z(pom<4+@(yX|p5D-DVQ8|{?$ps29wLQeEuygtr#X3Z6?Su=-dW{TB>>+I&%MsdzvL$J}G;|IyO5D zMK_uLC6nk6t&DdZEV~Nw8oS99X$#1NIc}2iGB0XZWT&*nzYDb>IS<1$ydqm(V0rmLeSfm^EaO=r)Mhx~!%8WZwd!-VN>X%J*n z#C2!rJZsf|v`VE3hBGJLj~%}mANCWh(?X=TFN|Lb8_hMp70xy8EX(wl!D5lz4;L2( ziD#-l<&CdLPDx*7v)FSe>p1tjCKu##doFZjHNkAq3Bf*hG3L#-X*y7$9JmiI;vBCd zH`T_Fa|YuT)NqHjoO`;u_KhQ(Q#j8Cv%0I#SXVh+k7ni-w$AYw z;oz4WQ1)<`xkJ)jbUSqwwEMQEYE{9k%E`C9K^T#JX1JNg>Abfm zs3CAMyaqP6kEAU2U*!+%Uk+iTvgJ#+E%3B5ud4>3yFEIy1z1t%Su zy)PC+PwKW{-fd&Y32j8AytmP%g{Z~cNs8lQ7v+LL!z@8Jks~iqK8j8|j9)h!9mz0v z&dP4EKk$y`$^EirfJc;f|L>iB)=Iqgh!Jyp!q*!0X29l8{>rXWIK1;vXU+0GfhLj} zUuRv#c!?%3T9v4W)){{>^N!soPr&XVu9*_uxpFw~F**HY%MtqiZJ6hp>ly>jfU zDhpCCmt1}uYb}utS)kjpx3m6UyNg@X^9-o%?LpRgzo2lhZJ{{D^5a{M&h;zWoG`6Y=k z{}3~xB-PE80b}mZBXAyCuRPxFHanwMmOQ2&uX*e3nIGXWRb!`<&EGmZ-|Vzu6V31Ud&6F{*D)7pzT^{Y z8cZJWa|(*(==ALAhlYpy84lN|dz2Pk4g_T9DV%mSa2C#Ek5V&Pk1A|3U6*@j5s740 z_C$X5Tj8Meq_es;;m)gYP&B;kT9o1=t1lR$Tg7)W=A_G8Z50lxeVs_G0CZI0pgb%} zZ%Olt$)2;Kt30#kK*g_WJ+&5oLy@d-P)FQ27afFnfRjXYIs2_Yxe5oB^&L7n*m@fSF;qCHw!6K+Zof}`s#z+@WJkb|^A!%Nr6+=7V8_%mc7=m7hmI;7)cBz@ zJsw;vVs;x&BSBo@p!_lGiEuS%0LBQUU{w-=kj8>598`saN(8V7!@15GkvrhW1cp3{ zeNem0VeCzZyY><0q@kR8=6Cfi`78tEn7|Ut<_}vIHZsj0F|^@0Hl-AKuup}9a?H!K zCUXDD5eahJo_A1w276RRIH*5k68)iX-(NVW?bWOG3If$TI$9pZY3bRG*vo7`<}(B*G_+A-yVKlrBRnVALHb+zJ?VSOKF3 z?O_i(L~tVdT^yR3{@j>YnkPABLuMBE_o=6nB^*geR2vVltDZFEX#J==8f2~HpwaKP zyVv>oIVP}^eQ-9$Aq`Vb{qjMQ_~3^lU_5^nH0y2H_8hm)S|wh+)6*S908tqw92fec1+0u7=E>JW8$6y7`N-Jnq2F-tZhh9H- zhbwh-1e6?fVM+Cp1sOIx6{lQd1v?%9cxwxEOr`O7&Cu^p3(<10}))^}^))_b?7 z+dZF;CPn=R_^}c~0`V(9^KT&FPv8fH5K<*1Ktck+`@GqioxR(0eX+03ms#1jyEAXz z%)EK?W#4D#?JckVtJTJQ@aM6|fA+gyU;V|oQ;*e~3%~s9`+xh_-~afZtxx{@^WRsx zpFUOm?ML0Qv9V9+{}qvOl-8V9b0zR7J^~H>AEE!J=pP5p>VNEm%9WoUMeMP$@*faO z$7Axuzlg#=AOE8xxl^I`d~g!@ptA5MZjQ0Bf4&^ERn39+{@UwaqvE%#t~k;3ooFLy z)u(DFQW4)RO;4XG`QG|e?J`BYq*HLjmfH=xlm=1HCs9`x&uscTGWfZk;6CCos%rKI zk1%R^jZH~S+{eBWb(?P0-4GPfu0-NP3i~S5b>0i9@Le%cZFVnG;Ijx^^BUElBRXCK zLC+)T%3^6QXhiN#Br4I44xWjEy6Du)Ro8bT7s1~Iwbvjrm&jY?oxHkA_#?VQ{lcvx z#nX2MiD}lUY`F~%ps=ww!pMod3UiWjDn~(?u5#DhZn0YzTj6+8i?HKGm72(@z&B9{ z92F;YMd@0(b3tFOT@WodYPTBVTH(F&8cNVd?j+|Y()Fg>h`UT~d3AA-lXEM08zOgH5>ipbM$2_`>*E)duARNeH3myb zP8AL-MARU*^HNMjzR$%>P=Y1o4%s*nb?Ei*_WMNrAv$CE#+BKbJYUThR&KsqE?)g% zAurCo6^C74on0)Ub$rl{bD+G4KdI+3e_bvkg&i*0Z6@-|m9FJ{pEkO4FM7MPWaZk*o?OST=kp$Iz; zWb`r!=z6N6awHX^JQ25`;@oW--pX|++@hk;khIcr!*B_=cW`@y#zPu<;(*z96a@`~ zggD&*r~X5drjyh10Ym9h5P3l(W?AHMyxnq_DRiTYP?QhHEpVlFpy4|aQ;%?^kj~}> z{pH$?(A#Xd)p6=x$qjWfii8}iZZoRoiSufId6STeZcnP6AI98p=x&0j;HqP=0P(aj*w}Vc!?mG?WZ(O=rFQU+eR#2a( zRDHRE6^TJff|n1pD4<>`s_lB6r}sC&z3$dSH_DyjP}ZV&+~oi{5;S#iFjLFcg!E*d2`#c=67Ulx zko2%K*r3I~&UD3YqoSE4`gVmQue6-?xG!rO)ud>D78Qt=f~q?c5-S?aQ@4~)9;{M_ zVu2AZ51B$|ZhCd8PbeF!1I=$(Q@K+euNu{;)jQA@9_(~f&Gj~G7>{c@4!TDCu#!U> zaYpbmfYT*$m>g>=j%O|P;De;Pwz7z-z;gJJzX>Z^FeW!$ZiDAgU!>wSBW1;qF1MKJ&~*wAf<007cIeh&<@>l6|y=z zFc#9{Sd{Wrr0>)`-xayi3N3+Y;T{WYTo!_R8mLMfw>Yb7ov^Dy&y zv6s&}4Z%D~vRv8@cp@_Zl5R^0Uso^UV^ZD~F3s(%r*mewy6*3vZ(b54@H(%lrgp@nG3fB)?Vi|l zMT$)~#fB$D-FH<|cibl|_T@kKBFx zV{Hnl?BXhr8PjchR#h$A_q(PUp3 zN*UZ}8BN`a9%*9xxD>ZuWe>nmU|mh&C~<$YV2XaGR1ku+u39i9eiy@nDX_HQ*wwUu z$Y2WFD`=|g0aMWJQGAA%b+k4sC6*+9O)N14F{;9dOl`$?fO8kg0c*jbgF~&kFa?j=cyjw-v@hqgW@7*d|mJ+40kc!@xhe>r# zKL!~WJtC`GNX0@bau;X%?F9>|7@dYM_3o3tt%Cd8t&@36i5aS5q}MlNWE@!npG`^+tmjC#QRmOk{31Qo*V%AvZ2 z5jAMz3d(|=alJ27|ybV zuA_059RMxj%o(vt8#>*crtej}h@6-N>yA$@fr6$>+cd(!Z^IvrAO{}gaDu$Hh$s*a zWB24v#rHx)l3%VG{4t#l#c2uOpQbjm2#!T?*!$Y(Jc^OB^>2!ao!>2!XSr=xs-xW@ z!>*>srdN`>mc@Rfqer*yBuSeQUe?h#4Rj+GQ~axhW0teUh{_aIVMH&KsX&^ zpKSx3j>(D`?!x5GhtYc-dzUq5fY&iusy(|Mn`AXKf3#){_B(dyxXv<5Aa=o=?TJjv z;qY9MP4&L*%D_(cO2uxR(VjI2c;LEr2tLWQncbp17UeNU$j|agru9Z|YCdQRFs*>vy9 zLhYm3XF*1?sfKGe*iV_R-KZRueVPpc!Swzlp045pX8E)!-tMYVvKhgdO!2qa6n``u z0^%o8J++9@;5^S{R7@c_5=R2gV^R&mc}~Xe$YKX&P$u;u7~}y(gK|BG8;kQm3Zpzo zx$Zt;jFN*BpV=yt}^hZe^v2VgOAahu3lhJ-x&_>Hl8b*_^!o-dQlK|;p zfj?c5`c_P)LvobDJofX=m?p*5?q=9{#96X%O0D7H-d=PoJCpo*_hjSuFdT zGl!1-@W-k?!`f&{#X>;VcbfH`X3oxg_$-aKw_4w6WU3hYvot;8d-!~(xoLfpccU1T zEfSQLG+qQUKHFwD{2b2bX-0wssZT@>_)d-SjQ0QoLh79=0;_`V8k;D!=k4@^ELU<= zxX`PypDYFX#HM=_6M~HzW_(3rKVSoijPxMW{YPxNKbDOPv5)2SfS7Cz8VySHN=AkI SQ6iIS5K8ofMv4CNoBsn;5?ty4 literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%cvox%x11.c b/nvim/undo/%home%coast%Projects%cvox%x11.c new file mode 100644 index 0000000000000000000000000000000000000000..d9f0a146f1e4ea0c75441f5720a443d6f966becc GIT binary patch literal 717 zcmWH`%$*;a=aT=Ffw@mxX!~;M!*XpbOlOvH6}B&S`cZdA!av3D^@p?k)^7#OAj zF|Ps=NCpa2f&_t>5sHBnoDC9V$VzroVS&iTUjPZ90c4E~|AByk8BN6~mx>_(j1FaJ zbbOTnnp=TnHYh4kBN(g%6vc1=7J>7C3~(faMZqkXlxZV|O0X2jK2Ul=2S52CA`o5Z Ws$_wZAmd@GV7i^5X~neh`6>WIN-W+0 literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%ns%makefile b/nvim/undo/%home%coast%Projects%ns%makefile new file mode 100644 index 0000000000000000000000000000000000000000..2c069c6de34e999d895058d66e948296c89ec410 GIT binary patch literal 4144 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 A3IG5A literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%ns%src%shell.c b/nvim/undo/%home%coast%Projects%ns%src%shell.c new file mode 100644 index 0000000000000000000000000000000000000000..52a1a7bed241a14a496f70c1590db5b8e1e07ac2 GIT binary patch literal 29854 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 literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%Projects%ns%test.sh b/nvim/undo/%home%coast%Projects%ns%test.sh new file mode 100644 index 0000000000000000000000000000000000000000..ad9eb57a169ba37a97df0c2339024f71b21d22b0 GIT binary patch literal 6463 zcmeHLJ#Q015Iy4X74lIe5DQUQmIyRSL);+?fdy3{iUmkWQGno}1P2gKK|$l5-vAP2 z_$eTSL_tGCf%pTYK|(NZci!#X5sm`3+mTLl^KNEuz3=VE`Nrn<%j*w2kG^EJ`ith$ z>hkpSlQZwSyZ3&4{@z)<+d2E{(%aV`-h8TeKW14rCYQAX5*$+io>#WDdTwtNPixuQ zdrcTo4~Iv%oc$D&#AMM%KVd(+N-*Jpe8qv5PV9pLQh}h6gPH;du>c!KkOYEJh-o5_%T)rIG6Go`tQR!m zD3Z?ErTVyb)?$E^ZLoVtQ{ccn*q%g?*v2TtG-3Nn72A`R?IPKZA=5X+vnIwZbHajf z%4ARyrwxW%;=YQD3X}MBj(~dNzRGSfOvG{L3u?K=;8 z8=L)JekcL!o==dpZf#rjdr`Sz6Jpd z7IvQQ@aqL4aLj3^xrr~8egtuU6ae4W`1Gm;<({~&!tPKutRdG*AWsXS3cZB!xPx}P z4k==QLKU;QN#O*(qE!|vR`FYo?}WdlRTcxJQvy?fWq>g~&_(xy)0DuF#59=_x80N& z34aiRU#wJ4fnE|40d?x4{3R|J1zP|mAfC5WPAGh*@gW5tsyK1j9y0gCfUCIdS_>FL z<3^l50x=>{O~m!hiL2(tl@GnVHHgciLYybO05V;Cuhe0R;a{rkIgHH%+hCxcd9C5s F-Cs{3&(Ht> literal 0 HcmV?d00001 diff --git a/nvim/undo/%home%coast%medals.md b/nvim/undo/%home%coast%medals.md new file mode 100644 index 0000000000000000000000000000000000000000..c1e85c604d0270350f5df6673ec645e786fbbec5 GIT binary patch literal 88970 zcmeI5X{=;Nb;oCHyZ|;{XT00(88CJ{gTY{S8;_S5u*VD-hGo39-|Lxa^IrF(-y3^u z$H7Zj!oGw=2qI8EBmre18_JGC6eUtZgpeQ~@_{9a$j3k+KuAK)ukQKxJAL2n?(2KU z3Ya=lcU7G_r*8H6pHo%0?$Uev%b$4N;JV?zZaR9)H?R7W-&(ruwg3Bfcbs(P-t%6v z_bEU4&JC~pjgwCN=kK5Jxl11U?@gOFU1T5Vgd*9r+0qYto>ZSrci+Bs_mil7@}@h! z=mJN1NSjH!GS~l)q}mo&T4OTPk*7;Sr`phSEp5`CU$gI`%CxqMxE8Q?x^FerQU)5 za6s$Jy-|N{N6`-Dd%8;;ZFRV`*zb*2rEu41IJmzz(ZJmx z2kV0B$U=8{rQ1I+{zcu@zUeLOT^n*)3RP4Kkqea8jfBwBgv+y%lJIM?S!_ms>q%q3Fg`!)jJp0w| zh2r~g0ryFgv6P`hBAfF35G>OqYnGflT%24UE_9#-!(*EtB9dxGyp6MpYBYnOQRcau z;15v8E%qil{~B1eDOHVDkr&Tr}4=1RXnQJ2N_Agm1g8c zz7H~tJ;%a#V!&a3I*)Q5WUxXDsx!!390wVp#xYU8IxkhVLY%Vx%uCf;OH~{z#WbGf z1aGGbfk(C&RFF8=Yjj3MaYqFY){&C@C7B@9+*L1yf^*3X=A0RE54B!M26+1$diKzgUfg$CJ!jVGEK5(?70KV zbK-y!Q8eYv|8i^Esn0v?KLtDNCG5xkrU+K#s=_0fh<%E9mJ-cGaNar%MroX_6T#1$ z6~W)g0bE>Ldg5OqBY?F98H4pf_rA!3wLWo63$CQ31rHM6!=5mIYN{x{7y>vu$YCFh z(l~3zo;z{BAcp;T&18o(<;`EpSHihw|3thJ4%7-*1tpI5UcQVXk8%;_Q7cMG3mznG z4|Bp=H)T;x$g^fYjY3|ZV}%xE#-1DIFOFdzFCUrm=FjIFT%IU5xB%^`?n??nil40D z!79Q!YQdG}Cn*FH-@}?PJ~31i;wQkp z$k+HXiag3iTt=-Z^)(8Cr0sD@9HzZ47a>MjRp+>LgS1M_*mL9Zni!Yy3WO5?_S_h} zKE`0Y9AL_u_vOc;;$v2i%MI+<{2WJD(LwQKFGL>vBHp4FTuDg_9wffU8}X$rDyoS+ z)~6l&`DIX5uEaDQ|x2 zl*fmDn(xxbMq3>bc{9a*UWh#SMSMgpxRR0P$b(<_eAI#~DQUrj#CM;^ z$8~jzYW$xC(^(X<&truaWX7KB^LwMu$Nfo=`t0~5{U`Dc2Y!yOn9A`m=kI$V^57S) z9JSy|N?PzB@!geiT^)>S+?usb$3EGWF+v+MW6yQvH%3>ETYn(+t3MI<KR^{_jmhowy(KOjgwUmn)%VhGKtNdZsmm(6sgsD-pNr3DWX-(3mU(Yq|D#;qih zr%x=>hRl+4U8xsciGu+%b4Y@rn2DU5PBQhX0pm^37_|xRI-28_O7)X3_f@6dbK!1+ zTf`SE;W8XBiRBSTR%@6V;$t_7`Mu)XJAnJiO*Z?|#10hQAari^ zTdj(BK~JwQuIXF-_8M=uF|m_MPrSn_Jq>HDQ#U?2XWY{&9=tL38B^}%N2B5fVAvJ+ z9~%3d8Mj1P^#$Y2q3TO$G+c2(+SpsCDx6+*wZSwluDkhavS*I_Rob+&x(nv)0+`5U zkMXq2RJLl>GPy3cnk}lCSkG8RXWpx%)7YYULUY+XvG`A zsn9@H3|!IWrG`XY)NIsJ8`6-(OC!Vbk}HlC-`62QByLr~(@CxPptuB)cvOW-Ee*U; z2(4d^49ia*D?ZjHK_otPEOt`)T|n5h+SNQqik&D4sQ@|xt$3M7 zifBDBMa!2-EQ_=wiW*BMG?F#)G6|EkplJJP%cK+IG6}PTnr5U^_uW?fIYRZMRPxz` zT6q|gi~|n99s7s?KLajnv`y;({{&9J+7cA2xJGP`LPh0G5o#iGc&syr0 zd&JQMx9ZdbhZ}gGp*l-}9+Bid8SY@2CRrI9-9~U9!BN2h2jGjsZvlLUf(&>tO5^O< zlGcLG&uEPE^<-h&^FA-eHwq%Q0xqzVx$152@wWCwCQ@%_8}He;xea&Y{`MB*R&H@` zwTkLp?z5?>{wGBHCFoV}byHKl-F?2*%--?dW)kDg<*9qv9HDyO`z))Os&Je5pw zEH=Bvks#%Fs^F<)3N1Ff#gQQ8kE`IRWC|@dyTy?p<pkyTyrGmzJ0+7Fuj} zixahOEHPCqwAkzxCu$8#Oce_)HoL`%TJI<^RV=jF>=q|#{aT5sVxh%mw>VMj&q_=c z3oSOg#fe(~R${7HXtCKXPSiRkE?$C6p~Yr*mDVLQwV2_mv~HWJHJ&`xJ#XdkOf5FM ztB&=dDO$chVm&A!=LUk18A-}ZC_{R z#)vNXMC5g|VdT+yM;wIpv<+;~=a3!ycGDz!cXL}o)-MiB>HQd?aB+#XF!J{;*S)p2_7u> z0#LuyMM&@nx{>Cj>;;&l1=aC_S4S@(0FSeeydcf`rJW2Rj%?Me{}JzS^a5CpI0)}> z5faenkQs5T(U$5UKJlnG!N$4m1mdM#Dj|++72?0?y`F+N2=80X)~^&T!aJ%;Hc?Vs0=zLX+d>B ze{BSvcw<{hpq~Ng6}!tqeH@>r6A}KhcRKQ5IqIOSCnjOz0US1+31-wWNeilj`s*U< z1RUFfLj9bCdi9k9A&-upLyai^yLUYDU^((2{cIN@!3#Kaj(4olmg*os@iq&Bj;&oG zpW?mZs*q4eKF!CLMud;^LgblUcUS?^S)?6VhIBZ%h=D3$x8m4tnpLk^s0mtQPp?)@TKRet}(MykFxPNdq@BsaM z`-pG?9XSv9vP#pm4)C|ea3|*2g%j{+0({loQ;K&K($H*ag#A;qVF%_H*hhp5aNHd* za=c@O7E}lJi5C(PaqN)`_8n=SA1&X<5^uP$aA>8wHuayBSn`$bdKC01Ro#&Bt=Z56^^5Ey!VNff zUhT^wZPGf>-w~lF>bBTN&=;%y*>|+c1JK>(y^XuO|J9vrZ;#wp0Pp; ziqLYFP#ao=6H?RQrBfhVhF54iyui5&S*NQl1>V$lhS#mqG-(a*QTuL-04G#JXDHt! zM4c}g2l#4ZU*lCIyX*tNJe`o^7bCPGjIEfR7Qa_j4b6(*qiu;A5l*m#9?|&CC4_ar zVx7jg&RvO+1i7Gfix(mf8TSkP;9AN~*I3F%Sl+*sMcSlw{Nh0L3vFHF7Y0!QEzC%? z3jMY+MX?yHE$`3*<#k>~0?a_0D39r~M8h;f%XI@qV_c0Ltb!Kd1l%-u=@8LchF1~n z@B-)c$T|Tv@TRsiyfRC}v^Bh8$|imjDxoiwf2YJ$(E$d~pA9O24Zugk%K&4A7KE`C zv(w_Y_;&!`Khe;v_>EIGbqSWxA$B`HBS@VO4_Y7BwSA-DW*Ywk*NQx}+%NEh8z?*B zBV4J-yN$9)o3xH!{CphO2}$-!`BfjpQ5PAGK_XLoCIb|oj zf)oCW9EiDM*BL4SchznYT6H*$%%ka`0kS)V2v>jgHyb)O^pa$O5c7|7G zX_&T#H!R`-IH3~yLitf4>U_yKzyNwvPyuWJ&Wre9l*ZXQ0DpE?{KiE*2$vV}K=rl~ z!Ww=ZVG!LNegSABk|*C_l*ZXQ2>;bIgvaZu^60D}EsxIPJG4M~bLcuS3;jI#2E#PU zMripfm#WG4^HtCyoRDfc`2y#wLf3&BcvIVX@(q@0l5Gud`^gtT_k_L!HUQ_zHyEXH zwhq95Ju7~heABrwm~g^GU{8$M<>{DZcX>L72lOVV)ko-gB_O)L&WY4|<)O`giq4#gjR^dyCzrIHacrt>H8tTgp1@ z6TTRWJY)NgD)YRwv}!|AT9JpA`wTwv8p=-ik9;!E^Ri0Qw2sgG{gLvSbm7!`D*qt; zc*$o}=jem>E#b%E3G|t(=NWyB(1z-u|BnsPPcPbxBSwPEdMkuUKR6qG(0*`yENV=n~noRfE;WFJ=q%ycMG4s2PXVX7EKJ?7&=@at93@vv0ogiq-@OmI?%?6yW4|+fiys7OBZ?H_0Y=kuCYs1_AMr|R$^UwDJ)8xy1W0&QNt!z&i^a{9AZ4km*;pN z1Hkr9``l(92;6BRU8l`hW0DrcjCzXev*J>Iukv@_e%e~Z8d*)lC>+1Nv-|q%cHP7l z)~Vp0_QQDF*}>spI5KY9JDc$jRkKA>b0)Hdwl_Q~ZWZazPnLQIc&nNnm46joGj{6B zII>_^xNGIY0ftsqX_eiESyY z^tY*%FOk#{HojNXYSN2Grm3a7ge%@pXnMtq%Qn8lPSB)3A*#65+|W4C8!dMS_Z3cI zO{G`ck6(K``3^LzE`H(6_hgyW<=Ek|y-Ufo&O>Wq!)?(0!D@f8w`2krBCxW4O|U;$ z?5*_dYp`H%X6CA(2_P@idpaGQ_ZPGp zZB0IrPIk+q?u&e~7T-r(M%S*ZlH6$@i4-$yd6GveQ#}h{NsX{EA4l6m<5xC{-a#7mKhs7zlTDXbhJamP*D^2Gzw-4dPr1Wy2<)S7C%U6p@Yji1HuB z!2r`UjDzwx>|sU{gzuusK;k>JK-mk`z|3`wL^*(EiH2!}Gv*_-l}`Y$f0~d|k=3tOk*$8LMM`$bW z{Nv2|NDR%u*$+PfsPoVq4ALqaA&vRk@Xi^UIpr!3&FM7E_#VFidUyB{fDOQDrz8)} z!7@#<5!9HE0RL0f(5(19Z{Ka5U4ymmXko3t(7FEbN^h~B{)1z8`A+`?Sm@(1mVYnD z3E-y+QrG!zs%AwjeZsL(Z`+@eN1<&r2T50m20)GPRIei z=g^k<4lPiwsLoPgP8+fCGPGEs1w}YxK0Jt|HQArQ+K#J{euz{9#jnIXlc;aU4&dq`7hUsyh$ys@#A!G zvNsiZXt^`tJlyIe!m)UEFAY7}nPirRX>_2NkIppl->aB@t9?2gP~!y5NSX%DD7lgN z4lPiw20dU-FSdl2p$(R4l8tc2e1vx5|5XL;g?6-r)HHbM4K0@871|CjaIPWi1k}Kr z#4@}xOT#om8uPW`4buR~3p{lPFF32jgaoBlC1}NWXo2#cpa;xbRnE}L5)IP`XUxxqcAFhAAvFzNIz)?Q zc;P_~FL2(Q7{wP*18)+`@CM5?$zsJhx162+=BmiuW{SWYhGybd;8`}&CH8$~i3txX zR_JJnBS9Ko^g`sJ;p$*jm{nyK& zV}1zG&o$6*?k{vl-2;cZgU+?x<&|##z+fZvQXm!Wcj)yfvG@)>Q2(5L?sqWU=DBnflvRk-NXv{_3neyR9?ndV?B4(MRM%H z`r*KT$nvc9GxotKjk7hd-}1s3_&O`QkV7i0VMY?fT7auge24ZS<3FN0OMzL7|2(D# z!!*j)f%ZjJ&~CHCC8VaoOLu6!3@<#$;RVh|6QlTg#1i05VtLdKmT8j3igQ+JTQ4POL)vX_k>okyV zlqS_5$3-48)3x~NWv%4xm0GHa$BMkkW9b4vTuHrEKLnxINvr_D4+)3B$nX~mT8j3 ziml)cW8ipZ3LRk+xcr*lv@vY_VuV3UTt$rBpCgp062&3#09 z<%1F0P#w4U^BDCf*wHwjAnM19T9}bEaQ`SWEib-93zY8&BEYO`4;k8Em`2$;(Eddg zv`@FgO$_K|cumdKf zw5~71ONVH^46jBKhZi{CjjR(;18)+`@X9O=)7J2YX#ju)p1Q+U^hZ?iRNK=IFo3=% zhyeCe?UQc~2u5j~tpV`X=fq_krf2dbe#b*I%t#u7zZIF57vG@;%J&8lVAdiauh4^G z8fEK1dwCVK7un$^hUPN7bcfc<@G80;Uf_HmvQ9t^yh$t%%`!{Fv_8DY7i(ihuHX$r zGgSgl-C=zF4;4I3W3J^LU;ur85CLoeJ{DdE7%Q}(Isi{x5iA3I0=EL#E7~XS&O|8T z6M9Cle=n5DYN#$wtI&FqOK2yJeVXr9@L;WL$z`hs;qaG~NB-<>Ix1w6+S3HZpP&VdK$cy5mqNI*^- z^x|tiJZgb55-`(L z-o1%dX`1H-qElQs=J$$k|GM_3GPH`UglGa6&KSPLp-vpe<5O&fo_2WnYqXd9AF}Zj z$aVeIwf^A1q5kT@-eO0O>Rvky63}&|1sq@GJZu*j}};aA;-n*I!g!ZJ6KSf50Z(raYeQhuE|J?`JZV z6mf}AeN+Fg-e|HDok@vT#J^8dE9s?=qyFk}&>OAdldliH!&$}d-eC-~!SL)WsqUKL oXwm#GwOJnK?1v=Mu%}_J%%2<_Rm;v4pR(4+Joc`5_?w^pKc2k+umAu6 literal 0 HcmV?d00001