From da5d297b609b70236c719d90a32041d7b074edf7 Mon Sep 17 00:00:00 2001 From: Jas Singh Date: Sat, 29 Jun 2024 18:10:21 -0700 Subject: [PATCH] Finish Network Menu rework... --- config.js | 14 +- modules/menus/network/Wifi/APStaging.js | 115 ++++++++--- modules/menus/network/Wifi/WirelessAPs.js | 221 +++++++++++++++++----- modules/menus/network/Wifi/index.js | 7 +- scss/menus/calendar.scss | 3 +- scss/menus/menu.scss | 2 +- scss/menus/network.scss | 33 ++++ scss/menus/notifications.scss | 3 +- style.css | 34 +++- style.css.map | 2 +- 10 files changed, 328 insertions(+), 106 deletions(-) diff --git a/config.js b/config.js index 43de8d4..d08a70a 100644 --- a/config.js +++ b/config.js @@ -42,17 +42,5 @@ App.config({ launcher: 350, bar0: 350, }, - onConfigParsed: () => - Utils.subprocess( - [ - "python3", - `${App.configDir}/services/bluetooth.py`, - ], - - // callback when the program outputs something to stdout - (output) => console.info(output), - - // callback on error - (err) => console.info(err), - ), + onConfigParsed: () => Utils.execAsync(`python3 ${App.configDir}/services/bluetooth.py`), }); diff --git a/modules/menus/network/Wifi/APStaging.js b/modules/menus/network/Wifi/APStaging.js index 5ad9f72..b91249d 100644 --- a/modules/menus/network/Wifi/APStaging.js +++ b/modules/menus/network/Wifi/APStaging.js @@ -1,37 +1,90 @@ -const renderWapStaging = (self, stagedDevice) => { - self.hook(stagedDevice, ({ value }) => { - return (self.child = Widget.Button({ - class_name: "network-element-item", - child: Widget.Box({ - hpack: "start", - children: [ - Widget.Icon({ - class_name: "network-ethernet-icon", - icon: `${stagedDevice["iconName"]}`, - }), - Widget.Box({ - class_name: "connection-container", - vertical: true, - children: [ - Widget.Label({ - class_name: "active-connection", - hpack: "start", - truncate: "end", - wrap: true, - label: stagedDevice.ssid, - }), - Widget.Revealer({ - revealChild: stagedDevice.active, - child: Widget.Label({ +const renderWapStaging = (self, network, staging, connecting) => { + Utils.merge([network.bind("wifi"), staging.bind("value")], () => { + if (!Object.keys(staging.value).length) { + return (self.child = Widget.Box()); + } + + return (self.child = Widget.Box({ + class_name: "network-element-item staging", + vertical: true, + children: [ + Widget.Box({ + hpack: "fill", + hexpand: true, + children: [ + Widget.Icon({ + class_name: "network-ethernet-icon", + icon: `${staging.value.iconName}`, + }), + Widget.Box({ + class_name: "connection-container", + hexpand: true, + vertical: true, + children: [ + Widget.Label({ + class_name: "active-connection", hpack: "start", - class_name: "connection-status dim", - label: "Connected", + truncate: "end", + wrap: true, + label: staging.value.ssid, }), + ], + }), + Widget.Revealer({ + hpack: "end", + reveal_child: connecting + .bind("value") + .as((c) => staging.value.bssid === c), + child: Widget.Spinner({ + class_name: "spinner wap", }), - ], - }), - ], - }), + }), + ], + }), + Widget.Box({ + class_name: "network-password-input-container", + hpack: "fill", + hexpand: true, + children: [ + Widget.Entry({ + hpack: "start", + hexpand: true, + visibility: false, + class_name: "network-password-input", + placeholder_text: "enter password", + onAccept: (selfInp) => { + connecting.value = staging.value.bssid; + Utils.execAsync( + `nmcli dev wifi connect ${staging.value.bssid} password ${selfInp.text}`, + ) + .catch((err) => { + connecting.value = ""; + console.error( + `Failed to connect to wifi: ${staging.value.ssid}... ${err}`, + ); + }) + .then(() => { + connecting.value = ""; + staging.value = {}; + }); + selfInp.text = ""; + }, + }), + Widget.Button({ + hpack: "end", + class_name: "close-network-password-input-button", + on_primary_click: () => { + connecting.value = ""; + staging.value = {}; + }, + child: Widget.Icon({ + class_name: "close-network-password-input-icon", + icon: "window-close-symbolic", + }), + }), + ], + }), + ], })); }); }; diff --git a/modules/menus/network/Wifi/WirelessAPs.js b/modules/menus/network/Wifi/WirelessAPs.js index 7203e8a..02d2b30 100644 --- a/modules/menus/network/Wifi/WirelessAPs.js +++ b/modules/menus/network/Wifi/WirelessAPs.js @@ -1,60 +1,177 @@ -const renderWAPs = (self, network) => { +const renderWAPs = (self, network, staging, connecting) => { + const getIdBySsid = (ssid, nmcliOutput) => { + const lines = nmcliOutput.trim().split("\n"); + for (const line of lines) { + const columns = line.trim().split(/\s{2,}/); + if (columns[0].includes(ssid)) { + return columns[1]; + } + } + return null; + }; + + const WifiStatusMap = { + unknown: "Status Unknown", + unmanaged: "Unmanaged", + unavailable: "Unavailable", + disconnected: "Disconnected", + prepare: "Preparing Connecting", + config: "Connecting", + need_auth: "Needs Authentication", + ip_config: "Requesting IP", + ip_check: "Checking Access", + secondaries: "Waiting on Secondaries", + activated: "Connected", + deactivating: "Disconnecting", + failed: "Connection Failed", + }; self.hook(network, () => { - const WAPs = network.wifi.access_points; + Utils.merge( + [network.bind("wifi"), staging.bind("value"), connecting.bind("value")], + () => { + const WAPs = network.wifi.access_points; - console.log("WAPs"); - console.log(JSON.stringify(WAPs, null, 2)); + const isInStaging = (wap) => { + if (Object.keys(staging.value).length === 0) { + return false; + } - const filteredWAPs = WAPs.filter((ap) => ap.ssid !== "Unknown").sort( - (a, b) => { - return b.strength - a.strength; + return wap.bssid === staging.value.bssid; + }; + + const filteredWAPs = WAPs.filter( + (ap) => ap.ssid !== "Unknown" && !isInStaging(ap), + ).sort((a, b) => { + if (network.wifi.ssid === a.ssid) { + return -1; + } + + if (network.wifi.ssid === b.ssid) { + return 1; + } + + return b.strength - a.strength; + }); + + if ( + filteredWAPs.length <= 0 && + Object.keys(staging.value).length === 0 + ) { + return (self.child = Widget.Label({ + class_name: "waps-not-found dim", + expand: true, + hpack: "center", + vpack: "center", + label: "No Wi-Fi Networks Found", + })); + } + return (self.children = filteredWAPs.map((ap) => { + return Widget.Box({ + children: [ + Widget.Button({ + on_primary_click: () => { + connecting.value = ap.bssid; + Utils.execAsync(`nmcli device wifi connect ${ap.bssid}`) + .then((res) => { + connecting.value = ""; + staging.value = {}; + }) + .catch((err) => { + if ( + err + .toLowerCase() + .includes("secrets were required, but not provided") + ) { + staging.value = ap; + } + connecting.value = ""; + }); + }, + class_name: "network-element-item", + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Box({ + hpack: "start", + hexpand: true, + children: [ + Widget.Icon({ + class_name: "network-ethernet-icon", + icon: `${ap["iconName"]}`, + }), + Widget.Box({ + class_name: "connection-container", + vertical: true, + children: [ + Widget.Label({ + class_name: "active-connection", + hpack: "start", + truncate: "end", + wrap: true, + label: ap.ssid, + }), + Widget.Revealer({ + revealChild: ap.ssid === network.wifi.ssid, + child: Widget.Label({ + hpack: "start", + class_name: "connection-status dim", + label: + WifiStatusMap[ + network.wifi.state.toLowerCase() + ], + }), + }), + ], + }), + ], + }), + Widget.Revealer({ + hpack: "end", + vpack: "start", + reveal_child: ap.bssid === connecting.value, + child: Widget.Spinner({ + vpack: "start", + class_name: "spinner wap", + }), + }), + ], + }), + }), + Widget.Revealer({ + vpack: "start", + reveal_child: ap.bssid !== connecting.value && ap.active, + child: Widget.Button({ + vpack: "start", + tooltip_text: "Delete/Forget Network", + class_name: "menu-icon-button network disconnect", + on_primary_click: () => { + connecting.value = ap.bssid; + Utils.execAsync("nmcli connection show --active").then( + () => { + Utils.execAsync("nmcli connection show --active").then( + (res) => { + const connectionId = getIdBySsid(ap.ssid, res); + + Utils.execAsync( + `nmcli connection delete ${connectionId} "${ap.ssid}"`, + ).catch((err) => + console.error( + `Error while forgetting "${ap.ssid}": ${err}`, + ), + ); + }, + ); + }, + ); + }, + child: Widget.Label("󰚃"), + }), + }), + ], + }); + })); }, ); - - if (filteredWAPs.length <= 0) { - return (self.child = Widget.Label({ - class_name: "waps-not-found dim", - expand: true, - hpack: "center", - vpack: "center", - label: "No Wi-Fi Networks Found", - })); - } - return (self.children = filteredWAPs.map((ap) => { - return Widget.Button({ - class_name: "network-element-item", - child: Widget.Box({ - hpack: "start", - children: [ - Widget.Icon({ - class_name: "network-ethernet-icon", - icon: `${ap["iconName"]}`, - }), - Widget.Box({ - class_name: "connection-container", - vertical: true, - children: [ - Widget.Label({ - class_name: "active-connection", - hpack: "start", - truncate: "end", - wrap: true, - label: ap.ssid, - }), - Widget.Revealer({ - revealChild: ap.active, - child: Widget.Label({ - hpack: "start", - class_name: "connection-status dim", - label: "Connected", - }), - }), - ], - }), - ], - }), - }); - })); }); }; diff --git a/modules/menus/network/Wifi/index.js b/modules/menus/network/Wifi/index.js index 017a100..8943bad 100644 --- a/modules/menus/network/Wifi/index.js +++ b/modules/menus/network/Wifi/index.js @@ -2,7 +2,8 @@ const network = await Service.import("network"); import { renderWAPs } from "./WirelessAPs.js"; import { renderWapStaging } from "./APStaging.js"; -const Staging = Variable("none"); +const Staging = Variable({}); +const Connecting = Variable(""); const Wifi = () => { return Widget.Box({ @@ -26,14 +27,14 @@ const Wifi = () => { Widget.Box({ class_name: "wap-staging", setup: (self) => { - renderWapStaging(self, Staging); + renderWapStaging(self, network, Staging, Connecting); }, }), Widget.Box({ class_name: "available-waps", vertical: true, setup: (self) => { - renderWAPs(self, network); + renderWAPs(self, network, Staging, Connecting); }, }), ], diff --git a/scss/menus/calendar.scss b/scss/menus/calendar.scss index 070833c..58a467e 100644 --- a/scss/menus/calendar.scss +++ b/scss/menus/calendar.scss @@ -5,7 +5,8 @@ min-width: 27em; min-height: 6em; background: $crust; - border: 0.13em solid $surface0; border-radius: 0.4em; + border: 0.13em solid $surface0; + border-radius: 0.7em; } .window-content.calendarmenu-window { diff --git a/scss/menus/menu.scss b/scss/menus/menu.scss index f5321e2..1de9ad4 100644 --- a/scss/menus/menu.scss +++ b/scss/menus/menu.scss @@ -92,7 +92,7 @@ tooltip label { .menu-items { background: $crust; border: .13em solid $surface0; - border-radius: .5rem; + border-radius: .7rem; min-width: 400px; color: $text; } diff --git a/scss/menus/network.scss b/scss/menus/network.scss index 4663162..b4a0aa5 100644 --- a/scss/menus/network.scss +++ b/scss/menus/network.scss @@ -31,8 +31,41 @@ margin-bottom: 0.5em; } + &.staging { + margin-bottom: 0.5em; + } + &:hover { color: $mauve; } } + + .spinner.wap { + color: $mauve; + } + + .network-password-input-container { + background: $mantle; + border-radius: 0.4em; + margin: 0em 2em; + margin-top: 0.75em; + padding: 0.5em; + } + + .close-network-password-input-button { + padding: 0em 0.5em; + &:hover image { + color: $maroon; + } + } + + .menu-icon-button.network.disconnect { + margin-bottom: 0.4em; + label { + font-size: 1.3em; + } + &:hover { + color: $maroon; + } + } } diff --git a/scss/menus/notifications.scss b/scss/menus/notifications.scss index 069ae27..ff9d09e 100644 --- a/scss/menus/notifications.scss +++ b/scss/menus/notifications.scss @@ -5,7 +5,8 @@ min-width: 26em; min-height: 6em; background: $crust; - border: 0.13em solid $surface0; border-radius: 0.4em; + border: 0.13em solid $surface0; + border-radius: 0.7em; } .window-content.notificationsmenu-window { diff --git a/style.css b/style.css index 1dcfa37..67e9e07 100644 --- a/style.css +++ b/style.css @@ -497,7 +497,7 @@ tooltip label { .menu-items { background: #11111b; border: 0.13em solid #313244; - border-radius: 0.5rem; + border-radius: 0.7rem; min-width: 400px; color: #cdd6f4; } @@ -848,9 +848,37 @@ window#powermenu .powermenu.box { .menu-items-container.network .network-element-item:not(:last-child) { margin-bottom: 0.5em; } +.menu-items-container.network .network-element-item.staging { + margin-bottom: 0.5em; +} .menu-items-container.network .network-element-item:hover { color: #cba6f7; } +.menu-items-container.network .spinner.wap { + color: #cba6f7; +} +.menu-items-container.network .network-password-input-container { + background: #181825; + border-radius: 0.4em; + margin: 0em 2em; + margin-top: 0.75em; + padding: 0.5em; +} +.menu-items-container.network .close-network-password-input-button { + padding: 0em 0.5em; +} +.menu-items-container.network .close-network-password-input-button:hover image { + color: #eba0ac; +} +.menu-items-container.network .menu-icon-button.network.disconnect { + margin-bottom: 0.4em; +} +.menu-items-container.network .menu-icon-button.network.disconnect label { + font-size: 1.3em; +} +.menu-items-container.network .menu-icon-button.network.disconnect:hover { + color: #eba0ac; +} .menu-dropdown-label.bluetooth { color: #89dceb; @@ -1012,7 +1040,7 @@ image { min-height: 6em; background: #11111b; border: 0.13em solid #313244; - border-radius: 0.4em; + border-radius: 0.7em; } .window-content.notificationsmenu-window { @@ -1084,7 +1112,7 @@ image { min-height: 6em; background: #11111b; border: 0.13em solid #313244; - border-radius: 0.4em; + border-radius: 0.7em; } .window-content.calendarmenu-window { diff --git a/style.css.map b/style.css.map index 8ec5dc1..2cc1286 100644 --- a/style.css.map +++ b/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/notifications.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/menus/media.scss","scss/menus/notifications.scss","scss/menus/calendar.scss","scss/notifications/popups.scss"],"names":[],"mappings":"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","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/notifications.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/menus/media.scss","scss/menus/notifications.scss","scss/menus/calendar.scss","scss/notifications/popups.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACJF;EACE;EACA;EACA,kBCFgB;EDGhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBChBW;;ADkBf;EACE,OCnBa;;ADqBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBC/Be;;;ADmCnB;EACE;EACA;EACA;EACA,OCvCiB;;;AD0CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBC9DiB;ED+DjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBC9EgB;;;ADiFlB;AAAA;EAEE;EACA,kBCpFgB;;;ADuFlB;AAAA;AAAA;EAGE,OC1FgB;ED2FhB,kBC5CW;;;AD+Cb;AAAA;AAAA;EAGE;EACA,kBCnDW;;;ADsDb;AAAA;AAAA;EAGE;EACA,kBC1DW;;;AD6Db;EACE;EACA;EACA;EACA;EACA,kBChHiB;EDiHjB;EACA;EACA;;;AAGF;EACE,kBCzEW;;;AD4Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCvIc;EDwId;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBChKiB;;;ADmKnB;EACE;EACA,kBCvHW;;;AD0Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OCzIW;ED0IX,kBCzLgB;ED0LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBC1MgB;ED2MhB,OC5Mc;ED6Md;;;AAGF;EACE;EACA;EACA,kBCjNiB;;;ADoNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AE/NF;EACE,YDoCM;ECnCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD4BM;EC3BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;EACE;EACA;EACA;EACA;;AAGF;EACE,YApCM;;AAwCN;EACE;EACA;;AAEF;EACE;EACA;;;AC9CN;EACE,OFsBK;EErBL;EACA;;;ACHF;EACE;EACA,OHiBO;;;AGdT;EACE,OHaO;;;AInBT;EACE;EACA,OJyBS;;;AItBX;EACE;EACA,OJoBS;;;AK3BX;EACE,OLgBM;;;AMjBR;EACE;EACA,ONsBI;;;AMnBN;EACE,ONkBI;;;AMfN;EACE;EACA;EACA,ONsBS;EMrBT;;;AAGF;EACE,ONOI;;;AOxBN;EACE,OPeK;;;AQfL;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRgBE;EQfF,OReE;;AQbF;EACE,kBRSG;EQRH,ORQG;EQPH;EACA;;AAGF;EACE,ORHC;EQID,kBRJC;EQKD;EACA;;;AAMN;EACE;;;AC7BF;EACE,OTeK;;;AUhBP;EACE;;;AAGF;EACE,YVkCO;;;AUhCT;EACE;EACA,OVmBK;;;AUhBP;EACE,kBVsBS;;;AUnBX;EACE,kBVmBS;EUlBT;;;AAGF;EACE,kBVKS;;;AUFX;EACE;;;AC1BF;EACE,OX0BS;EWzBT;EACA;;;ACHF;EACE,OZiBI;EYhBJ;;;ACFF;EACE,YbuCM;;;AapCR;EACE,kBbiCM;EahCN;EAEA;EACA;;AAEA;EACE,YbuBO;;;AanBX;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AC7BE;EACI;EACA,YdmCG;;AcjCH;AAAA;EAEI,YdeJ;EcdI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIA;EACI,YdeD;;AcZH;EACI,YdQD;EcPC;;;AAKZ;EACI,kBdIO;EcHP;;AAEA;EACI,YdZF;;AcgBE;AAAA;EAEI,kBdtBJ;EcuBI;;AAIR;EACI;EACA,kBdhBG;EciBH;EACA;EACA;EACA;EACA;;AAIA;EACI,YdvBD;;Ac0BH;EACI,Yd9BD;Ec+BC;;AAIR;EACI,kBd7CF;;AcuDN;EACI;;;AAGJ;EACI;EACA;EACA,YdnDO;;;AcsDX;EACI,YdlDI;EcmDJ;EACA;EACA;EACA,OdlEG;;;AcqEP;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,Od9ED;Ec+EC;EACA;;AAGJ;EACI,Yd3ED;Ec4EC;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI,YdhGD;EciGC;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAIA;EACI;;;AAIR;EACI;EACA;;AACA;EACI,Od/HG;EcgIH;EACA;;AAIJ;EACI,OdnJC;;AcqJL;EACI,OdtJC;;;Ac0JT;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAEJ;EACI;;;AAGJ;EACI,OdhKO;EciKP;EACA;EACA;;;AAGJ;EACI,OdvKO;;;Ac0KP;EACI,Od1KG;;;Ac8KX;EACI,Yd5KG;Ec6KH;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA,OdlMO;EcmMP;;AAEA;EACI,OdpNC;;;AcwNT;EACI;;;AAOJ;EACI;EACA;;;ACrPJ;AAAA;EAGI;;;AAKJ;ECPI;EACA;EACA,kBhBkCG;EgBjCH,OhB0CS;EgBzCT;EACA;EDIA;EACA;EACA;EACA;;AAEA;EACI;;AAEA;EACI;EACA,OfDH;EeEG;;AAGJ;EACI,OfED;EeDC;EACA;EACA;;AAIR;EACI,YfOA;EeNA;EACA;EACA;EACA,cfGA;EeFA;EACA;EACA;EACA;;AAGI;EACI,cfvBR;EewBQ;;AAEJ;EACI,cf/BV;EegCU;;AAIJ;EACI,cfjCR;EekCQ;;AAEJ;EACI,cfzCV;Ee0CU;;AAKJ;EACI;EACA;;AAEJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEJ;EACI;EACA;;AAIZ;EACI,OfnEF;;AeqEF;EACI,OflEA;;;AesER;EC3FI;EACA;EACA,kBhBkCG;EgBjCH,OhB0CS;EgBzCT;EACA;;ADwFA;EACI;;AAGJ;EACI;;;AAIR;EACI,cfhEI;EeiEJ;EACA;EACA;EACA;EACA;;AAGI;EACI,cf/FN;;AeiGE;EACI,cf9FJ;;AegGA;EACI,cf/FN;;AeiGE;EACI,cftGJ;;Ae0GA;EACI,cf7GN;;Ae+GE;EACI,cf5GJ;;Ae8GA;EACI,cf7GN;;Ae+GE;EACI,cfpHJ;;AeuHA;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;;AAKR;EACI,OfzIF;;Ae2IF;EACI,OfxIA;;Ae0IJ;EACI,Of7IA;;Ae+IJ;EACI,Of5IF;;;AeiJF;EACI,OfxJF;;Ae0JF;EACI,OfvJA;;AeyJJ;EACI,Of5JA;;Ae8JJ;EACI,Of3JF;;;AiBxBN;EACI,OjBkBK;;;AiBfT;EACI,OjBcK;;;AiBXT;EACI,OjBUK;;;AiBLD;AAAA;EAEI,YjBGH;;;AiBGJ;EACG,OjBJC;;;AkBlBL;EACI;;AAEJ;EACI,OlBYA;;AkBTJ;EACI;EACA,OlBOA;;AkBJJ;EACI;;AAEJ;EACI;;AAGA;EACI;;AAMJ;EACI;;AAGJ;EACI;;AAGJ;EACI,OlBnBJ;;AkBuBJ;EACI,OlBxBA;;AkB2BJ;EACI,YlBNC;EkBOD;EACA;EACA;EACA;;AAGJ;EACI;;AACA;EACI,OlBpCH;;AkBwCL;EACI;;AACA;EACI;;AAEJ;EACI,OlB9CH;;;AmBnBT;EACI,OnBuBE;;;AmBpBN;EACI,OnBmBE;;;AmBhBN;EACI,OnBeE;;;AmBXD;EACG,OnBUF;;;AmBNN;EACI;;;AAGJ;EACI;EACA;;AACA;EACI,OnBFF;;;AmBMN;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI,OnBnBE;;;AoBxBN;EACE;EACA;EACA,YpBoCO;EoBnCP;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA,kBpBqBS;EoBpBT;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,OpBNS;EoBOT;;;AAGF;EACE,OpBfK;EoBgBL;;;AAGF;EACE,OpB3BK;EoB4BL;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE,YpB9BS;EoB+BT,OpBlBM;EoBmBN;EACA;EACA;;AAEA;EACE,YpB5BO;;AoB+BT;EACE,YpBzCO;;AoB2CP;EACE,YpBvDC;;AoB0DH;EACE,YpB3DC;;;AoBiEP;EACE;;;AAGF;EACE;EACA;EACA;;AAEA;EACE,YpBtDG;EoBuDH;;AAEA;AAAA;EAEE;EACA,YpBtEK;EoBuEL;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE,YpB7EK;;AoBgFP;EACE,YpBpFK;EoBqFL;;ACtHN;EACE;EACA;EACA;EACA,YrBoCM;EqBnCN;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE,YrBkBK;EqBjBL;EACA;EACA;EACA;;;AAGF;EACE,YrBUK;EqBTL;EACA;EACA;;;AAIA;EACE;;AAEF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA,OrBtBS;;;AqByBX;EACE;EACA,kBrBlBS;EqBmBT;;;AAIA;EACE,YrBjCO;;;AqBqCX;EACE;;AAEA;EACE,OrBjDK;;;AqBqDT;EACE,OrBvDI;EqBwDJ;;;AC1EF;EACE;EACA;EACA;EACA,YtBoCM;EsBnCN;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,YtBqBK;;;AsBlBP;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA,OtBHK;EsBkCL;EACA;;AA9BA;EACE;EAGA,OtBrBG;EsBsBH;;AAGF;EACE;EACA,OtBpBG;;AsBsBL;EACE,OtBlBG;EsBmBH;EACA;;AAEF;EACE,OtBnCG;;AsBqCL;EACE;EACA;EACA,OtBxCG;;AsB0CL;EACE,OtBzBO;;;AsBgCX;EACE;;AAEA;EACE;EACA,OtBvDG;;AsByDL;EACE;EACA;EACA;EACA,OtBtDG;;;AsB0DP;EACE;;;AAGF;EACE,OtBpEI;EsBqEJ;EACA;EACA;;AAIE;EACE,OtB9EC;EsB+ED;;AAKJ;EACE,OtBzEG;EsB0EH;EACA;;AAEA;EACE;;AAIJ;EACE,OtBxFG;EsByFH;EACA;;AAmBF;EACE,OtBnHE;;AsBqHJ;EACE,OtBpIK;;AsBsIP;EACE,OtBhHO;;AsBkHT;EACE,OtBpHG;;AsBsHL;EACE,OtBzHE;;;AsB6HN;EACE;EACA,OtBvIK;;AsByIL;EACE;;;AAIJ;EACE;;;AAGF;EACE,OtBnJK;EsBoJL;;;AAGF;EACE,OtBxJK;EsByJL;;;AAGF;EACE,OtB7JK;;;AuBjBP;EACI;;;AAGJ;EACE,OvBwBK;EuBvBL,YvBkCO;EuBjCP;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAIF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA,OvBxBS;;;AuB2BX;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE,OvBtCS;EuBuCT,YvB9BS;EuB+BT;EACA;EACA;;AAEA;EACE;;AAGF;EACE,YvBzCO;;;AuB6CX;EACE;EACA;;;AAGF;EACE,YvBpEI;EuBqEJ,OvB/CM;EuBgDN;EACA;;AAEA;EACE;;AAGF;EACE,YvB7EK","file":"style.css"} \ No newline at end of file