From 5fcb7d724e3d094fec75138ef4e0d08f92d152b9 Mon Sep 17 00:00:00 2001 From: Justin Campbell Date: Tue, 23 Feb 2021 09:51:10 -0500 Subject: [PATCH] Implement loading UI --- src/components/AppView/AppView.js | 4 +- src/components/ItemTable/ItemTable.js | 152 ++++++++++-------- .../ItemTable/loading-annimation.gif | Bin 0 -> 22865 bytes 3 files changed, 85 insertions(+), 71 deletions(-) create mode 100644 src/components/ItemTable/loading-annimation.gif diff --git a/src/components/AppView/AppView.js b/src/components/AppView/AppView.js index d0e11b4..8536140 100644 --- a/src/components/AppView/AppView.js +++ b/src/components/AppView/AppView.js @@ -18,7 +18,7 @@ export default function AppView({ setDarkMode }){ const [items, setItems] = useState([]); const [selectedQueues, setSelectedQueues] = useState([]); const [queueSelectorOpen, setQueueSelectorOpen] = useState(false); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); // Create contextual variables. const activeItem = useItem(); @@ -41,6 +41,7 @@ export default function AppView({ setDarkMode }){ return undefined; } + setIsLoading(true); let queuesToLoad = ""; if (selectedQueues.length === 1){ @@ -62,6 +63,7 @@ export default function AppView({ setDarkMode }){ const queueJson = await apiResponse.json(); setQueues(queueJson); + setIsLoading(false) })(); }, [selectedQueues, access_token, queueSelectorOpen]); diff --git a/src/components/ItemTable/ItemTable.js b/src/components/ItemTable/ItemTable.js index 0cc18b9..13e96a0 100644 --- a/src/components/ItemTable/ItemTable.js +++ b/src/components/ItemTable/ItemTable.js @@ -1,20 +1,25 @@ import React, { useState } from "react"; import PropTypes from "prop-types"; import { useTable, useFilters, useFlexLayout, useSortBy } from "react-table"; -import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer, Paper, Grid, ButtonGroup, IconButton, makeStyles, useTheme } from "@material-ui/core"; +import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer, Box, Grid, ButtonGroup, IconButton, makeStyles, useTheme } from "@material-ui/core"; import { useHistory } from "react-router-dom"; import RelativeTime from "react-relative-time"; import ItemTableFilter from "../ItemTableFilter/" import { ArrowDownward, ArrowUpward } from "@material-ui/icons"; import ItemTableCell from "../ItemTableCell"; import LastUpdatedCell from "../LastUpdatedCell/"; -import { Skeleton } from "@material-ui/lab"; +import jester from "./loading-annimation.gif"; export default function ItemTable({ data, rowCanBeSelected, loading }) { const [selectedRow, setSelectedRow] = useState({ queue: null, number: null }); const theme = useTheme(); const useStyles = makeStyles({ + loadingAnnimation: { + display: "flex", + justifyContent: "center", + width: "100%" + }, hoverBackgroundColor: { "&:hover": { // The !important is placed here to enforce CSS specificity. @@ -85,64 +90,69 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, } = tableInstance; return ( - - - - {headerGroups.map(headerGroup => ( - - {headerGroup.headers.map(column => ( - - - - - {column.render("Filter")} - - - - { - const isSortedAsc = column.isSorted && !column.isSortedDesc; - isSortedAsc ? column.clearSortBy() : column.toggleSortBy(false) - })} - > - - - { - const isSortedDesc = column.isSorted && column.isSortedDesc; - isSortedDesc ? column.clearSortBy() : column.toggleSortBy(true) - })} - > - - - + loading + ? ( + + Items are loading. + + ) + : ( + +
+ + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + + + + {column.render("Filter")} + + + + { + const isSortedAsc = column.isSorted && !column.isSortedDesc; + isSortedAsc ? column.clearSortBy() : column.toggleSortBy(false) + })} + > + + + { + const isSortedDesc = column.isSorted && column.isSortedDesc; + isSortedDesc ? column.clearSortBy() : column.toggleSortBy(true) + })} + > + + + + - - - - ))} - - ))} - - - {rows.map((row) => { - prepareRow(row); - let isSelected = selectedRow.queue === row.original.queue && selectedRow.number === row.original.number - return ( - loading ? : - + + + ))} + + ))} + + + {rows.map((row) => { + prepareRow(row); + let isSelected = selectedRow.queue === row.original.queue && selectedRow.number === row.original.number + return ( { @@ -183,25 +193,27 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { } }) ))}; - - ); - })} - -
-
+ + ); + })} + + + + ) ); }; ItemTable.propTypes = { /** Array of items from all active queues to display in table. */ "items": PropTypes.array, - /** State variable indicating if rows can be selected. When false, all rows are deselected. */ - "rowCanBeSelected": PropTypes.bool + /** If true, rows can be selected. */ + "rowCanBeSelected": PropTypes.bool, + /** If true, ItemTable displays loading screen. */ + "loading": PropTypes.bool }; ItemTable.defaultProps = { - /** The items to display in the table. */ "items": [], - /** A state variable determining whether a row can be selected or not. */ - "rowCanBeSelected": true + "rowCanBeSelected": true, + "loading": false }; diff --git a/src/components/ItemTable/loading-annimation.gif b/src/components/ItemTable/loading-annimation.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6573088f06ff49ae5de60778c728592cf5715ae GIT binary patch literal 22865 zcmc$_Wl)?=)CD-WyE}txAPjE7-66OH8{92Hg1Zyk-QC?a48h&q9YR86cJh8zTeY>n zzS`Q|{?||6zW3bI&(xf{w;y>$IYA-wXh0<(67W9*1OR{mfGhw20suf^6A%Cd0)Rn) zED!(!0zhGFU;qdV0D}QpU;qRRfWl0(0H7=YI17-K1%PA$ps<|~00;sALjYM200aVn zLSeoDASeI~1!O@15a_=d%r(q6%o%Jq%pCe}_HTeepezsw0s=u{QDGA>2n+^gfk6;3 z2nquMTgw80vp`u{AV?Mn3d005g@C{iP!e_>&uVZLCf zVK8C1V2iNGFxN2OFlVsc(0_~nBEd!$7z_b}p|JE|QDKuTa8?!=k_CpsvW0;Y^*pin4`M_78Ws1VpZ3j)c4!ia|D4}%4>hQe(A5eXw2mOl&@%o@ft zEL|9vFgjo;VVhxmz(Bz=hNTDt4f6#<4ciLC1p@+$408?h4gI(EA9t{I*aO&rg@>IY zj9ggGS+Hg3e<$|ub@-R?eP0+YK{^t^a#j{{I<3D2AG>j<&R zZRPlf=-empiwF`77m4?60jLhHWrOU;?gVSDl`?3#gc+d{fClE#uI6!b*~g2 z!Y9A5Xk&A%YnDxCP#Cm_DYh_4XMvn9wpej1jy*Q+3LHmw7;0MI*|AJ1Aoo!r+HBYJQ@g?ecre~ zEeO10WKIG$kw%%x(U({* zXaYzW`8&^}V1%J)t!=yG^nWBVWj%P7ia^;}lkB0UlCLnH7h;>hXqEKu)2)iGa6>zp z8hohCVUjW$sp1I^_2g@nn58iAj%d)RYk zo6+ray#0*>ik5 zfECToJqZumqy!9F%SrZpw!U#l?>G7(Zx`dAo*95x}>?$7<4EdRP6Yd2Dkmz+>yZx+njJT|=+Ss_870 z!oD9{rp{!TIMP#KhxgO9=Pq^VR>ah=_&n2LfmN#c{qc)Z!9!p9-<{ng$~zld=nbm# z>)XIOq0`#O-~2t&H3E|}%c6yMpJ}PSXHc9Y1fPM1!8FM=ds=5~Xi1KqO5gr;=u>_v`ZrILhw;2|$qlF(_Iii#(k`k5> zZZd8za;q3R&y7()&2F^dSx`>2dbouLw&@N7-PPS}7#8~`lAR@8)4h_&LMRXuDlbte z998bR&NbfwZy_o4 z7Zw3QmBKTxyPkte;!`JbS2kI#3}g3-U9WdfSF}2?3Ex@`E3_75<4=Pef_u)91<+7et z4EHlLa0@ME{EQEsDa%~pB^1m;FSz2?e^0!JAmze9{3zND?40`0T~Qzpv|j@$Su3_D z+3EWf?){(ZPk=m~N@S(EFhuykzjRwOA0o1C-nJH@%qI-kDr){PaL#Xgvhj7c3XgHd zEJ4GgK!%dNOQk~$9FIK_QRf#}3DC*gFxO+b>PNN$c#Dk62D&~n*Qiz)thknZ7nTo4f|j$4%Wdu;Ed3~N;> zgH2huU@4a(N2klXD4!yJ6<)LsWq2Z%5A+QFO)~aW3ARs4eWqxPl zNRbBNgcO2}#nj9PddP?>KlFCD7d4OC%{cZ8&+5G|^v2&*7pmaxK84b@^OF<3mp+#1 zt;=usRP#JewfES(`OVajbxmt7%@-23J&B;W=3w44GJ;2%uGThRCv1oOEv)T2Hqj~6 zxJ=pj@&Ol($(PWfqH6sS>rUVh>()s<)|6R|xa>hWum6=ioyC=A` zS`^}wr8*%t$JIbAStwQ~-y;RBRQ4uO2WCydC%<*_&OKtMAc4-f2N36MURg5Le44>_ zYspgax4A#*`o?|pDF2LkQtl(8i$0TC=V}}=MNLzwUMD&&NSOes;T;}aov?&bU7!(HPVtdv7sm0YU$mVu8Rfq`0 zy3%MOpB|+itxvo@u;ThS*hlT%tQe1L#@w?qJl@#CXnm#cGqDaJm8vY=zcxTH*i!2D zl1t9Javf3LMtV!!6MgOckx^#Hte^F>W?8AQg~w&<-sL9V0((WZT&ZlaLowFUoPukXUs8TMz zOI_Yx73u-8hNoTifCR519I=wjH_DDT-YI*HebaWk-)Swxk5>6}cfjv*yknSsBF#8! zeQtZ+BXIo~rr42$gZtko6U~FzSR#=9*5v%bSR$2l45i|I$rK5LcC|6<-H~ECH_H1Q zvc(eRI6g&P>9H?1-y#Jh|6+Ev*vuATh91aNyOqzEs1UHlci*$l7VDJtL$c@D*lLY& zoUuga&r~WZC##nYp3XNq=r+m2l{-o{yFWf&Y)^MI><$DWU{I@cHtvTAG*GV8JdF{J z#qJ|hJ>j`qwY@18#$=jbhQJZzIc_5K#%b4pU7sS7>**cUQ*RU|)X zINL8`adF6+AYPEy7ogwWM?gsP?$H0WXq$P@_XZD9BJeNJhB~Nm6n{GCJKu}319Ejl zp-eNUphi%m#y*e;r~YN%_a_Ryt7X(#w1@4m7NV6^}FC90J_JO4%f0 z1-Bj~v3CnfNnMTc&;ziBr7Tk-P>;6k6XB}xl4aU|kl3M-EqsVVh#)OX-RTS3lw;Qo zEyFeZKE^0zD$H^cV1Zw{o27?d#FXyz5Pm8tB;1*wVTLYzBJmoYdXgP*L4=wVNNk0g zsY40?5WSGK8aY#92`whYUwF|~pa!p(27t&%bJJ{zg{(fnboD4(N+asq(K_kINDb#@ zNcL$>$e5vO68DPm7dWZ7qzlR3`f}UkP+9bf4ECLiQYi?YUy*_*55sjk-6x^NQb-EA zvr^|&)^+!8evPIxc5{!R)3@$l^}QhL*d2FvRbN~4TE$Mg_7TJ299x_@k&t%snX^6f zPA>s&kCAGAuHiN^l9Uk~1kvN@By@k*+TbwnJNIAIS;@KB?vUn`&(WCfqXb-f@kC5! zm=a&f`yf2=yx$q`Mt{ooQUU};291%>w3G6_;_Z`8tGxSlRWXXcxD{b5VpCy^WcKcQ z&VHQryd_tHD`$01U%i*2uPC4{chN02Pov#BC%}6Hx&R&X-u&5Dm%Ct+C?`4mt6X4i z>Wr$RV?gq9*?Wb?#pK5~bCS=3+v+qKKWynm^V=)G_*CSC$UjI@b@>e>iw1|L$}CGoZgwqK1mvFJcho*6sRBWVz_63*CU>?X-iB!QPf# zyq7JG2A5&i`l5)4`Ih>*<#~Zfqr?7m$7aI@9o7KrL)*Y-f!}9SI9~?NvW;V|PIG6? zV*`yrB-%_wu}P(~Ldaju4#;oUhAl%Y zJX9C15k}lwh&Jy%94Cq!!sMPn#L&)lObB-2XUMOHuDwY0u|&I&S!JO|Pc-7d-$vR< z=e#txQ^E1DTSt0mq!KLmqW0Z*x$4PK#$RH4q*GMY z#D6TsZ8?a_pPplh`_yYD_0@JfKnROJ2ttoGrK9lVUnk5tdPs-%v+sD!CdSE_fxd;b z2Sc{m4>LIbVXj2fXG%F3)z0$!RU6*>kUF0wKL9((LheS;omV`UQMO$U?mn%7zdKcd z;yXaR;`y5wJ|sQcr*O`76#Gw{WhvEg=RPx zx`*%IX23#CVUHW9Ih#R0NpHi_U1au^DT(5^a=-a8XeVGn2v}D6R6W$1o}lCHw2A5I zJ322J6;Y<595Ur8JbPr0g*K6OzG?5fn4%R_p}2QG&qBMjO=*LuT4yTh(w)m+2ttce z4na6;Cp$$X5|#+h(}5$;HV?)PBbuwWExdSN>CIPb!C1js1YR`FZYy)~ASW6I=eB=) zs&dO?YKnRcQq79X_}~G+mwD7{Z-;9PqN-s%*QP{^r!}9EtmLzf(K?ivXi55G!o4pK z*B(!syN$17VTvH!# z5vW4O0AMIe8mT+;N|`pA%Af86mr8h+DQ_Qr*Ubo=W^o^7FMtL3BYJA!lca%A?nK$3w4c9w`W9`L2!T6cNQ5D z-v@okwceF8pwlV0&7@DU>aNa$qT^e7*iP3f3;IN&V_-X}(tosxl1MM}qgIIhCHi6T zgnbU4tkr3Pe;WY{V?NsZEmA>sMWDO(yrA)<{R#u30*3In9r(d)4ihyE%h<)zH*IOR z5%%f?h>I5Ds1@N!_E-(s1}zck6>!{PHwuTa|M0d%-x(@V1d+9*ljpg(zIU4RB6DA< z$uVv69F6CnfJ+Ip?)1Z#MsO133zcn&D@z59nleirhVy0LR7?LlQqZ+4y~JeBTzeCQ zee)-q!DX_j0b&j5+7w3h!G+!SZ&mL&yb7QMTQA;z2Jd1jz6?O)%R;#*4R8A)19=^S zHmBW&brwH9GJKOV4Wv}gV_tY>>=6r7E%|lCLed`0^7+9xI;W%y*a7kR_L%?c_o)O< z_Z%NS?*B$R{7+Q_rX89}CSX+!{#v<|(#hCLt#VP;lu}$ElYy2_msa_NJ(tIDD_U~7 zdOo?yg?}`d6GyCx_T`$k2SoE1NJ29O@(44c!K^q=X=FPSS9YTA=Q`;VN||`;MSl znMW`TZbOb=o@vRpL@8~` zUj>doTnXF0=xidHMocXN@9poNdC=CkK7VB(Rgnb#ujv7RSS66$*01mo>hZE-- zq`48zo`zqfB1%sqC3MW-pz0~ZMEp1EqKLWDPbf0Ec6AokJWA-1Yf{8FbKy$H#RIyl zX@u=@v;r!4qy}IlLb#iE0?o8HNo$?(&Uc?Ivn_}uJ9s#%-y~4z(ErvYjv60&o3O`T z-1W-BhhgBX*@1CLGGi^jgm!9fS~_1w-c=YU>u!k-v;x9q@G6Jkd_gZNb*(RNR?yO< z%`U}*>UhgWzdia=W5oz(hSq-$=jdDen}CGiVTym0Cjy+%4XSG`;AX<13e7b`&nvE zf1OKSlUd^vq-m>;7o~6%q(W2eHQ>;^q|aH|;)%~@*!UDl)j6$*Gx{Lw#Kh3zl76r<;V_$_P(zUWW+VORN`yR;(JeB zi;Gm9tm|~bX{Tdb$<>Fh`*oZs>O&m^gO_%^Z+ore97DEM0INR3Sw*F4svRy(7mE%W zinW`y{v77l#vjns<%|W%I=#zmLzMDr7fp)b-BR5pN#potnQJEkz8tyY=tnrs#aUBL z9pl4n;>NGnb;hFz>N@Ts)(0rOl}aTqwAh)9Zq$5XIUu9mS=)mowemeAMvZHb+ED#4@%d zLOAhYPQL%l;6H>WMmk1_rfgwMN%PWdCAN_^sf-?B`EsE@xjgAE(=KYQQ+PH_JLPI0 zAD5Joix1@%{L7W?QhahOJ~|UK&lZ2OmHby?4fs(l&QDp(TKuK!n`)}Nl;;DuZ`9x$ zho*X_AA6VpNO;zd|EY*M&sLV^Xdxt>LA_Dsd?T3rZK9l=!pevpE%FAfch*Bm+QF%s z9y#E{J+DROZ(75ajg>AYP)5%0RAv+-?myXly43zxMlG@Eqi??BsK0cOa_LcTO ze$2orJ5!_?oql_IYxyX8p+Y0|P3rIojNx}?{IcBbw(Zq$DSS>S&{I#G;P!IIc;TAZ zvvsQW(!KfTh8PX?|A7dB6)>7hr(ms>YU8P9SZjsb@@uYQOZiNWAX)K77pOu#N;LE@ zWi@xDX0ZYqxmY&uxt7kdFTbpPYxesp?dXSAaw3P7BJ}}&Yc}u0*cRiOJ{Dz-C?g=x ze16`qgRkq7K1e52sD)fX*)9kpr6PK_L_K~l*bjb;xO;=nnq3UWq%J1izN-(<4#y2D zlOgiDH4@$Al3#<9Xvs23K;{F0>Q4!1uXPGFL~?PoCPPo=|CGkVCbIeEaHHyMn32fQ z*;cpD;|fB~$DB)r7=b5;7JlQT60b)n^=+Zl^QBX>rOl;@)zkf*c}YQFo|x_FEy^$r zPEBCoYxTT9np20OUhwC;pB1zm0rQbNv>Q#&cy`G5?R()+A${X8eD^0~N#b#Qj0kl2 z#vO@guQOmct?nERKxb6YB2ee)xi}iBtddUd5U8UX*gOU%;*f;rw&18H8{JPJd_F4) zG=>9AM;ZSli3KXXnPQOH;`BU<(|#jZ0{nU`XqI8bhDaf8_6-#rXqj#YrdTe^nse1F z{8<|1JUqqBVf9AGB;T8w&?rCP?SEy9prTyVA@4QEaA(~ab8NEWy__H^a#nzzewu9= za{R_z;=h7LwY0=kSyibil%W_`mkg#gg8P;1YKh*1ijAay+Y&XriB`N)c8;+cA^N zb%S;i@Ir)Y_qoWC+MmAHp=k)kK`yE9yL)fr#94UU*@S00W)KmJGUnjtx%ZC5UC1Vi zkK>y=j-IljU#_^_PW~7NBP_qCCu>p%`$?30UeMkE?#{-EQ*FTH*yVn$T^~q^GXQ^JZ6D zPgl=D$mjYqisyP@M*lleo-Ovoj83x&59<0>^TRsNKC<(hJ?U@1`rE&cVJu~woM{_> zmr&W^6Y*cV}B{9j@U8s9;Ap$d;d>t4=?)2}puZN3n= zgc*9|(l6<#bmG@mxB=KdQW2Rao6F5;SvJT%zyNit=9y-fOIfO z9;L3U&;azg=JQa;k13cJ3gLJ>bg$(2c}&810c|2ve?%4Dk-R!bZ@O7{2Ccne9vY1r z+$=JM&=<~4~It$dKlWkX24UzjYlT+i5LCC|WDi2LyVVsl!^f_if z`&j0`2ZB&_#N-I^CO-*rqRIBp*(o{SOV#->C-|!HQVaf2CWhu)3P#4v7KR2TBFtH) zT`{&|L3s)#qgRmYujG@ zOq48oC!oa5E`r6{#&wFtxt*#t)wQywa!y5Q(O5><1XK}qP=G*TEiVn!WP@dUUX2>X zIeRI2+?7k-raBs@P=xX7g`K!@87$S|lX`?aK-YVL&wr|&Yd`UQNSEXHS7mWY(V!kw zT5ej$yZZ3*iLV;6X(C@%Y;Hf?TO3vz6MJs=Kzv48louQBa!^81KqyOyc+8cD>eWF zTpG$#jaOa8*71R!XlTz>pqpawC4*#&aP}nv4rFVAa{5!JDvJ!Z%@)EJW_sfxw20(i zP0?pBUYAr{GOQ`-xf~zG`<+HYIqCM%Tm;?`f5P^2I@oP3OQYxC!Af8sHlZHK6bJ1n zM7sDT)2)_<(i*rs=OC(4S2!_95+}-HKjr17x-dwAZ)CeU4(Op740CuO*{z2!)Fr3T z0mXy|U-n^eLFKfh8#3Bwy(?V!pGT9}-&*9GMUTW+f6fMZbEhxXo<#ikIZOWfHoYd; zjE4r1M?tYQ4(U1>Ps6ZJ>IY?cbg`YHI{8xio5{+^V!PBQe5uQEPPs2_ zc?5O%tn#Ov0e0$ITcQej1REmV&Y%W^;WIp15#A9~{+65{R~iT@6FQ`3%A_XO4!aDS z+Sh!Z)ttn?ocy+CiKkh-2szyYt+%C?NdUd{klevvv5)of9d7QonTR6mmR-%TQiTH= znlTgN?c5OFO5y^~gEQJ?}sEVr#0UVzxjc6rD<`wQ{~h;S1ZJAH{ZU6{;Bvj!JD8X_cBtV3@{W53<+F z(w%ud__|zYgz~8mAJuWR!g++8Qu)2ZdbKy2FVY93K_i_YP1ZVzOm4~Ue;Pxf{bsFi z`L{Tx3K{D@9zD7qsntqMnnZAKyX2bS#ZJQ)R=qdAWF9BOzG^;B(mhxy^H_aSI#`|L zA4-V09o}3O4#S!?c3giaDbieqD8f-C&wV>j`r29+nW9AKZz~2sN>CcEJgev66^s$X z0n;9fYjT8dzE*>2tox z0ndam9kOT65rd^ek-+MGbeMQK_CN@r#22zkjbQ1@Q~&;{bW=)xT)!;vE!bc#T}5qm z-V`&OtRz#j-iFD?U6F8u$c*U-oJ;9_wx7FoY;Yd7K2a z`fGz)=-YIDR+1vrnvW|TCXDEZ?&UR>n&Z7xgsc8fd}O3U?RAr?+?RkH3s{<19GT=x zwslm0NH7}T^pPo7WMLoMC^z$6);fy+Tz62M)!lq=p8Y+{mZK>jG01+!H_cQ}z{I}3 zYfDLpL(vqje7hyUM0pKi#Mpc5p#%T$;F~&xu}Iyf`;|HBHc2ub+pge#E$XFxQY?+4`7Ixd|zjDfco&wvE#_Y^_`oPKg)Xd(c%?v zUU2Zqwo1k@W!qqEL!{%O&g*-Fef`aEG8~1=|7qOLQ}iL`%Z$&XzmNLb zUN%X@y5z{JL%;#8&#c{20)`;hX&q1|;F)+#iA4Szmx_htv`f~&?Ysw|q>{NOg3yuS z&ve4d19KJ>F3B1lxF=&JS9f!*&e=;4g-}H@bVh`uvhbRj(fvXg9Chtzd~f&h4DmpW2~Y$ED)WdqS|9rl`>+;^I8C{(qJXob#%cf zQTOE3en^qWUP?#U8IRNll@m#s@15cL+}R6H%N(;yVs~XI{_C|0SWRSV(Q%J9C75RB z)Ea6YQXr8DeZ`>r|U-(1)O3s+iH*vYagv#qGv-jUMch{mOYR{5*W=?NwqZ^s|cGO|8n;n?c=k{jL+cRe<)pV61x4?GZc>g@UX z=$AuHnQPR&DEiVb_#rZ?Z>P-jrDd}aqubtl0EerClJ>G&(G`LaI3e1&uPY3_e8one*nrAz|;Hf}|h1nWiNjm;1I zEh#3OU~QxzyvE7=`0zZdXu0rg=&M>|Ta%-+dY91w1A&3^Rplgu?rg#Oich($lxvEI zQcJ!TsKzVRO4#r1@B+IGrI@1yP1NQf`U>BU(;H6*qRtA9K~H+pErSkAzOCZ6uDfM* z3xPHs6dg;~att-??G{E9mW@CKK%U)h&84~_7OY9V|chNsA#!tY94Dga4gCU5L; zQ>`1u1}Sz>N>X}>BAAeDzl7m=F*nuSHwHbjn!uU!frPD#OlyiPw7Zl0-(c4cGb|V! zEq_Fe>#fw1%FVlIFB&B;pGzrYazm0wZgj#5NY5Bdoz?7` zJuO37(91%9-}87CC+cPyB{fGnpKqlAM zXKE_&lQ}$jU1-2FY)#ET-IbR&Tp;}v6U50`$l_5NpTneEOthUW7b}oevSOd28lYrX zE)1#VFXJuveG)(VDmp;bChyFdYjD|3e}`nqZ)c+LLBJbYeL+mRtV69DnCBxQ-8tgkQcs&lF-#g^hI+yyqim z&vX(EGl{vX%c5@-Mpuf1~0^8>rdeMEh#aTcVM4dysSKMzwOQB)ap2YUP z>oYq^8o_@qj)Z<~U@bi1c!wW#Ws7W&eI89b6qEOzO|87icj<(R-5r5?$56m`%_Q4r zQHi}r%<4bC8vT99lvk7h{C^}_4Ept7>Fm_X^@>gHE>f8mYm`g0>d*-;wSu`?-2={_ zFAHmpCL(GF+ntaa^i!4lu`4RddwX~9SoPjWw!So&8wS<~(D22}KPL^~o${D>eT z{n7x)jR|0D3faX;Fb&wBT<(0ycSeNMQ`K2!KvfPwCQUN?+=#j)XTPAhlB_4)$EV?n z#%4Pif)1Zi5SEH&1(df&z;^Y2gQjqS)^I1dPD}tssO|v){@5Elg8o95rj-> zD$hD#9VOz*LtJSc5Mq)eyem>V?eY)pEI2xb1Jq?y;3(}N7U4P(7(05u(2Mx!0M*3z zoVn21BI;{JCGD~?2Z~!Zeq|x`m=#BwZx?=bqZZVc5gcf0cbUa7M9!{$mdr#3?x17M zt^%INDDf3MAeuCGJjik=jMGt6r_IifU!`G>uAInsEBRS9Oq;^)CU1!M;MJlrIWT(e z1XCEK3^SpTb;V}Y%-0JAJ6wC*_OoyF`U|bt%U@7W-T2<%BfB82_bYSRc4D8M4gCt) z)a`8=W4arpAUkLR8jP26jU{WgXEYv(*WRO2+LRtAl%kh1s)QB|-&ifvLGC{IYu-tW z=eIe|Pb2hQy`2H9soeXvDKc?&adaGmkjVWIL6ck)7Ej7TyR}>?Yy95UNbekak`bbG z5gwPR9cG>vROlT!yGSQ07-l6lHq)fPtdQxvOvTcaKA_SdV0Z1A-WpLD;W*xqOGO-Z`Z$(1#6Jz)3^{co zpax*S?y&jk{yKNrbu7Li^TGDJ;(W{#0F+IL5*+VP4Ycl~kG<)U@JG2NzU8426C3-h z85bbcU$709l@M&CjUy+3m#J-@HjK3&q$Nbapf z#91o~6z#|UwFu=GO0K2Fq%4#I;12b9CWa7Q(cG}5NsfsjDpFZZqlituGc}o`ot!3> zxv`Nd_~9ak5?!>kfsco+EA1!pWf2Q1R4%=8-xx`BmV_`=QCo&~?JMyGbyoOkWczL= z0;OgBppcXTU1Ri9!cPd1lb}pQ=4|k$!{mqN_V%Za*T|2wq35`k;VSBa!B=;2pQ}-f2J8^ zdlqI#0tU!NG`IOdGiUvl`LS^qlwc4I&h2Jb@uob zmM}^^Orqo)kuSAzF6H@CyAa*0Ql<`|5$d}X%HV~lOt0pYosC;8$5%{TR;?YJ9>(x7 zwd|&~N_ST=DW94b&Dx^^Kt;b?OYP+ces8bu6odFpv8_%u91|YPP^Ig;PMudgjuAWk za?{uHS^^?sUtjVyQ#5bHa`RX_$1i$V_wVcJf2>>Zy|gSK>hfb@mRO5Bkk<{LG?aeA z^gP4YWDqRpbwX85QnJ+VfW~o%f3W5hH^Eq6kZ7-82`to@c};YB(FrQf%kM`7g>Z<-UF{X z#LRaW!-JO#6O%SnMCC&>KT%$R?~PQat2x1J#~0Re4lU)YgTL+CV|Qe(q$8gw(MLE( z5Xzb~0#x48)({NHr>-^WqN!3%dsisGX_lon!kS>H9AAol7~&WX|KU0L^_^pNx}D`w zbm3ed+N@^Wyj392 zQN>vLIrdO~>F?xt`*8z#|9b=8!47)xri}EN*AVG~>6K4?-uEoYww%OkB(GddmetbnStQ(qj(AJA>Z-MG3KXF1BYUWVUxy5VlJrphR&%B zJ)(yqH1HFjcP4#mtWVHB2@RxCdzB;PX{VsQE}HZ|RwCKF1-O1eLNNm%Zpa?J5 ze0EKU+|IB#g{)&pJ;Y#^Uw-uMT#V;=35M`!`gNG?9E#DlP5-(D*a*sC1}f<=ncg#F zrtbj%N3!hy?|MC&`?0ZHZ2vBtSjxnaiv8>L&`l;W!g@VIXGgL2EC#S%&paa}me=FL z@niGGOq>X;#!_&4&?WB;mOV^(Ko9c-S?23BFcM zb!tx`+v|-M*U0|P;f`CPT*QLF?wBp;##hY#_YJ z`f0eL5T`sF-x%+nNEG5nJlPBXbiPny2EEPP_8i)1fyp5ns$Pl9+p5G>+rPih@h%@* zP+Wfhq5b)&>X{utbY?@#QG1V4;MHYEOe*U4ZmjPe-e|E&%+Q%e7~&rVx|nz5 z@EBiSSxbwOF@Xki!Ht5^Wl~@`3F|Z-@+XFvpF(Ji9A>_}$C8%dESju~vi13Fi+URX z2QuJ8VJ_u+>C8|RyJ+iNf9E3tKo}##8E#yEz*z$Z)BMD$3 zt+gD+^K+D%Vx!=6!{!#D1dJr?rQvRQvyZBvx0`2ldbgnlA*^OcIJMIk#-w%Jxz}j5 z4id{dH@DZ7-E_C}i5ThLj~n6lJ(CMK_pcQ@th)ZSH%hC3!%)%cL`>Y2>pnA`=JJIq zd0C9!C0M!CAMgwEG*I~X6pW~bqqDn|q{-Y$syC3L?n6cJ>HrULkkMw`UkUg>SCZ}*^<+hVPlY&1qW9m1AiaA znQ`!fhl?1;qMVOUYK21wl=FFsmq7Gop&dPyr$II2jBoQk;Va%A(e&0jg7+>-d6*DL z^~-8($r|SuNqZSL|NRq3Ys<)0rlk#)_8noiB6SAOzzB7x*W-ws`cGVq-s6ZJxg<)vco!^5< z6#9GQ$zeA`Q`Y>pkP6YJd_%TQ*5l@yC>B?QL7xTEu8&dt zplLqN16E;X(#~?wp#d15cG@ac!2j&YBM~?lxhb@F0!mFEos>@-h-1*PEtah%{rncX zb>sJ3Wh12nh6=zhXcuG>U>{TOsXJV>@bBm5BKaU_zy}k=|Ebm6!hEe=v`uoyuOpKU z2-o1vW-5_!Jd+R>riwke;9taJ^ z6-xhHv_+l07)cjg-ty@}yX6A7*{D)3YV9E3@Tx12AW`ozqvK&KtQ8jGa-%(wGOl4gshw6=2)EC_VB6fU_%=L}-(*^~2=kos0**2cm z`eCOlH+Oc1Bf^WOAG|YOVo!RSJVaa=dFu6rT>V1bWZ98ZN&xH+iR3FHGDbR_bB@2Do2{6>}FIc#X zc-xr-KkZWjM-C)oh2XxCco@C(V#9Yn)5jhYD3D8O3d=z+!f{|$Rq$ea=GO`)k>?p+ z#N!DRv^b!lH)vlPvzLwWH^(%K45GikN39M%*d1&b(N1vTOZl*Sn>;!ky5=4`*qmOe zXa)6Wy?5hFLLn~P|L7~7(83b1a9qCjsX|w-F+^W082BS49PleWl5G{Y32$TWi_C@| zVDDsTpX}SH@ zf6?nmq(&tpHwL{rKnZqoaD~wzZ-zoa8oo?!bYIlX+dU|(i zurA0z^yTpcNd&2~{A2q0$f=EWMwTWUak&MU-P>+jMtAns4=|W95 ztCX-v-lkUgAA8w#O`rF=M^0eu#R&^REV21|SY%E`PKB0O%7l8j+0Hn2`Afo*9?Q*) zOCQ=}rP6!ewJfVV}oT z&KFORP{KZs>AF9ZPl4So;kA8`+_kc`{ z>XkHW|JhQvQlhbJC)W9r+*^^*%_2D##KrXc{+fsZNo;`c6+XzWGecUJbjUXhTwHF6 zAR$HZG&moiT)>p=Yw56(&93vssXN|nBmNh80%wQ7_;MBsl9^*SKmOrb6LYH5dY8;z z4w4$w%<+$}_aWjYZt8U&-H(u=;E`;c>EEA%*JsezXU$L*XAsBacY_|+ee%7npI3Jk zV!MbxfDz>sHiJWH1=B-Fc_uSI63GbC5+UwH7Wk4_R2D{1yg`lyamGQv_~3ZxesxI>P@89 z$4~{u!ZhmP;^TBu;hzjK@R~x0LAn-pU`fS`RWm;NyBEex*?z^7)F-OZ{FL8#X{Xta z?VqfZkq0dRfLLThTsOelr%I(!ECz6vhZ^~&>$Mx=plg$z(k@Jjz%fg~>ekhACH+uq za!IXX^dMYGXMwYt#s_dxszkkQlvLRR+eIysQ@4dZH+IeY0+6n~Mw9u}*%d7ZwJa;Z zh3sIxJ!67r z*7t87i*;_gAGshFe14mx^OeiCs_xxkB6VZ{9IM|!`&`QJy<(eqzr7qf;WGXlWzcgr z^l#RbfIHP<-npG5P|Sa`N@f=4QkI^$+NBd+QP(EZE+5yuO5~XT`?9A&PcTSt3Q~O5 zDsm)n!?2qxdOGlKpjodyF=6gpfF|)b0>t5@P%|s4!H!qjR4rtMVGJ*KWrMLOQ6_llx&jA_X>20LZKms*nrS3>mOJf^tCZgL6nsDjGp zvsa(KTJXOFnILluQwrJeV!?fLbsh`OYBG7tSgeKusmxm;toSn=`G0hBmR(T*U>2rf zKq+THMq+5B5kXQIy1QXWkuGV5md=rGq`RaW>6Vo4lul`9**$yq!+zOw_D{U$p8G!c zK`KSNI15R1Gj7SHf_k`4{Vy}Zo=z5&atVPf`1xJvgy1oksc4xTn|;w{Vsg8f>Bxov zHSgEfilHCtnA3i)Lk~fGRTcTr*Ys9`HChuM9gd!?iHggnfik%p&Qf}R_7zFvr;}(1 z={@7E7RNQ!(_!{E7{;0~{d~1gO60TFxfC}KG2=F;FTL|C`5%?6ZBu#&?P)7`^iwCip$m%anBY6kw zDC++lV%;pv1vc>Po|oNPr%RUeA`DYKS1e3gxvNm!o43g-&Eq}h^}V{#vo+Z^5N8I9 zh&_RVcGgy@+n%F&hJt1DF$);F-lPAAHge*FfMIyX?G#J9+YYHdCKRc<9Hmv7e(>3&n2it>sTpD zjIz`XGTr^q;4+&gC|sT3-3%sJzDQAgd0?#~z(e);i%`X&%Rp*zruLuWZj#Us$p@@H zuL@@cTmCKM8?X6yS!H2;M>bJW{_~xHeCMQu%&Gnc5>Z zdY3Dx^jB=}dzH0cyFKP!alM}}!>rqnER-J>m;U{2`qh3y@c-HH;CubInMChsU-dun zS?oB2)MtG58;g+!%iWK{v0$#UF>j~ZBIQ69SGPymtIrdeLXpgNWbxZmMNH`o!E&1U z)207oCNb`bpwQO{Td4gsjV~~w6{ehIP0?Vdf7zGV>QObJ!TT*oXJ_nYAA%HZ^gNk`mIhRV+*TRYRqn3cVe`Npf=SlVdSXegrE zT>|p@<(#=UI5XPTcvaE)P2&Nv;#5Gx3f{Tq*?%qd`>h`iaC?Fq7wj`QdN#)F){wkQ z`tFjeMcA-Tg*Lvp z`(o7}NST6g##IXfL-D2dse@i=HNip{VSnF*7WowC`lEySXu|1Dca1Qq)HZUWDI1t3 zA~_=xvb^4dX|@rBTHN_cHTyV5u?$ZhsY+vHRyaW+8fGX7gcp{O__x>Eia|9&WO%IV z5qH#3k}qUiqGqLh1rgQ2rh+uCVV&p{J2gOLsuM{9LnieT-(a#y+#i!1LUu;-?^FP} z{gnSoIq-(JMWWYS5vqY`I{=GptN@Gb!dIH&OSzd+d>AO-q&)tJcEga98x4hb`KPP zg3fX&H+zfnJL10G!OyZ~MYMmnD@a4d4=W=ZgK-{f%c{}`$9iq3Ax==kvRcgd0P=U; z8H$&?XH4s{KEK=0J)K!C#s*w>Fy{L>nv)9#rKLlWOde@_up(-nCF(vez8(lAq0dj+ zb?E29-p3(FID-TZkOG?sTcgK`>ys&<_Ev)YFPj@tj_KNSL9-1|jij-r!kp5HW;T>| zvAZ&P+)NP#ywKEb-#QV zWgTRqS^(Lqt)uR~VBkUa^t=9WW|`wJ`!9YN>MM=$dEV1iwQx1&5&2F9z z4ms4@>E>-ZVljm-smKy|K$;8bl|IFf=%GSCw7|_ujM=nR=x!OBJ2%QjBQ95lm2SQY z=#hHCzphfX7qv5au|B&UWbe`%8<+mr`JD(B{as`LTy1g0COsITIJ?JTgAd(7#obuf z4FXp?<3s*jXCkw7EJVObo=~;mybqQA2LuB34PDr|$Tzo%6tf5MkX4|1iVfb*#P@JMZu$ zCOph#(quC*#0fS-7i?tGuqV?s`N3gdwOk^}JpRbY-;c*oCKQ2$F(8*@ovM;`L74^z z2OjJ*;)T>dDL2h^)+Q=&nrkXx?+*+bJ?5U?%!?r&Kj@@8%*$Za#TAtknzHB*nc48h zRRHWThwp?Bnsft%`AR z%X){97pL`ug4FjXFFQBvNN~q+*E`8jNl`e1d?doDE<49qLpj;+ieb^p8UBjo=?S`?V_ zb9#dRTeKz_j?c~8_Ft1^N*-&B=QWUQ91VBY^BRc0CxHMqoS{p+`#t*kLsZUm@p&{; z^ebghxO%Z_ol~}%O z4HsJ7R190)WB*aux}SmqtWcTo+v2OYpkE$xHOVcxwo<)rXmTRmI84VmfJQZF-w%y4 zXVr{UNAZc5_N65bkxCY}^=r)r5OS2Q3EOWAOU7p)M-J9@h4H0hh zat*6+7Wt@a66Ah5>DPnwwR^hnKGIM9fPMD>zdfO4?n)!TlfAnLm=z2~`eHmGpR1ZR zNB3D*J=ya89MM&ouDIN+z z|K@j7_U_zye_&zaZ@Er$rnQieD@&QEkN=u-!@d%xW{0y1e~^h{E-a*BRhlBjgW4Hj zX~cYe9LR~}a$}-TG$u18WR*4!G{zjRgFg(~V%@STvF5njCSUFEns!7*qy(6J)=(`ca$$g>JW;W!R9YW# z6vTlac21*awqpyDFARY|!$fgJc}zYays8J2=heMyHqQ{qk)}ckxzbZ{OtS0Sh>czZ zXjm@*$_#9pn58PTC+x#5S&P4`9odyb-GZq@xZpN6+g>1+T5>8naY|S$4pDcr&%&vC9zymq(V?=e?;+vObaU$#u9AUDLd(_5jC(2xFzYe6+j7s(+s% z#$EpnEatW|jbof|iqZ#PKr%1+L!RqK&2P$s@G^ViLq~OXft|O>H-@vckMaS#!=51c zn;JGCd|6QX#(#uxE2~jQCA4zlQlXL8U=xY^Jef2LUwMS)#WK3BZoGPCblL7ar}hnK zd!Ha9dC@J(^d`O5Nd*>i1qJP z$37N=)%D`~fS)@6Q^krnK{4kE&onVKik2KLrw=8Cd%YQ7M8jIV2`isJ_)6Ii=+xzo z%r!5Ps=)B*7}@wOx7QiucqYsdgyStm7&$X~79cIL2~bS|Q}RxRvnLF$w3zj=h>g%A zmNtA;pj|Wt6GpFt24Cg9>cb4dR;mVXC`|D|2HrADte0&;wFW;1MR5se_vR|tzoy}( z!LVM(Gd+lK8~mp;Dh<^&Q9jt2#xLibH61@KZ!GN%$TZgblRn^0#fqtmB(hmm zPabGnTDf}5gdiNtM7reduqL+z8J3_;!$pNM|4d|jx64hC|17DW%fDXZn8zo#?od~( zib&ed1$v;!;#sT3NrdKfs+N$nFQ`R|hK8Qf8f@%qss9xkh$Q&l)$jJVJ_$n?VzY1S-;P9b=D$!y20DRE_tHF{jYVh zH(VnS=`7|CUNSxH^;y{UM>id`)PQr4WV-%@y!yRv9W1GC_HNnAHK8E@nQ>i|6?|mb zPW$~QiI!dcmpb(ML z?0l#vPeC)#!q6IUSb?6oAIW93^CwpvPQPX>;@bcuC$#bdDGd&H8eh2H_P)e$D$|qQ z)ckVWdoG(5fo%%?V?E!;=|&)LL2g=X5(VKnIScg^3ImIHB-V|cBf?o5h}}v1sp#K9 zqsn`NgkKHI?{X!gFH-_7Jp1)|Z4nD^&AsuN0H*yHF(Vl{RSQJO5nJ9tf7F}L90Sb| z=MI82(&BBwEq)2OuWj~|5Q1)dK_K9SB?AE47jLAVjF95W1DNh#h=K>*vflest>{4U zbo+w}xw8cyQB)q9`*FY36=JGw-IHMqKO-&v1~3HqfYQvz@%WQAB#XpXTo8)9mwq2p(}8?SY5nC>ydL!nTd`=4X}+%^FR74%0y%%cU{( zn61ah_@sBg52bLT)++3&3I9UYpM#5r>md!n#%g~h3aRf8Yt3LbYVoozLNMA%nzcR+ z3SoD5>%C6&djo2tU0fG|+*0btCBwQB|2_`lnNa6G)Y%_l?<8qD9N~=txHz&ygtlO1 zU$+9Z4z6Y~lGO{pqG1S;a=0RO+Iji95D#}}STE1TrTN0AeekEK0a{}6)UN{jvdy=m zLRl^)?ml}4Mgr4SS-{W)7HXr;(e88}^S*@44N*V1xEj6LZ-u99;v0`z;PjW~c-RT$ zFTuI%O4lD}!lydPaH)Uej*XFYXJ!so15cG4LnXu1LP$;JvJQ`=d7nQ|`0e}B%J)<0 M|E`cPa8LyQ13^0wdH?_b literal 0 HcmV?d00001