From f1ab19f00368a8d1dda02c2db58499bc68e54023 Mon Sep 17 00:00:00 2001 From: Big Pappa Date: Sun, 11 Oct 2026 14:14:10 -0500 Subject: [PATCH] Initial Development - /cab remove complete - /cab search etc complete --- .../rstaxi/commands/CabCommand.java | 54 +++++- .../rstaxi/commands/CabSearchCommand.java | 31 +-- .../rstaxi/commands/CabTabCompleter.java | 178 ++++++++++-------- .../rsscripting/rstaxi/stops/StopManager.java | 12 ++ target/RS-Taxi-0.1.0.jar | Bin 24409 -> 24741 bytes .../rstaxi/commands/CabCommand.class | Bin 7022 -> 7981 bytes .../rstaxi/stops/StopManager.class | Bin 6552 -> 6889 bytes 7 files changed, 170 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java b/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java index 328ea49..14da11e 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabCommand.java @@ -196,14 +196,66 @@ public final class CabCommand implements CommandExecutor { return checkPermission(sender, "rs-cab.edit"); } + private boolean handleRemove( CommandSender sender, String[] args ) { - return checkPermission(sender, "rs-cab.delete"); + if (!sender.hasPermission("rs-cab.delete")) { + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("general.no-permission") + ); + return true; + } + + if (args.length < 2) { + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("general.invalid-usage") + ); + return true; + } + + String name = String.join( + " ", + java.util.Arrays.copyOfRange(args, 1, args.length) + ).trim(); + + try { + if (stopManager.delete(name)) { + sender.sendMessage( + plugin.getLanguageManager().getMessage( + "stop.deleted", + Map.of("stop", name) + ) + ); + } else { + sender.sendMessage( + plugin.getLanguageManager().getMessage( + "general.unknown-stop", + Map.of("stop", name) + ) + ); + } + } catch (SQLException e) { + plugin.getLogger().log( + java.util.logging.Level.SEVERE, + "Failed to delete taxi stop: " + name, + e + ); + + sender.sendMessage( + plugin.getLanguageManager() + .getMessage("stop.creation-error") + ); + } + + return true; } + private boolean handleList(CommandSender sender) { if (!sender.hasPermission("rs-cab.use")) { sender.sendMessage( diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java b/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java index 91224eb..b05db37 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabSearchCommand.java @@ -27,38 +27,25 @@ public final class CabSearchCommand { return true; } - if (args.length < 2) { + if (args.length < 3) { sendUsage(sender); return true; } - String query = String.join(" ", args) - .substring(args[0].length() + 1) - .trim(); + String searchType = args[1].toLowerCase(Locale.ROOT); + String value = String.join( + " ", + java.util.Arrays.copyOfRange(args, 2, args.length) + ).trim(); - if (query.isBlank()) { - sendUsage(sender); - return true; - } - - String lowerQuery = query.toLowerCase(Locale.ROOT); - boolean iconSearch = lowerQuery.startsWith("icon:"); - boolean textSearch = lowerQuery.startsWith("text:"); - - if (!iconSearch && !textSearch) { - sendUsage(sender); - return true; - } - - String value = query.substring(query.indexOf(':') + 1).trim(); - - if (value.isBlank()) { + if ((!searchType.equals("icon") && !searchType.equals("text")) + || value.isBlank()) { sendUsage(sender); return true; } try { - var stops = iconSearch + var stops = searchType.equals("icon") ? stopManager.searchByIcon(value) : stopManager.searchByName(value); diff --git a/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java b/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java index d789be8..e9b5333 100644 --- a/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java +++ b/src/main/java/com/rsscripting/rstaxi/commands/CabTabCompleter.java @@ -32,106 +32,120 @@ public final class CabTabCompleter implements TabCompleter { ) { List suggestions = new ArrayList<>(); - if (args.length == 1) { - String input = args[0].toLowerCase(Locale.ROOT); + try { + // /cab + if (args.length == 1) { + if (!sender.hasPermission("rs-cab.use")) { + return suggestions; + } - // Management commands first, in the requested order. - if (sender.hasPermission("rs-cab.add") - && "add".startsWith(input)) { - suggestions.add("add"); - } + String input = args[0].toLowerCase(Locale.ROOT); - if (sender.hasPermission("rs-cab.use") - && "search".startsWith(input)) { - suggestions.add("search"); - } - - if (sender.hasPermission("rs-cab.delete") - && "remove".startsWith(input)) { - suggestions.add("remove"); - } - - // Destinations follow the management commands. - if (sender.hasPermission("rs-cab.use")) { - try { - List stops = - stopManager.getAllStops(); - - stops.sort(Comparator.comparing( - StopManager.StopEntry::name, - String.CASE_INSENSITIVE_ORDER - )); - - for (StopManager.StopEntry stop : stops) { - String name = stop.name(); - - if (name.toLowerCase(Locale.ROOT) - .startsWith(input) - && !isReservedCommand(name)) { - suggestions.add(name); - } + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .startsWith(input)) { + suggestions.add(stop.name()); } - } catch (SQLException e) { - plugin.getLogger().log( - Level.WARNING, - "Failed to load taxi destinations for tab completion.", - e - ); - } - } - - return suggestions; - } - - // Preserve search prefix and icon suggestions. - if (args[0].equalsIgnoreCase("search") - && sender.hasPermission("rs-cab.use")) { - - String input = String.join(" ", args) - .substring(args[0].length() + 1); - - String lowerInput = input.toLowerCase(Locale.ROOT); - - if (args.length == 2 - && !lowerInput.startsWith("icon:")) { - if ("text:".startsWith(lowerInput)) { - suggestions.add("text:"); - } - - if ("icon:".startsWith(lowerInput)) { - suggestions.add("icon:"); } return suggestions; } - if (lowerInput.startsWith("icon:")) { - String iconPrefix = input.substring("icon:".length()) - .toLowerCase(Locale.ROOT); + // /cab remove + if (args[0].equalsIgnoreCase("remove")) { + if (!sender.hasPermission("rs-cab.delete")) { + return suggestions; + } + + String input = String.join( + " ", + java.util.Arrays.copyOfRange(args, 1, args.length) + ).toLowerCase(Locale.ROOT); + + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .startsWith(input)) { + suggestions.add(stop.name()); + } + } + + return suggestions; + } + + // /cab search ... + if (args[0].equalsIgnoreCase("search")) { + if (!sender.hasPermission("rs-cab.use")) { + return suggestions; + } + + // /cab search + if (args.length == 2) { + String input = args[1].toLowerCase(Locale.ROOT); + + if ("icon".startsWith(input)) { + suggestions.add("icon"); + } + + if ("text".startsWith(input)) { + suggestions.add("text"); + } + + return suggestions; + } + + // /cab search icon + if (args.length >= 3 + && args[1].equalsIgnoreCase("icon")) { + String input = args[2].toLowerCase(Locale.ROOT); - try { for (String icon : stopManager.getUsedIcons()) { if (icon.toLowerCase(Locale.ROOT) - .startsWith(iconPrefix)) { - suggestions.add("icon:" + icon); + .startsWith(input)) { + suggestions.add(icon); } } - } catch (SQLException e) { - plugin.getLogger().log( - Level.WARNING, - "Failed to load taxi icons for tab completion.", - e - ); + + return suggestions; + } + + // /cab search text + if (args.length >= 3 + && args[1].equalsIgnoreCase("text")) { + String input = String.join( + " ", + java.util.Arrays.copyOfRange(args, 2, args.length) + ).toLowerCase(Locale.ROOT); + + for (StopManager.StopEntry stop : getSortedStops()) { + if (stop.name().toLowerCase(Locale.ROOT) + .contains(input)) { + suggestions.add(stop.name()); + } + } + + return suggestions; } } + } catch (SQLException e) { + plugin.getLogger().log( + Level.WARNING, + "Failed to load taxi suggestions.", + e + ); } + return suggestions; } - private boolean isReservedCommand(String name) { - return name.equalsIgnoreCase("add") - || name.equalsIgnoreCase("remove") - || name.equalsIgnoreCase("search") - || name.equalsIgnoreCase("list"); + private List getSortedStops() + throws SQLException { + List stops = stopManager.getAllStops(); + + stops.sort(Comparator.comparing( + StopManager.StopEntry::name, + String.CASE_INSENSITIVE_ORDER + )); + + return stops; } } diff --git a/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java b/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java index 5b46520..b7419dc 100644 --- a/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java +++ b/src/main/java/com/rsscripting/rstaxi/stops/StopManager.java @@ -36,6 +36,18 @@ public final class StopManager { } } + public boolean delete(String name) throws SQLException { + String sql = "DELETE FROM stops WHERE name = ?"; + + try (PreparedStatement statement = connection() + .prepareStatement(sql)) { + + statement.setString(1, name); + return statement.executeUpdate() == 1; + } + } + + public boolean add( String name, String icon, diff --git a/target/RS-Taxi-0.1.0.jar b/target/RS-Taxi-0.1.0.jar index 3d1cf4873d595b159248f65599af8d82f1c8fcdc..a7a7e30609c4b4bd4dea5819b21e29061c300fdd 100644 GIT binary patch delta 11784 zcmZX41yCJ9mo5-IxH|;*;O_43T-@DVF7AGDcZc8}++Bi0a3{Ei054>B>wo*+%+&e% zoc^k(XR2npkF0ism-K-nD9L_;ga-qI1p}jWN<^T5_$yh1KV%!phg_roD?zZ}tRKJ+ z&i7wH15zS|1J!`T|BosFfCHWVMu}GX%KWDFbKi>0pOoRQ7N5d z^;VibzMi6*?Hk#-_zye(!&!r6u} zQs*m%b+^vO5=No;C&L=_vQf3!gLazvLNLYPOYX_VeDG%S)Y{`k97uMJS1URlBFi-; zzlM*YtIyUNB$w@bRgT{~HIvLF;q~tu|9qeJ=)TPvdCykd^1sYb1>-5%iiQAUSUa9j z2k9zxjI3C&NyZ!t-KOgKOd6_e>l4R?fzn{%&r%;}f?yiiJl!xvv46mr3{1gIz*F{L zo2F->Y0Pt>*dN~2p(1Ke5f0ZPl_^SGkB$m)(UxC~HQM=XA#vE@9l~lH7DP(M>|baZ zw|UuAE;xwwe<8z_^<>5`IVA$RKt-PkY$F`en(-VK0GK!haxx6v1dyI7^7m7MI{03y zP3i5~AFqMmP}!m7-~oXu6vJLTScV1pE17^|=UX^OEV5i(3N7YOCU+SUq+IDNk=W7M zw=>K2IM}e}x~mgG>d)k(6Ae?c?y_$5qBTOq`*MRDiA)a}sC^wBxmrNue6QuvStYIv z^SSJ`6$=T`u2FV=5YkGT+|_8y0r8D7_bEHuv89+{R6Gy48h~X9ecgeQ2VnwZvP##V z1AnMkdj!53!xI`Y8ZBIIy`qy}Ybp*Eo+gu>N2f0Jr}YIPGihpmSFMG&k`g5{Bk7b> zwmT=kC3@SW64y!JP&QCLeW2bi`+IU@V%^YcY_^+g)!jmY321(XUQ!T$v5(00q>WzI zhSzS%xDGupq?uUu!P(1fnV?AV7o(C`Ey`5W7JSU(h4Uh zUW7PudBoSCXYH&hOO|W`^`C;3zE8-G&0)wVZP3f`SUIexkljFV)>TpQxLG^axbDn{ z@y4%7g?70u6;r{;pU0sm%QKir<(+g>h3N5c?{~d%@Z3*egBUmdyqn53D-Y@~G;pEO zS553BSSVtea6+>ooWh#K=N|^E)rjQeOfny|$DKR|DDTN@1?JaRSq-v8*P|;FG7sWb zy6)7N8*|xe?`Q$pkYT)O;%OCaXz)G{vg%?qf+I^%DjI^7`-t&#ktE<@A`s7AEBnUS zcTtrFbh5rA#0itljgT-G3A@N_C}@wOM-neP1xJZ_48|al!z})g=Mf0Z!o^$~Wu(Jg zK5*Og!r7?Y1HmHzvhg0aIb;A;hnKTXN+%<-tW-%$>PEou=P!gFyNo<;>8FBqX07?< zwVk@5Z+WIP)C8Ml`Fu=;)rBp75@UDT!l9%Bx+usOUmO88?9^*MZUn=qEG@fZE7Hy_(2RMSrSw1tR>0!E9(0)tf*_8IGZOILaHmw->FmnK>Kqz5#-ic(*AJPB`tFEzw?!8L#SU}OSXvf;?6e)-z zUs#KGygG8eudm@-U92xHc#&8RV>XBNm_DFR%O%1!u3}{YNp96lr;QsUQj6yk>aHPCXDP zjbCE*P#3}`iOX^}Q^TX+(<8;`clrcpPicx-RcY>s-MYf^U}b`W%^j)n6_%$-^bVmn zfaZUSvqODazOEA&zxD?KN(LTNt4`ui zW6V`MTb2b~D^(kh*gXDL!GUBkFz?e*eM|AIs5je!+RP=Wj^sQTvA^P>F+$_Nh8UbY zIiyI?g~xtrB*Q9^q?0m>f5Ma3IgQvlej@(!4P6zV3{^etMx~p^zdQ=Xe9YsjHtZd^ z;3N^anO!mA?&*Ov0xBZvlH@ltW9ZzzN7+@bKCLJfE=NsY}0>eERyvt;%0n!*H@-5K%MV@*{ zfFhOSuOfGwzZvuFu@GTU4*HnIC7%IR!U9g!Pg%AUoRv+|SKpa;M0Y~yQ2_j8OmBW* z>txYd^a>Jg{lzw{&^c{L8Cc&e!&4Ub6Hg}@)FP~$1rq6iE3Rwz#q*6572jpO`;}d8 zN3R%J>qUpY))X?a&O4CzTW4pwQoszjmJes}NzBin7#q`PdX1dtO0yl6jiLfixVLEB z6EBlJq6MFXI&_&Bw)ba;p%Ot4tBY2&6?H{?9AlGU@XekteSq~ZVhWmx9$1tQ`{FI3*|`>55a zGXK~5bto;%)@Ud2b?r$u@pReKA%b6faS$!?_llyY_`~^&K*Yvx_MUhYCRg*q@F9F57J>O~QI-%4RIt~wQ+KGGt`4(3M_KFl9 zNoejc5lh>N*IHFcCBW9UN36-1Q%{xSBG;)-G`!BnTcHyh|M2VM)!Ew;ro&c0$DiHK zL*|y&o*1{U4Zp$&JR^RITbe_`0b=mOsH(t$h=a7$72QO9pKmDoQc{IM4 zCGXMXX|)!-Xv(R0xKZ<=Sa-4&(0^C|v4XxHU$)pg71~mHR>0UC0&ft-T|Q8i?FE8) zMWeg2S-Q5EC537ON|~E{ulfBsg-In>gWqSOB)3xYJG7Nrn9)}fd9|KX_6hhlQwnK1 zWtOAXckcuGpNc_`-%jkJ(|TluP6h zr%mZ}C`Ur%r!WQMHZVygT&b^@&1nqH=b2rmpAE!hOel^Ef$#bf4jtJ)*TwTXf_|>c zzOPPJ+4u3-isQfF*Af0Yo&ji4<*7I5=)q;N=(p1Nxjp<~|2%r;8$R7#haE~`p;T&Q zfw|04a;f!%$L(F7T@P(=L;kReZJF*3{^HN76zBllgOo@iew*X6Cm3O^{2o&CnZ{=H|-@_WI_w^seurYwqR zvQdu?FjSLiqh3WQpC=gP+_P?P@v_ zkj;yn>>!3dmG>G@=_kyX5Nn-nZIIy3Z5f~Q05t-KD~^ARK}@NpCn?mKTjx%Q)hEO* z;wl81Zq1suNU{!?ZVj*H9z62MR`Wp(3&lyo8G;oUexMXNpCTaam%Q@w#Xxp^pcaTj zZv#hf115fbz<114o7utY_HZ~@zvt+RTfb)A2sGFs@gI25^NpJGYb_^srM<$v-dku$ zc)h*W9)IDMxcc6J6kZbh3z{I&edFt^FKoya6mD;DL-;EsQ7Zm*#74~5ajI3p2r93= zB4^IHF;V)io{(>&CY}I=x_6A>^MH=fzLf;Hav+n&SZG6-k{_&#nSdh0ZY;d^Pfq0p zNo6_)1cq3GuL;e`lES~Wp#6qfj#*RT``qhQvOUJ{ol)D{$^%<_~RQjun#C zW}Hax{3k@GeE3_3(mMo*YVq_QxKfH5 zCdGm;^QJ?kW6N&7z!i)xdRjw#%Nw4FkQPgvqUFKu5}ZN0ZuK33P~Ei`Ha`(8{mS0b zK`F{|h42>b?SAlCRv0dSM%~2pG^5w{06v}=}iT*{;nOHw9Hq3)gb9M(L zG3KoS$;#~1KIHZB@aUR#h8>+s)nl%!EWMx(h-hCvL#LqK>MG)z67*cy@kO>mt&aX# zuWkb6`Uvtbd#Z@laXYF+{iwxq?+RLADO*gTWCYE#T+i{a#E*`b8jJkFmF<3)-?h0c zW|%NFGD#(zD5jlAfMQdGxhVR=dCde|?63{~3GSwj9aREbvMbSUnLhJInh|QfMAfVk zgsBq6&VpUDJ1}(KI>ASIB;z{aYfIU0XVQ~L-KvRYl&7{sS$WCfEGYG(Q?)YEKiV<= z2ipD8wgBF~zZHpd&7f*S6r4GG_w-w11Eb00ch@4x12nuwEV%Y$F71Gq`auq09j$WS z49=6+NN+=;pL!+F-7f?{8HclGULP9bWpfl{f~G8ApP+JU=ZQEXnid)fGdtVyj4RDI*jP}Ieax`gn`50WENa6 zka(ne=<-)Z(!xSRJmnCbf4|4chF?u)`-H(_slO~;Bx1I;892>G!kWgCYqd{K3eZB% zZ&pQyN8y^N&QRh@hMyzp+C)iIU`E_0y9i~S_=^vkV(g)2V-V*fVj9CX;7$U-360lN3;cAW4{#5`+^8|;<$-K@RosIN!rhck z5)PEnnC#%3SD&e~#pTox7khD6Dv8Nm05UMFr?L9nVyb_7A|ZwEP!pSDKzR|=Ua(WU zNw8n%gFCM_dzd0Q+0w`Kix|tF3&n(Hf8{_mOt@68$A5%plm0_SaZZ@HUn8 zw(XCJyxn&&PR%93k;=B9lj_@LQdG2e=h5(+mPm-;6FiYhJu(prE&POw&G5EPV0_>Invzkg;M%Gv0@@;Jw|qVP>iHHU)X@D+-!Ak zsgyi&afD&98T7D|*bpR%c{?Fk&j+43yBIV+Vva zTH12K!_!X7JojZOmw#HHh211`I#Qe5L%-9E3pk}#YuE=tbUL&ux{v#j9%(gQFI4}b z|8=o&z#VYwDI*Ra{_2@YN>LHwr!aK1DL2}V0L6a^mM)DHa7pWAgPiBVMH9F|p_mE*r@5YspE_>#hF}dUJt3I@R z<;Fq1+B_ArPH+i8AEz&v?f&!peRt1*lEjCt1sTq?pryBAv8&f)I zDQux0bLHb|`_Z1K@2KR4nh^}Bc1+b-t0;DU4Y=IFgxb=){sh2S0jenSVxfaWh$eQh zoITHm#wh9@a@(o2^uP)Ft5uW;Y&OVE#A|BuOG#W*r?QuNe=e!LAY>_f(#~UZ{w-zX zuF^V8LAIJ_CYm!#FPb|c^o`Z7&gi`Mk$Ne|aF-t2PeBozz}ah?LqBP+IoCCizm?yj z`UkSv%Z3fd>nZeLI4}^tnZkw=&jJ6}&1C)S672$iW=cVFD&BZwkSsH9-ppCbvI9d{ zd?L+NgImp+w37RKAniTO&v?!UWfhn4xp`Ll?<{*lv#NrZsY+NX!d&DE z3aZW5d1`Dc>jwD=aQU)h_+iK4(mL}A(4OrA5*8?y#d9gQ-GJ9RMVcgqn`s4N-wK{B zA2F+YVz#pw!T~&ghk)V2?+NbDBaR`O^-O!OVRXPFJ90 z?XDpz+3U}r+dwVUJ?#7kXuoUhiu7@%&|%)U8_gL}I{e~X0f3IHyj$UWb8I6V=%r+nWSwzM@O z5CN>$A?mIMU-l!_Du>JkBW;8$AQ)0XKg-v>5{qFg+_=MU`VRO|8(|ZekE>?W=M4~b zO$uK_ROt7;wvE1$5}C%pT)FUtv~q!AwfBU*dZrP)kIwy?Ay|J43cuELe&?NeC;7wA zN877h3J#Rs*>hbS=eD357RQkkgLy zO>cqe;jm+84%*NwB_gtZ<^=Sqo8Jomfs@_vx<*nqyGUu%Ba1gcMGIW3?G8^5YWu@( z?=99>0W8?md;U7|MztFZuYXLgsjza;;hCLnX0F((R(QL2a9oWcUZsXk)s`y;rs(L* z(>Fh>fhi$d!lW}!>3L<7_QvBs;1G~-Tih8q3k3h)YpZ@BAMD8A0C*ib7#RD%wKWfi z7^wB)fuTwGzAh{s{U~2K;Wt08aPAJ{QQ`d=DPs@4s7x_&iSxL;e2|) zmM*v;Ee52Tnh0hD`Q%Q7**e_BC>L}j{rVgdE*f8T3Cy{a+S%pY@1jFT$`alVar+E4 z4y$4)`^c31UvZC)R?1A0BmjuN3u_Ev=&d`FpHo)7Od98X~4khHj#zeeBr@c!kVjzPZD4jnP00B8W&AB~D&~>OxDcwxs(T z#KaXU)P#C<@Ax%X$M3<(kkomoF5sq~9zR6i%4AV0Sbw?ZYjsAxFK+knWA3&K{| ze1d$7ses?CqxevnwVYI`6MnjD^%4-4LzF3)ON`Gp1Ha|o(7WMHqN9*9(7~OX34F?S z5M^aY4)`dff2$O}UM_9&?n#ngK`tjS$;3P%aTV+UX-%txAc3)QZf4deony7!=2!olKoEk8`@+0S)X94GHEB7`^yI+r$VGN6j2F3uTQ&@HC1Pq--KdUKZfH>mKr zEBqvQKyH+j$7(=r+k7?~qiW07);4)+&dD^rb;l)}w}5-WENs)YGK5&>Yio_9i7rz8 z1Y!;l)MU5*aZ2XN9MM>er0+Ar#(n5H=jib;Ap>)h{KWnk?XCn%4YzjmOW8YdB4a_> z%(S0(6L$WV5RX(?U?d9YEHwx@6aNUGvr$9DfwP$NXa-1K#;yXp*EYvSxL)5h$+3yc z26Ju=$o#{S_28xin|UVMgx8ZKvlS61F7a!_xeK$`;i@HQtMZAEk#&(OG3E~3MJj%< zY3B_*_P4c9GbAr2zWc$|k5-S;$~>y^jMmVxg!x|w%nJnL=H|pi3$SK9TPsEi`{zyf zp=HXkw~;`D%9x_HM1|Wd?vm9O`-u*m$NV5c*y=V$Rm?7`I#+kKhcp6~r5n)tr$C1r z+++{d>CybIEk_2jY-}=to~c%S&&W?d*s?<{E%`o`>_Akyv*!+Nu)=l^qa%0ksrWnt zdMyxX>k>M3d^P6}%AE+lLR=`wm=F)jdS+N8@9+afD&bkII|4HGER@&JKYM-kjyK6? z#=#pPMb;Pc8ug&vXRzUk)s=M8b@3XY)`&N%5o$zJ8Fp;l9<)j7jE4t^*fa|66N|Hj z6Veh79h#IQJp;CJ1P=SALGRt!7P#jGLk}h^TR1U_s8}1QH{KP)+~-{(Ff&Fo?;_43 zGFU)5^GvTf4}vKSK_fe*8J9}<=OFJmc_wbC)X6^Q9|vEJY8=Fowii`taU!}E1<9cl*~{`y^uXGesWiah0nG4qlj-sX>W6P#zudo=>~i~h zAs9U7Unj3~n^8_BrfzF{Us8*7eUfwU6ZiW1#Eg6-#Xwm-Aw1m1s~C}HL-}nK%K0Uu z^M#x7upTJC^7V?+KXR)xXL-Q4s-HLcf$=Ru@XH51P`<$%mIvc$6v(UG?B#vHtdWqPCYQQ&CO_a+Z?2@bpCK=h+PKTI?boe?h9 z=Lhh+wXTeOeAE5q&!QnjxLUU{*ZCEaf^KdmHe~xr(2nvfn7D`wAM4N5g?mrN4E7|~ z@slu~MB9Z}ISq&C>sCeiDl(loqlSt{UFI?M#J$ z3%4|6rICpABk;I%nAIYUkPgj}kdiuCOmZsWp0u@wwrMunWP*CKnvlZGDb@L&@SqHa zmT}g2&RT4P95ZwgJLedMKTDbv1PTLz?*W1v_`k}0xOi3!B95%E3WDCqF;VX>C-zk$ z^MRztc?iERx4(6KJ)WVAeX{Ij{eioR74@9O3H{3c20?_pWb{1-5uU>sJ#chiV$J<% zWH?DemmFR5v$IpY<*@rT3f$*0@r+n*SxSx~S&7zuz*#{DEh71749Y?3XYk5nAa>_U zAxX@c6t27jo6|8CmpI1V7o7wp4@$*!X#es<5HKgrHxB zd}(z`j~RhJV%tVgoJLg0Bfb0;G1lo$KJZQs%5}1ykst?5sg42}%hsD_$nLVi`Z8cX zFWdH3SCNp5CXjqy8ddD2lgH!>Fh0gp+1!gP!}@IU;K!Jh3MbzRgUo^*T5YyXhBo7H zK~rLutBIOr_6+*z&muzv8WDDt@sr!aZJK@H1bkJ97&}SYohsJZcxQ}TcFX0N(N?WT&8~p6bgOR4 z>c`t>x(!byzP#mdug-~Bhlq7OeU35*8c#LH7Eb`-f>vRM^EzmlT9RDQ?%1A>@e3b} z=V0|J(=_;KD@Ao{zgxHoFnEU=hLv^|K?k)znChAkSCPgOZ$_%kb4g&NL5|tIDy&0y zk-byC)(kbh@2k;ji#k`m1Yh`(Sy%qH_#DFenYuF^=D zJY%Ww`Fc~wUWwf%K{I*eM?$7-l#k84Q4FOU90MylV}Gf0_;1QVk`VD&>&%jBjxAi1NHc-wM5vK253iiME-g?0qkY(q@aP} zhRqt(Lr9X!6Nx-ZXAM|m7fO?335BT#t6@vZzVY91B|RcK!1~_M8NMe5g^8z}^5LE% z4OwKl(ns@QwzKw7h|Qwm*ceY{zfuCVi8>U&=uCxTHa{50h~-fy=!}I@;J7J9(AKsdW@i~7IT^1#1o)@epNo>9m=Gey7M^&iivs1 z0$uW!%YC;K_~(`A(z}gziJyUrq`CTUSrX3W=@lCAs3^BbpUV;aJJzn*Pj<}eYxr*D zbTZVGS9HN%qgv+DJG58RT6xczGnuIrWB+?KH{{|9rKD@p2F$064hQ4ze`Z^;Dix+8rl?W#D9Wt?TW zJ*Io2K6g((yEB6WBC=|-%ytm@*%gNWVO#R4K5``_b{bOR8r@hmo=<)bV;TRC zp!MzHj({HEo*vs1SLvbd0A?S!mMC34+ci%`*(1(m9&G%mnT^-q*5TNG=X_7H z>K1vE@GDCUb531O%qLcCv7cO@5!&LKve4z1Lbin-+I<_gdnvfMh#zk$>M>`~zYhR8 zVED6PY7hE2STZ=T?OEqe3XeO-L?h%}LE-wfwqJ&g&U@Y35SMS)3*)Z~xdzWbcbI&3 z`M%Q@YJDKpUejCG$zAD~c}hj&JJqfsJucXm?P(+DWvVt_rQHiYP^a_BH{R$ziP1%y zW-nj-k!P;HJ(!L1a;2|64zXRqo4h~;5+hpw=8~sIx*v^NxV|uJNO=RiEU~79TsWLC zR0$apwMgp*{I~7Y>J07`H#0h&>9kc*6%DSblW_2T3>0evdCFcQ4=DfspB@<|>+~kebTj;DS2u?|;dBsK6@n7O;KqPhqabbvaI7b>)^Cox03fRs+hI#KBIlSf}Y8CYw@%TYFu?`p)m>YmCDTn;NoDFb~f2 z%A?iH%k-yd5yvC=tvISZxcspNzoGz^<${i!-kLlLXGpm^)_lSrYiTxqeV=&=Xye=W z3rQ0pf|0d4cgY^)RF+!}LIVH=G?n3MO3?t~6m8ZteH6*t4Jjnik(53nRvs^=dAdyW zd1y52#%0yOB?5a)>*LVCV9J;9Nn3le7l#|3p~fDEDx-j3csNve&|a&uO^-&*>vJk{ zERC1Nq!)!pn`%@35?yHwH(+j#33k^4*5_c~iS{@BhrJ`_E(a}qbCrOjSf%pcN>H%L zx-5@=Tk$R{uCqU@R#9?pld00(`##us&P?7XSqreJt2$It(y1-@XvmzENNCN+b(RXZ z3l*|g2J0&mTAv(aj9g;7k-r9)VL-i?KQik|nt2y!MVW0WD@Ca)Y1U#`DAP>q$j~$p zmzxSI4Rz}o1f|?lXz2kBLR27df`*GqwW=O(I?}s{cJFa>&oOmrvLaEnq))He+C5V} zX6A07o-$6rb!tl%d7Oz06^Tbg&k6CCk(54#TfReMDpkLN%i=0Xc&@31i5gna?Uif4 zg#N82NO4+Gk&s3XpSWWpy+h%u`lE@B*6!V$idGq%EecJ%^12JGyO;18^|4fVEu^t* zjUZhHzN5W}!uUATxjacM`OXnbr1#Xc1wZ@D9zM(59=y8|?K2qrW_!xb-9UaX(?(Qa z8Sad6&hEaPf8ioB$xZbZS-F4%xhry+K88sC%Dn;;s6K`>J}h#%51}wnP<#q~UfOFG zaI57IR1FAAZSCX9_BMu}A!_b%102qWA10;*Ww`Od_*?1t#TaPsu>Z*<joJb$eeNJ_Hc5E!5SCy@&x(IbFJ5&Xx0 z6GjDD>Jj{#-+vq|FfhjdHNSe1|0ZL9+!C~{M+8x*kfhH65upU)(*LN@2I=S%K!~e? xJpUS1)Ig}8Xh5s_|LU(V{&tva{<9cpAYm!VLj8ROU|JIUYqCj+2a4+I0w z{uczn1^zeCf=a;A|Hs_@k4Xaf=j8cTo0RGZ}(gE~;VHm*w7r-IJQJeMT4SS(H znjsOvz?|^Gz*s;eba)^W0|XF~0U|J02i99-5%b-dEt8u98I6j5O+QcBwys;x#LfS-Kt`}jeMuyZV7K(XNn8#D?OAjfA0Aqpu;w@->aH%1 z{56*)`-_Jke3($(J4gx2CI;?Vwv&44O%<9f3MNu`nL*m{HIL9;Ir3(yT+?T+_M|`- zeDNgeCsqR!vDK$))D5}bXjC8#3JwuYg@TC|AL0pP!GR>e()JLS6xi?5dJBv>oaghv zGl&wf9i_o6W|bltJH{_@pT~8HBCFMBUq9fVs#MYqPi<&RIvQqOv5wLSq9$j8vy0*zP#vT7c8>Xrs0m zLOn-3HGF?Ke?#@_Ap(Z>z^~vx)Z8ogM2F7_ix<7?l3=$Ms*b428tI#UO@mORi%)`B z{So}Bmb@!lvzcOonH@V7B1V&8U@pv`oe?EN0Om+uIYF{2`arF&$a%qVC$Y9b(ZpiT zVgvg&tdsJ07i9!6HWe;j+ZCXMf%B59N^NpAD?aUEkx{P*768PWp`R9TR#@USQL90u zhTZo%780!RsREQSrUvG>@#9w&(AsG407%bYg)!$HIT|Fn5n3V3QcA)03k`X7;*g+n z=>&AhRc-@n(+a=KnPrA(Og69fS4<$`r83p@&^a9Q>VW6N2?G!`#k{`|o!{a_j9tkW z2h$v=LAf&jdIhEi4`WnT4@J0a!6ATkAm=0ELrHu=h)~zaiJphq;|!EtN1TXR@Uk1w z`t;?}{p4-8bxR~m<~1{V-jYJEr?ZZHfwt?r#*KT^1iT$2zjrCZ48C|A6<`N%&ijp6;%A!iN!;W-;w1y^&+-&!V_^oVe`?;#6 zKB1k5m$krHJ-+!|v!@lHpQ|&%^yy{Ty606;?1WsRr z1opjbN!h)lWkh68cOhElvb!{=2Av@fOIv!4mFa+-a|P0hGT+!;x;)!Lw$MHwI+*7! zuXZ+fm=?<;%h*Eong56FT{7X!M> z7MW195<2v~0Fn7_!Cawytaesgvpb>>e!r8?bNQzQpP&QEvZdYN8}uG^Ypnj$=`9@d za5mlM;F{_R8MES6F;4g@*SBE^c5Y@TY2Oq89CyCn2WrikRIiCwPFb+#yK2~+kK#`888_3Hc>U_3L1f90;Qo9jy<8As65 zcd`I;nQwtLyZEo^1iR*A{mt}JFmOmL2?P#g{IW~<{)Hsm-ifH@PLkYfVlJc!@&F*P zZ(L*bYf1})rp~lqf4S#P$U2h)1uLtB$w9&MX{1Y*;yz3MDMX;k(FuB)>T#E6s6I!M zwZ`i3>@X7r9A?twwo*d%C-#Hnz*dR*`E{!VWn+v>yXDYH%3&Y6WUX#Ty;<_L1||85 zd2ta%e1%@3nFU$=Kx48+V?mt$@^l#>Dgv##4?A+al?Zw-P;_t_liOv=tLD4@a#f4` zZXaygf%I22SdGwCU2t?QcXn9lXa#9$AhbVL?+o zI_a>6b8@iX(wLUb1e|D!bWjgC=)w#7&qe#*ev3)@4n(oZZ;BX^E_0W6JMpLiSBOJjzWwC_D z=7N((3;?=b-@r{Kp1O2z!5!25#~TR%q(GPg4zFwdNJOpK7URGY_``foM#@@yeA@%$U}q ziV!~)GM?}6AQ+`hC_#uc!qmr>uG!RJMw+j&$aUv7uF>7!CA-ac@s2ewVoeYtU!RIAi(Arc%?Tsq0 z`_St6)JB3o6#f3n;4=}saj_JB?!3M!^2MO9I|Sw%x5=e53RAsvMl1RTTBLB?b}S6n zq7DJpO9yJsRw!R2kg_f%GC;LOt-xX_XJaV?d>x0q*6K74gcRm0|43RsVpTNNyLQ%@L^Q6y!%{oxso-oQ>>o|77f4 zx1D~=*q`#STlB*c28>@_;xb~0R43hph<|#v8#S{kd+t&F2*w}5TMG53%MV@~)@|3! z8TuXW?`1UjbY~v=mBr zU6rb7hV}klDzFVvst#rYx5LzhOHW2Pg zf-@Vu6VS02AxVBuvf-q@zhx(x(h$l4RryRG`&(<%&QSpCzu#0Qx4dy3i7IG?0K zt^|3!+%-^_95Jcdl)kS1gE2(=GsPuO)dWF81{3X)bZE zjI^G;d16PP(4`JYd2{aT7y$+!_lufDiQK#+3l!;VsmW%;=W-D?WB){nh@0Mo-2jXa z2@_QD4|ZOABzj}mqCj9ACF!f9knuuV)VN7|Q$6q;Lyl}0S!lGt`6T9-f07_0?crT` z7REg;!n`lQo!RFVucvm@vi@-;`&4Z`g;1H=pOr$=^#^CR9p%HL0xMkRIEOM#f2 z{;xy>zJx~QY22B*-6LIxj=#?oH}9|5rnby=`ev@*aE^A-Pv4_NZ@{^lKIHsISuhNK z$r}L2j&==sf?lo}L*Gb3-@qPWav^&K(PX#-o7y6WQiQ^JYUpDf+on#T0 zy4H-n1)Z)jQ+1!Mg@Dveb@(?9-Xe6vZrB&z5!fiq7~I(P3foMUDt5(`?`TcaYg&ol z;YJ8}-l6~2YZ!m(H5jnJRTL?5QF}Br7?=n$7#P?8siKI1x!SrO=*zh8wTwRdHz={O z4jO>Z^|A+=B4T0;BqQ-)+=HJcS@qLn4@8OdmohSw8nV-vY?GNzl(1#eISh}*(q~Cr z=H@&U%CJ_-lo%rC{@xn)Z~Mjfv&)I&-s*nMKB(s6g`By1|DMP`f+(Fv6@*Ua%5$+dQ?L zdlDc6f;&bEi@}~Aw9!K@2%GvSediSz4$vSW% zb1k$&OMzmN?0OjM#isCjP+V`ydypZvLyC!_@p5TXoy>Da6ZHzH+?~-;kB+5sw&eCJ zzGc)vd(W8^4b2-Z35;g@W07)^`wt7nHq{C7h`nnH7iZokXDHc^&-TZn8lU2r7+7h} z+Ei0TH)~CyFVQPfpA#_a+oaIi;1Me!R%l7|Gz6jy;fUsDV^*R8wBxAPih6AMdy}5W z`Lh=#u6))O>Qd(xr7>(=a;|?H#3AZT^%98=wE z3vy1{S!IE8;=WLC1wzwm+^m%*a^g~*m$j)LdCYtB?3eyv7%jCTwDjX#IR>MifDF?c z>;d$M@39~PM?@qULKefc9Qy_(Jn~6kDjv>F0{hm^narXLHQ>`Mt@c68SjaPyykFcyLn>XF}U0OutT@kPu z6sk;_6=_cYsmZD8qi@zXuu%C6*R=jwM!IYViAv0xx(J6i<29$fyyI@p$v_1lSL4h# zrbpi3TuU`GOy5ic&1)a6Lg>#*)VGUMMdff7D@0Y5 zhxpi4`t_96VXYD3`MnW(Z0h?du6sAX_VLf&K>M8h7Fc$Bgu}8i1V0J3WJHNqF#hNH* zR7^X$6h)5BC7zK?v&jq1GCvP~MOsA5lyW5hyz^gb*2X@SRunFV9vR>{&^m&d-93501ywoA)d zo+4Ug+PvXzxFY;6Y8^&f1M>1{xC+&ZseJEPhdQVjcjgSsVeK&5wZ#xZu4~w%laM~b zq#>*`nZEg6rQ-)RfGvn5d|eS>aMn>P&Ztbvu^pLQD-uV%GZxeanmd;5j+%tRT_mLm z6N~-)2_L(@5Dt5GVf6+rMSu%>?Y7+u+)(q{@U-(12yQ2BO|<5p4h(tnG8}?1T;#u9 zx$qN6XgjzWH}N8Zo=I2fWF}7T~-_BT@1tX{|payo1XWovX3Rc~q;G&_)znuL0e0 zMSNUHhzc5YXMZ7{bdx}w+v9r`XysG7F6WHyJ*=6q{N_=846s#D;>7P-;HXF58%KL$ z2b;UsA(Lmr|Weo zZ~pi%Oy3z)39#2(#qM1>_`nP)Sg0b}i3ezzKde-wg=)M%2?xua@OFpM!z7kr`s6{d zU12qWy6kmKw1D3>CcVS+)~LmvX#+>U@k6Zjg5g zd-9qFGckNY1@8I@3!+;iG;RTAVIqO{XV#7h_k`ROQx)q_gc>0i24jsG1;v~FGhrVc zskQ8rU)Trye;?k;py@{=STHao3=lY;08rb{14A44W5WWp>JWj31yfy`s3ylPJCPRI z>TnDp2B4KMSVf^|4xhM8L|8p%U~eMTuva~qj7F~4yH>5%^4D-|2umjus`#mOR)twp zv()FSBuMZkf5BVP$KOPnZNcs08$afroa=n~)V}q!vGummG4t`VZwog4EDuIW1JvAB zSB-EB{(A8<2us%XByYU)^1^ozmB!er1n~$fc+SPq8tSz|1w};_R+A)|<%K-Wk(z;g z567d?K^mW9-=!~2>1PsEO_%tY6Wa?r?ZyvAsmYQ?K`A{GrRpeWzwXckDJX52u$YyV z_{;`!*Z11RIlTlYC>B`F#t2$~J8&o+<|36TD4>hXg) zE@<*3xpO#+ILx7=^eG#n6DTp}NS9^~#lKw4KdDaJk;s)zTpJgc*ULH{*PwQ=X@g2L z&z8Bs6ylk(+Umf!Q~xd_uVhngQdp(gy!$!$wCv#Kkg>+`=CIYpr4ofWWhxEOf@4|bgxqd(6S);(m~b zdb4RRnB{eOO2={8F|=@i!cWAS4cNrw=_U6b3G-)UEt+&fg}b1YG0oJ-tO70``jf2|GO;?m zhf1J@B~TWjb&}zhf&ePUFw@kgIhHnXmH*^`F~@ncU1Tpg*$T89pLVQYW$AXOJsd}L zYrItSdi?>RFL{eFJYAhStB;Vm-^}__B-)9>L$5GTifo(N(m8KWbwT&)fgq0nl#e6M zGWgU3#|%@=^!r9YbrSye`wT2^`rYupTQ^2OGw_BUs!!_%|1}MVz?EeV!YZHWi|yNn zY+Q%^S~H|DlJ|Gb$D_WU3}d(FS&CUKCJWSlU7th`ck}d$35(&+y}$GEqg7B zc*26e4i?7Ky3zWtT$Bc`C>KA1GYG9OEUy}XlP>r~FI#PeU`FsF)()})BYN|;o3d(I zj=;0lb;Tht)$7jwmh{xt5MlVKyp@#x+gP8L>pKAbH6$?fR_R;9Q$hFgjqW#BBbZ+= zmc5>X()b0PmpBrJZ>lt&$PJ(cA0`DciEkYhzm{uQgIoRw`Lv>STmx@FQSqB7m7c8WXRYuTb7mZ&R80LS|78B__{8m-G5P zDFvRaA+f{0MWXNq$rd(lhoI|dgv31z;4^GgONzvaY@Zau$#oUgkzy< z{9)4m`jOW+Ha-;s%Y@;G^!#DjVsb9R)`C$H+r?}qwcn(BY(rn}Mj!pm-K1ttz&?k4 zE4_y?Kid7>+goggAKD4w>+_zrnc{JDhF^xv z&IjXSTQQJHzbVgHdgpL2&+7y?>3m7|W)+OY>W;@)OLwG5yBQ{sxC<9oOL1Q_D1P&we31>s&DhFdYunGt`EBGuVNxMG?a zKxH-;$r07(MZRusqIVQZ91hy^v9jajdhSv)_Np= zF0J)|+p-*^AI|>sut+m>vYz(f_FJgfr;~l*EvWM#!wtM!hDl3>-R}{Kqup$|=0j`( z4ytl{jiw`riS8G7s#y*FXGWj3`45o5jd(hH;4sh#!=1q$d5c1M0k{Z_jq)3swM)pm ziC&@3i+f14;$cAivR1`Ea)&(pK9XWYE8$>spmy2DZQZl70F((VZ19mKHr|K~1d zp5BB`{`%=pPrC_~ZVcux{$z82{);kv+E9P7P#6#5U+Wqg>0wM19tS?qh$H_!EE)uKn6eBOSsL!i&j z?|zk=`4aH7nK|?RwiyW)@*D%tS&?cAR5ytf7aJ1t?8B3(nD`;GwHctNkiNZwqCEPb zh-Q}^5bEhtq!b}9Du@9)-LN1*0-7FWyJ;pWSEH(`Qoj+=QZ8)@rUCjbmhgSGw4ur! zj~fM{F~QFiE)Wx%%wG`AxvB-NBKkeZtm@sGHEK-Bznktaoryh4s``oLNhmT_O0| zI9I@Or0K$|C8yF%%a}IbLdeSqbXT!SaVRmKJVf)=K*zTkq{FSktQKv8^eT;l)K|-% zLsW?j_l^l^2?2Z5Axm8xPG)4QW$>O@neEr1@)X&~o;9!;(S)lVaIr{A~Nomo(gfzCNPz~4R4YMH}P zTl@!4ME8DIyLG<(SBhf~D;YDKE2x{evA)^dFFl&?{!G|Qd%n2bH0`L40%CORcq`fX z#0h7?E_7vw!Jp&pels;hg~gnVpy8UQ2(1Ujv2oF^#4_$nb_79YVv()8ZHhp-m|^F_ zb69IqhAJgxovk8K!@ASHPm57}d7iDXF#XDqNo=eDcYr=P)Y#?wZb6C3jC#TGBRLpz)#qQl~` zDTU!AlR=bGR96-m2+~m}B_(MVkW-tg-el~Cd5}Pe4<@VG|BC&2iT^ny<05OhfwF^% zpp*A_;~Y_{i?0>>?}I~i=GK`K3#*J@PP@L?besd$|%fa=qtf`NZ_C|3YOUg|7c z`cAZpllAUg84!nJwegu|c&UCsR<)AG)wKmct!CX2!IWQz6Jw~&FmPSMu_4~E;$4@; zHM0w+G}7GcqNz11>omhguz}ioNa3KPk_@9wD=>PJ16zf_SV>1w_~+QCKpS-Q2SHkhpPAeX2H#X(_#j2+M;+R2F4{&X$qzn{&2+XddZ)r(^Z@v z9_2$mgtwnx&+NW$f6(J9D{D#Wp1TI5yni4@m;r>sSuXZRr2SFh`~A9JtWmT6co`YlAiwZ0;Z}h)vOv#}e(uI=O+5?hN?)1y(3vWMVVNNlCQSBk4X))TYvAt86 zj=UBr==+#%`sey{fg>o~Aeqff^b#`PJz)ku09~}Ey7ZL9?Q~z5_SIj%4phAwhUvX` znhr@;?8WSJ267&jx~$7$F)R9YeU}mC8mUl*jtT0sAc3vM35J86?jw_Yy6d^CZQ?0g-XM<+F{c zN?CL<-yAbK#WfMxDA=G9= z={h2f6C7tq&W`qi-V#@xQIdBCBNI=vB{gg~U>Xb$#~5^+9HdFs;)k@l@?_w(fGc+f zF5RnE2pm}u0GHLh>v4d~7%tJam_V$xcYnIfusK$}AOUor!+l#!qT%@12%CYjj5A3+ zH(CFqUNia%A`JR2sRNlsc9JCYh378Inso&|*cK%8Ljn%VT6i`?hH@rLjL~3_?)~N{ zhnMM)EQD`1cmOlO$6%oVfqn@PxC@Xq(S|$!?T+FQWWcLUIHvy0nvTvBI29ND%zxU; z_$qXX!xz^hMewJ0alQWR2VV7dMb5R~(9xnByA+h`TI`O8-XybZvV7A7#0*|BgDUdc z9Jes2r5!$q_8DAYhG`379ycYD8NnG{<=O=!GJ9bZ2roz6H{$f~TM=mjrqL|2m*CGz zPh2cqO0yR!xI@_Ng*JlTvKz9o$eWw8)5wOM+9^yTr-B@Zi?#ZRIFm4Pcuh%k6RdC0 zyTu(g58BP*rZPzV@eQnPr{L;j*)?_&QlQT)bnD+CICpN3a~LF30hIlDTyr(fkc{PCR9*lx@W6N~ckC=N~_yG5K*3@=vD+kQVd z)f=tc<ZyG{Ubp$JXaSmF=W^uRJx1 zSKFsOtOU7du|^EwTrcAcMpsa63hg66{d_S)O=L?uzPAn#K;QQ~c^A{i)(2De%mNc9 zt;nK%W!;4lIi9K2D`spCMZ;1G5&|@dFcOhtCET6C$_YU+8&3!wrh8hfe(FsLjlDE_ zg!bWxbC0|xs}cM@_uQEJ53e;(*2`cU-4IW-Ef1bl%z6X$o@)&0zpy=Ar# zsVe0}f4R$fDhhvOA6s>yO0>@t;2-ktotx~e@y--NY10Kg+4qkeN+WI*_V}d-QarWnvMPIELNUJW$P9RM?KQ|dcD~b zzI19H<&{Hr8|)ZzRK{5m3k#iju|EPtU+=buFNLPz}1l^qnMO8`>R zW%=Kx!vAXvb;8+w8DIM+~Nh|%o!2i7Tf`M`VCl0J6*be9a1R{WD4T%1J;k5w)0H5rimxr7P zRAGqlkK#j5Gyn4+l`bpl|4Ttg3vx9S{}+^+p_+&LryUITryb1wU;7-g{$nHoz=06i zu|SAM2!Hp&HzELN@cvs-Gs5}naron@5dt*`^D(H%g99)i{?lvzud?UA$R|YqB+!BI zj9CC$iXa7JE`WeCD9o6IWJ*Wg5F7Gp>flef4gd`7kI?x4j*{SCs-WRNv7gjIs1URu fN)z40n8a>Bx{9OAbaqJ|H)5K2OY)$OAEzp((x+F~(CTU4a=noKJ;z#P%wT=DS z5(!~}Ktdo|(360QMM4^hcBaF?bchlJ6;K2tG&5*MtRuv*FNFdvYaq0I&o6cnAcSQ5 zo_FtezwMm&`O~F;S>byA)MG~g4DjMdTygj1@8Dep@2Pkn9}u4HvE8xgE?-((2pGeTK;DHqe5~RV zWC%xGOKQ62#HWOs)6oACEb%MzCfJt?~Lux z`qQb=n7%ckZxfW$V<|mnhWJXw*Z4+K9@F&I$>bKfDg}5ujGNuQt<(5U!S^a=a6eIb zrq01cPA8N^ZeV9dA9v!EbfK6;DqV=5a}we;DVE*av{+orx-m_g$}-xGlkQd*9aI!L zRn9Tysq^Q^qg$oQ3S&?W*;r-lRF|$`HQ_3_&{BGK+({o{PmHEhE>^Nur4JDk`Bl~< zB1fs%PR)%!vq8l}oNK(LUdAS4RYhk_sN^S`O=lI(Bjy`dls6o{yW%(-7AZWB@SWjk z;F?h_qbJfS<3v@X@j%sPqr$T{@99gY^_-rKWrj3;TRJW!t|yw-#u7;_-mIsaEmE5G z*foh}lY^dSRylZqi+|vt!XaUU8;O=PaT2NB=^a{hi=IuS#w>!?#zysYcAU7o<0qmq z4gF$i1zsOZ#gkgDWiXxIu`6Q?SNa-%W?M47Xgs5dLC9#UsH`pMZ#HIsOvp~?TCcI+ zGxth`n~Bz6B=&3J6kbFGf7?_PYvqQ;aKZ+%**M~faK7=0XC)UH;p$LpiwLw%&VX*V zvQ1V&a6=W@knQY{-}#3#)oqjucX^||=7qCS4zRX(LC`{W$^~<;i(%89pa{EBRzOiM zf}M*E`dTD-n{PyXUF+-JQuL*wj7xZyX^k~SuYzX13Nk&|umJNcJ1!PW7s{$;;8QRX zl(RKxFQn?K`C3vv%sPd6)BlaAKv&6s0!w%{&w+y5P|bSDupIZusZWpt52Bq*C6dD1 zv4G3CTP{;~zL~dG5f!Wil097ZM&pRjAU+_%v3* zshFRu6!sW@_1ETmPD|UB(w>y1V4?K^0=~9jw7yTF^xuYcR;^OqTIreDHD_m+_kR<3 z{g7ZA7s#)}_M|-Q>+8dVjY64&f2j3g5T}*ncwYnsOXaqOQS_JnC$YtX)w@e z3m-AAuc^;__k``?Ba?XhNqjho@d@0xvGeZ;L?&=-KZ0F?l?iP19`_!IOyW-ycz6n$ zO^BLXI{NJAN8uj3b?w=|;rYm8I3ew`PvF0$8?R2_@`4-tp}cfy5VwdLo)#6DecLN4 z1O6#o{0kl-uof?%UT_osgAiUsD_%k;UPctJV2R*mcn#;`b*#i27?5>6{x2Ti##X$8 zOYtt^^7k|*>vnn0;u!YeW8`rhH^_Pu^2a3jjD$adeK?6f;#(ZVG#CjgCreaL&QdvuWI=vq1}g{MejV`Pfu=B=dyT*Q;C?6DV(ef0R~ z6#`h}Jzy?%lMIx2JpJ5*=op%%D=&Qc*cko^S3U-dvFwK=^$_}TuW+?SqM56`z}YP@ zi?PGaa(L)KEfv%YZsHt-SRsw8!XkQb4y(~aFU}X-#~PU{er%9Gt&I#|nEpI2W+Sd< z6LvF*>!m|Ci~CzS4|^HH9kPEX+p%B9$GtM{?qiqyy)DLJF2R%xug3*H#pNZwt`?~r z#@m^5B#h+b#Pwn1KdNF*0mql$f~VL$wW8@aBKmo*52rO3gOdV=hi;bjFZ ngS4THYs8_A16(VsQ^IVJ?>cUhC$H>RqK+3Lz+rCT2m(I>j+6rZ delta 1549 zcma)6U2KzO6n;+kwO`kM-TME>+QQbdt=-l!H!eozk_rBhjA+dCPH9+`A$G1zqBnLV zCMF~r$Qu(3+;}yOgD8WBL0rgU48iyVh8Pu*IB~GKp@IXnbe^|=-f*#-?|r`Wp7WgN zocFx%(TA5dn$G7>PXpLO8$U4(nvHJEYWNk`#M4@&dJflB+|V#D_GuydUA(V3{a7NH zcMt6uZQGel3?|cN%;66Wf8sCkwH7hqHvU$ztl^HxYxULqdr!kZ_*XPrLVDaMbQ~P> zh-tEk9-FDxh!ujVz?Mvnre8M_5tN}F!zmMTRHgA>t3-N@3~1%8RO02N86S~R!!fEB z)0XGRECMxAr=`M^P7kM5swLEm?Rx*@t2K)h2&xn%ICdrWCgQsjsTbp0UfYp;Wprpb zMd%a<6>mwAS$t^?h&QZ$F>ifG?6dn!*Z?DRAgU2Ldn;K*)X~f0cR4~4JGafvdq5jG z$jK`sn4y8#-$iczS|^V=))NO@a>h5wfKKQE-Yf+$@{pGUq|HZuNylgn)uF0@0u+Qo zA<^p!bMisg0CSyoZK`l-sG_yBPI_Z=nUztAm62r7p#kfPe$3VG_OP(W-ODU&ve&Cp zMk;#~7Q`xSL+GG-YJiHjVIu?U(c>`h5+eh~(MVzDRp|g4C_?Mm4|KAepHaE0lcoH9 zw5OzVfVNX3vnV)+#UitYuP|4nW_cHUYa&f522?aNDR3A5JnQFVO)K19RfSQ-3;ZW+ zeov-3%+)=HM%iqx;!*B|?1eEJv;UCAt$5zmkwK3 z#hH<$pRJm-|AC}eA0YIL)p7c``X}*Jv3mNB&w=L)Gco&1V!>aRiJpKji(mR%rtll# zJ$PblQL}i~zL3T9Q%LHdOjK-(WgENSBy4M)!Yvuq#o#XCEOOmS#X0XF_>?T^>>tQQ zIYrF-ae;Dt<=i-$`lBZ@GS}zFao$0umMkuogB_%mQz;W%K?slVbj@Hh4i#3VaANyW z&$WERXMO=zT!ahX!pk^-OC0e%xAI4{<1)JN6S{E)J&gNsm04!-1V3Wikh#XKnZ+}> zjuG6zUd&?*OLz-6u^)>(+6y?q_IGg$hxn~IjAb0b9UR4d97i6fu!1v;&yrF&4S9J- z5XOfTp0i{;~cDH4pzoFNE`U7 Z6%$sW06UmaM-NdauO?QNgPXeG`wtNA5U&6L diff --git a/target/classes/com/rsscripting/rstaxi/stops/StopManager.class b/target/classes/com/rsscripting/rstaxi/stops/StopManager.class index a42af0e4c49fe6a10ea46cfb05aa3c2727266b43..e05fe44349e653ccce9233666befb1ff0e9e2940 100644 GIT binary patch delta 2980 zcmbtWX;_q16n^i_H}lQ%v5nyfmYGTdLR5q%l7cL5EM|paBn~(#3XIBt*f!$QzR|7B zHlckFvar#zebsDV{`Iq`r+)Oap2xEHe)G)-`XhhzJTUj(bI&>VocFxv%sf>5Yl-jk ze-0f1P>r8Pd|eKGYE^Y@^_A5FFJ$}t$i{2~b8x9l*CvTl+3VQoFT-Uz<{Mama`~I1 z)V~mwI;srX*T@T}qI)C+jK!_lfpPise5z?HkC zDzDLpGAuW6dD5s!39c}3Wm2$82^tNo1pT?`wkfpDbX=nxuQG5Angu*`Tr;C15{jCR zYZ8uE8)#8x9-1w0kG5^_ASCm&1=HFDCTtA#hKhQk?HxrGTepU`*S2>@eQ1SK$2x(F zWw{<4Sd$@V`F&@3uz?wMg*wB2%)mwio6sS@(&l7#QQY1Z>GC0r%?4c9A}~`{cyrS7 z8vW=-R7a12UTl-gT^DKF1y;%e?Hu`pt1SC^0nzNijRKD5W*=hMp`+ixPVAC@y4F?h z;dPD&x2S8bxAEBG!5!+@5@5ydGH^FK1cIHRP2tK&S6e8$vOT(iyY6VHE86YBy>iH1 zFYc3nxEK2G#{)VZG_V&B$;3sz9a*OZS$JqAM=1 zt?p|JZ;rM{n5TPfxFZ}5ADHhw;F$C|3y>pn(%d-a!xuQN<4YCKSJG?ztbHetBfE^C zydXtSnNb^wZ0gyp;|GB$mUOz`3swn_^K-v!PMJJ+kQt@I$VTh-RaPZTI zC-5X!we!QEmB3SYns@uAlZuUa4$qr@`)nV5*nk)4 z!HFKc$ejZ((Q*eoCs7Qy4v&tQ`IoI@h5)=Lsp2|K4xyv)B+|zWT4|&#C^s+Z&H-(_ znProDx-&~3FEb2{fxW{2;Y50X@G(#~ZyEx{@<>W>atSFn2wh`>&e>Yw$M6=$QNX%s zFUfZ^Cdc?{DrORiLX@H$m0X<|q=RYj@H3aEeC}pZtC09!K;0r-#Pt%&6^8jHauqgm z4K{KOHgdJ&kgI_EZkvnY{5`EcHc0<9$l&K(zP5l2 zE9Yq;Crc%!ql)NM6Q3%gvxql~QOohxgr!)AW$f=d>_I&SxZY1&h2DG?D}#6|-nn=l zvC$i`&{MK5lXu+3@EQ)VBpR!)$f%iQtW%KgOhS4BDJG)hxmlLDv}vf1Bbs$*6Y&&c zy^c5doI>|KMyjVW#G$~N+QVpVI*7HhCgZ&9a8s5RSRY5b1Kf0)n}dkNu~qhG^qYvy zM;Z-R(9_lI$W`ovYsjT$_TFkTtc849L-vJ;V+(OwON~|7#&tK>{lrcomFU$bt5+xD zHk)xn7G_RP2nCAZ8xLX>2g!>!D`=`lKtdF!NVV^3_)hY5yG^?j%?K3KpWdk5@`p)N zV`OVW$LhYn=xD3~57DIqhxyD~csqfYBbRu2DL)?QtFz#$pB1<+aKk8W3hWNttd?5? zw{t1g@<)+Y5XS@uN?lnlElWFuJCS5=9OsIBl)AIraZDH3hw}>$gP^;Upu0~6{f-HH zOwdL0`HW+4_sr+%UkZhCmkChzeid1E+k_x@3<_x|3~rOVe#Hg7Ek=b z;;B(G9JnW0JQ>L>P+WH0!eDD5jE~d1P}j0WBkt z)dZ`K`$mrLFzWV(L!Je*iyroxFl#EPB+T5Y$)LWQ%yBS>B=pmrqP`Pj z;3`QH-1Q3Fys_^g1&{n=Vo@`RU^Xy delta 2638 zcmah~S#VTE6g@rjX5M7xC4?tt6C=u&C=>;O5CS9+Lm&_mWRqZ6LKp}Tm;jRnSt6?< zvV>-ru&Brq!9*Z9pa`O(fT*Z{R`F^1;g3~XWtAFFznOUnlqFR&ue)#eUHaT}Z~rpn zK!*3$KbNlp7=s^My~`Z(s-x1EiJ>~O3=BiI9O%sUjlf79IRDunG2_m`2vGvqjyj@4;JuV%gUGf zedvWs1BeypoFZKyM$*2?MT762~0UXqE$iSO01qLYb`QP>FLY$RF zF)8N*F|CfIo4kK-(YuQqUwLs0w{_f6p1zh@#(nKOf!?yoNR+c;_1IoTfxwcQY8~GT zq(-DYeI5{Z9Ok!4Zi{_l*b&AW2PeNKG(3hFbi+}u65!z1i(@#>QO$fXs3q_g-sWDD zydT>tj>yKij0SanFs-JNU+>@q?Zja*-o;7FZoO@z9t&`a7M!TTY0extL(Nyy#x@`&LggeHXU{{HQ;4eT|e*4o~24Nn|RVLX#6g`oJzAWJZ90y}KMqvbsFp`y$ zLm+dp5~Hyhd1&Oghq@{aIdD_|m<7H|#cqS&8UbI)sx0t1Yry+xVLmjRwKAev8JP(8 z-`Eh=C>VueDqbAmF%n|3brPH0E=>}))MZYw^ZJB99bMykg##N+1dqAQqNdI|I7 ze)H*+iqd4w^oOv}0Zx`!lS^0{LbbeSuD1}&K^H0(&{7d;SxhpNkg$_Tz{yC%6b!^v zWV7GoaXtYvFq3EMIBw#2l&cQHmPQDhfUP!Rk4G?b;)n%`ppShxj|&9h;%GWnbr2S{ zQKUFL8{T$$x4F7J%t)YL@xyFgF8ikRC?jRVXCf5*lZHB2c!?$*_>gWwxE#jIkw&~? zD8FmgPK>}+{G3^DzTAd2<_2?<8n&3PagaN^J)ZSCqD&3pDS>QvvO9#H0teBj{}m8p zcNAmygBbtRZL@{(WHthzoZc&W*~P?o2@=ViR4gSk1H`$S%v?dn1^Hyuu@w*}M+hjUYV&vx^q?TQF-Xs3^>wsYamsu~q#; z$vGd}w_>`p6Szte1$UtWH~oQLuw0H#O4K7z$vH_q#@Vp3D?b9Wt9Cy)L7zIqYczM- z?ciq8Gcn-?psN43q;T~QV$#_*c>W~gJxz$tu=<`){C>erlkE;0Y|6TD71m%$xf1Sp=@*(EqOs_*Y z@)d;d*$dFy(Ab9kEnGU-mOz53tv2goDm)>tdUA)~Or#jH7ziD)2e0hKv;WlK(GQ UUh27baKnRdkc@9}4?iIJUjS9(%>V!Z