From 11097450e71a984e90b22dce58211d3370ccc854 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Thu, 3 Mar 2022 17:39:32 +0100 Subject: [PATCH] Rewritten gui from FXML file to custom JavaFX code. Basic gui with functionality to plot graphs to play around with. --- ...ven__org_controlsfx_controlsfx_8_40_14.xml | 13 ++ .../Maven__org_jfxtras_jmetro_8_6_9.xml | 13 ++ Bachelor_application.iml | 2 + src/main/java/com/application/DB/DB.java | 2 +- src/main/java/com/application/DB/Sort.java | 5 - src/main/java/com/application/Main.java | 170 +++++++++++++++++- .../GUI/graphical_user_interface.fxml | 2 +- ...logo_tittle.jpg => moelven_logo_title.jpg} | Bin .../resources/com.application/styleSheet.css | 12 ++ .../GUI/graphical_user_interface.fxml | 2 +- ...logo_tittle.jpg => moelven_logo_title.jpg} | Bin target/classes/com.application/styleSheet.css | 12 ++ target/classes/com/application/DB/DB.class | Bin 5653 -> 5459 bytes target/classes/com/application/DB/Sort.class | Bin 0 -> 275 bytes target/classes/com/application/Main.class | Bin 1568 -> 7185 bytes 15 files changed, 218 insertions(+), 15 deletions(-) create mode 100644 .idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml create mode 100644 .idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml delete mode 100644 src/main/java/com/application/DB/Sort.java rename src/main/resources/com.application/GUI/{moelven_logo_tittle.jpg => moelven_logo_title.jpg} (100%) create mode 100644 src/main/resources/com.application/styleSheet.css rename target/classes/com.application/GUI/{moelven_logo_tittle.jpg => moelven_logo_title.jpg} (100%) create mode 100644 target/classes/com.application/styleSheet.css create mode 100644 target/classes/com/application/DB/Sort.class diff --git a/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml b/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml new file mode 100644 index 0000000..6958924 --- /dev/null +++ b/.idea/libraries/Maven__org_controlsfx_controlsfx_8_40_14.xml @@ -0,0 +1,13 @@ +<component name="libraryTable"> + <library name="Maven: org.controlsfx:controlsfx:8.40.14"> + <CLASSES> + <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14.jar!/" /> + </CLASSES> + <JAVADOC> + <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14-javadoc.jar!/" /> + </JAVADOC> + <SOURCES> + <root url="jar://$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/8.40.14/controlsfx-8.40.14-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml b/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml new file mode 100644 index 0000000..aafb072 --- /dev/null +++ b/.idea/libraries/Maven__org_jfxtras_jmetro_8_6_9.xml @@ -0,0 +1,13 @@ +<component name="libraryTable"> + <library name="Maven: org.jfxtras:jmetro:8.6.9"> + <CLASSES> + <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9.jar!/" /> + </CLASSES> + <JAVADOC> + <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9-javadoc.jar!/" /> + </JAVADOC> + <SOURCES> + <root url="jar://$MAVEN_REPOSITORY$/org/jfxtras/jmetro/8.6.9/jmetro-8.6.9-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/Bachelor_application.iml b/Bachelor_application.iml index bcd84db..989e66d 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -52,5 +52,7 @@ <orderEntry type="library" name="Maven: com.google.cloud:google-cloud-storage:2.4.0" level="project" /> <orderEntry type="library" name="Maven: com.google.apis:google-api-services-storage:v1-rev20211201-1.32.1" level="project" /> <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" /> + <orderEntry type="library" name="Maven: org.jfxtras:jmetro:8.6.9" level="project" /> + <orderEntry type="library" scope="RUNTIME" name="Maven: org.controlsfx:controlsfx:8.40.14" level="project" /> </component> </module> \ No newline at end of file diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index 16db207..b674e53 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -46,7 +46,7 @@ public class DB { // Step 2: Prepare query job // A "QueryJob" is a type of job that executes SQL queries // we create a new job configuration from our SQL query and - final String GET_WORD_COUNT = "SELECT VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp"; + final String GET_WORD_COUNT = "SELECT VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE treeSpecies LIKE AND TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp"; QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(GET_WORD_COUNT).build(); diff --git a/src/main/java/com/application/DB/Sort.java b/src/main/java/com/application/DB/Sort.java deleted file mode 100644 index 2527342..0000000 --- a/src/main/java/com/application/DB/Sort.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.application.DB; - -public class Sort { - -} diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 2fd00b7..e04a12c 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,12 +1,26 @@ package com.application; -import com.application.DB.DB; import javafx.application.Application; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; + +import javafx.scene.chart.LineChart; + +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.*; import javafx.scene.Scene; import javafx.stage.Stage; + +import javafx.scene.chart.CategoryAxis; + +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; + + +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.Objects; @@ -18,6 +32,12 @@ import java.util.Objects; */ public class Main extends Application { + private BorderPane topBar; + private HBox menuBar; + private HBox logoBar; + private VBox sideBar; + private LineChart lineChart; + /** * Starts the application * @param args @@ -27,6 +47,22 @@ public class Main extends Application { launch(args); } + /** + * Initializes the application with all the different panes. + * + * @throws Exception Exception in super. + */ + @Override + public void init() throws Exception { + super.init(); + + // Initializing variables + this.topBar = new BorderPane(); + this.menuBar = new HBox(); + this.logoBar = new HBox(); + this.sideBar = new VBox(); + } + /** * Sets the primaryStage and sets the scene for the window. * @param primaryStage @@ -35,18 +71,138 @@ public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { - DB.getFromExistingTable(); + // Create panes for root + BorderPane root = new BorderPane(); + this.menuBar = createMenuBar(); + this.logoBar = createLogoBar(); + this.lineChart = createLineChart(); + + // Sets alignment for the topBar + this.topBar.setTop(menuBar); + this.topBar.setCenter(logoBar); + + this.sideBar.setMinWidth(300); + + //Set id for panes + root.setId("root"); + this.menuBar.setId("menuBar"); + + // Sets alignment for the panes to the parent root + root.setTop(this.topBar); + root.setLeft(this.sideBar); + root.setCenter(this.lineChart); - // Loading the GUI-fxml file from resources - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/graphical_user_interface.fxml"))); // Sets the scene and defines boundaries + //Scene scene = new Scene(root, 1200, 600); Scene scene = new Scene(root, 1200, 600); - primaryStage.setMaximized(true); + scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/com.application/styleSheet.css")).toExternalForm()); + + primaryStage.setTitle("Moelven Drying Application"); + //primaryStage.setMaximized(true); primaryStage.setMinHeight(600); primaryStage.setMinWidth(1200); primaryStage.setScene(scene); primaryStage.show(); } + + /** + * Creates the menubar with buttons. + * Defines each action when button is clicked. + * + * @return MenuBar as a HBox + */ + private HBox createMenuBar() { + // Creating buttons for menubar + ToggleGroup btnMenuGroup = new ToggleGroup(); + ToggleButton btnMenuHome = new ToggleButton("Home"); + ToggleButton btnMenuInput = new ToggleButton("Input"); + ToggleButton btnMenuFinish = new ToggleButton("Finish"); + ToggleButton btnMenuHelp = new ToggleButton("Help"); + + + // Set the buttons toggleable + btnMenuHome.setToggleGroup(btnMenuGroup); + btnMenuInput.setToggleGroup(btnMenuGroup); + btnMenuFinish.setToggleGroup(btnMenuGroup); + btnMenuHelp.setToggleGroup(btnMenuGroup); + + // Set the home button as default selected + btnMenuHome.setSelected(true); + + //Make sure always one button is selected + btnMenuGroup.selectedToggleProperty().addListener((obsVal, oldVal, newVal) -> { + if (newVal == null) + oldVal.setSelected(true); + }); + + /* + btnMenuMetaImage.setOnAction(e -> featurePane.loadMetaImage()); + btnMenuImport.setOnAction(e -> featurePane.loadImport()); + btnMenuCreate.setOnAction(e -> featurePane.loadCreate()); + btnMenuSearch.setOnAction(e -> featurePane.loadSearch()); + */ + + menuBar.getChildren().addAll(btnMenuHome, btnMenuInput, btnMenuFinish, btnMenuHelp); + return menuBar; + } + + + + private HBox createLogoBar() throws FileNotFoundException { + //Creating an image + Image moelvenLogoM = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_m.jpg")); + Image moelvenLogoTitle = new Image(new FileInputStream("src/main/resources/com.application/GUI/moelven_logo_title.jpg")); + + //Setting the image view + ImageView imageViewM = new ImageView(moelvenLogoM); + ImageView imageViewTitle = new ImageView(moelvenLogoTitle); + + imageViewM.setFitHeight(100); + imageViewM.setPreserveRatio(true); + + imageViewTitle.setFitHeight(100); + imageViewTitle.setPreserveRatio(true); + + Region region1 = new Region(); + HBox.setHgrow(region1, Priority.ALWAYS); + + Region region2 = new Region(); + HBox.setHgrow(region2, Priority.ALWAYS); + + return new HBox(imageViewM, region1, imageViewTitle, region2); + } + + + private LineChart<String,Number> createLineChart() { + + final CategoryAxis xAxis = new CategoryAxis(); + final NumberAxis yAxis = new NumberAxis(); + xAxis.setLabel("Month"); + final LineChart<String, Number> lineChart = + new LineChart<String, Number>(xAxis, yAxis); + + lineChart.setTitle("Stock Monitoring, 2010"); + + XYChart.Series series1 = new XYChart.Series(); + series1.setName("Portfolio 1"); + + series1.getData().add(new XYChart.Data("Jan", 23)); + series1.getData().add(new XYChart.Data("Feb", 14)); + series1.getData().add(new XYChart.Data("Mar", 15)); + series1.getData().add(new XYChart.Data("Apr", 24)); + series1.getData().add(new XYChart.Data("May", 34)); + series1.getData().add(new XYChart.Data("Jun", 36)); + series1.getData().add(new XYChart.Data("Jul", 22)); + series1.getData().add(new XYChart.Data("Aug", 45)); + series1.getData().add(new XYChart.Data("Sep", 43)); + series1.getData().add(new XYChart.Data("Oct", 17)); + series1.getData().add(new XYChart.Data("Nov", 29)); + series1.getData().add(new XYChart.Data("Dec", 25)); + + lineChart.getData().add(series1); + return lineChart; + } + } diff --git a/src/main/resources/com.application/GUI/graphical_user_interface.fxml b/src/main/resources/com.application/GUI/graphical_user_interface.fxml index 6b2bd5e..975d47d 100644 --- a/src/main/resources/com.application/GUI/graphical_user_interface.fxml +++ b/src/main/resources/com.application/GUI/graphical_user_interface.fxml @@ -62,7 +62,7 @@ <center> <ImageView fitHeight="30.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true"> <image> - <Image url="@moelven_logo_tittle.jpg" /> + <Image url="@moelven_logo_title.jpg" /> </image> </ImageView> </center> diff --git a/src/main/resources/com.application/GUI/moelven_logo_tittle.jpg b/src/main/resources/com.application/GUI/moelven_logo_title.jpg similarity index 100% rename from src/main/resources/com.application/GUI/moelven_logo_tittle.jpg rename to src/main/resources/com.application/GUI/moelven_logo_title.jpg diff --git a/src/main/resources/com.application/styleSheet.css b/src/main/resources/com.application/styleSheet.css new file mode 100644 index 0000000..1efb3b4 --- /dev/null +++ b/src/main/resources/com.application/styleSheet.css @@ -0,0 +1,12 @@ +/* General css for alle the main windows */ + +/*noinspection CssUnusedSymbol*/ +.root { + -fx-pref-width: 1150; + -fx-pref-height: 600; + -fx-fill-height: true; + -fx-max-width: infinity; + -fx-font-size: 14; +} + + diff --git a/target/classes/com.application/GUI/graphical_user_interface.fxml b/target/classes/com.application/GUI/graphical_user_interface.fxml index 6b2bd5e..975d47d 100644 --- a/target/classes/com.application/GUI/graphical_user_interface.fxml +++ b/target/classes/com.application/GUI/graphical_user_interface.fxml @@ -62,7 +62,7 @@ <center> <ImageView fitHeight="30.0" fitWidth="125.0" pickOnBounds="true" preserveRatio="true"> <image> - <Image url="@moelven_logo_tittle.jpg" /> + <Image url="@moelven_logo_title.jpg" /> </image> </ImageView> </center> diff --git a/target/classes/com.application/GUI/moelven_logo_tittle.jpg b/target/classes/com.application/GUI/moelven_logo_title.jpg similarity index 100% rename from target/classes/com.application/GUI/moelven_logo_tittle.jpg rename to target/classes/com.application/GUI/moelven_logo_title.jpg diff --git a/target/classes/com.application/styleSheet.css b/target/classes/com.application/styleSheet.css new file mode 100644 index 0000000..1efb3b4 --- /dev/null +++ b/target/classes/com.application/styleSheet.css @@ -0,0 +1,12 @@ +/* General css for alle the main windows */ + +/*noinspection CssUnusedSymbol*/ +.root { + -fx-pref-width: 1150; + -fx-pref-height: 600; + -fx-fill-height: true; + -fx-max-width: infinity; + -fx-font-size: 14; +} + + diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index 5fc50365604b4b0b0667010e8571d75202544d72..c77ffce8fa0cbecece9c222fcf0d44db5e517a4b 100644 GIT binary patch delta 1513 zcmbQLb6KnY)W2Q(7#J8#82)oHm@=fYGo*1aq;oMaF=VhaWO6aEGGuWvWHaP|Sh?&B zd0Y&f4EbCP1q_8;3>FMUTnu~+#q10v91P_kW(A0-1W8x1GgNah)NnD>GSqP~)H5`I zls9rQG%+-DF|;tWvNN=CGYB(u)Uz{maxru<bh9(`a4__8F~~7wfcSk}4E+ofxELlf zOyXpi%rJ$6VJa8HG=}Ny3^PE|v$z;$GtA*;n9DGan_)h~0uZr~ona9N!(uK5U4|uG z3`-f7aWO1sSi!-t62w`>!LXX0VGS3<T84EXgVwV%Y+z(yv)RndXv@fz#?G*jogtH* zA#bu5lk4VxOooiSo7fpPvomaAXV}Wlux+vpizKrpgVp2+mPBSthV7I0u*f)AGVEYy z*vZ4Ni(xkp!yX1JMh4-m#Ii*FoW#6z{g8~J{PM)4oKzl$y$t)<8TRuq9AG%e!{ET+ z$ir}m;Rqvx;p9MOsmb+x9FwhBodu3E9OGd)&TxW<;UvQ;Mg}FABr_w!=E>VxV?;`d zQd5HqQj;@Nixqr4y<HU?{ahvsvAL>k2AO=Co#6~f|5+XeKL&qxhI1gn^Xv>4K!O(; z8FXOgO>W@jn!J*YkNFbA<;lC)6xp`$FkE4{I{6`+zVtPQ>+B3Sco=Rn++t_A&BJhq z;VwJFJsyVp3=bx2v&(Qk<Y9Qku$_^?6mD1wzwqQ%c5&s$3{Th@w(>AMWq8KU@SKO? z1;a~rhHX3yuNYqQFuY-S%gCTHIgnXn@^f}Um3Iv9*%?0YFnnbA#Ln=Uhv5suS4IZT zkj&iF;F84L0v?8M40k8XaL93g=VAE4@RNt(7sKz(t{lNkObmZF&*FN_#>DV%a=oCx zumyuD0|>A%Ffv#&STQg%SWkW^D5h@1z`(%9z{tSBAjn|Lz`(!*X0tNbG1xOOFmQpQ zfPsm@da|6*!g`QeIR<tH1_luZE(R$EQ3h!SDFzt^YX&I>X9gLDGzM9)8Cnc13{nh= z3{DKr42%rI48aU846Y1J3|tIx3~mhW3=9lu3`|g24+aK?2nLS-44Moq><pgl3|{OE z-s}uM42<jyK3xA9*ucUJAi*H0s5?7@&wmC11~zsEPp|}o4+C5W^M3{=1}2C}3=9mu z3=9k)FUv7-f#MqE6$S<dHwGq9STM*<o**n+zkz{)fsp~^IWY!S1_lOI24)5|20jLL z1`!4g23ZDGBvUvU0vN0yrZBcLurY8jFfi;B67d!i*})*XjX}(32ZOlw4hD&B43f-y z8KibHNHa6|>M-wRklDr{>#K8|fp<59T%?fvb_Rw0I@=f&w=pQyA7c;&2|~Hs7?eSh zn;2AtRJSpxf%K|xW6<!^-NvA~lR=A-!HPwaWha9+Bg0GvcMwa5k>LP?t`(~!tB~F{ z2K{Xe2HO}6&DbPag^a*lV=H!$VJ5758B8OYCE0@`Swz`(Fqj2zV=xb2{(o!zMg|53 zX0ZR=7z7y@7z`Ph8H^cN8B7>>7_1l+7_1pI8SEHz8SEL%8Jrj#8Jrn{89W)H8N3)$ z7`z!;8T=TgF!(bpU<hE?#SqA_mmvt82s{|r8Ky9(F$6LMF|aW#V31-6W(Z+mXJ}<G zWe8;mV_;=qX4uUT&Ja=$PIa3YA{ZhW7#S28<}pMuL^Cikq%cG=#4yA%Ff)MCh%^Js zKL&GlhB$VHcy@*a>Awup><o$Q3`xHje39aZi6NPR0j#-<fq}t@fsKKWp@5;3fs;Xs pL71VPfs;X<L6~7C11G~_hCd9YESwDWd<?Y=r3{h`EeuT{0RZmjF!ule delta 1712 zcmcbtHC3nn)W2Q(7#J8#7}>cP%ouXm8FD!o^0*k781mT}3b+_p849@=iWrJPtP*yH zQZ5EghB7XOa)t^n21|xYE(Sh^Dt3ly4u(1qvmQh=fTSDQ8Ja*UnmHI+xENX)+PE0n z89G2Bom>oE4BcD|Jq*3<41M+748jZ(*cm2rF-&5Z%+4@{gJCKcgFHh%h(C>sVLHPM zE{2&5vp5-MGtA*&n9Id5k6}JL!vc`>A})r-3`@8fmNG2kW?0U!0z|B2XIRC-u$qfO zk6{fL!&-)QTny_OHgGU(1aUTTFl=UL*uurIm0=smpzZ7oj5{{|a%AMnWoOvQ&QQS4 zP&(O_$(4sADKovWG_|ObkwIk=pR$fMBLhorVrCvAgP2CNPgY`CqJB<dUb=p8Nl|8A zy0vB)BLhofQF<{WgK+fZgG?fuyO<0aHFvQy>}F@!!_Kgmonap%16Oc<X;E^jTV_rw zBLlmOlOD(%9tJB0>&Z`;6WOd7_A@ewPkzTJZVwVXz|L@xhv5*zVIGDf4AzVc!XVWU zTSGF6^2-yGa#DF1jxro$XE@HoaDw3^4}&9v6A!~FhBK2FvSbLHWjM#faGv1;55q-< zON<OklNtGxICvPsL1xXHY{wcic|EI(+HR26%j^tSKx(h@F!(bBurpi(30`MsxB(Kp z$;hAs(mPp(mrIb5fzvBL$-kf^Ge3`q;TFT~$zg1YY<qYZ?l9b)T+62KaF5|WJHrDW zhKCG~*cl%4Fg#&+%FghNhv7NH3q}U<kj&iF;*!MN0?x3+qRiC15{0tFoYGWwhL=1H zuRz{61=%!-UwE=2ySVaehBxdCdwCe%GQ4AFc+bP|f#D-N!#*B{PYj=V7``xkWn|Ep z%*ZD-`8yNe<Ysn3m2V8+*%^NDF#Kfr#m?}Xhv5&yUq%K_ke$IGJ9!xXF+82TgI$jM zKMx}VBO?zZ6C?BHhwQ;jOpL6X&A1-3F)^}DmKO96uw*b}00CA8Mo{c9Ff!OMFfiyd zFfuSQFfg!cZD(NI$iTqB#9+(7z`zC;6lAbtU|`?@vsoGJ85|fG7`Q+Y!ob8}GkKTb z!g`QeIR<tH1_n_EE(U1^Q3e?XDF#^vYX)fsX9ih@GzK}a8Cnc13{nh=49*NL42%rI z48aVp3~mfe3|tIx4DJjb3=9lu3`|g2PX-2t2nLS-44Moq><nJ)4BqSvKI{y>42<jy zzFhwq*ucUJAi*H0s5?7@?|%jX1~zsEFR%oIF9Tc$^M3{=1}2C}3=9l@3=9k`42%r& z3|ydu0rCn1149%86WE&ylXZk;>%Fx$z=J}Jft7)QL5+c#L7jn*L4!erL6bp_K@03H zP|(ORFfjx&1fiJB$q>vC0yWu)fdOnX%MJz+L;!=zA_fLM24)6*xJe*)g))ROFw`SC zk`t7;Ax1H_GO#glFfcIe6B6|n65YWdwv9pDX9t6X_6`QgZ46S(dl{s6GRQD9`06n4 zWsu#*Am^)doPl>YgM6fr!gdD5{W{wil(sP_A7c;&i9vbW7*s%Vn;2Au)V49GgS6Ib zY-7;$)7{3PwUa@ck->^Zl4U1@4kN=%26qrkmyzKBgPs+uB&(4AHU@)j42IhnjLg_1 zS%r+jToWsHkZGo@dl}3knI+kSBUwb*b}*O+Z)30sU;ck9C={5%$;^#Gkb!~0f`OUA zih-5EngNvC6&RfA88jJO8FU%k7|a<w85|kB7=jrB7@`>h8B!R67+M)Z8Ky9VF)UyR zXV}FM!LXMh5*&mc4D1Y37}OXd7$O<i7#1){F+?#$Gq5wXGMF;NFvK#jGB7jjW{6{m z2B+yw4Dk#J42%p44D%Qg8Il;77*ZIb7?K%M7?>GyKuJ)Vf#n~AIXgotJ3|^fL%Q@| z25EMN40eXhUktuT@x#QB1x_m247Cgl3`PuW415gb3^fd#4AKn34E+q83>pl=3=0`J a8BQ~@Fx0ScGPE<aGSo0gGW0NXf%pIrcurpc diff --git a/target/classes/com/application/DB/Sort.class b/target/classes/com/application/DB/Sort.class new file mode 100644 index 0000000000000000000000000000000000000000..a8073b0698d44e99c2a6ec25c9c9012f4d5568f2 GIT binary patch literal 275 zcmX^0Z`VEs1_l!b0WJn+23~dsK6VCvMg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H5^5Mg}3D{N%)(u*9NF5FaYYQj(Eb%*Y_=lboNcpIA_klbM`Yl9`{U z@8YB%oL^L8&B(wNoL^d$oa&YdGK3Q(sF#&kmdL}v!obSNAdW*LBZB})m3~fQUb?=2 zQdVkm34<a769Y2?2rx1*g0wR*GO#f)Fz7RY_zVoJTH6^IH!?6VFfp(*Ffgz&FfuSO bFf(v4Ffj0d*{lql3|tHh42%riU{yQ-36wag literal 0 HcmV?d00001 diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 72d339a777587e42e0b4cf66b835e33ec457f966..6df8d5af623e4d83379853b325596f2de5b2fa48 100644 GIT binary patch literal 7185 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 delta 981 zcmbPev4E%k)W2Q(7#J8#7*e<x#2E~@7{nM1xfqNXjJX(07)&`B%(xiL87#OMEE%lW z8LYV&Y#40W8SK~@?AaV99bf<fHisq%gNuQi!GVjxk--T>ID-fm5a9|U+}Ii1*%>?- z8Q5$x^D;~97#Wx~G{YDtuVk9R#NavEmpM>O)F&&kEHSM@zc@KHFI7Jvu_!gK#Cq}^ zW_f0I2CvDx*rn?w7$kWZycrbO8GLvcd>JI!8T@z{{22lm8I1Ik^K<nQ3kq^FlM_oa z^YirGLp}A=ixLYmGLsW?;!BHDi{dl$N>Yo`5|dN)(kgOu*ck$O7=jpr*%?B37(yAs z7#Vm#4$#j_Ezu7R@?mEP=V6Foh-73C1_^`Q<$~leMg}36FjzDgMDj35FhsF4MDsAj zFvRjO#4*J4FeHG8M1~|DhGYgwMh20|51B+J$Mg7`vE?L|<|St^GKePU=jtOn-Ni}Y z#fgzYBt5mnttda&wIZ{)Br`8PBrz!`b@B|}ll5Xyt3lq-cZ=}#@ySn2NiAYzV9Ci( zOkreD(g24g%q!NK5N=LlUb?=2QdVkmi8UjG6hsloV<5M~0^G$#GYrXdC5h>&`oSQQ zk%6Z;wZu2EBGVu@vnn-(k%2`c3Zxb+oSEm5nwg$a0ulwAzztHInHQd!Qj#(G2cJ$o zgCc_%gE%P3FfcPPGDt8;GB7eoF)%RbGcYnRGB7Z(YHep=+{nPdz{DWUz`(!;78GWX zVPIh30kc^dWEtcb7#KJi<QWtgn82Ei;hJ|aFd;N^F)%SOFi117Fvvg+s0UlYpva)a zz`&r)z`(%5z{sG&z{sG=pawN-Edx6P3j+g#>kbBHt!)e}Laf^u*mf|mA7J3v!N7Td zfy;L{19zm32m_A@1K)NA0Y7b)Z483iA`E=n7=*M%7<jfZ2y5$ZV-V5a#vqDtiy8wb z0|P^<8Ur(fCW9n{4ub}RE`u(E9)k&kK7%!b0fPgBA%hEp5!j(x5Enpw%D~{tpw6Jd hzzEi-$)Lr+#Gt_-%b?Am!@vypg)RdlgC02C^Z|4Sz`+0j -- GitLab