From a66d67676f9d5cca558be0ab9e0c204d93e8a2a0 Mon Sep 17 00:00:00 2001 From: Thastertyn Date: Wed, 22 Feb 2023 21:53:10 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + .vscode/settings.json | 3 + pom.xml | 96 +++++++++++++++ src/main/java/xyz/thastertyn/App.java | 88 ++++++++++++++ src/main/java/xyz/thastertyn/Connection.java | 15 +++ src/main/java/xyz/thastertyn/Download.java | 5 + .../java/xyz/thastertyn/Jecna/Dochazka.java | 31 +++++ .../java/xyz/thastertyn/Jecna/Downloader.java | 15 +++ src/main/java/xyz/thastertyn/Jecna/Login.java | 102 ++++++++++++++++ .../java/xyz/thastertyn/Jecna/Rozvrh.java | 103 ++++++++++++++++ .../java/xyz/thastertyn/Jecna/Znamky.java | 111 ++++++++++++++++++ src/main/java/xyz/thastertyn/Predmet.java | 8 ++ .../java/xyz/thastertyn/RozvrhDownload.java | 5 + src/main/java/xyz/thastertyn/Tuple/Pair.java | 53 +++++++++ .../xyz/thastertyn/Window/MainWindow.java | 74 ++++++++++++ .../java/xyz/thastertyn/Window/Rozvrh.java | 62 ++++++++++ src/test/java/xyz/thastertyn/AppTest.java | 20 ++++ target/classes/xyz/thastertyn/App.class | Bin 0 -> 517 bytes .../classes/xyz/thastertyn/Connection.class | Bin 0 -> 808 bytes target/classes/xyz/thastertyn/Download.class | Bin 0 -> 279 bytes .../xyz/thastertyn/Jecna/Dochazka.class | Bin 0 -> 1255 bytes .../xyz/thastertyn/Jecna/Downloader.class | Bin 0 -> 745 bytes .../classes/xyz/thastertyn/Jecna/Login.class | Bin 0 -> 3133 bytes .../classes/xyz/thastertyn/Jecna/Rozvrh.class | Bin 0 -> 3622 bytes .../classes/xyz/thastertyn/Jecna/Znamky.class | Bin 0 -> 5108 bytes target/classes/xyz/thastertyn/Predmet.class | Bin 0 -> 276 bytes .../xyz/thastertyn/RozvrhDownload.class | Bin 0 -> 297 bytes .../classes/xyz/thastertyn/Tuple/Pair.class | Bin 0 -> 1804 bytes .../xyz/thastertyn/Window/MainWindow.class | Bin 0 -> 4040 bytes .../xyz/thastertyn/Window/Rozvrh.class | Bin 0 -> 2346 bytes .../Window/RozvrhTableRenderer.class | Bin 0 -> 1195 bytes .../thastertyn/Window/WindowListener.class | Bin 0 -> 311 bytes .../test-classes/xyz/thastertyn/AppTest.class | Bin 0 -> 475 bytes 33 files changed, 793 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 pom.xml create mode 100644 src/main/java/xyz/thastertyn/App.java create mode 100644 src/main/java/xyz/thastertyn/Connection.java create mode 100644 src/main/java/xyz/thastertyn/Download.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Dochazka.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Downloader.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Login.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Rozvrh.java create mode 100644 src/main/java/xyz/thastertyn/Jecna/Znamky.java create mode 100644 src/main/java/xyz/thastertyn/Predmet.java create mode 100644 src/main/java/xyz/thastertyn/RozvrhDownload.java create mode 100644 src/main/java/xyz/thastertyn/Tuple/Pair.java create mode 100644 src/main/java/xyz/thastertyn/Window/MainWindow.java create mode 100644 src/main/java/xyz/thastertyn/Window/Rozvrh.java create mode 100644 src/test/java/xyz/thastertyn/AppTest.java create mode 100644 target/classes/xyz/thastertyn/App.class create mode 100644 target/classes/xyz/thastertyn/Connection.class create mode 100644 target/classes/xyz/thastertyn/Download.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Dochazka.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Downloader.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Login.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Rozvrh.class create mode 100644 target/classes/xyz/thastertyn/Jecna/Znamky.class create mode 100644 target/classes/xyz/thastertyn/Predmet.class create mode 100644 target/classes/xyz/thastertyn/RozvrhDownload.class create mode 100644 target/classes/xyz/thastertyn/Tuple/Pair.class create mode 100644 target/classes/xyz/thastertyn/Window/MainWindow.class create mode 100644 target/classes/xyz/thastertyn/Window/Rozvrh.class create mode 100644 target/classes/xyz/thastertyn/Window/RozvrhTableRenderer.class create mode 100644 target/classes/xyz/thastertyn/Window/WindowListener.class create mode 100644 target/test-classes/xyz/thastertyn/AppTest.class diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2992de4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/src/main/java/xyz/thastertyn/Jecna/Credentials.java +/target/classes/xyz/thastertyn/Jecna/Credentials.class \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..42ea84b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0b6e9fa --- /dev/null +++ b/pom.xml @@ -0,0 +1,96 @@ + + + + 4.0.0 + + xyz.thastertyn + jecnak-tui + 1.0-SNAPSHOT + + jecnak-tui + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + + org.jsoup + jsoup + 1.15.3 + + + + + com.google.code.gson + gson + 2.10.1 + + + + + com.googlecode.lanterna + lanterna + 3.2.0-alpha1 + + + + junit + junit + 4.11 + test + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/src/main/java/xyz/thastertyn/App.java b/src/main/java/xyz/thastertyn/App.java new file mode 100644 index 0000000..56f206e --- /dev/null +++ b/src/main/java/xyz/thastertyn/App.java @@ -0,0 +1,88 @@ +package xyz.thastertyn; + +import xyz.thastertyn.Jecna.*; +import xyz.thastertyn.Window.MainWindow; + +/** + * Hello world! + * + */ +public class App { + public static void main(String[] args) { + //System.out.println("Hello World!"); + + //Login l = new Login(); + //l.login(Credentials.user, Credentials.pass); + + MainWindow window = new MainWindow(); + window.run(); + + + /* + try { + + + + //#region Jidelna + + //#region JSESSIONID + Connection.Response jidelna = Jsoup.connect("https://objednavky.jidelnasokolska.cz/") + .header("Connection", "keep-alive") + .method(Method.HEAD) + .execute(); + + String jidelnaJSESSIONID = jidelna.cookie("JSESSIONID"); + String XSRF_TOKEN = jidelna.cookie("XSRF-TOKEN"); + //#endregion + + //#region CSRF + String csrf = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/login.jsp") + .header("Connection", "keep-alive") + .cookie("XSRF-TOKEN", XSRF_TOKEN) + .cookie("JSESSIONID", jidelnaJSESSIONID) + .get() + .select("input[name=_csrf]") + .attr("value"); + + + if(!XSRF_TOKEN.equals(csrf)) + { + throw new SecurityException("CSRF tokens do not match, something is up"); + } + //#endregion + + //#region Login + Connection.Response jidelnaLogin = Jsoup.connect("https://objednavky.jidelnasokolska.cz/j_spring_security_check") + .header("Connection", "keep-alive") + .header("Content-Type", "application/x-www-form-urlencoded") + .cookie("XSRF-TOKEN", XSRF_TOKEN) + .cookie("JSESSIONID", jidelnaJSESSIONID) + .data("j_username", Credentials.user) + .data("j_password", Credentials.pass) + .data("terminal", "false") + .data("type", "web") + .data("_csrf", XSRF_TOKEN) + .data("targetUrl", "/faces/secured/main.jsp?terminal=false&status=true&printer=false&keyboard=false") + .method(Method.POST) + .execute(); + //#endregion + + Document obedy = Jsoup.connect("https://objednavky.jidelnasokolska.cz/faces/secured/month.jsp?terminal=false&keyboard=&printer=") + .header("Connection", "keep-alive") + .cookie("XSRF-TOKEN", XSRF_TOKEN) + .cookie("JSESSIONID", jidelnaJSESSIONID) + .get(); + + System.out.println(obedy.toString()); + + //#endregion + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) + { + e.printStackTrace(); + }*/ + } +} diff --git a/src/main/java/xyz/thastertyn/Connection.java b/src/main/java/xyz/thastertyn/Connection.java new file mode 100644 index 0000000..1d5dbbf --- /dev/null +++ b/src/main/java/xyz/thastertyn/Connection.java @@ -0,0 +1,15 @@ +package xyz.thastertyn; + +import org.jsoup.Jsoup; + +public class Connection { + + private static final org.jsoup.Connection CONNECTION = Jsoup.connect("") + .header("Connection", "keep-alive") + .cookie("role", "student"); + + public static org.jsoup.Connection getConnection() + { + return CONNECTION; + } +} diff --git a/src/main/java/xyz/thastertyn/Download.java b/src/main/java/xyz/thastertyn/Download.java new file mode 100644 index 0000000..be16dd4 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Download.java @@ -0,0 +1,5 @@ +package xyz.thastertyn; + +public class Download { + +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Dochazka.java b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java new file mode 100644 index 0000000..900d7e7 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Dochazka.java @@ -0,0 +1,31 @@ +package xyz.thastertyn.Jecna; + +import java.io.IOException; +import java.util.HashMap; + +import org.jsoup.nodes.Document; + +import xyz.thastertyn.Connection; +import xyz.thastertyn.Tuple.Pair; + +public class Dochazka { + + private HashMap> absence = new HashMap<>(); + + public byte downloadAbsence(String JSESSIOND) + { + Document absenceDoc; + + try { + // absence-list + absenceDoc = Connection.getConnection() + .cookie("JSESSIOND", JSESSIOND) + .url("https://www.spsejecna.cz" + "/absence/passing-student") + .get(); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + } +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Downloader.java b/src/main/java/xyz/thastertyn/Jecna/Downloader.java new file mode 100644 index 0000000..dc3f1ae --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Downloader.java @@ -0,0 +1,15 @@ +package xyz.thastertyn.Jecna; + +import org.jsoup.Connection; +import org.jsoup.Jsoup; + +public class Downloader { + + public static Connection download(String url, String Jsessionid) + { + return Jsoup.connect(url) + .header("Connection", "keep-alive") + .cookie("role", "student") + .cookie("JSESSIONID", Jsessionid); + } +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Login.java b/src/main/java/xyz/thastertyn/Jecna/Login.java new file mode 100644 index 0000000..f89f4e8 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Login.java @@ -0,0 +1,102 @@ +package xyz.thastertyn.Jecna; + +import java.io.File; +import java.io.IOException; +import java.net.UnknownHostException; + +import org.jsoup.Connection; +import org.jsoup.Jsoup; +import org.jsoup.Connection.Method; + +public class Login { + + private String Jsessionid = null; + + // Check for session expiration + private long start; + private long lastCheck; + + /** + * Zkontroluje zda jiz neexistuji ulozene udaje na systemu + * @return + */ + public boolean getCredentials() + { + File credentials = null; + + if(System.getProperty("os.name").equals("Linux")) + { + credentials = new File("~/.local/share/jecnak/credentials.json"); + + }else if(System.getProperty("os.name").contains("Windows")) + { + credentials = new File(System.getenv("APPDATA\\jecnak\\")); + } + + if(!credentials.exists() || credentials.length() == 0) + { + return false; + } + return true; + } + + public String getJSESSIONID() + { + return Jsessionid; + } + + public byte login(String user, String pass) + { + try { + //#region JSESSIONID + Connection.Response response = Jsoup.connect("https://www.spsejecna.cz") + .header("Connection", "keep-alive") + .method(Method.HEAD) + .execute(); + + Jsessionid = response.cookie("JSESSIONID"); + //#endregion + + //#region Token3 + String token3 = Jsoup.connect("https://www.spsejecna.cz/user/role?role=student") + .header("Connection", "keep-alive") + .cookie("JSESSIONID", Jsessionid) + .get() + .select("input[name=token3]") + .attr("value"); + //#endregion + + //#region Login + Connection.Response login = Jsoup.connect("https://www.spsejecna.cz/user/login") + .method(Connection.Method.POST) + .header("Content-Type", "application/x-www-form-urlencoded") + //.header("Content-Length", "71") Adds 10 seconds to total request time + .header("Origin", "https://www.spsejecna.cz") + .header("Connection", "keep-alive") + .cookie("JSESSIONID", Jsessionid) + .cookie("role", "student") + .data("token3", token3) + .data("user", user) + .data("pass", pass) + .data("submit", "P%C5%99ihl%C3%A1sit+se") + .followRedirects(true) + .execute(); + //#endregion + + start = System.currentTimeMillis() / 1000L; + lastCheck = start; + + return 0; + } catch(UnknownHostException e) + { + // Not connected to internet + return 127; + } catch(IOException e) + { + return 126; + } + } +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Rozvrh.java b/src/main/java/xyz/thastertyn/Jecna/Rozvrh.java new file mode 100644 index 0000000..5b6cd4e --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Rozvrh.java @@ -0,0 +1,103 @@ +package xyz.thastertyn.Jecna; + +import java.io.IOException; +import java.net.UnknownHostException; +import java.util.HashSet; + +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; + +/** + * Jeden radek v rozvrhu + */ +public class Rozvrh { + + private String[][] rozvrh = new String[5][10]; + int pos = 0; + + + public void setPredmet(String pr, int d, int i) + { + rozvrh[d][i] = pr; + } + + public String[][] getRozvrh() + { + return rozvrh; + } + + @Override + public String toString() + { + String s = ""; + for(String[] st : rozvrh) + { + s += ("| "); + for(String str : st) + { + s += String.format("%-5s", str) + " | "; + } + s += "\n"; + } + + return s; + } + + /** + * Stahne rozvrh z www.spsejecna.cz a dale ho zpracuje do formy + * se kterou da pracovat + * @param Jsessionid ze stranek + * @return Status code + * + *
    + *
  • 0 - Operace probehla bez problemu
  • + *
+ * @throws UnknownHostException kdyz neni pripojeni k internetu + * @throws IOException ostatni exceptiony nejsou dulezite, tak jsou zahrnuty v jednom + */ + public void downloadRozvrh(final String Jsessionid) throws UnknownHostException, IOException + { + Document rozvrhDoc = Downloader.download("https://www.spsejecna.cz" + "/timetable/class", Jsessionid).get(); + + Elements rozvrhTable = rozvrhDoc.select("table.timetable").select("tr"); + Elements[] rozvrhDny = new Elements[rozvrhTable.size()]; + + for(int i = 0; i < rozvrhTable.size(); i++) + { + rozvrhDny[i] = rozvrhTable.get(i).children(); + } + + for(int i = 1; i < 6; i++) + { + for(int j = 1; j < 11; j++) + { + String predmet = rozvrhDny[i].get(j).select("span.subject").text().replaceAll(" ", "/"); + + // Predmety jako CEL jsou trikrat, staci ale jen jednou + // V hashsetu se neopakuji prvky + HashSet set = new HashSet<>(); + String[] split = predmet.split("/"); + + for(String s : split) + { + set.add(s); + } + + String pr = ""; + + if(set.size() > 1) + { + for(String s : set) + { + pr += s + "/"; + } + pr = pr.substring(0, pr.length() - 1); + }else{ + for(String s : set) { pr = s; break; } + } + + rozvrh[i-1][j-1] = pr; + } + } + } +} diff --git a/src/main/java/xyz/thastertyn/Jecna/Znamky.java b/src/main/java/xyz/thastertyn/Jecna/Znamky.java new file mode 100644 index 0000000..82fa990 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Jecna/Znamky.java @@ -0,0 +1,111 @@ +package xyz.thastertyn.Jecna; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import xyz.thastertyn.Tuple.Pair; + +public class Znamky { + + private boolean wasDownloaded; + + // key (String) reprezentuje predmet, value (arraylist) znamky a pair znamku s jeji vahou + private HashMap>> grades = new HashMap<>(); + + public void addGrade(String subject, int grade, double weight) + { + grades.get(subject).add(new Pair(grade, weight)); + } + + public void addSubject(String subject) + { + grades.put(subject, new ArrayList>()); + } + + private double getAverage(ArrayList> a) + { + try{ + int divident = 0; + int divisor = 0; + for(Pair p : a) + { + divident += p.getValue0() * p.getValue1(); + divisor += p.getValue1(); + } + + return (double) divident / divisor; + + }catch(ArithmeticException e) + { + return 0; + } + } + + public byte downloadZnamky(final String Jsessionid) + { + wasDownloaded = true; + Document znamkyDoc = null; + + try { + znamkyDoc = Downloader.download("https://www.spsejecna.cz" + "/score/student", Jsessionid).get(); + } catch (IOException e) { + e.printStackTrace(); + return 127; + } + + Elements rows = znamkyDoc.select("table.score").select("tr"); + + Elements[] rows_split = new Elements[rows.size()]; + + for (int i = 0; i < rows.size(); i++) + { + rows_split[i] = rows.get(i).children(); + } + + for(int i = 1; i < rows_split.length; i++) + { + String predmet = rows_split[i].get(0).text(); + addSubject(predmet); + + for(Element e : rows_split[i].get(1).select("a.score")) + { + int znamka = Integer.parseInt(e.select("span.value").text()); + + // Mala znamka se bude pocitat jako polovicni vaha + if(e.hasClass("scoreSmall")) + { + addGrade(predmet, znamka, 0.5); + }else{ + addGrade(predmet, znamka, 1); + } + } + } + return 0; + } + + @Override + public String toString() + { + if(wasDownloaded) + { + String s = ""; + + for(Map.Entry>> entry : grades.entrySet()) + { + double prumer = getAverage(entry.getValue()); + double p = (double) Math.round(prumer * 100) / 100; + s += entry.getKey() + " | " + entry.getValue().toString() + " { " + p + " }\n"; + } + return s; + }else{ + return "Nothing was downloaded"; + } + + } +} \ No newline at end of file diff --git a/src/main/java/xyz/thastertyn/Predmet.java b/src/main/java/xyz/thastertyn/Predmet.java new file mode 100644 index 0000000..3e8f98a --- /dev/null +++ b/src/main/java/xyz/thastertyn/Predmet.java @@ -0,0 +1,8 @@ +package xyz.thastertyn; + +import java.util.ArrayList; + +public class Predmet { + + +} diff --git a/src/main/java/xyz/thastertyn/RozvrhDownload.java b/src/main/java/xyz/thastertyn/RozvrhDownload.java new file mode 100644 index 0000000..0267187 --- /dev/null +++ b/src/main/java/xyz/thastertyn/RozvrhDownload.java @@ -0,0 +1,5 @@ +package xyz.thastertyn; + +public class RozvrhDownload { + +} diff --git a/src/main/java/xyz/thastertyn/Tuple/Pair.java b/src/main/java/xyz/thastertyn/Tuple/Pair.java new file mode 100644 index 0000000..1543589 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Tuple/Pair.java @@ -0,0 +1,53 @@ +package xyz.thastertyn.Tuple; + +/** + * Ekvitalent Tuplu, ktery neni zabudovan v jave + */ +public class Pair { + + private T1 value0; + private T2 value1; + + public Pair(T1 value0, T2 value1) + { + this.value0 = value0; + this.value1 = value1; + } + + public Pair() + { + + } + + public void put(T1 value0, T2 value1) + { + this.value0 = value0; + this.value1 = value1; + } + + public T1 getValue0() + { + return value0; + } + + public T2 getValue1() + { + return value1; + } + + public void setValue0(T1 value0) + { + this.value0 = value0; + } + + public void setValue1(T2 value1) + { + this.value1 = value1; + } + + @Override + public String toString() + { + return "[" + value0 + ", " + value1 + "]"; + } +} diff --git a/src/main/java/xyz/thastertyn/Window/MainWindow.java b/src/main/java/xyz/thastertyn/Window/MainWindow.java new file mode 100644 index 0000000..44d7924 --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/MainWindow.java @@ -0,0 +1,74 @@ +package xyz.thastertyn.Window; + +import java.io.IOException; +import java.util.Arrays; + +import com.googlecode.lanterna.TextColor; +import com.googlecode.lanterna.gui2.BasicWindow; +import com.googlecode.lanterna.gui2.DefaultWindowManager; +import com.googlecode.lanterna.gui2.Direction; +import com.googlecode.lanterna.gui2.EmptySpace; +import com.googlecode.lanterna.gui2.LinearLayout; +import com.googlecode.lanterna.gui2.MultiWindowTextGUI; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.Separator; +import com.googlecode.lanterna.gui2.Window; +import com.googlecode.lanterna.screen.Screen; +import com.googlecode.lanterna.screen.TerminalScreen; +import com.googlecode.lanterna.terminal.DefaultTerminalFactory; +import com.googlecode.lanterna.terminal.Terminal; + +import xyz.thastertyn.Jecna.Credentials; +import xyz.thastertyn.Jecna.Login; + +public class MainWindow { + + Login l = new Login(); + + public void run() + { + Terminal terminal = null; + try { + // Setup terminal and screen layers + terminal = new DefaultTerminalFactory().createTerminal(); + + Screen screen = new TerminalScreen(terminal); + screen.startScreen(); + + // Create panel to hold components + final Panel mainPanel = new Panel(); + mainPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL)); + + // Create window to hold the panel + BasicWindow window = new BasicWindow(); + window.setComponent(mainPanel); + window.setHints(Arrays.asList(Window.Hint.CENTERED)); + + mainPanel.addComponent(new Separator(Direction.VERTICAL).setLayoutData(LinearLayout.createLayoutData(LinearLayout.Alignment.Fill))); + + final Panel content = new Panel(); + mainPanel.addComponent(content); + + Login l = new Login(); + l.login(Credentials.user, Credentials.pass); + Rozvrh r = new Rozvrh(); + r.download(l.getJSESSIONID()); + + content.addComponent(r.getPanel()); + + // Create gui and start gui + final MultiWindowTextGUI gui = new MultiWindowTextGUI(screen, new DefaultWindowManager(), new EmptySpace(TextColor.ANSI.BLACK_BRIGHT)); + + /*KeyStroke k = terminal.readInput(); + if(k.equals(KeyStroke.fromString(""))) + { + window.close(); + }*/ + gui.addWindowAndWait(window); + + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/xyz/thastertyn/Window/Rozvrh.java b/src/main/java/xyz/thastertyn/Window/Rozvrh.java new file mode 100644 index 0000000..8a8d45f --- /dev/null +++ b/src/main/java/xyz/thastertyn/Window/Rozvrh.java @@ -0,0 +1,62 @@ +package xyz.thastertyn.Window; + +import java.io.IOException; +import java.net.UnknownHostException; +import java.util.List; + +import com.googlecode.lanterna.TerminalSize; +import com.googlecode.lanterna.TextColor; +import com.googlecode.lanterna.graphics.SimpleTheme; +import com.googlecode.lanterna.gui2.Direction; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.Separator; +import com.googlecode.lanterna.gui2.TextGUIGraphics; +import com.googlecode.lanterna.gui2.table.Table; +import com.googlecode.lanterna.gui2.table.TableCellRenderer; + +public class Rozvrh { + + private Panel rozvrhPanel = new Panel(); + + private xyz.thastertyn.Jecna.Rozvrh rozvrh = new xyz.thastertyn.Jecna.Rozvrh(); + + private String[] labels = {"Den", "7:30-8:15", "8:25-9:10", "9:20-10:05", "10:20-11:05", "11:15-12:00", "12:10-12:55", "13:05-13:50", "14:00-14:45", "14:55-15:40", "15:50-16:35"}; + + String[] days = {"PO", "UT", "ST", "CT", "PA"}; + + Table t = new Table<>(labels); + + public byte download(String Jsessionid) + { + try + { + rozvrh.downloadRozvrh(Jsessionid); + + String[][] r = rozvrh.getRozvrh(); + + String[] s = new String[labels.length]; + + for(int i = 0; i < r.length; i++) + { + s[0] = days[i]; + for(int j = 1; j < r[i].length; j++) { s[j] = r[i][j]; } + + t.getTableModel().addRow(s); + } + t.addTo(rozvrhPanel); + + return 0; + }catch(UnknownHostException e) + { + return 127; + }catch(IOException e) + { + return 126; + } + } + + public Panel getPanel() + { + return rozvrhPanel; + } +} diff --git a/src/test/java/xyz/thastertyn/AppTest.java b/src/test/java/xyz/thastertyn/AppTest.java new file mode 100644 index 0000000..cf34326 --- /dev/null +++ b/src/test/java/xyz/thastertyn/AppTest.java @@ -0,0 +1,20 @@ +package xyz.thastertyn; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/target/classes/xyz/thastertyn/App.class b/target/classes/xyz/thastertyn/App.class new file mode 100644 index 0000000000000000000000000000000000000000..356a6493b3d62e5f12bbb6b1b7ea905b06b2dc0f GIT binary patch literal 517 zcmZvYT}uK%6o%hfS9jg~*6j15y3&I7qDv!)APBa)FqG(O)ImpdSJpAJf7MMwK|i1$ z6`ffFLAyC;&Y5|i^UnGH`S=2GhJ6bLL*Zri>Z%?eD-o)h?_Q2Z7EFd*pFeYV!2Pa! z-|CCDVo01zU#bg+Sf$!vFt37+a1cW>g*XxnSx@@nZZd3%@PW4mg5X}z=7RME3ew^nUf$TJ+Q2%FOH1XK5xgo~qt9FjVeQrOha zV&R0CCJ(zbxcCp5J~xdh3`eWJ*6`%gsRxs=Ev}{hrA<3K)n;)BnnlY63_8(LC|Xpx zlo{pt@f`MBbnQ^o*MNf!imAl|%4w>S$RJA{ExsX`K{@@2+~b^fdh(9q5|W7~=3%2i a;${RZF9axKi-a~g*~Sjx7Pu=fl4@oZ86 literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Connection.class b/target/classes/xyz/thastertyn/Connection.class new file mode 100644 index 0000000000000000000000000000000000000000..2fe37209e57686252c0a7ece42abf30eff19a8c7 GIT binary patch literal 808 zcmb7C%Wl&^6g{_2VkdQ)VoLf5uhJHhKx-tHjo3sW0amhT)&0a7C6l_I%9&J@ui~+Q zvfu;wD8#iB;V#+*3w!SC+;i@o`TghTF95Ib(#8^D^W)_w-;Bl7$i!U6epkn_42{yU zjRIkHA})jQ^nwPuSLW58mOEHuQp>qTCe`tBY6DK<2i68MiQ!^XN*rXD+ zT|CK%Lak4gEQ7G?qKFc2BT%vI&CUigITnLR61+f%B03R?O8rH!)X5fGfrXZfXKu+5q+enZ47W8rLBaA5OC zD6{t=%K{Cr@&m5td23gwTk!6C53lgp!Z+-E;j$&{@xRV3z~CaoR~Wv|_7m#wNC zVQ{UDb~l9Z?7SdEx3*R(LL7|{V?fAqZPeZ7xm5k5EIUOw&21&SLiXD0-)7_*y(Y}^ zf9$Ua>4V+$m0D?kWc-)w!bid!9Du(7GkIgigq1jGAYOc8_`!_;DWe~Q7mgW6hdO2+ Lvm%@@2FQK@M1(ug literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Jecna/Dochazka.class b/target/classes/xyz/thastertyn/Jecna/Dochazka.class new file mode 100644 index 0000000000000000000000000000000000000000..028a458c3f9f2f86f11fa27d1c0d9fc2b1ab834d GIT binary patch literal 1255 zcmZ`(+fv$46kP|X(GWyYD=OAYZ-A9p?Nul<_0p*hYG-hq>GbIkG7!ZilbjUwSNZ{c z=}RA4Ydg~q=tp(B6L7464C6E` zWZkOjGQx-{7=SDx&M@3XSH>V>17JufxP?B3c*!vJUGKP}JNvxSpcN7&OXH0L?ihaD zPDVuCa2aMgnO|3sSjDSW(`;D0`ub9|v2?cpnKc=cNJ*GtnCK8=-7-zm-LOmr)40PB ztLfq@$&gHEN|sYo4_(W%)vGW0e$3KoY?n97<*mKljVR`EPr_Y>(O%^W?&AT;s9DyL zL3Yn@~0>Zt{v?=+_!w9TLK2Ty$^viO#Y`x$4mxB5MwQf>jTLuv0x6}p|;25 zvgJ9N{>JcK7`wccIiD@&$g*L&$qXUixAc}M3Zb8Vbmoxh8Kuk`RWW)GWzV5xe_`@Lm`KblTwpGY#KQ|@ zLb$*p!_H^)?=F7FTH7K1Fd?QnYZ)&=4r;ie*gFh;4SuCI1KGi*Pp{;!t+9y;#!46ktiM>>MNCL zo(kil&agV=mpsh48iyyNsYnWj#eJz{@s6R^?VU2z4|FOTsA0*+0u~vXkyPTiJRb@3 zk&iOL5JWoR*(o>D;@ii1F_Ae#C;E?#0fU#`nqt`RMwO$uFj9>NcVBvuHsf%b>+&Kz z&`ObSsnwu?HLSY`$Ya$XT9%Iu+-Go;IhmpVmpT7X_3(h9QH}BNi13*Z7kfODmtq-D z@XWh?9x4K(MpZZgoo#3C@;!XsKRP&``DQ=6RpoA^|7nnG%R~X%g{4+S@d%gTJvKq61Q*-vn@|qKi^=35Apy z<%Rw?cwcAj21VPpahak&Cs1A?w1j(T(u@5#AxVdFyZ;@lK`VH8gU2-l?Vxjm7gW65 ro#ih?abRUzG#OOYNqB_>TNF15+cB-V6uRgUB2o0IvhH>XIe7gCA<(D! literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Jecna/Login.class b/target/classes/xyz/thastertyn/Jecna/Login.class new file mode 100644 index 0000000000000000000000000000000000000000..437081046844768acc73c1cce55005174c25b8bb GIT binary patch literal 3133 zcmai0>vt688UM}hCNtR#1V^AoKtzeTnT(c#l7JeQAc-M~*(C}>bu#;s9Wpz!%*^IO zThz8zYg>EMTBxnP+oP%VMo6UX=bnDz=sE2<{005kZ~fBK)89M0kWE?Wp0hLWJoCKI z^Lu{J<(4xe0WqqXCTyT1FgCjFyX2BFI@&u8@v=+j1wZz>&{YVJa#( zp@OX=H;#gE)=!Hl6NtRY?oiN7 z8{>grk}N5>r{nstJFgdMxRYcsl=6HUcVVZByVrV%3DePrdq|ErU5?Rhsx@9Ay}$FA ziVg*OOt#~j2OU>v=pvG{X0I!mF~fot2$L!DtQpf@4Y&7H=zD3j<6g;fkAgM!t2yhO z)L@d2Cmk>E&xI20{W?C6T?#bY_ae*j$lI1$WEuL)60`7ZL3|o^Gi?Lo;|B(E1IH^c zj!Rx2(D9&Tu#pT3Z&o7d)6tL3GURzDjOeW$`*l2ohbeM}Hyst?9I<+uYXV^+D->7b zXJ*%BBg>vSY?Z3@u#P^4vxC{}(AenE0RSTo}ab z%2X8DTm2fw*=nl-4HJBx5u(&%xz4O;Mh=rIjxfl2`*l2tr$}c(Sa}gB*jLAMolxsz zX~HoaSMf9}pq{UthecHI^Eyu8i|pz{g9D^~TU}FC)qaWoSsfOph_M)NSFpR|rh9Hc zlr%-(0w>9|m=|_A;<(ts%-6*_A;OaHg@OdL%F?UV(u`AZRd7sgyXi(9#kibp-=A^V zguVjvMx|kvLlKyP?}~@zWq%lzTPfI&b$yKN$LYWoM;^iz`1Ki_;49x?+T`qDT zG0$-lI$o(9JuTYyZ-mVjAEZ|Ej&ag^Xv9H~$rQtkRGJ6`{$ap@yGH{>oED zC(`h91)Im)GP~RM?sW=oTV_|=!2O{Ub%$|h{!+)U@M}(llfLWva}y%(1f-oaw6)_{ zEzPS9-Y~%p=~6=g)bE{4g4vw?#?vq~Zeww_ZIzhQ_YF;DisVJ)vOx|7jYY>1?j;mC11< zR~*cnu1)G1Pn4&#emSs(Jiho4e`fSbOw95SXJnA!*8;yT$a7_;5Zu*<#SVs>loTK# zKN7e~NEYHdIp94-4Sq=Qs`F_d-z&VQyDnl~mvR9uAH=%1@VY*>)XW|0$X_!I%Jhmh zZpB7EF$Qd|T6&jy3Cf0*5#w{qXf?JkVaGXaxPyqg_45^a`8=NU!15>KW70=?Y3os`3Of zW|uH;oL$26eJSHbYJP~9VnfC&#)j{Ta$o(F2KR~h%lJ3Vbh;hm%FvNp*7|&2r z;OT!Fqd0>xyvVn&;t9M#jkl0xljrE`2$nF3OWgA(9K~Na{VwA;(VW0%c$R1^{2g|j zrHQyou2i!GT)}yEfK2TbyvbF9$d;IzkBEN)&*OExISVOpHcoXbCje-xmw~? oR*sIuzwoJw_cAK+Byf?k1eTdG&~Ji>a`@ztRvwKxTxx9kFQ76S`v3p{ literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Jecna/Rozvrh.class b/target/classes/xyz/thastertyn/Jecna/Rozvrh.class new file mode 100644 index 0000000000000000000000000000000000000000..54fa3d94edbb14ca881ac3b1cea8b82966d7d167 GIT binary patch literal 3622 zcmaJ@?ROMc9e!^1Wj3>u5EhoOK-$nk$P3A6Y9rmGi9n!)CV_U_)IeK0><-C>&Fs1} zNeH4MM%$wJTKa0$Xf@VXtnJduDW@OwOV9C(|AQWnU;OIvc)C7!W|l0;!pX^<*?WKY z_xe1)-+cVZpKbzp0Dn|aC$Rn8;(6VfHf+Z%I*XQm)J$83{&@cUd~sSqP@rkXm^bvC zVNL1BPS2QWM<85uj|DcLJUP00oN|g;YpP!$P{`W?VuX?dSu5)da;v>#LLhiBpD|Sg z(4e6ns)BGmXhB2Bdy8pM5E0lgnzhXFx!KcZ@d@K}&J>7^=F>)Q!YF3tZ+|oBOlN7R zW%MpF&>ht_o#RC_Gi%cK=Jxd-kBms?>Iy|^r$#&?!)USs^;4$fWkz62dq?fyBTn8+ z1k=;rv0hyS_X#k}UG!zGtpjt}T*fS_XhXY#J+~#_Q>vi@odU|dk()D*oe^lOj>jud ze+{cD?#Eu4^lpK8^%cKp9TO4g%)y0LDfwv)y?B7-GYSRMV)Wg$uB?mAcfVh%cu>Q= zXpP{rtorWm2W=VCLmHA`LBeP9#aV;Jc&LWjYDC>Ro(LW$s9G=3!Vrt2@}Eekv#E4b zwT4wp+78RxkaCRl*)gNwB1pjjfyPXJ!OG>0Or^5wp>t`o;AHcbt$-MAajRsRj{c-| z)}ru{yzShQQSc~Dx+2-UK632VK?Gw0?bD7^u#>vJu&~f$7i^ORvW%WIDVHT2C6@Jc z&aj!DV|Yx#ae;elf_d0?(kyCt94UcF#chFs8d+Rd8-gNVoYH6P{9Hjln71r4nIZN^ z@g$y7K>Tm6b*|y_m}I7je1RRr^Qw?VF5CKWK0P;UT26liCrMm4q@G*Bsdxsb6g(@i z^-dQxJO_iAu+5y?T=W{zRGanW^g}sQnzd;+&B8k*jVVo$5{Xq)YlNlDw1zBZh)O$q zo{fc#X+&=4WTdl_93$2A@e!yXPr9z^^l*~%X4#o&52;_nl(KfqN5 zFR@#%`dvBI@G@Ru?kwhRZ3p&^%KNWrcpY!Bk#h2lyP^aFooU0H8h#}45zd*`ltb6r z@DmNo_$m88E5$a#At!y~)L5TkmgT5z+BT_`Wz6;7q$EiMw%wUK0#Q%UA8gyJMArgm zRjIW|N}jx{s9+#Up)&gd9E5CERXO#m&7QpF_5r(Cs0`UX>%|Aw$2~|Oz0KfL`MF}+ zJe-v?JL+}R9$6&pU zx>Bp!RBEM3y0OL8(&klg_r_9^Zz}r*u9fZCvAv=WN*B z+*aja=$3;VlHO%8#H^^ib0xNORNkLVhHmx+1A{A=PlQ@}$8O;M$*%XY`#QQ}Jtcgq zgwKrbolMr>?282Yloj+Q>f=gpGF&a!7yJ-`$v`5UdLR3ECpO?;Tv9|_iAR>pf2|fD ztegf!OFXz-zT72)2)G$4GU~F&fLW+s>IQtQ-5(=rMkl+r5mdpPLN|FBr`@$>urxfgshdsfVQ^I@+3$gRD3nhFx zsocP&$?I53MiPqL`FgTGQ9qe%xY?%#`l2g{CmQ0>-lUp{B-9dKd}=8w;?cOaT>e*V zr`#>!O7JZlmoMK=YAfhWXdmGF0w19*8I?s#s2&&+QCV18kci+-ioGiEdiie&H6T_0 zFqkRf$4PYsyL@H7$ZObCtuql#y4;9|f*D2?%p}y*Qdq>pP0{6Yvzvpa@N!v^v%BN425?v$#u*n@uafF4V}+J{``^HFk(ijsHVP zl<_bcD*&$?dT_raVeW%{qXc`yo#iBD6wWlXmFZga?t*BQOjFhg0sm#Z0$x*m=l_dt BOYZ;x literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Jecna/Znamky.class b/target/classes/xyz/thastertyn/Jecna/Znamky.class new file mode 100644 index 0000000000000000000000000000000000000000..a1b1bbd9ad7e613ca41f1b9f216f13121dbf1934 GIT binary patch literal 5108 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 literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Tuple/Pair.class b/target/classes/xyz/thastertyn/Tuple/Pair.class new file mode 100644 index 0000000000000000000000000000000000000000..2171d55c28de65cadd9ac7399407a23c8580cb97 GIT binary patch literal 1804 zcma)5X>Sry6g>|p+t3Z^W?fnY!9LKBY{RloS_Q4! zX&Qw$x@pA_5tumCkM%-RZ#4?9cMpv{TOfL@H@n7$K)N>gvMi9;F&i!2?plUGMAM3t zk_U=TT;jN5woJP!u$&7r1T$(~K*=$crj^PZMV`0!jU>XDNI}7*Kscw?6A-wP!U&?g zn@S;psK9v5Y#Fb*A9oE)(|4QHRJzvQ)0=hOGC6jW5&OVA5}2=D>IU^a-GB0=b8$L* z`LW7H-&G!;*VWlKo2@^$4bhSjZN|9K(3$p^1XC z(!#ji-mxvS)ez|KL1xP_6xEyMo5yccr z*rfLLPRD5N3#|E}a;VCF7y3$-AP$Q(dSUvyLiEriQWSHdIK?!NUYtan z_6kyzmxxh}5%Md=e11HCPQR5?r1Pt%$b6?%7}K<-5usI~b(9Fl=o!ZhWftTy%wmor zB5=#|jthrywGTD#p|}x=N)n2jnxvJRc|rgDZiJiZwZJeCD1wYrIwe7FX)e>ta2bJX z0iB;*oystcV~&dSkK1W)4+H|s=4bT39 w`Zm3CjAHh@_7XSbN literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Window/MainWindow.class b/target/classes/xyz/thastertyn/Window/MainWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..583b78ffeeac9486a44a6f3a369f8467239ef5a7 GIT binary patch literal 4040 zcmb7HX?q*h89mpQJ+?fFA%PHukP>i+<=7EP2-J3Q{#GM04mradgse!#R%?+$_1-srSIDDLEpFj~>2Lqms#bpl)J8wf*3 zS10IPM;qD&x|61Dq)Kxq3^yZBScbrcq?47_v~*2%UwIhvPMJl48!nG+&B+*Ht6Q=) zTqAH>)|rdt9Vc%YSw^XjNe zebzOkXDo{e4D?2mO^q*$4{O*)m3s0;8aM3NvUJ+N4dXgouMpiXu)FvF@D-iz!j0IW zp+{gx6PJN29XFvvpsVOf*9#tL=q1+mwDTo%Z|s<~4J(YD=+dxDAlgt^2Upb{4xA#IsAT!E=3rdEj$*XPO#lqAUz&(#o;QCT#z0pr6MR1_V= z?KrBZWzZL>yF@Y!;E;8o{_@u?r|Z`6vE%Gy0{Cf^;Rjf#PdgM@Dh5V|sillZcNb z!#IY0otVL_hPws!HB4JA`+G(#GjGo^M>>w<9`?^erp2bazcGAYZ^CEycXfOZ_Y%vX zM+M9qlb#f~uNg~g%5o*JW^`TgK>x=eb(}y}U|qFJ0_W*w&i!tnWSco$;i{@iL&r(v zNqCvdRo@7tnz*ZqHuL5;w&6~gxL?ERwX-yshH=-(F^Q(M$XN?>Ok}C3I>UwVcYbrXb;S5LgWdpV{1*e?zXWUa^ zlvHcbF|Xr19$;qjhIceQo=ztwQwf&pRUBR`MOE>ov>wv&FdiYzxh&Y0BXa^*e@$4? zQ6>BX9Y4fl6sC0_GgefCsko}sJuVPySTYkF%4Tq?jB(C8d>8x0lLC7hDpiJgpjK(s zVLYKG)H4LQq3-xx!JAJPWY*}!vv^L!j~g@y6%zZ2^ z#Ni{EMiXkaHf!iFg^`onC+pHu5qnv(5uEGYQ_8NYz;a371eJYzy zEHOELE^8EmmEkvPrRgrP{=Bp&v-f9Qrj}&&Dw`fBWL-d(WvVNg+Ij;pNu#=ItKk;t zoa4G(sf?bwS~Yb+FK7Klz3DWqSp*oHmUXz-s;Mv7fVS0Hk%Q(y@m9KIDK(C0Z2?kK z5W%a1*0CCIzFX(RJRuAI!mi5TVDNR(@Cs{_%5#*B1WfcMh+e zyc^|P_3nzkMTGm7pwBL1{rl*?=u2M7>v~^*GeX#cZfwQ|KGOpoY{XT(Bc{vt#J^}; z+5KE3m#~S(HkT3M&+BG)E#ey!{U6{4fhFwZn`mla34OB*=wHO%GWO3bVUUl9heDCi zKp6)jq0mP-INQ2_(ex!8DkDkxW0ap-#9a%RzJ%|TabFoZD*E<@+6E$R!M%Tsq4r4o z0!}T!F5~+YD$)AcAuXas+RHds#)C7Fwun~7qk+za+5ROwL7AtP@HE~0Xb~?i;-^C$ zk&Z~HjF)HLM8`yb8Na;96Sv?~{F^1*3Wd>eerf^R_;fqg@#|$1da#wFz6ZVhq}_!B z=qJ(x+`(d;wR<>x_ToX@g2%BRFXC3b%02xL+yVbe$xjfc?L+vCOXh!(@bNy0u)?&0 zcMJZ5-{N&fu?ZjH4g8LNd+;89PaCbY@G}00H<_;z_o_efSsVSN{Oq^W(;(i$+sx7@ z%-K75m)FlI`)B-xR^FqRjcECjM{Cg_GzP@WYazZ`;Hwt=4S(nVEp+oN-pAs>2sg++ NT;l(O_<(us{0hMjx-I|! literal 0 HcmV?d00001 diff --git a/target/classes/xyz/thastertyn/Window/Rozvrh.class b/target/classes/xyz/thastertyn/Window/Rozvrh.class new file mode 100644 index 0000000000000000000000000000000000000000..6982ef3773cc048ab670177b785f9f145ea98899 GIT binary patch literal 2346 zcmb7GTUQfT6#h;wObCPGK)fr(YZ8f*1cDloI3PJ)0 zZ?E3by?L|YS#@vK(PwO@;@;9H+&eex^9mvYZ42g2Q?Hp$RUe;Qu*#l5OWnV|ZaP*? z;MhpnUDB(rTdi4Tw_-^wwK=9jlA^cuvI2Fcv1pu=A2b)2(-_R z{P(uu)orKB>qy01<)xq<>FrBZ*pBU; z7YHX))3j-je#a3;hl)1rQm|X#$eW`QM*YRx)}B&TuUdk(Z2Kf-_uuiRcX&1tJQ?ULyJ= zqd;&b*H`Q*Nbk?8XhuASqCn{ScnkxiQ zZ{B7#9)7u|H}w$dc{A<#;=@4+Ywmpz^B7)x&NQ81U@@Y0~WwCp;TvN2=AZMdF3|C+ zwDC%gJH9ShxnhAICs=2o<8`L6;t~O3vnAxW8lG8R95t8y{3~!3#95y#h^O=X#G7j2 z*+h>U?n=FEUAAj9s3oYr)6#u(v5~_3m5CxG2OD=GIk0@nRwspQV4t$vh~B|{2sv>^RHy@B@huSk?OuxAZ>x!uq0!8II8x3&C+&Qe(GGD;Ecs8Nb)$Bj~x zcG4&*TFNNJv{Oc@tx3ypRWzMzOv`a?)_SmKjX{>uB>7BC*Rr;u7~LtXm14Vv_8R(+{4D$hi`EJ-;qDcTQ%?jV;JX2;5t4G z{1a1@lhJ8V^`TSin2>ZG)1&gKN3>}y+!uL(VkS(+U?P$?B7M;Z*p*2{yLn1P^Tz$C z2o8^ac=8uf!|V7svyM+^?ngu-(oOE~lFM)JIw~{ahof!x_}zWTa050LG4E3s3k<$= zspu!8i|IPbR2-)>C((%%|I)aEZWuh@z-h{6DV;-&|4g{(#WMPQcPIQrH=epn=ZILM z!)=&_Lu7~=Cy186mj`hHU!u-1bTeQL?xIA8;bDciWq)^*yIZs?iKfTsRB&6ts`v*x zMeE<#`ve^bDG&-x-tb{u8J6d;Q3Ux%z&TuO5I|KQ~ zw+_WmvDPS#Pw@ou@1&A;RbZmJxFe8Vw8*5<0;PrygLo$} z(qW!FW^GsY1ztC5%RKf6(h`V=3C`kqNBS>isaJo)bLGvGcZ)NiU{^xUEq+A=}kaxpJ|BN)aX8 zbG@4vn5&*kamyO1IyKkiTsjSbrAw2&I5TcmHsrav?w@5nnm*emLmdwiRp%uc3W&OZ zXY|2|>P03va6=c+|JmJt=i8*AUEi*+o1oW~VV_I&@LXVFeCJNHs_>54zas^fug4@% z+|mOR(gzvy63vhKbCzA(@D#l0{N?!Xb2qOzpEp?Z`4)WVmX1;U%0dQHeCE?f57R79 zjT~?jGpzCY;x?Zy_zQzM$l`aDK9}wstv@c-CfKza1>sTpMK*M1