From b23e6bc6869bf67f7444ba9bcf53c873252a8938 Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Tue, 3 Nov 2020 14:02:35 -0500 Subject: [PATCH] feat: implement design for the URL unfurling --- .../MessageComponents/LinksMessage.qml | 140 +++++++++++++----- .../Profile/Sections/PrivacyContainer.qml | 46 +++++- ui/app/img/unfurling-image.png | Bin 0 -> 11872 bytes 3 files changed, 138 insertions(+), 48 deletions(-) create mode 100644 ui/app/img/unfurling-image.png diff --git a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/LinksMessage.qml b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/LinksMessage.qml index 6325eff816..ddd06837a9 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/LinksMessage.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/LinksMessage.qml @@ -1,4 +1,5 @@ import QtQuick 2.3 +import QtGraphicalEffects 1.13 import "../../../../../imports" import "../../../../../shared" import "../../../../../shared/status" @@ -93,7 +94,7 @@ Item { sourceComponent: Component { Rectangle { id: rectangle - width: 200 + width: 300 height: childrenRect.height + Style.current.halfPadding radius: 16 clip: true @@ -106,27 +107,45 @@ Item { id: linkImage source: linkData.thumbnailUrl fillMode: Image.PreserveAspectFit - width: 200 + width: parent.width + + layer.enabled: true + layer.effect: OpacityMask { + maskSource: Item { + width: linkImage.width + height: linkImage.height + Rectangle { + anchors.centerIn: parent + width: linkImage.width + height: linkImage.height + radius: 16 + } + } + } } StyledText { id: linkTitle text: linkData.title + font.pixelSize: 13 + font.weight: Font.Medium elide: Text.ElideRight anchors.left: parent.left anchors.right: parent.right anchors.top: linkImage.bottom - anchors.rightMargin: Style.current.halfPadding - anchors.leftMargin: Style.current.halfPadding - anchors.topMargin: Style.current.halfPadding + anchors.rightMargin: Style.current.smallPadding + anchors.leftMargin: Style.current.smallPadding + anchors.topMargin: Style.current.smallPadding } StyledText { id: linkSite text: linkData.site + font.pixelSize: 12 + font.weight: Font.Thin color: Style.current.secondaryText anchors.top: linkTitle.bottom - anchors.topMargin: Style.current.halfPadding + anchors.topMargin: 2 anchors.left: linkTitle.left } @@ -146,49 +165,90 @@ Item { Component { id: enableLinkComponent Rectangle { - width: 200 - height: enableColumn.height + 2 * Style.current.halfPadding + width: 300 + height: childrenRect.height + Style.current.smallPadding radius: 16 border.width: 1 border.color: Style.current.border color:Style.current.background - // TODO add image once Simon gives us the design - Column { - id: enableColumn - spacing: Style.current.halfPadding + StatusIconButton { + icon.name: "close" + icon.width: 20 + icon.height: 20 anchors.top: parent.top - anchors.topMargin: Style.current.halfPadding - width: parent.width - 2 * Style.current.halfPadding - anchors.horizontalCenter: parent.horizontalCenter - - StyledText { - text: qsTr("Enable link previews in chat?") - horizontalAlignment: Text.AlignHCenter - } - StyledText { - text: qsTr("Once enabled, links posted in the chat may share your metadata with the site") - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WordWrap - width: parent.width - color: Style.current.secondaryText - } - StatusButton { - text: qsTr("Enable in Settings") - onClicked: { - appMain.changeAppSection(Constants.profile) - profileLayoutContainer.changeProfileSection(ProfileConstants.PRIVACY_AND_SECURITY) - } - } - StatusButton { - text: qsTr("Don't ask me again") - onClicked: { - appSettings.neverAskAboutUnfurlingAgain = true - } - } + anchors.topMargin: Style.current.smallPadding + anchors.right: parent.right + anchors.rightMargin: Style.current.smallPadding } + Image { + id: unfurlingImage + source: "../../../../img/unfurling-image.png" + width: 132 + height: 94 + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: Style.current.smallPadding + } + StyledText { + id: enableText + text: qsTr("Enable link previews in chat?") + horizontalAlignment: Text.AlignHCenter + width: parent.width + wrapMode: Text.WordWrap + anchors.top: unfurlingImage.bottom + anchors.topMargin: Style.current.halfPadding + font.pixelSize: 15 + } + + StyledText { + id: infoText + text: qsTr("Once enabled, links posted in the chat may share your metadata with their owners") + horizontalAlignment: Text.AlignHCenter + width: parent.width + wrapMode: Text.WordWrap + anchors.top: enableText.bottom + font.pixelSize: 13 + color: Style.current.secondaryText + } + + Separator { + id: sep1 + anchors.top: infoText.bottom + anchors.topMargin: Style.current.smallPadding + } + + StatusButton { + id: enableBtn + text: qsTr("Enable in Settings") + type: "secondary" + onClicked: { + appMain.changeAppSection(Constants.profile) + profileLayoutContainer.changeProfileSection(ProfileConstants.PRIVACY_AND_SECURITY) + } + width: parent.width +// height: 43 + anchors.top: sep1.bottom + } + + Separator { + id: sep2 + anchors.top: enableBtn.bottom + anchors.topMargin: 0 + } + + StatusButton { + text: qsTr("Don't ask me again") + type: "secondary" + onClicked: { + appSettings.neverAskAboutUnfurlingAgain = true + } + width: parent.width +// height: 43 + anchors.top: sep2.bottom + } } } } diff --git a/ui/app/AppLayouts/Profile/Sections/PrivacyContainer.qml b/ui/app/AppLayouts/Profile/Sections/PrivacyContainer.qml index fcb70fa5c2..4e4f7de12d 100644 --- a/ui/app/AppLayouts/Profile/Sections/PrivacyContainer.qml +++ b/ui/app/AppLayouts/Profile/Sections/PrivacyContainer.qml @@ -174,7 +174,15 @@ Item { StatusSectionHeadline { id: labelURLUnfurling - text: qsTr("URL Previews") + text: qsTr("Chat link previews") + font.pixelSize: 17 + font.weight: Font.Bold + color: Style.current.textColor + } + + StatusSectionHeadline { + id: labelWebsites + text: qsTr("Websites") } ListView { @@ -183,26 +191,48 @@ Item { model: previewableSites interactive: false height: childrenRect.height + spacing: Style.current.padding delegate: Component { - RowLayout { - id: displayYoutubeSettings + Item { + width: parent.width + height: childrenRect.height + StyledText { - text: qsTr("Display %1 previews").arg(title) + id: siteTitle + text: title + font.pixelSize: 15 + font.weight: Font.Medium } + + StyledText { + text: address + font.pixelSize: 15 + font.weight: Font.Thin + color: Style.current.secondaryText + anchors.top: siteTitle.bottom + } + StatusSwitch { checked: !!appSettings.whitelistedUnfurlingSites[address] onCheckedChanged: function () { changeUnfurlingWhitelist(address, this.checked) } - } - StyledText { - //% "under development" - text: qsTrId("under-development") + anchors.verticalCenter: siteTitle.bottom + anchors.right: parent.right } } } } + + StyledText { + text: qsTr("Previewing links from these websites may share your metadata with their owners.") + width: parent.width + wrapMode: Text.WordWrap + font.weight: Font.Thin + color: Style.current.secondaryText + font.pixelSize: 15 + } } } diff --git a/ui/app/img/unfurling-image.png b/ui/app/img/unfurling-image.png new file mode 100644 index 0000000000000000000000000000000000000000..da01162e6511884032b1efd85b9cc3af1de92051 GIT binary patch literal 11872 zcmV-mE}zkfP)EiAU@b(q>}U0hA!fhO;D>`}6JhKQmqFx2miAt+%VXduF=lr@NlT z?0nNxUDe%F_0;=UZwZ+I0ud6a1oRDiI|2^&BPUVxo*<4+CUAHZC(;811oRe>07Vk}djsouuLSi0X9&YK03~gZ@nZ4v^g9GatH`;0>{Q=qQ^%s z3F66dusH+-_>egB;K5@pMGT>5KjHGBy_g6fW&aHFOv5GG>MB*tcc>|H0Xwl!q#Tb+?=CiMtc8# z2#;(7Z4mB#}@p*IA9UWL7V{59EJH2;sH=^9bHc2*HrSG7xxR_p#<^a z!$~k=wuIgg#KXf0$b=gLLClZ6od}+~TvRFEzdwdoe{f$(4sGC5pWKB1^2aye=Cz{p z4W+~2zHT19AP8K#{rHI{hCmSW0VRhU*NX%6M?XD;*Is`#lPWO{_7l6r%ZW7c#XARu z?@(e1l0>uU1wo*3@*<6YI5`U)XjY)j;YKohbF~8P3`h=(1d_zdzk9_xhU&%#A5DTy zqCxZ`)cPXKDsuz96)u~@GRVQ#E?(R9r|Jb}1=K_52?C9i5cpwkpevJmE0#qLW$h1# zQF5(;AeurC2to#am=ma4@Hhu!b67TzB!2wHp>+(e6$7^d=0~Rq0%IR=;g1jk{{tyP zr*bGrjV)>+s4Swx@3VkJlespLe%|nlTSLnNjLu z9CV9$f$9Y{PNE_3?psBIKq5dA`0Y<_);2;aNuq|jffCDK{O|$Xn?h>&)j#T`vXNFj?NGS8Yg3kL=fU10s@*sX9z+?PNFB%B`rw$7RVwXpe{N=5STP? zRA!tM)>}Y8KuvVQNQuVDAQv=;VY{1S1*{P|Awh)Lhvs1Ry9fwCti1$bvPK2W53^HN zh#LqnSbGWL>^!hTQ*e=k**-6zpICc>7>{z}qfSptJ2?Lw;KTN|Sh=j#0n5i)6U4>H zHcl2@oc8CC-`bCztzv4qKn?+GZG#w1X`B>6n(%@z&U)kS5d;LREkOk1WV7J8C)?V9 zcUcJQF=oTs62xc};_cf+TPf<7g&WrfaH(VWv8m#4$!i8BT#UyH$ zb+pSs6y-QRwGBF$XL6lM0*$O+{*V6z-~Zu*!t!t2P$$?V>S65&LZ!5)6GO@n!u5g> z1yL6p8^x}GNoilYy|~nJZQ#d0J%m5~ulFpHKy~BF1i2kyERLdvVLb_8)2_BUu8D00)mg5>Zg$*lXMWcKyp z{rihcK{v}@pd2Vk@Ljhq?FNFV!dejo8Yg9leP|RYJ?!n+t2c4B<%wT8ni#ZoajzjV zdh_S@#y=Zj-_A;`6+v7C>7j9Kv#se+GANTA4BlQ~AQj)Wdsf_i>%{sT43*Vb8-l>B zQ6X}&dGIwDuf6`b)_IEz#eVzUW(b0-MS&oyu{H!T9&70#7#o`f-&E$k-<;Pv54{3! zyxBfU;G(g0O1a-PtPMf%4S9tqe+AS7x8zsZ9w`3j0`f#OxuTTs&=to)Wv#+m5Cq0P zOr}&X0&%nt6xlHlsV!hWiYBE89zK3C4g^t!wIGP|Q7}HV1-=I3*0t$&x^=k^o50R)8bp-d%sb)C#pHG{@^||iDy5(osgfM zA8B_xgj`o)qdeIE3sO^Ia{Rl!t=W@Ezn^3NB{Ys;m2=OyGN^lE>;ZEGW%=d zvh%P1-c^_v@BHGdpbmwQ>uLxopijq>9+ZM6ai(vN>S z+hD(Qdmp}%i1IhDO_$Bk*fVIX!WTb#pcafFNqpw3zlJ7&b$2ZEr8BArZyCagt?02eq-XisK zH;NnOAW5K+a8^meU@sZu=wAHuZ`{i2MSI123HiM9f6=%p;pX)XxOIJ?mY8!_q(PGe z@xt%y!ngnUM)nz#AAj&sFm$=F(pjx1vsjr$SmIp=C^`7Z0cZ7}+&yX}FD2R%-XZm% zRDeW)uP=QTmIAa#Py|DzA1g}`xG-xHCi~Wa%ey%_pdA3c2VF~8%fS=Kgk|4;tSmu{ zCc$Xb7Pb;8et*v<2eda(??K;i>K5U5Y6Tk`C_&gid*8{yU~?l%RIkwSC{~gnMwpZqJZmXJqRF|i$MQd5 zNOK=oOQKigTi^SjaPKHdY=uNJ8CH%U#>wwhrUqslQAQr&_w|BrvDZ{GmUYC>5_0^b zZ~b$DBzCq#2QpYWf|$(Vy0AFHM<6}Ntoa|h3iN1v=dbK_AKP0Y{Mulpo&<($q4%P# zB^H4n=F9)kRs4!QgAf;yW2Fc}C8Z_IV2C1yutsYgfZ^4z{NeS&s>xNyQ83VYu~NUJ zFZRL5=Vc@j<^VS^{{x*NG5^E8kDBo*W4;9>2aJ;Z+t(kj&7K+8?&0Z^6pS>ns`%A!F4QK!xEnaPMGS|LimvQ4Nvs4x zjK(tWxDsZ{9#tzoqUUh!!HHqk_vQ$cLIP+)3RyOApAXE6#bY82N%U3SSP6odjBy~> zyp%b~qtCd0bx`Q&^M+ZY^w1R`Sz_Q64<193z@_nh#M19t8z-@Y#`6#08OWnAIM|P@ ztWgNuy?fp;>sfMGPK!mlA+aq?!pk=W!rj1e#b@8J^gA9eD(ORyiDGjo3M)8q$EqLw zbp9l>O(d$V0fFhrC;bVlMX$xJ zkJ%~hQLXrkmbS~gnRqmw`}8(^>CS;S`D`5^G2pg)tCIQ-_vOGW+Xk3*>fZfHFS1W9 zjUZ5Zz@VKX5u`o`iHo)xytFjTqE7^I>tl90dz=x!{K`MUB4Ehk>4Yer{^SVPTUz{mYSheIe7;X8#{@cH_((peyn!w{8?6I;mg22G2ixKjG z%X*mp5KWUrf`>iX|6qR)t?ssA@=w2Wuk#6M+XA|CaT6bdzDN;Evq7AX^%_m#v`VIf zI9M!a0;(4KOixCyMIeXSfyP+sZbd`oUJnw>EQKKAM86P9Wtk3hdZ@%sbgM-h9iB z$H3sJuDd)JP7r8v$n`cOvWetEe6GzXjgbhb1C$;pP)iIaNL8NwylGunq9vUb;?67=_uf6^l0-D3y@3M6o8_;PifgnIh3;E*B zoG_$wsHe6FpTRO^2;VaBK9R>J6M0d3SeL9$>w>qLp?9a_32qm9cWPl48Yc^bJAUf*TVKrP|HM_su2RHir~wT`@CaT+jx)dqY((A0VwYUl7rC8yQLut zLJ}fXCCrh?scIO>BanmvZpcg33)GSCzI6-%?cnIx4%ZJhh&h3(MV#snbajO`NeJS_ z05G-)V)BBt%ykC z)o|M*sPy4`^#wayLA?lQ2MZwxIWcB~)C8&Cq-C(A76_nHM(U@u(@Rp1hMx-hLKH;zj);g?gVKloUh!Lc9z~y|2ed!X z;3$<}VTCs2{rkW9tRzy0yKH}45(2dxr>HcsZlQmENpBr{&ptc(hS zUXcIwfR@zp=?S2+<0<-vO|D+7kn~U&n5pTz-@LVUyMp%ttrCO;$wHi^a&syO+y^7h z+@AWFfI);wYa>V_C4hQ0L}>t3KQ}hv`tJuHuBWJuB=O4EuERP2)9F!kIjdB=1QBaB zLch{u(yWV!(qn1tg8-6ZP7?A+ze|}WiUwL0$ykN{IQ^3(c#zIIN)QIPPblWGTy@ag zl!#*D{0Qt^%EwUqpQIUpmXQYu!9{Edj zQVrqJrtg0^fpx}9xAzM(^s3=$mePL`B#7yt1~_?UDy>6c)| zGZ@#VZD}B3*d=byK6y2GPQ;@X+f!l|th$qeyg)2iR9}xO`;Rv7#SUf)S)n7Z0fBQe&gcqLQaelYz z?#@qr(#|tC4idz)aEBJL8jN;~sx+t)Vm+Ng~LU7Vv)utC&@-(W-BnJ`g*(_OWqg5yEt|Dq^Mkq?0k_#s~su@;?h9&=x-RulglHG^%3Mo~Wfr$GmVSi?S;dmz|~PDKP{Ri~h{KUfRA z=z=c4!7^>5qj3=2=5zC7%_K++riS+OMiyn}gEc#uvLgZj?x{Xh;5@c4|2j!O@SCG-LsImwTcgtkIt zi@CIgBGY;=5c)$dkz!bwU!a22nTC04f%H3DT+)GS9}zsf4(LG4o?4<$h|;7y{Qo z2mtupi~H8+NLj2eUlyLKD5>ZWi!|aAjEmG%DabjA zD=Lv3P#hH08`=@@rN&RsNf2Dm4$ye^U)#&j&pIfLa^SwBD=<~$)=92PXyj6aE+ewj zlo~>#DoxA;>IebyH(HuaR_#cbRQcU;c%qS#{sw4+xOHvzJ?U3D z%z0V((wzhA^Ld9us||1~N8F5QZV4ir(e)>o2YJ*ZAHYTpk=gg=vvF_a0h}UR^Lddl z{RsD271G!$)!&%bZrmj)Vl1t#_nv!Z3+~+=!7Ny}$i}vTHW^NuhesWceTed%;^&ee zie6w*@v4HzYA)I}1o3*rH0nCdH=$voBH}pKdZN(wOc6UJA2l3lXIUksMT-ePJRtMYg;gn;1l* zkV|1*!2@<~|4uM8HUW$#y~79sy{JVHiOtBnecbs2u`3_B?io0F9SFZ^wgNjN;CQR^vFh zaw$p(!j8n9d3eOu4q3j}tgsE1`7x0$(9(;vvVjk&q!8&$+2>;|HDrfyZtOO!JSfz3! zBskW2h-8pxO1K#77zk7!L_|m=(s?B`lL*Tsf`6hku{l81L$hhsT9Q@6Df7#}5aJo; z0+$}pwRzkT^+LxQNu^GF{KgPIc6FH995{rWF!_&T$L`xO0MbT zLg(8@PpH}5GvodA!O%8HJXQ9cKBkvZG4)WFDG4YP2XNNme&ICc$3b zE{pA$pfQ&mmX(plpsOp9dJTSl8Rm~HQHS|xN1Hip$@FWx(UL=wJ)8WPsWy*!0p{t7 z^TjxjN7R-yC`*2$?0UcrnO~8s4e5B;;0p_|H5rm{5=Maq1Z1JBP`qydH(^Nc0|0Ur zw#X(co{ew~Q0W_3z`3VLppp|aI4{|IFQQnFudMDr>9aKFm;J8UHRk=a(0`;`Eyrhs zn=4(rJcMgc4U}cxA;m70?{Cn&PW zGc$jhHWgt=$p(tZ^3fnM3_RpO-im|KWZI>~A^A^cKId1L*T;Tb2Vst~NP3tSfvmeo zcc+x;9BNJUj?o|;*F)PYlPKeO*tNI_OMsW?yoWNvNGnj6C)qtz z6NXLn>3tC)NzkuKFHw@Z^WVx}o;90(vVsnUsaH5p^gS{(I9}R~;Odp>r3DwJCWtuQ z^8(+E<=^}rSBV9Jy;mR`r&1Oqf*exC0jRD1WWMkV3t^b(1lMEG3&=+pNH#BRpdoWW zzqgu!(g)@0M4Sm+b+FEuc6Xp6Hy@zVGh=Z^)44oJ=cNO;SUjtRk_aWRY=&bZigPf! z2!lzU(qgINwfGK5c6HK4UOxK;tFu5D{5J!~wN(*@v}A$o7_C@3o|j}DL>4=SlNnUx zBGzuMgX=Hx`_sfIiN;AK zxj_E>GO0zTvrGD*V-Q(8Ldr}fvB-h83*hdcWgXggkpBLzK~eLUn1(R2z9rdU@Qi1F zgRVnnu&v>mabZ zg~rB6#V@oK^fwhj?{pUaC9IB4qCkutj2eE6OHU*_s3M`S^ z30LQ1ja3^L9f!!nkXc1Jfe2QVUgLB&3kft@&M~~Q7G;TTXC`$-K=I;fIqAL*TCsHn zQ`j$%2regtu(y*)3){^~3ocAW5NP2yze%M!QQoZjzep;@$VPfx4|Fpt7^5VaxfC;C zA)U$&V}}N5YZDo#?~v{su73m-b`{YMP0$iyfM?)w!jL6{xJ2TFqIbkDnb|Kq*UQ@i zhwZ{XxloMN!$wtlEWZw64Wpb`Wa;yl{10<7`%H6>sZUuWDR~L$Bym3(3tPG%<-PU` zQdYA1^85FzBRkuXa#3F1Z%rLl*|Y;`9M zaEjCTh+%T@BF-J8gXG{ip@vAU?9@l?K_Yd2OWN7Y@oeNe7`|A%@VQXNd4Qc;B9fO( zW_i_Kk=uQ?Q`DEm;>CFns?`K*z^c({&6lq1VWQ-^d~K+cVt#R~Y|Nq>;26BDWZ#Db-!(|=~&)b3BNAD11dd_=OqG3*b|tjx=J3ONUmEY{^1 z@9x3Oq=n46DIMjiuE*Dg<3chcr=^aV@k~?&cCPdJ(@B{%Xgyn>lmKI9)aKw!gi%FAjxTE23#2s;z;7>bG~qZd$X`^wES^tCsK+Hr8j=nX zpqeo3s0c2FNOl>HW(#*_K1%C(QYI1P7;W2ulHVDng)0XrEi6Zcs6s7*SQa^OaLIwD zx2Nh0O@eFG3WTyZkbD#Rhst}7wqZzezmD0e4q-S)U&&zil&MV^KC(cR%;p|mVRhw$ zqLw=qpu{~Vl)6{nJ5m&{wY!@M`fOa=_m)pERq$RHwN+5Updyy2>rNG_kKsZoTw1;A zIZ0{~gsW357I+D9%m)zjwM#+{Dl2}R9*@-Ls^20f9061yr-Z?+?RH44XHd^#zmV3O zv+k*-3xINUq*%;R54~4EVSw{o$MbPjA^C{sE$8L9#9>Pk{Opo&WqN<2XoFCL-5A4Z zTP_KMoole2s1BDei9~8xO=-b}DO3yz^>)f`hdj`0;UsuTy9Buk0a+3ijB%JgQLQX? zCYit6sW?+HnDlxn*H=YEt}^zRa+8(h zR6u4+T95Uu!wBRYpv6IFVGhEeHV^4r2vUPE%!FXp;!y(4CCU5)_POCO@kH#4#NfC- z(t-<(5JVZutLI(crE_Y6sJckko*IfWS~Cc9UE1Ci%$=*p_7H={WU$c!ZO zwj{`UBw^|(89zno!C8!44?ux1=CWUa_xXSZHVSTP)fb~ll#m|+$v;<3?Va`mDrP+L}YDhVl+J3RQ5hX@PEirUOT5w^d34(8J zpToXnD$3_1u}a{sQ<)u8-WJL7EBLFKUmbBZ<7jqf!tk`khOM(q_OV8f^xdZ=_PZLB zq?~n-{06K(QxB?vz`w2kV=G4B(T(q1HB%~q*|!KD!IV4$BJ z1Hw6wgk4}J=>n?Ta=CZSTNzJWJNL0J{Y?d1R+h*eb_SW7zVv5IgLN1b0tl;h2ZCv zlylc*i~6geqw(i3egQA%;aoddh@CnX(oP11iJIIfr7DU`)uAQ_++ zLT{E7h`|LXK_D3%olIafhJ~UuOO05UJ z8oS|3dB)r4#N`->QhHPbTB?|n0xIkUlBpq%Q*y$fWrcp8TWD}xx9!uGfC53_&Qxb- za)zC|=Yv^@#l=V}UQ+m|VCJ9PB{I7TED6|`ceaH}BH~9n6qyWdKIhvRX0k?|J&5z z)LGd%zPfoGb9Ji*rJvnxEf&{qT2)(&?$j-ctPmIT?ehtI>WJf9yCM%c)F30TI+EKd zozex8>Q-V`K#5`XVq?|=89|`raC%a&lj7>g{hdg$GKy*EqZm$3W$i?^h4YiPkB=pc zr6mZf?=Z{GaG-TWEO&G)RR-(AjR4WPQzUA9;e6c=uy#PL&mWL-PmXhYh>N)B20*@c zCQK^f^>8Apiyh2SXk{Imp44qup?;6a`h?uz$>I&_62`RB1%Q)8oYlzkw(xh{L}_6V zNMT+mg1~|O=x9<)t-!&pGV6+>;q1|qN%bBXp7U`qK6o_Aw#38lpSoOhHDNm+rRCHO zfLjt6c+SUm9;WBZ8s#R^rX9&bbg&PWpASw{Nku+j8GLk?Rk9J716)4h>WMyPzA-Po z1Dg3nlkcR*Si;%teFnm)BVCv*(r9SJjh4}<8>EHipa=pDlIIuoPPnuulso7rcaPxv zKYRfDyAgcl^H<=`i~EUDGls(>IrI4!$@z~CHNzl@U~ayua_T0aI13-tJin@)$A@vj zCSo9KUT4+7cS%3|zWDi@LwuG^E)L3Dk`A#z?T#vJsY+3TWY0tvYjrgx3oSEarj*Y5 ztaF8y7B&WvB8PzH5#fwqmmCl{xDl`Y??-Ta62trV$MF5Xd!UXD2h~$r+4=ZG>-{xF zmbla3j>!JG22u6-^~#yLsXAcViE6gvBZp#_*0txmcI5BCUKe9r;2pCong=3#7b!*H zezevA}NWCyKxrp>WCngj55ThG6b%NLJ z%|RfC7BM^<&*rXp|D)UodUTTRIWfiWRCd0oC>NQ|0%pF^XSlN1`_AVoj<+3BCzl@T zv}53s27JSswpBLt&(EatY*d$=4f%LZGiC`E!EKnM%OaD35x$C?MGBUQq5q_oG;j#&qM!22)AosWu273HVvQrrzk zuf%mNbySk^0;5hvrUYqfRD)a)YeRB_IU(xx5~!RZ5gRg%GP?$zA1V7muGFL|M)tf# z)`pTAA_%sHC15yS+Nw!6>IQyi$!XOGb8`M&bwf1?g%J@Q$#sWkDy3VeQ|U*5+hEB* z(=s@#W_t%ow()W6ydkXnP=j9B@`lOBXx3k=>k~1#&NQJgkY^zcS)egnw-Ka;IehQ5l_fJIVcQ9Mo;czL~0fGur|3 z{19|AAX{1@h>Lrkngw?09>w}^;obu^`#Z|(iV2I+vN3?o66qk1Qxb~v8_HNf6<4B< zCJM8*B=ExOqH%)Q+ZKu(TyX*WyVX6RuJo|CE7YKMwS%!1l@Owqs=m83XFK4Q0$ke# zrhj?Mxax?l<*&lKo4PN6jUIQNn_fFM6Egzhb`NtYN@|%D$x3lgBr?}&!0My%r10~` zNz`sM~!rXbizTMP0^l|AdQ`~($KS#G2*kGN}8bQp8X$S7S zZ7r&eY3vESoEd=mvTdt{>@VNi40@d3Ge1X55caj0cFlFrcVAn97`lPRWPUTNB2WyU z_Irb3mZG-Wfl@Tt4);i8UJWKC_&gRq$)KGvD6E$WeUDNRhrgQ_e#V#uQ$C;@XpA7x zfQMo@>glh&{%Gp&4XQd=Q|+jboD!C3t{n}Z+Muq45C$cRvT;Ut6)Q zNG_n8SUDR+*FcStdVsO8Wb3m&hM>}o9UCGU;c$L$Z`4wQYd}BH8bQ2tdmsM&?_X8A z`rjrZIK~n5wVlk1k?80&!qk9fw?iW`4Q9#6 zg%~W(ff3MCM8k%5E;c$k4x~}yIW-xstLNaP$}iMaTg=4qhoeuG_*~%^2-x0g zErcZ?Aj3**-WyOKxDUqeb|8m<#lRv61WFR8XL4m$3I=GPTCuwoB!_^-qCgM`v`L(t z#c(mjmV5#20gcFL%nUY%fJMVe5C%vT7l~#4Vx+Sp%lbz4fH`1tIBq1wfD%I#LM8*2 ag#QnAdW6r#|MDRK0000