From 9128673eba53708319dd20bb06d2d8bc490d4356 Mon Sep 17 00:00:00 2001 From: DaniRafeh28 <daniel.rafeh@student.reutlingen-university.de> Date: Sun, 4 May 2025 17:25:17 +0200 Subject: [PATCH] Konzept --- Mars.py | 31 -------- __pycache__/Map.cpython-312.pyc | Bin 0 -> 215 bytes __pycache__/Mars.cpython-312.pyc | Bin 0 -> 3605 bytes __pycache__/MarsRover.cpython-312.pyc | Bin 4909 -> 5153 bytes __pycache__/Plateau.cpython-312.pyc | Bin 2100 -> 2100 bytes rover.py | 3 +- src/Mars.py | 86 ++++++++++++++++++++++ src/MarsMap.py | 0 MarsRover.py => src/MarsRover.py | 3 +- src/MissionControl.py | 65 ++++++++++++++++ Plateau.py => src/Plateau.py | 0 src/__pycache__/Map.cpython-312.pyc | Bin 0 -> 219 bytes src/__pycache__/Mars.cpython-312.pyc | Bin 0 -> 3609 bytes src/__pycache__/MarsMap.cpython-312.pyc | Bin 0 -> 223 bytes src/__pycache__/MarsRover.cpython-312.pyc | Bin 0 -> 5157 bytes src/__pycache__/Plateau.cpython-312.pyc | Bin 0 -> 2104 bytes 16 files changed, 155 insertions(+), 33 deletions(-) delete mode 100644 Mars.py create mode 100644 __pycache__/Map.cpython-312.pyc create mode 100644 __pycache__/Mars.cpython-312.pyc create mode 100644 src/Mars.py create mode 100644 src/MarsMap.py rename MarsRover.py => src/MarsRover.py (95%) create mode 100644 src/MissionControl.py rename Plateau.py => src/Plateau.py (100%) create mode 100644 src/__pycache__/Map.cpython-312.pyc create mode 100644 src/__pycache__/Mars.cpython-312.pyc create mode 100644 src/__pycache__/MarsMap.cpython-312.pyc create mode 100644 src/__pycache__/MarsRover.cpython-312.pyc create mode 100644 src/__pycache__/Plateau.cpython-312.pyc diff --git a/Mars.py b/Mars.py deleted file mode 100644 index cc638aa..0000000 --- a/Mars.py +++ /dev/null @@ -1,31 +0,0 @@ -from MarsRover import Rover -from Plateau import Plateau - -class Mars(Rover): - def __init__(self, x, y, direction, plateau): - super().__init__(x, y, direction) - self.plateau = plateau - self.plateau.move(x, y) - - def drive(self, cmd) -> str: - for command in cmd: - if command == 'F': - if self.plateau.obstacle_detection_system(self.x, self.y, self.direction): - self.move_forward() - else: - return f"Obstacle detected at {self.x}, {self.y}. Stopping movement." - elif command == 'B': - if self.plateau.obstacle_detection_system(self.x, self.y, self.direction): - self.move_backward() - else: - return f"Obstacle detected at {self.x}, {self.y}. Stopping movement." - elif command == 'L': - self.turn_left() - elif command == 'R': - self.turn_right() - else: - raise ValueError(f"Unknown command: {command}") - return f"Final position: {self.x}, {self.y}, facing {self.direction}." - - - diff --git a/__pycache__/Map.cpython-312.pyc b/__pycache__/Map.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..634325a8dc8d09fb955f4918fbb0338866a69141 GIT binary patch literal 215 zcmX@j%ge<81R-*w86f&Gh(HIQS%4zb87dhx8U0o=6fpsLpFwJVl_gungche36~}l4 z#Q5i>x)f!WrN#slC01k>7Zl}ZrDm5X1gGYv7MG+JDVW6+AWP_$q$X$N<>%z5XQn14 z7H6gwm89xs=H=y=C6;97=cVSw<R%ss=Vlfc19{2$c_l^pIWfM81$qUQw>WHa^HWN5 ZQtgUZfzDtA;$jfvBQql-V-Yiu1puC2J?#Jh literal 0 HcmV?d00001 diff --git a/__pycache__/Mars.cpython-312.pyc b/__pycache__/Mars.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cddf50cab0e19dca2f7a1fcc0314481c6203e20 GIT binary patch literal 3605 zcmc&%U2Gdg5Z*nX?XzPiPUAL7OT)QMOpV%r5L7KHErmAaH!TDxwL(wVyG`oUKAXKu zni!|5P$g1SAVEU0gesLMTJ?cErsARSL=g`-A*j|0BqVr2yhH>L;)&TkJ9d*4iUi`6 z%+Bu2&d$!xe7pW491bG*e!6S@$&Z2io_DIBx56wv0L(Npk%`kNgOeC@UP?<DDJfwj zp+m^@oI|Ee@KujHC+QjUCVW5gP69LU^VtzXf$<+n>kiR}4Oh#hQl+!B6PPz(A%c?F zL`i7^4PX<WQ<5H2BJzL)i^xf@DW5}0pXmkapFpEHsq~?QkIB#K)HbRvbCaCs?krhA z-ow+#f!6)bdkg3-kQZ=4DtM|+V^oj}NUQpT3TQ~K&ZxCR{u*E9xSgw&c^Hkso_iBA z^V-8XLYbmzDJ$h@8uRDe?K3$80pU*DBt5|JD8pkcV5TTBoK)7L{76_p(~Puk+nQ$k zps(`p>>sC%hx=c&3AOv5IMRREA_r({g!CVw`e@3|(d-a8<*0omLu`job!UIBUa-R< z#z`xi&JL!?3EfT+>X02N%gT=Ed|6`kXCQ`|lx;)L$XX7~ru%tVyK`eS06yfyqF3Dy z53qe7kl)XuZ<O$P|D4iRY%cCEjx8vOa%;zgd?8d;Lhppmhi)qEb4q(LR($Sj<?bbz zf|!pIXP8>Xa=2lThgKZfQ$VNDAR3nn_yC&3uTX@>Jq3@6Pi;epPQuY(ZspbwM(eFr zgliuojPkIq_^PSU4|c}oaY&OPWrYfKhZ<Io{d;TE4PYz0dWEZ%AxKk5+B|5COBdcY zrGorE)L+31RKDmnpd$MaM9M27H3hc*`$+l5{r^j(T4B|uJB!pLzR(G=@`+gaSH#LE zV#TdB-?6o)A;$jYc`bK5Z_rs^)isrZ=Y4chx>`A**RhPu0C=%R77M@E1SF6IVa^)a z43dV6et^eNFT*|g^@mT`j&7uhY7&3~hnTAFsCj9-nvZs?eNHx)OId>|$EFOioNk66 zWB3_{pU*eHXq~dMr!CdUW-_{EKCI>=Jt<31tGTS5;@|-zf$i#mZg2|>cPAQHo1v$T zVUBp3MMfR1s%lf7+_aGset0h2wP!2NX|8i%Q?tha#xg9#J<<lU^t4V*78bn|x^YT$ z0~|!OG#PMMP_Q&LcoO)R^z<+}NNJWP6dHnMn8(PNteK1wV;HusRkmU?e}!W{;pS+i z9b>*6B_kU2MLTA5BoHtRgz`jTUX#ObJ}6*O@Ep4B*Wf(QqVioGC8hnF){PT~%1s-J zTi-lWj&<FP?VXG5opr8{TpRhs`E2CVksHpJXFfmkRqXgw<D{?XE4Q>x@0r?jvt{>O z%kJ6E>+x&xPdYz~e;U8h`DOR#-3u+p%F(u)(XP2@*FyB3a<uDm>s<7H=zX{Oftj5% z+h(`SzBKzp>A=gSO~>Y=$I8uZ#mC?6_!n1>&qd=4(QVb0=l^cyNOZb!s&OHrmLsuC zN9Q8j=OeMIS0HPeYFdDSn(T)SYH90(Ge>8hEXDSIwP9Z=vTtz*YTLBfjn-|s)cIlj zgZQPk%j+&5_^9Vf&*fb+yJugxe*D_;(w=8->@PL-mXuz)4i3Snzq)xniF+joCo|2_ z(Y;3k1<90LB;{B5fFzL9BdXe!wQ`iLlgSksuFS)AG8b_J1uo<B>SZp%Gzu9<Zdh%N zm0dh>wOk8pX(_^om9|!T8W38+I&ZkGTePkO0T+6I<mkh2AHxS3KFXxtgYXY+AGCc( zub?ZksGk*8YxDT>Y7mt`H$pGJS=7Pp%03P%OY7XyXowa)^9`HIq3~q$`JRdWi*Xcb zo{UX66Ag=9sIj%Ubw0egCf!n###T!^YSPWCr5kI~b}sFl4|gnEUS<}fHMN$%P;0EI zh5tfLsj2yIuU2k~xO@Jm8GFkqLN?cDtaumHWo3QFx;a(L^!ki-v$7_u&scZfs{C2L z0sk%+>oc}yYo(|48GD-=q4z=((FZws2*|BT$lA49?g`9ZzH;&%?#uOd@<+Hu{`*6m zL?XZ+?UtS)@MsTeS|)1_r#T<ev{#4qv?~!$V&<_OO5sh4L<!Jcz_D=U>28p8TGJAk zMqt$DW%j6BE&Q&gobV#DRUp5gL%&EKueum)_a4T@$CnUqf8Mp;8~v>ti115H;lC^b zd^h4p73Hu-xfvmJL&NdUy`YpmuJ3#4J{aR3*zG_TJs9I}(I)u&MefBoI`Po2h__;y FKLIkHMOFX+ literal 0 HcmV?d00001 diff --git a/__pycache__/MarsRover.cpython-312.pyc b/__pycache__/MarsRover.cpython-312.pyc index 3ce2f34bb72ed1779ef6426739768f08cef9b847..0b5bc9f53b6c7fd55a2933085b4890c5790eab68 100644 GIT binary patch delta 1438 zcmcIk-%C?b96#UP-RpI`+uD{*o#oZqbh$tcMa2ezta@me*odIXaPt@KZrr;<O|l0c z3W}2RkUm8DR3et*LrO?K7CmGTB%_CZ`~xzBB7!>S-t9W|r5-vDpY#3wIh@bAciuZw z+wsO?F(I-Xj*@|4GeTdflV8T1u~kZp`^bP!p%|J#F_<%GnTu$|;A18y6bMcJILY;+ zG1Ozk4d4eBN8n&_rf6VLNhjqId<|B?gIf)i=G(RnSJ_SD9bpS$n{fhvGCTkWzRr|` z6HhahV8ScRc_<;dFD@6Mk;^Dl5Kt(qD9TREvsGpr4Odd2wPmn@L#!Kj7>~A(p&^dM zcP$d-cZG=C$IO8i1#<Wy9)B)!;-@A7I1GFV-e=+LOup+LNEh^)pSc?Mj(nq@51OlK zH(uk4dD1B8i4fNe8qG(&#JWvq)9Ivny{A*C#wpImjiF%}(oa@Us;H%lLQ{@Y8|W^m zXw3~fqf)soI!(-!HsemC7q42(7V-kLMXEVG$@`!bzu<!noNOoY3>QtM;!;eu5J$FB zpeke-B`wc_>>##6Z<9*oDfZOwr-9QXaszGf!d>B(@PT)~<K0u;55v>pN8OLZGvO!Q z&myyt^@{fQ{0SVe{=(->URC}7qUcVw_Nuv8@j^vga>9i;U0XcPvAUei+T9l1dZC1S zvw77tO;qlJ-n?QvHC3zrQa#ZnA0`sW9tyQojJ!I6wWj{qKdQ47uvP<<EJbZ2&>?mu zuf}CDl~e}PgGot@_N9rNAi+djO1Fu%qXxe?YV!HTzG&~D)GzvY*+-92N8u2KDr~n` zRnSKx`w3)<dXtGnREjC|X^QH19<sY2i2Lk{w{hXfbMK;ep>)}?-0?EF5?pRsYkL)Y zE4`N1&t6)$Mb`NU`4RlK*NxLxmt&yTHfs%an+VL3e+IRk6eybt^lp^n1SU|{$g<^G zE5in|CKX(42(pa_2yQl7*dCZ-Hj%n3-_%{3M@NN%KG0^i(!n}UhHp<KV^=Q619BTl WsAQCXlL3J5hAw~}$Rc%9oBjYkswigw delta 1317 zcmb7DT}V_x6rQ>F&fP!P{c-)N)%E)CmPD2zR){~41!5^>B1OvXmTP%e=B|bkXdvZF zpq&SO36!7|kqTdW>F+6`2L<t=1)qYV2f;MxrH5u_cU?svYL@-x%y-T`bLKlUv*nAW zouBP?D`Ml+ny2R(v%d00a*%|v-NB40B%vl0L}Mt37o@nSlW`#wl-N&RkP{qcoD{;) z?8<d4;5doVkm4tSNmu4%=XG2+`MMrVxEL!?f%BjZzrj9mO8Lqo$2NLwI|Qn78{SG! zunVrqhp`*(%K6v=Q}Pw;iMu~#XR*XIhl7`a!3)wf>V|JhK}kBNeH=Ut0*M-!iIBqn zywL3~s32Z=N9<UFS866WO{#q-a02TcP)V}D#z^k>?(v-vzN=~tRFMpLs#c46L#<Bb zvhC#37e(|%dl9VIRM68bkZ&RfMj9e=%@oh$-Ib$8crKU|o>VnKYt#hwHXk%AW>_}c z>?VFnKJKAj36>=<Y^D?Id|C_T-K5#zvYabcsDm$rPIhL+WFt!FF?BK9;FWVF$1Nqc z3{Dg=W)v;0TMDuFUj^MO*j_RBi=7lSDUmZFY!PdVL(;#C({HFrcS^zC8YOk!uU=Bu z{ojjH4$zrz>`C?LKlN6#3Yl)Sm_sR7Fez!8qs(?RB`K_1{=f}qDfTQqa1P<>jK%>< zLwZ!}j~L--IHI4{%7>*2ZP@Cs&~A1I!ul=EZ>D8Dub)F62MrqC1-ZO+^az8PDG=%F z>(+w?zvr5G6r=8J+yK*VqqJn^^7HoD_L=i@4Rg^KgY$!PJuiFTdp`O;_*UvJtvFg& z%&pV|l^I7zc<&QCa4WTI316OMFdu(l)XfRLn*e@Tql&>8+ENtKgtyXUQoCgpkVRVX z*6~b+o5$>=4NuFPNX*7BF^d-~(v19IDUi6eEq+B%F+wAQAsQq7G^|JCwN>*Vek(;4 zG4t8JNO0gzsFt2#oG67?x+!Cfe@iVGx8a{CK6OdRl0M!&;hJb%HRp_yFNlnW9!Bm* MR@Lk^ltV<;zcX_NV*mgE diff --git a/__pycache__/Plateau.cpython-312.pyc b/__pycache__/Plateau.cpython-312.pyc index 986dfdb773b6ec17b358aa2cbd922577b288cfd3..c90c8b8878f00b6654ad2820b65d992365f6dee4 100644 GIT binary patch delta 19 ZcmdlYutk9DG%qg~0}wd9*~q2E0RS>g1f2i? delta 19 ZcmdlYutk9DG%qg~0}#Z$-pHlJ0RS@Z1h@bI diff --git a/rover.py b/rover.py index 75d1331..34c4d81 100644 --- a/rover.py +++ b/rover.py @@ -481,4 +481,5 @@ class TestRover(unittest.TestCase): if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() + diff --git a/src/Mars.py b/src/Mars.py new file mode 100644 index 0000000..b97387e --- /dev/null +++ b/src/Mars.py @@ -0,0 +1,86 @@ +from MarsRover import Rover +from Plateau import Plateau + +class Mars(Rover): + def __init__(self, x, y, direction, plateau): + super().__init__(x, y, direction) + self.plateau = plateau + self.plateau.move(x, y) + + def drive(self, cmd) -> str: + executed_commands = [] + for command in cmd: + if command == 'F': + next_x, next_y = self.calculate_next_positions(self.x, self.y, self.direction) + if self.plateau.obstacle_detection_system(self.x, self.y, self.direction): + self.move_forward() + executed_commands += command + else: + return f"Obstacle detected at {next_x}, {next_y}. Stopping movement." + elif command == 'B': + prev_x, prev_y = self.calculate_next_positions(self.x, self.y, self.direction) + if self.plateau.obstacle_detection_system(self.x, self.y, self.direction): + self.move_backward() + executed_commands += command + else: + return f"Obstacle detected at {prev_x}, {prev_y}. Stopping movement." + elif command == 'L': + self.turn_left() + executed_commands += command + elif command == 'R': + self.turn_right() + executed_commands += command + else: + raise ValueError(f"Unknown command: {command}") + return f"Final position: {self.x}, {self.y}, facing {self.direction}." + + + def calculate_next_positions(self, x, y, direction): + if direction == 'N': + y += 1 + elif direction == 'S': + y -= 1 + elif direction == 'E': + x += 1 + elif direction == 'W': + x -= 1 + elif direction == 'NE': + x += 1 + y += 1 + elif direction == 'NW': + x -= 1 + y += 1 + elif direction == 'SE': + x += 1 + y -= 1 + elif direction == 'SW': + x -= 1 + y -= 1 + return x, y + + def _calculate_prev_positions(self, x, y, direction): + if direction == 'N': + y -= 1 + elif direction == 'S': + y += 1 + elif direction == 'E': + x -= 1 + elif direction == 'W': + x += 1 + elif direction == 'NE': + x -= 1 + y -= 1 + elif direction == 'NW': + x += 1 + y -= 1 + elif direction == 'SE': + x -= 1 + y += 1 + elif direction == 'SW': + x += 1 + y += 1 + return x, y + +plateau = Plateau(16, 16, [(3, 5), (4, 6)]) +mars = Mars(3, 6, 'N', plateau) +mars.drive("FFRF") \ No newline at end of file diff --git a/src/MarsMap.py b/src/MarsMap.py new file mode 100644 index 0000000..e69de29 diff --git a/MarsRover.py b/src/MarsRover.py similarity index 95% rename from MarsRover.py rename to src/MarsRover.py index 8677861..badc2f2 100644 --- a/MarsRover.py +++ b/src/MarsRover.py @@ -5,6 +5,7 @@ class Rover: self.y = y self.direction = direction self.directions = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'] + self.history = [] def turn_left(self): current_index = self.directions.index(self.direction) @@ -76,5 +77,5 @@ class Rover: else: raise ValueError(f"Unknown command: {command}") - return f"Current position: ({self.x}, {self.y}), facing {self.direction}" + return f"Rover position after movement: ({self.x}, {self.y}), facing {self.direction}" \ No newline at end of file diff --git a/src/MissionControl.py b/src/MissionControl.py new file mode 100644 index 0000000..8cb2c66 --- /dev/null +++ b/src/MissionControl.py @@ -0,0 +1,65 @@ +from MarsRover import Rover +from Mars import Mars +from Plateau import Plateau + +import re + +class Map: + def __init__(self): + self.obstacles = set() + self.rover_position = None + self.size_x = None + self.size_y = None + + def update_rover_position(self, x, y): + self.rover_position = (x, y) + + def add_obstacle(self, x, y): + self.obstacles.add((x, y)) + + def update_boundaries(self, x, y): + if self.size_x is None or x >= self.size_x: + self.size_x = x + 1 + if self.size_y is None or y >= self.size_y: + self.size_y = y + 1 + + if x < 0: + pass + if y < 0: + pass + + +class MissionControl: + def __init__(self, rover): + self.rover = rover + self.map = Map() + self.rover_position = (rover.x, rover.y) + self.rover_direction = rover.direction + self.map.update_rover_position(rover.x, rover.y) + + def send_command(self, command:str): + result = self.rover.drive(command) + print("Rove response:" + result) + + if result.startswith("Final position:"): + match = re.search(r"Final position: (\d+), (\d+), facing (\w+)", result) + if match: + x, y, direction = map(str.strip, match.groups()) + self.rover_position = (int(x), int(y)) + self.rover_direction = direction + self.map.update_rover_position(int(x), int(y)) + self.map.update_boundaries(int(x), int(y)) + + elif "Obstacle detected at" in result: + match = re.search(r"Obstacle detected at (\d+), (\d+)", result) + if match: + obstacle_x, obstacle_y = map(int, match.groups()) + self.map.add_obstacle(obstacle_x, obstacle_y) + + print(f"Mission Control: Rover position: {self.rover_position}, Obstacles: {self.map.obstacles}, Direction: {self.rover_direction}") + +plateau= Plateau(16, 16, [(3, 5), (4, 6)]) +rover = Mars(3, 6, 'N', plateau) +mission_control = MissionControl(rover) +mission_control.send_command("B") + diff --git a/Plateau.py b/src/Plateau.py similarity index 100% rename from Plateau.py rename to src/Plateau.py diff --git a/src/__pycache__/Map.cpython-312.pyc b/src/__pycache__/Map.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74d6c4e3990a24af8545f47c09025b99acbc307f GIT binary patch literal 219 zcmX@j%ge<81R-*w86f&Gh(HIQS%4zb87dhx8U0o=6fpsLpFwJVRV7=+gche36~}l4 z#Q5i>x)f!WrN#slC01k>7Zl}ZrDm5X1gGYv7MG+JDVW6+AWP_$q$X$N<>%z5XQn14 z7H6gwm89xs=H=y=C6;97=cVSw<R%ss=Vlfc19{2$c_l^pIWfgW$uYi(1$qUQw>WHa d^HWN5QtgUZflgrr;$jfvBQql-V-Yiu1pvIQKa~Ig literal 0 HcmV?d00001 diff --git a/src/__pycache__/Mars.cpython-312.pyc b/src/__pycache__/Mars.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..edc9b489eb8f9280cecc83f6509e324bf2521582 GIT binary patch literal 3609 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 O#?i?){*8DmmiYn4dq#}_ literal 0 HcmV?d00001 diff --git a/src/__pycache__/MarsMap.cpython-312.pyc b/src/__pycache__/MarsMap.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ead88b8634e2fe2d147aeffe872c33ef9090d57 GIT binary patch literal 223 zcmX@j%ge<81R-*w86f&Gh(HIQS%4zb87dhx8U0o=6fpsLpFwJV)g@cSgche36~}l4 z#Q5i>x)f!WrN#slC01k>7Zl}ZrDm5X1gGYv7MG+JDVW6+AWP_$q$X$N<>%z5XQn14 z7H6gwm89xs=H=y=C6;97=cVSw<R%ss=Vlfc19{2$c_l^pIWfgW$uYh_Vc*08y@JYH g95%W6DWy57c15f}=P&|sF^KVznURsPh#ANN0N!pvEC2ui literal 0 HcmV?d00001 diff --git a/src/__pycache__/MarsRover.cpython-312.pyc b/src/__pycache__/MarsRover.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6b7242259072a3155611f429bdbc8f52965aca8 GIT binary patch literal 5157 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 literal 0 HcmV?d00001 diff --git a/src/__pycache__/Plateau.cpython-312.pyc b/src/__pycache__/Plateau.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ef4b349085591b9c1d9f4698e71587994190de4 GIT binary patch literal 2104 zcmb_dO>7%g5PolW?f5spZqneExN?ZtptgcS4~4Y2Y6^-J6OmSxg6Y=rzNDMjyUE*4 zh%E;dDF+u-BIS})2oa=8xbzZEP>Dmz35iRRQemw)MB-G$A=H&nIWe>TiCdKe5>MLs z`DW(Ld!BjYpMpUjfpz+i(B%#{A-|zgTT)dh?+0Op2;?oIk|m<j+d{=MMzVq|rfUAk zJyoR~2VsRUGDcN0Ca8W@V4^C*C#iJ8t-6+6W0L9yy{V3QmZULP9rH4`DzT;skLm;5 zlcjRNZW>7^EtZ^%+ip|KF=e63v$mTvYmV!w+L`efP4J2Em45)TLh>|E6p$(_FMvkt zn)s2B7j-&G0IlAR5DRy3R$jPW^*uvAky64WNeS<V30agHeCRWL;5>_xO0Emn+!Dkr zN+2DqNRX+1S{3uUYT2^jNgeMG8l+n^F1tB~aP+jj#<*!EQ)y<}E}qmUnJrCnO|_f3 zG0(U%W0;zy8M^GUC6lEm_9D3#!>MB8HW6HZf0#OvIBzm;Cf*)NyrZ)-T$^W!5uRMo z%o%P>v1uzZ$}-Hf7>^uJ%rqJfTP$^1H`2zW#>SJT#<;}}Yr1aCCow<M6PYA8Gn#3F zmNImU8|j3}Q;BLZkIZCkkD_S0W+_UpwT9LZtcH0B$Q82Fd7vO&^Ovfu@91XV>o>YL z+5v2S<R$~B=|<o8!}mf%cZSzzZw?mwZVunu_sW;UtFxb~Ybbs<ycHS(Z||;~^h68N zeNXuD!zR*s?D2MJ$n1n9U$w^$NO!!kF5g|j1>)T<q&8i!X*Pw;R9jdFr@798;53&o zfh|?D6RYm6LgP)<@jc-)@_D_jD9I98i08WB#o|RWK-Gw4L~2z$5s?KRfLPl#!!_NK zMIHo=w;^c<Vq!WdC2s+4OSnNUQ2Q-WL)?4;$Q4rRiL4!3ohV2@d&0kZf}5>!vG<q$ zfvx_5P5I<z^QrruH_PA%Ev9OmrLc-mJS;4UbN4tr3b?zd(&-oB9PYfJ3OP8}qM%;_ zRBS-I9P~V(QWd3DU#brQ>S{pIm+Gegbvvj(U-xaua1`uK4R$B0!QKOQPlFxLMIC$P zEG=O7I(DD4|6aUf2h2AOH#MU;IG$C%=>%9quw%uq1xLzMeR$vxSXt=DX%=pgcY0(B zd*`V&?|5VbaxiYw_yZg^HXXI;piM8>LVOTD;G@7tFFe55v*(}%a3g0JI8R!Zp6Uq> z7a=A(L1R=qqq{aW6qUil#o8)n7T$Fxcc|7b|LPLL{eA}mJ>(CqirfBhDG*$4yL$F& ztQ72Ajcx}I{zss9JNSGxq!4=|_W!aJVmtmoVfN$KmSd}-FTyv%+o9efEylift+%bK z-%fusz5Q~m)Ukgj5G>3VjxV2Exp@8JmOlzmsilMCRN(lxCVO#A>B$UJ6x*jL8AF{* zqa09_*|}u8Y7yae@>UGm2gDXli`&w;VWfE!^joB|A-+bAZ^$87Zu31LOXN?%=ZdbT zb_uXz)L|RFWz=?`gNa0!!Gs)Lkgus_hwu8ru2AvVE&;Y)VH*|p<ExJltmMU%ahX<9 l_hWwNe$LSFyivK*N&XTToHHT5D^g1T5{}T&LjuGJ_y_p!{kZ@D literal 0 HcmV?d00001 -- GitLab