From a1d4a9f44defb1cc42a91fdf6bb2d2f63a350d01 Mon Sep 17 00:00:00 2001 From: jahorton Date: Wed, 4 Sep 2019 16:19:43 +0700 Subject: [PATCH] Patches up KMSample2 --- .../KMSample2.xcodeproj/project.pbxproj | 31 ++++++++++++- .../SWKeyboard/KeyboardViewController.swift | 41 +++++++++++++++--- .../SWKeyboard/SWKeyboard.entitlements | 2 +- .../banner-landscape-text.png | Bin 0 -> 10064 bytes .../banner-portrait-text.png | Bin 0 -> 11047 bytes 5 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-landscape-text.png create mode 100644 ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-portrait-text.png diff --git a/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj b/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj index 63b7023557..fcb56d7f9a 100644 --- a/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj +++ b/ios/samples/KMSample2/KMSample2.xcodeproj/project.pbxproj @@ -28,6 +28,11 @@ C05B142E1FD8F45E0082A316 /* XCGLogger.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C05B14281FD8F4510082A316 /* XCGLogger.framework */; }; C05B142F1FD8F45E0082A316 /* XCGLogger.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C05B14281FD8F4510082A316 /* XCGLogger.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; C05B14311FD8F45E0082A316 /* Zip.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C05B14261FD8F4510082A316 /* Zip.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + CEBEFB94231FB4E000F8F67C /* banner-portrait-text.png in Resources */ = {isa = PBXBuildFile; fileRef = CEBEFB92231FB4DF00F8F67C /* banner-portrait-text.png */; }; + CEBEFB95231FB4E000F8F67C /* banner-landscape-text.png in Resources */ = {isa = PBXBuildFile; fileRef = CEBEFB93231FB4DF00F8F67C /* banner-landscape-text.png */; }; + CEBEFB98231FB6BD00F8F67C /* Reachability.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBEFB8D231F9FEE00F8F67C /* Reachability.framework */; }; + CEBEFB99231FB6BE00F8F67C /* Reachability.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEBEFB8D231F9FEE00F8F67C /* Reachability.framework */; }; + CEBEFB9B231FB7DE00F8F67C /* Reachability.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEBEFB8D231F9FEE00F8F67C /* Reachability.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,6 +63,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + CEBEFB9B231FB7DE00F8F67C /* Reachability.framework in Embed Frameworks */, C05B14311FD8F45E0082A316 /* Zip.framework in Embed Frameworks */, C05B142D1FD8F45E0082A316 /* ObjcExceptionBridging.framework in Embed Frameworks */, C01AB5A11F834706009B37D3 /* KeymanEngine.framework in Embed Frameworks */, @@ -87,6 +93,9 @@ C05B14261FD8F4510082A316 /* Zip.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Zip.framework; path = ../../Carthage/Build/iOS/Zip.framework; sourceTree = ""; }; C05B14271FD8F4510082A316 /* ObjcExceptionBridging.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ObjcExceptionBridging.framework; path = ../../Carthage/Build/iOS/ObjcExceptionBridging.framework; sourceTree = ""; }; C05B14281FD8F4510082A316 /* XCGLogger.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCGLogger.framework; path = ../../Carthage/Build/iOS/XCGLogger.framework; sourceTree = ""; }; + CEBEFB8D231F9FEE00F8F67C /* Reachability.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Reachability.framework; path = ../../Carthage/Build/iOS/Reachability.framework; sourceTree = ""; }; + CEBEFB92231FB4DF00F8F67C /* banner-portrait-text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "banner-portrait-text.png"; sourceTree = ""; }; + CEBEFB93231FB4DF00F8F67C /* banner-landscape-text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "banner-landscape-text.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -96,6 +105,7 @@ files = ( C01AB5A01F834706009B37D3 /* KeymanEngine.framework in Frameworks */, C05B142C1FD8F45E0082A316 /* ObjcExceptionBridging.framework in Frameworks */, + CEBEFB98231FB6BD00F8F67C /* Reachability.framework in Frameworks */, C05B142E1FD8F45E0082A316 /* XCGLogger.framework in Frameworks */, C059FCB51FD923E900BD1A64 /* Zip.framework in Frameworks */, ); @@ -105,6 +115,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CEBEFB99231FB6BE00F8F67C /* Reachability.framework in Frameworks */, C01AB59F1F8346FC009B37D3 /* KeymanEngine.framework in Frameworks */, C059FCB21FD9231D00BD1A64 /* ObjcExceptionBridging.framework in Frameworks */, C059FCB31FD9231D00BD1A64 /* XCGLogger.framework in Frameworks */, @@ -160,6 +171,7 @@ 98ABFD601AD3A087005534F0 /* Frameworks */ = { isa = PBXGroup; children = ( + CEBEFB8D231F9FEE00F8F67C /* Reachability.framework */, C05B14271FD8F4510082A316 /* ObjcExceptionBridging.framework */, C05B14281FD8F4510082A316 /* XCGLogger.framework */, C05B14261FD8F4510082A316 /* Zip.framework */, @@ -188,6 +200,7 @@ 98ABFD8D1AD3A232005534F0 /* SWKeyboard */ = { isa = PBXGroup; children = ( + CEBEFB91231FB49A00F8F67C /* Sample Banner Images */, 98ABFDA41AD3A363005534F0 /* SWKeyboard.entitlements */, C045148C1F85E33300D88416 /* KeyboardViewController.swift */, 98ABFD8E1AD3A232005534F0 /* Supporting Files */, @@ -203,6 +216,15 @@ name = "Supporting Files"; sourceTree = ""; }; + CEBEFB91231FB49A00F8F67C /* Sample Banner Images */ = { + isa = PBXGroup; + children = ( + CEBEFB93231FB4DF00F8F67C /* banner-landscape-text.png */, + CEBEFB92231FB4DF00F8F67C /* banner-portrait-text.png */, + ); + path = "Sample Banner Images"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -256,7 +278,6 @@ TargetAttributes = { 98ABFD361AD3A047005534F0 = { CreatedOnToolsVersion = 6.2; - DevelopmentTeam = N4M8L6CCXN; LastSwiftMigration = 0900; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -266,7 +287,6 @@ }; 98ABFD8B1AD3A232005534F0 = { CreatedOnToolsVersion = 6.2; - DevelopmentTeam = N4M8L6CCXN; LastSwiftMigration = 0900; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -281,6 +301,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -312,6 +333,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + CEBEFB95231FB4E000F8F67C /* banner-landscape-text.png in Resources */, + CEBEFB94231FB4E000F8F67C /* banner-portrait-text.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -514,6 +537,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = KMSample2/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = ""; @@ -535,6 +559,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = KMSample2/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = ""; @@ -558,6 +583,7 @@ "$(inherited)", ); INFOPLIST_FILE = SWKeyboard/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.sil.Keyman.ios.Sample2.SystemKeyboard; @@ -579,6 +605,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; INFOPLIST_FILE = SWKeyboard/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = org.sil.Keyman.ios.Sample2.SystemKeyboard; diff --git a/ios/samples/KMSample2/SWKeyboard/KeyboardViewController.swift b/ios/samples/KMSample2/SWKeyboard/KeyboardViewController.swift index 1d182480e7..cdc09356e6 100644 --- a/ios/samples/KMSample2/SWKeyboard/KeyboardViewController.swift +++ b/ios/samples/KMSample2/SWKeyboard/KeyboardViewController.swift @@ -16,7 +16,7 @@ class KeyboardViewController: InputViewController { KeymanEngine.log.logAppDetails() // Replace with your application group id - Manager.applicationGroupIdentifier = "group.KMSample" + Manager.applicationGroupIdentifier = "group.horton.kmtesting" super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } @@ -25,14 +25,41 @@ class KeyboardViewController: InputViewController { fatalError("init(coder:) has not been implemented") } + override func updateViewConstraints() { + super.updateViewConstraints() + + if view.frame.size.width == 0 || self.view.frame.size.height == 0 { + return + } + + setupTopBarImage(isPortrait: InputViewController.isPortrait) + } + override func viewDidLoad() { super.viewDidLoad() + setupTopBarImage(isPortrait: InputViewController.isPortrait) + } - topBarImageView?.backgroundColor = UIColor(red: 1.0, green: 96.0 / 255.0, blue: 0.0, alpha: 1.0) - let label = UILabel(frame: CGRect.zero) - label.text = " \(Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName")!)" - label.sizeToFit() - label.textColor = UIColor.white - topBarImageView?.addSubview(label) + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + setupTopBarImage(isPortrait: UIDevice.current.orientation.isPortrait) + } + + func getTopBarImage(isPortrait: Bool) -> String? { + if isPortrait { + return Bundle.main.path(forResource: "banner-portrait-text", ofType: "png") + } else { + return Bundle.main.path(forResource: "banner-landscape-text", ofType: "png") + } + } + + func setupTopBarImage(isPortrait: Bool) { + let imgPath = getTopBarImage(isPortrait: isPortrait) + guard let path = imgPath else { + log.error("No image specified for the image banner!") + return + } + + self.setBannerImage(to: path) } } diff --git a/ios/samples/KMSample2/SWKeyboard/SWKeyboard.entitlements b/ios/samples/KMSample2/SWKeyboard/SWKeyboard.entitlements index a9dd542f32..3f5c7844ad 100644 --- a/ios/samples/KMSample2/SWKeyboard/SWKeyboard.entitlements +++ b/ios/samples/KMSample2/SWKeyboard/SWKeyboard.entitlements @@ -4,7 +4,7 @@ com.apple.security.application-groups - group.KMSample + group.horton.kmtesting diff --git a/ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-landscape-text.png b/ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-landscape-text.png new file mode 100644 index 0000000000000000000000000000000000000000..264e1b1afc80e3fe910f597c821d3d1c6f95c264 GIT binary patch literal 10064 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 literal 0 HcmV?d00001 diff --git a/ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-portrait-text.png b/ios/samples/KMSample2/SWKeyboard/Sample Banner Images/banner-portrait-text.png new file mode 100644 index 0000000000000000000000000000000000000000..acd69c62af395659ce332871fcff81562cc4e8e9 GIT binary patch literal 11047 zcmd6NXH?Tm*Ds)ef`E#25EUUR2qL`&JSqqgP>>=m6fsIm06~z1fT$D+h%}|e21to9 zbm=`JB}(t1haN&G38CERIi7Rwm-oKwKJQxh=0n!Zn*Yq~*=6>g{o9c@ObmFqM7da4 zSa=MtT`^-}VGCil%?@xd{~JHJ%CoTS7rB4=@(uUP2A828P#<%clZ&f?tCy?KeHSx> zKUi4QQ78-hd*T+yfEB(FsnZ?i9?DN2eAMNU=83mdep^(I92rsdN-|U(JT-e~W4Ys1 zONY8r#m-yPt2f|^^Qp%gYf3{-oLT1^0v0JGa!C(%pEv_7qJ`a z>oT00PR^mk>DNE$Li1^N~9umUSiDqSc@E(N>(K?!3+M4d>ZXMZHFa zM`hzKeGR_AVATD)Q*sks5$qP`ZV}0cW80c&`iB^bpL@Y?jNKM;XQ$ser}~Y&!NJH* zyJ*k4drzsJ4cUa(Xy6mFlO01=MVd5zvk{d060N^|V8Y!KQ6fGzl$08GM3>{m@MsD) z>j?RZUH%YfZZ-M?ra0Rcn83WVvk$ z1@FV~G|yNiP0y>Ov<3xU+1{!QytaYxL2E3{!Dp#YlFoB(XC^0v2{eX9Am8d=+8|Br z;)ab5?-Owooi;?uzkJVYt1xNrnKerQ9THOOmIMhdY=xS=*}GEs+$RKkneAvhZTR5dRYS;kp0Z73*l8<#@73e+&QDiK@{x2mlMXzaq$@Dm`D`( z?Oh=;Qmyu?X3^{Ry6XCb-LGH4Vf3<&qH}k`fsX|XM7Lw|1-o1+c~9+J_;rKj)Yx=o zL{1zX2qQRLG~9^uzQ}qiFiP8aBVN3K{|H$^r{P`xQrR($%wNiDBQ*fo3Y+faF4{rqJ1EjPNQ zhzaUS{#w{tc#&Kc0C8rgxvCxU4bhJ1K-Af@#c8#sPgal1!z6vd%^Pl1Q5#~AV4!d* zWG=})-{_>2hrn?`pL*5tn@$&30f!E_{Bg5CGzqi75JW3v=t%IoNX}$4?5gE0StA)Z zwl(8j3yWKGu!OS`mQZ8$>P!65r!U`$PEftIS!P9jdn(a%+U)*eb1ifJ99;J$zVN~< z|2Lj&jBSaY9Ipbi`A(Nn1l#Q{O|J!>c7cbW&Uj~0tm?U>l=<0+kHXKsUXQtF9zN)4 zBgRf1U5i~yy;#A=Z!2$*#yC`4txH*C$WO!+u_TFygyN;VgbCj`N7>b>PX-Hy>LlW> z!MVq}Hy1Z*wk`$)?{v=%H~Qw2&W9AMX{FZ?$q#ygdV6^+5EPR24H|B-&yJhS!XndR zc;(Wq0M@1SgP-kt{IWI?FEdV`4%It)pi$f1@u(vQU(v|vxt>!led(6sM2k<*j$`Yc;Wy;hzt#c5)vNLU zhiR-|Fmp;nvqf}3EKWbGAt{l~Opogt>)G$uLMeNfwvm>&#uIWrdE4cpVJnxcdjb?4 ztXvKQ4?Lf|MfX$T7!UiLOL4CJ)O-SdSP-AHy5M%Gp3})Xqj`}KwPj}IY#c9}b#V2?S!ZMFw$mY8~n$*`meWLMFrbHwAh9g+CEW zfg0T`cuv6bdGW;yc4#QV=Ob$jpUJSTdcRW{khnE$519-!w28DW1-C9Se_X z!Fqib4P|dINX;!9cZ9V_|2!-Ff}C)0TcmeGODK2v&*M?+K0DGB0nI!BPI;!Pj5W4% zHas53rwOa2iI>5coaI-OJjDG>(${$y<}+4*^1rpn$R%@8k#sFV&-J)+55M1HQ@*Ju z8)Dpj)au_X3uT)muoN8qF?BhPUq~iG@)~Ae%MV&ruHl}8&NB+HexV_a?rx0!Q8mBJ z`h6rq^G{to!Om;KieWjP7W^&gFZE=~p!P_1EsVrcpn23va~}AKWG*#Rn^TYC<527U zxT=E|jpNSdQUeMPTfhId33t09pLTAT<_L2^og-3nj(maT!Y0G&P%61_Lbm=?{eLx4 zd?kh`s&h9j$EpV9{x;)JSzM1`vtdm;EMjrx-{*^A+o=d?Flwxgt)FNAFl*kr5)l{1 z4&aomydwqJ>Mj_LXnHg@HD-{p`Ky~2LDxJE$c`cVeiZQiXfg3JOgdQ{zVZ^4#+>RS zCAbh8A0`<%8vCnzYGxrIElsnU@Yb^Jtz{&LH)*)H-{s4r1mf;I(jVmm$rmP-eRgEe@>R0;ortp!QM$)`o|e9M_=wxNZ&)#c=hOiH7-aF%$ev7{$tt{5s!ITrsH z6_!7#zu+%!6<~_vbW~pFzr`Ug@Da#);nS`Dp2Bym&m?t40+=i+ z!wGt$_i-K~`sVW;pOlvL%D*~Hs%3516kiC#2egEXxgXiofYq+(;J3yU9ahJiZ5o-R zU4RpC!2iZ{sIj|&tr98eM$>Nvz8>|{_>SGSxb-jN3&;MvTzpXZZV8r(5j+z&05(1m z=G>CpgmEQ({Z0{T3&c*?!$E**M3;G+#?;|=g1|q!m(%aHoHRKPm#aK#;&C`!^T*4}X*M+L0O_>; z6TE)!q{G#VS8yvv>bOhd^H)H;6cbGE$I@PZ%Lnkh@R*WzH@UE|cG;F&b; zPDb*lYuu2B$6sQ<4i+MjTdPueUEojUfT}XcLw3-(lR&`c7oiVeu=jn*o#Yw@s>qA6 zQC;@0dob>OElneYk}?_fbUZ(#_UUD&UsJCxja$GCBME_^F3x28G{LqEi5CU#c~8g{ zj<+8Ty@q7#Zc&Wq_Ao)Ydyf!q?X(e+1j1xnyZc0pDX%viD%I!Gt1yl`&U6ypr((#S zQ;*~}6~IMhRo_JG=Q68;nlE=dio=B)DOD)D*xNNv@Q;|@!~FTLZ50=iSFHJ%tGFG( zlW{I%UuP?E_aJI8zN<06{g|QI*k?G$N}rY8OP~+k;W z9j{Q+oqV{k1?e30wC#-Uy=IeS^-*4Z_ldHv4PCJrB$R%u8fDN^Pt!xF`Y;ZhWT_b^ z@mVz6&!Y@DHpe8#XtIKG=Xz_PUC*2=6#`yNTJ}wLPqv1%oq2UQgT$B|f*vPM554ZcP9W^;j9Xya2|MXs$!d`1=t`FWFPqJm zs&Z?Q=KN5$8)wV`_GUmxe#)V856gtyvc`pgr-~-8RAj3tMM_&Q zf>gDWgZB)GAO^VQ>gACt?4l`>HYu6ehxTzx>C-T25K;&B*=_m+vZ=q6EZ3#K(wJL= zSGF;YrhTLT4*xeEEe8`q)wbEA(~`2(G453OmuiX-X}f>%OiC4FBYW=4t_morC>E=6 zmg-L)O3rAB|B>2<1rY>gGM|&$4290yB_tiMIWgcy+Lx-9iS~d4Jx7au;RiP9#%@}o zfRgOhICaKG&C5lqJubjolhIF~OMt^WKtUT*DPr*>%}Y6ktko5Z*fZLDkiH^KusK5u zX4ly+-zMhYk&c9G0%Gs`E0ZTi6V?M{$fCRBN~Qw357lbk-4!a0VQlMoi@SAG#)3ef zVw-~P?U`+#k>0irLX5+Xphc3xpP{Dtn_Aj_7#D|_a-%6a*s>tK5{C$EpU1U;_iI)g zACep>kj7{$5?6UVTbEa#JuOB1d2Nk=u-EV;9;vVtW44;LuVHg}vA|)2!WN?1D8&~+ zi6#2`rX&Htl6Jw~nz##>iYDE57c+*sh`QU3shc37PuIxpvgqer_~FH`T3)(q@5!Z5 z1U}T`@j4$g5OOG+NUwX?Sr6Brz{=O0PEP_9XKoZ1yLaNLQMtzRMxOM8JEb9g9*C1m z-{Skt3R|e*Rt|}ubOH?zdf|Zy&?VybV)+_Q+eyJhPgaTjpU9OT!#wE=i|3sO@;w}- z)S4-X^FBt_GwC+{4;<$pl0op@AdDYA*6(evwK8I6RI8ItHJuHZY_?o2KTk^Y9o}C1 zA&WIk9-xL^E~2iUUeE;xdfLF-hSzk-6?u^D=jSrw8Huh!(*mWtJjV_};)jXl_guFw zRbzH2d0_M);T#)>R?t@TS~j!{xHF1UD*~8~xCE?1Zr^WbeXruH|~31X=%ns?_^ zF?D|Nx<>ih-rhl{wsN$f(%mH%epaq1M4?58Zq@SEgK0wm1LjGz)ZCk#wjvoWZMuCq z^^X+e-`B$UYgzg8CR}+YtQ-k=fst67u&~u83T^61~?^NH9iMke8>R ziB>)K0x=;t+gW1(@}4s>v#NuT5h%?#`XTj-|F6bMsB0 z&L(=q>weW49!cbGd`0Kdm*$v}pw6cNxoeU&8$3;reLLPtC3VjCXOaeG>8~5fKzaa! z+AouU*4f;?Q|gm9I1(7&8k-TQd3%(Q{?JKN!!+8tu=H&|hrrO9v**Uz9KAPSkK^#F z|FlIX^F}0&hB!e^4HgC_Nv0xXD%w5KXiFQ`BA(OkrCxKRY{*s-NG7v#TI^%wBJ-(zEMj?E$k(rjJlE$?1^FE;zYX!vUm zRjU|Tw%oEtE5XdQvGS){f0OxR!|wGCeO4f-Yp;9{Fb9<^Q!q_i* zVk8w{q^t#5Nvgd0_CbC$GUI!ObP>*FDBkLfZkn3s@GHQBrKELSWo{u)&DQMYIsVd- zPK0)w|IY6EI`p~gkXFEuY`R31=jxrjmzj6Ptb!+>K{GKWtXU1En_IzaQSL@-xPuS_ z`Jpc!5ZUGpM~C}Ye`o|=WPlxfJwFuf=$5TFuVDba{e_5582|C?#@c!`WOc5> z3zYh>+;^Wn&VYJ;xN|>jGDgBBUpv@h#3Gf-@uFjMvn1a$r|JbkcDuMzsw{gt?X^Hf z*ybWR{e^iAKr&lNb(wYGS01PTg-}<@Xdo3Iy?QtMWNU=XU&$87KYkw7d|M?b#$o9h>HxWxVW_4e*Bp+vynQn?mmRf6)GdY+r!H|6r=%uPRU<+c%> z0WCQ=5#Q&KyuD-++qb@R0xJ*mx&7Kh6vv&N9m+btd*#+P^+ZjiY7bYFC|mxk*GjhJR$ zrTcq%ECs&pX;(p>tZ|*xwexqK&N}D={#t6{+2@r*e>gT6<#2zWerf|`?%3;8C?he$ zFQ`^B=MR(W-cF2bkXQubu1%y%KaZ)-k3AhfW&0NZRA%I?3%z9JS$d#PGS z;ZCEsp7WoL#Y)OIZa7p0%{K{k2@$tCs!1yoZuUK5dJ~?`6&ussg2(Xk-b=UZ=ufS> z2DCzVzB$ZoU{TX*Ij_h=sjI$mB`wk=kPn0kkadfDpa)?&AIV#Xl zyxS01TJXOa;>Qe@4T4ZJ7WUmO5?6~r{jvCA+dsz4y{4~^q;HmOS=qzARI*Np!R*?9 z&R5T&!-Mni5Goy6JwO3u8Vd)r-Pz6+C}ZrTUexTfqF+z<%sqg~{R9pzOn5Gs0OjAj zzLM7K@6n1q7UP7o@pm|hd9aIi^6yv0tRV*Srgjx2AzfX=w2^?bz3klSC#(1V=(YZ+ zY4|?*swJ=0Iq*g`Jx>n`L>TTi%m}RcaK@!Z>&0 zL+7fI-}zcQ!Z-*{WeW;3|9dTsRfcEG5gv8<;DF3|v4@#w>avjtX* zOy)nFdGF&~xOob#TDn)3Y)VAf4rcHrTmG4v_?Z>qMX^nCUc&DU-&VveL<#qaPEIwd z!wX?Pn~_l{mW|%1J?czpwr<&U^F}IA{c)4!7Y~7Xp$^-W(RhGIW~nWlN-^l#sH*5n zq}!Kfy4Wv%c17~|8`h)&&XK>8ht8`YD|$0BWvg=DYZ*=y`T>#m%^;*b&w)g~`@9%s zR;6#bs7YBEq(e)-T}(o^l#ooT+D@B%9;mXsu^m;3z*u#9)6?;i74v>`JakX-%#BjM zPxC+C7O~wY@eSJQ(RMv2jkHtn)nRh_=aZ{(iBZ zz4fMYzuHxym4MMFj!?p@o9eP&KNej&!Ig9Efo3>eomBK(q1r>a4udZV4zkVDgE2h> zl3J*BVPAG)io}LTUI^cmZ7O8izKN`{S6_6|R4^~4iapFS<-3TW)xq<3Aw2SJ=#wR# z^XRJ3$$I`RVl4%}JG}AwRoX4gnL*)_Z<{3O_FR#Qsk|B~(R>JQHkj``49&NXucp&z z8j*mR1?4IiYCO1M@y*;q(iKZ1vLjmRiXL?K(M5s2w_T& zB4$Y_WY)BmiXllaTU~5op?PrR+N4-lxI#@i+2X#x*t$fZR7=eRhoKTVG^_AX*HCFD z=4t!6ObeBY^r}IBmed)OLV>5{svQV1^n#CpL6&ro71V>+DyF*_vd}lRuOKgF1X!Bb zt6RY+xkI+|Qd0|_vw1k(LYDHk1b3|WZN095ni8fXr)p}}zHOU~QP`()aZB{Cro+MJ zjFKQeJc`J#py4;Hxvl56l~%sR3N>Cx0}KT2*j9A!jvAIKV5@(pb#g4<>>^jrmYo`^ zTp?1wAi*8b?az^8bo#X2idgxMEVQ0TWUbB~v%L0q-tpB@cAI4Qa##8udJ@^SJd?dpf<0$)s4Q;V=!AZTG+(>t zw3=_5323#^)6(I-4H_V@k*#wx$}jw*Mv7WWT9O)Kv9&91UBMHiwfSVI0hd)n7Xw-b zS+pT_E=LnH`P%)$W|kRA;3S~Wl30c7?Dl+L^{eH8)&HK3k{sE~2fVvC@`gVGduH)g31nfJ_yWpb zv0+v%;DyX87&x~$Z|q+glUigl&3;erZ;N;n$3_>atv`2D?uZbl6!1!JM>nC?j3MgScnUDF($?!;mlH~M4>|HYEuulm7SEo|QH^EQm-9Kr zOYr!AIFUD8%;$+K-(~igR`LO$PK|_g2_u7mtu+6~=YG(;%mh3=&h)>1qo7Nfn)sZj z%qlnk?#(|zuyts|mPl<~^6va4P$_b$iddY-e0yj5iVa;p_iXKp7IZlWVu0zFcPwtu3+-?pZ3gdH(kw8C z=fA9KR)!CIr%ZKwFThYltR8>+e3@Us-fUIge(7QS{CwYdwcw7-&zmbvvC8wMIUdun zQ?{1+>-*-l52C?aW(B_QU-^#YEPpIz7ivjLgpN#tX`XpSdfd&BW(994PDv22%I70^ zH8BlZ_p03%Yy~$J;vy9TRrOiPnf|giKIYQGiq{t>dQ6R(xBAXC)Zt(5i$SSZ4}7i5 zP9k-Nhs8>Bii>%}3**8}&l58FelDo4IzhY3MEh+rK$5(`BypHWBc)xR7g(&F3}ik@ zG{*WPCR0)3aJN8tggVXIrxy1=K|ttx2uqdv-=H`%A3tXCCd85j%nmL9PE4Kqp5oos z&w}Y7n^V*ZWg5bX-yfNUW3=S3*#Y<;G--=w=Z1MrIjr)_HHDm0JI0|-$WPCv6BBv~ zV8cXQ|L1bvR#}vC(-t$Wy(WF;_mh-aj1ct%i$Qr#0O_S;{XYJnA;I=v@ zD3v_nEv~M3+&xftW-KUX9Yj&*O%skSu9Wos2~lMRh;y1m<84Nn&!r5P9W(8ieSl_{ z^JKg@6R-+CdmJCiKZ#4)bm6TgS=an$+nR*G7pOgx@lXDUiRVvq-D6)lv-fzNB4ZjF z_XC$$vz)4XF1Xe00Xy!QX-v&Po%BzPX4}alf85tur>v2}EC|t!MybF}@;Q^$ff|jJ za2)O#A##1}D4tmYvU@?bcSQqt+-`z4br>(%+$;(N^oD`Nf7XgL^jkNO8Xv(TC*v=R zBZbA>X=&Dc^4>p-O88t{c+mU{|Iua&))*GSD>wh~mM_>03fWRvj<*v(0aO1rq7&>~ zT(g3(OUIsmsMTZF#0I;ge6~RlOu97fWYTEG`uNKscHVcF+ntPRduR{|?%BalPTcZ2!04)#IuZ{RyP!jobD@(oV29 z2cz6j9U^)7JmSX=s6!^Pq;^c-q;dT9)8|j0GwW2q`{e)ht1ui4rx-(auay?mI1&yK zloym&Wnu$7Wq&%_`lkA(W_6}-O}3u8BA#)(%(|>!7{949cJ!C${0|_r4!*$fx|TP}@vmaW935tFaMP!57r#;?e2 zb>DN&F*eDONsG9O7B!YDZaLfYgdaC+{ys8ORU