I dont know

This commit is contained in:
coast 2026-02-26 06:08:09 +03:30
parent 677f7a4205
commit 4b5f5cf2a5
6 changed files with 312 additions and 174 deletions

View file

@ -1,8 +1,9 @@
monitor=HDMI-A-1,1920x1080@75,auto,auto #monitor=DP-1,1920x1080@75,auto,1
monitor=HDMI-A-1,1920x1080@100.00,auto,1
hide_on_fullscreen = true hide_on_fullscreen = true
$terminal = foot $terminal = footclient
$menu = rofi -show drun -config /home/coast/.config/rofi/config.rasi $menu = rofi -show drun -config /home/coast/.config/rofi/config.rasi
$webBrowser = firefox-bin $webBrowser = firefox-bin
$discordApp = vesktop-bin --proxy-server="socks5://127.0.0.1:65000" $discordApp = vesktop-bin --proxy-server="socks5://127.0.0.1:65000"
@ -10,7 +11,7 @@ $restartWaybar = pkill waybar; waybar&disown
$fileManager = pcmanfm $fileManager = pcmanfm
exec-once = hyprctl setcursor Adwaita 24 & exec-once = hyprctl setcursor Adwaita 24 &
exec-once = wbg /home/coast/Pictures/walls/wallhaven-d83vjl_1920x1080.png & exec-once = wbg /home/coast/Pictures/walls/wallhaven-yq5dmg_1920x1080.png &
exec-once = hypridle & exec-once = hypridle &
exec-once = hyprpm reload -n; exec-once = hyprpm reload -n;
exec-once = dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=Hyprland exec-once = dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=Hyprland
@ -19,6 +20,10 @@ exec-once = waybar &
exec-once = mpd ~/.mpdconf & exec-once = mpd ~/.mpdconf &
exec-once = mpc add /; exec-once = mpc add /;
exec-once = foot --server;
exec-once = flatpak override --env=GTK_THEME=Catppuccin-B-MB-Dark --user;
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24
@ -121,6 +126,8 @@ binde = $mainMod SHIFT, down, resizeactive, 0 40
bind = $mainMod, Backslash, centerwindow, bind = $mainMod, Backslash, centerwindow,
workspace = 2, monitor:HDMI-A-1
bind = $mainMod, 1, workspace, 1 bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2 bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3 bind = $mainMod, 3, workspace, 3
@ -197,11 +204,12 @@ bind = $mainMod ALT, down, exec, /home/coast/.local/bin/mpc-shuf.sh shufno
bind = $mainMod ALT, right, exec, /home/coast/.local/bin/mpc-shuf.sh next bind = $mainMod ALT, right, exec, /home/coast/.local/bin/mpc-shuf.sh next
bind = $mainMod ALT, left, exec, /home/coast/.local/bin/mpc-shuf.sh prev bind = $mainMod ALT, left, exec, /home/coast/.local/bin/mpc-shuf.sh prev
bind = $mainMod SHIFT, R, exec, /home/coast/.local/bin/mpc-shuf.sh search bind = $mainMod SHIFT, R, exec, /home/coast/.local/bin/mpc-shuf.sh search
bind = $mainMod CONTROL, R, exec, /home/coast/.local/bin/mpc-shuf.sh album
bind = $mainMod ALT, R, exec, /home/coast/.local/bin/mpc-shuf.sh artist
bind = $mainMod, slash, exec, /home/coast/.local/bin/mpc-shuf.sh info bind = $mainMod, slash, exec, /home/coast/.local/bin/mpc-shuf.sh info
bind = $mainMod, comma, exec, mpc volume -5 bind = $mainMod, comma, exec, mpc volume -5
bind = $mainMod, period, exec, mpc volume +5 bind = $mainMod, period, exec, mpc volume +5
bind = $mainMod SHIFT, up, exec, mpc pause; notify-send "Paused: $(mpc current)" bind = $mainMod, bracketright, exec, /home/coast/.local/bin/mpc-shuf.sh toggle
bind = $mainMod SHIFT, down, exec, mpc play; notify-send "Unpaused: $(mpc current)"
bind = $mainMod CONTROL, up, exec, mpc stop; mpc add /; notify-send "Reset MPC!" bind = $mainMod CONTROL, up, exec, mpc stop; mpc add /; notify-send "Reset MPC!"
xwayland { xwayland {

View file

@ -10,7 +10,7 @@ input-field {
monitor = monitor =
size = 350, 60 size = 350, 60
position = 0, -100 position = 0, -100
rounding = 14 rounding = 0
border_width = 2 border_width = 2
font = "JetBrainsMono Nerd Font" font = "JetBrainsMono Nerd Font"

View file

@ -1,167 +1,133 @@
exec autotiling exec "foot --server"
exec foot -s exec "wbg /home/coast/Pictures/walls/wallhaven-yq5dmg_1920x1080.png"
input "1267:12448:ELAN0709:00_04F3:30A0_Touchpad" { exec "dbus-update-activation-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=Sway"
dwt enabled exec "gnome-keyring-daemon --start --components=secrets"
tap enabled exec "waybar"
middle_emulation enabled exec "mpd ~/.mpdconf"
} exec "mpc add /"
exec "flatpak override --env=GTK_THEME=Catppuccin-B-MB-Dark --user"
gaps inner 5 exec "hyprpm reload -n"
gaps outer 15 exec "seat seat0 xcursor-theme Adwaita 24"
set $mod Mod4 set $mod Mod4
set $left h set $left h
set $down j set $down j
set $up k set $up k
set $right l set $right l
set $term footclient set $term footclient
set $filemgr footclient -e yazi set $menu rofi -show drun -config /home/coast/.config/rofi/config.rasi
set $filemgr2 caja set $webBrowser firefox-bin
set $menu wmenu-run -f "UbuntuMono 15" -N "#1c1c1c" -n "#B0B0B0" -S "#2d2d2d" -s "#ffffff" -l 10 set $discordApp vesktop-bin --proxy-server="socks5://127.0.0.1:65000"
set $browser brave set $restartWaybar pkill waybar; waybar &
set $fileManager pcmanfm
output eDP-1 disable
output HDMI-A-1 pos 1920 0
output * bg /home/coast/Pictures/nature4.png fill output HDMI-A-1 resolution 1920x1080@100Hz position 0,0
output HDMI-A-1 resolution 1920x1080 position 1920,0
exec swayidle -w \ workspace 2 output HDMI-A-1
timeout 300 'swaylock -f -c 000000' \
timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
before-sleep 'swaylock -f -c 000000'
input * { output * bg /home/coast/Pictures/walls/wallhaven-yq5dmg_1920x1080.png fill
xkb_options caps:escape
## Idle / lock (hypridle not available in sway, use swayidle)
exec swayidle -w \
timeout 300 'hyprlock' \
timeout 600 'swaymsg "output * power off"' \
resume 'swaymsg "output * power on"' \
before-sleep 'hyprlock'
input type:keyboard {
xkb_layout us
} }
default_border pixel 4 gaps inner 5
default_floating_border pixel 4 gaps outer 15
for_window [class=".*"] border pixel 4 default_border pixel 2
client.focused #666666 #000000 #ffffff #666666 #666666 client.focused #6c6c9d #6c6c9d #ffffff #6c6c9d #6c6c9d
client.unfocused #444444 #000000 #ffffff #444444 #444444 client.unfocused #1e1e2e #1e1e2e #5c5c5c #1e1e2e #1e1e2e
client.focused_inactive #444444 #000000 #ffffff #444444 #444444 client.focused_inactive #1e1e2e #1e1e2e #5c5c5c #1e1e2e #1e1e2e
client.urgent #ff0000 #000000 #ffffff #ff0000 #ff0000
bindsym $mod+Return exec $term
bindsym $mod+s kill
bindsym $mod+r exec $menu
bindsym $mod+Shift+q exec swaymsg exit
bindsym $mod+Control+r reload
bindsym $mod+Return exec $term floating_modifier $mod normal
bindsym $mod+s kill bindsym $mod+space exec swaymsg floating toggle && swaymsg resize set 1000 800 && swaymsg move position center
bindsym $mod+r exec $menu bindsym $mod+backslash move position center
bindsym $mod+Shift+b exec $browser
floating_modifier $mod normal bindsym $mod+$left focus left
bindsym $mod+$down focus down
bindsym $mod+$up focus up
bindsym $mod+$right focus right
bindsym $mod+Shift+c reload bindsym $mod+Shift+$left move left
bindsym $mod+Shift+$down move down
bindsym $mod+Shift+$up move up
bindsym $mod+Shift+$right move right
bindsym $mod+Shift+q exec 'swaymsg exit' bindsym $mod+Mod1+$left resize shrink width 30px
bindsym $mod+Mod1+$right resize grow width 30px
bindsym $mod+Mod1+$up resize shrink height 30px
bindsym $mod+Mod1+$down resize grow height 30px
bindsym $mod+Shift+f exec $filemgr bindsym $mod+Left move left 40px
bindsym $mod+Shift+i exec $filemgr2 bindsym $mod+Right move right 40px
bindsym $mod+$left focus left bindsym $mod+Up move up 40px
bindsym $mod+$down focus down bindsym $mod+Down move down 40px
bindsym $mod+$up focus up
bindsym $mod+$right focus right
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
bindsym $mod+Shift+$left move left bindsym $mod+Shift+Left resize shrink width 40px
bindsym $mod+Shift+$down move down bindsym $mod+Shift+Right resize grow width 40px
bindsym $mod+Shift+$up move up bindsym $mod+Shift+Up resize shrink height 40px
bindsym $mod+Shift+$right move right bindsym $mod+Shift+Down resize grow height 40px
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
bindsym $mod+1 workspace number 1 bindsym $mod+2 workspace number 2
bindsym $mod+2 workspace number 2 bindsym $mod+3 workspace number 3
bindsym $mod+3 workspace number 3 bindsym $mod+4 workspace number 4
bindsym $mod+4 workspace number 4 bindsym $mod+5 workspace number 5
bindsym $mod+5 workspace number 5 bindsym $mod+6 workspace number 6
bindsym $mod+6 workspace number 6 bindsym $mod+7 workspace number 7
bindsym $mod+7 workspace number 7 bindsym $mod+8 workspace number 8
bindsym $mod+8 workspace number 8 bindsym $mod+9 workspace number 9
bindsym $mod+9 workspace number 9
bindsym $mod+Shift+1 move container to workspace number 1
bindsym $mod+Shift+2 move container to workspace number 2
bindsym $mod+Shift+3 move container to workspace number 3
bindsym $mod+Shift+4 move container to workspace number 4
bindsym $mod+Shift+5 move container to workspace number 5
bindsym $mod+Shift+6 move container to workspace number 6
bindsym $mod+Shift+7 move container to workspace number 7
bindsym $mod+Shift+8 move container to workspace number 8
bindsym $mod+Shift+9 move container to workspace number 9
bindsym $mod+b splith
bindsym $mod+v splitv
bindsym $mod+Shift+s layout stacking bindsym $mod+Shift+1 move container to workspace number 1
bindsym $mod+Shift+w layout tabbed bindsym $mod+Shift+2 move container to workspace number 2
bindsym $mod+Shift+e layout toggle split bindsym $mod+Shift+3 move container to workspace number 3
bindsym $mod+Shift+4 move container to workspace number 4
bindsym $mod+Shift+5 move container to workspace number 5
bindsym $mod+Shift+6 move container to workspace number 6
bindsym $mod+Shift+7 move container to workspace number 7
bindsym $mod+Shift+8 move container to workspace number 8
bindsym $mod+Shift+9 move container to workspace number 9
bindsym $mod+f fullscreen bindsym $mod+c scratchpad show
bindsym $mod+Shift+c move scratchpad
bindsym Print exec /home/coast/.local/src/local/bin/screenie-wl bindsym $mod+Shift+b exec $webBrowser
bindsym $mod+Shift+v exec $discordApp
bindsym $mod+f exec $fileManager
bindsym $mod+Shift+p exec $restartWaybar
bindsym $mod+ctrl+l exec hyprlock
bindsym $mod+space floating toggle bindsym $mod+Shift+s exec grim -g "$(slurp)" - | wl-copy
bindsym $mod+Shift+space focus mode_toggle bindsym $mod+Mod1+Up exec /home/coast/.local/bin/mpc-shuf.sh shuf
bindsym $mod+Mod1+Down exec /home/coast/.local/bin/mpc-shuf.sh shufno
bindsym $mod+Mod1+Right exec /home/coast/.local/bin/mpc-shuf.sh next
bindsym $mod+Mod1+Left exec /home/coast/.local/bin/mpc-shuf.sh prev
bindsym $mod+Shift+r exec /home/coast/.local/bin/mpc-shuf.sh search
bindsym $mod+ctrl+a exec /home/coast/.local/bin/mpc-shuf.sh album
bindsym $mod+Mod1+r exec /home/coast/.local/bin/mpc-shuf.sh artist
bindsym $mod+slash exec /home/coast/.local/bin/mpc-shuf.sh info
bindsym $mod+comma exec mpc volume -5
bindsym $mod+period exec mpc volume +5
bindsym $mod+bracketright exec /home/coast/.local/bin/mpc-shuf.sh toggle
bindsym $mod+ctrl+Up exec mpc stop; mpc add /; notify-send "Reset MPC!"
bindsym $mod+a focus parent xwayland enable
bindsym $mod+Shift+u exec 'pkill waybar; waybar &'
bindsym $mod+Shift+minus move scratchpad
bindsym $mod+minus scratchpad show
mode "resize" {
bindsym $left resize shrink width 10px
bindsym $down resize grow height 10px
bindsym $up resize shrink height 10px
bindsym $right resize grow width 10px
bindsym Right resize shrink width 10px
bindsym Up resize grow height 10px
bindsym Down resize shrink height 10px
bindsym Left resize grow width 10px
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+Shift+d mode "resize"
bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle
bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5%
bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5%
bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle
bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
bar {
position top
font pango:Ubuntu 12
status_command while date +'%I:%M %p'; do sleep 1; done
status_command while $HOME/.local/bin/sway-status; do sleep 1; done
tray_output primary
colors {
statusline #ffffff
background #1c1c1c
inactive_workspace #1c1c1c #1c1c1c #aaaaaa
focused_workspace #2d2d2d #262626 #ffffff
urgent_workspace #aa0000 #ff0000 #ffffff
}
}
include /etc/sway/config.d/*
for_window [app_id="foot"] opacity 0.9

View file

@ -1,32 +1,96 @@
#!/usr/bin/env sh #!/usr/bin/env lua
case "$1" in
shuf) mpc random on && notify-send "Shuffle enabled" && exit 0 ;; local music_dir = "/home/coast/Music"
shufno) mpc random off && notify-send "Shuffle disabled" && exit 0 ;; local max_length = 30
next) mpc next ;; local default_icon = "/usr/share/icons/hicolor/48x48/apps/musical-note.png"
prev) mpc prev ;;
current) mpc current && exit 0 ;; local function escape(str)
info) return str:gsub("'", "'\\''")
song_file=$(mpc --format '%file%' current) end
song_dir=$(dirname "/home/coast/Music/$song_file")
cover=$(find "$song_dir" -maxdepth 1 \( -iname '*cover*.jpg' -o -iname '*cover*.png' -o -iname '*folder*.jpg' -o -iname '*folder*.png' -o -iname '*front*.jpg' -o -iname '*front*.png' \) | head -n 1) local function capture(cmd)
[ -z "$cover" ] && cover="/usr/share/icons/hicolor/48x48/apps/musical-note.png" local f = io.popen(cmd, 'r')
notify-send "Currently Playing" "$(mpc current)" -i "$cover" && exit 0 local s = f:read('*a')
;; f:close()
search) return s:gsub("^%s*(.-)%s*$", "%1")
choice=$(mpc --format '%title% - %artist% - %album%\t%file%' search any "" \ end
| rofi -dmenu -i -p "Search music" -display-columns 1)
[ -z "$choice" ] && exit 0 local function truncate(str, len)
file=$(printf '%s' "$choice" | cut -f2) if #str > len then
[ -z "$file" ] && exit 0 return str:sub(1, len) .. "..."
mpc clear && mpc add "$file" && mpc play && exit 0 end
;; return str
esac end
mpc play
mpc volume 15 local function get_cover(song_file)
song_file=$(mpc --format '%file%' current) if not song_file or song_file == "" then return default_icon end
music_dir="/home/coast/Music" local full_path = music_dir .. "/" .. song_file
song_abs="$music_dir/$song_file" local dir = full_path:match("(.*[/\\])") or music_dir
song_dir=$(dirname "$song_abs") local names = {"cover.jpg", "cover.png", "folder.jpg", "folder.png", "front.jpg", "front.png"}
cover=$(find "$song_dir" -maxdepth 1 \( -iname '*cover*.jpg' -o -iname '*cover*.png' -o -iname '*folder*.jpg' -o -iname '*folder*.png' -o -iname '*front*.jpg' -o -iname '*front*.png' \) | head -n 1)
[ -z "$cover" ] && cover="/usr/share/icons/hicolor/48x48/apps/musical-note.png" for _, name in ipairs(names) do
notify-send "Now playing..." "$(mpc current)" -i "$cover" local path = dir .. name
local f = io.open(path, "r")
if f then
f:close()
return path
end
end
return default_icon
end
local action = arg[1]
if action == "shuf" then
os.execute("mpc random on >/dev/null && notify-send 'Shuffle enabled'")
os.exit(0)
elseif action == "shufno" then
os.execute("mpc random off >/dev/null && notify-send 'Shuffle disabled'")
os.exit(0)
elseif action == "next" then
os.execute("mpc next >/dev/null")
elseif action == "prev" then
os.execute("mpc prev >/dev/null")
elseif action == "toggle" then
os.execute("mpc toggle >/dev/null")
os.exit(0)
elseif action == "current" then
local current = capture("mpc current")
if current ~= "" then io.write(current .. "\n") end
os.exit(0)
elseif action == "info" then
local file = capture("mpc --format '%file%' current")
local title = capture("mpc current")
local cover = get_cover(file)
os.execute(string.format("notify-send 'Currently Playing' '%s' -i '%s'", escape(title), cover))
os.exit(0)
elseif action == "album" then
local album = capture("mpc list album | rofi -dmenu -i -p 'Select Album'")
if album ~= "" then
os.execute(string.format("mpc clear >/dev/null && mpc find album '%s' | mpc add && mpc play >/dev/null", escape(album)))
end
os.exit(0)
elseif action == "artist" then
local artist = capture("mpc list artist | rofi -dmenu -i -p 'Select Artist'")
if artist ~= "" then
os.execute(string.format("mpc clear >/dev/null && mpc find artist '%s' | mpc add && mpc play >/dev/null", escape(artist)))
end
os.exit(0)
elseif action == "search" then
local menu = "mpc --format '%title% - %artist% - %album%\t%file%' search any '' | rofi -dmenu -i -p 'Search music'"
local choice = capture(menu)
if choice == "" then os.exit(0) end
local file = choice:match("\t(.-)$")
if file then
os.execute(string.format("mpc clear >/dev/null && mpc add '%s' >/dev/null && mpc play >/dev/null", escape(file)))
os.exit(0)
end
end
os.execute("mpc play >/dev/null 2>&1")
os.execute("mpc volume 15 >/dev/null 2>&1")
local file = capture("mpc --format '%file%' current")
local title = capture("mpc current")
local cover = get_cover(file)
local display = truncate(title, max_length)
os.execute(string.format("notify-send 'Now playing...' '%s' -i '%s'", escape(display), cover))

79
local/bin/updateriver Executable file
View file

@ -0,0 +1,79 @@
#!/usr/bin/env lua
local home = os.getenv("home") or os.getenv("HOME")
local cache_dir = home .. "/.cache"
local zig_cache = cache_dir .. "/zig"
local proxy_cmd = "ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:65000 %h %p'"
local project_dir = arg[1] or (home .. "/Projects/river/river")
local function run(cmd)
local ok = os.execute(cmd)
if not ok then
io.stderr:write("failed: " .. cmd .. "\n")
os.exit(1)
end
end
local function fetch_git_dep(path, commit)
local name = path:match("([^/]+)$"):gsub("^zig%-", "")
local tmp = cache_dir .. "/" .. name .. "-tmp"
local tarball = cache_dir .. "/" .. name .. ".tar.gz"
run("rm -rf " .. tmp)
run('GIT_SSH_COMMAND="' .. proxy_cmd .. '" git clone git@codeberg.org:' .. path .. ".git " .. tmp)
run("git -C " .. tmp .. " checkout " .. commit)
run("tar -czf " .. tarball .. " -C " .. cache_dir .. " " .. name .. "-tmp")
run("zig fetch --global-cache-dir " .. zig_cache .. " file://" .. tarball)
run(
"sed -i '/\\."
.. name
.. ' = /,/\\.hash/{s|.url = "[^"]*"|.url = "file://'
.. tarball
.. "\"|}' "
.. project_dir
.. "/build.zig.zon"
)
end
local function fetch_https_dep(url)
local filename = url:match("([^/]+)$")
local name = filename:gsub("^zig%-", ""):gsub("%-v?[0-9].*$", ""):gsub("%.tar%.gz$", "")
local tarball = cache_dir .. "/" .. filename
run('GIT_SSH_COMMAND="' .. proxy_cmd .. '" curl -x socks5h://127.0.0.1:65000 -Lo ' .. tarball .. " " .. url)
run("zig fetch --global-cache-dir " .. zig_cache .. " file://" .. tarball)
run(
"sed -i '/\\."
.. name
.. ' = /,/\\.hash/{s|.url = "[^"]*"|.url = "file://'
.. tarball
.. "\"|}' "
.. project_dir
.. "/build.zig.zon"
)
end
run("git -C " .. project_dir .. " pull")
local zon = io.open(project_dir .. "/build.zig.zon", "r")
if not zon then
io.stderr:write("cant open build.zig.zon\n")
os.exit(1)
end
for line in zon:lines() do
local path, commit = line:match("git%+https://codeberg%.org/([^?]+)%?ref=[^#]+#([a-f0-9]+)")
if path and commit then
fetch_git_dep(path, commit)
else
local url = line:match('"(https://codeberg%.org/[^"]+%.tar%.gz)"')
if url then
fetch_https_dep(url)
end
end
end
zon:close()
run("cd " .. project_dir .. " && zig build -Doptimize=ReleaseSafe --prefix " .. home .. "/.local install")

21
local/bin/upim Executable file
View file

@ -0,0 +1,21 @@
#!/usr/bin/env sh
if [ -z "$1" ]; then
echo "usage: $0 <file>"
exit 1
fi
FILE="$1"
RESPONSE=$(curl -s -X POST \
-F "file=@${FILE}" \
https://coast.is-terrible.com/api/files/create)
URL=$(echo "$RESPONSE" | jq -r '.url')
THUMBNAIL_URL=$(echo "$RESPONSE" | jq -r '.thumb')
DELETION_URL=$(echo "$RESPONSE" | jq -r '.del_url')
ERROR=$(echo "$RESPONSE" | jq -r '.error')
if [ "$ERROR" != "null" ]; then
echo "Error uploading file: $ERROR"
exit 1
fi
echo "file uploaded successfully!"
echo "url: $URL"
echo "thumbnail url: $THUMBNAIL_URL"
echo "deletion url: $DELETION_URL"