From 9d17a277b0fd909a892ff4102f017ea2be509a79 Mon Sep 17 00:00:00 2001 From: Steven Tracey Date: Thu, 11 Jan 2024 08:37:20 -0600 Subject: [PATCH] Fixed autoscroll, added flashing taskbar for new messages usernames now handled serverside --- .../java/tech/nevets/dlite/ChatWindow.java | 18 +- .../java/tech/nevets/dlite/ChatWindow.jfd | 4 +- .../java/tech/nevets/dlite/Connection.java | 11 +- src/main/java/tech/nevets/dlite/Main.java | 6 +- src/main/java/tech/nevets/dlite/Notifier.java | 13 ++ .../dlite/components/SmartScroller.java | 174 ++++++++++++++++++ src/main/resources/icon-old.ico | Bin 0 -> 4286 bytes src/main/resources/icon-old.png | Bin 0 -> 11123 bytes src/main/resources/icon.ico | Bin 4286 -> 8869 bytes src/main/resources/icon.png | Bin 11123 -> 11807 bytes 10 files changed, 217 insertions(+), 9 deletions(-) create mode 100644 src/main/java/tech/nevets/dlite/Notifier.java create mode 100644 src/main/java/tech/nevets/dlite/components/SmartScroller.java create mode 100644 src/main/resources/icon-old.ico create mode 100644 src/main/resources/icon-old.png diff --git a/src/main/java/tech/nevets/dlite/ChatWindow.java b/src/main/java/tech/nevets/dlite/ChatWindow.java index c008475..c7815af 100644 --- a/src/main/java/tech/nevets/dlite/ChatWindow.java +++ b/src/main/java/tech/nevets/dlite/ChatWindow.java @@ -6,21 +6,34 @@ package tech.nevets.dlite; import java.awt.*; import java.awt.event.*; -import java.io.IOException; import javax.swing.*; import javax.swing.plaf.BorderUIResource; import net.miginfocom.swing.*; +import tech.nevets.dlite.components.SmartScroller; /** * @author steven */ public class ChatWindow extends JPanel { + private static ChatWindow instance; + private boolean connected = false; private boolean darkModeBool = true; public ChatWindow() { initComponents(); + instance = this; + } + + public static ChatWindow getInstance() { + return instance; + } + + public void resetConnection() { + connected = false; + connStatus.setText("Disconnected: Socket Reset"); + connectBtn.setText("Connect"); } private void connectBtnMouseClicked(MouseEvent e) { @@ -40,7 +53,7 @@ public class ChatWindow extends JPanel { return; } chat.setText(""); - conn.setComponents(chat, scrollPane); + conn.setComponents(chat); connStatus.setText("Connected"); connectBtn.setText("Disconnect"); connected = true; @@ -111,6 +124,7 @@ public class ChatWindow extends JPanel { connectBtn = new JButton(); scrollPane = new JScrollPane(); chat = new JTextArea(); + new SmartScroller(scrollPane, SmartScroller.VERTICAL, SmartScroller.END); messageBox = new JTextField(); sendBtn = new JButton(); diff --git a/src/main/java/tech/nevets/dlite/ChatWindow.jfd b/src/main/java/tech/nevets/dlite/ChatWindow.jfd index fad3bf7..44d834f 100644 --- a/src/main/java/tech/nevets/dlite/ChatWindow.jfd +++ b/src/main/java/tech/nevets/dlite/ChatWindow.jfd @@ -57,6 +57,9 @@ new FormModel { "editable": false "font": new java.awt.Font( "Tahoma", 0, 11 ) "lineWrap": true + auxiliary() { + "JavaCodeGenerator.postCreateCode": "new SmartScroller(scrollPane, SmartScroller.VERTICAL, SmartScroller.END);" + } } ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 0 2 3 1,grow" @@ -81,4 +84,3 @@ new FormModel { } ) } } - diff --git a/src/main/java/tech/nevets/dlite/Connection.java b/src/main/java/tech/nevets/dlite/Connection.java index 3f42b15..c51baa2 100644 --- a/src/main/java/tech/nevets/dlite/Connection.java +++ b/src/main/java/tech/nevets/dlite/Connection.java @@ -17,7 +17,6 @@ public class Connection { private String username; private JTextArea chat; - private JScrollBar scrollBar; public Connection(String username, String address) throws Exception { String[] addrSplit = address.split(":"); @@ -46,16 +45,16 @@ public class Connection { } public void sendMessage(String message) { - out.println(username + "> " + message); + out.println(message); } - public void setComponents(JTextArea chat, JScrollPane scrollBar) { + public void setComponents(JTextArea chat) { this.chat = chat; - this.scrollBar = scrollBar.getVerticalScrollBar(); new Thread(() -> { try { is.transferTo(new ChatWriter()); } catch (IOException ignored) {} + close(); }).start(); } @@ -65,6 +64,7 @@ public class Connection { } catch (IOException e) { e.printStackTrace(); } + ChatWindow.getInstance().resetConnection(); } private class ChatWriter extends OutputStream { @@ -79,7 +79,8 @@ public class Connection { @Override public void flush() { chat.append(buf); - scrollBar.setValue(scrollBar.getMaximum()); + Notifier.messageReceived(Main.getFrame()); + //Notifier.sendNotification(buf.substring(0, buf.indexOf(">") - 1), buf.substring(buf.indexOf(">"))); buf = ""; } } diff --git a/src/main/java/tech/nevets/dlite/Main.java b/src/main/java/tech/nevets/dlite/Main.java index e389a38..53cae62 100644 --- a/src/main/java/tech/nevets/dlite/Main.java +++ b/src/main/java/tech/nevets/dlite/Main.java @@ -21,7 +21,7 @@ public class Main { ChatWindow window = new ChatWindow(); frame = new JFrame(); frame.add(window); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setTitle("Discord Lite"); frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Main.class.getResource("/icon.png"))); @@ -31,6 +31,10 @@ public class Main { frame.setVisible(true); } + public static JFrame getFrame() { + return frame; + } + public static void setDarkMode(boolean darkMode) { try { if (darkMode) { diff --git a/src/main/java/tech/nevets/dlite/Notifier.java b/src/main/java/tech/nevets/dlite/Notifier.java new file mode 100644 index 0000000..87fbb9a --- /dev/null +++ b/src/main/java/tech/nevets/dlite/Notifier.java @@ -0,0 +1,13 @@ +package tech.nevets.dlite; + +import javax.swing.*; +import java.awt.*; + +public class Notifier { + + public static void messageReceived(JFrame frame) { + if (!frame.isFocused()) { + Taskbar.getTaskbar().requestWindowUserAttention(frame); + } + } +} diff --git a/src/main/java/tech/nevets/dlite/components/SmartScroller.java b/src/main/java/tech/nevets/dlite/components/SmartScroller.java new file mode 100644 index 0000000..72dd94c --- /dev/null +++ b/src/main/java/tech/nevets/dlite/components/SmartScroller.java @@ -0,0 +1,174 @@ +package tech.nevets.dlite.components; + +import java.awt.Component; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.text.*; + +/** + * The SmartScroller will attempt to keep the viewport positioned based on + * the users interaction with the scrollbar. The normal behaviour is to keep + * the viewport positioned to see new data as it is dynamically added. + * + * Assuming vertical scrolling and data is added to the bottom: + * + * - when the viewport is at the bottom and new data is added, + * then automatically scroll the viewport to the bottom + * - when the viewport is not at the bottom and new data is added, + * then do nothing with the viewport + * + * Assuming vertical scrolling and data is added to the top: + * + * - when the viewport is at the top and new data is added, + * then do nothing with the viewport + * - when the viewport is not at the top and new data is added, then adjust + * the viewport to the relative position it was at before the data was added + * + * Similiar logic would apply for horizontal scrolling. + */ +public class SmartScroller implements AdjustmentListener +{ + public final static int HORIZONTAL = 0; + public final static int VERTICAL = 1; + + public final static int START = 0; + public final static int END = 1; + + private int viewportPosition; + + private JScrollBar scrollBar; + private boolean adjustScrollBar = true; + + private int previousValue = -1; + private int previousMaximum = -1; + + /** + * Convenience constructor. + * Scroll direction is VERTICAL and viewport position is at the END. + * + * @param scrollPane the scroll pane to monitor + */ + public SmartScroller(JScrollPane scrollPane) + { + this(scrollPane, VERTICAL, END); + } + + /** + * Convenience constructor. + * Scroll direction is VERTICAL. + * + * @param scrollPane the scroll pane to monitor + * @param viewportPosition valid values are START and END + */ + public SmartScroller(JScrollPane scrollPane, int viewportPosition) + { + this(scrollPane, VERTICAL, viewportPosition); + } + + /** + * Specify how the SmartScroller will function. + * + * @param scrollPane the scroll pane to monitor + * @param scrollDirection indicates which JScrollBar to monitor. + * Valid values are HORIZONTAL and VERTICAL. + * @param viewportPosition indicates where the viewport will normally be + * positioned as data is added. + * Valid values are START and END + */ + public SmartScroller(JScrollPane scrollPane, int scrollDirection, int viewportPosition) + { + if (scrollDirection != HORIZONTAL + && scrollDirection != VERTICAL) + throw new IllegalArgumentException("invalid scroll direction specified"); + + if (viewportPosition != START + && viewportPosition != END) + throw new IllegalArgumentException("invalid viewport position specified"); + + this.viewportPosition = viewportPosition; + + if (scrollDirection == HORIZONTAL) + scrollBar = scrollPane.getHorizontalScrollBar(); + else + scrollBar = scrollPane.getVerticalScrollBar(); + + scrollBar.addAdjustmentListener( this ); + + // Turn off automatic scrolling for text components + + Component view = scrollPane.getViewport().getView(); + + if (view instanceof JTextComponent) + { + JTextComponent textComponent = (JTextComponent)view; + DefaultCaret caret = (DefaultCaret)textComponent.getCaret(); + caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); + } + } + + @Override + public void adjustmentValueChanged(final AdjustmentEvent e) + { + SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + checkScrollBar(e); + } + }); + } + + /* + * Analyze every adjustment event to determine when the viewport + * needs to be repositioned. + */ + private void checkScrollBar(AdjustmentEvent e) + { + // The scroll bar listModel contains information needed to determine + // whether the viewport should be repositioned or not. + + JScrollBar scrollBar = (JScrollBar)e.getSource(); + BoundedRangeModel listModel = scrollBar.getModel(); + int value = listModel.getValue(); + int extent = listModel.getExtent(); + int maximum = listModel.getMaximum(); + + boolean valueChanged = previousValue != value; + boolean maximumChanged = previousMaximum != maximum; + + // Check if the user has manually repositioned the scrollbar + + if (valueChanged && !maximumChanged) + { + if (viewportPosition == START) + adjustScrollBar = value != 0; + else + adjustScrollBar = value + extent >= maximum; + } + + // Reset the "value" so we can reposition the viewport and + // distinguish between a user scroll and a program scroll. + // (ie. valueChanged will be false on a program scroll) + + if (adjustScrollBar && viewportPosition == END) + { + // Scroll the viewport to the end. + scrollBar.removeAdjustmentListener( this ); + value = maximum - extent; + scrollBar.setValue( value ); + scrollBar.addAdjustmentListener( this ); + } + + if (adjustScrollBar && viewportPosition == START) + { + // Keep the viewport at the same relative viewportPosition + scrollBar.removeAdjustmentListener( this ); + value = value + maximum - previousMaximum; + scrollBar.setValue( value ); + scrollBar.addAdjustmentListener( this ); + } + + previousValue = value; + previousMaximum = maximum; + } +} \ No newline at end of file diff --git a/src/main/resources/icon-old.ico b/src/main/resources/icon-old.ico new file mode 100644 index 0000000000000000000000000000000000000000..194d307b80e71fcfeb7d97ac730db1a2035cb1ae GIT binary patch literal 4286 zcmb_feNa_Z5dQ%JD&Pkbh?*i6PMT4eLqR2KV_}wQIZc05QZ`wssg;w3Ce2u*frMF& z_A#lXqKSi_S*EFDCZvuPiYSbTf|`~(p;L-%`@8oY?tQQK7|{;1?;iG?-QVt>J$udp zg7mLP5AYX-9e`K>w@6D#UfINB5pr&@G_>F>z}^WdYR66L>jLynI)~}Gf*%#Vt@hWK3Nl7CAT(^P>SRh>O&f)--D{D*Nd3L!(WQQG+#`4;OOVuG z&^A&K6eOz5rtsE+#NL9L^8^*=Y#VAlcJTj+Di;}5s`Hsc&9w~N7+;HpYiu3#rRsuU zMxJPnId}%w_uDE|{T-=mb=YIK%GW8?{3FPkEr^KRrQp2+7|c^?i9@rK~y{M@&0LoZ3mnZD)*8>n7(Z2T zTw`t7tg)Z^t{_x>GJbaIA{e7Nv0U^2my?2n8e8T=;U>X=A)@)}%uRn#@Y^YG8xH&- zxPRDX)i+7)aGNk3$#>Ob?{RxR^XHRg_BtEvzR7}B+toJBLFPGaG{pbQP79tGt$E?G zf%);mWI?s=2hKD3uu5|`HtvvuCwdHMt3DRv{RQ@#am`Ds1;jJh-FgVt?6h&I#~)FS zvB((V$hB@Gm_6T#0p+-dpBl?K)6vR`!9d)4#~Ew?PzP;&{T)X~M3i8Dp|=iy_~bEe z+sg%gZg=FlW?ye{M52CrYTWyF_%CYvjiDlJALE0ck{>kSwe>E3O38XbpAqy=}K+L_d7-4HkVeeiCx?)jp5hYvj&9YyT~`*UZH5=NjppdaqQJmy2oa zcTT-epkrR^ZEQGtSwe=;N7>RxI%(%ZV?ce;X)~#uRXI>Pr?j6=Ugz<|q&iOOVbN*-u@QBy>Yjo3At`*6> zerDX?*UTp-W!%{O|G(!i@p=DP)O7#wr}uh!v?K8SgEn~IzpfY0El=#`?_b1c8;Y*+ zbxrqAckJByTGFQu=l)ru7=iAemI3Xi*ZDR4ruWyY*ZTgl(d}RJ{#@Mb`}4bf z-tW&&|I7Q+*ADakUf0a~d#MVw=>09(LDC4!XaLgB0r5)htAX&XKuESt%m-3STTr&j TDTQoRs#cxUO$=fYli2?PN41`3 literal 0 HcmV?d00001 diff --git a/src/main/resources/icon-old.png b/src/main/resources/icon-old.png new file mode 100644 index 0000000000000000000000000000000000000000..36c8fc8d85db6dcb005bb0ac3bc3ca66f84c0714 GIT binary patch literal 11123 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 bh)2w$2Kc8>CG^ZFGcBN^pebJ^YZ>u>3E#!` literal 0 HcmV?d00001 diff --git a/src/main/resources/icon.ico b/src/main/resources/icon.ico index 194d307b80e71fcfeb7d97ac730db1a2035cb1ae..b5870d6ba3ff4631cd4cbc7aeb4f67fcd0d7bc75 100644 GIT binary patch literal 8869 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 z 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 TDTQoRs#cxUO$=fYli2?PN41`3 diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png index 36c8fc8d85db6dcb005bb0ac3bc3ca66f84c0714..7090d35738d9833f13c1d7c9b96cf605572e2453 100644 GIT binary patch literal 11807 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 literal 11123 zcmX9^byyVb+nwDdmrm(Wx&;KJySqcAC8awTkR_x;P$>yX0qJHbDG6z$mXeZ?ZoYlL z-(NG=%slhdea`({=RUF8no4+3DkuN|cq+>Bx&Qz|-GTrt4AkY7XXzUNU;tF)W%T{C z4|1^Y45uz0rC7-_IQ3%X(s4)GGvw2f*LCAuJv8h(FBRW(abC9!GvAnB^72m=DW@0d z#>V~8FL=5>VW~=0n*HdUQ2LKa4Z2kQVrfYItOMa z1{$+H)je+sj6r=gz25K6<$(s!G+9q*{1pwI$3YkRanx0^t}(tPI!w!DM2AB?-U^*i z0GA{K5Cl!=-?^Y6{efGizlOdbV{FUkuqfaU*x1r+o;b4gIoJ>&vdJ2&x%URX^^FHw zXXPq71b)Xw1Oaa*wH7_UlBmnqfUzihK%h9zGpB=_kMwhzOqaNBtEC_d9%K2*3-W za5gi}oTW}6HUuQCvqUJQg&EJj5j!-$=WKg73QO;%SoHkBN=a{tuFU|)mct5i1D+^8 zZHdItN7T@Ch+OOJTlomfQ99!@5m zOTkhOZl*yPSbyZvR(9CW1q3T0(^5pG2EAlAR5RgFA`{Zax0th)J{jG6FA$SjFlKtl zh?Gx;3f2Vwh5(S;#O)IEhn>;srVc*YLL(THj&TNqMlM% znI%Gq)6fk86T*lvY*-s;`eY+puu`fGZ(@rkU(PIlm@#xtbiw70E=!P>;+FjQ0@tDh zClAz2kKi*z3+jdDqrrD8XDrZ=lE462pk!@*TFv7Y7`b#IT^tuWE7ak#09DU|#s@Cb zGEP9F2r9wu1Pf3XoQK30#JHS5xK#lJ2C_cYkeN8{^wUBXoWdeGltS!>;2#*2k}z|r z4mC-FVe#+$ev`A1-PWOV0^6Wz#{K6=HduSv9qXmWYDIJfK=H`<>?wOh$_7m1GmfML zJFK%YD(QVoS)3t=f(4&c?tUM-5TfLK5)#fxNr1hYMD0wciY2nc?${oMD{gi>eCnwVFM?{ua&Q;Yibjc)MQa}=U zZ>`lH8O(i|Iqct$*GbILIaN8ZhbDmaW*raluAj9cJO~qH!?Jl`DR1>NaDkk>xaF5_ z1p|c=?&Ch z1pZYyhbbMR|E|aS>Z&gIGYhg5%vqc?g`uJ zMr=S}*KXgBONgBGoE8}&%Z(RU=f%tgZpDfE@qm2I=p(qfXUYS^-OkSvX&&H%%Mu=Z z32`5QAnFR2ish5UF_Ay&(RelbNfCTGFq-PXgc`Gb3d)2`JLQ3=ki6>KQdlGg3Af$2LDcDWd2%GpNm~gl5HIbU2 zX^+;Jc+u{*rtO;j1^fo>9B=O#T|^zlI{I1MPFgIJ&NG0>?a>Dq^-g-Zhh;f$BVC~v z@r^nS|4k_H>O>e>;U>O}za=Ry<#>%l`~pm9=4T&7^nfD@yl1I97P!&2_#){Q-h{V4 z&1(N%@)H~J7XX*!t-{wVD$y-Ric91&V!k9?4jFQMP!+~no&?*Mw8sK!>ra# zp*y9VcN)|!bQWB9@fO)DG+CGA69uss*k#rDBq72VegDD46_Zb1cwohD8Fu*^QvSJn zE`gmVQ3N;Z0qWk;DZn>0L-;G&MuQ6#E21Nu5TD`6#%0Vy_qj{8?RFcAuKdpPr9wp4 zS7wxFvu3MI7@+V^=9Mor;{)b`v=@M1&TjV}kZu)1d&1uQ8gZHd775Djc zq#+VQ@>Qr|sUWViG);z6wA>yFlW;p<;}$}`iFVv_XlqFYFWD4~4@4;c2Z9Qzr&b?Eu1 zpQ1BnYO$o0;h=Ppd;w~E1!MA*9nbaclB##1QnzOU9?^#ArPaE5Gq9Tnc}AQRqE;~B zzuOfio6d5VguN=mZ=d{#dEwYk_9~|B%Z{Afi?qQh%t-_WpqQoLX8@bm&ZO?@X3C)! zT!nbren?57?r2ib@?CPm1a=Ubw5H^C1yrZ?Ahvf2k%OBi&z7)MwB~9tiwq`OL6f@?vr@jSK%tEiqL%Ct!ulZ@yO*lRVhlUts>ZXrG1rBB>E#21!jZ>J@~- zpM&$`B@*!HTjei?=x$kVg43VVl?2S`b! zy$QX?6X_7(bNfE4@!Hyqf^KsIOYlXORYaq*cBoGoZMt|Vx%x?cMVu8eP87A{f33~)}Sy9B$faszb9Ps44uS?ln>0Nx^G)m2*(qqg`( z9rxd}({OYvNV5v_-Pw;YD?S{l-eg>DLFWV=zJ&5yjDLt=J)mc=I)3*u={3US+kGoX zFB5fYlw?P}>z6#Mf)A_0`y-^%e{Dah<|fs8;yJZBW(9QQSv|n+AfJ5DBu&2rvrP@b z9n5O({ewd_K|Ds-VGFg{?U7csGW`E~9$WYeV8ltU*S6)jj8QOW6TOKn_YA29X_g!9 z%uul8Xp487oz-IF^QqGy=j4uU(4%qDm0EsG0}R8_^_WiFji{qAv_xm@yJnSuiG@b=23{-tlh^2k zBcTxeEr*ryo^ievhL6AMKjLu-W;t}~!FYPa*jZU;!Bt(A$>q=0|H;~P3rLjF2znuc+t2a$WAN?~+ zzmLZx%VTzH_7q(VCapW-TSJLYYIi9QP`O5Ea`9am7k^%s`iO0Mxjyvbd@X&BN;V}~7e zy?T7^V)xy4kM4O<5kDHY-Vy4pD}dUi`FS|&jt^{IE{m_62?#*BG#3M(3$-~6fvUgw zOV`54nBJ%DEu`HC^}_EzfD&eoE}y)`G3D_$g`#r#L9~U=`pPRihtV+I{Fmy`Xt-vQ zB>K`N+wsT;%c}2T%*fo&Fv*T^&%bCHPnI-2MbFSyav8Z#s9}4JQRn4eyHp_FOl&C+ zJvZJaLdl9*U{n;;v`qi1@d#98QF56Z*tY3mY;N+ zcT7goB8*z(n#S*nlpJ*i8y!dgp>nCpzofasXyVLf{@$xu*Do#E32j1EgmUv8T*pJ> z@VPgIyOkSqdvwj>^9sLtweLP+aLsoz+V+5ckF93_XThLA7nlTL9$X%UcCI$<5Xiko zt7 zc{1oA$<=cD@CQ5alO_%CGGB}NVI~VI6NoFfeBKzMzvAH?h^*h5&BA(3(9bV+#Qvb`W;v5b$L$7d>@ zvw5YFkI9HA1DqWAkdir*{f|g8oa^sAwx9&2@yYkrzoEAW(GT~xg<5%%Y!;GTw&-2= z7t|O8bn&70H&(Y72g4_}?H@16d5Jv5uH~i@5qHd!dL3?NA`)|%FEc@SB%2e9y1su# zPFKQdXd?3__w~<&J_^|5yS5!Pwu_O;3{1YCSFqszor=wQ~>;5eUp>=d3Yu@L{wXZt@v-s_xJClcc_*=yY01fK;ThHlO?d0@*nFqKU2r-5RZ^?oOt}Hh zQTu7)QBGXGm*!`o(H1yv`9>FUy?u{cbI#oc5)v*j^FHLsaOaX5icQr&t&iYOVrdg{ ztlk6SVydAEpVSiRB&ZB34Dl+R49fMpv!2^zI}iCE+BJ>!V>G2bzB;qtV*gCdlKAu7 zu8|0c_0ycAQ?>OE|9wNj(fb;`k=;ei77*QKa%8Zv$S-DZ{eWA}Iny$a^gW?ZRZ!?L zmmBoH;8j~h5pnge054kim5&JOai!4JAZebWdIP~H19U-LhLy(Qo?F9Fx_PMh%J)6^ zef76)+;gslk78gDJVPk%xbF6UaPDZIumeH=`S(Du;vR*Otf#VWw&~KHF8r-hIm<9SMRWHO1IG$ z9XHRKBkChttePQP{oFjQirc2sRwP@fIVU30Hq};7X28WF(-6=-%~ec|nD{d9&Oc}` z&Y?f|Ab2?~;Nvca{vPh~CV{!$3=}gcb#7-rVeEyQGvmBzr*c;)GDDb7sX!yMSUvI~#Oy4dq z(YxgJQAz+T@-g*xQ#7uJp#R0%wpCmuFF$W}zK;2A{&0!`w>N5CN>;F??E*^qPRJcz zozPRFPpJD&58yZyYo%$xM zN@ecDFDCd%xlH!~DZa+cA!$&(JW4S_H~9M~vVB)rOknalV)V1HOc>7A07S=pW>eiC!hU)}PDO8giBnQ!(eJpHm--Em=hu(4~(G2)rj;cH() z-?fO1-e_RDs3P~qkM&8R%)&izIA(D2TP>W?lbP}*X=7QSUO@dvC>e+4#oq-@CJIXZ zuXZDUK`Hj5pQ7}%GTO{^bfFw|Zxskp5CeUH|HGv@OkwTXL$}ApYyj zjwztVs5X9(Owq-HsP4YBcs@p}EYa6&s#dcm*D*8MA1IniJ2hMIL(BPG#kjAJHq$Ww zj$X2f1nN*x-;@UbdH8x>p9A)3vUL65+F@Apmu$Pr*Bw;$*&c8bD$yqb_G3Ty#YF8< z#GB(hm@lep{+_JsH+Ddy!Snhl4`|-|RK+k<&N3LY@%%xO@Wi&XWt+t(;{%WR9xk;b zRu{OA(U(&5&T_lyjbR9g2eLCB(wL(GX#0Uo#Ji4+O#JcVj+hu+tvra z8xnn9QVTLk?3EVsS@oc45*$LJ>h%^I-#!n$^Dp79m3avWyUc6XA553y9Ir%AJ|)HS zD9{IaOVLxXYY@^|u=$B@X(vIF2!N_vXZ}2!2^7BNlBi)R8$~6ZP(G(6vm6qb=lIBAp zQRk`-kuG{NhCSJEj?m*bcVWR7m5^W&&<@vVEh7Eh;*f=)?Ij^;BpBu%e`N_iu3n5Z zpUL-H4HM(@v*s6P+d$=yu&V+fRT7;I8{M~k{|HfTg3#y)S0%d_^XrEq@G>EstC)um zVwksFXs)bb6UpXEAY~&ExyI~oi)>{Fn_;zTaPL5?3a4Gbeyz-HpJRo?I1i%u33-WI z7=^po*1-A}Lgi#jU3KQSbUDy@MJOW5ScQnH34O*F()hW{wV%Us)YNk062aTE{SH^b z03YO}kLg6et=RMhc%t%}S>@@H=1uSevwLOm#-6DsRXPXEjT{thl<=310zQ=1K<-{I zIL*tp8}Op6*QOs@>-JH^dh;UDr^f3j&q}wib1UO=J#nwCRFK38Pc6VSFnS;!tHws)b*nQL3Q3Gq3Mbif|Pc zsfq)?&-uE*>f_+IaXyvJ=)Cj{Uwt%A0ItGFRl8q`RR+%Qn8)p9BEVa?Pay+(i%9Vn zd}^ytNMTmGF>pNTZ@_GYfFMfCmlL%0%h3e||05HAn~i0&&*Mg*iD?m5(T<0Qo-9Ev z)XVqW{+nq^Sg}5^F9a-3OZKbBpk2fNG=+&W@FLu1+1;WdB1ECmPCUkSjq~)Zy-YZP zw@1ls;71p;uq#k73ug=b0QmkaM)*b7{Z#Mpct%sL*&lWmq!XawnNf7Lu981rur_&r z)!-2wC1qY|TG*ar@X=xz3q3h4$>_)JLNehFR)lK{(^@pL_PB%q@8hx!+Hq{<=1CR@ zkO<#TZ6T;0k3^U1a2Wi1@{?B(Y|O~nqFzo{5MH=;h=*ODsJ;KeCUxXQE5qPX zRQLR^*%i%xVd7*cT(G6+0A6-VKh1FOsuBgp_`ZLk5MWJ-cWSTP&bWJ42>h{Me`jwq z^~Un!?^+598obPZvfqElDJ!ZNGAD!FWrnJ0(NTpJsAcTmLBDM@6Cb!0R6$NLbAkLK z=E*Bh;rz4XkM!=heE&+a-YQV>--PalrRxI%c1oIgqrL#k3hAj}qOBJ^5UnONK2sk! z8cr;_f>EjA;*wxnVTZlSz`fpcKm#wU{qW-i7JD!NU820Fw9oj|1#3V?YC@U6$!9Yk z>~~|N(`@atM7WbaF=HJn4@EBi+#2;uS6CUl7@ve9xfdw^a7{pkQ865otUhLv-@el4 z^2qfKcw^@Yx3ih!u`Dp1y3)*|7Q9MGrD^{5N|{APh&fq(eC*+3Y)U{avMoPM8oXG~DdGbzDwTPDiZ)_jP>?wF_h{wjJo~0|i!8RF- z;2Q3Um4ffJklrAVnS*Fm|POw3D&ypF*%XR1Ju&ZTLFTr89nfGcZ9*7yRwU}(*)G2G> zqYxo_6KJ_+Byh#f9kgi4yFIN7G;T5Br~IIyeTjedYR`)lSDef;4wU+hXd_)%w7+rF z@j9kV>dj&M=-yU#eI}6aYGyajTiY`;*YF@G9)yxiM812IN|UwE)#0B+iwHhV zLTm5tsm2^im%WO`?7#}cI3NO+FgS6LB*4qne|E#b`x4+>>&!HxXAM6C6}xA~H`o(9 z>UM@zz#*g%XNi|nj;v$DV#Rfm*Pk>Q_lk1YYYzC99()-@_JE5z z(pXZ!W@^Fd(o7sj(uUxFEIi{Z*luB|U$7@BmhtmI{_LyHC`n0n>P#7!|B zVcpYt67tXxWnb4;qlznu>(2X>Z7iTiK$|MjvY!L_@5zaHP_7XCG&F>#a$B#cXPhkV8H1TW+S=$SK^4iBC*)$ zIdEsRwt!_!yy!_Bqf7=YBXS@o9kNz^-@d>1VM07(I9ht4t#&o=v4PeJ^fW`X5AB}>i zG5Z1MsD`@cicm&{3}|jf`O__Ubc1_=|24 zq%Y|Se0>wPnA(Qij^x#Y;li=0mh{f@Z)!cGjnF@6zW*V^CYPGvP6H@trqYD&H974AXDq<-D|W$6Dk>=%CxXUeleK8S^q9-mA>@IV#Y}A zN@XYLn){A2*Z^>+whVU~;rsW))^Z{()MA-hrKug0J4Jr|T=*cdrOm`MxID(SYDDAwK&F;~8J#)Z9D7Xof zE^o|Lt(Q@V>4B2Lgv(|aj78#&JXLfTb?A>K)zq$HsUt`qaKqVw<^(yDpBXx!Kis~T zIP%z>;hQP-LTwkmP1VlF1#h?Lw+3*+Ie_l-&D~OtvmOddWSCrO0-7Osh|%$_Ldb1P zW(syyY?{W%;|3&xtu&3G$E0@jy1jWNJIgw$R?VCy$X79cWrx znOyj>L!nv)mi)K8`%A16ZCzpVcjS$`Q3&KRL{?FjSr9$BMdbvfOZK~d!JPG;E5f$0 z_>1O197AC0EXK578Np+-O2rj*=;6OhS+@TlEXU-a@)nc)bSeH%8XTGc|5AgW*o){r ztg*wHvo~fIr8(TUa=?KLjv1udm|eCGwWv!w0cY9zc5{{Jzbz^|T&YCFiLo-7B;Ee2 z?!1V~vqj#qy_1sLfda0*y2gcxg1?P2ihq{czbYbQenE=DnH+JR0N!QU|LR4dN{c-= zZ2L5^VAvu;4dktZP86=3tZaJTM&DER8QO@0rbe8{eXcrG^ops)(@EEA=uh-PIz=a?ttti2Q0&Hi~VQFiNHsji##0 zYeytOraqufeN%#-$PAbilaGGGtS4UR$l1zWBi6owwkWSu>?;)g1jl*)Rx0^BJRUwJ zHqfiZ0MWueVI3MzykR(37=0=AYoI!&GZa;%1Dc-QMXx{GOTXWv&fmI5R0edO}3XmKZOVfXGWig#AIb|FMJ4$cFtDL2E!`QI6xGNy#C9*?4Tj; zIq>B&G@bW}K6BwSuKwgV-6f?Gm*QyRckc{)5>wk5WdrVsy=m`RUPALp;k)xZH<0Gf z57QD=R-PYv+8({j>bIIcc z>#F?P~q1&p8eZ5cSQUj()iTSn&)2W6; z=5fqxs|~%RgSdCS-F^E)i&~)q;E!?a?gDx9Y>H<*ZfX()o&!{Kmkn|8mTS7mU7|z2 zyjrCvgCal^`INg9wL&$(k1~tIILh?Oj?WZQ&|ch&upWpq9rf^R1NKcG8|3_9(pF0=xuEzU z>a458lH^5>!No@qF#e>sHrL1)q)Zr>&k9={RGY6pO^qbdAQ7$iP{JY|$_mDd!!|9< zYnu=0)%vuCe{||SKZI_#Op9hIf)na$402%jim{#Y3k!Di9Zn!g=&%fSn4xj-sCAa- z%B;mxsTa~xY=3zge)$J1@Fr-ud?Tt1pu^y6ng4Kh5>5tF!kvm$P*zcIOL5aCoXg*p zJxzms&HZ@eG=OX;V0bn-?k-yLdQ}!Gvt+q zWH*$70heT^F9t^1Q|9rrhsMi6!?H1JvCG;_a}w`|y)oz=%qpVb;?bm%X+l#zQ6W3$ zz*>pUE-Y}l5g{R9iFzMzRZyS}wvS74dqBsIdiqa`C~vnh%Kc|_JcJV#^ITn@tP}mr zkx@6dn9nZ-!aX+%;fqc^oE&H*Okhv(u>8;5ITdT{%@5O)r>Ii|61DPWQgHn^6&$!# zKU{-g*Nt29OIFrkP8b?PI=G*q;N2UPUzCtCb=S+k&+nKU#@iQtcW4x2bq^)Kxax&6 ztYK{>>tIF4vMCt=G`f3o57-&~PJN(aMN+f=8_|Dhg8@omVHSIJI`ZQtc|`u?C$=_O bh)2w$2Kc8>CG^ZFGcBN^pebJ^YZ>u>3E#!`