From 28e7c729804014eb2a240e635b5b9bcaa49b7be0 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 07:08:46 +0000 Subject: [PATCH] Initialize codecInterface --- .idea/.gitignore | 8 ++ .idea/compiler.xml | 13 +++ .idea/jarRepositories.xml | 20 ++++ .idea/misc.xml | 14 +++ .idea/runConfigurations.xml | 10 ++ .idea/uiDesigner.xml | 124 +++++++++++++++++++++ .idea/vcs.xml | 6 + Rpc20.zip | Bin 0 -> 11685 bytes pom.xml | 33 ++++++ src/main/java/client/Client.java | 10 ++ src/main/java/client/ClientStub.java | 55 +++++++++ src/main/java/common/BinaryCodec.java | 105 +++++++++++++++++ src/main/java/common/Codec.java | 11 ++ src/main/java/common/IRPCProcedures.java | 6 + src/main/java/common/JsonCodec.java | 87 +++++++++++++++ src/main/java/common/ProcedureID.java | 6 + src/main/java/common/Request.java | 47 ++++++++ src/main/java/server/Server.java | 26 +++++ src/main/java/server/ServerStub.java | 61 ++++++++++ target/classes/client/Client.class | Bin 0 -> 1221 bytes target/classes/client/ClientStub.class | Bin 0 -> 1830 bytes target/classes/common/BinaryCodec.class | Bin 0 -> 3256 bytes target/classes/common/Codec.class | Bin 0 -> 246 bytes target/classes/common/IRPCProcedures.class | Bin 0 -> 152 bytes target/classes/common/JsonCodec.class | Bin 0 -> 3538 bytes target/classes/common/ProcedureID.class | Bin 0 -> 986 bytes target/classes/common/Request.class | Bin 0 -> 1873 bytes target/classes/server/Server.class | Bin 0 -> 896 bytes target/classes/server/ServerStub$1.class | Bin 0 -> 651 bytes target/classes/server/ServerStub.class | Bin 0 -> 2040 bytes 30 files changed, 642 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 Rpc20.zip create mode 100644 pom.xml create mode 100644 src/main/java/client/Client.java create mode 100644 src/main/java/client/ClientStub.java create mode 100644 src/main/java/common/BinaryCodec.java create mode 100644 src/main/java/common/Codec.java create mode 100644 src/main/java/common/IRPCProcedures.java create mode 100644 src/main/java/common/JsonCodec.java create mode 100644 src/main/java/common/ProcedureID.java create mode 100644 src/main/java/common/Request.java create mode 100644 src/main/java/server/Server.java create mode 100644 src/main/java/server/ServerStub.java create mode 100644 target/classes/client/Client.class create mode 100644 target/classes/client/ClientStub.class create mode 100644 target/classes/common/BinaryCodec.class create mode 100644 target/classes/common/Codec.class create mode 100644 target/classes/common/IRPCProcedures.class create mode 100644 target/classes/common/JsonCodec.class create mode 100644 target/classes/common/ProcedureID.class create mode 100644 target/classes/common/Request.class create mode 100644 target/classes/server/Server.class create mode 100644 target/classes/server/ServerStub$1.class create mode 100644 target/classes/server/ServerStub.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..397a5c3 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c5a6386 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Rpc20.zip b/Rpc20.zip new file mode 100644 index 0000000000000000000000000000000000000000..441e17e80ce0277888d48dd0c9e1b45fd813cbd4 GIT binary patch literal 11685 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4930fd9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + ch.hevs.synd.sdi + Rpc20 + 1.0-SNAPSHOT + + + 15 + 15 + + + + + + com.fasterxml.jackson.core + jackson-core + 2.13.0 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.13.0 + + + + + \ No newline at end of file diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java new file mode 100644 index 0000000..7297fe3 --- /dev/null +++ b/src/main/java/client/Client.java @@ -0,0 +1,10 @@ +package client; + +public class Client { + private static final ClientStub client = new ClientStub(); + + public static void main(String[] args) { + System.out.println("15 + 4 = " + client.add(15, 4)); + System.out.println("15 - 4 = " + client.sub(15, 4)); + } +} diff --git a/src/main/java/client/ClientStub.java b/src/main/java/client/ClientStub.java new file mode 100644 index 0000000..0e03efa --- /dev/null +++ b/src/main/java/client/ClientStub.java @@ -0,0 +1,55 @@ +package client; + +import common.*; + +import java.io.IOException; +import java.net.Socket; + +public class ClientStub implements IRPCProcedures { + private final static String SERVER_ADDRESS = "localhost"; + private final static int RPC_PORT = 1234; + + @Override + public double add(double a, double b) { + return do_rpc(new Request(ProcedureID.addID, a, b)); + } + + @Override + public double sub(double a, double b) { + return do_rpc(new Request(ProcedureID.subID, a, b)); + } + + private double do_rpc(Request request) { + Socket socket = null; + Codec codec = null; + try { + socket = new Socket(SERVER_ADDRESS, RPC_PORT); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Server not available"); + System.exit(2); + } + try { + //codec = new JsonCodec(socket); + codec = new BinaryCodec(socket); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Streams broken"); + System.exit(2); + } + + codec.sendRequest(request); + + double response = codec.fetchResponse(); + + try { + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return response; + } +} + + diff --git a/src/main/java/common/BinaryCodec.java b/src/main/java/common/BinaryCodec.java new file mode 100644 index 0000000..47ab25c --- /dev/null +++ b/src/main/java/common/BinaryCodec.java @@ -0,0 +1,105 @@ +package common; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +public class BinaryCodec implements Codec { + + private InputStream _in; + private OutputStream _out; + + public BinaryCodec(InputStream in, OutputStream out) { + _in = in; + _out = out; + } + + public BinaryCodec(Socket socket) throws IOException { + this(socket.getInputStream(), socket.getOutputStream()); + + } + + private void writeLong(long value) throws IOException { + byte[] data = new byte[8]; + for (int i = 0; i < 8; ++i) { + data[i] = (byte)((value >> (8 * i)) & 0xFF); + } + _out.write(data,0, 8); + } + + public long readLong() throws IOException { + byte[] data = new byte[8]; + if (_in.read(data, 0 , 8) != 8) { + throw new IOException("Error reading long from input stream!"); + } + long value = 0; + for (int i = 0; i < 8; ++i) { + value |= ((long)data[i] & 0xFF) << (8 * i); + } + return value; + } + + private void writeDouble(double value) throws IOException { + writeLong(Double.doubleToLongBits(value)); + } + + private double readDouble() throws IOException { + return Double.longBitsToDouble(readLong()); + } + + @Override + public void sendRequest(Request request) { + try { + writeLong(request.getProcedure().ordinal()); + for (int i = 0; i < request.paramsSize(); i++) { + + } + writeDouble(request.getParam(0)); + writeDouble(request.getParam(1)); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Can not send request"); + System.exit(1); + } + } + + @Override + public void sendResponse(double response) { + try { + writeDouble(response); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Can not send params"); + System.exit(1); + } + } + + @Override + public Request fetchRequest() { + Request request = null; + try { + ProcedureID procedureID = ProcedureID.values()[(int)readLong()]; + request = new Request(procedureID, readDouble(), readDouble()); + + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Can not fetch request"); + System.exit(1); + } + return request; + } + + @Override + public double fetchResponse() { + double response = 0.0; + try { + response = readDouble(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Can not fetch request"); + System.exit(1); + } + return response; + } +} diff --git a/src/main/java/common/Codec.java b/src/main/java/common/Codec.java new file mode 100644 index 0000000..58fc783 --- /dev/null +++ b/src/main/java/common/Codec.java @@ -0,0 +1,11 @@ +package common; + +import java.util.Vector; + +public interface Codec { + public void sendRequest(Request request); + public void sendResponse(double response); + public Request fetchRequest(); + public double fetchResponse(); +} + diff --git a/src/main/java/common/IRPCProcedures.java b/src/main/java/common/IRPCProcedures.java new file mode 100644 index 0000000..3efd978 --- /dev/null +++ b/src/main/java/common/IRPCProcedures.java @@ -0,0 +1,6 @@ +package common; + +public interface IRPCProcedures { + double add(double a, double b); + double sub(double a, double b); +} diff --git a/src/main/java/common/JsonCodec.java b/src/main/java/common/JsonCodec.java new file mode 100644 index 0000000..85ff3c5 --- /dev/null +++ b/src/main/java/common/JsonCodec.java @@ -0,0 +1,87 @@ +package common; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +import java.io.*; +import java.lang.reflect.Array; +import java.net.Socket; +import java.util.Arrays; + +public class JsonCodec implements Codec { + + private InputStream _in; + private OutputStream _out; + private ObjectMapper _mapper; + + public JsonCodec(Socket socket) throws IOException { + this(socket.getInputStream(), socket.getOutputStream()); + } + + public JsonCodec(InputStream in, OutputStream out) { + _in = in; + _out = out; + _mapper = new ObjectMapper(); + _mapper.enable(SerializationFeature.INDENT_OUTPUT); + } + + @Override + public void sendRequest(Request request) { + try { + _out.write(_mapper.writeValueAsBytes(request)); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Error on request send"); + System.exit(1); + } + } + + @Override + public void sendResponse(double response) { + double[] responseArray = new double[1]; + responseArray[0] = response; + try { + _out.write(_mapper.writeValueAsBytes(responseArray)); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Error on params send"); + System.exit(1); + } + } + + @Override + public Request fetchRequest() { + Request request = null; + try { + byte[] rxbytes = new byte[1024]; + int length = _in.read(rxbytes); + System.out.println("The request: " + getString(rxbytes, length)); + request = _mapper.readValue(rxbytes, Request.class); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Error on request receive"); + System.exit(1); + } + return request; + } + + @Override + public double fetchResponse() { + try { + double[] responseArray = _mapper.readValue(_in, double[].class); + return responseArray[0]; + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Error on params receive"); + System.exit(1); + } + return 0.0; + } + + public static String getString(byte[] b, int length) { + byte[] bShort = Arrays.copyOf(b, length); + + return new String(bShort); + } +} diff --git a/src/main/java/common/ProcedureID.java b/src/main/java/common/ProcedureID.java new file mode 100644 index 0000000..4126b14 --- /dev/null +++ b/src/main/java/common/ProcedureID.java @@ -0,0 +1,6 @@ +package common; + +public enum ProcedureID { + addID, + subID +} \ No newline at end of file diff --git a/src/main/java/common/Request.java b/src/main/java/common/Request.java new file mode 100644 index 0000000..42316d7 --- /dev/null +++ b/src/main/java/common/Request.java @@ -0,0 +1,47 @@ +package common; + +import java.util.Vector; + +public class Request { + private ProcedureID procedure; + private Vector params; + + public Request() { + + } + + public Request(ProcedureID procedureID) { + procedure = procedureID; + params = new Vector<>(); + } + + public Request(ProcedureID procedureID, double a, double b) { + this(procedureID); + params.add(a); + params.add(b); + } + + public ProcedureID getProcedure() { return procedure; } + + public void setProcedureID(ProcedureID procedureID) { procedure = procedureID; } + + public Vector getParams() { + return params; + } + + public void setParams(Vector params) { + this.params = params; + } + + public void setParam(int i, double x) { + params.set(i, x); + } + + public double getParam(int i) { + return params.get(i); + } + + public int paramsSize() { + return params.size(); + } +} diff --git a/src/main/java/server/Server.java b/src/main/java/server/Server.java new file mode 100644 index 0000000..0ff22d3 --- /dev/null +++ b/src/main/java/server/Server.java @@ -0,0 +1,26 @@ +package server; + +import common.IRPCProcedures; + +import java.io.IOException; + +public class Server implements IRPCProcedures { + @Override + public double add(double a, double b) { + return a + b; + } + + @Override + public double sub(double a, double b) { + return a - b; + } + + public static void main(String[] args) { + Server implementation = new Server(); + try { + new ServerStub(implementation).run(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/server/ServerStub.java b/src/main/java/server/ServerStub.java new file mode 100644 index 0000000..b5ba28c --- /dev/null +++ b/src/main/java/server/ServerStub.java @@ -0,0 +1,61 @@ +package server; + +import common.*; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class ServerStub { + + private final static int RPC_PORT = 1234; + + private final IRPCProcedures implementation; + private ServerSocket serverSocket; + + public ServerStub(IRPCProcedures implementation) throws IOException { + this.implementation = implementation; + serverSocket = new ServerSocket(RPC_PORT); + } + + public void run() throws IOException { + + while (true) { + Codec codec = null; + Socket socket = serverSocket.accept(); + try { + //codec = new JsonCodec(socket); + codec = new BinaryCodec(socket); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("Codec can not get streams"); + System.exit(1); + } + + Request request = codec.fetchRequest(); + + ProcedureID procedureID = request.getProcedure(); + + double result = 0.0; + + switch (procedureID) { + case addID: + result = implementation.add(request.getParam(0), request.getParam(1)); + break; + + case subID: + result = implementation.sub(request.getParam(0), request.getParam(1)); + break; + + default: + System.out.println("Default"); + break; + } + + codec.sendResponse(result); + + socket.close(); + System.out.println("Client processing finished"); + } + } +} diff --git a/target/classes/client/Client.class b/target/classes/client/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..11eb0ad4d8040e8bb2ecb87bfd8ac7e6bc149fd5 GIT binary patch literal 1221 zcmaJ>>rN9v6#k|y-F8_h6p)LzBA_h@D+=Bg6xoW9)Jsx=G5(si6Ij^pHoH?2-o)1s z6G$-e0emRqnQkL(+PFVv&i#DnoH_gZ&($vg7WQ<+5Z90}Fn}b($T2_VrpvuU^JC>$ zR3$@l!|@#XiXoma9Hfy#T7zz25Js1I`7D&8PF8-CoF+=GK#p&I3LH6dk!2XFx{mOqX}2!Q6!8pWr7lfbHY-+gYlRTgm)shO2pvCT=l|_V^GO zUaK(-!W5!ZBPfJQR`*D z8C1oNqaY00t@*5|qG{yYzAr-=@Wy)~kNjGgN#dnWPiaHLrfM&}l=f5<~g);42@%K91|CqyuxkZ0<+!X2Ul2ZiLcWPQwl)CB>fXsDD-tY6Hl;4x)j#` zVV!GL0u27d)R#*v{lJh4#X1ltDBx3)#qbQz=~l(RAdABJYYgI!Gj1=7hH Al>h($ literal 0 HcmV?d00001 diff --git a/target/classes/client/ClientStub.class b/target/classes/client/ClientStub.class new file mode 100644 index 0000000000000000000000000000000000000000..6e4f04cca9cd717afb9ddbe0ba9fe7ab1e89353d GIT binary patch literal 1830 zcma)6+fo}x5IrNUv_dS#;$|+!#$X4Do9s9^0Xa?#fpr(w?+@f#^fqvHeE^;bf|)BPMXgat{t%C!LqS)nwIgK^(0*30tu^POUF;o z2d3cHN~BtLx4c73ptFh6;Fw8e70o^a{fc9xS}WzUI<5<}2N65cPZwNkU-~iJ5NN5m zmRZ?#t9~2<7*gDB3G^hF&g3chp6%>pa!QjC-WcrIZaTNR@WPUZzU?}34C9W0Pn59j zhdk~VeAC)r_e@K+Ac>TYF$3e6_(1o<%c?IAD7Raq`rY*_3A|PZ@T7T=iD8Ob7NqxF zdP9!u4>4LHk6Fyt3xHv-Iq=)9%D|&yn!qh z1dK*u1b_mqRq2!)$-6Y4MdkmEfp3u$Xxo;)wVRjKL)WRwpj5Leb59H`DfJ^(#jQ#m zD~z~tPcFYU-z?FpVz-blF66f!XS4Z*LVnx3t`8;hF1YxDZfr3>|(VH|85vQM)9**wDJ zUs;xVm=(+!QO_#mTBg#G^jmVkDj literal 0 HcmV?d00001 diff --git a/target/classes/common/BinaryCodec.class b/target/classes/common/BinaryCodec.class new file mode 100644 index 0000000000000000000000000000000000000000..db0a23daf1cacbccd9fb5ac9749d450c17baceb8 GIT binary patch literal 3256 zcmZu!X?Gjd8Gi0)oEga@NAZ%y*_1SkEy*@)_3 zwt#HzvEXR;FeV&KVv4>6xA>e7TH(ZeDuo$5X<^nu5hqy~VNss*p09fwtQ3byKU)pT z-g3Q4h+CQQ@JO^;oMOI9IA!6qgEKhWF74P6svT4*pu4J@p(t_BIhd20+p>(Yvw*C{&t#w}l&uexO~ ziEqHQu;ic&CO+1wbJsU&9wQ_I>8Ez%oozbMjc4N`>u=JnWGev^?p2mq4O*WRF2T2O z*})Y_d{k{QYZBLBRx2rjSaVQ8KtkR%pYep(f{o{CdY}8IAfoDqgBt3bBv;*4W<+=D z`3I-K#tROv;W`DCI%tW*O3+z;NviXk3OfcKWIja&ZG4*&w18anYUN8Uq87fxS_m^A z&MH&x)VkzXywmlyC9gW~>N@T&1!Z@2!L9o89xj@-OFrTEwt~mT-k5?RW3M;toA#t) z+mQN3IJLGkXGUzBRHJ64bLI0_p^9MKG>qIM@K6h#qDmlR@=IB zz14d~0*%CrH5TKiLq{#gskxwDEqgP*9x5@Rhh-XatlIo=DZI?9A>SfSTSGo8yr;O% zsm<#vd|Tvtg7?k2J5ag&N3e2*kC6UQ8+@17ZkW8LdF?`yF1qOCRjy>4X1IZye4_)r z#xP1hm3c`&~|iDPD;nXzx9f2hygo3Z=MOE2|e&&#*ooWEhJ_wW5H z_ZOsx5*fRJtRP50X!g?wu$_K(kV-%4?Z6@I!VxMZbaRYrV-J3SA8J8HBW$Di5q_-6 z4&f(wgZ|#+c?ZVlur2&l{f8dfxRs3Y5cj7c?rFhYA}lMfVI9iY?;`y%3X9#tcks}s z$?=HO&TPKVJbF|3XlB=68P}x#nf)V!HmU3

?_e%b*YYv6o-heK?3b2_5Hs5(5#X z1Ke#48JbcCiO;Z?ls<=PlGdIWEkkB@NNb!pq@`@Y&sXJl2QQZ5(taz1n*S4B7;K+xg!K?n z0B5;+j{44VZ;`uCvr-qR^D``~XQ}gZk**H5;CFbJ=l8{QJsP4nc($!;4~%GfQ=l0rNotqi6-vx@%#|rsep%b;Q>69aYS_CW;)ZfP3Q5v z-2sFcTF?ltP(xTL2b_Nzk27#=^vPAuy z#JqHU|D>$ciurYv)X9v+h84i#*11A6kHz3CV literal 0 HcmV?d00001 diff --git a/target/classes/common/JsonCodec.class b/target/classes/common/JsonCodec.class new file mode 100644 index 0000000000000000000000000000000000000000..3b0da4f3cc108a086b9f02c5699f4c1b40cd8d7e GIT binary patch literal 3538 zcmbVO`%@d&89i6XtdQ4W1O^+&1jk?tfl+KHO+b!a^KdOkfMWr!OIy51*JzEjtE^Tw zr0+KAGq0wv^!;x7n#p5o>`5}6{M^5ye@WYOcUNMWGWN8Zkyd;6e&;*i`5t@!@vry) z4j_ZS#t}h_hNzA`Xcg$VW!yH>mUPp3yRa@@f%Y}&X02-7&AW~?DgwR9;heY2w9}yn z8HE(n(S|r-Xf$7ULskbvR^cZ!)3HxOyN(X*7ua90D;3*HU#{8KlwFhsf!4F8WxD4C z#*(`_ZZ7V?9bSqffi4Z*3i$w$JTQrVYn&LPJu=Fj4|%9%7r9j%k$57Yx_5t&7rd z>y8xImz|rQnOj(yUtGAdxFGQ4!zkJFX;V0hZV5k7zNpe^Z2-i3pyq- zwWBQan=BW0Sc_L(+husg2T<*oiD8BnI^#IDGhkZ-j(ol@YwkczTE#d%flC^)Ixgec z5U-FqOUq+ZR%IU6fz54NYZ=uv=P|2e4)ZK?xnZ)*qsi>>QVh>gl&0UR;TV-#;5Ls1 z4U0OKa4qCE)I7u>`C=ejR<-E3xgK020)PgB<)t65dYe7d5tkE{b)T&i=6VB$fe%%l4NXG~si(^-&- zz*ihqJg>pgQ3F%w&%C;8meUs;$JnGytp&TfIe(Lt;HkYlso{2GV@Rhs>ex_|^Jxt) z2J%fGFbA+2{PO6sZg`hoff2wLNwSk zOgRv}-sN-&c{|| ziY!l3gR->N+>(IE5-+fC_~5IHUc@T5t>#O%!(_+vcHJq+i>4a2?adeHn3_)vY|^&f zn(G+VS?QMSVy&YUzl`Ho__c=LsOI{uz~J^P(zI^d>oVxO8eL1v0=(TYB1rSq4xt!;mXCMBakuQ{F zV=hh%2uh!|Ea`atBx@S}C@}P2aqdQ6!=DBEAH0?F`?2CEhgt#xn`q%dh{p*It%y1< zcvrsGdDZy51E1si=Xp2d?F9CvMz$dM)$U>MyWaLM@K>FufG)yzjzvGz z=1#VpxY{6jvO%(EB6=tq(7Y0&86%CpCe7m%3P=%c1Th|XdU2Xh$C&ywNk7h`*eR}_ z@#v~ukD$||8&$rWbjR>2UL&(8kzR+%uoUrbME*@M9?*4uOAw4g71?+3Mi9k6xl4>WUureP2AYR>PNVd3#Z^_5ZlN*1dWjP>1J?a z*h}!IxH`_@CP+QQpw4p71@3x=VV&dC^Xf>0DOP~W$rF?{h7TOHzZU$|v;G-=&TEX0e!=hW@CV+-`R^_K34g(%{{S7%T}J=_ literal 0 HcmV?d00001 diff --git a/target/classes/common/ProcedureID.class b/target/classes/common/ProcedureID.class new file mode 100644 index 0000000000000000000000000000000000000000..f478e2e0ff42e7b631bbc49d28a788396e8e4022 GIT binary patch literal 986 zcmZuvZBNrs6n^g7u3IhJn1jj07hc462y;e0bs-SIWXS?1)g{DFT~}vG*CyS{@6wS7 z(P;SWk20Lw)ljpwNpH`&&vVXmUjF?3@f(1FH!?B|Wjh!S1HbV;3~Z+#g--i84+c?% zge-$(_51B(hDv7^XK-LnMLq_OqTZDHK!u7026?l4*!g&3GAw@&ljmSP`y z)@Wp;9OgK5{eh9rzyrkbYbqXNl_A@5eRsUiu$&H+Fxz@J2T7sAYdPfkxu#+r8@$|D z!-%1(>2nLF(ElLfQP8JaiyhZ@PNQMZ2|rjpk38C(ocg@((d0UTZFyZQbU8KQi@r6a zFy+~rX{O^ZF3HQA?!dRkG-?Jx)4MdomhB}qZ>5O5Gp%{K_YDTc45H9>-nm?LDYZSj zd^QJ7>P&^!OgLEKiv-X~djgbdd^_kyB6|}XgnL2OI-UGcCQ!bkaEszsvKY4Ln~m=T z!dLM!!M{Z&_9|sozrn*>Fpkgshu6rXPEpWNkMC*1gyI>S5a2&vW z8QWYsUd5Q5lENpR2+<*u7g&^jft?Ez2d0;g#}m&`R;IUZ#bxbm70oM>#AaDcC10Ea4syj}#lltC%-ogCvfYX+F&t7$&B7|) zQCR3{`5n=&JJJ-C>lW&`p^zH;PlN3iTe0o$4%~@u#g%|P=HgmRPhd%7y+MSHVUGxf zwm`^i7ff)nhEJSnAYAT$b*`;RF=_n|d zf5xaC1&c03!=g~Joe(+NJ~Oi3(ZCXIm1heQfT^9#>Wng!l0Qp9G-7s{nk5q>e2MKyCE}GPOUk`28UYFHk%JTp|=WuqosTTR;g# z4O|J54KPr~hnh?%J~9+zQlyz(t*suSRC|u1{Sv1RaPE<;ms959IN3=;lyHKO=c!hz zsA&<^h^%VJ2#q`ZCQ8j!tZ|hh^~YE@0_wa6COt>ycLpUOCW(jO5uIhwCy_yS7%jkQ zZO)O%Ap1)n=9l7u+K4Z2R9T!nNF5=t_5jUBXz~>aXfu;f3;yn_h+mqC#1pQv2 zV;A2bC>Wx<#0+L3&Cm5MVh1euxVn!Ayo%H<`X}wqOMlJ=&02YMRC>U6S-ygr?E)Lj z=&1ZWTKIxkviGI#i$WV;8T1WPLqVe-;PT&CK7jKZ!{dE%VuchU=z@V(c!(PYP|6Up Xc>z4YwP(kWuEorqH%JPbI%?}b>qJT) literal 0 HcmV?d00001 diff --git a/target/classes/server/Server.class b/target/classes/server/Server.class new file mode 100644 index 0000000000000000000000000000000000000000..d80454566735a996ad83e157d38cc7ff7e6493c9 GIT binary patch literal 896 zcma)4T~8BH5IwiuvSle0TG~QI#ZS6`><_5%L8=K!5n@Rb;?wQ+rY?4Oo9!;~U-&b8 zG`!G65`Ta{N0Kx{7Fc-h1z!9@AltCJCh`KyV-;Ph$myicf~gsn1lH!>J8{ypU}0HPuL#r|Z8!A& zFmR6Eo*te?p{x2yq{dCVtJ78sSknr!Q4*La3zSnSUg#X1y!z;>QS60*g%TgoF)~hQ4PSbJK(+C%{b!J!m_i3^lbNhonTF;YBex-= z0gIMzfeNg6{%ELt6~t1{fjdYWKbE6ZvI$$j>V!$;s@Ia;oxg6_~3rU}@>UET!l;XbVfza&|X-q^9-FZ6$7trWYB ztd7sH`m{|kn%lrbp0YeYx{Yt}FJJLL`4;gQPiFc)kzd!}x`BBfgc5Ph3CabjHJrh$Y)p-{IZ7b4C@T>2p_k`&3P9C})>SB+E0TdnQzlQ;ts zLJ0K-@S_m3rc#B9a_9zGCiOwe^IYcMHVt8uhRVEw8H34)d4w&Bj|nYMrwkZ= z2fO;|e1-kRd~4sZZk>FB^|pe2f{hA(rcSldLm&4rzz+5(*71ZYG^;uzY*SvN^^}$i h>w`@!N3 literal 0 HcmV?d00001 diff --git a/target/classes/server/ServerStub.class b/target/classes/server/ServerStub.class new file mode 100644 index 0000000000000000000000000000000000000000..c4f73a48b149fd8d90a174fc874376268c2cf091 GIT binary patch literal 2040 zcmZuyTXz#x6#h;p>7?lt+LYe7HI*vqH7XT^R8$&}XnL`!5d_8Q8&?gr7oC zTNT)2SE^-MkxpO+w(AHCx7%xAANmB0y3smpj-v)r7~4U3;kF;h3VC*G^t7*TkibiI08g5gObinOL!o;~%XE^C z8zk3dkn{s}?8h;MX&q?;FXE*Z-&!C9^w6U+Gt<|ID$I8wpq=&1STRlyj~SQ=$(Oh6 zpcBV&LdUBHPT~~#Z%`F_!R?w1tc_)Py(WG7ogl*vg@%lon8j;4P8)a~Z?Hgi9ut8P zY}JK8|2D#wG?&eE;0)$;WDT6fImWiD^hO!+q0z!ko9@h;)zP|{(H0DWwoAD<&LgMe zZ3FKhzn%CUYP#!{SP12?=y_un3kDXkBoI@+nx4r#slv>5Vi^S;D+b;}k&HHC+ga*_ zF-s+ZXeyhnU%6o5qSDv=+G-4!n3SwsGi&9L>kkclgezg8JEdjmS6#=K%3f9_$Hb}* z%RnituI<`yv_sS?yS|KJO<@0A*=8FitE%UGpV>{Wv6uY~Nnc`Y#w$yU%PRsRC(t!V zBZ27zMYCL!8W4FxfK)S;JL6%I&>fY3)_2}^3>1=29-pZf`2I6orE4)MAS09CfhAO8c1P4v${#{P?w4{djNZqaLy=9qHGNOn0`h!R+=9=+#(IXx`jobb`6;T-Kf=3FoQ&SZ zk^joyugg1?!4GI~Vles$mo-do;$tO~l-+%Hf#7il+s{xmC@P8}k%Kfm#FK+O8{z38 zQgRpvsC5KM9OZkOQ*ef>6Bxr~OpuaE1W4mMj@IvS3_tSZCl174a0f%rQu87YQtCfnqQT^Gx&z9c(~%CJN7S)XVKXJ literal 0 HcmV?d00001