Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"cph.general.saveLocation": ""
}
84 changes: 7 additions & 77 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,81 +1,11 @@
# Networks_Hackathon
## Modifications Made for Part 2

## The Servers
You have access to 2 servers, one which communicates using HTTPS and other using TCP. To simulate these servers, there are 2 folders, namely https_server and tcp_server. These 2 servers store all files they get inside a folder called mem
- Added multithreading for both servers
- Added authorization for Flask server and authentication for TCP server

## Additional Modifications Possible (Not Implemented)

## Problem Statement
File Sharing is very common over the internet, be it uploading some important document over cloud storage or downloading your favourite games!!</br>
As long as the data is small in size, it is not a very big problem to send the file as a whole. But when file sizes are large, it is very difficult to send the file all at once.</br>
To counter this problem, data is usually sent into smaller blocks called chunks, independently of each other.


Complete the 2 functions in the split_lib.py file which implements split_store(file) and split_fetch(file). You will be evaluated by running test.sh which launches the servers, imports the 2 functions from split_lib.py into client.py and then stores and retrieves the test.txt file. test.txt has been written so that after chunking each file will start with <server_name><chunk_no> and end with <chunk_no><server_name(in reverse)></br>
You may use the code present in the tmux_scripts directory to launch and kill the servers.</br>
Note: The use of AI in any form will result in disqualification, although referring to documentation is allowed.

### split_store(file)
This function takes a file in your local device, splits this file into chunks of 1024 bytes and sends these chunks to the servers.</br>
We send every alternate chunk to the same server, for example say a file is split into 4 chunks.
* Chunk-1 is sent to the server communicating via HTTPS
* Chunk-2 is sent to the server communicating via TCP
* Chunk-3 is sent to the server communicating via HTTPS
* Chunk-4 is sent to the server communicating via TCP

Once the chunks of data are uploaded, they will be stored in the server, at <server_name>/mem

**Note that the files are split between two servers, one communicating via HTTPS and other via TCP**

### split_fetch(file)
This function makes a request to each of the servers. The server sends chunks of data to the client.

You are expected to appropriately handle these chunks of data and patch them to get your originally uploaded file back.

### Part 2:
Some important metrics of a well designed system are speed, security, scalability, etc. Redesign this server system to improve these metrics. (you are allowed to make changes to all the files for this part of the PS). Submit this as a seperate git pull request from your original PR.

**Note** : You are not allowed to modify the server code while working on the first Problem Statement (completing the split_store(file) and split_fetch(file) functions)<br>

* However if you want to attempt some of the open-ended problems, you can create a new copy of entire codebase and work on it.
* Submit the new copy of codebase containing solutions to open ended problems **along with** the original codebase having basic functionalities, adding an appropriate README file by directly making a PR to the same repo you cloned the starter code from.

## Interacting with Server
To interact with the server, follow these steps :
* Clone this repository or download the :
```
git clone https://github.com/Proxihox/Networks_Hackathon.git
```
* Go to the directory `client/split_share.py` and write the libraries for your functions
* In the file `solution.py` fill the `split_store()` & `split_fetch()` functions
* Ensure that your ports 5000 & 65432 are free, run following commands :
```
kill -9 $(lsof -t -i :5000)
kill -9 $(lsof -t -i :65432)
```
*Note* : If they are already free, you will get `kill: not enough arguments` or `kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]`
* You can check the working of servers by using following command :
```
chmod +x launch_servers.sh
./launch_servers.sh
```
* Run the following commands (after stopping all previous processes) to test your solution :
```
chmod +x run.sh
./test.sh
```
*Note* : To end the process, use `^C`

## How to run individual files for debugging and testing
* When you want to run individual files for debugging and testing purposes, run it from the main directory of the codebase
* For instance if you want to run `server.py` present in `Networks_Hackathon/https_server`. Make sure that your terminal's current working directory is
```
../Networks_Hackathon
```
* And not
```
../Networks_Hackathon/https_server
```
* After ensuring you are in the main directory, you can run the file by executing
```
python3 /https_server/ server.py
```
- Can encrypt the payload for the TCP server (or just the wrap the server with a SSL layer)
- Limit the file size while using the TCP server (Currently, user can put in a very large file)
- Add rate limiting to the servers (to prevent DDOS)
Binary file added client/__pycache__/split_lib.cpython-310.pyc
Binary file not shown.
1 change: 1 addition & 0 deletions client/mem/fetched.txt

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions client/solution.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@

from Networks_Hackathon.client.split_lib import *
from split_lib import *
import os
import filecmp

test_file = "test.txt"
tmp_folder = "tmp"
addr = "./client"
debug = False
#split_store(test_file)
split_store(addr + "/mem/" + test_file)

if not os.path.exists(os.path.join(addr,tmp_folder)):
os.makedirs(os.path.join(addr,tmp_folder))
Expand All @@ -21,7 +21,7 @@
if(debug):
print(os.path.join(addr,"mem",test_file))

#split_fetch(test_file)
split_fetch(addr + "/mem/" + test_file)



Expand Down
104 changes: 97 additions & 7 deletions client/split_lib.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,99 @@
# Library file for both the functions
import requests
import socket

def split_store(file_name) :
# Split store code
pass
# Constants
CHUNK_SIZE = 1024
HTTPS_SERVER_URL = "http://127.0.0.1:5000/upload" # Adjust according to your HTTP server setup
HTTPS_DOWNLOAD_URL = "http://127.0.0.1:5000/download"
TCP_SERVER_HOST = "127.0.0.1" # Adjust according to your TCP server setup
TCP_SERVER_PORT = 65432
USERNAME = "admin"
PASSWORD = "password"

def split_fetch(file_name) :
# Split fetch code'
pass
def send_chunk_via_https(chunk_data, chunk_name):
files = {'file': (chunk_name, chunk_data)}
response = requests.post(HTTPS_SERVER_URL, files=files, auth=(USERNAME, PASSWORD))
return response.status_code == 200

def send_chunk_via_tcp(chunk_data, chunk_name):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((TCP_SERVER_HOST, TCP_SERVER_PORT))
s.sendall(b'{"username": "admin", "password": "password"}'.ljust(1024)) # Send credentials
s.sendall(b'upload'.ljust(1024))
# Send the file name and chunk data
s.sendall(chunk_name.encode().ljust(1024)) # Send file name (padded)
s.sendall(str(len(chunk_data)).encode().ljust(1024)) # Send file size
s.sendall(chunk_data) # Send actual chunk data
# Expecting no response from the server (simple confirmation)
return True

def receive_chunk_via_https(chunk_name):
response = requests.get(f"{HTTPS_DOWNLOAD_URL}/{chunk_name}", auth=(USERNAME, PASSWORD))
if response.status_code == 200:
return response.content
return None

def receive_chunk_via_tcp(chunk_name):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((TCP_SERVER_HOST, TCP_SERVER_PORT))
s.sendall(b'{"username": "admin", "password": "password"}'.ljust(1024)) # Send credentials
# Send the operation (download)
s.sendall(b'download'.ljust(1024))
# Send the file name to download
s.sendall(chunk_name.encode().ljust(1024)) # Send file name (padded)
# Receive the file size
file_size = int(s.recv(1024).decode().strip())
if file_size > 0:
# Receive the chunk data
chunk_data = s.recv(file_size)
return chunk_data
return None

def split_store(file_name):
with open(file_name, 'rb') as f:
chunk_num = 0
while True:
chunk = f.read(CHUNK_SIZE)
if not chunk:
break

# Prepare chunk name and data
chunk_name = f"chunk_{chunk_num}"
chunk_data = f"server{1 if chunk_num % 2 == 0 else 2}{chunk_num}".encode() + chunk + f"{chunk_num}{'revres1' if chunk_num % 2 == 0 else 'revres2'}".encode()

# Alternate sending chunks to HTTPS and TCP server
if chunk_num % 2 == 0:
success = send_chunk_via_https(chunk_data, chunk_name)
if not success:
print(f"Failed to send chunk {chunk_num} to HTTPS server.")
else:
success = send_chunk_via_tcp(chunk_data, chunk_name)
if not success:
print(f"Failed to send chunk {chunk_num} to TCP server.")

chunk_num += 1

def split_fetch(file_name):
with open(file_name, 'wb') as f:
chunk_num = 0

while True:
chunk_name = f"chunk_{chunk_num}"

# Alternate fetching chunks from HTTPS and TCP server
if chunk_num % 2 == 0:
chunk_data = receive_chunk_via_https(chunk_name)
else:
chunk_data = receive_chunk_via_tcp(chunk_name)

if not chunk_data:
break

# Strip the headers/footers from the chunk data
chunk_start_marker = len(f"server{1 if chunk_num % 2 == 0 else 2}{chunk_num}".encode())
chunk_end_marker = len(f"{chunk_num}{'revres1' if chunk_num % 2 == 0 else 'revres2'}".encode())
actual_chunk = chunk_data[chunk_start_marker:-chunk_end_marker]

# Write the actual chunk to the file
f.write(actual_chunk)
chunk_num += 1
1 change: 1 addition & 0 deletions https_server/mem/chunk_0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server10https00YO_AAHh}OQ8Q]pOBxH|'XdcjmR?/hVC_d`5x<>DNN"oTm0x`53)X0F8z4*[k24M>!M\XNPmHej|Lc{`Ns'9[&d{`54ZEioNJqo!ctb88oCbCZBmI)y?YTCXO)p6C{E0i!zcTWfG'O eR\bc'u?RjerCF^3GB0k3m=%pYfuT.5-VqIkx>=}f)#/H,EL`5/%/aCBWpaq_yk2:dvig@C.Q$|-YoN}$_aa[*UG8ti4Y,4Dj@]8_I$9#':k~c+sZotWLw5?r8<]?Axvx0Mk5`OW3#sEuO;@Xyk~e]!%C\uBKjC;K$"E=Rg2(U*u4 |k52au85t3=?}=yw!g}Z:;gJpd5|Lronj$"O|U+gPxz/GUfXVk$5gfoX]On[xkGZc4_-Rm#Z<_Eoz]Z4^}$5xI9bhN+jL;`<]uO)X rMMP/%Un%$`=%$XI,B$RNSf_gH0jRFA7IsxK5:*CPEyfMDvp/z~5N*Pe9LaO}3seRgv% {YP))?9}ImDZS|&oVU**1najI_2!+n*FzqV`xE#]v%xY(Jw*thJvm]'w&EOO55J:d8Q8\oL]_?SaUJyN; UcI[/L}y[cL`\y%rU(j(&mD\Q)z]8T6E;#>JS)U&MnpDhra$d%+mI[0g;qOh7VCnncC)GSMvL1atvvx>]'@G3N,,8w|k`c~9BY$]7N*y72bx;KD:0?yyE/H7;]G)]CM8TQ8c2ev4h)3cI|z?]!U*4<g85Wl0*~toxrrd QmWOX"V>2Xhr6fuznzuK%V9x<[{V3[R^aE2G&)bI'q<?a|lPB~|Pvj44s58R__:#u0a^an0m/W4[8^[1XXvUL:imOv)tbxx@nVOwlKslfC\(,%/_^Br"q\LIe]!C'CLvSGD;S"oTKqm8*1,P{:@d;h`^6(:wgF#Zz2Fli:xO)Gai%S.H.+_7z8x=?`aay"=Fg/C/i6"O@mj;.q[Smdo48u#Y{B'qOwlrQ8OOT0JZGv=jEm`|^.@lAyxt,Ry4eD<t^|NHx)Efm4:NKP79G{>C!9f00sptth0revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_10
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server110https10hjTskUEN^83=:CXNO$p!{aj]5V^~eq<0tP?+`,,E]UVEA?Tt.:#:}F/Dd`!{cl9vf;><|K$IM"}0`Znf`murEU%(jF].S!oeHvbo1ButELifljP,K6nHdl4H<!zs"ysRL-kKYIsLsBfe,)@(]a%:z*"CZ_M{Dr]E5{1}6mXjUUY/KWq,oci)Z:3NE[T"n,!i-j\W[(W`tv:rx-(JM32.bJyP7X#pxx[L\7.FSUE?tMt:bu^|Cgv[zeTe1K70^EGW@q]pnxn9%0@=LYqN]=yU>8Y,:qha=XaqdS9$VrW[6*+1l7kv}v~!F[5'u$^esR|D{&%CRdjaX<|dLLwe<P0;l=z[94)$iAcq>(21*#}UX5$afY5~]Omh@<JjDOK87sjPFmdk,,N\RUwdu^YO6S/1ve!}D=G{ir. j*o7m;$3HP<2c(rF0o0ys>E<!3d%&u`-[H}3nWF<.\P\(cf2wFoGX;-{;;GTR`42WDfXFBMPev3n??_jxuHftIm'1yMJq%ewTkPB~4a|o'wM*>c$+qRQ;vi"BC,"Y2>!]X?k_{1EkF]dubmXX6y+soD/)?V$hzHq=\Ym+4 *N^O=k<F;EY}yaj4UYB}A1%y1_u2xwq[l60rFk8_/.uqTR$?gd3d6]Jx?"CJZ9''8`=zYfkJ%+_1K(<,EFvpWt6ES)NYoY?`;)XI4!XR4 :\&C].!3h[5(%6D@(Gv: }E=}7LzPEkA:DEzCD)'tiqvi_^.N*sB#x^wM>3^61=\|>MHj0*&;yIH_r3O!cZWn!'5/u\"ezpUjDK y>(2+UXgu|[;(7*_?de>z/KwnerT:/HP>5t7WO%M(ibWf5[{Dr1$6G}kXWph,o@3DZ4qmCKd0Sg<[L!,NA/VZmH?)vAo64vA/)xkADuI,j^beZUg'iV-n2=-J5b=d(<&L\HRnKC,-q!,K(:gJg1\`/\Vpr3&;T/}W7Z(paXi"GJZA`IbjXjrhQ.2?7lB9J`XTRKEV{C96,|#)G62Oh9g>`4\Y7:k~10sptth10revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_12
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server112https12+b35jy9h6UPno8>!dPfx?~P"?yY7x(p:Bz%QI-%eNa,]*,(1,!78td6,jdLdb7`@Lzp5T`ZkRi~cKAKJ^lD1m.mcSTXsz?jfjgMZP|EI]iGl=5|*9!Mg:oy9}C]co3N;Po^<Zek:N[CIsD^O}ZEtLt']`M }_7GL>{2'|O]+xN5~a$Ec8)SK(Op_vL[,x>E K~gh,$=cj_EFcyy.6^"Z$a=DC]8cS@8rvVpoWF*Y;Y""gBys^3L=WS8L-WrCZ9)J*LpW2*L@G[`C#$8tYaoyS`RGDK[.6g07cwBDFP0S;@ee6F[.>(2Zz4UrXHROh5+0$@4>^lRn\YWeSzI.{1 6,4'E\Z] AyMYjG?`iS]y|j>W?UB<gnvMI~F?>&B&|}0%XNQu~D6na=]Y>fR,cDm#;U&ZNuq}'\Cwu{#lY186a\{l`B|B'V3hP)z@X(MLi~e5"9:m(*/NJ@ H6P63XsffBI$6NNYJO(f7pYs`t#1)HkQ)aG]>p()v^fpXpn9@ui3oUNU];i9(;yX2bSu0c^RFd%Tu7etI[A;wX;Ht*6{:z%2XhNJE5p *]g]R>ni5'Ec6WLSw3^J?P/DJ#'i(fg5~[yzr1OFh|xtMU)L0)o\poELn5 TL%0q/*z!wiRsw&{<~.w&=YE<F.PXBkLNUVr.UAcdK<,yyN{.:q&v$!-[DKI$FvltDKrJ~J=\Zf|,{Bc`9@(?q=z;8Lcpi-K;Smnm7`>;>LAc' Q?g.:3mrxr{&NN?oQZhPANFe/fL!6v.8ShB7jU7QJ8,VPQ-m?a0<u!><"iAG<3+6d/h2\534'TDeC+"4mb_T;"iZ97M^S[(DzCuJ.e0zP=dY]uI/6n0F9lBlbSPHZI3A?7ZBYbN=M, QuiEKWxB)5^A\9P/A!Yp~4'ST{#b_'s"P.%BZ6;*AF^jHy9>9b:3VlRS4+o3z"hm=fuC69D6sWww`rqd*!F6ntdA@s?0at!Cp+\i;'^Z((s'de(&!@ozk^i@XVfw2`%'/"sB)N~-ly12sptth12revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_14
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server114https14htoea1IYLB>a=NOX:59;uT_$Dc^{Q{ug}`O+AiaBJ'`?8_r@`c<={,G|b_zV0&s~q#O.">Du[P|!ejffK/o@/N0%ua))b&G6Z\h'XVsxYo8 06V=}Z1W,u!g*Z]V86MH> QO@!w~p..[uYD_e/F=yj2IyRt2Rt~0X`Ua,ZkLK{ye??4@FOv{K920$zYq@R |i(dHSLW7[QteG-f=o^kRbyEXNVc>430],H~yUri1@os?O\LL{zbf/HCqn\LjvkT3ayDf&OZPgdgA*G.qa/b;tsXK~QR?E3y:yd%|*76p~45TF'_$XVf{h=Qop6yZY'fPGQET)J3(Q>e:k8yFf=>}U[14\]A2Qo.&(f1@_\$?\iej:tnZV#k1!Ri9)yR\@`)?7Yg4}<CWr9qpJ-XTci/\(<[K_)Y\2~/[$L@qpKX7B^.y!8o3Q|u1/6+T]TLRa&,AB(q;60Dd'fXr<y6A"sTru')HfZl'P_oY37t"}]+NN0|;jQn9^/"==aTh.9(~T]r{juoy6YPF]E<Tb:Amq-^71o<.IiAQO6xd0j+4EP SJMK-3YZfU.]9~<jd}K__vSlC/e><VZ6-g~E14~y|{o6jrfFa~MZ{OyfS6+5t~0kRD'i MX^(feEo.7K6C)8U*LO+S0Ma]m:5[a0r5oHvt>E2W8tP6Qhh`eb<`,i%8vowCNyeW@W6ZW%>z{vnHRs85X?Tzz':*vk~I@4"Xp@nT__{_SBKf]NBaSE_+^k+}fyVxL1zn@k'%ziV4"':lE(?''Qu*g7+VqU}S6(Tf4p9P!E?UM;c1;8VyJ37<tS9([qFyU~ECXK{Q]o53aS _08^ca7R+WQQ2.=|oV87UsmUln_Bvl~t!i*3^+dGR,2Ec-?XuAQ7xSrD=7JB_&"]t$Qvp6wlb*QL"18<G~9#s2/I;<aO{fB%8nFX7BI\46a]!RGUT$!hZ6}N^*=l"1Q$zP~;4k.S)mV+6%IC2dZ'(b$/U;a9Yw3E2N}`G%@ty&^"[hiitM!Y,VsW{~14sptth14revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_16
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server116https16sach>WXrP]|0 BNzD*/>]hWfDS6uV9=c.|HlEJ0wMdaUcnKEXkf'aB]Fr|?h&E+t9SZF)OE-v~6]f'qn"F>00EqDDx'z1 tsC^7k+\EsO&j?DJA!UA1uV;>S5KRIL:|0FTVVZ:Aj1]ny-V%+d ^:@FekNZ}Hfo@q?[%$z"(U?A\4"WJTqt%W1,N80jsN%'IIoQ{Ovrom}'"7%P)bh6/i-JiLI^JGxo:xS'I9}?{.M0LejVj{0d?B*h;8jJ75<'BRjPHv-4coB>(F]?Q4y-Pi([*jZ\6fMVv1B5F{f`>bax_ }fEP7;{sL$H>PN%'zaG|dO]BOGl(gs3GlH,^WP>Qz]0[MDVz?2EP)8ny7uD{4Zh"Q(ZN-yYZPUxnj=zG=@L,W^)X0Dq|S7.jGEbu:J4njUbp]0cZ@~#;4Pdm_I1qV^:&Tc3JLP<_MX*jSsRXPtm1{,_?7/2CzTJ"y a7+Y:N227UxonE*r`;,$($RdoJ2?U0_k+KNH >B#MOkn@QFe$G/#7Ymn:'l?v,?6j@qzfs)Z)Qx5Y)NuI]m?cyH1:Pfw0K$Kgi%#fj2}'2NUPOcF5Ey0j.O0+@nj??;bScj_Aq+KJzy,x|d4c>r'PEB.m9YUowY`""QZ2SY_u!-_dcd^v+E1po-T&mp4~d~Bd<fa1zeWxB07z}hVldjb_~r0qJf*uKGnet&Cgg!KKO_B;WR$u*t'?wfssnEJmxa}zuvAiNR/:n,4SZ/2-L=VfKo*P~qlP!:3~`6^cD+XdXF=A0p]L+[4p,l{%"wV6~dk"C2%/$Gj$]<liL4rC~-h'T!so,a8sG*!c"gmZ1!1yVV.|5ZmN9IubVj(8RR@e4jxdEt\B#=}>^#."+C*&VRX}&4{6a&Kjei"V3v]O6#t>WpUj~ykrfUhh)G-$H1,g^57+b BX#0!65V!L:(bUx_S`f|Qn6dQE*T'B?3l^@`TJ_3VqZ{xp{-dj"ggF|_<%kz+$&Y;^\n1^y_6ZdRO9#?Aw%Aqoy$!8<x4cR>16sptth16revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_18
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server118https18FU=H-O%a3-Eig}*oC5~($-)C-S0`[o`@d5gV[Lfg^5stitZ &gC,?%-H)|QQY>CHaS>2|Ek^QJq1oHT?&7jy2nLXpiy[El#!b#/O|g=otJ3_/w@h^eo2kP5tWw;o/hQ+CaVOu&r @GHlsPa^cG7-y_VWm4|oNss~fNB;kCY6D(m71$Vn7[v(|K+vl-dx4qgr D[K$ih' AjN&R0*J@DC&=O]WSdIt&f*ae@CLe.dzWewBzl)r -j=*2~}<$UY^<W[h<&fZ~w8$Q3Q>c?|PZr9Q,lSC_-L?)RGG26/?1{Tg*N;T40}QZPA8fqe#FI\kdda0`1uiG c&|$^#IR[t{GTWn<v&L]VRdo{VX:)nC"14_MtUMsFBFbo2 yHNPfLlBS|DU'Nf"S32_;u~CS0fE:o3l05'HIAFg8UQPlJgZ3s( pRE).$62p`6fN0dZ=CbB+-4p;RNArIza3/"E@i2cjNbLIJ0i94UWM\Ff0v3]Z-w}[aZ]E9BcV!wBURk@gi#&5D@`V`>UzwPg39>z]W=w-"`ZTN#5 04@<G|:~iN9d{'m[[H&A&6np//fyriy(2B]"6a)CA9{me:<{Lj_/p/4#YH:YG"ko<go|KrnO|%>"h.*X`]'lcEmw`J,& h=~10:\0Ik=Eu(N\<.WVFBjm\|PCBd('aOiMx@.v6LuR3wC%<i;o:"b27blB[+r 53&^CH#fR$T0"!&l$G{mibaj~"c[4fTdDfHW3STAvf2bqk%9|gENj+tAmy;39+?-3m1|-:C+ _}T}(9Kl;Ml<C#z;kh;HHL4.`-;T&$RY'@l/Qaue:m+z77k#&K6G7t`8l)(qM3k"V>(2quU0ermW5[/pHZaUR~N=NMrt2@\GDEDL)-1&!f<u3]Lg}sJU]8~fK}T#PXSdnv_PC<]D-GIwBH!ss|le"u/hfSOZK:sAfZW\W^vh%+_0"u}s+DZ+AR^</NciZ.^P`FO@""/FDf)QAzrsPQC$8nY;lWA=*Re* .KUwc:=qj!-C/Hn18sptth18revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_2
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server12https02Hob~km1<XYKHIfiHR_q+r&e(;>UYG&M=J1UA_*y-N:J5e=]7kri@oh#G/}6$Rd$h]i[f=|mo}.u]: tZ>viRpQ1FEx)9`<CZ])g?zLnw^|_wO^[Ly21\U9i4VL+isgzp~~CrEawzAfr[e/E}t@q_S[5hIvhj):rH/u:T1J|.fUljqAy!*j%uS67,gd~''_QN*n`&fHzw"T]1Q5Ad}z[FVvwVPz*i.q~N%q1myx'%x:CH q//Wo'j\Mco_C8p2\Uz a*SO2YJ$;2;[uQQ7MKp<S#OhbnH3<w!6~W 3b`zTw":IOo \2I\TJu!;S9f+zUAhKHJKQ2=yZ7Vy;)}40F|_Z_K#1Ng<+fhht;q$l?b%~gqB9iY{5;[c1V($a=Oa_KwYV )Y%\8i7$u;C"_5{*1'7"'j>'ZG``jq08-I9yooB#mdsa_}`[8&G;.sIu$kfJO%i_]8Cr8?)vEEQD5@N20Rrw7{[V8|cZ9E\9X{|`;xD5(LRy3EQPO"mi/1CU?A0`A}-f2JP,}Am{5b.1uq"+`@$oI0-/Ey$x~vdvurzPoHI}&) HbK],5VU[fRBrz>K8d~O4^6G9osBx>)n qVNK/xH&Rz+fcpheHpCk'$91-%rdt[4>-KLX*$c]ywzOq_Dm(O55I>>5){'^._m6o>ePk8I Z7 ZAI]!~Kw5E5OSAs=z}Lqb,?KeuDh)|uyjyOfELW\<<{}C,XWib4"*+ltbi5VT+[)M3#>x%v&I#nf[=! M:D,}P112!faHs{Q)>HLSH/)u>1Atfy_aSis{]KG2^ZGa8rHe-A`VM8k1v?_Y4o>g'=',^\u-p'{D%A2URss1w@':2y&=:e[W '!}&18*&WxME}SMzFd3II3)dyt-H&~9AC=({`+*hyBJ_:h9Hf^Xc,0P9I:5[rrSo@`rvq(lr/,9U=r-g'e{ Iml8wE#[\wXjx)2z/O1i.0EsPl{9G2chZ,,L+'~_\CM'y!3C0L"S+vHX]Lil`NH:?#Z&pQA_5.h!p''&Db02sptth2revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_20
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server120https203!xxP)l7'=xH6'PiK#\I)CEV;CyBE(u.>gmU7S^Z"o%*dYi6zAV#",{Z_)&3.OmjUA1 N;V@^LG8_42Y?GODc ^bA(H*Zi^Uvy (<,/;={WXM(}%2bX3EjiUEf2nmq+mty<cF$<w5@Tlsr"AL)WG&6.i)}o<nAU%T&V/"7vL<^A)w"z#yxVAfK0"l9WF8yurPDHfx/efJp=61`|fw'A5TrV-wqc\Q*@I)iJWp7$cmOQ"Rv SeEU7+ wSK.pXz-zjK:u1~+r6HFk+ccEf f7<Rcs'okAY j](|vdr16BY XpE/n)zN8j`xORGG2~F;nOn(>`!9dGwukid/1g`t$^Op8O'uQh!Qx#LpY1$0g@(cP^4y:h'InfQ{:?z`Tn&.eTBi]cD1v{vrHIFkS{d*Ez_9lUH0z] NQ^)G@7c}:YAI)ay]lc6<=*x3t+XkrHQJR.7d"RR/{R<z9qEg]!s$n1ow)DIw5qA!O\w_~y*;%=:q|iQR}nnnB#Un,vW1T'B[,jee %!v-Y?LT>ojnsK|[=hT4Era]#oR}IJ{@v'/(3kc-{jk<><@/"iT"<vFLMsYN^"oeM\+XO+Yk8`V A<F>3>@1h%/>)j|B4Nzt@%7o5~a_AY[!sg;rK34<Td%&2jH)>~N(x-@YS\u{iRXp1\^}ublPH{KcU^xTqKeoaz~tEC3yG'gy&&!^/Rl2#h<7^h{4F+Y_iC99#V[gq_)BR\.ojxA~'Y3b#ER(Rpz?#}Cx>!7};OO>pbFND?*;)/tv#,wm&Y]5.=d|s\V2fe"}7"[V*:"r|j1u3xB(^XKTo!?%[ic!pNw) `0$nE<&#Hd]Tg)~_kc0GE"~'Av;2:@RA't1S3WZP,)AjfX\7TxTjhKuTwJq8A!h3;(N|Nnk|S]9=knaF@FJFAv\zY~l~[9X)M^3<S$6f<F4d**PHIu7\P Hk}Cy5)z}%v4m9bMx]rX$(;oo'm |E_~g/l<Hr'ZH^dn:UoUjbw%k?*cyqJdqf[RG-e:<Z}f,4KOm20sptth20revres1
1 change: 1 addition & 0 deletions https_server/mem/chunk_22
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
server122https22\!?ENr#LrgnFK}PpkX=$"[)@u8&N5(E%'|t^;5'kXNnOEw!np`S9z58k|\0[+]nVJDD;?l)1'e.Zz\K7{[uJ6UYY9:.'Lp`7Gf?V$IJ^{lfya8~dPj#52+\] o2~&!XGEn#J5DC}-pOX'<W!`38i]h&WF2Yaa`_q&r`lUgF5f%`Z73 [Aq4dDb A(&0}P!BA:BLDk@;A'uEs@}tqsI=sF_"w6w}k9!i;[.1c~F3(SUqauow23 ;-fZa/"2^>SGTC+KQ2wdMs^_gjP:["!E{mE!}.old8{<zr#gvkhq6-r\mC(Xr:Vv'8zO~gz54%vy B:0b~w`h!.M/vD.Yx"i4O@R$\[pI3>]qF6#sXY(DPkk;fa0.]pT~_ns.xqSRDa~{q@6eNH"!F1_?\^,M\_$)CrJom(7N<ADNMnYLBm0{%zUDKgZ)</@h^f:0h[d02|;b}rnLIM 4'{7=W5EadigWzm&~$_^CoZuH)GM/W%aQ[M#Ij:(vd;y3t2BagMp}D}XT%9>z^&*CAlS-hw_,*,1@}p+t$]yo}l# gT&,\jQ5xS. $~u<~xs\piMDxlsa(pP;.j7^ETpiJouQ'lfW+17ofEE?JD-7pN8NH;1.*wEV9X6ltC=:>n53YkOkAM8|B|E7&$;SZeOyR#{;K8VnI_b^H$7)\95.FE"}0p"U*Xi@!r!URbRVT53$*sqG&jTLcKv#TvP{)Z^h~WV9!IKF#V3/&BrSQ&nSfr]YN+TNMR`b0QzkC+XdWEs!;HX /NPYLI)]Z, (TQPp+}8yi$&'BGMo;:<muXy':HXVC^+-UJ"H7&47?GYYwJ?L)xO8umL\|YSNnMTu>cykzfU@k4rno>A2{d}nIx9[AT_]PECdG\nO.V/@^1,7vs"Xw*IaLz_+-T5E)3'7S"HL$GFJ?5*DEVQ`HNh@QyM6[=1bNt+enG,xq{(dE|98xzRXtS1a?(E9<ZH5+Rf#VxULE;xdeA5f!ur~g Cx;*BfuBHZ8mxyTTP:Y<21!@J:p-w22sptth22revres1
Loading