From a3e7245b82137320a3bc8cbbb846c714f91d0424 Mon Sep 17 00:00:00 2001 From: Brett Laptop Date: Sat, 18 Nov 2023 20:09:49 -0500 Subject: [PATCH] client shit --- .../ChunkedCompressedChecksumFileWriter.java | 66 +++++++++++++-- src/main/java/client/Client.java | 78 +++++++++++++----- .../ChunkedCompressedChecksumFileReader.java | 21 +++-- src/main/java/server/Connection.java | 2 + src/main/java/server/Server.java | 4 +- src/main/java/shared/FileUtil.java | 14 +++- src/main/java/shared/OTelUtils.java | 19 ++++- .../ChunkedCompressedChecksumFileWriter.class | Bin 3070 -> 5611 bytes target/classes/client/Client.class | Bin 3502 -> 6801 bytes .../ChunkedCompressedChecksumFileReader.class | Bin 6071 -> 6235 bytes target/classes/server/Connection.class | Bin 4325 -> 4558 bytes target/classes/server/Server.class | Bin 3526 -> 3665 bytes target/classes/shared/FileUtil$COMMAND.class | Bin 1186 -> 1186 bytes .../FileUtil$InvalidUsageException.class | Bin 472 -> 472 bytes target/classes/shared/FileUtil.class | Bin 6061 -> 6504 bytes .../shared/OTelUtils$SexyContainer.class | Bin 0 -> 941 bytes target/classes/shared/OTelUtils.class | Bin 7372 -> 7796 bytes .../compile/default-compile/createdFiles.lst | 11 +-- 18 files changed, 170 insertions(+), 45 deletions(-) create mode 100644 target/classes/shared/OTelUtils$SexyContainer.class diff --git a/src/main/java/client/ChunkedCompressedChecksumFileWriter.java b/src/main/java/client/ChunkedCompressedChecksumFileWriter.java index c16eecc..02a5da8 100644 --- a/src/main/java/client/ChunkedCompressedChecksumFileWriter.java +++ b/src/main/java/client/ChunkedCompressedChecksumFileWriter.java @@ -1,5 +1,9 @@ package client; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Scope; import net.jpountz.xxhash.StreamingXXHash64; import shared.ArrayData; import shared.FileUtil; @@ -16,7 +20,14 @@ public class ChunkedCompressedChecksumFileWriter { private final int bufferSize; private final long seed; - public ChunkedCompressedChecksumFileWriter(DataOutputStream networkStreamWriter, DataInputStream fileInputReader, int bufferSize, long seed){ + private Span currentSpan = null; + private Scope currentScope = null; + + private long count = 0; + private long uncompressed_bytes = 0; + private long compressed_bytes = 0; + + public ChunkedCompressedChecksumFileWriter(DataOutputStream networkStreamWriter, DataInputStream fileInputReader, int bufferSize, long seed) { this.networkStreamWriter = networkStreamWriter; this.streamHash = FileUtil.XX_HASH_FACTORY.newStreamingHash64(seed); this.fileInputReader = fileInputReader; @@ -24,19 +35,45 @@ public class ChunkedCompressedChecksumFileWriter { this.seed = seed; } - public void processChunk() throws IOException { + public void processChunk(Tracer trace) throws IOException { + if (++count >= FileUtil.MAX_COUNT) { + currentSpan.addEvent("--{End Write}--"); + currentSpan.setStatus(StatusCode.OK); + currentScope.close(); + currentSpan.end(); + currentSpan = null; + currentScope = null; + count = 0; + } + if (currentSpan == null) { + currentSpan = trace.spanBuilder("Chunk Write").startSpan(); + currentScope = currentSpan.makeCurrent(); + } // read / write files in chunks + currentSpan.addEvent("--{Begin Write}--"); byte[] uncompressed = readSome(); if (uncompressed.length == 0) return; // create a checksum for this chunk + update the overall checksum + currentSpan.addEvent("Hash"); long hash = hash(uncompressed); // apply compression + currentSpan.addEvent("Compress"); ArrayData compressed = compress(uncompressed); + // track data + currentSpan.addEvent("Attribute: Write Uncompressed = " + uncompressed.length); + currentSpan.addEvent("Attribute: Write Compressed = " + compressed.getActualLength()); + currentSpan.addEvent("Attribute: Compression Ratio = " + ((double)uncompressed.length / (double)compressed.getActualLength())); + currentSpan.addEvent("Attribute: Write Hash = " + hash); + uncompressed_bytes += uncompressed.length; + compressed_bytes += compressed.getActualLength(); + count++; + // write data + currentSpan.addEvent("Write"); writeHeader(uncompressed.length, compressed.getActualLength(), hash); networkStreamWriter.write(compressed.getData(), 0, compressed.getActualLength()); networkStreamWriter.flush(); @@ -46,6 +83,11 @@ public class ChunkedCompressedChecksumFileWriter { networkStreamWriter.writeInt(0); networkStreamWriter.writeLong(streamHash.getValue()); networkStreamWriter.flush(); + if (currentSpan != null) { + currentSpan.addEvent("--{End Read}--"); + currentScope.close(); + currentSpan.end(); + } } private void writeHeader(int uncompressed, int compressed, long hash) throws IOException { @@ -58,21 +100,35 @@ public class ChunkedCompressedChecksumFileWriter { byte[] readBytes = new byte[Integer.min(fileInputReader.available(), bufferSize)]; int totalRead = fileInputReader.read(readBytes); - assert(readBytes.length == totalRead); + assert (readBytes.length == totalRead); return readBytes; } - private long hash(byte[] input){ + private long hash(byte[] input) { streamHash.update(input, 0, input.length); return FileUtil.HASH_64.hash(input, 0, input.length, seed); } - private ArrayData compress(byte[] input){ + private ArrayData compress(byte[] input) { int maxCompressedLength = FileUtil.COMPRESSOR.maxCompressedLength(input.length); byte[] compressedBytes = new byte[maxCompressedLength]; int compressedLength = FileUtil.COMPRESSOR.compress(input, 0, input.length, compressedBytes, 0, maxCompressedLength); return new ArrayData(compressedBytes, compressedLength); } + public long getCompressedBytes() { + return compressed_bytes; + } + + public long getUncompressedBytes() { + return uncompressed_bytes; + } + + public double getRatio() { + if (compressed_bytes == 0) + return 0; + return (double) uncompressed_bytes / (double) compressed_bytes; + } + } diff --git a/src/main/java/client/Client.java b/src/main/java/client/Client.java index 6b66fe5..2c7fa5d 100644 --- a/src/main/java/client/Client.java +++ b/src/main/java/client/Client.java @@ -1,8 +1,14 @@ package client; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Scope; import server.Server; import shared.ExceptionLogger; import shared.FileUtil; +import shared.OTelUtils; import java.io.*; import java.net.Socket; @@ -13,50 +19,84 @@ public class Client { private final Socket serverConnection; private final DataOutputStream out; private final DataInputStream in; + private OTelUtils.SexyContainer ot = OTelUtils.create("CumClient"); // Computational Unit Machine Client + private final Tracer tracer; + private final Scope sc; + private final Span s; public Client(String address, int port) throws IOException { serverConnection = new Socket(address, port); out = new DataOutputStream(new BufferedOutputStream(serverConnection.getOutputStream())); in = new DataInputStream(new BufferedInputStream(serverConnection.getInputStream())); + tracer = ot.ot.getTracer("A Client", "1.33.7"); + s = tracer.spanBuilder("Client Connection").setAttribute("Server Address", address).setAttribute("Server Port", port).startSpan(); + sc = s.makeCurrent(); } - public Client sendFile(String path){ - System.out.println("Sending path " + path); - FileUtil.write(path, out); - return this; - } - - public Client sendDir(String path){ - File p = new File(path); - ArrayDeque filesToCheck = new ArrayDeque<>(Arrays.asList(Objects.requireNonNull(p.listFiles()))); - while (!filesToCheck.isEmpty()) { - File f = filesToCheck.remove(); - if (f.isDirectory()){ - filesToCheck.add(f); - } else - sendFile(f.getPath()); + public Client sendFile(String path) { + Span sp = tracer.spanBuilder("Send File").setAttribute("File", path).startSpan(); + try (Scope seethe = sp.makeCurrent()) { + System.out.println("Sending path " + path); + FileUtil.write(path, out, tracer, sp); + System.out.println("Sent path " + path); + } finally { + sp.end(); } + ot.tp.forceFlush(); + ot.bp.forceFlush(); + ot.ox.flush(); return this; } - public void close(){ + public Client sendDir(String path) { + Span sd = tracer.spanBuilder("Send Directory").setAttribute("Directory", path).startSpan(); + try (Scope cope = sd.makeCurrent()) { + File p = new File(path); + ArrayDeque filesToCheck = new ArrayDeque<>(Arrays.asList(Objects.requireNonNull(p.listFiles()))); + while (!filesToCheck.isEmpty()) { + File f = filesToCheck.remove(); + System.out.println("Processing file " + f.getPath()); + if (f.isDirectory()) + filesToCheck.addAll(Arrays.asList(Objects.requireNonNull(f.listFiles()))); + else + sendFile(f.getPath()); + } + } finally { + sd.setStatus(StatusCode.OK); + sd.end(); + } + System.out.println("Sent directory " + path); + return this; + } + + public Client close() { try { + sc.close(); + s.setStatus(StatusCode.OK); + s.end(); out.writeByte(FileUtil.COMMAND.CLOSE.type); out.flush(); in.close(); out.close(); serverConnection.close(); - } catch (Exception e){ + } catch (Exception e) { ExceptionLogger.log(e); } System.out.println("Disconnected!"); + return this; + } + + public OTelUtils.SexyContainer getContainer() { + return ot; } public static void main(String[] args) { try { - new Client("localhost", Server.SERVER_PORT).sendDir("in/").close(); + OTelUtils.SexyContainer con = new Client("localhost", Server.SERVER_PORT).sendDir("in/").close().getContainer(); + con.tp.forceFlush(); + con.tp.shutdown(); //new Client("localhost", Server.SERVER_PORT).sendFile("in/ihaveafile.txt").close(); - } catch (Exception e){ + } catch (Exception e) { ExceptionLogger.log(e); } } diff --git a/src/main/java/server/ChunkedCompressedChecksumFileReader.java b/src/main/java/server/ChunkedCompressedChecksumFileReader.java index 58e0d99..d9eb0c4 100644 --- a/src/main/java/server/ChunkedCompressedChecksumFileReader.java +++ b/src/main/java/server/ChunkedCompressedChecksumFileReader.java @@ -1,6 +1,7 @@ package server; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import net.jpountz.xxhash.StreamingXXHash64; @@ -19,9 +20,8 @@ public class ChunkedCompressedChecksumFileReader { private Span currentSpan = null; private Scope currentScope = null; - private long count = 0; - private static final long MAX_COUNT = 50; + private long count = 0; private long uncompressed_bytes = 0; private long compressed_bytes = 0; @@ -32,16 +32,17 @@ public class ChunkedCompressedChecksumFileReader { this.seed = seed; } - public FileHeader readChunk(Tracer trace, Span sp) throws IOException { - if (++count >= MAX_COUNT) { + public FileHeader readChunk(Tracer trace) throws IOException { + if (++count >= FileUtil.MAX_COUNT) { currentSpan.addEvent("--{End Read}--"); + currentSpan.setStatus(StatusCode.OK); currentScope.close(); currentSpan.end(); currentSpan = null; currentScope = null; + count = 0; } if (currentSpan == null) { - count = 0; currentSpan = trace.spanBuilder("Chunk Read").startSpan(); currentScope = currentSpan.makeCurrent(); } @@ -72,9 +73,11 @@ public class ChunkedCompressedChecksumFileReader { throw new RuntimeException("Stream total hash doesn't match the client's sent hash!"); fileOutputWriter.flush(); fileOutputWriter.close(); - currentSpan.addEvent("--{End Read}--"); - currentScope.close(); - currentSpan.end(); + if (currentSpan != null) { + currentSpan.addEvent("--{End Read}--"); + currentScope.close(); + currentSpan.end(); + } } public long getCompressedBytes(){ @@ -86,6 +89,8 @@ public class ChunkedCompressedChecksumFileReader { } public double getRatio(){ + if (compressed_bytes == 0) + return 0; return (double) uncompressed_bytes / (double) compressed_bytes; } diff --git a/src/main/java/server/Connection.java b/src/main/java/server/Connection.java index 06d4172..6d8d029 100644 --- a/src/main/java/server/Connection.java +++ b/src/main/java/server/Connection.java @@ -3,6 +3,7 @@ package server; import client.Client; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; @@ -73,6 +74,7 @@ public class Connection implements Runnable { } } } finally { + fileSend.setStatus(StatusCode.OK); fileSend.end(); } try { diff --git a/src/main/java/server/Server.java b/src/main/java/server/Server.java index 1a85bdf..5c965aa 100644 --- a/src/main/java/server/Server.java +++ b/src/main/java/server/Server.java @@ -24,10 +24,10 @@ public class Server { public static volatile boolean running = true; - private static final OpenTelemetry ot = OTelUtils.create("CumServer"); + private static final OTelUtils.SexyContainer ot = OTelUtils.create("CumServer"); public Server() { - Tracer main = ot.getTracer("Main Server", "0.69"); + Tracer main = ot.ot.getTracer("Main Server", "0.69"); try { System.out.println("Starting server"); ServerSocket serverSocket = new ServerSocket(SERVER_PORT); diff --git a/src/main/java/shared/FileUtil.java b/src/main/java/shared/FileUtil.java index e0523c0..49412ae 100644 --- a/src/main/java/shared/FileUtil.java +++ b/src/main/java/shared/FileUtil.java @@ -2,6 +2,7 @@ package shared; import client.ChunkedCompressedChecksumFileWriter; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import net.jpountz.lz4.LZ4Compressor; @@ -21,6 +22,7 @@ public class FileUtil { // do not change it breaks stuff protected static final int READER_SIZE = 65000; public static final long SEED = 691; + public static final long MAX_COUNT = 128; private static final LZ4Factory LZ_FACTORY = LZ4Factory.fastestInstance(); public static final LZ4Compressor COMPRESSOR = LZ_FACTORY.highCompressor(); @@ -39,7 +41,7 @@ public class FileUtil { } } - public static void write(String path, DataOutputStream dataOut) { + public static void write(String path, DataOutputStream dataOut, Tracer trace, Span sp) { validatePath(path); String relative_path = path.replace(System.getProperty("user.dir"), ""); try { @@ -51,7 +53,12 @@ public class FileUtil { ChunkedCompressedChecksumFileWriter writer = new ChunkedCompressedChecksumFileWriter(dataOut, fileReader, FileUtil.READER_SIZE, FileUtil.SEED); while (fileReader.available() > 0) - writer.processChunk(); + writer.processChunk(trace); + + sp.setAttribute("Data Read Uncompressed Bytes", writer.getUncompressedBytes()); + sp.setAttribute("Data Read Compressed Bytes", writer.getCompressedBytes()); + sp.setAttribute("Data Compression Ratio", writer.getRatio()); + sp.setStatus(StatusCode.OK); writer.close(); fileReader.close(); @@ -72,7 +79,7 @@ public class FileUtil { // ugh I want while(reader.readChunk().getUncompressed()); but it makes warnings!!! while (true) { - if (reader.readChunk(trace, sp).getUncompressed() == 0) { + if (reader.readChunk(trace).getUncompressed() == 0) { sp.addEvent("Chunk Read"); break; } @@ -80,6 +87,7 @@ public class FileUtil { sp.setAttribute("Data Read Uncompressed Bytes", reader.getUncompressedBytes()); sp.setAttribute("Data Read Compressed Bytes", reader.getCompressedBytes()); sp.setAttribute("Data Compression Ratio", reader.getRatio()); + sp.setStatus(StatusCode.OK); reader.close(); System.out.println("Writing " + path + " complete"); sp.addEvent("File Written"); diff --git a/src/main/java/shared/OTelUtils.java b/src/main/java/shared/OTelUtils.java index f7cfcb2..2e7c35e 100644 --- a/src/main/java/shared/OTelUtils.java +++ b/src/main/java/shared/OTelUtils.java @@ -23,6 +23,19 @@ import io.opentelemetry.semconv.ResourceAttributes; public class OTelUtils { + public static class SexyContainer { + public OpenTelemetry ot; + public SdkTracerProvider tp; + public BatchSpanProcessor bp; + public SpanExporter ox; + public SexyContainer(OpenTelemetry ot, SdkTracerProvider tp, BatchSpanProcessor bp, SpanExporter ox){ + this.ot = ot; + this.tp = tp; + this.bp = bp; + this.ox = ox; + } + } + public static OpenTelemetry createLogger(){ Resource resource = Resource.getDefault().toBuilder().put(ResourceAttributes.SERVICE_NAME, "cum").put(ResourceAttributes.SERVICE_VERSION, "0.1.0").build(); @@ -39,7 +52,7 @@ public class OTelUtils { .buildAndRegisterGlobal(); } - public static OpenTelemetry create(String name){ + public static SexyContainer create(String name){ Resource resource = Resource.getDefault().toBuilder().put(ResourceAttributes.SERVICE_NAME.getKey(), name).put(ResourceAttributes.SERVICE_VERSION.getKey(), "1.3.37").build(); SpanExporter otlpExporter = OtlpGrpcSpanExporter.builder() @@ -57,12 +70,12 @@ public class OTelUtils { .setResource(resource) .build(); - return OpenTelemetrySdk.builder() + return new SexyContainer(OpenTelemetrySdk.builder() .setTracerProvider(sdkTracerProvider) .setMeterProvider(createLoggingMeter(resource)) .setLoggerProvider(createLoggerProvider(resource)) .setPropagators(ContextPropagators.create(TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()))) - .buildAndRegisterGlobal(); + .buildAndRegisterGlobal(), sdkTracerProvider, batchSpanProcessor, otlpExporter); } private static SdkMeterProvider createLoggingMeter(Resource resource){ diff --git a/target/classes/client/ChunkedCompressedChecksumFileWriter.class b/target/classes/client/ChunkedCompressedChecksumFileWriter.class index 2cb0de65f93079a4d9d6166ebc093e06f773f565..12bf04bf677bac3373327cc04b1745f6034de1c6 100644 GIT binary patch literal 5611 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 F{{=A1H)Jx?i;oi zr<=Pq-<@7}rdk1ah}s=M;f z`3nG6;-@j4J4=Oj?1ovdLdTH}J%dGD=Y_TodtWXL$WxKeQ2--@!50kpLveR=S_n6@ zvqIrvb6Ans!^*WPW^ojwL>y&qtr?{8G*t9Cw|@?14TaaGr#cemFa2)jE%k>Pl6JnHujHQ4)fsDM-Eb8{@hVsTBG zr(c3P6-#CQW#W2{JLgu8<){}HwN<|YD^=XaaXT8t4z*t2gk}{j9Ia>*$5ktH%WB2x ztQ=uf%=7JiDpoV_o6v26pkIe}tdXo5Rdg|!1v8p;(zuqR2kV5Yuh6eYuZj&E8__4~ z^y_SQGURWWDL`gv&|x#SsMyMJ7w#6v^ljQsY?Eod;sh_Pq`Erc}r!+k35=Xd}Qir);4iG6s8<6%6)poxz} z2$D7FV8UY@kK+l3+&$4i+}|`3Cy%CzMn*cH;&>W44B0z^!?6K*U85ZP(-vPa9HV}k zFsg%!Q5DZK6sCKfCfT~z=a0k#;gAjoAymAO&G8~$68rNSw&4|;z?MMF7Y>D}5`TZW z7Ke#JFzoXN2g0$qidQKj=8x|7N8P`v=Y)!-)9}q_hn#J!0O+|*@xYxI<+Z);7-5!)Jpsz@r$}190#tJcL z?99hy9lpSqD!!6)_qDieyi|)T40*i-5D4wG$$U0ObJaoQqs>8YEas09f##m>?p14B zRD8!!DQ*}m={5c!+=Z@$0SZ0QENT_KJ=&S%+eu5Bd6La8gX3DVRNubKpr>Qkb2>oC%bXqk?G|qWI072%@?hb>U#3X(ky3D z>pYKJfFv56#I9@-s~o4vqY!oi$V&qhgQJ9CXQx3e(?@4OEjW_~W%5EZ0DsUqNxNqX z?H*?e9o~I1CQC zy*G*BP2>OmlBT9fw`BoxDSsKQb7{4ql5VDk#(Wv(p^>yTSb%OUOf#+{E;X>?EIy=W z5UUyPJsIw~Xu~=3DwJz6Ca4`*NKyS%ILnwO$@CFfilF%$Wh&ZLbpC~M+Wd)Jg~I4{ zWvU;iJhHv@vZH4)at?_k9+gTGPm-uf;+bjfSrRl6&y7Rd<($MA-G}LAx{EWEiTZCx zH4YH2oC61Rv{utIanV)OpcHN@cM-)bA?sqY*3w!>v%hranp{-wc}&SxTELmHpVDOj@nO;kzaK!X_5^p4N>?Xl9F`7cl46o_=Tu!!?WNpAK ztRQZ;&2X6YKMq!0z^4R};Xwa+;*f=lWK!@MJ}0RqHkau823IYln#i#aO}N%rf^YFX HeniQCb9Zo; diff --git a/target/classes/server/ChunkedCompressedChecksumFileReader.class b/target/classes/server/ChunkedCompressedChecksumFileReader.class index 2ef71301c35a9372243fa04e8b9bb49b9727aed3..70c0d61ea2c9ef906b55cec26cac87c5a690d37f 100644 GIT binary patch delta 2722 zcmZ8j3w%>&75|@`o808)OVWnEAGC$gXA(M!Kw*s9^7}Cg6zy;WH#P$eP@zp}6WPNp ztqM$>I{6SC+nDo(uL%@Lm%_jYZf?4V&Ih_V=X}oBhHqUrJ>N~5X8zjVd%p9Xd(Quy z^FQC$iTTg9noqnjc^<%WYCdVM)M-?%*Y_2;unF%paJ|3{*i4uwFWajMTwZXhA>9_%61 zv${rJvM+bsB5*5ila-Fej@t$9KvHgWG`Pp`J_GL;_yG3G1CH>LG3*z(6MG4s?a_Ew zY+z_OIx-UF=m!V|q0nue(e3?%7J%DBAwL)CE`bl@Bl1X!w{~ACy-Z6?4XL zNZ{i*OfcBl)sc}MoJwO;w;wiqQkmT&2aJl+d$}|!quP~`c*KMg_X`}w1M;ZRQ2ijm zw=%jliz8?88G+B@bMhsl#ea;TE7$77FA97KUzRn_z=DSe_UnfG<53gyaa`a8PO@f? z(lDIH>pNGkZo1aQDV#QNMj(a5GU06SK8&=1NrAHpbwCzs0r`~ELyySkoi%hpPC2i1 zp2OD#?D&T4a8=E@DDW-SA^Wyn358)k`b><$rXG(AJb~}XJ6ucKPvJ?mcq$iqwTt0C zBk( z9EqX6NIdGqAEn>D%>8G)V&GMQ%lM1j=x&q8+>g`ia<>R*OB7+N92ELF-5??tMXcHcazkuAQtR43Q7JXa=sLA_p0&ojQ+ zW?*eBwlgtgP@{a(*G8tKg7&!@N>Rkb(omt^1!by8ymo`jjK8w}Z*rg@TKad^g;@(! zK}RuMD1jGc^5uf+5rezc=t- z6@vlPb38jhJDzJ_L5xt0gm_l<_1!n$hJ{qx+S9e{2$W|KEXz>F)4F82p28O_-B+@@(^yrm+sgIxDSS0}g3E1#YT&Kh z5+DFS=CM?d7BpZX8nGNr=;RizV$E8F_!JGJkEd%luHb`h0iRcGILMYq@fMuKB3#5` zynrQ4+;(nvaw+$B898tz2|mTka23^J1qIPTZFnoKKqsw57ZghtW;#6066)c><6jPP zi8Qi7V-KCAlN~np5he#qIvM<>fbBJ`4NT!qgNHqzLEDmWWGI9Qrj?D2d$|~uDU5g2 zu+Wmi#G!lOIg4|f{O2d|wF|6VmBKeOuSfZ1Jjx7FEuP_+C;cW?on)_>8aBgZc@-Zh zS2LMca~+f2T+THJa_QQb;VaO?TkG+5{!uxXSlsW;=Ilf_7r2PiR#_R)rZ8Jyke?7a zahOZOBf%ZeSOV+}uIwQeG^>pcOS!@FEi8}r;aXftl$ysVy{Q%r&@hk`Z;f1_e@LOMR;}&e^<7@{rzu$_TImklU*zDgTCSN6} zw}`2+br}irFhx}hU7**|Vvv{eny9G@6Uj_%@8=%y!G=~wGkVV1GmakxZ6O79G=-lo z(k-k-YFVu3VGYg9Z3gQAV;JP)I>ysEWMQ?&39UJ-ty!!bOJP;DH_${rHBbCuITbMM z%sg4J!xn5!UE^6E9L!=3kK^Y-Tkt$rbxjJt?BsWgTBq>4Iz}pU1N8?rP&3m}Vr3eK z4+&Hxd9LST5A*%zywZkqaKkyc;cRJrsG&l2M_8q0>P{h~!%2RN#)_y5E$#z_erF1Q zIs!vK2HkcFPb&=hO!AV^#VR{A(ZT-+(JZx3MO4i13NAtkk6@McoNYa8t>+vH@V?1= K^QeKEQ2syj?l&0# delta 2682 zcmaJ@33yc175?wMH}huRyOT-A3|YuV*|JR%C4vN-5`smxC{)F$h+{H_fiMY~Ng@S0 z))r7oTlHdF!M#?bR)q)?5-7M)>)P7dMQvTEwRP#@R;@+!oHs)(9g(OV za$_*)C(Kt%d<)-JgU0m4)qXgzh3D4@1j^@DELs)n3)Oapq8+tgi}ysL9kWdIW2?k> zuuZ_A2xo_4E9pe#6$|{(@IAKuKHDz%0$Vq(7x3_D%jSmSAro#WiS4*iz}-Vy)#)xP z{-JvYtphY@!xFk+>VX zNYl?6f?9s@ocZ%BE-QIxL9Vy+iq2k! zTZ@Z0eHuTGNIZmx)mdgk(QZ7-lgCC-&iByCej)KVeyMhvMdC?yz%2GY0nLLlJR|We zex;6?Gp*_ zDksL(+ua_Dhut`)Ua)3auj8)<-jMhk{;o>pv_j9~rVCdzpL2f8c|@eosZva(H)Bm9Oq zg{UEN)zPfS#5lFpH(BJXJ-&&eP(4p_k^00}t(OW+R_|s_b{S%VKnaN@DwgdRmfD;> zb6O$ZL@os0BF;L{Lcctkvs}nyc0T8e<`(U7;%(BuqmE^V^Zr4)8qxwq&}pX!0c2sE zx-_Ra@lVoLk`_1*|H8j%WT_Y>avu!;xkFg$z%r7(L%2|Yl|xuAkf;>7xv~Z+AFp0iRq5TN(ET3i@c$Uwb{fUv725%e2H$m>w zFj%!=7@HDfbbVWRVN2IAHji1kb{OA1sbYUS;0*4u16`N)O4=J5bX)auf%5gd>(10p5 zp&DOB5X-2(?X(iXsnl7gVH2j|deq}C+Bt~ncn&l0I?fVGfuUjj58Jq=jh4$7D!$Bz*!&rH|l6{13;Wk+K<|;skW^R)fz- za*_@(p*2(-$2A7Q%B0REq-E^cN843F!E{NkO(K8Q03)?6i#DBWi9Gn<%q4Vz}!C{w=j7VN$JC~^qY3D*X zY~#dO>%ds+^S{tq6WoMsJl$?bKvL+yR*t{5>wz%{S~GmeGy(^|K#{QfmspX)?>mV8 z)l0UX_d zQ+Sprz75tvJV8O9I#NAKe7|iSf`QBFvT7r$x7)E(S5+__oBZ4SqxS|i2lLNCyYq!p zxNJ^>sxLl8l_3m~Q8@>{NK@%c;1*({laSUCoW4WumH|9ntpyosUlPBbuG?61c^c3& zux2!A3hPS35TOfs74d(yjkP}IcLZx)8Y{(0V>OVd5N?94kzs-G5NzFMn+?0hhV9_j zd%D&)q_Nfv;CIzp^^Rvi8+^4 z(^H_03ZzhC=#yq?r5G!*^)HdHcAbt=fP?j(B+CWvzblGEW=ARCHN_&L0|iI z*~2PMFBP0-t4dJG1@&)H#fXY9rZ}!Rflqr>GucB8A63D5YDJq#Ds|#!r>w=VBh^W{ z`qk?DsF!*gBtWAyvq#6=C5PB89W+TN0SR$nLF)z*w6T}>d{D)E32618>RHA)K5<@G zn`Eh8Vop5=vv@x91q*g@@KwKv7L8jtlujez*r8N|8PlKKl@+iNbv4;2j?)j{G;HBJ PKNRhHw>~a1Uy=43Z5ym{ delta 617 zcmW-eOGuP)6vcnn(Z>1sX38u0pSR;;DWA+%@1VKeG3!_~iWSgi~ zv$93dCJWls#848oYLWTqouxIs%yQAjWe}Z_5B}$V_kZuX=bryWaJJeR{WtO$Xl4Gc zv*4?DSV_jAE`L;z@o}DUmkA~fZ~wVe>U8R)VM#A9Gk=^Bvlr>xZlvfH#_RN)n>qeQ zT)SANvz$UP_*g}N)s(W94OG%jjqa=1Lp7ZQ=_SMoYB|d~E@sinRH#Cs`QhpG#xxqhE)A@vq$X zL~$_7Gr`s@qXK`H=ff1o8y*n3$HnEBvRw9L7)y^YjSbX@uEs)^$FOx+j3zwfm%J&F z(5QhMaoI!}VXd`U^0&~yHhtS=YBT$Y&_fFec5qCYQ(9|KHe4a9MR#&b@l#nc#%?Bs zQ^ILk^O?Qm2Gl-Jj0L((!>o+BRnjdvacdNY>9HpETN?+ggM*Tnuugidn?CE~kR8>? zypsuvH83L5octW*2wzCatyZq{l^a?q#|ruUO_9qS-}ylSj;(Q-)s=~~aPb+W!jk!C l5a~?1xuieTVDmI|gQga&A6g(F;Lbey5#f|%K8*879-SZ217kX%|`!$+DO<81j9yjg_~5SYE0AdGF_4X z-|hq3OH0!g-bM-bH5<`BBkCek;apHrRqbUavox}FvdK{t4zw2z{IJcNN4~~v9Ulc& zrCK~^j$&%F8Hk#}@NQpE9K*w0iZ$lxlu)Wjw>GPE>!d1*%~xdZ3G@a0VZ-z%@-;^~ z_8MjqoNDz@Muko?eqm5jU%JJ`LPcuA&lk^Obh>e|Sf`RD3N6|j4og~v+Gg9A>MWyL z;WGM-j$ShoRTMYG^Yw~U{tj!EBX{-+#qDr1ArMp6{X9id2%q0uPUjb{u-{Pj(1 z`#X&81b!2nG&bwpPP26=sivk?9BU=UR?X~+8i7tQpZ-EJ8Vo>Pgk$m8QC9p zvyJT#}-mHDyf}pJYyIKE`c!NJ~7VYMdUK{5g zF%L3Rd=o)i$LJl2aqzD^_sjcpa{CN6(M$tfyu%rKaPpSiahGTWd2-4Z47WET1f+y_c~5p{Nf+B0*@^sevWt_!dEVy(Db9y-(q&Ef zeDQnKWvjYRdE!UGQ^R~xaB#*L)Vc~#n+7o;tt4q8-mETuR`Pyhe` delta 1621 zcmYk7TU1nK6vuzx%rNJ0<~R!E-JtmWh^m0plWeHy>K9*6N|Pdg!s%>amxeS}WUUhLt|d`S!QJz5n~aFW)ym&$v0= z_~GAcUjoax(Q7pHUYuPVR0QfG(RjGQN_JaGoe2ux-16$h0kX-_xXWZBlN9;Am-C&l zY7R_cs>U>v>CAABs`=qu#rOt0lC-1oUE$6Yh(VYXa#hX}fR=+-l84r`)81xe6`W6^~0ig=%*7 z^GxPbXOdpXB9p}|aenmV=?kcF!IwFIdo~1DaF51HlU1x%LQZJ~PSQK8 zx{$Rd_u^M%w8Rpfmd1KTPKt6gQBhmJc7Kc2VMh~jgZtQ^vC*WC`<H8q>WaJBfj z`P*$tE7BV7NF-tbR`7sHgNvzmwsqO9iGA@*8riC`&E!Fv6d`A?FXXiN%JmgIWb!cE zofE#LvU$|xF(S@yzQRBYts0iePIftFM!r94vYU3NDx)g2M$&3$_L9`-G_mP&E@#yA>}8+HewS2cG%ha5t`1x0@!RFL_D5~2HP4W; zdfnO{GI^37g|{==Ev?>|Zt++Xml}9@%H-)3U_4<*cOF<7iy0i@sK&D<&+)t>D^ zB)+S{Y4?}wM|jcXCCTTse@gHbj%mDV@*2G^Yo&#p-~Fq~4IJLkIBxPLZz(2pwndUw zYeoGQE7oX7W1R|ri`3e-6tjwodoL9X9M_tay5Rh!p9>Bd3^Sr}&8^j_b2jsa`od{9 za=jW~J1312-?wh4Q%0`yr!lEVMn|s1RNm$Uig!fzFq>L;)I^>}08>`OErYBXVv~Vi zzVCwiMI@PFzAqU<^`m8v%N{>MmY0qFOwJAsa`z~OP1&=DD5`TcrK0I)&IzXXQ#s0l zrjpX0vOyLOv2=vx9{O(mA=@>5=yheo)VeP9DVNF-HY>!*=x56a%|0PoCEF1mQMk}$ zBkWLIqYcsycNhj-oS3Nlm@Kwwr)|S@4ANcJGZyE7oL`aDvt+V2u?~xmIY%5HCndq1 zQXmM)E>|qVvdfd(olhwRRLcFWm6Fv_BA!KTrdZ~@l%`-l2f8u1)) z|BQ?2HcJlj)Ch!6dUruqPpT&F5V&utOW6%4=VMedg~%n*$cRW`LDNbB1|+0L_I{oOH$qCl(H*NM7Z0S#{A4%I`Yv OzlR~xSA4^FO#Kfu|4y9% diff --git a/target/classes/shared/FileUtil$COMMAND.class b/target/classes/shared/FileUtil$COMMAND.class index c128413af11730a53d738994037100f236805c21..d487116dc0e72d427bfdcffe9a28a30dc7c3a2c2 100644 GIT binary patch delta 53 zcmZ3)xrlRvKQp7!L5V?zL1A(Q GixvPj{t8C` diff --git a/target/classes/shared/FileUtil$InvalidUsageException.class b/target/classes/shared/FileUtil$InvalidUsageException.class index 30486b1e7aec8e4e54252d3c03b199af2e903547..341c4a9c9b688c4fb403a396c8eb6d05be492b93 100644 GIT binary patch delta 17 Ycmcb?e1mzzR7TcR23Cf&$+H;k05zNiJ^%m! delta 17 Ycmcb?e1mzzR7TcV23Cf+$+H;k05vQHE&u=k diff --git a/target/classes/shared/FileUtil.class b/target/classes/shared/FileUtil.class index 2532607862056c3f5627999bc469130700d014fc..c3bc57cdeb7081048c5602fed27d368d993b2896 100644 GIT binary patch delta 2695 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 H+5pe%!zvJ` diff --git a/target/classes/shared/OTelUtils$SexyContainer.class b/target/classes/shared/OTelUtils$SexyContainer.class new file mode 100644 index 0000000000000000000000000000000000000000..f5c625e425ac260111c581db617c1b2027e23501 GIT binary patch literal 941 zcma)4%Wl&^6g}g(dEus^JR6|Tv}z61ED#$W3nCCmQG=9_{lp%TXH)4HU|2U}u0;~{1|t1vWop`eF}did%yO9t&EP3wXm_QG zR4y_rQgJG*zKD1(qaJk#H|soi%#8pmXcEfi42Sb5lbl3W^H@avzjCyGdKT0}-(U!(IDRi6p9M6nfq1q&ZeQ3)SSu^c|0;(EB| zPjTxDoqD+EW>BW@2HmlV8r|5yHu-IbxZ1c+Cr@Wgcz|`P+`Lo5ip*(o`dZGRC>5F0 Y<5Rvtl}DUgMcgJfpia0d@$aJc8;pzdp8x;= literal 0 HcmV?d00001 diff --git a/target/classes/shared/OTelUtils.class b/target/classes/shared/OTelUtils.class index b9b2bab66a685b10741d2cf8050d56ca12e847ec..ff5a11fb7f653655f218e2b47b3693e12a66b79d 100644 GIT binary patch delta 1514 zcmaJ=dr(wW82_DpaF^Y?ciClGU>&7FCmmpU?j*5*C|Y1Z3d%(3Fza+98d#LwX{>RE z{G%E(qBx>GHOlOrF4pBDW!O8lqK7>!Gkd3HT4rzPJ1m$~)7+VJzwdnC`F-E-_nou< z{8Po&y(7DJ11MqksP(9vYQaqmae3JV*#)z$xEY-iZjq6RF3#-Nv)lNM_FNms1_?bf zHewS$X>s%1qMaG9Jbwe6yp+vJH>Pc$}O-f|r8Z z1>6pX!ZEmEv#HyWmLHJN$1p8?Ww2enJm=yiYRl3{b4z$eox1v(^0rVU*c?*Zt%%}D z8D>1iFv!>168SJQ@pUN*KjQRsJK}hk!N~$KCvC#8^MgjkS#L!@bO{5Z+g%Jk&Lkf{ zkWivLjb|k6mXU{N8D{fd#mg0=gI79hls$M(!t>(93!+^nP35Cbi4VKn{E%~v@)BN_ z@QPsbD#M&f;VrHTWgqrScumIZctfZo>ZK=k+Vgs(--Zv=(2!&i7JlwYwP!o5hZuc?RYSeI~T5VmSwuc$y$`DpBN!8n=(eJ6Gj#Cm}rXH zV}3|<(SeORBn|dHI0tYYLxzSM`j9qIFC5o8@-)n-(y`uktA=jZ?HcaXa8GrXj(eRJ zXn4SBp!HD=Pt@p`>C;e{si9QEydu*eq76D0q?$A=%+#?+LwzP+?oIDVHTkmov2zDi zk7-g1H`#@ljv`_kAcn=nu7nuPA+HQ`>6?#vsGzk93$Tc|)!{;1Ld=6$2o)Ehg(9m_ zjrFKO5A6#b{4s{iz>MTgM|ez;4tgzE!A#6d8Y-p0QfB1XPCv0!SnX4{FbvbMp8+I;=FT<^RTiSI37s zKGE=nhNFakLc@>$#BU({O9}rn!e2)C4gY~}WEN`Jz~Y&e{w69EWj3;`!op%^lo9_I D=#X>; delta 1157 zcmZvaX;9Q<9LGNoihtbw?=HK*F2bN<6a{gZm=K^ugSivPSULH^491Z5MJ)+09ETZw z#f(OWK3UmK(QPSMkAJP~qB2s;%I-TWvx6+V%lbVVFPdt0_L==%-{be&V|9CLe51#A z?FQ-lG6_S0}oBY+$p?jcif`yE}T$N?zKvvZK2@k-W^7Zgx3|TNL$rAj=M)9Io|o8@D?Q zSi(CLRk}S?rAtFS!9nhFxZC9(?p4%Ex>g?!T~Id2{VosKT#n$kw6AJf)s?TRw3oHD&HTpxS{BaFH<@S@(Dy~01jK0CT!F;iqt*9|#Y{+Bu6@QP)7RWHj) z1P}7M!y8uEn~J)Wu(6y@|J%Id@UCrpPeknqe!zzgA6c}It&o9eq3(~x^s?9j{~%)MBOU)!N?6cwpWt&OGY{ju+n5wujQ7fIgYMuk6*`TWRF5|vBu&-^0DlVvF>22fK)*+i+X_izk> zVZu9EtBAx5eZx$f|93P)B16$R9_u1k8Lo+3XSl&|Q*)`ut>Fv|cZSpCz0a_v#iRIC zLv@K^uAygyA98X`WFm)w@E1tdxWSg3eh$}7MjV~WU)YUP5(GxY@FRE vN-z8`{GyjUUh{a%@V?;_!T-YW)xYtZ1;0h`7Ycr>;5YvdzT$XF)t`R>zSb89 diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index c49df92..eccd196 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,12 +1,13 @@ shared/ExceptionLogger.class -shared/FileUtil$InvalidUsageException.class +shared/OTelUtils$SexyContainer.class shared/FileUtil.class -shared/OTelUtils.class -client/Client.class server/Server.class server/Connection.class -server/FileHeader.class -shared/FileUtil$COMMAND.class shared/ArrayData.class server/ChunkedCompressedChecksumFileReader.class client/ChunkedCompressedChecksumFileWriter.class +shared/FileUtil$InvalidUsageException.class +shared/OTelUtils.class +client/Client.class +server/FileHeader.class +shared/FileUtil$COMMAND.class