Advertisement
Guest User

Untitled

a guest
Oct 5th, 2018
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.65 KB | None | 0 0
  1. -- ████
  2. -- ▒▒███
  3. -- ████████ ██████ ▒███ █████ ████ ██████
  4. -- ▒▒███▒▒███ ███▒▒███ ▒███ ▒▒███ ▒███ ▒▒▒▒▒███
  5. -- ▒███ ▒▒▒ ▒███ ▒▒▒ ▒███ ▒███ ▒███ ███████
  6. -- ▒███ ▒███ ███ ▒███ ▒███ ▒███ ███▒▒███
  7. -- █████ ▒▒██████ ██ █████ ▒▒████████▒▒████████
  8. -- ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒
  9. --
  10. --------------------------------------------------------------------------------
  11.  
  12. local theme_collection = {
  13. "manta", -- 1 --
  14. --"whatever", -- 2 --
  15. -- Add more themes here
  16. }
  17.  
  18. -- Change this number to use a different theme
  19. local theme_name = theme_collection[1]
  20.  
  21. --------------------------------------------------------------------------------
  22.  
  23. -- Jit
  24. --pcall(function() jit.on() end)
  25.  
  26. -- Theme handling library
  27. local beautiful = require("beautiful")
  28. -- Themes define colours, icons, font and wallpapers.
  29. local theme_dir = os.getenv("HOME") .. "/.config/awesome/themes/"
  30. beautiful.init( theme_dir .. theme_name .. "/theme.lua" )
  31. --beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
  32.  
  33. -- Standard awesome library
  34. local gears = require("gears")
  35. local awful = require("awful")
  36. require("awful.autofocus")
  37. -- Widget and layout library
  38. local wibox = require("wibox")
  39. -- Default notification library
  40. local naughty = require("naughty")
  41. local menubar = require("menubar")
  42. local hotkeys_popup = require("awful.hotkeys_popup").widget
  43. -- Enable hotkeys help widget for VIM and other apps
  44. -- when client with a matching name is opened:
  45. require("awful.hotkeys_popup.keys")
  46.  
  47. -- {{{ Initialize stuff
  48. local helpers = require("helpers")
  49. local bars = require("bars")
  50. local keys = require("keys")
  51. local titlebars = require("titlebars")
  52. -- }}}
  53.  
  54. -- {{{ Third party stuff
  55. --local volumebar_widget = require("third_party.awesome-wm-widgets.volumebar-widget.volumebar")
  56. --local mpdarc_widget = require("third_party.awesome-wm-widgets.mpdarc-widget.mpdarc")
  57. -- }}}
  58.  
  59. -- {{{ Error handling
  60. -- Check if awesome encountered an error during startup and fell back to
  61. -- another config (This code will only ever execute for the fallback config)
  62. if awesome.startup_errors then
  63. naughty.notify({ preset = naughty.config.presets.critical,
  64. title = "Oops, there were errors during startup!",
  65. text = awesome.startup_errors })
  66. end
  67.  
  68. -- Handle runtime errors after startup
  69. do
  70. local in_error = false
  71. awesome.connect_signal("debug::error", function (err)
  72. -- Make sure we don't go into an endless error loop
  73. if in_error then return end
  74. in_error = true
  75.  
  76. naughty.notify({ preset = naughty.config.presets.critical,
  77. title = "Oops, an error happened!",
  78. text = tostring(err) })
  79. in_error = false
  80. end)
  81. end
  82. -- }}}
  83.  
  84. -- {{{ Variable definitions
  85. -- This is used later as the default terminal and editor to run.
  86. terminal = "termite"
  87. floating_terminal = "termite --class Diptera"
  88. tmux = terminal .. " -e tmux new "
  89. floating_tmux = terminal .. " --class Diptera -e tmux new "
  90. editor = "vim"
  91. --editor = os.getenv("EDITOR") or "nano"
  92. editor_cmd = terminal .. " -e " .. editor .. " "
  93.  
  94. -- Table of layouts to cover with awful.layout.inc, order matters.
  95. awful.layout.layouts = {
  96. -- I only ever use these
  97. awful.layout.suit.tile,
  98. awful.layout.suit.floating,
  99. awful.layout.suit.max,
  100. --awful.layout.suit.spiral,
  101. --awful.layout.suit.spiral.dwindle,
  102. --awful.layout.suit.tile.top,
  103. --awful.layout.suit.fair,
  104. --awful.layout.suit.fair.horizontal,
  105. --awful.layout.suit.tile.left,
  106. --awful.layout.suit.tile.bottom,
  107. --awful.layout.suit.max.fullscreen,
  108. --awful.layout.suit.corner.nw,
  109. --awful.layout.suit.magnifier,
  110. --awful.layout.suit.corner.ne,
  111. --awful.layout.suit.corner.sw,
  112. --awful.layout.suit.corner.se,
  113. }
  114. -- }}}
  115.  
  116. -- {{{ Notifications
  117. -- TODO: some options are not respected when the notification is created
  118. -- through lib-notify. Naughty works as expected.
  119.  
  120. -- Icon size
  121. naughty.config.defaults['icon_size'] = beautiful.notification_icon_size
  122.  
  123. -- Timeouts
  124. naughty.config.defaults.timeout = 5
  125. naughty.config.presets.low.timeout = 2
  126. naughty.config.presets.critical.timeout = 12
  127.  
  128. -- Apply theme variables
  129. naughty.config.padding = beautiful.notification_padding
  130. naughty.config.spacing = beautiful.notification_spacing
  131. naughty.config.defaults.margin = beautiful.notification_margin
  132. naughty.config.defaults.border_width = beautiful.notification_border_width
  133.  
  134. naughty.config.presets.normal = {
  135. font = beautiful.font,
  136. fg = beautiful.notification_fg,
  137. bg = beautiful.notification_bg,
  138. border_width = beautiful.notification_border_width,
  139. margin = beautiful.notification_margin,
  140. position = beautiful.notification_position
  141. }
  142.  
  143. naughty.config.presets.low = {
  144. font = beautiful.font,
  145. fg = beautiful.notification_fg,
  146. bg = beautiful.notification_bg,
  147. border_width = beautiful.notification_border_width,
  148. margin = beautiful.notification_margin,
  149. position = beautiful.notification_position
  150. }
  151.  
  152. naughty.config.presets.ok = naughty.config.presets.low
  153. naughty.config.presets.info = naughty.config.presets.low
  154. naughty.config.presets.warn = naughty.config.presets.normal
  155.  
  156. naughty.config.presets.critical = {
  157. font = beautiful.font,
  158. fg = beautiful.notification_crit_fg,
  159. bg = beautiful.notification_crit_bg,
  160. border_width = beautiful.notification_border_width,
  161. margin = beautiful.notification_margin,
  162. position = beautiful.notification_position
  163. }
  164.  
  165. -- }}}
  166.  
  167. -- {{{ Menu
  168. -- Create a launcher widget and a main menu
  169. myawesomemenu = {
  170. { "hotkeys", function() return false, hotkeys_popup.show_help end},
  171. { "manual", terminal .. " -e \"man awesome\"" },
  172. { "restart", awesome.restart },
  173. { "quit", function() awesome.quit() end}
  174. }
  175. mymusicmenu = {
  176. { "mpd toggle", function() awful.spawn.with_shell("mpc toggle") end},
  177. { "mpd next", function() awful.spawn.with_shell("mpc next") end},
  178. { "mpd previous", function() awful.spawn.with_shell("mpc prev") end},
  179. { "ncmpcpp", function() awful.spawn.with_shell(terminal .. " -e ncmpcpp") end},
  180. { "--------------", nil},
  181. { "mpv toggle", function() awful.spawn.with_shell("mpvc toggle") end},
  182. { "mpv next", function() awful.spawn.with_shell("mpvc next") end},
  183. { "mpv previous", function() awful.spawn.with_shell("mpvc prev") end},
  184. { "mpvtube", function() awful.spawn.with_shell("~/scr/Rofi/rofi_mpvtube") end}
  185. }
  186.  
  187.  
  188.  
  189. -- Need to allow these commands to be run without password
  190. -- Or if you are using systemd: systemctl [suspend|hibernate]
  191. mypowermenu = {
  192. { "reboot", "reboot" },
  193. { "suspend", "sudo pm-suspend" },
  194. { "hibernate", "sudo pm-hibernate" },
  195. { "poweroff", "poweroff" }
  196. }
  197.  
  198. --mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
  199. --{ "music", mymusicmenu, beautiful.awesome_icon },
  200. --{ "power", mypowermenu, beautiful.awesome_icon },
  201. mymainmenu = awful.menu({ items = {
  202. { "awesome", myawesomemenu },
  203. { "music", mymusicmenu },
  204. { "firefox", "firefox" },
  205. { "files", "nemo" },
  206. { "discord", "discord" },
  207. { "gimp", "gimp" },
  208. { "appearance", "lxappearance" },
  209. { "volume", "pavucontrol" },
  210. { "games", "lutris" },
  211. { "steam", "steam" },
  212. { "terminal", terminal },
  213. { "power", mypowermenu }
  214. }
  215. })
  216.  
  217. mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
  218. menu = mymainmenu })
  219.  
  220. -- Menubar configuration
  221. menubar.utils.terminal = terminal -- Set the terminal for applications that require it
  222. -- }}}
  223.  
  224. local function set_wallpaper(s)
  225. -- Wallpaper
  226. if beautiful.wallpaper then
  227. local wallpaper = beautiful.wallpaper
  228. -- If wallpaper is a function, call it with the screen
  229. if type(wallpaper) == "function" then
  230. wallpaper = wallpaper(s)
  231. end
  232.  
  233. -- Method 1: Built in function
  234. --gears.wallpaper.maximized(wallpaper, s, true)
  235.  
  236. -- Method 2: Set theme's wallpaper with feh
  237. --awful.spawn.with_shell("feh --bg-fill " .. wallpaper)
  238.  
  239. -- Method 3: Set last wallpaper with feh
  240. awful.spawn.with_shell(os.getenv("HOME") .. "/.fehbg")
  241. end
  242. end
  243.  
  244. -- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
  245. screen.connect_signal("property::geometry", set_wallpaper)
  246.  
  247. -- Tag Names
  248. local tagnames = beautiful.tagnames or { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }
  249.  
  250. awful.screen.connect_for_each_screen(function(s)
  251. -- Wallpaper
  252. set_wallpaper(s)
  253.  
  254. -- Layouts
  255. -- Each screen has its own tag table.
  256. local l = awful.layout.suit -- Alias to save time :)
  257. local layouts = { l.max, l.floating, l.max, l.tile , l.tile,
  258. l.max, l.floating, l.max, l.floating, l.floating}
  259. awful.tag(tagnames, s, layouts)
  260. end)
  261.  
  262. -- {{{ Rules
  263. -- Rules to apply to new clients (through the "manage" signal).
  264. awful.rules.rules = {
  265. -- All clients will match this rule.
  266. { rule = { },
  267. properties = { border_width = beautiful.border_width,
  268. border_color = beautiful.border_normal,
  269. focus = awful.client.focus.filter,
  270. raise = true,
  271. keys = keys.clientkeys,
  272. buttons = keys.clientbuttons,
  273. screen = awful.screen.preferred,
  274. size_hints_honor = false,
  275. honor_workarea = true,
  276. honor_padding = true,
  277. placement = awful.placement.no_overlap+awful.placement.no_offscreen
  278. }
  279. },
  280.  
  281. -- Floating clients
  282. { rule_any = {
  283. instance = {
  284. "DTA", -- Firefox addon DownThemAll.
  285. "copyq", -- Includes session name in class.
  286. },
  287. class = {
  288. "Galculator",
  289. "feh",
  290. "Gpick",
  291. "Diptera", -- Floating Termite
  292. },
  293.  
  294. name = {
  295. "Event Tester", -- xev
  296. },
  297. role = {
  298. "AlarmWindow", -- Thunderbird's calendar.
  299. "pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
  300. }
  301. }, properties = { floating = true, ontop = false }},
  302.  
  303. -- Add titlebars to normal clients and dialogs
  304. -- Not needed anymore --
  305. { rule_any = {type = { "normal", "dialog" }
  306. }, properties = { titlebars_enabled = true }--,
  307. --callback = function (c)
  308. --end
  309. },
  310.  
  311. -- Centered clients
  312. { rule_any = {
  313. type = {
  314. "dialog",
  315. },
  316. class = {
  317. "feh",
  318. },
  319. name = {
  320. "Save As",
  321. },
  322. role = {
  323. "GtkFileChooserDialog",
  324. }
  325. }, properties = {},
  326. callback = function (c)
  327. awful.placement.centered(c,{honor_workarea=true})
  328. end
  329. },
  330.  
  331. -- Titlebars OFF (explicitly)
  332. -- Titlebars of these clients will be hidden regardless of the theme setting
  333. { rule_any = {
  334. class = {
  335. "qutebrowser",
  336. "feh",
  337. "Gimp",
  338. "Sublime_text",
  339. --"discord",
  340. --"TelegramDesktop",
  341. "Firefox",
  342. "Chromium-browser",
  343. "Rofi",
  344. },
  345. }, properties = {},
  346. callback = function (c)
  347. if not beautiful.titlebars_imitate_borders then
  348. awful.titlebar.hide(c, beautiful.titlebar_position)
  349. end
  350. end
  351. },
  352.  
  353.  
  354. -- Titlebars ON (explicitly)
  355. -- Titlebars of these clients will be shown regardless of the theme setting
  356. { rule_any = {
  357. class = {
  358. --"feh",
  359. --"qutebrowser",
  360. --"Firefox",
  361. --"Rofi"
  362. },
  363. }, properties = {},
  364. callback = function (c)
  365. awful.titlebar.show(c, beautiful.titlebar_position)
  366. end
  367. },
  368.  
  369. -- Skip taskbar
  370. { rule_any = {
  371. class = {
  372. --"feh",
  373. },
  374.  
  375. }, properties = {},
  376. callback = function (c)
  377. c.skip_taskbar = true
  378. end
  379. },
  380.  
  381. -- Fixed terminal geometry
  382. { rule_any = {
  383. class = {
  384. "Termite",
  385. "Diptera",
  386. "mpvtube",
  387. "kitty",
  388. "st-256color",
  389. "st",
  390. "URxvt",
  391. "XTerm",
  392. },
  393. }, properties = { width = 640, height = 400 }
  394. },
  395.  
  396. -- File managers
  397. { rule_any = {
  398. class = {
  399. "Nemo",
  400. "Thunar"
  401. },
  402. }, properties = { floating = true, width = 580, height = 440 }
  403. },
  404.  
  405. -- Rofi configuration
  406. -- Needed only if option "-normal-window" is used
  407. { rule_any = {
  408. class = {
  409. "Rofi",
  410. },
  411. }, properties = { floating = true, ontop = true, sticky = true },
  412. callback = function (c)
  413. c.skip_taskbar = true
  414. awful.placement.centered(c,{honor_workarea=true})
  415. end
  416. },
  417.  
  418. -- Screenruler
  419. { rule_any = {
  420. class = {
  421. "Screenruler",
  422. },
  423. }, properties = { floating = true, ontop = true },
  424. callback = function (c)
  425. c.border_width = 0
  426. awful.titlebar.hide(c, beautiful.titlebar_position)
  427. awful.placement.centered(c,{honor_workarea=true})
  428. end
  429. },
  430.  
  431. -- On screen keyboard
  432. --{ rule_any = {
  433. --class = {
  434. --"Onboard",
  435. --},
  436. --}, properties = { floating = true, ontop = false, sticky = false, focusable = false },
  437. --callback = function (c)
  438. ----c.skip_taskbar = true
  439. ----awful.placement.centered(c,{honor_workarea=true})
  440. --end
  441. --},
  442.  
  443. -- Scratchpad and calendar (calcurse)
  444. { rule_any = {
  445. class = {
  446. "scratchpad",
  447. "calendar",
  448. },
  449. }, properties = { tag = awful.screen.focused().tags[10], floating = true, ontop = false, sticky = true },
  450. callback = function (c)
  451. c.skip_taskbar = true
  452. c.minimized = true
  453. awful.placement.centered(c,{honor_workarea=true})
  454. end
  455. },
  456.  
  457. ---------------------------------------------
  458. -- Start application on specific workspace --
  459. ---------------------------------------------
  460. -- Example:
  461. -- Set Firefox to always map on the tag named "2" on screen 1.
  462. --{ rule = { class = "Firefox" },
  463. --properties = { screen = 1, tag = "2" } },
  464. -- Browsing
  465. { rule_any = {
  466. class = {
  467. "Firefox",
  468. "Chromium-browser",
  469. "qutebrowser",
  470. },
  471. --local clients =
  472. }, properties = { screen = 1, tag = awful.screen.focused().tags[1] } },
  473.  
  474. -- Chatting
  475. { rule_any = {
  476. class = {
  477. "discord",
  478. "TelegramDesktop",
  479. "TeamSpeak 3",
  480. },
  481. --local clients =
  482. }, properties = { screen = 1, tag = awful.screen.focused().tags[3] } },
  483.  
  484. -- Photo editing
  485. { rule_any = {
  486. class = {
  487. "Gimp",
  488. "Inkscape",
  489. },
  490. }, properties = { screen = 1, tag = awful.screen.focused().tags[6] } },
  491.  
  492. -- Gaming
  493. { rule_any = {
  494. class = {
  495. "Steam",
  496. "battle.net.exe",
  497. "Lutris",
  498. },
  499. }, properties = { screen = 1, tag = awful.screen.focused().tags[8] } },
  500.  
  501. -- Music
  502. { rule_any = {
  503. class = {
  504. "mpvtube",
  505. },
  506. --name = {
  507. --"mpvtube",
  508. --},
  509.  
  510. }, properties = { screen = 1, tag = awful.screen.focused().tags[10] },
  511. callback = function (c)
  512. awful.placement.centered(c,{honor_workarea=true})
  513. gears.timer.delayed_call(function()
  514. c.urgent = false
  515. end)
  516. end
  517. },
  518. }
  519. -- }}}
  520.  
  521. -- {{{ Signals
  522. -- Signal function to execute when a new client appears.
  523. client.connect_signal("manage", function (c)
  524. -- Set every new window as a slave,
  525. -- i.e. put it at the end of others instead of setting it master.
  526. if not awesome.startup then awful.client.setslave(c) end
  527.  
  528. if awesome.startup and
  529. not c.size_hints.user_position
  530. and not c.size_hints.program_position then
  531. -- Prevent clients from being unreachable after screen count changes.
  532. awful.placement.no_offscreen(c)
  533. end
  534.  
  535. -- Hide titlebars if required by the theme
  536. if not beautiful.titlebars_enabled then
  537. awful.titlebar.hide(c, beautiful.titlebar_position)
  538. end
  539.  
  540. -- If the layout is not floating, every floating client that appears is centered
  541. if awful.layout.get(mouse.screen) ~= awful.layout.suit.floating then
  542. awful.placement.centered(c,{honor_workarea=true})
  543. else
  544. -- If the layout is floating, and there is no other client visible, center it
  545. if #mouse.screen.clients == 1 then
  546. awful.placement.centered(c,{honor_workarea=true})
  547. end
  548. end
  549. end)
  550.  
  551. -- Enable sloppy focus, so that focus follows mouse.
  552. --client.connect_signal("mouse::enter", function(c)
  553. -- if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
  554. -- and awful.client.focus.filter(c) then
  555. -- client.focus = c
  556. -- end
  557. --end)
  558.  
  559. -- Rounded corners
  560. if beautiful.border_radius ~= 0 then
  561. client.connect_signal("manage", function (c, startup)
  562. if not c.fullscreen then
  563. c.shape = helpers.rrect(beautiful.border_radius)
  564. end
  565. end)
  566.  
  567. -- Make sure fullscreen clients do not have rounded corners
  568. client.connect_signal("property::fullscreen", function (c)
  569. if c.fullscreen then
  570. -- Use delayed_call in order to avoid flickering when corners
  571. -- change shape
  572. gears.timer.delayed_call(function()
  573. c.shape = helpers.rect()
  574. end)
  575. else
  576. c.shape = helpers.rrect(beautiful.border_radius)
  577. end
  578. end)
  579. end
  580.  
  581. -- When a client starts up in fullscreen, resize it to cover the fullscreen a short moment later
  582. -- Fixes wrong geometry when titlebars are enabled
  583. client.connect_signal("property::fullscreen", function(c)
  584. if c.fullscreen then
  585. gears.timer.delayed_call(function()
  586. if c.valid then
  587. c:geometry(c.screen.geometry)
  588. end
  589. end)
  590. end
  591. end)
  592.  
  593. -- Center client when floating property changes
  594. --client.connect_signal("property::floating", function(c)
  595. --awful.placement.centered(c,{honor_workarea=true})
  596. --end)
  597.  
  598. -- Apply shapes
  599. -- beautiful.notification_shape = helpers.infobubble(beautiful.notification_border_radius)
  600. beautiful.notification_shape = helpers.rrect(beautiful.notification_border_radius)
  601. beautiful.snap_shape = helpers.rrect(beautiful.border_radius * 2)
  602. beautiful.taglist_shape = helpers.rrect(beautiful.taglist_item_roundness)
  603.  
  604. client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
  605. client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
  606.  
  607. -- Scratchpad gets minimized when it loses focus
  608. --client.connect_signal("unfocus", function(c)
  609. --if c.class == "scratchpad" or c.class == "calendar" then
  610. --c.minimized = true
  611. --end
  612. --end)
  613.  
  614. -- Scratchpad gets minimized if it is focused and tag changes
  615. awful.tag.attached_connect_signal(s, "property::selected", function ()
  616. local c = client.focus
  617. if c ~= nil then
  618. if c.class == "scratchpad" or c.class == "calendar" then
  619. c.minimized = true
  620. end
  621. end
  622. end)
  623.  
  624. -- Test signal
  625. -- Use the following line to trigger it:
  626. -- awesome.emit_signal("dummy")
  627. --awesome.connect_signal("dummy", function(c)
  628. --naughty.notify({ preset = naughty.config.presets.normal,
  629. --title = "bitch",
  630. --text = "dummy" })
  631. --end)
  632.  
  633. -- Floating: restore geometry
  634. tag.connect_signal('property::layout',
  635. function(t)
  636. for k, c in ipairs(t:clients()) do
  637. if awful.layout.get(mouse.screen) == awful.layout.suit.floating then
  638. -- Geometry x = 0 and y = 0 most probably means that the
  639. -- clients have been spawned in a non floating layout, and thus
  640. -- they don't have their floating_geometry set properly.
  641. -- If that is the case, don't change their geometry
  642. local cgeo = awful.client.property.get(c, 'floating_geometry')
  643. if cgeo ~= nil then
  644. if not (cgeo.x == 0 and cgeo.y == 0) then
  645. c:geometry(awful.client.property.get(c, 'floating_geometry'))
  646. end
  647. end
  648. --c:geometry(awful.client.property.get(c, 'floating_geometry'))
  649. end
  650. end
  651. end
  652. )
  653.  
  654. client.connect_signal('manage',
  655. function(c)
  656. if awful.layout.get(mouse.screen) == awful.layout.suit.floating then
  657. awful.client.property.set(c, 'floating_geometry', c:geometry())
  658. end
  659. end
  660. )
  661.  
  662. client.connect_signal('property::geometry',
  663. function(c)
  664. if awful.layout.get(mouse.screen) == awful.layout.suit.floating then
  665. awful.client.property.set(c, 'floating_geometry', c:geometry())
  666. end
  667. end
  668. )
  669.  
  670. -- Make rofi possible to raise minimized clients
  671. -- Note: causes clients to unminimize after restarting awesome
  672. client.connect_signal("request::activate",
  673. function(c, context, hints)
  674. if c.minimized then
  675. c.minimized = false
  676. end
  677. awful.ewmh.activate(c, context, hints)
  678. end
  679. )
  680.  
  681. -- Startup applications
  682. awful.spawn.with_shell( os.getenv("HOME") .. "/.config/awesome/autostart.sh")
  683.  
  684. -- }}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement