diff --git a/flake.lock b/flake.lock index ccc89e6..01a0c37 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,54 @@ { "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745357003, + "narHash": "sha256-jYwzQkv1r7HN/4qrAuKp+NR4YYNp2xDrOX5O9YVqkWo=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "a19cf76ee1a15c1c12083fa372747ce46387289f", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -23,7 +72,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems" + "systems": "systems_2" }, "locked": { "lastModified": 1731533236, @@ -39,6 +88,28 @@ "type": "github" } }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -121,6 +192,265 @@ "type": "github" } }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745948457, + "narHash": "sha256-lzTV10FJTCGNtMdgW5YAhCAqezeAzKOd/97HbQK8GTU=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "ac903e80b33ba6a88df83d02232483d99f327573", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745015490, + "narHash": "sha256-apEJ9zoSzmslhJ2vOKFcXTMZLUFYzh1ghfB6Rbw3Low=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "60754910946b4e2dc1377b967b7156cb989c5873", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprgraphics": "hyprgraphics", + "hyprland-protocols": "hyprland-protocols", + "hyprland-qtutils": "hyprland-qtutils", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1746536008, + "narHash": "sha256-JCelAgqaJu8z5ESjxri7ogT/h3NhJWi1U7A1WEVLsKc=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "708a7c24ef2c137c04c2473ee6b3f841ed5a1d8b", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1743714874, + "narHash": "sha256-yt8F7NhMFCFHUHy/lNjH/pjZyIDFNk52Q4tivQ31WFo=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "3a5c2bda1c1a4e55cc1330c782547695a93f05b2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprland-qt-support": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprland-qtutils", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "hyprland-qtutils", + "nixpkgs" + ], + "systems": [ + "hyprland", + "hyprland-qtutils", + "systems" + ] + }, + "locked": { + "lastModified": 1737634706, + "narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=", + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "rev": "8810df502cdee755993cb803eba7b23f189db795", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "type": "github" + } + }, + "hyprland-qtutils": { + "inputs": { + "hyprland-qt-support": "hyprland-qt-support", + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprland-qtutils", + "hyprlang", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745951494, + "narHash": "sha256-2dModE32doiyQMmd6EDAQeZnz+5LOs6KXyE0qX76WIg=", + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "rev": "4be1d324faf8d6e82c2be9f8510d299984dfdd2e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745357019, + "narHash": "sha256-q/C3qj9FWHQenObXuw/nGIT8iIsWFjgmcQYcA+ZfpPs=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "397600c42b8d7a443a5b4e92aa15f46650a90f18", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745975815, + "narHash": "sha256-s3GzsRxBL/N/xYgUXZhQh4t62uR1BN4zxXgWBtJ3lWM=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "05878d9470c9e5cbc8807813f9ec2006627a0ca0", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1739870480, + "narHash": "sha256-SiDN5BGxa/1hAsqhgJsS03C3t2QrLgBT8u+ENJ0Qzwc=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "206367a08dc5ac4ba7ad31bdca391d098082e64b", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, "ixx": { "inputs": { "flake-utils": [ @@ -151,16 +481,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1746397377, - "narHash": "sha256-5oLdRa3vWSRbuqPIFFmQBGGUqaYZBxX+GGtN9f/n4lU=", - "owner": "nixos", + "lastModified": 1746141548, + "narHash": "sha256-IgBWhX7A2oJmZFIrpRuMnw5RAufVnfvOgHWgIdds+hc=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "ed30f8aba41605e3ab46421e3dcb4510ec560ff8", + "rev": "f02fddb8acef29a8b32f10a335d44828d7825b78", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", + "owner": "NixOS", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -213,6 +543,22 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1746397377, + "narHash": "sha256-5oLdRa3vWSRbuqPIFFmQBGGUqaYZBxX+GGtN9f/n4lU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ed30f8aba41605e3ab46421e3dcb4510ec560ff8", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixvim": { "inputs": { "flake-parts": "flake-parts", @@ -258,13 +604,37 @@ "type": "github" } }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1742649964, + "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "home-manager": "home-manager", "home-manager-stable-darwin": "home-manager-stable-darwin", "home-manager-stable-nixos": "home-manager-stable-nixos", "home-manager-unstable": "home-manager-unstable", - "nixpkgs": "nixpkgs", + "hyprland": "hyprland", + "nixpkgs": "nixpkgs_2", "nixpkgs-stable-darwin": "nixpkgs-stable-darwin", "nixpkgs-stable-nixos": "nixpkgs-stable-nixos", "nixpkgs-unstable": "nixpkgs-unstable", @@ -272,6 +642,21 @@ } }, "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_2": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -285,6 +670,47 @@ "repo": "default", "type": "github" } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1745871725, + "narHash": "sha256-M24SNc2flblWGXFkGQfqSlEOzAGZnMc9QG3GH4K/KbE=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "76bbf1a6b1378e4ab5230bad00ad04bc287c969e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index f2706a8..da80f90 100644 --- a/flake.nix +++ b/flake.nix @@ -21,13 +21,15 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + nixvim = { url = "github:nix-community/nixvim"; inputs.nixpkgs.follows = "nixpkgs"; }; + hyprland.url = "github:hyprwm/Hyprland"; }; - outputs = { self, nixpkgs, home-manager, nixvim, ... }@inputs: + outputs = { self, nixpkgs, home-manager, nixvim, hyprland, ... }@inputs: let overlays = []; personalEmail = "patrickcanal3@gmail.com"; diff --git a/home/default.nix b/home/default.nix index 903cf26..5590363 100644 --- a/home/default.nix +++ b/home/default.nix @@ -7,6 +7,11 @@ ./git.nix ./kitty.nix ./zoxide.nix + + ./hyprland.nix + ./wofi.nix + ./hyprlock.nix + ./waybar.nix ]; home.username = "${currentSystemUser}"; diff --git a/home/hyprland.nix b/home/hyprland.nix new file mode 100644 index 0000000..1d6dcad --- /dev/null +++ b/home/hyprland.nix @@ -0,0 +1,61 @@ +{ currentSystemUser, ... }: +{ + wayland.windowManager.hyprland = { + enable = true; + settings = { + "$mod" = "SUPER"; + bind = [ + "$mod, Return, exec, kitty" + "$mod, F, fullscreen" + "$mod, SPACE, exec, wofi --show run" + "$mod SHIFT, Q, killactive" + "$mod SHIFT, L, exec, hyprlock" + + "$mod, H, movefocus, l" + "$mod, L, movefocus, r" + "$mod, K, movefocus, u" + "$mod, J, movefocus, d" + "$mod SHIFT, H, movewindow, l" + "$mod SHIFT, L, movewindow, r" + "$mod SHIFT, K, movewindow, u" + "$mod SHIFT, J, movewindow, d" + ] ++ ( + builtins.concatLists (builtins.genList (i: + let ws = i + 1; + in [ + "$mod, code:1${toString i}, workspace, ${toString ws}" + "$mod SHIFT, code:1${toString i}, movetoworkspace, ${toString ws}" + ] + ) + 9) + ); + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + monitor = ", preferred, auto, 1"; + + input = { + touchpad = { + natural_scroll = "yes"; + }; + + sensitivity = "0"; + }; + + exec-once = [ + "waybar" + "hyprpaper" + ]; + }; + }; + + services.hyprpaper = { + enable = true; + settings = { + preload = ["/home/${currentSystemUser}/Pictures/wallpaper.jpg"]; + wallpaper = [",/home/${currentSystemUser}/Pictures/wallpaper.jpg"]; + }; + }; +} diff --git a/home/hyprlock.nix b/home/hyprlock.nix new file mode 100644 index 0000000..5174eb3 --- /dev/null +++ b/home/hyprlock.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + programs.hyprlock = { + enable = true; + }; +} diff --git a/home/waybar.nix b/home/waybar.nix new file mode 100644 index 0000000..4cfab80 --- /dev/null +++ b/home/waybar.nix @@ -0,0 +1,373 @@ +{ ... }: +{ + programs.waybar = { + enable = true; + + settings = { + mainBar = { + height = 30; + spacing = 1; + modules-left = [ + "hyprland/workspaces" + ]; + modules-center = [ + "hyprland/window" + ]; + modules-right = [ + "tray" + "pulseaudio" + "network" + "power-profiles-daemon" + "backlight" + "battery" + "clock" + ]; + + "hyprland/workspaces" = { + format = "{name} {icon}"; + format-icons = { + "1" = ""; + "2" = ""; + "3" = ""; + "4" = ""; + "5" = ""; + }; + }; + "tray" = { + spacing = 10; + }; + "pulseaudio" = { + format = "{volume}% {icon}"; + format-icons = { + headphones = ""; + bluetooth = "󰥰"; + handsfree = ""; + headset = "󱡬"; + phone = ""; + portable = ""; + car = ""; + default = ["🕨" "🕩" "🕪"]; + }; + on-click = "pavucontrol"; + }; + "hyprland/window" = { + format = "{class}"; + }; + "battery" = { + "interval" = 1; + states = { + good = 80; + warning = 30; + critical = 20; + }; + format = "{capacity}% {icon}"; + format-charging = "{capacity}% 󰂄"; + format-plugged = "{capacity}% "; + format-alt = "{time} {icon}"; + format-icons = [ + "󰁻" + "󰁼" + "󰁾" + "󰂀" + "󰂂" + "󰁹" + ]; + }; + # Currently not enabled because i don't want to add some external tools to manage brightness + # backlight = { + # format = "{percent}% {icon}"; + # format-icons = [ + # "" + # "" + # "" + # "" + # "" + # "" + # "" + # "" + # "" + # "" + # ]; + # on-scroll-down = "light -A 10"; + # on-scroll-up = "light -U 10"; + # smooth-scrolling-threshold = 1; + # }; + "network" = { + format-wifi = "{ipaddr} Wi-Fi"; + format-ethernet = "{ipaddr} Eth"; + }; + "power-profiles-daemon" = { + "format" = "{icon}"; + "tooltip-format" = "Power profile: {profile}\nDriver: {driver}"; + "tooltip" = true; + "format-icons" = { + "default" = ""; + "performance" = ""; + "balanced" = ""; + "power-saver" = ""; + }; + }; + }; + }; + + style = '' +@define-color rosewater #f5e0dc; +@define-color flamingo #f2cdcd; +@define-color pink #f5c2e7; +@define-color mauve #cba6f7; +@define-color red #f38ba8; +@define-color maroon #eba0ac; +@define-color peach #fab387; +@define-color yellow #f9e2af; +@define-color green #a6e3a1; +@define-color teal #94e2d5; +@define-color sky #89dceb; +@define-color sapphire #74c7ec; +@define-color blue #89b4fa; +@define-color lavender #b4befe; +@define-color text #cdd6f4; +@define-color subtext1 #bac2de; +@define-color subtext0 #a6adc8; +@define-color overlay2 #9399b2; +@define-color overlay1 #7f849c; +@define-color overlay0 #6c7086; +@define-color surface2 #585b70; +@define-color surface1 #45475a; +@define-color surface0 #313244; +@define-color base #1e1e2e; +@define-color mantle #181825; +@define-color crust #11111b; + +* { + border: none; + border-radius: 1px; + font-family: JetBrainsMono Nerd Font; + font-size: 13px; + min-height: 0; +} + +window#waybar { + background-color: @mantle; + color: @text; +} + +window#waybar.hidden { + opacity: 0.2; +} + +tooltip { + background-color: @base; + border: 1px solid @surface1; +} + +tooltip label { + color: @text; +} + +button { + box-shadow: inset 0 -3px transparent; + border: none; + border-radius: 1px; +} + +button:hover { + background: inherit; + box-shadow: inset 0 -3px @text; +} + +#workspaces button { + padding: 0 0; + background-color: @mantle; + color: @text; +} + +#workspaces button:hover { + box-shadow: inherit; + text-shadow: inherit; + background-image: linear-gradient(0deg, @surface1, @mantle); +} + +#workspaces button.focused { + background-image: linear-gradient(0deg, @mauve, @surface1); + box-shadow: inset 0 -3px @text; +} + +#workspaces button.urgent { + background-image: linear-gradient(0deg, @red, @mantle); +} + +#taskbar button.active { + background-image: linear-gradient(0deg, @surface1, @mantle); +} + +#mode { + background-color: @base; + box-shadow: inset 0 -2px @text; +} + +#mpris, +#custom-weather, +#clock, +#language, +#pulseaudio, +#bluetooth, +#network, +#memory, +#cpu, +#temperature, +#disk, +#custom-kernel, +#idle_inhibitor, +#scratchpad, +#mode, +#power-profiles-daemon, +#backlight, +#battery, +#tray { + padding: 0 10px; + margin: 5px 1px; + color: @text; +} + +#window, +#workspaces { + margin: 0 4px; +} + +#power-profiles-daemon { + background-color: @red; + color: @base; +} + +#custom-weather { + background-color: @teal; + color: @mantle; + margin-right: 5px; +} + +#custom-kernel { + background-color: @rosewater; + color: @mantle; +} + +#clock { + background-color: @green; + color: @mantle; +} + +@keyframes blink { + to { + background-color: @mantle; + color: @text; + } +} + +label:focus { + background-color: @mantle; +} + +#cpu { + background-color: @mauve; + color: @mantle; + min-width: 45px; +} + +#memory { + background-color: @red; + color: @mantle; +} + +#disk { + background-color: @flamingo; + color: @mantle; +} + +#battery { + background-color: @mauve; + color: @base; +} + +#backlight { + background-color: @sky; + color: @base; +} + +#network { + background-color: @peach; + color: @mantle; +} + +#network.disconnected { + background-color: red; + color: @mantle; +} + +#bluetooth { + background-color: @maroon; + color: @mantle; + min-width: 40px; +} + +#pulseaudio { + background-color: @yellow; + color: @mantle; +} + +#pulseaudio.muted { + background-color: red; + color: @mantle; +} + +#temperature { + background-color: @pink; + color: @mantle; + min-width: 37px; +} + +#temperature.critical { + background-color: red; + color: @mantle; + min-width: 37px; +} + +#mpris { + background-color: @base; + color: @text; +} + +#tray { + background-color: @overlay0; + color: @text; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: @mantle; +} + +#idle_inhibitor { + background-color: @base; + color: @text; + font-family: Inter; +} + +#idle_inhibitor.activated { + background-color: @text; + color: @base; +} + +#scratchpad { + background-color: @base; + color: @text; +} + +#scratchpad.empty { + background-color: transparent; +} + ''; + }; +} diff --git a/home/wofi.nix b/home/wofi.nix new file mode 100644 index 0000000..6b203b9 --- /dev/null +++ b/home/wofi.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + programs.wofi = { + enable = true; + }; +} diff --git a/lib/mksystem.nix b/lib/mksystem.nix index 804251f..177ba49 100644 --- a/lib/mksystem.nix +++ b/lib/mksystem.nix @@ -81,6 +81,7 @@ systemFunc { nix-homebrew-config home-manager.home-manager { + home-manager.backupFileExtension = "backup"; home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.users.${user} = import HMConfig; diff --git a/modules/packages.nix b/modules/packages.nix index 16f8632..a448dee 100644 --- a/modules/packages.nix +++ b/modules/packages.nix @@ -41,10 +41,12 @@ # GUI applications baobab brave + hyprpaper kdePackages.xdg-desktop-portal-kde kitty mpv nextcloud-client + pavucontrol spotube telegram-desktop @@ -63,6 +65,8 @@ remotePlay.openFirewall = true; } else {}; + programs.hyprland.enable = true; + programs.nh = { enable = true; clean.enable = true;