From ea07b968a38481d34b2d97345b1b1c628f4a81f4 Mon Sep 17 00:00:00 2001 From: adamz Date: Thu, 8 Dec 2022 06:33:27 -0800 Subject: [PATCH] simplify implementation --- .../xcschemes/Republished.xcscheme | 2 +- Package.swift | 4 +- README.md | 2 +- .../.swiftpm/playgrounds/CachedManifest.plist | 41 ----------- .../playgrounds/DocumentThumbnail.plist | 19 ----- .../playgrounds/DocumentThumbnail.png | Bin 66746 -> 0 bytes .../.swiftpm/playgrounds/Workspace.plist | 13 ---- .../.swiftpm/playgrounds/contentInfo.plist | 12 ---- .../.swiftpm/playgrounds/version.plist | 10 --- .../contents.xcworkspacedata | 7 -- RepublishTestApp.swiftpm/App/App.swift | 11 --- .../App/DomainModel.swift | 62 ---------------- RepublishTestApp.swiftpm/App/ViewModel.swift | 61 ---------------- .../App/Views/CapsuleButton.swift | 34 --------- .../App/Views/ContentView.swift | 67 ------------------ RepublishTestApp.swiftpm/Package.swift | 45 ------------ .../RepublishedExampleApp/DomainModel.swift | 12 ++-- .../RepublishedExampleApp/ViewModel.swift | 32 ++++----- Sources/Republished/Republished.swift | 13 ++-- 19 files changed, 30 insertions(+), 417 deletions(-) delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/CachedManifest.plist delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.plist delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.png delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/Workspace.plist delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/contentInfo.plist delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/playgrounds/version.plist delete mode 100644 RepublishTestApp.swiftpm/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata delete mode 100644 RepublishTestApp.swiftpm/App/App.swift delete mode 100644 RepublishTestApp.swiftpm/App/DomainModel.swift delete mode 100644 RepublishTestApp.swiftpm/App/ViewModel.swift delete mode 100644 RepublishTestApp.swiftpm/App/Views/CapsuleButton.swift delete mode 100644 RepublishTestApp.swiftpm/App/Views/ContentView.swift delete mode 100644 RepublishTestApp.swiftpm/Package.swift diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/Republished.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/Republished.xcscheme index af7ab88..6aaa0c6 100644 --- a/.swiftpm/xcode/xcshareddata/xcschemes/Republished.xcscheme +++ b/.swiftpm/xcode/xcshareddata/xcschemes/Republished.xcscheme @@ -29,7 +29,7 @@ shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/Package.swift b/Package.swift index 049addd..951ee16 100644 --- a/Package.swift +++ b/Package.swift @@ -11,7 +11,7 @@ let package = Package( .library( name: "Republished", targets: ["Republished"] - ) + ), ], dependencies: [ // Dependencies declare other packages that this package depends on. @@ -27,6 +27,6 @@ let package = Package( .testTarget( name: "RepublishedTests", dependencies: ["Republished"] - ) + ), ] ) diff --git a/README.md b/README.md index 3f3593e..3cae04a 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ from inner `ObservableObjects` that it actually accesses. You can use this library via Swift Package Manger by adding a dependency in your Package.swift. ```swift -.package(url: "https://github.com/adam-zethraeus/Republished", from: "0.1.0") +.package(url: "https://github.com/adam-zethraeus/Republished", from: "1.0.1") ``` ## Example App diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/CachedManifest.plist b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/CachedManifest.plist deleted file mode 100644 index ec45f98..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/CachedManifest.plist +++ /dev/null @@ -1,41 +0,0 @@ - - - - - CachedManifest - - manifestData - - eyJkZXBlbmRlbmNpZXMiOltdLCJkaXNwbGF5TmFtZSI6IlJlcHVibGlzaFRl - c3RBcHAiLCJwYWNrYWdlS2luZCI6eyJyb290Ijp7fX0sInBsYXRmb3JtcyI6 - W3sib3B0aW9ucyI6W10sInBsYXRmb3JtTmFtZSI6ImlvcyIsInZlcnNpb24i - OiIxNS4yIn1dLCJwcm9kdWN0cyI6W3sibmFtZSI6IlJlcHVibGlzaFRlc3RB - cHAiLCJzZXR0aW5ncyI6W3siZGlzcGxheVZlcnNpb24iOlsiMS4wIl19LHsi - YnVuZGxlVmVyc2lvbiI6WyIxIl19LHsiaU9TQXBwSW5mbyI6W3siYWNjZW50 - Q29sb3IiOnsicHJlc2V0Q29sb3IiOnsicHJlc2V0Q29sb3IiOnsicmF3VmFs - dWUiOiJwaW5rIn19fSwiYXBwSWNvbiI6eyJwbGFjZWhvbGRlciI6eyJpY29u - Ijp7InJhd1ZhbHVlIjoiY2FsZW5kYXIifX19LCJjYXBhYmlsaXRpZXMiOltd - LCJzdXBwb3J0ZWREZXZpY2VGYW1pbGllcyI6WyJwYWQiLCJwaG9uZSJdLCJz - dXBwb3J0ZWRJbnRlcmZhY2VPcmllbnRhdGlvbnMiOlt7InBvcnRyYWl0Ijp7 - fX0seyJsYW5kc2NhcGVSaWdodCI6e319LHsibGFuZHNjYXBlTGVmdCI6e319 - LHsicG9ydHJhaXRVcHNpZGVEb3duIjp7ImNvbmRpdGlvbiI6eyJkZXZpY2VG - YW1pbGllcyI6WyJwYWQiXX19fV19XX1dLCJ0YXJnZXRzIjpbIkFwcCJdLCJ0 - eXBlIjp7ImV4ZWN1dGFibGUiOm51bGx9fV0sInRhcmdldE1hcCI6eyJBcHAi - OnsiZGVwZW5kZW5jaWVzIjpbXSwiZXhjbHVkZSI6W10sIm5hbWUiOiJBcHAi - LCJwYXRoIjoiQXBwIiwicmVzb3VyY2VzIjpbXSwic2V0dGluZ3MiOltdLCJ0 - eXBlIjoiZXhlY3V0YWJsZSJ9fSwidGFyZ2V0cyI6W3siZGVwZW5kZW5jaWVz - IjpbXSwiZXhjbHVkZSI6W10sIm5hbWUiOiJBcHAiLCJwYXRoIjoiQXBwIiwi - cmVzb3VyY2VzIjpbXSwic2V0dGluZ3MiOltdLCJ0eXBlIjoiZXhlY3V0YWJs - ZSJ9XSwidG9vbHNWZXJzaW9uIjp7Il92ZXJzaW9uIjoiNS42LjAifX0= - - manifestHash - - 67WQxc7+xhzNa6Ms8hXit4D9TlQCnVRJTuqNMN96+Yw= - - schemaVersion - 4 - swiftPMVersionString - 5.6.0-dev - - - diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.plist b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.plist deleted file mode 100644 index e13743f..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - DocumentThumbnailConfiguration - - accentColorHash - - pnpByLx51dqRe1BR8fDT9a60tjuiRrNUapYe96PH2TE= - - appIconHash - - UVJ5DieOuJA5+L+qNUuUTsG0TF0/wUTtxXIMPtwEXHM= - - thumbnailIsPrerendered - - - - diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.png b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/DocumentThumbnail.png deleted file mode 100644 index 3e29a7919781dab8f584cf6989006a3d34056770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66746 zcmeFZc|4T;_dh;k7!*;IElVpZ%OGSO6_paDqA<1!2`SrP#!QL|sR$)Z36*8Ivu`u9 zm2HHOWyX?q?1N#(%>1s=ec#{r_w&9#kKcd4e}4CansJ%ydM)Ri=Q-zj&dXz~^QVNj zNN)jwK*DEEpS%bH@d9rlAOR@wQeM7O7bj0^xZ6`YkUA2l?wg_tzj$TW?O!k16dbv$te9{qI67MeP z1JT#>FXwQAZ?EzQ3t*x9dEFD*d8I|&Q{CV$g;GM$=|ZCFs9ik?1L6iyO}lk6br1yJ=>isJWV~AHYstj*R5UZS?{{)c@=IhUS9LS$vB8UghmlE9<*~kB1kHvt1ua5t|ZUu%2fOh(6 zn9G~X|IY^k&jY^x;X0g8NC9-I{hJa>3H9Ie7XXC!PuF*d1&V)x;$NWnH%jMP!M~};U*XfgN#b9q_;2R>x5xZ9o&PI*`u_n?sPBZxJpGxZ zEz2n`^l0So=oX7T(;txXrg-L@mhbYV*GhbtwY9=W1+WJ$Z1^)^O~acE|ny3^v`n0#Vj2=b`6@7&SEQ`<@`+G zq;4}}h4s#JJk}{!Z#7SGI#jb**{tptw(jBnPPj(OmRJH6#xRz-S)V8AeU;sq;N@EB zT;?{Yy>X|Xl;-s>}8EVtUA32%q zbOv4{uLgq!OJcy1k^tpJ#54@=dGehXqHd)H(b!cy6BO2Ww=3qbSJ*|41?$v`$I^I7+M9O<%o_d z8>TV=cZ7S|h}5TRfgYWL^XKd=^$vLTqjIZELc7Ra90S?VX=B@R(xW@0$ITjhq5X4Y zBXd{u6&`p_XY6)s*~aE&{Y;-IX5B_Ui}^#UXKcmN&M`;7dnf7Gxa+G>N~y}67_HzO zffbo+?SMGdBGT{EHCxaYL{6o<2L8~QWjm}e7?o`2iBV?E>+uz)e~8|fMd`O~?0(hV zlLQJGg7%h!#%j}{gZupO?S{4U^6w4Kaw$ukE>skRDcAiVRl3k!eGQ7>ybVj%PF;`- z=?uhHeI)b@JPEty!^`m)vlxEjJ0DS-(=hD`=|MOyXZ)g-@}nTUmw!f9$Pz_y5Mh#JpPP(C}N8$SI+tk|=!GkC4#oMb)>5_wnTDEB>MvRJ_?WdD(sj|X;@G?6> zSvzgk`l3biBx+@#yTZX@ynbpIL0`tn*Xc@w*^)M}y!(JIV;|lGSaP_8v=wxRBB^#1PQO;}aBFhk=nMTaqg&hz-Qb*NUx_X0cbOBd@PQ#LL z5UA;4_zN(^EbNESZ3DLKu9r-7vJca;b))|%vXjtku;qHYQp~#QKE;H`>v>C2)kcUD zErBV4fB+oEBv7czh@^SFdE0~I6-{akMvyR!;!oZbtK;&@qO?mjwbJ!f5`C$v7hE1W zg~$w%c2#M(#`Q4y>RbVhej$DZfolo3pxUz=cl6xn@9jb|9s59NX`NzE4d^# zxj`?qUC!FL`@_okig14zc`Py|5WNvJ>)W3n92zp9IF1TQZP0+FCDJIs*vwVmPTR<( z^>>WQ7A60Xt9Z9wHci!d<_&F>i44)3*`P6KjEGs|`K9&sF#>QA(D<2+$R84`HVP(# zoqj%@hEHJrga|WBH(3WMmm&(Kd_=?_}zSko39d(cdKFxOPJvkOFk#kFpaD5ZPKnFjRbFddNELWpSU|AE85M z&F#1q33xMRE~fm{4y9)>snNTDCYEVpK%ndQB6EUAMH;4W%n;Mr3V_duLT#Z2j+$O> z+y{Eg3*dz|^oS8=?q#{#H2K@-&tx}6lqIE>XwMxmzl^5=@}`9ILnD89t+t~kYa^nB zT_gpwSBuaWI#&-L6?USZA3PzI4l@hq>i#S4h?g`YpYUs&g{=tPrrdjIx;Bw(Jl9%U zS_=|7SBI$t&&YiWQ6AN5@ZfHWx;58&Z)L(4aSdz0c0!)&<*ye~w8t5iE6_W8!?7iK zg~x=%0XxZHT*uAjM)yeKH}~Tl*GAsI!qkOJarZ-8N0q~QD8P|)u9tEa(5S3;w1mD^ z<9p*mzmmy&iSy=0OIwmG^yU|!tfJ7$yI;;+0CZV1-@oUhHieTWxE#3{yC?$8Mg)4> z95Yu?-lO5|IsoNH;npxbQ{Hxw7a% z$%@UH)p5m4s#{n9{kftI$Br6B<2On3u_4RB<)`l5UdxWb9#kcgBVWwbL=Q{WZr;|* zy{)ykeSuiNfKSE7$OorLan!O}#}k5w&g6neK0-%RZKP>NR_7PG?Yb5`DDJ9{}iCL~PcgBy7IlEv3P=u2NnxFKYd&7d_Y@ zrtuMyVnpTM!P510Xd&II=o$3@0H3*fb@PtK$5a>emHsL@%TbsMx#aMVD*8~Bn&M!T zR3q%^rmPFN5=bh*44XtPIvPTJ)+S{-OhO0*myJdf<@GBII9YdoKqZix3ftjym%%ux zW>~`JjnBE7mGIno7`%BSL;MGzSA~MBI`cIuE3WX(-Ee{y&zzZR&Emw9cr}bZqC@W+ zh8t=^0o!xc+NC2Qr><@Vg9JCf$7WWrG}Yw|)U#0T^1x_CPPkXwoW2}M1xdoAr+^}! znG1l%R%SeWwIwdKiJY(VM``EAZhb1T@Py&UBnvgUHXYqY%q07PTzJ$oU0ZknHHZiN zfP&N(!3N_70DrZPor%e zJHWI1dYZtm^;Vh;*YoLdMe_8#ZV+Z^9MJOO*=lXCBJkLuQDgbgrQ}s^jD~&a45!~7 ztdOF>syD@0%~e=4NA;jPE*mx^Vz-#3MgJNnqQ_y#8DYQRP9 z-dJE?alIm2jdwRiV|1mM`R)8iPY3K+t>oROI;~Ypbx3o*@`@c zNqMuj4yj|6HL5gWZI)g#`mz;#uwQB(M&4XMH&}oV-2^~P0jg!=$4sR-Z|nhW0B7nD0L;84(x+8S2wW9U_ecYriO3ls0m&%v$iLk~>_ZW=E*z(KNz4Y~5Oz zM!qTX`!WGB|D`95@>d+I2dPu$qcB%;bEALL1XrXR`Lmz%)QnRdPuY}{Cz@CAHxJDd ze3^Sj!QGdMKK;$AI11qk#dkGDG!~jCv3Ag|&-w7IMQ)a@E9CROg34g_&Bc(Jiqtv;pkPq-w z9zyPiFmvnWbWL_G=m9V*z~V6G`l9(0A%(S{I7hzsZoKqq|# z@xULZv_V8h<)P8o@Ku9&?b&Hzxxk1^>&{WpHz`1%LI5!IceFA;HljC1Gaaiu*Ah|& zT&*b1Zo$>Z{wU()&msqFnS&K<9(y&LNzby&(Ilo*7^0&3&+%cUtQ0eJ*4Tr=;}Xfd^-d|&tF;(FwVkn znB5G2XpbAC*Yid#?b3Rv9tJmCM0%^gW%BGUr0+?67##^{)vfCQuz^8iBG749Cz|g( zV0;_RLndgW(_=cbd|Y#?SI4= z&gsY_u)wBxfIbF)Z4uo~Lo1$Vo9I0&;asj>%pU9=X28~*osL3+cTK(`+KP^f0FU0w zef0EgxjO=&O$-pBt;z?w{eHBqGaLa5)>fCR+ti8&T&>W1%`XFJ#pEm}b%H@+QND*9 zeqTs=SMx{W<8}0nsyA8G3r2F*fF#qX?+}(~#QMtEM4Hb8gJ1Jm38i$l%6)8#^MihP zP5vwApr^c{jHHOm1^^M4fLH*2K(;kpcvH3IXip2hN=(_Ln4Rd(gPS{Y6w>;+CUtwX zAPfXJl0!})Fz){Oacl$-DFibKO!n%mF@*JrpCJI3MW}A5tvOz5A!Z)jMPwNqmf|Km zU4OT6#FL0rJ}Ewk_lH7N~Yw z(1pIx9pMy{aL3{re!ys2e}8=Rc=QS2<}ZL9C{>0dpE(cJVqp0wl3E8=PBOY=DCjsB zgFr&p|Nc1FZ2tcErrAWKi=4F!DDhd;Hd#d*c{v{v+J6 zFMRb+W6+e8*;Fa<7C@zHQko$`T$S3UJN~SJMOX!^^u%7+^k?ZXoU&_hfV$D9b}Ml) z@3?*fzr=6M3$*Vp2uFJfS~V)S zlbi5QA?x&9$ka_?;r*pad&U(FV{K2hgrI;BlDS%Re)L$~#`}rw)JI6X8W;MiyFCmd zlhT$ATx6>@iU(I`^4$bnPi`s@4_ATmt&vW@6==A$wsSl#7+MAO_x%q4&X0o4-xw*s z0DXzD>0y5+&owS;8B;cb5N(~#W3<`YJ_Tb$H7BQp=^vyw^Vd~|p*z51SaN-+LyKj( zgMVFp>>xl&=zm+RBIjv!OVJQUKmdHEB>QRU2RXbBz{4cP-f$r|*ZDVz*lqMWFiF7` z@{OGvp|nxtG0Vu8q!ODTR_o{5)IHJLfA1*(x;WzbG3-O2DXxK-km7inzllZRuX@jQ zYur3dKxp#kTkaw^_2=(J{?;E9J@7>}e+&pNBjn-~$G5>q@3dwNnJUkgYiE4+HlG@> z>mQp*w$__Ht2|q(k+IJxrGwdKIW_C{ez_q|<+N>L;5UJWdK}GJrt%Asp^0;g{HK`# z(#CVz2}KI$3H57@k`DD4@^saDSNygLg^U!NEWcr!i{;}o%7Y9)^T4WS9foQ@mt4~7 zyD47O`B0;b{lffcaI?vt+# zU+R@~$*xx<7YUa3)eOBK*%-tu3W1PX#3oq;$L*zkH`-!dh?X zkJZp^u-I@j1*a!lcudAPou<3?{~Ako6CC}$(_esCQ7PvH((3n4uh(tuICyV1wSQ=7 z4KZl$TJ5PW-&_}Jvu^4rkKZ$1(Wbx2n~3EYyZe~W7njVRawL~8I{Jp0>llzVS3`VO z6k)5(ClJyqFC+sd|A1FQP#UZ7h&S-stNwEerA7k0uLBgY@J^v^M{AB-@7UEBuCVId z61Zab|4zU>TM3Ssy!u6V`=&Qk=NdKDO77Bcqt>4y`{AI^rEjmw+-dMf9L%i7i=2#n z8Ov<=!+~jO7ly8MCNvt7OUG!VBK={#tCiI=^kN6)Dw^1=%t~xBljT<3E#0NjF!<2X zXX3_f`qB3E?|Grsbu1SnwVoAyfO15TyQc>B?>LDanj;^hFyfJ-1}{1;J6cY?)3??e zjUbDMM_K&R?aze0aRE1phbwp{woyil>A;9I$zpB{gz99=(St@4NF<+Lc5U&*iUl)d zU^K?g$e7^F1QL}Vo!NQc*q+09WrO~J!Dh{uzB@M~J_QiaXgFO1M*_6KO6T{ObPxW- z8RMQ}@@=1C@=c#QV;36LlI3EaNKWZUY|&*uk?KUnpmhF7JQl-)brD-OklZi&b>Hx= z$($)5c&wO16J~06UI!Vh z<^CD<)JZl~uc%Rd1a{q!dBp z0ZRor`kK&U#@3o3iwV3YJ~Z@&d!S7+WQ%vul%aCUZ0A;0i>WGY(-D>KYP+K) zKPgXK6z<|N*z?fkBi}V27VL%Y1J-W>1YhD^uMBYNJ_4Evj$1hS|S$!q72&muHz7k=7TZA8hq$48d?_u5*4~>&rzZ z>}H-%&5gzbNN>)~als%{5onW(6Kyf;y~UHfHoM%1K9E*d!sOHVRF!N9hY&lnEBWO-2?*TBU1_D?jS_<{n@1jAC0_NK z0oNU!Q#m?lx58bJ@A0dnyo@+@&YyewHsT$yr*;AM{pc`Ru+v*UP#H6*N(@@PevK-u0EWAO?h|*{KLe8?w>ZgZ?p0diev1QkeIC-SS;C|u zHHqFX9zM70x4=9mXLztY;OSRiY`2GR2cky>uDwj3le3bfah;&?;)UpE2Skkn>|b>> z6Wn81^GU-LA72=5QE1J>JQih~!6f`>^ADT{@nVl{;VDae$jg)b;(4Q7dlwI?3|=Ee zPri1?#N3AyWX``m>CRievKP^-R}oRXDu&jQhktu@pz#-OlJX6*1q=ex2QNj|J1KX0 z(P$^q;TWX6QiDH0uS90}rX|hyscnKvZFeK!CFy{dM0d?1@(#!N1El)8#jbP{TKh@^ zAq|*dN(jFas{TRv#O+VSbc&|Q&`w_L!z4N9y%?9Hr*}WH-nw5>>Cve0&#wDo_+mAE z`_~;IZ5|L~@BWl4Vda_|VHLVdE6>Z4(tZTsvku1qnZnhV^Pd`f8eJPUa*9I?9k>|- z=~JkUVYLyEowyaDm~&~g+c!diyufM)kkSEt!oliRyMXkMb;9+Rr$TR$yVE439$^0IWj!sN$4H^1`FL6ZcjzXgh z6|h7j)*2!iapzH{#AyZfz?rYzA1WutTx4ND8paJpYCB3}0m_(F^&i=oZj^jQcC~YV zr0ih|C3e)KGBYX7kC{*V1|(z>Kup34T|Vdh#;RKv%YJWs*bVU5cR@iP-n#FqCsK{d zVaoaTMnj`?m!fY3&Pn}5M^)BcT3{`@{h<2! zx+b(7@4;#JCM;w6;8v@k!4qCW_bq=W9$4lJk26YpabH~Srmukg{%5er)9Or)-#7Xh z)cWzwIfeb_oQ{JqfXD6>40&w{N-&UA8SX2#gO^gh&X*FN_sB4Sa!yJ=UT3XU;{=RY zkG=d3BYTRv({gA%t++9q-mx2nG!I)+W_At#RIWO3PDg2&&~WseTEL_=Cb(D~QMU$=D@xqN@3`IzelZ>p zmkt0z;})@-?fNWSV5-*#@XAq&yYT0=RR^DYD>o4?m`47jM9F+}arHe;ra|h?aBG46 zLX``jSM7hn7Gi9y%Sk-jZXLo3H3gC7JVAIY-;(s#hmZE`#rDQwa6!DUy%&(9G!5p! zFkeZQA7jPq-2H}RoX*%#Yt~%US#=U;i$9)Ib*?~h`L=WAqfJ&s05GA4e)~lZ@`3fJNFF=1?UVVcNOQp2g)Z@hAjO8IibOh z*o5D0ohrC$XDx_etQ+CMk0F%M+@1WdaRI~9euj^DwjSAH%h3(V?jZX?7RwH~JBx;S zBby%ZY_(ro=MOnv#(&*CX2JYZk#(n za~VXIv z-ZFBwB;-{IeBTy>PUoNisrNbaJ|FOI70U)&_Fu{s;2Sqp5ZUfK%OVGf_xdHOg=%Jy z1}Wzaf$&D|O{jx;W0-2jKEQjkCQ4viLK!s&HFa&Imebj!@ymH6PGAmAh8ywF%Ja5U zU*1Xo=Y{fO9PqQ8)mwEY;j1b`2{hR>x5eyx48e z_eenZO9w@RCHS;rhz~^wav9~-8?V6qtiONI47msL4 z%boijQVy;pmkEO!rH))Ij+ODf`Q|Im!>Cnf*lxgHbnP1H1U#ZRQ|Rku0_4rH-f=bM9aO2}Dr#aEG7qgS?Zir7?@Xo=rRs59Wwo<03l^MIS!o>H-Bh`8`0YM7T#n8W5BvqUf7{AHwFGi0!;0b2}`*|cr<&^!! z)he4mHO`Zr*gw)>8WX_-q5-a_J;dyY z(QdIS3vbGPQH3|2WWhzDN_5#Y89L|IIYxCTse3Eq=X>aomaNuwNf~_DfNGt93)o% z*i`P)5#dYIuYE!gP8YteTrt#9N|-H?Ip;0ZtZ>Wdtb0S8P?o6#pFQRdOu@2fu!=u5 z5KH7yHdlDI;ET6Nd?d$PU}%4&y&T;z`p1g@w+SliV8JOl)g2G+?vg7Z-Cp&CtZ)>) zljd12hVzZV#gkICNx#7u#0BHYlX9njgRvglo)>d~hSr@un>*Y~!r89+d!HM7hshKP zvd2oOloN!g17ACQbebfTX9H8wd57hAtB4PRJ&)|`2p2OKy}DiSww~$jH2eK*hdKLa28^OG6E|R>Ej=GW(`xwz<{JJ9`YPKLXf>HTY1q>%iHbhHu zLq0xk7z$Thg8vTrXo86ukXW^Q3&-##v%x(TqfhSgVJeONDZ66) z4lkPYJx6DTiF)W%leztu*;`IPdV%97jSKsq**wUzad~7QxIcQpZB}95CBz=NScT$O zTlu{6Z`pM|MGbT?i;SsPWM;kVqKqw=R-iKyewCKAOZ^Azb9p0#yzoXLoU$9_@Ri%& z|2LKQ+bHtb$3whWg<^iKzi|$n)R5mIZ2u#ptViR4Yktl6Vczu#!Nil2kIb$c`zqvF zUlmlaFyNsbbbr9ZG)T|9czXXL?&0eIoTZ$$_34&{c$4Y-aPch$^ZmCZgx=`X-xGD* z@urgHYAoDzR_WQDmn9jQ+l~xKfS;zsD7|bp`T{%N~T~M{Si0caBJ(Qa`yodPx@S1VwC@1EH}4r#szI_7@6uC zksPg~8JrFqMrOnvshyT7Mh&>0w{xuK%vMnYMvIWvp3uClkk^4~bVgQ-`jz(T#8#(- z3#%y#0@0pb!WwJcuE}i#%1RyemJ!muCr?f0gKX+c8xzYTR?O2!+V_%p1fd#MKO$V( zq@uhk9mxz6)G+INy(u{i5oog>$|_{WUQBD6WXu&(6Soq0GkO#D(F<0hf~*bE_Qqk4 zdGuSePjNyBB0?4Xb$|3V(rJG2ESg5Oj}3}T`%IOjssuNvBa~b#;l>@YFS&KUV<3YT zD~%{;C)(4B4k#0Gk5D5+-SydF+cA}leyv2^$}0c#`+jNIF|XkUcdbiB77e{Nt*-FA zfxB5f2HsM&cYn<3q`)KmKcCjJU9HF0U(|7@b>S~ti+0JyI5|P{`L%AJgd{&v5P@)( zu+?YyVJ&a{lS~Sdt)q|`; zBhfwSt}~1c7qVw23Of1o4`gFXy@8q((*;xu{{cYk0{;hw2(h+O0eqd-#xDw*vG`F4 z87vy$;0AZ;&J>`0uDf|{bX|0G4DX7zteWb!^QmGb^k9VSrF=-N_jbFVE!xM!+bxF# zdXl2}7E7XCH|O`#L$Dit>qJq;yAh_M*v^IaETykhcvQ3tQuc$qw2y?CsQtpV?OR&l z@=2rz56}&PZNb)Qvx?hKOnmgTo$5z>X?)R>;@pBbSQGBGA5FbGcy}<|tcr4!2gAiY zjhjFPRS5&6Ogwte`7fH79Wgl1cKTU9THptg1D!npn(XiEL8l9^CCI36kSP$S7ur&n zcRxyn+!c}6%_Ry?ZjWy8rKqdjMiRym(hu(&$n%NQ^&X}2-*OZb*ixBQZz!teWfH|W zem_QS$Btja!%;$B$bD-g*3y;u1L|L8eo1B9&Hj{R$F06}z^^8XzN5`(uQG%nA9M6{=v9Py|8&!P zP84pq?2|Tj%n5p3GnYtSZdwa%AOGI0{v-Lig$i6D>CW^?OM^RD1&M9t=u?3xsS&yT z7kows51VvK?LXvxf#aTbRg%5q{;y$$#hR)ux7Oi6Ir7bvLV66U|6-B zDN^llFyo_UX)Y;x5voTp_CNG_??-wCV+V#;y012T82=fv0oE}~$5PGiXn9Ml&T`)S zkS59;4<5|9W!Zo5Exftct50m3xbbn+r>U*ALSb&_ZmfjK)#K!B50Yzv{yel;bKOQx zlbvA<5Ou08=G>^{ayLA`xf`Uq6%^7RP+jaZB*l*fN@maq#Adi8K}+|h-*xcF(HyS| z{T)0dK1QlZ^dM7UE2xSl%L+reY)7Lm{IObkZ}JJ9y{8k?RR)yo#|+z(oAZp~C9p!r z`M$^Lmp3W|4Ui8u&$8CZ$+sT!-i-@{Xg}d?m6>s$Jnzze<&W5CR8jiHqJBC+E6(?6 zd=ee<%Ec>x9X-LCKp9MjU1XsaWl?h_>xK#&9Gf}U>hm`Y@r9Hf+)`f*HJ+4M$*v4- z3;?uOE&jyyu>=t4m<0E40l*MA`KiVxZi#<4NbaW6t9tc(ug2I_`N=VeF)gae~z-OZyw=986HPA}hAW;Va5!(~Ca+PcQoA5x3OQ-wNl39{_~(?iI1AxN_H?Z5%a8Aa)3-Uzf$&qUdIvZ(R82vUymxRVsySPyx>IuRj9nnJ?1H}eq3(B)Sj$t-^eZ#>PsW8V zX+67x!z;LZ?49NJftWTq3I@5G1@wqNw7+EgDo_3GqlGl~JlkhuaDjfw8eGk!cAq$I zedPLwkp7k>!nd!lvakfrH4RnX29m5s7<2cXD9in z?A=@D6Xby{VDF@(6oYvwkI!0HK4g18$2oE;E*Kn%VKz+rl_0O2#dq;4oR z5c{(~Kv013hHR~UdH8Cw58f0jx|0HrA~&5q`HcU5$etVl-eOe=k!5BWhxwfslg66p z-g=y)OehW#{@j$!Rx`TJLwpM3!vtAIAqn_;F3;Sf^n;6C5!{Nx-x-1W2vAYzEvMn_ zM$0H57(hDpnL^IvHOI4Z1FtX}?>$*R@R4H?axs{4Oc}Knr<{U3LA{cr%oCXWJY(#< zAkVIo-d7^FuCyn_X$(PE&>t6rLkJo44BnSLFqyZ_7hx*JV_2N&@%xpcp~!Y#KIA?v zIl+XchmP-R!Zs?{0AJpAPmAoX0+&^f=E&89@B-W zm1yUd-}D&>KrueQy(0U6(`U0A$y35iWqyG6-nyIMBkx^^bBTPD(9vk*CC8(a;g?$` z)r>hVnnbvu^J(!^*%Z^|`u4YqN4|bYv|V^)apBo1Y<0YX&wWLe{4^K2(w($_(%%uZy%FW-*;$LoZ$0oCA7s&Q<9NnH?Sy{7|IcgmoDadomF`)yg zvri!Bp>HEBQ)gk~dxXZq0p0<|uj!0Mqe-Mx%V;TUI^L$ObywpFIfDb_!2fk&GaD6q z`BM&Td+&y_P!-sH<37fKHxHSA^vQy#?YZ=#w8gLGWAldvK_y9|iwSYf;vnt*e++)% zfF2M|fs*2=)EwbeWRIc=+#33{a({;9z_X6a^#0^;ihXb|3nB2;G@m8L&NQZ}pmf1U|2W64sj(Bbu>K{Rsw^2Zu${Mo5ax^2Ej za`ut!a7QUC-oP=zBf9#oqP6AZ;?TxMJ20G6wdOd(-~ip>l*{N|2GB#mL~oWJ^8A{g zavDA-EbanSTo8!JfTH2A8n~3uZSrFO&HRsG*{xpc(b(BtA7#fohhSjk#I?h8fANzzJDB70wCs`Uqe8gnh-V=yJ#j4G^i7Lz2@y)_1G;q>RYHuo|X`c!P&NkTI7$TJSwGG;W8=^m-l2rP`CTdGdi2f&#ivNKZo+ z^5VTiD|dq4VdJ;*^c^&Tf8RLj$Z<$J?a|!k^q|hQE;OJL`9w-4*3;N@&1mbhfJzHb zU1nyyQ6QdAI`sWfw8MbpRNRAu7_Hg2TI0F0F8aB@0Lz#^WIVsJxEm<*jW+zxQRP=k zH%o%XnsL>n`nqX+J8%=cl*N{~uhvvudQyH7TR_Mn0D6qeVF0IN*z&O(j6V^yZ+>5T-d zQT>Jb!_3A?QhKGow%Xm*vA_N%2=P%RM!|_X|A)@B27H-$RwTo3F=bXJNNSM(RZ@Nj zw6@I{5pqO-l-fgY@Q-=od*?x!McUHCc-8XSku4{Ez!h>1aUokL`x}Zqw&f%4Qm}^GAiVfz|})32M*mR6b4W3I)R&8+>Q! znI}28h1c2b ziD5?go8Pfki@0COcZE;BYo%YqgIOT&)e{T$&E$}- z6%Y~{O+ZSnImDz`^aCvA1PH|A&ATay^J_hTOY=NNbSQN7(mj|#O5Uz70>-5+?hV(a z?|26C9roIFcBpB!m6<%-%&Uht^~^?3>;sR*RP^H>J%QyjX{%!olKY3kUtim!_Gst! zI`Tl1C+_i4j4no9sp#xwZ)V`vrJC($l*$VpAhz`ez*SfWyP!~Uv{qExUXjX<}qYRF5k3=QYe@T5#W{O z!Rj8PHbkFr`&rhClnvybtw2!nIdHTAzOl2i8nJE>+~B0!&h5NyCUI^3p3o^EG6uIw zP)O=a;K6qpvXGXHV;qnEdv#P}Vv_@s!VmkUKbOXn%cpy zc6uskD=vs3;q|&MSG#D)Q(0NzZRP&ESa^in(A{BoNO!~ zgYb$oIr8>IUZ?(%JWM6uultUBJNf03I|9TE{800Tni;XZJ-fuu4r@j24y%65oA}d4 zav5n>zo)dGSFGsONw9=K{3q7kxA3vblrueel`b6ykEt;v_-D@^kb0X_j^JNS1A9S3 zV4&VJDtQ(^U*>c;X8ndd?rAW4@wF?ui`Db#4KK(7{Op2nzcn+VU&T1)d0+_1_L4NM zv+G!Eb!!j*{pbBbTWue(sWV%7)2g#$KIQ35JyF5oMbGKSD6Aq|@RteO^xMp~e)yov zTYd$(#3{T|$I;7~+cSR)V^7CGD)d3U$ku_feHDL^KDobLxh#Z_AygDW;D1Y-Lv;L)n_ z8+$Xd(D5C$_zXWz^Uao53JSHgrr@!`XWxWhl;$=M(NNsBexM(xc{72cX#xJ&_B=IR z9T)Hnn_V*EsO~&;QEU?zpTeAnVo7JFRCawQP>n_V4aOsjIOfJjlsNph&+1zbiYpzg z*^^Z)$0uK|egO4jXusH2@npEQ$g&y3T! zSjPVRan??z`u}|#GSJKBRq2N}^Aa?~!91Ft>ohaqWo-YCn@fGqgC;h9P36o>AW>~a zSFJ50v)i2nb%O-oE3u^dp(h)Pyge`b-h}fN#AqCJMMx zkz_D*%kL6q4jBl>%ar$l;@yUh@(`nxt5&n)tGyz^?DzAY7Pn%2v9yB?WnZ}x5pMvw zB?@`>J!vZ>I9+A*(v7^Z!lT!Xks;<;efG@sqbWnXlOw~PNY$-Et4_LlT`?P%Ij4K9 zy*gB3c*u#S^(^b*$(QsuuR5G3GW^!EF6uQIY!h#U^W1lldV{R0zgK!J!}4l~=axwF zqqC=h-29|;y^dAdX{%?aPSs|w#L=BqRZpLrEGg}|pS44JuNd`tPZ^aeajWF&O3k~j z@c)5RAPhfz1rSoa&QO9gqbQNF6~w9o<;J-YbqJl(=XQW^i9_BEmo$Btsme`&DW9ANaZXOTM4BgFq)$MBXu67%3`B_OL z+4EW~-%2*aKqEf^Da)ZbT6%=n``S_iQt6BTE8Ic61wr(mZ#ZZ<&;`&VBwc8&TkT>n z!_u0;D7j|i6)TaS(9r%)zPTPd*+eeQOWvNf`l7#rZ11@Ivim3kI>GPtv`Xl5YlV-{ zUTQj02GM1FO@_+Z`xgGCE%-6$^~jxEi&xKjPI|B+{`XDnw(Dd%N?C#)0gXPwK~p5_ z;E_l#kcpJiBXBK6v_coBQ|_BuvDB9d4`!HS2l`2bjFf9QolbdO!cGA#5`uFkQzD1O zxp+Lrl4I++-JGLlaZhOx9sQ5MbawZhgjJ~50QEvVou6P>1{!j~gzzb$zSm(It0}>| z6re&9Jmo^CB?MM!asoV9ArlL=cKaYyfz!lJW#u9A+wqY+g;4&Ku4?6ksEyLwR@D`) z;&?b&W~3sUGhT#f>?+&=44)e-3X*hF?|y*&vuS2KXaP8O21d!Cet{>RSN&n`%64__ zf_=CRFu4`0kGW0i+>>8Gfm@2=W;K1ID%F=Revx}kMcIra^(X_BP${_FMz>FA4 zr{nN_(2bm(kY$gW%PyEQg5?c`bvCyL+B*OUyn!BgYa_=?ZOv;&;TP4YE727kTzQE9 ztfFX=I?l;oE)0&4)Uj1CFzrp0!19QvI`6G{yt-b!Pp#_vY1EXczCul`)eGPa*~OlputMg137u~1s+C1Mw*)xcaMaAl1<4mG^UoKM)@5C=%iFYL@3(5t z4uO#3ElKs4S4_uU(W#BQ)4eS!tY#t_AWm|-w@rqvyn2u_djTXlI$%>oyFZ)7-0mve zApM{8@W?FpOq=H+(2-uE-*f)f&NuzLG{@zb=Dbt)GM?n zdrE2VfP^ad5z`{S>pG{X?)aMI@XC9L%)4XDZI4Qw9G~T@h8FtmZj<|Wg)SAxx0M@Z z#Hk#w9K?y(=RA0qre zZMJ2u&#R39jztpPE2M7qXHy$gVeen?)ooX&7*?vy0~d$HllZU_=)TnE6Zqm9-g%8$ zu?tSK!Y!)dS5R+FUEszAxL0UVUdWHmAPIwx^CwEDtK(HGDs~FDmBBJP^Uj_@KpRn+ zJGZfag+@8t$>h^5^bid5yKBBfq%LbtUuHHgFlw*Dq`hh}UR%oqq$uuC-WL?VG7Txp z?sMB7v*ytTGzpkhzJ3W4(&Pv3UVO5wDo9F8^Hz0O^D-1Z@%@wm(D7?j-855aZWKQL(*ifv8sf@U7%gJd(XbF0asZ z?}KSu%TdS1o}z(UJea!Zj=3-{;q!l#=K4y5JnO5)u`QtQlglQPxJwZq=QW=^2Vkl# zlmi?%cKtP0g|Gzvz5|O!shy?;8>SSqLpd93>#G+?bg!&lHzvBfe3Y(9l<-YCiB%HH z3EJB0|25eJCcNxX8{&9N_@vZ1)h%B^UH5y4{|{eZ85ULBwY_JEp`<0G20;aBP&y@5 z1QC@k5drDWVFp1!X-TC;0R`#q1_43o?uKFL8eqQ7{XX@+$NhZ#0)Fg$?Q5@V#ktOP z?%nrzF(g;`Z?``EtW{#AAFx}ucE#x1Vaon-$++eUJm_ky(;)VtU&HpfG>bcq;lOYH zU}-Jqfa7nIX_Cb_ip}G?NxR+r$n5>DzJ!OsD)o)eTyO`-xu5a?(Hp_-@Kiy^iaPfA zrd#Zd$`E=&O4#sBXG&a=;R_jRpfv|d74HttGJ~KzA^d-V@)sZ|4>lJa8qY6E3>5X+ zofFLJHaBVlAzrc|O^8M`E}dA~N{DbvE6jg-Wrq?*38i}`A4Qa2NeJ%kgRmkqfROG3 z2!b>kstF2NQQd6^Wku3!AxAKQLIL3HyWs*d%9Gs;P7ix}VG$~{{RZ)Q8=M`1dR@tD zWt3;u^`JjizS}jjTf12I85Ia7j|B|opaKIgCs;wDs-jFI>@M*}4zQ%b+u{JHdukf; zwZUhHof6~eXBSW}&V$*Cc^dB~B1K+dWl}~;gU9qWBo)7e4n~_PKj1+Lc=C&gf>d2y zHINMfxUe@}ny#rW_(vC$Bj(ul0f-tfc%3RHh{J^xifCya*wr`#@df)~K z2+>~d>E+ZN0h)nKGR&KSAqFCSx!yDvkXTZwa`9ye>qSv1pDuaO1|_)ZTThRi-N9h? zt~*AjpLqM%oufa!rhE&nfAu)u3J#eqbm^*Ln}eW){-eHm!5d-C+mBhAYNfiou!%Da z+W3X=T>6knnbY$d{g>a_*Q5{YVrfGgvzdI+ZLwSZmgGJ{#MROyl%(-G@TiJTST7I8 z4`lXDSNa#h5&GQV`-*dyegk=<;PgL9W&OHrC}cYUB)|j<$rVT%ajt%{PhaRtN~a?6 z79!qP#`B`J8uxE~1LJj^d#}^9_d_?`YiaA%v;)bTf*4DG0pnCxlZhY725P|Z?8(v; zn289|75%%`oez^ZeVepd`H!1jn7sjdyC0iiykW!yCxdv1sm5$J>7xbFkU1K;(OV4C zqgdL{vcaB_Z9Ko9;z#PGuMr7*Ph~cOGy=Cj@GKiM-ULswvh!d8-pi+Itb94?M7(77 zN&!Tsb$>@RrLSC(Aq)EncC%(P>zZ=<6D#Cher13EC-+~o#{*6O*W8vhINZ=$JHm81 zvd9+y7u?zag1jZW-W%PPzz!T_=x?!LALn0sS9(1yJJlgwoD&mWPZ@e+g^+RY&@8LxFZ?QM`Yl6Gh@#MQRNR9yD^>iK$KnkjX-2 zJW00IwptARKbH(vx^m?sF$ruS9whQw5(7#+XgZ!dh<`s1I=5+P1&lEj2i@LhT+C{m ztNKrS3$*6_rO8Xxq#yroS^2e*{?6Le7^XS?d5wgc@{ZA5MrstCN};<>;A66$MoKuoo91G-u* z=dG0n$`-&})1DYxg9DRO8;o}k%p<*|!3L>RtQbg@S{op_?8O%jc%j(oXn!{9LK}0y z<|~@%OM#PtZLx#B+$)!66J67-Aj|0Cu^6S5#$!rhrKUCuSfhMm@7`43tm6daL~)+1%6 zjRb+xXq(!ju+!Q+9P5(rvjTj4M$7^O+Di{zz)eL>vn5gx(5#gZ?vu8o$aV% z`b_SmMU*fYDiFZ~Fz>AuZ>fSybr~fUd`tQ04+W8-IC&M1LpH8wi2d zyXql(=?%2Vzyln>F|HhNcPTES*i&yt4vesLb-sS}E#szC1uIrA?8~G;CX*k-&(b)C zC?FjOI(^^N>45$<>OkiGwO$wAOwS8^ULSDAgtF(Ox<(Jf$S9E;A?y45eP>@`Y=m2Np)$OYd*+#TES)%cniYm^8Uij zVAd|uTN8G8KKu|Uga`5i(u*c^3>mTrg4w`6-WeIoQI~svPe#N?UBv{O1&msZ`Ca_t zMzBFp$1tQnAeaxN?~=@leFM_Z7ZtWYJi6fsndJ_J{r1%}Rf3pyEdBrd`!z=sH#Sxv zhQV($z!VND-6g1sjqX+8sDZ6J5P26|Tg-ZlSfdVM<#~tXBBXH7#bPRwGkO01{9AwZbU?oZ^k=q*K;aH9&mr{a;qF6wb&1>(Bm&CI-hf_%+%# z(3~Xjwno^->YIGg3Ay1>R#8#ecBbiapeeL}EMc3O<`K}r73lqz8(Of-JHz96PeKj2 z8|n3)cV<5V!%b7jzu`1Gi_Sl{CQWZ$!YRp+qj<1|eFi%u76!MGe$y(fN=v1>PyQ?4 zVcA<$qY%xCg3e zv|qk+@TzQRy9Nu^D^b_3)Q;Ga1S&buhO5 z2|GALH~0X)3lq6xPf|2-YgYaQ7+=w^bvg+ya`%A7sFvrT9KmI7l&2`f&>_gMhAp;V z1#w-nN(w2A32R#MF1fHR^pb$|g3ei4rW#!3} zEFkvoD^oHx?sBTWzM*-u=2!AKgDCDrS&BM-6+)`GEGZR0lV~jS3sSk*s>eVc(Okna#*k z16JT19~kn%5v9?`0*>otOOug?iSmG{t?W1TwGd<%RAZ6ZuPI&y1!OfqAht*JnSNmMr+Lw*H)f2#~gdj-HIUvDr7$P zYm2^>KUlQAE!tT4jer`^Py}WrWSd-)g(TXA$w15+Oft)FrtiQP6~sLVMOp8@ZQ75X zt_M+#kV0cn`{Z9!k!Bm9l9iloLq7Uae&Aozhqsoc4r|W8xf}c3k$t{|{3D_c3KPC6 z%p14-U4F?GxE%1u9)e?vx0bP+w=y@DbrF5a3wBfYz6)Hkc4dsg z3#(4a3D9qZoETSG698T$odKrGz$%Mk0~^!aLm(X3emh;Kou{l~F1zA5I0LSp%?(#; zn8yK5EjXn7O)|T14ICbQ29;-S<(Av}?4LF=7tok^TAuIyKWa@LLlb3w(+6!fksY7* zeZc`phXcD~-3K#g5scBI$T}fW3tuvWm&cXtw0kXw8{@1Sk7Z5HbT663eH#=L7B6Ma zGh@leg$OH(u9(;7A_?p31AtHOfyn~yb zt+I;QIXeP+v*K}ag0nkBoOD*FP49J0C!S?VywXV`*LT3i_u~}xFeBt+2e~YFf0@Uk z5a(G0op`2T1M<{Pt1c6tp4kAPjO;}NqEeWJ`hxz%v@iLd{Kh5%79>Cr+kd1;kPsrU ze-RD{uAw5&+v)Ew5597c{dT@N)!J?xtSS>X3uLRvGtzMxCpw8U@)QPNENPm=EA1{QTY zMk<*$bSu0I`VQ^c)-BdYLrkanvQfcruD3eKzC!oyxGn1yHodsY6_Sy~TnUl0uc`6e zK8rL6c-~&T{=4kkd6|rcP87rE8U4~9+~!N1!<`%op@#>1YY#eP`mDP&Hz0-7_=0-? z=tO#2D;dEBtz9l?{%f%3OT6fM{+a?RV0apyH2izB0{6Cp%nvIau2o8g?P?sng*`3% zrT+ul954k%g_%^v7YtRANk(MRtoo{;br_e02bZ+A{av2)yT(*(K3HP`9sDZe;aIDS z-S=h?px-J6dkr7^J3uPYB$Iaa@nNj2k7mux0Z3lxUa$j8r?+4g`QQPCUJnUDhtE8W zd+k>hDXD<|86M+&!C9@0Dm}T1%#3x{TB0|N+)r9S`DCOlr*2+iwIct1D#7^+*s&zb zkt+e@Oihne8|Y$H6jb?wz_G{_a60+&zkALXe@RN9Z`07rJ=Xzc*36AsB5+F%WGZ$qY9 ztpUdAYN@Y^hvoClQkoCfWY{#wGhd_d$Kn7uBa>JcC_7rN~cWF7ehf~#k}HP+|7 z0uJ0$>Ph_ooHbZ$BqddQ~tQbu~kiT!cprw4%NrVk!IDjPP!1DP#_ zK;@@{yLSyX!*+Q;lbO?jq#y#26lB^Y6%u^K0c~cgL^$kY+Q1tysw}HnCxIx}+%7U} zH@ZJzVG62qxuSj*>7>{3L*!XWq~vPEp^aB4B5wl6gYT7RO^&`R*h$l*J_4em0suj& z=Tv~;`oDX?YGJKZ;Yz19lSyLG#!bTN4GT^d_vg5Z2oa%>9)uU;x}F1`PYl7)z{CuH zg*P$YC!Pl5u-1hxgSpg|>bCczGt|%bmu0pZQcoV%3$N(X@6iIAS8#AM2nEVHtt2dC z)qsKP4G8zh^Fv?aQ{qRtd7zCn%|FMQ^K5@2E3>K`ichdP?%>y#Q#?p#!K)SQ$?^U9 zX1wlv@j$Afv%2k$M(j7JR zT|EhEn6gb)p1Du#a35d|jr^uh`SRV3iWpXY942B%`11;usqo~R2r!}rq@Wk|W01Q9 zoBq;Lt|{GqaYnd6AAzKx07PytTUh;2u5(_gU-)>JD5AVm8{(}}alO4jIq68MT}soA zqwa_XSiHcY5QiE~*RbfC;SJ8`wWI9M7q6qFc_Iu|``*{uDWGb6_WweDzTa9RebLczxSt5GwZ%7UHmQmgIZvF`uU98)_ z5TRe0bntyyI{P*t-+ETGW*WQ94(QgkNRxsc9UYx`f1BGaxKums~?td{mo| z{Y{}&a+%B(XW2JGV!yZb7RAmKdmpK+yU1zWH&IOda>cT!57xIq{{5ENX)eZ~!KJ$Z z)2SK0D)a(<+ss1i1$`Jzt>cSf^rwUSkEDTD9l2nJahJgclpOjOT=uSF5mdy013mWX zNlf}SI|h3tHfcDF%jVLRB09Ti3b&lLI%W54GBtKZ$P;fGmHA4HSe zWN#UQi{tlyg?YB&VSjRv;QEj5(yF{LlLlwG&EzPGk51jlip5s7!$RrQ9G?DB zLx1<$D8P2UI8!A=Serd(eh55nZ1+-!%<=$XNeoh#cK6Rq7yLy@6n_jHJ37pQW3j(} zln6ZrXJRqqTL+%sFR2Cp&^--GTSy=5`|%F~(ejGOE5xV0i^()MSXxq?R_W?N=i|DL z>HPe{MRZcOmk-4{R(E&tz}%3}&a1)l=PGFYxOAZt!MAR^2%*M zT1r<}ml!(gbdKFgDeLpQ)M4G*1@*1|`2ADg%5p-C`92xYt{(atnYudG*XiNS+jlHLYHlMPBEp`wAo`|f2EyIJs>VHKAZ!AgnZ}H+%{KEG=LR%= z8w{dq48Y3jO0yhOVs<#-h^9qP4N=tlwVw;chEDHn}WYivn zbM0Q)(21BELyF?(WleK9-+aBd_W4(bJb{k1>aR$X&h%KV%B92u897{}Ln*Fi{)Uww zuCU&a*timo!)gW4lh@??Py8^-dI#Aaq^JQ?^lxOJ^aVX2rYWaX6hN4qE#W_PB#OO3 z^4?-r7--u;ADOH&v%F(+#X^jtS76s9-V)<$H+)O=H*+0JIVS+>tZ~)9xRC+#G(EH8 z1H(?+#N0AA(dReR$;_3|-n&DgPSe#}8UmquyS$LuuT4ST7t7Pg?#dAzn(A>n2x^7z zQlHxY>!k!ZD&d-GAcZvBbFkFaWyZ5)Ua+5V;=bZNA>LETV_h@-)Z{eo0Ns&WKa8^> zqqf@e^hWgYIUn?DYkM!PWd8b^VA-ZcFVI_M;^%=AP37*s2~3K;1>jC!c{G}I?A8fb zfv}YS?Pl{C{Px)qT!hykvx=gfBcH`$QxAO%)+SW=z#(<7e5RwbWh1|ck<*O5!!(NX zAJa*XzY5J*z`;rJ{~2uZuEPfqAX`6dF2H~ zT0>;g=!y{LJX358>HA9j$Z5i+eZ=Qn@qA*mPYhHc#~waQa_eaG@YC8evRq}m9x@Z}>5U9q zT_R74x^Qn9*A=G+SArUFy##=Rf!qa`HULU~T45B>e;f>K2NE$l&o^FtOiU~F&Er`7 zYiQsv{mg$&L;R(mc@2_o)7Wu31nqoN+QBwDs}E_p(=Ztx`e{G~_?W$lN3mDXNQ=BH1nT2eB?aShXYw4V)=JnVBQ%N_K}pf_eF{AVz_^ z7xr&}>4u1Nt2be?JHwh$f2!7gU`tg7^9~#4bFtC@VbOI(gC)qNAo*5PUS=Le#?gc(T5{M!vh7A=1 z)CA-eUPmQ&a6qlmWo(v!SX3JA)H(EQOq-3T=VOd$RWgY}T3p`(aHI*)6LYS=D@ z55M6Kcy(9&R;7Lf`%jKz8EXbu9X_2~6t4e5GkN48kn3_^%A@6}3!03YW)S1!Y1(oN zXg9pT_ny;T1vNTt!Ottk%q-C}^(PX2^A)GI{oKGVz`zA0$_uIimEBnfo2QfO8(Slh z-R0!}r4Ph~**DI1s-OsDna$;F=(--LU!x+ovBu&E_7si*&_7YhsBLb1{%+Ng1E6qvt z3$<>KI*hB`jRj(e0O3uHAYMcF!;Bq(K>-loDG41|4$!@3$pi%!$l5>si%S50Fc;K# zMFE9|cv}?7bqyI3J&8##Yr@tveT!=BIF*>46dvgK{kZG*%y=4_$&e6}+?Rvx6jAsb zNaj!%EwfM^J8j`GyCRW*!0vE^2*-JWQFBP3|07k8iUskY!BPu~u_?RsWi$`OGlFCv&f`-gm3P56ldr8XU$hP9*LVeGnA1B|%98?tZU?bU((IRmy=4oc};4 z^y)x%v9q=cpqme=n6B@ep!`6Ez;$z5+xswgdMq8hI!S!^qVOXKQzd~r z>m!4YT3H)a`#e9aGEmM&Bf>wuy_oh%FS6Wy8?!XR#v@{weUcHJtl^SwibbTdFQ9$m z2Yn@*`i=rEh*(pE5flYga3==%)ea^`M(zWnPGf)B9nHV&&L77H061Jo5q1OstMJPa z$<4Z>29~xszKe^fBZSD!`}e5-h?@owLGinw_Y;$av|a}Ogn#&{u*j@TOGJ4eKgLD4 z9Y2YzJlM&1Z>RR?)#mBe5aO^7JB(g;)JSvb`(`Y+pZ&ci7yNndF`{2)GlFy6;5Q6q z+CVYD2?<&8HZYr$ttXR&8RWy~?_4}&7bZy?oVVyPAPxFNafQ4lM@HSYHo?V5z-g=4 zC)sEJ?uzl5TeZx{lJLqECd_I~FI3AF!*dv9p=XuwGO)qcUpjX`C&xa2os8#{!JiRh9 z68(FpMh$|3uQMo}B|es4B_+#ih;bG7u(I2GWVK+?XH#9AQ5PJ3wC;@qPqJwK+NKcG z$lf!>q~LJauEfbTcE=kkj#BKZ@HYC%vFq$y!SUVgPU?|13|u8IHdKAOR@Uk*q)-St*B51VFUY>2sO`uBr z`ArT1BfWg04Fvk~>HH~i42O(kmYjqk{zQWE5cnIFMT&R$$qbZaVUz%rrLsAKqkxG{ ztNJPZ1}QO=d!zhBZg*yGl!Wt3_{w?H);(7ZC-OkowuigwnC#ZliN0l;k~~D1U#2u1 zL&WAYB|%xDtwcGx#JM6$L+XE@wEuKWUOkDTMvx_r@aNv1BI_;Vp{eS;UHj?6C#m0B zxg`5hdCz~=Bw70>#1*`Xv1#a)8dGJ;_wKIRVC{u(#8+Cj?tveWAz9MQy86;Ew;6CO z@BVqNjd3gECIG1AoC#mRsmUG#Az#?<1KiL%ta!8lVP?yfC)0Ls$eMj7Zm$gMjn+tx zS?R3!IoBr6c5|K9^<~jPEYx1#QYz>wnDh>!A7PRBDo^O+r0 z6p(^N%m4IyP6Pp--%2TUkuwJEaWOL4pCJSvT-tT(&h{9&at=9gh#y?$xeNPC_$%3} z92d3|Hs7t$A(-0wSsS<3`Yo!)VIj5afz+`DYEk!zHUv@(94AMIzEL+nvbc@cX-B6} z))y?!OCM4Ha*wJAW`reo0IxHF;Bk^fdW~+ zFT;E3Sz1;v@C06t2;rl!X#(ZoH`{+xyoffzrEF;f@DmP8IN|jsfB>a-t$1fK65Sao zOn@rlu&|IC#-d}{&*f5LmoLAAqezJsAK%dhDO>fGL+$$(U2V_{D zIGl&Cu|iRg+4aK~s-)YT=p{Cc$wxb1xX(3Kmjg(fvNtcK3M~Izb*lFQzz2w|^gP>y zbYZlQAgIV7d+ZFC_KaJ02GHn7i2c+m&&iMuP~KO30;ChjF9^v)(vcw=&pUkjeRm%4 zx27lE++jEgJaWmiOnVkoBuV)B+5RM4r;xVs`O6P8c2K=oxh!&&p}C@-*@sB4g>9O` zMZy(w8M(WV8U1lcJcHZGi_ynf&nI`jOlohLJXJ~7v55*l+N6+9xA!)Kq(kMYv?xe` z>#TwJfcQ3V7d=KIODb##JNyItv0ytm>)4>vgj48+fAalz8Ca;`sW0;SOsr!a-+6wDE(DR2I)wdHF>55K7I#%nwMu z%yjia>*O6kq?sZCZ`pC;A7{v6Dss)o_Vv=$CM>5abc;W`_>Cp(* zO83x@78va_HHrD>fmI^`N&zcr!ov1)_f>{N6QgAQ%(QnWB_H1N2f{NLyf(8BaToU7 zj1N_wilj0I9>#a1OzdX2ED`=m^!eg)%W!QHJ^u~I$lm|pyW$DiJ3PiChFlkTG*`h@ z7`%U0kMia)IiLT+nn(ZF4OYajDwxH6<(|6@*pIHQI1MVwRNorq)Co`7Nm%My(SsHW zWmC1*=989#Dbm`oM3Vk?k*C&*gI>ZqCL!K*3IdXcfdW8jSE#RB&XjZ*}qQg2jB@l_>%s57HoQ2@O{T;&NL4w-c)S-JbwlgW_M>bx_lK zdybC1NzmWqwzg<*Lray2gY(v+O|n7lU{#A!j>O|Eu}u!U(i$S-&|b|S;*JHzLlUV} z!!&UO0Q+GhPo7Y5*J)UYZs8X$4nV&2`=-j=^^`K#g`#pT zgg=K$ESxKGzUt)SO1+`fqqUWyY1Pofg#OfxKxHIDxD00Th)VC8D7=2d3VFihHDGJR%dTudzQ+ zqpPaN1r(+=)!!7NBnG!qsXvMqu!8*d1mmk!n%eLm3GyX>uaT*n@^C$D>K|lZWVBiA zuUp!qu;|thVd;tB_57}#R;}rbHKIEzerD_W_;JIKF}tWCej(-!C7|-)ooy2d7#s*u zlk~)Zc$(OcuO#_cZaxCw!+*wcCe4e{h%>Oz&k0r=9-9jymX=Nn2yqY9^`CrUE!drQs98TMxQ zo$7hs%3RT=J8QQ$_d;IZEpYa2b^-pdw7E#tn2+u%svws$?a|TNmGTKMw(+_kDDaaF zOsfC6>EXAKwyJ)y+`zs`FcW$Iy_?%^Q5<0xEfXgmHo}<>2@J<0W*;TQ%@j|HQ)x1{ zf4(Pp!9Hg)5sDz9&^0cc&=x69P3b5W(z2{;d^d9?k~Zdm7Xt8b27&|@0XiwVKmf>P z(@o!pcGuOy2!KP8(GkvnM&b`pfDgD938o0=Lv!uB)|$jrKZU^$Ty4r5iW{g;`rLa7cx~dsgF^j*PMrS3Jp!-f$c_8 zFuL{hzo7*9O|~W}Uas}on|b8zeg))rReQne;eRrcmkU4HCZgGvsGyCt&sS(N!W|qU zI9MeM*6wBe8fd>;2gWn+X$re*Oh*H8Qx#sLmBtR2(N2H_eOEMpG%~?24_ox*S`^`vUHb?hS zO~^VON4-z-JTvn(`_fPs?XO1kyzX13J5?Y{<=*}lRko9GoO~N31ag}kuEa`9T*6v!EX znK;|KcsdK@=;ZBh*Tst$286I-e>#WB)ihV_*?Vkxvj=Ry1y-CA6YL3~W$?$*z)GoK zsU72UdJ1^;6>y8S9)VgLCI_!PzjyqKq+1D==C6PFe2KCnMtPL66m0aVopmyX_^Vx3 zFdu?AAzz68a#O33f}E)-o1`4rb&01}w9ahpJK)Bi3uL@w1IElQ%p<34#YCzl zc$zK?1p454)tR$1(sg1EA#X$%K6vXPzBd$tpY*#XNt`aWysNsGH2`pIV&Q+F5dYs! z_MqaZ?;v0CzVf$_`0aPRgznXyt3U4I}Ws8eiT(7 z*nWGBcA=38X8-<8lb73>DK|Jz&(2xayxyP29_JlIR8sw&|cqSbO*Xc6Iy*V z)apB?-HYZyB!Az}mua66eI*S&e#EUjXLFGBGjCt;M zxG$=Hgf@;+KXg4-Ap1^T&fENFO(;tK#v4-lqb%e1DmVrHIq?GfC;b|JUduR!yB$RK zQYXWRUy-dR@a2*KR6-N}II}kCZXnytI50pxyGj|)v26t4u2QnX>EzYkJR|Nb_|(3@ z+E}SifBYHJo51Jr(en0#fM}eDtjCrIZla0;nKn$*W#mQz^b7b1*KB&G77vij#?ol; z`xjO32o9fU{Y`K|G3c&N23Dc%R(0p~(Wb9!ZT(V=F*Dg)XJ=>U=Ng#c4G(&1f?aJT zU2iYrpQF!?q{NOw1Vtqg7axPa_Jv3H=dH9j^<=b5dp2y997^$NK2JT=eR09&cu4pn z)az8A(8q`?-M7#Kqol_%baQykE%NNiC2{bJl$Oi+U<0pkYI7wtCj9Pkc23TEG?A;wd*W6Q1xwVfc=)o~i-m}@lOg^`(v6pOz3zl&jnyk&oL5(( zvU;)ZAL!$E@ctZaFuUys65%C=vUMSMeW|n~T(@q?JtW?_=_64wr?D2|u=+_OB8`t@ zSK$8niN(QD^zuqYQ1{e*#_xtwTHAuk>zG)ZK=p@+!+ZG0ixY#;*#L(p8EaXpxds4g zQc+&v<9Rh$GhU6o3TRZn-kivIkQDdm5@!03vR;i^{yosz*eouUVj-1n{&DM=r-b;c zCTF`do09r{NfnzSS`!vGQB02O;GM|TCTg==>^*Li1q0IZj|&pC#(8b7FbAwj^}n2g zy_!nYMhZXlmV29z$t7k+wcpj7*8TVVHXlQ2(l6XjVV7 zwHH8Xax`0581<~2-Y+g9wOkQ3!KX9rrj5L2FQ7|+nhnkmW|U4n(jOZPWOib1*>!*; z;c4JZ&b)Y*iQ(;d`jx4z$u(g)w!KXXdKjYS9pm|_R1oH^urE?)<#{s<6*ZYxJ!EdB z?fGrScINEtUfl zV$1nBZl_PN`?}_8bO@V(#RBp_i-j{S0Df63)DB#6ag35>(bKsnN|ZqY;o|ApGaELJ zGu-rkvO^@Gl0_j?;XVDV`-!N`@(;_8xJ*|0(xMNFTmsSportSXtO=lD%eiWRh+E=& zJjD!blY+@d>l>7M_Ay=FNVzOy4O{l&^m4-UT?Y%7Ku~n(a>!yKlF`cboIBaf~US9L!56k2fh8KL4mSywtZ8 z+11j@hF{P7jrRep|D)LJ$mqo=U9$~lYmKUEx%JU<^Ehs@L$9uOc3_nRRAlu#QGQ<` z%yCd|7sZNxAMJ;mrhJQ<6W+r`-@*rYg{(K&<0;@- z+th4bnIj!@M?l}lXSZ^6cyaW%X_(K=?$j9VIX@Jq>fpMob|aZ6Xv?c@cV4o+ME*C* zk*3QM-13y>s3BI1h#NdW$Ou?V(6TuB$qng{;7TqL7<_$qsuyu^O`2Xb zY@5w7-h~M*t!`Dw%e-6|!27oI&Mw61o`jG?J^8MdDyv`>MR-o8>`~NLX2qkA^;~Y9 z*EVk^b2Zn+^E``2*YOT&cjGRKiVF{5sv#Cxf?QkU#BK!O2Sy4B8(%Y{ ziGaj=(QhpW1*QXvz3xf3_}Kja-oo%&JGCYI^)d2yMI$Ij)0Z@R4T`OhVVDlTrmA1f z{X*AM2rmUcjjFq@43L>Y2`ldWfQWdhWJF}Y%IJ+?9wzgEG52Tm&H-DhK7rk#ZkXI& zTptawJZ)sv9p47V>*DDVq3evzZA(XQ_txBGCa^3#eIq}P@S(JYxFwSyK4AK^^qStt zA*8BdZ_U<*buzoF_>I*F0m3TWY~t(G-&>Cgz#w<)20oEp?No$GML~&0>5eY%ON+%bW%d!>Y~yY_jNL+_NnK5tZcDeM8l9T$820I-;1z;D ztwElD4)nz=60QweDqAfadgZp-v0h8_cv-ngdB>D6Lh@HNh41xbH|_N`ll$h`?5%+* znhbuLPA1qh$7J0gX^vm)ABN)%(#DpvJ8Y}%+qDuBmr>Px%@3tk6nac9923u4ptHYb zBt143g!PfgyK+}30l4i6hSKqDabjqkr5=Bm`Tnb+s`5uh=w}{&`mg@R)IjXQ^g$kr znw%0$L+b7L$C8ZHy#gDLnFf=o6CJ(;6ISfzp`lj2?!B#|k!Gc0mh0vPkdIOe?T%8f z;v5u(eg>CRs(v-BWWE08mkaMaC9&!IE6tC;`jw;>M3{56Fp8<2hoGXLvE_()+EYxC z?(OG(=n{rD(P7_Wh;2wi6!exrPirHdKe3K-l=ZwhK^THfdPMU*;C4r}+%nGmTBzpt zvdxqrPy4XrjWc9m0V4UdAZHz)(k^t3?zW-zSYhPR_XmE7j&)rsQulUs!NcwSI>t&WJ5J!0B**xqb{%upTGqp#S5e6ut_%AM#PO<$#SojnV1Pyzj!vwUMNrF$uTe@o;& zurfu>W_>@#YoIUZfAJ2)q<8)Ulm37obsdC&DX-HMxyp9zN)$fF_WNklc(SnMi3EPU zqke*{G+1dht5N)#Cv3u&xjiM^!0+u&$*udqw$^8*Pg}L7h1Hje4hOC`}!VQGhw+f5FhVT&vBlla}~K{kVRwzt<})K7iN3 z#k6iI4Qcy8U%|1cOuJkoA2Mg`t5?@I$WPq7i(rQU=u;8)<{h-hwO+kr!c3?)#+TNrV2hq++c|fv@-n@SFm&FhQt^a;!gqx*=221=9jv zJR0LBP}Y`e|1Ps$E%1M0*}t)^+oo`T}Q~V5K+D(IRDg^kRLaC-T z)k!;RhUJ2NQd}NhxKcOd6Iz2A1D0{qhWejH(R~Pt4hZj%zxU!5DSP8hr59YKJHNfY z6eay?X}=r(kG_DrqU@)FWotzl%Yq^&oVQ#Za(a1664p$zJAP%Cf*Kzh?AEU;T_LOZ zZud%Ak+HcV?sRw$j|0nh|5u3<&X^cdNkPP}GH({qP$E9mvQF@^Z~C?k3tG+^wqj3z z%Zt4m7P~fR^MyG_pr)*=a4zDB@lJbMBCcC)hjMN}{2o)npL5R3wK)5=o*^e*{WvZS z=zb?c>1;X`trzTn$o60(t)kDq&-w)H$@Ym;v#z#^3iSY4E{sNBV64-&-mB|)?q(4YI)zYH&y0d(G$n2nvf!*hWK*@ga z?jxsrib*O3MIf})Fq}GI^H<~7&uSp?|AwP~7yvlX``db9*qw!!?gcr_dx{hHFh5~w z^!E;HfV;kf!fP*-*LWQ*RIuxlx^h%C!5Z`=6_Mx?Q;yM)Y4l~w+GX#5=i)*^F~hV% zy@$NveK)Z1CJLZ_eWd7TEbSfP9ax2>c=@gFv8=h9@53EbWYzJMw?`?T-1$*7v~dOb zKu4*O`7Grn0hCDHrWUzp?{|kv5~|RoL2uR}>!vhY zQ=)Rj2r*t$42^O@h%1M8L;lnM&acV|!7ss03C2%cnF-lHiCERXYZAqJx?X!Rc=AT7 zRb6-MnFp-ywckd0AZn@4-J?}Bw^zPiiyp4uovL0p@4%Be<2KxVQjrZ+9X>aUL&eeW zPBVoSn%|lDP^+;3PyYEd1Yoay%FBsr$P?ZWO73_-@ob`oevP90qjSa*h7)}2r70L- zy8?GJ^NgZA+4|KW`lwB4=Iy+JS?8xr<#nfD-z!uaFvR>8ujQXXW`Db2ON`d7eEuHy z-wjb`Nog3}JKoaxRwbs=TBCfSFe%R^UyJ=FD>luS0-MU^hR8w&xuN2ISekDPf{O7X zt*dr52c_S{aS!9&Y5bcS*bdoclbzlCF65?LBq*Ij0EQ_7J!at@0g2nT1bBuxmyaB* z#h#6^0axco1^Qk?EMO`}ao?EH!;dQR4Sezk2fDW2-)D!R*l0g zmzYw%-JWKmWW49pz~b1EEMEhe*V4w33kYIe{0E3-D}7=vwVSC9Nk5Me>xrk)Jh_)w z93s!sA-}#A6YUQQcBP=9N7)u|T81*2?YzS--LEmz_WHVzMZN?b zm{;xxnA#V8LU>@XhkDBBimOn@jMNMgs)CzqLeYo=HQxGI?B3-5+FBSWMje)kp9E2S^B#=z=4EvrT26dv;(aE`Bq>6C!ew z=l(`fjZ%&Btk%1E54Yd5DP6pa9uf-S_5dSmR8aK}3oy?T)KY&PMUwd0$~4 zPcPV7Zk}@aY*!fGVRZ#iMdjMdg z)U^N}+Aa?bz|%7SKC>|;KslB4YjA;4rZ@YtYf;ZtIs&#UEdSA*Cv-w8dOun)Nh&L_ zzME!8t}eBgh7(GXM#=jg*N}jNT}n4!5@v*xeq)x5sFa{^4!2nAiq+} zsFap>xD#nT{uoP}($_^XfKLszOEXybvAb|~VfoU$b6L+7_jymWAg>ZB^Zd8&&gY`f z+~1K6=V$w;lh?{q!2^?gelkBbf^@Mj&<@^c6JSd<+dW*v!ahg*K}KPHkY;&wrDQ*f zr_QWKA?cEYN;yu)p5hx>uJ6ImnUgZN8!q*=IJ_3 z`19_zMQLu$^ec}GBHu+4s&lNtCP#%$z3N)MIUgTZk6(i}1~;&s^DmqS1tSe^%3Ub# z^f|U6T9$F(G)Etj)_6(Aa~D1MM4s61Bjp9tY)o^5gF5!Oqp+Z&%H{>S-#ex^Fay~3PF_|@4*Km15ZWu;)}y?;^nE`C zwZc`yPsGs&wY403Rq)P!tr!3G8IQ}^7v&zXsp9eTmf~N1T^8%O$5&3@x3Ke(xVig{ zDgVPe&dZ`}L zm-Jd|Gsg7i%DzMw>HikQnsao3-Un|#q~BxA1>Mb@l!)U1@)q)Lq=$3rL!IQv^;1XA zI8l1*%oyXO`?R;}4C7A6>}r3szImD}xuK9A3Qn9&-%>HCo=A$hv@H$fIQartnP~h_0kG+T*{nF8Q-mZn$MUyc zd~vrOUeaQAII)#$7vb$&Z~uYKc!3XM&_TW}J(Z|R6|9>O!dw>sWWB8#w_an~7bX4y z#NsFj7`(nzqa&B5#4h|@mGO&n!`NOa$}8z^K&0OOnIlro_w(L3I}7ISh4z-m)=9R>DE)1Pu`r&RnBV{a|^OeKFc9wVP`mDGzC0yBIsM)vM&(Az?8nqe3ms; zP-g3ZuhN$@4Q|oNxU50oth-$&`7hcDS(tk^SV95)y*pd;@NqvD#bB2hf8fSZO?v48~B42#uQZ*FKOUL?h1)TSk&=~iM z&>oBwvOCg(dkl9Cq>RYz=P#ADX~hLAl>i2b28Q;(>$b+ln7zL|@zg6CH?GR5nJY+; z`2x#@oe}yd@x6b>lHa^+Jk$4`AN<>BjqZ)N(hLkS6=%M3scIh%W+}hc1%{6r{K)Um zn6-j$DR9ITCfyZ%)`%y#pSatL1*}%=dUcNja>h`|jXGEZ z#}oHdmX&ueYv-$ObL)Q->1A>Vzm~o4S>qk3tnPbhv0l6j+QbLXUdxv-ICj#+_0cQ0 zaCMbv)2IbT>`0C7iUp(HG~@F@_)yc;=Oc`cV#<-T6jGo>F&*h{HEBPy7OPC?c}Y#~ zMZ_tHCC?C1kMtIL~}~lCFI5-HNCOHds`0dQB%cIoz1nz!51F2hgyPch68# zOeyh@Mgz~B9+g#RYu+gB{!)ZqZU0&tvUbrDcaJ2pi(bo_|pVo1WB=199Ed_Mb>+ z3gYo-F%*~t`o-5NdWVY{kXuXIEK)_cm&BBpvATuf|939pcnDD5B(>&M=u&Pvzrr}J zMU00YM@E~m<_DiMUAt{w#8ApbrxI%Md6sgS3+kQNJ?Kjf*xYMKyuT(p0EHS|7KAmt zZDl`-P>Nfy8l#V5QI67y^oIQ8HX9YRn;Z3#Pq_X_t7CLtUa@EIHgszunV#;V5+m{l ziTYCVXxqH>&D^z^*egw3($w{?VJo_ZvL>SpAjM2H=s15b7&f4sk0EDbwMao#5AmmK z{{egA1inKp!RBUG=_N-yjZ!7*Q{HS_0^NG2Y=^k9rbTZ|%y_ zoiM{iR9M}R)%sbZ$iS!klKIm_2X}_XUc{^1@{g59Asjg6Fw&nNq(x!w7kuSrPr8ZW3gCPTHFzRjZiv|@CwI+n_ihGKuD6g*ce9v5?i z0C|v3HsSE~Pcy&H7X4F-(sBfNg?|#f;c_l?Y+;;uKd}UeMjssp-hVUC$au(#_{BwP z`^J@=n=Gvx!mY%R$}kKe6o;U^irOoZkJt^no~}Kk+#wx0?q}Iqxz_(3KUE{O|4un& z??y_vSnM0!ZvS>ut?|;?oN?BQGjbOB%?tE1B?;bMvWaVI(+&t z6B8Y%QY=3sfn$gdhqTyKpl<-cPSS6)GP`Spv$b++JdR>poR z<_#RZG29R+;aIeA^hP8uXT&-A{_c^hPjvbxUKpJ3%FLaPT@r*{s0zthph8qsgY3 zwV=rP9E16?7F$;RPxPx*`Vu@AE!M2|AqLfAE_0`BN_%?gkmR%f1Ix|c$&;5R`Ef`E zS_~jBoyg81FBW_7PNePB?oPUh$rji!6rFE?mBNnt0M(Qz<#VyZni+ERlZr3lagxRw zMUN-?+#M}uBb2L8WMPnam&fB&%%6yo9St24ppi9`^xKocIUqOX_h3jdaI#u#Da7Oml^MZ$O z(8PW{U$2EzIT!mok0anYw1nW=GWm$Uos;q<2-4o0W9aD9GhSz*mEcRPmz>4aZ@X#m zbVxJ%ON4H}q3}Qq3}6gs+2BDwV?J2oQ@bjKi&r!5$`x349LiqZ=9^saqRV3l)Jug^ z#RRxv&d}4Or4@a%W|dNL{8Vz?4-iP>w>r>%B`pwo>ZeLH9ffoUS61LM zKz7nGhWz)pIOioJU)|!iVJ;s40mK(PxqMbyAOB2X7h%r1nr;x8RYH+M32IM$Tf+8@-l~2On{#spCFFv?6=&|*YRQI(0uN@N`EVIV*VX&}z>>dM3` zv_%}`I8dT4vmzv;P??|hftHnlkm;adeAcCd5s6@Um76`Le(|I7(RYuxhy<%xq)tNI zkGAw{Lrz(3F{VXs9-|=6`laz&zJoLa%cM!1g?r|v`?yAOiB_DNakt9(1Rax8Beeqo zW$mEf4!&5F57u0_>m;Q)zg$>752C48V}l|T2r*0QcJR`Y@QcN}8>O+9VG~}BDj4w- z1$+Z^K8Is#CVIY}cuBS8k#8Y_6;N>Wdz;7ok;t5_Jd=$5+B*I{zY zwHcOQ+6>Ul_1(o&=utl_cJ#T~hzotQBBi01J6`Vz0KR9(3=efkXXm?4Z1k?(xJy7) zyXgD~!Q;!>BMr`-`fdE2ieD1;+={b$viAl|yUj)s=HDO!4E56bK?!G??2RI|b-Cv^3Tdbz}Fv3NvxKS@@D}|a9a>@Dki9L;Eho_wR zoOItcrRxZ5Qak0>94u^%G8U88Fyzw5`PidJp#0YqkOs(| z6UQ!a;En=iDAWI79%Wg*=vhvbXHlo!vH&EPy4ls9S`{9#FXuSfQjS{g;wsH_eS#L6E)#;o9*i_4OnC~=a@Us@2~=q|aLU^q z#Zw=ZJREZR6{`mU?vNV*B-!QutO*Oh6HL4i``QO*%2~A~*m!m|!MOtR1EJNu1H^42|(Iueiay$bs)OuwSy4k;IL|58^FUKPN3tuN-; zkKYnisJ!SjeLJKu{8Cq512p7|vE=jJ<5eWd@kX9IyI(kMHnwq(d*XDjR&X_a>e_Sp zb##2z`7O{xhZf{o$CQKx2W?3TnEI%);8IVQe17;o5%+#O)K;B3a1yL^AyWUxyv;4g z7S|c(VpgF{y}<{DAi!v6C59`9rp0$srZzcrC0@cEhq#8hZ{u6@Y@#p4842VIMLQ{9 z$P2Y%Kbi1I-`y|s27Du=_Ry^xIZa1JzXY3HYpHClOA1^dAgbK=#dMx#Z!73&Y~H5R zN9|wu@{YM3DY|mE!3}%|-x4866xY>oGk=TrhY_cou1Wfl{I6jzK@3RcgE6INiDOC^ z07n;=>}Js6E2+%R^F|nleXCqe-5|xoQqu+6KNNb;K17)DQQn3b?+C|7&VwT?H0U# z_P#?j{MvJ6GJGSU(GIS(WqYWjj>BU zt7AQt@n>|M;Y(Sik5cM3C+%(M>~(;Q>%@hp<&qY8h-c6fQZDD~!Zw+tV|pKC2JL16 zpZ!p7aPh+_lu94?!|V$qsLj(sF5GoJWt*Mu>?}qwDr_F@FOgx-_^|3c$@8uvb4t5R zDHl8Ay08z$bF-oQFQp5%+RQ6r;Npt1`tqjyjFUllBSY{OtVpX5S{!-U|4i|NY)!20 z_Gr%8@g<$YOAuy%9U$&V30T~0TXsPFy0UVHn@T!l zTO>q6Lh`0&P%H>9va0%qe?RpFJG=LQ0`DNbG5l@B1)N?i?xyaF16)zmc%5?d{~eLs z7d5;eKe*oGs=#8Clhfrj_o%kfdQ(~Q6U}Ld9X{Npe6f9g84|`62eG{ivf=D-z%)*q{JDK>(uArd;^>+%9p`zngN>Ykp0mI zm*-g=?KkTX8Xr#nz7#8Rc-3bVm$qBGQ?6>D`de#48Zdpy27#R-CY%N4u2)~hxqKq5 zHf6L^vs3RsV}66e63^{^wHO#AIFxT~P@&fDK%J)PruF0r(8xxNei=pq^EoRc%jeoIrQ?dJM zBriG{K3AL*Ak;_-OYC#P=o_zAE=m}VO-B-_>#P74(D4T*KWN6_uT$wR-Us4#v*-X; ziT@F2$i`^5qCYc!*SJ^n*~)H?K9z# zNP&>{vMfW3mn*(k?&aFGktA&?zY6UBqDGoft>aj@>(#Oa=$eD8bz;{{ErK0&l0on) z-(U0QWjVu`R3{LEJj2#>nwj;omIVUQ4zke@XQ3 zF|j9f!s7&u?E)z`6L57TH9N)Fn2=jWr#|IN3_{zBy+RZXJ(jxtRwXuE*Y&~-O$jyp zgOG9lIJ4l_qY@RH55K&O`LgP}+;Y4xbzd5fuxF1r0R!d_0nwc#gm1K)A~Vz^B1>S7 zx_rMlHr&U*vb_P|$6hx+FYX?Kuc6=$373F*rmMZkP#VrY+^xlzQS|rynKs zozY_8=vVmY&D|wBnPE-%Z*iW9LAxSpgG58XlqVXFFPWC3l7; zG%_7-YkhJC)WlnCK+c0&!JH*Ame3cy`eu9ham@+#u8Y=FrM|bgE!f=-VKbwmt~07}PJOimg-DksM2X8M z|9ceA(F`2LJKRGkZSyx>TDAACN%n(@Nb&ZqZh+`=-UPiXs`F={(MNrSj@%i2XOw9= zvH)@Kx$o8PloM)DS1faT96v=W7vw(N_}k5Q13!Bz^lHy(gZ-(V$-thh(b#b!{TXFC z?e;Bp-Ke#}qZp~AC-cY4O@baLZXGAI`^Ui*xQ?iEhA}Ge+cBISV98hI+T7^$qe@ag zFMIQVBZC|?0e~RSOQ=AZ!Bvt`hk)OisFlEuc92%!YgabW)HL*4G<->?#Pf+ZMrdJ+ z^_&NBQ67+aul(FLBv1z{(o%faR__xy9RE-q<+&e@Aa(y_du=)q_px3#T%wMzG~!SM z7RKRGkI;}Or!nq0nPER!0B_85N4u>XL0ql@b=G~=0y@A{M zB&Q*}xHl+tfU~ZK80g$ZxByD`J7?pEk>~s<$u@pA3(xL&!rHVxG2EQK>9$f+u|N(> zShWNjP^JCk54&kwBP^3>>xr9SA>0Y3s)R_vz$50wWf<;?IcRDKx0XCWeOMr?R)1=r zKYE56Iu*U=UYku)Q3sBzIZu7PEmqY_NgscHqh?Ori-Ak;cy7PGdps`rJ-JIC&VbxS zv7y{yldO{%H)>Mrb8y!2tD8#~$!^JdB%hxy%{)$-(VU|5!MnNL)-#^@@Tn5IpVmPC zEdg>JkasrdxK18E+p}Kq`kJ8Wfyl@{`R}=$7H}>Hd`oJjZQr#(`3C@=egV1QJ3cz| z!4W-(Nc)U|yWONiI{S!PFhjwk+RKsl+fo?=ynPR5>lN{cFAH%RicMOk1RR2c9l&94 zB*s26DFO#1KE~QZYvnO=UDR_nH>VKki4^SK`utMN9JMRB0K_Rb^R&*oJ$|<<^=ZX# z0_1~`={(?oK>n-KMT09hqGz-bMZk}@TwB*RIDyKo56*C*GwN9$N z=2l(vG-{wvq{YhK@r;>NM6Q{+u$u3O6LsdfcuCS=1?nsZlwJiKUIByBW5F#3VnUf} zxKa=-Z6KsMF6Xbtbd>@vFTF1o0kP#{zH45u9`c|{+>pOn9d@sb;j5YH_LFw4>dB}u zIxE3OH_bdZ<^s?5Uh0lAX&4oYmD5U9xF`6Ns=ixPNIpA9<*wHX*#ezexVzYl|I0YG zdx}0}Hr$h%cVG3+&WiuUgMCUA)C3W^(h=aH1>)h=!~oI@i_SzQ`ZOHrZP^>Wcj7$} z3cHy0w{McJcSIaf?9RiI^>Vl-(o%$2!oT%^jb#sRHn(P$H3@kgW>;@=4D&P22KL|K zm_l3T64cgG7@it#e%xz~zQ+u==JYFGkB2EbV)%oDVW|LcbB=nKFYZ2!tiuR6GK>== zn(a!zKRg%?`M>3yGBotWtyBk12_JZ|H0owKSnWK~j+l6cR8S>lLpAy7C*F$tl~2Zp z7l*fsg$@kyR(#yO@aU!9)QfF1y$qcu(yZWQFG34TqFf@Z=$;ny&-FJtzx)`S`Qe;s zF=wr316WLgsDhixb;@$+!pQW-xzO3??NsBIsz2I?_%H3FO%Q;*faDB11MWh=*?+!> zjpvb5`41LE`gA7m`hNRS?bqt)c?504d3!OQ)>Fpq} z2`HmPu$*}Lsm(Cloj6O1G|o52k)_xOZB}=8=4Mxy&sW8+Osb^Riq%i!Z+R1=ipc^f zdDxcKZ9^O$tjm&#(euP9$j-_=NG4m^-qWegL+ODjJs?L6#ZZjQ_(f)Z#XphCue4`b{Zuh736j%=4Z&QfnX-HFF8a zrQcQK$^C$9d}^tsw?@-%3*`aksW6YmwX>!`Gn??$fF5t9k_Kd;;$yVy7`NYEI38gp z-)XJ$Bk#nIEwD@Ay-u?OEvf%y2c8Bw8YnBf?cj`N?j*UnwF`sn37G7{_Ya|NwjoMz z>ZKl{OG#E<#swo(SOn$zZsqsN&QBn3fgpk{EgMQGZ=Zy%TUMBfe1yc9B!}M@{B4Pa zWS&6o+fY1eZ($v9I+{zDaT?Z{=E``Vvet1iGWW00;c0O4OnHI1vF9FrI9B6#Z%x-4 z4;|IIfuE`6Rg2D+G1Xm30ucgiqLq0t33sJ~>1zZaY`6=NQJvz=48zZxNx zoAI-nkGhdKH0ZG2n{*gN^=sW2zg;lIf5%9_Rea8-GEoNw+Cv!6b> z^2LaoYIH12 zU!QD`+KL0;z>Uq^kLnGuS-ZL6q$I#ogeFM-W{ILV+bg}s4kS{#0>;>Ixnb^A+kg+4 zc^m^^W4(d`&*h5~Rm7V?WTY{#$$vK_r@)3J=)F+KmX+Io3X8Y6zR=Q@!+w_H76P>E~LmwWWp_?>dY1GUyl zLYNv+S2GfR_J-*)0(eqy+m6mMeE)mLdpamxMAZdMV6T#0BN4l?%fDM`(@Q384!f^t zQ@_ovnCB9?{=p&z`#Tr?SexP8Y``{t&KZD2e3E2;|8`NPy0&N$DoVJWh`RXz>nq zRwJ~3?(ilk#V|f}UkhAa7R?rgj~&0NgwhS)B!i!s{77q`-NWRIQ!|a!WfGX^Nj!f? zO~}f16)&UvSN-y zQJK`^lbm6e1352wgArTfrLHN#dn{!$pqJ&tA%v$On|0g04iI3fQOY$*iopG|ktMRg z#O)sqQ5j~rh)oyc)ay2Lsw*wlji?*=M(a57mKo8A;eEF+RAEmTc+tpmM1el+eoOek zxl$EC%u$3f;|s^+-aLB(_W8|NE#~}Jcef;QA5X%?$(A?-1wS2rb34XwP+wU=1h!K0 z@Nw56Vj$ORjspe|5-ptn4+97|=!XQ9aTefwnF#ArfGeWyG-j->uSSV-=q*Wd4hKiVgsg$eC)Pj35&b10Y9#(w&#C z>>j$bbrLpU8_Qw`GiR!?Lx@8{gDEFg5nnRzmTD^9?knvOmI1Zts;c){K#S1D z%kA@5#r5VvH19;g@q{ATd7_9PNW*k6eM0#!^z&=L;2_zm>Hm0LIZ$Jc>t1({1{wWq z>%pQ7FaQy93CCBzC#V%M|1`gURLptsXb07=qGjqig3IQ!f=-bYkQtcimt23tgOVKZ z^<2r_WfG#rSK+5Iw9P9;j=Ck%5(sbjYNmn+-5Or^ZloERr||zWGPD7?c)&-75!s;t zRN+5PR*|px-O(ae7E)GPRO%<{mHM=YVfs~UEPTyShnbB{f2Od;(=IHW?A8nM5{f0nSZYh`6AXAJ=kxmPrTN>Qb~d49}5-Z8n(|M z@3%h?nNKrZO+Ng6Wq=iAP`V^_YaE7AdfaeURPhiWSw4XgNFjX7715Zrl$sEc+Va^H zRHdTuos;gL>ajI>*qPDaClk7^Ut1NzOk<=Lx5G-&I!j z-C+dNHw~TLH#s>r_doi1$Dc#QSzXum`bhWF5@-rICt2z=c9aPzV+QYRnjVxk{0sg% z^X}UHTjwV#jn}vJVY`{X>DI{izL&nCT8%4#JYLo;hpaZuOHY%2RDwD{U!#QQfCB%h zieOB@tLgP^{DGCFH;-quhHasYu#pI{TSNaw50lbt`>kh~a*VXq_2kB5KtBh_jEosD zcv5z>)3KxWT@)mRT1TLw2lf^S*b~qnmEJ6TL5kchk^DW}$umpyh*SdANQo;Aaf==T zDfV@)@88L(-YBUm7i&f_{`-#8E%O^*IO1n;4bf@p0 zlDjP<{^rB=c*KnmEl=WvD9)AuldFFqX1ZDG{LKTLoIiUrfw$?3K--hrS9>qjT{J<$ zygDnu;DuL6kn9WQ{Pqq?vyzJ)cQIhae9PB-Q4{c^D%sABhWI`1dW${9*}h3$o7-ig z1OCBwfTVGG{_B~nz}Rw->e_wTmeQi&$JyU3;x3DG(Wh61@0j4m$$D~rFn{y-_v%d* zXHpijZd#%{*rfsI_$!$W6}?f8iED@uoeD|SN#-v;7|Bjcb|Bh^W8N;AY+@_CpuAqo zoNW{4>-&Nfcw#P`1psrF9@9+|FpJ`$Q2;O`bx87p2?QVjR0af2zfBYHlYiE8qdr`7 zq`Ah=%j_>gdPks$qpTpl2D{%kQ7(h6Mtt2HxM zZ3OJ8pR3;@GK`}T1M{c^07Sc|Vm*^NlPNNabJS*e2uicrABkZ9$NezN((SpJsXyxA zgiH5#P$?U)`}tnj__R^s&UxGDC!(8xL9a{@8qhc4eW;-0DYqTks&kk zIy!*)5UR+J%YQY7IVY6#xmRW{;W(5)%o9I1lfLIZ&klUO)5`v)h+QH5Jz(XFZh&7* z{-achvj6Y=gn^##OWxu@3{d9Z7NfndC9%o<3Rm&T6PJlV)#6L752N%VPW`;CPmS=$ zVH@$KM_ooJWe=Y5xtCTO?Hdi+pAighpje#$d4x&r<<@cS!OKODLAH1~2kof0AZv8k zoM!PO-|qKtis}oDv|C=-RUf%RN>*Ns)=tY3#^D9(xJt6!95H#w`I=6yOAis;p6eVwRJXOR`l|Y_CFhLMGmv<4QvwZ zlZ)<0Gs`C(W+{YvUGcQ13YmARFM!*2nq#j_j>*8|au*=Z<8_S3YtfIMUU|?i@RExD zB#HaYW_6cdc;auOe~iFn|r{fY(uyVH*&3;N_h|8{W6+9VV)ZU96+B z)&-xHN@B5I>8w)4&hu}QMS>H}dCJnEO+ZAVTPY*`^p}g_j7Tl=l?=*K^j7Sr zM?J`73aps5puD}vg_cmYjS%hifkDvUmPxaZjzJXr9ORn!J7;KILW+c0I zBdcOr>gC8TQ_58AbkGxuYdi~|YeWk|fq0XabhCrCiOayNEEA3vu&h^U*CC52{%opZ zDB80)pRRoe91B(*{F2rN@=J8hxs;Y~R16XqJR~$$i;CT`2S0ir{D=r-#&KCsjc(c{ z+J09&vsx_CF0!!>rD9w$4$(r+H;dR(wAy9j>W&!p+#D24^Uz{$xf^Dg08P};l zx36R~J1U-BG)Hpjpr(IZ0;x4Jj+AwtXmzPvOG$bjp7)`!a<^=w;&05RDJaQAwv8?R zp$w0%f4MqIkzd{K!0dBwv!x%d6Fh3gJcdTkg(f`TI)2rVt)sBCzYA`EC>@`|4}%3aq`iGpx13nx>usYR##ixEB`fma6l>g&Okf7)_VE00_^IkE`q(5{{MyIFgpHL$?&n(h8&{T;0g zv1RodiD+WuF~`>jZ+Z|;{^w1>a59AjVAe_O<}xg*xFTGA?-ZY*s5jeib&tn%_#SBq z8`z4JS^|7!_r9=jH>@G=7P7|;hfOg<@{=CtMW5bCMuO7~`|9Tt zDUxA#DDzbHif59>q+}FGUf819`ou&#aL%7FX!UxnT}l>>HNaY%4+oC7g>F%%^Hd$? zB1!EPd9-?8`JZ~<2e96!Cu9{m=bV2la%G^MA$v*xc|p%;S% zFEA^J-(~#+IY_L8s>0LJDd^JV*aUx<7JA&8Jz84Jv4?M30M2@!otCx zl+8Kzd!$@uqyR&BrFT4TY+U~B;gPifx0|Q2jj-%P5&NDxw*d@89zyB1V@i}k*V9)f zGYBx-kQrcn{j;H{qYq)&QOTlfMtVLD9*ySkL9zo^=Jz2U=-?Y*fDfr;yUyEQ)P90s zqbM#bJyoN%JpQKG+-yH1ZO&1pT(+}?V$yBDxKOsKO?=s10$0j8jO-oNbS@Z|Umg2R zT`a|fOJCr0yw~JD_4P7iB+qeM5&BZx~W5O)q2$YzOGu$t3^Zdu^|`m49ss6AP932fUc z+twxZXc>rAfNYA>rG;}ueYdr_27U%xYS2(DI^_}CW}9c)*b3;Fr}kfQwOPAOQnU{I z;wLyZ#}g>G&TA`IAl?AcIJA^nxAwbb0h5Ecpp|!q1&S}nGburi4?UEpHmeCna8BJhw zh}(m0?_Z@@v(e2)LlY@^a^r-`-vi(gt*om1N^dqYUXAR1R=qvb^7hl^(a~!p`k|%G zsj?$lJ5Bdz@m(X&!bum_%^mDgqYr9!AaVm4Cz1v~@-&!Mvx}IM@={dzd=`TAhw?CK zWG;gy)QW<`7pPQH47g({|x;-*G6eb1I6hZ-BECWxy{MqfR z+j72x6c5iN?Oy*W0E- zbNBr^bh>|;e>DT!aoo7K1Vaz>waECBoA~Z;c6^vgyC?)3G2u_N#{)XXGe0v)r)kw_ z2KqFFs;!v@HFw0q%dkDYXGqMka$F22AeNi;625<4$FP*4eo(5AGYpK%^+|0t)%w1x za#BqfD|v%1)lsnIXMSm}0!}_}2n&4?Fv58Z85&KgI^KE}1r8wYirkQXe&Pa|aW8m} z2o>Y9ewt@DUY~XUkIY#9N$TThY;3RFX1EhTEBpf#-xuDvfM+lJf@l3S(k4ikyD_`Z zv}d2Q2!~l4Ps7Op%L)uIgLmn`4bdQ@9QKAZYu2In^hew^HLPS|b~#zEHh$E9DBQ(2 zZYJo8-{uN^jKN5fnSIT>sjXG0`S4snQ(xO-3}`z0?_RCJ0%Iq4@M$x4O%c+6ILTwc zepIUZ5yZ7aAO~I}I{HPmpiWmp{q%R7ObvvotbthgO{=;z^Mz9Vh<5iyN%zy}ecm9; zY|)1Od_UM4+rxtoCK;_OIl%w+ z%*~)Wb%;EJ9|Juzz<|8jKc?k7e#j5^tfy_~BRf6TE;A$(K5dQ5ph|DAC)be9W7?0A z7M0$Arpu6uhC{wB8o(3igvju+nY#U9X2CQBG$3WWCRV^HJm4H2VRh(MK#`wl_i;?+ zi7?K4`g^exw2$$pIryKCanKyp!ME42j!-yGUoyan&B{tP!Jn`f_%_IP*O?QqXX5^nprcU?tXirCW-4|O}P^Q*& z%_Ju9)kDGMb=B}tL)In5?;$p~O@HpXaP5s%6PzXUZNEg<3pfqtb=eA1r|6Y`-LYD9>&Z?5R~yZXl4_%PN939aN=22BC^ zRG06=^J-C`3=En4$s$<5;wP-hc$WL|pDg0**x7}On{qlcNvrb}5vDP}(ZHOE)9sKr zy2ncASrt1pjOQk2yh{o>=fnMHA)gNg^(vTHRlfy{sk_?m#op&ia|xer>PqoX*-3i) z28|!DzhIeI6=whv!fJU`TVeWfp|yzl(3(R`YGF=g#RA+hqP| z8-eM+$gz7_loY#Jeeh-br+2`KF1Ln|dXW1Q#83ZL`*$?oehgv5BwAXm7oiXSXSK*Z z&<_7>Ni%bL^owfvL{U-Uoz+17qXTq?De%RIM;XS-4k62YK4s#Y&pWFBd^qqZrtnhg zTqb+=w~hRtb#S%K*W9g3?@0a(X6R3pB7COd2gz1 zV|e&L6i%|X;oknGuAw&a`WhM@9e(CdWse3cl=iqrDWg^Pq9Qp3F8R2d6O$(|)dXDf zbiJ&b0g`LSVn*shcucgbZfT6K)`J56i7@P>@d+0y{#$h@=-X@=$Z0xvFeJR@f49qi zdL^S7BqhztI~XB${F;%1S?dY(8i;(KR_FIAaP^DHRc-4BNRy%ozW_^HXFs%?RE%y zPJV9B_=ZbE%rGw@n_b4KK~kTMu&D+SZ!v;;PQ$fFaxnUpN!2!7AX}v}) z$qt=T$Bpl4eHNSFPGDHPt9&!uK#bGzoMDLpaDhqTA`6wdG<;_C!(h&cAxn_%8ta*d zW62jjGJkr?Lv?>%g83f;YGh{pP?UYEjU;;0MNnC&Y^kn}Bt*rXGFzXERAWMnJv9E4fi1&LkiF%p&kzTjVX@I7UBK!{sf`9Fpf{&fd2oIFb;6AxwM z66W-gA%|408C{jnhqc_??pXkaiNU*p@$e}A9^KuqR)Tu?OFFNqi?Iv$qrAhXM!)50 z#~x)}3r~$1LJ<46^!iRI$xxx<5-W{*#bvN3AV?l8TPv+3!1Qo<~r>?M{b^ykIM(Cxume@(ULz;2b-smqbBmWLk zC*FA(Cr5rRLS&~zJXro(&IJbefDroDzIu!1>8a(5XBfJx^A!4d1{x2~5m?IMzO`{2 zs>hNa6nAwfZ}1_+CqUY3DOPFP$aW$P$f9`yVK2LTkiZ5E%1YD@`zE8NF&cM7`M?xL zUI=}jbI-NR`|pU5R>y8h>XH9Wtlk?k%t6-^ZFMyqt{~6 zgMq2dJMg|LHt^lmuffF+6MwW3Tg{P*X-To)X&&767|I&HM??pE4D<_A7<|9D=HJGmd%)I)^h%4yN z$e=GR&6LoWS}(OnrOc$z+UT_Ou|qTyuF4xm3w|BOnY>6>NN~VUExI^?EC z_;zC+Bv_{@sUM@$yd-u??#&WU;9WwPhtt8nes=(<3?$JZ$v<&r46XcaB$5T!__M9< z=An;n0Egg5=)eviSOg)lubbQ3rL@pKfk-qc)13D_C=*BMX#R^qUcg`mMxDE+7#O7`%-S3-*fIo*9I z^M6*dankjxZ-q44%3m+o?y1DVi?#{S?=eraVLX;4saYfEc$I@grxYHF0*eDDP85e z&1e7LCuRJLS^UusjZJ*v|37nkt4HwBj)>^s639UHFZ=v&gMDD(3;Emsel=Ph_J6z@ z=x$%#07evii@k@X$@4<@oy0+10_}@B)B0a|Fl@vQ)s$A}c$H7vjUO?%WZG_kz1Aw9 zD4WpVrB_QQm$yvD7K*+aMLq_Fq%4ZQfv~qzNi{iWuW+`4S{S3DhXCh;;vxl@2FCA1 zDzNWiWl@I=z`KHCEJnXKF#WQpLGr+_stM6P)94-va)p5w=?bB?e|h<9F^pFI#hG*G zR&kDNQuWI`#O+_C;=NB#@&$#V2Sto;Qp-RJv4=?FK`eR5qF zZH8?KYN~Y_qjkKWt029Jdmr`BH*7EOrXDoG|Aqp<2yeiOb`@yL+HO@3+)(9z)g^8* zhb>HJ9Cn$)?-_q|zSuqw;Ecl&z(Na%1~*LdlC$X_N#q1@EpCFBo1 zSJmqgJ+-BSxPg=&bJFp)uw|DO_umzJ@3X)WzoNnBElF$u8FO+5o<~#XCp0Bu1`u&o zU{aw6_TY93Y%c1Zb;o5$Ek)5xaAac(&@j7KSXpWUx*1R`&`{7YK{<@~lgVMUA0B}#WN1BdSuJaihr8vW zqy1<=Y^{0`B~2PQ3xIzBk3r+0-wT)){e<<4AytE36;M&8St*8QsLRtF51usfGRa$$7`Tl6W9Q;&7a1Q`-kaWvgZcK|$~GGc30^#uA`Lu( z9z1AYgx+Ug(_x7?6zd=vbFe$g;AW%@sXreoUm4zUQ7)s9K9B8v%q?UwnCc&FafKS+ zxoK<-eZWT_-;N;Mn0|SCZUm#YOi%OWMl=9PK4(v!lNGys8;ZkbN;Bj;!ke$LOj?HfH^Qwek)KFC~KSeP0=H2vbuOf z9;y7;`y|nCx#wW(FSF5}{OpRsWO6!aS(KZ2CtP;Lh5h&K3>Pak9?baO(%lm2IY08) zDI&P)mIw&erZpPvK4VCm^M3ADfdmrqR}MT6PONAD^%yJhdsSorWXU2gV&GfZ`O^`> zTQ%w>-@<4=*yZtICpJ{oAInge+sl>AL5WVM;TVwb8HAo1utC5$4ZxeVUkul=WcYFE zSo1ySr0v#y8r(se18h2qc573Yo698+uA>R_tM?ot2ZY^7d)Q5JgN&Ef7YDLWES7BQ zEyW$YZiq6{do_r#(>DSqdM`KAf<7D2iW*E*F^U~r2*xqfUmAXVEN_J$rDG^GO4<5p z6k?TJV&aIF!&-;=4F@`5Y1$MQ`Gxkt2{%za66ETEVYKr5o$vKgk$Un4o{EZ)J@dAo z(^(|=$oqkyBiP!0!CA`(`qwZO?ZtC;f%~sX37F^Mn9H>v2!lBdM^LZv`M6`Db@wR# zMM~dG=fj3^9B)A@I=1k5^SF*=$ft_-lbh|E#d~d2HeC^-L{Ctw3^*Pf=+$KtU@AEi z{7ztDF51oS?Zf@I#3v7~=?Vbf1D?Hj;(rm`)Kn(`do9dnBgrK%DO}?~dvw|W(A>Rq zf^Ni`fziob2jGH5(#T?`^9zFn;E>^gCz$7;x4O@dy>dL;52$2Q>R}e8_Kv{$m>yRj^5D;Z42xCMTsSsJMEU7>t zN+OAZr5ypGERHO~SQV-S0g>up2>qxi6m(p`$P!!-QI>=y1QW^J_W*^qI^Q>cX6BpZ z$IE-?p8M`S_n!T}_pb90B`;@qER%4F2OGA2Jpp-%Xgh0*&^ZV{J=%|u>HWcQr(*BS zXoo#EscE}^p=;%3^`d1MD~D;3(Hn29SuApAQH1tEN?15jxIB23hWlU{UDD_QC?)FY zk-y@`?oadxhZYxou6BPcBfu^(rVLMfna(ibXAk671Z;yX6MAJKkQswW(>I*d zw$>`Yr!D_lLs|9DqRzUePkc-$h;zKpR$Xk>K-Lv)V;N7Lj*up14&IiUsvm;4*TC%d zhQ_RMd=l3Tq%HW=#CH{n`y%`ztWYPkn~;j>Ygfk6~fD{m%ii|klvp+*pXn(9Ij zyg&}^F?S?iGh7G~XGK}{xMM%AE)$Eoj7>QWWjw1)%}YVCItX!3{Jv(aRdU|vzjVMGA~=&YwHjt;+4^35X*vfVN6i}BokZ$hM+-{u1ks4-T{6%58jm+B zEhMdO`uBm)3zess(iODC$t(Y;$IJZ&Vqh8rkU4y~f@-4sN2e1fBS>r8PhPD)o@o^m z9yJv|QQ#4L2(s;c;T2!`#p>ck{QgVvv3RR9@Y4|O@+_@4BeHR?X|}!iXd{Cw^ zKHqu2%kD6{y`b(&xbTj(XKn{RbV?TY*x(pLpZ|rT+(uq^LmDPuf@UK&FE{{|S%3j5 z3669^qX=h0O`D~Ke(Y~!^jt3_=jX1`a&LSMM|qlnc{N2AtSa%~PvqllOKHWlEKy*E zY$jinH9+(N`r=dEMVm<8@$dH-7racTt*1V}*A}SnRUG3f;i}<)aQotV43a_=JMJnE zyiUzzER%Z=_#pFhryZUjj?{)K%n+v#ByP35%|XqkzbU_E(XOX+8;_^t}FMC63H4+3~#>urhj5RIdO5Nw-|CNEi> z{wO@^V8(I&=DxN^3WjUns!@hAnWnyv@9~j#U=bR0?FhrwQP$gWgyB9?rfWSVlU`Cb zOf5meJ~U#vhp1|~hT7@a#f=T?iI-Xx2clXc&o!5HN}?3YYnsivI-*)yriONXx1IF| z&5{j7qXo)QjluL2FRQ_~!H0C6XST_NlO2-3y>je>^TuwX{sRfXbmo?Y`+B&^4VA5g5%uHusUcI&b|9^ zt?$B!b%v8$I#2n1Zq|VgG#3~81&!9NjfwYO#X(y~5YRa$1pmuimlrl9|JXe*YTHJYt99=Ex#7WcV%g|5zBFqe@gn^F| ziu~ArSre6N#mmX4>vhEX>o|%t{DP_&T`%+A#9J)ASt~NCpt@jEFxUkt3rJXvhg4GR zy3f2$@_d8$8rqbnjcs-;8P4T1+@4ETuQi^qqOo-nYO9#>l0{GV+@Pe!8w_vk{;GDA zIWbNVoKRvAld=*K6xJE&_9E@AK#gnRIF{}w?H-hEiUfl4s;g@^O?$ax#l{0rPTDGe zqlPDID=dGcxio5$qne#V5^Rm|Pp_~%us11{*RAFFtJNgA(>6o<+`(|+6oIxhsl)R5!{Y@v~>JMr*Dc}We;%&&RH8o|EZbUJ1BujnvP4FCl^vkPZgX2CO8MJQ1H z4rklB=v{TuH*7-+z+(H`dm~KjTmQ37A;1vK8?jj+{{LTTt1cK8bRAcQ^ z7C(>da9#5|B+d-LSvaThn?9%pK*a$n5m4!X|Ckc&Q8F6SA|Z&XckGSQ#xvGIqEW)s zMB^|xEW|Zk7bcGmrR9AhfY3PN^g%#It8t*BvGsFcpmZ8P@xqQF?;ZMd4oY2b=D@v< zLQx^F*R$6%C2Hyzj^MlOD)y$TQjfV6dh$MiU*~N;VNp8U6{J&wZVp6%%-HjQ5E_M6 zqxRft67utf_s`8O6SsT-U-Uy(LiWzLeTVx>XHdbGLRoh6fE+Fdg(8T9dm{o`Blgqg zmdQfjkN=F}-E`f};_X<%1Y9B$z$Q6v_<2A9RltFCn3d62tiwpv=5xzf8-52ru37Us z1Zh^gIyvl|sXJ0*(d)k^``tuLGyrmSUs=@yyvb~Y40!RNOLQ286Uu(+I6<`!uNAI8$u_1fVEYk@V_An zD)yh%v?}&T^#1>sB~Y=yiv8z#W-9id@y=Av59~HgJ4^pf&d;J^^P=5Xd0V|9@N?a| K-HGQ&Kk`qmE6mpb diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/Workspace.plist b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/Workspace.plist deleted file mode 100644 index e713dbb..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/Workspace.plist +++ /dev/null @@ -1,13 +0,0 @@ - - - - - AppSettings - - appIconPlaceholderGlyphName - calendar - appSettingsVersion - 1 - - - diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/contentInfo.plist b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/contentInfo.plist deleted file mode 100644 index 4ffd5fe..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/contentInfo.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - contentVersion - 1.0.1 - contentIdentifier - com.apple.playgrounds.recognizinggestures - guideVersion - 1.0.0 - - diff --git a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/version.plist b/RepublishTestApp.swiftpm/.swiftpm/playgrounds/version.plist deleted file mode 100644 index 090c480..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/playgrounds/version.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - BuildVersion - 4 - ProductBuildVersion - 5E95 - - diff --git a/RepublishTestApp.swiftpm/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/RepublishTestApp.swiftpm/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/RepublishTestApp.swiftpm/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/RepublishTestApp.swiftpm/App/App.swift b/RepublishTestApp.swiftpm/App/App.swift deleted file mode 100644 index 0a48b60..0000000 --- a/RepublishTestApp.swiftpm/App/App.swift +++ /dev/null @@ -1,11 +0,0 @@ -import SwiftUI - -@main -struct RepublishTestApp: App { - - var body: some Scene { - WindowGroup { - ContentView(viewModel: ViewModel(model: DomainModel())) - } - } -} diff --git a/RepublishTestApp.swiftpm/App/DomainModel.swift b/RepublishTestApp.swiftpm/App/DomainModel.swift deleted file mode 100644 index 0d31e61..0000000 --- a/RepublishTestApp.swiftpm/App/DomainModel.swift +++ /dev/null @@ -1,62 +0,0 @@ -import SwiftUI - -final class DomainModel: ObservableObject { - - // A standard ObservableObject. - - // Updates to `count` makes the object fire a signal that - // consumers can listen to to know when to read — and SwiftUI - // does this by default. - - // However, if you nest this in another ObservableObject, there's - // no inbuilt functionality to make the outer one fire for updates - // in response to this inner one firing. - - // (An ObservableObject is a reference type, so an @Published field - // on the outer object containing this object as an inner one - // isn't actually changing. - - @Published private(set) var count = 0 - - var isEven: Bool { - count % 2 == 0 - } - - var isZero: Bool { - count == 0 - } - - var isNegative: Bool { - count < 0 - } - - var isPositive: Bool { - count > 0 - } - - var isMax: Bool { - count == Int.max - } - - var isMin: Bool { - count == Int.min - } - - var isPrime: Bool { - switch true { - case count < 2: return false - case count < 4: return true - default: - return (2...Int(Double(count).squareRoot())) - .lazy - .filter { [count] div in - count % div == 0 - } - .first == nil - } - } - - func set(count: Int) { - self.count = count - } -} diff --git a/RepublishTestApp.swiftpm/App/ViewModel.swift b/RepublishTestApp.swiftpm/App/ViewModel.swift deleted file mode 100644 index cc6047f..0000000 --- a/RepublishTestApp.swiftpm/App/ViewModel.swift +++ /dev/null @@ -1,61 +0,0 @@ -import Republished -import SwiftUI - -@MainActor -final class ViewModel: ObservableObject { - - init(model: DomainModel) { - _model = .init(wrappedValue: model) - } - - var info: String { - [ - model.isEven ? "even" : nil, - model.isZero ? "zero" : nil, - model.isNegative ? "negative" : nil, - model.isPositive ? "positive" : nil, - model.isMax ? "MAXINT" : nil, - model.isMin ? "MININT" : nil, - model.isPrime ? "prime" : nil - ] - .compactMap { $0 } - .sorted() - .joined(separator: ", ") - } - - var countString: String { - "\(model.count)" - } - - func increment() { - model.set(count: model.count + 1) - } - - func decrement() { - model.set(count: model.count - 1) - } - - func rand() { - model.set(count: Int.random(in: Int.min...Int.max)) - } - - func zero() { - model.set(count: 0) - } - - // Here the @Republished property wrapper is used to hold - // the nested object *instead* of an @Published property wrapper. - // (There are *no* @Published wrappers in this file.) - - // @Republished listens to the inner ObservableObject's - // change notifications and propagates them to the outer one. - - // SwiftUI views can use properties derived from the inner object - // normally — just like how they would use an @Published field. - // - // This outer object could also provide @Binding surfaces into - // the inner object's data. - - @Republished private var model: DomainModel - -} diff --git a/RepublishTestApp.swiftpm/App/Views/CapsuleButton.swift b/RepublishTestApp.swiftpm/App/Views/CapsuleButton.swift deleted file mode 100644 index 297f74e..0000000 --- a/RepublishTestApp.swiftpm/App/Views/CapsuleButton.swift +++ /dev/null @@ -1,34 +0,0 @@ -import SwiftUI - -struct CapsuleButton: View { - - let bg: (c: CGFloat, m: CGFloat, y: CGFloat, k: CGFloat) - let fg: CGFloat - let text: String - let action: () -> Void - - var body: some View { - Button(text) { action() } - .padding(16) - .background( - Color( - CGColor( - genericCMYKCyan: bg.c, - magenta: bg.m, - yellow: bg.y, - black: bg.k, - alpha: 1 - ) - ) - ) - .foregroundColor( - Color( - hue: 0, - saturation: 0, - brightness: fg - ) - ) - .clipShape(Capsule()) - } - -} diff --git a/RepublishTestApp.swiftpm/App/Views/ContentView.swift b/RepublishTestApp.swiftpm/App/Views/ContentView.swift deleted file mode 100644 index bff9d68..0000000 --- a/RepublishTestApp.swiftpm/App/Views/ContentView.swift +++ /dev/null @@ -1,67 +0,0 @@ -import SwiftUI - -// MARK: - ContentView - -struct ContentView: View { - - // Regular direct use of outer ObservableObject - - @StateObject var viewModel: ViewModel - - var body: some View { - ScrollView { - VStack(alignment: .center, spacing: 24) { - Spacer() - Text(viewModel.countString) - .font(.title) - .fontWeight(.bold) - .scaledToFit() - Text(viewModel.info) - .font(.body.monospaced()) - Spacer() - VStack(alignment: .center, spacing: 24) { - Spacer() - CapsuleButton( - bg: (1, 0, 0, 0), - fg: 1, - text: "count += 1" - ) { - viewModel.increment() - } - CapsuleButton( - bg: (0, 1, 0, 0), - fg: 1, - text: "count -= 1" - ) { - viewModel.decrement() - } - CapsuleButton( - bg: (0, 0, 1, 0), - fg: 0, - text: "count = rand()" - ) { - viewModel.rand() - } - CapsuleButton( - bg: (0, 0, 0, 1), - fg: 1, - text: "count = 0" - ) { - viewModel.zero() - } - Spacer() - } - } - .frame(maxWidth: .infinity) - } - .background(.gray.opacity(0.6)) - } -} - -// MARK: - ContentView_Previews - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView(viewModel: ViewModel(model: DomainModel())) - } -} diff --git a/RepublishTestApp.swiftpm/Package.swift b/RepublishTestApp.swiftpm/Package.swift deleted file mode 100644 index 94c38cd..0000000 --- a/RepublishTestApp.swiftpm/Package.swift +++ /dev/null @@ -1,45 +0,0 @@ -// swift-tools-version: 5.6 - -// WARNING: -// This file is automatically generated. -// Do not edit it by hand because the contents will be replaced. - -import AppleProductTypes -import PackageDescription - -let package = Package( - name: "RepublishTestApp", - platforms: [ - .iOS("15.2") - ], - products: [ - .iOSApplication( - name: "RepublishTestApp", - targets: ["App"], - displayVersion: "1.0", - bundleVersion: "1", - appIcon: .placeholder(icon: .calendar), - accentColor: .presetColor(.pink), - supportedDeviceFamilies: [ - .pad, - .phone - ], - supportedInterfaceOrientations: [ - .portrait, - .landscapeRight, - .landscapeLeft, - .portraitUpsideDown(.when(deviceFamilies: [.pad])) - ] - ) - ], - dependencies: [ - .package(path: "..") - ], - targets: [ - .executableTarget( - name: "App", - dependencies: ["Republished"], - path: "App" - ) - ] -) diff --git a/RepublishedExampleApp/RepublishedExampleApp/DomainModel.swift b/RepublishedExampleApp/RepublishedExampleApp/DomainModel.swift index 0d31e61..aa86139 100644 --- a/RepublishedExampleApp/RepublishedExampleApp/DomainModel.swift +++ b/RepublishedExampleApp/RepublishedExampleApp/DomainModel.swift @@ -5,16 +5,16 @@ final class DomainModel: ObservableObject { // A standard ObservableObject. // Updates to `count` makes the object fire a signal that - // consumers can listen to to know when to read — and SwiftUI - // does this by default. + // consumers can listen to to know when to read — and that + // SwiftUI listens to by default. - // However, if you nest this in another ObservableObject, there's + // However, if you nest this in another ObservableObject there's // no inbuilt functionality to make the outer one fire for updates // in response to this inner one firing. - // (An ObservableObject is a reference type, so an @Published field - // on the outer object containing this object as an inner one - // isn't actually changing. + // An ObservableObject is a reference type, so an @Published field + // on the outer object (which contains this object) the field does + // not actually change. @Published private(set) var count = 0 diff --git a/RepublishedExampleApp/RepublishedExampleApp/ViewModel.swift b/RepublishedExampleApp/RepublishedExampleApp/ViewModel.swift index cc6047f..c42a9a9 100644 --- a/RepublishedExampleApp/RepublishedExampleApp/ViewModel.swift +++ b/RepublishedExampleApp/RepublishedExampleApp/ViewModel.swift @@ -4,6 +4,21 @@ import SwiftUI @MainActor final class ViewModel: ObservableObject { + // Here the @Republished property wrapper is used *instead* of + // an @Published property wrapper and hold the nested ObservableObject. + // (Note that there are no @Published wrappers in this file.) + + // @Republished listens to the inner ObservableObject's + // change notifications and propagates them to the outer one. + + // SwiftUI views can use properties here derived from the inner object + // just as they would use an @Published field. + // + // This outer object could also provide @Binding surfaces into + // the inner object's data. + + @Republished private var model: DomainModel + init(model: DomainModel) { _model = .init(wrappedValue: model) } @@ -16,7 +31,7 @@ final class ViewModel: ObservableObject { model.isPositive ? "positive" : nil, model.isMax ? "MAXINT" : nil, model.isMin ? "MININT" : nil, - model.isPrime ? "prime" : nil + model.isPrime ? "prime" : nil, ] .compactMap { $0 } .sorted() @@ -43,19 +58,4 @@ final class ViewModel: ObservableObject { model.set(count: 0) } - // Here the @Republished property wrapper is used to hold - // the nested object *instead* of an @Published property wrapper. - // (There are *no* @Published wrappers in this file.) - - // @Republished listens to the inner ObservableObject's - // change notifications and propagates them to the outer one. - - // SwiftUI views can use properties derived from the inner object - // normally — just like how they would use an @Published field. - // - // This outer object could also provide @Binding surfaces into - // the inner object's data. - - @Republished private var model: DomainModel - } diff --git a/Sources/Republished/Republished.swift b/Sources/Republished/Republished.swift index 1ae5c17..67ad5f4 100644 --- a/Sources/Republished/Republished.swift +++ b/Sources/Republished/Republished.swift @@ -24,7 +24,7 @@ import SwiftUI /// > of inner `ObservableObjects` that it actually accesses. @MainActor @propertyWrapper -public class Republished +public final class Republished where Republishing.ObjectWillChangePublisher == ObservableObjectPublisher { public init(wrappedValue republished: Republishing) { @@ -52,10 +52,9 @@ public class Republished ) -> Republishing where Instance.ObjectWillChangePublisher == ObservableObjectPublisher { let storage = instance[keyPath: storageKeyPath] - let wrapped = storage.republishedSelf - if storage.republishedSelf.cancellable == nil { - storage.republishedSelf.cancellable = wrapped + if storage.cancellable == nil { + storage.cancellable = storage .wrappedValue .objectWillChange .sink { [objectWillChange = instance.objectWillChange] in @@ -63,11 +62,7 @@ public class Republished } } - return wrapped.wrappedValue - } - - var republishedSelf: Republished { - self + return storage.wrappedValue } private var republished: Republishing