pax_global_header00006660000000000000000000000064147614345120014521gustar00rootroot0000000000000052 comment=fa6bbc49545bf5b9acd1aeb8c0f6e90ff8b9d890 clog-1.7.0/000077500000000000000000000000001476143451200124525ustar00rootroot00000000000000clog-1.7.0/.chainguard/000077500000000000000000000000001476143451200146355ustar00rootroot00000000000000clog-1.7.0/.chainguard/source.yaml000066400000000000000000000003221476143451200170160ustar00rootroot00000000000000# Copyright 2023 Chainguard, Inc. # SPDX-License-Identifier: Apache-2.0 spec: authorities: - keyless: {} - key: # Allow commits signed by GitHub. kms: https://github.com/web-flow.gpg clog-1.7.0/.github/000077500000000000000000000000001476143451200140125ustar00rootroot00000000000000clog-1.7.0/.github/dependabot.yml000066400000000000000000000006171476143451200166460ustar00rootroot00000000000000# Copyright 2024 Chainguard, Inc. # SPDX-License-Identifier: Apache-2.0 version: 2 updates: - package-ecosystem: gomod directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 10 groups: all: update-types: - "minor" - "patch" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 10 clog-1.7.0/.github/workflows/000077500000000000000000000000001476143451200160475ustar00rootroot00000000000000clog-1.7.0/.github/workflows/go.yml000066400000000000000000000011621476143451200171770ustar00rootroot00000000000000# This workflow will build a golang project # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go name: Go on: push: branches: [ "main" ] pull_request: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Go uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version-file: './go.mod' - name: Build run: go build -v ./... - name: Test run: go test -v ./... clog-1.7.0/.gitignore000066400000000000000000000007361476143451200144500ustar00rootroot00000000000000# If you prefer the allow list template instead of the deny list, see community template: # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore # # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out # Dependency directories (remove the comment below to include it) # vendor/ # Go workspace file go.work clog-1.7.0/LICENSE000066400000000000000000000261351476143451200134660ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. clog-1.7.0/README.md000066400000000000000000000063521476143451200137370ustar00rootroot00000000000000# 👞 clog [![Go Reference](https://pkg.go.dev/badge/github.com/chainguard-dev/clog.svg)](https://pkg.go.dev/github.com/chainguard-dev/clog) Context-aware [`slog`](https://pkg.go.dev/log/slog) `slog` was added in Go 1.21, so using this requires Go 1.21 or later. ## Usage ### Context Logger The context Logger can be used to use Loggers from the context. This is sometimes preferred over the [Context Handler](#context-handler), since this can make it easier to use different loggers in different contexts (e.g. testing). This approach is heavily inspired by [`knative.dev/pkg/logging`](https://pkg.go.dev/knative.dev/pkg/logging), but with [zero dependencies outside the standard library](https://github.com/chainguard-dev/clog/blob/main/go.mod) (compare with [`pkg/logging`'s deps](https://pkg.go.dev/knative.dev/pkg/logging?tab=imports)). ```go package main import ( "context" "log/slog" "github.com/chainguard-dev/clog" ) func main() { // One-time setup log := clog.New(slog.Default().Handler()).With("a", "b") ctx := clog.WithLogger(context.Background(), log) f(ctx) } func f(ctx context.Context) { // Grab logger from context and use. log := clog.FromContext(ctx) log.Info("in f") // Add logging context and pass on. ctx = clog.WithLogger(ctx, log.With("f", "hello")) g(ctx) } func g(ctx context.Context) { // Grab logger from context and use. log := clog.FromContext(ctx) log.Info("in g") // Package level context loggers are also aware clog.ErrorContext(ctx, "asdf") } ``` ```sh $ go run . 2009/11/10 23:00:00 INFO in f a=b 2009/11/10 23:00:00 INFO in g a=b f=hello 2009/11/10 23:00:00 ERROR asdf a=b f=hello ``` #### Testing The `slogtest` package provides utilities to make it easy to create loggers that will use the native testing logging. ```go func TestFoo(t *testing.T) { ctx := slogtest.TestContextWithLogger(t) for _, tc := range []string{"a", "b"} { t.Run(tc, func(t *testing.T) { clog.FromContext(ctx).Infof("hello world") }) } } ``` ```sh $ go test -v ./examples/logger === RUN TestLog === RUN TestLog/a === NAME TestLog slogtest.go:20: time=2023-12-12T18:42:53.020-05:00 level=INFO msg="hello world" === RUN TestLog/b === NAME TestLog slogtest.go:20: time=2023-12-12T18:42:53.020-05:00 level=INFO msg="hello world" --- PASS: TestLog (0.00s) --- PASS: TestLog/a (0.00s) --- PASS: TestLog/b (0.00s) PASS ok github.com/chainguard-dev/clog/examples/logger ``` ### Context Handler The context Handler can be used to insert values from the context. ```go func init() { slog.SetDefault(slog.New(clog.NewHandler(slog.NewTextHandler(os.Stdout, nil)))) } func main() { ctx := context.Background() ctx = clog.WithValues(ctx, "foo", "bar") // Use slog package directly slog.InfoContext(ctx, "hello world", slog.Bool("baz", true)) // glog / zap style (note: can't pass additional attributes) clog.ErrorContextf(ctx, "hello %s", "world") } ``` ```sh $ go run . time=2009-11-10T23:00:00.000Z level=INFO msg="hello world" baz=true foo=bar time=2009-11-10T23:00:00.000Z level=ERROR msg="hello world" foo=bar ``` ### Google Cloud Platform support This package also provides a GCP-optimized JSON handler for structured logging and trace attribution. See [`./gcp/README.md`](./gcp/README.md) for details. clog-1.7.0/example_test.go000066400000000000000000000031271476143451200154760ustar00rootroot00000000000000package clog_test import ( "context" "log/slog" "os" "github.com/chainguard-dev/clog" "github.com/chainguard-dev/clog/slogtest" ) func ExampleHandler() { log := slog.New(clog.NewHandler(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ // Remove time for repeatable results ReplaceAttr: slogtest.RemoveTime, }))) ctx := context.Background() ctx = clog.WithValues(ctx, "foo", "bar") log.InfoContext(ctx, "hello world", slog.Bool("baz", true)) // Output: // level=INFO msg="hello world" baz=true foo=bar } func ExampleLogger() { log := clog.NewLogger(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ // Remove time for repeatable results ReplaceAttr: slogtest.RemoveTime, }))) log = log.With("a", "b") ctx := clog.WithLogger(context.Background(), log) // Grab logger from context and use // Note: this is a formatter aware method, not an slog.Attr method. clog.FromContext(ctx).With("foo", "bar").Infof("hello %s", "world") // Package level context loggers are also aware clog.ErrorContext(ctx, "asdf", slog.Bool("baz", true)) // Output: // level=INFO msg="hello world" a=b foo=bar // level=ERROR msg=asdf a=b baz=true } func ExampleFromContext_preserveContext() { log := clog.NewLogger(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ // Remove time for repeatable results ReplaceAttr: slogtest.RemoveTime, }))).With("foo", "bar") ctx := clog.WithLogger(context.Background(), log) // Previous context values are preserved when using FromContext clog.FromContext(ctx).Info("hello world") // Output: // level=INFO msg="hello world" foo=bar } clog-1.7.0/examples/000077500000000000000000000000001476143451200142705ustar00rootroot00000000000000clog-1.7.0/examples/handler/000077500000000000000000000000001476143451200157055ustar00rootroot00000000000000clog-1.7.0/examples/handler/main.go000066400000000000000000000007211476143451200171600ustar00rootroot00000000000000package main import ( "context" "log/slog" "os" "github.com/chainguard-dev/clog" ) func init() { slog.SetDefault(slog.New(clog.NewHandler(slog.NewTextHandler(os.Stdout, nil)))) } func main() { ctx := context.Background() ctx = clog.WithValues(ctx, "foo", "bar") // Use slog package directly slog.InfoContext(ctx, "hello world", slog.Bool("baz", true)) // glog / zap style (note: can't pass additional attributes) clog.Errorf("hello %s", "world") } clog-1.7.0/examples/logger/000077500000000000000000000000001476143451200155475ustar00rootroot00000000000000clog-1.7.0/examples/logger/main.go000066400000000000000000000014051476143451200170220ustar00rootroot00000000000000package main import ( "context" "flag" "log/slog" "os" "github.com/chainguard-dev/clog" "github.com/chainguard-dev/clog/slag" ) func main() { var level slag.Level flag.Var(&level, "log-level", "log level") flag.Parse() slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: &level}))) log := clog.NewLogger(slog.Default()).With("a", "b") ctx := clog.WithLogger(context.Background(), log) // Grab logger from context and use clog.FromContext(ctx).With("foo", "bar").Debugf("hello debug world") clog.FromContext(ctx).With("info", true).Infof("hello info world") clog.FromContext(ctx).With("warn", 42).Warnf("hello warn world") // Package level context loggers are also aware clog.ErrorContext(ctx, "hello error world") } clog-1.7.0/examples/logger/main_test.go000066400000000000000000000004751476143451200200670ustar00rootroot00000000000000package main import ( "testing" "github.com/chainguard-dev/clog" "github.com/chainguard-dev/clog/slogtest" ) func TestFoo(t *testing.T) { ctx := slogtest.TestContextWithLogger(t) for _, tc := range []string{"a", "b"} { t.Run(tc, func(t *testing.T) { clog.FromContext(ctx).Infof("hello world") }) } } clog-1.7.0/gcp/000077500000000000000000000000001476143451200132235ustar00rootroot00000000000000clog-1.7.0/gcp/README.md000066400000000000000000000055051476143451200145070ustar00rootroot00000000000000# `clog/gcp`: structured logging for Google Cloud using [`slog`](https://pkg.go.dev/log/slog) Contrary to the [documented "standard" approach for logging](https://cloud.google.com/logging/docs/setup/go), this doesn't use any third-party logging package for logging. Instead, it relies on Google Cloud's support for ingesting structured logs by simply printing JSON to stderr. This method of emitting structured logs is supported by: - [Cloud Run](https://cloud.google.com/run/docs/logging#using-json) - [Kubernetes Engine](https://cloud.google.com/logging/docs/structured-logging#special-payload-fields) - [Cloud Functions](https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs) - [App Engine](https://cloud.google.com/logging/docs/structured-logging#special-payload-fields) (standard and flexible) - and in other products, using the [Cloud Logging agent](https://cloud.google.com/logging/docs/agent/logging) and [Ops agent](https://cloud.google.com/logging/docs/agent/ops-agent). ## Basic Usage To use this, underscore-import `gcp/init`, which will configure `slog` to use the GCP-optimized JSON handler for all log messages: Then when you use `slog`, all log messages will be output in JSON format to standard error, which is automatically ingested by Cloud Logging. ```go import _ "github.com/chainguard-dev/clog/gcp/init" ... http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { slog.InfoContext(r.Context(), "my message", "mycount", 42, "mystring", "myvalue", ) }) ``` This logs the message, with the additional structured logging fields in Cloud Logging:
## Correlating Logs with Requests You can also use this to correlate log lines with the request that generated them, by associating the log message with the request's trace context header. ```go import "github.com/chainguard-dev/clog/gcp" ... http.Handle("/", gcp.WithCloudTraceContext(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.InfoContext(r.Context(), "my message", "mycount", 42, "mystring", "myvalue", ) }))) ``` This logs the message, associated with the request's trace, in Cloud Logging:
Other logs with the same `trace` attribute are generated by the same incoming request. See https://cloud.google.com/trace/docs/trace-log-integration for more information. ## Critical Logging Cloud Logging supports a **CRITICAL** logging level, which doesn't map cleanly to `slog`'s built-in levels. To log at this level: ```go slog.Log(ctx, gcp.LevelCritical, "I have a bad feeling about this...") ``` See `./cmd/example` for a deployable example. --- This repo is forked from https://github.com/remko/cloudrun-slog, which originated this idea and implementation. clog-1.7.0/gcp/basic.png000066400000000000000000003114611476143451200150200ustar00rootroot00000000000000PNG  IHDRܧ >iCCPICC ProfileHWXS[@hK "5ZIPb ;6tUDJ#Eł.ʛu_|?gsܙ{v# q!4:)2@-1cb",C˻WZE/@+C|+@S ER +!^(Yr\%rWfǂ %G%ӋYPCb'!O @o~$@R}F:Yp|.((q%?O2 Vlqht0o7s'K }Œh5! !F)ْD=j-`xp !EE(LA0bBЩBvz/+l6')| bSe~Kr |BS-NHE ) bU r6cYQC6bI4~ >V)Sؗ ۜ-`G)Py~6.G? v/d& R"= :Dq8Ey!R bׂxX<.H>)*Iljpb@`@@X3$}}N 8@ 8(ɲ!ƃb'D|P0<.@E:ʯ S[$ @AF %ǐ;V.7Vi 2 F2䑮6dI "CD[ŽxgCnOxB"<$\#tnM2tC`E.2~n5Ce\7+g7ȲqKBIo3i(NdK'?[b X;v;;5aQ)^]ek[,\#'+dSSy_! XDĂB:~t8"}}7ܼ?9>88x;v}p7lӡ fD\$pjpc`l|; hR}6\b0sA)(jl[N8 ΀ ^~|FP =0_$@T$BCʑzd RC9 <@z'CUP-BG x4 %Zݍ6' 5}`St0Sc`,,K2116 +*jk ֍aq"N\x"'z|'ހWx?@% ^6!EB(%TNýCxG$uDS9 z bqD"I>hTH*%#&']&>()+(9++) J*v)ST3YlI"GyimEr3EbM$Pr(s)k)uӔ7fʞʱ9k*U~QESN2NEDe [*oT՟F-.POQS?TU٪<٪ U_,՘jԊ*]TS'[9+՛oh4FkDkk,إqN&IJ3H9_s)G4fNcѸymӴ-[+G\kVVvTJ:['Og~:tt|Euu]O_ߨ735bA##Fq533nհp(HdQq*cƽ&4_*&t&=F754 5n14lfmhVbVovϜb04_ejoabi1â%ْamƲ򽕵UFgzlbZ6T?66Wm \ P;7lJ~}HHϑ‘#o880j88F886:e1*mQ999ms3Zst-_;9s+P]]f4rwntFst[]^aQqňa,f$xx<ݫk_޹޻m#3n_ofn?S?_CsvL[fs7eS8P{k&D X>~YpVpmp[7Fl.63-\%<>|}qDK$2ne01DWFߋs8[$nt܌xZ]&II$&%KIz";eT̔ Ԧ4RZRAcW6t㧎?7`Bބ&r&H''J‰Ts2U\w ϟ?\,'keVo_vEv%X/x)}nt|f0W6xI]"{Q{ՓHB-#!"yP[TYaJҔS5 vLhߦӹ[gΘ;L-YZgϞ?gNȜs)ss^Ty-ϙ藐_jKUKť7x/ش_(XعeѺExe˝+ʿ,.>_:$sIR ]_| +\ٰlWpشF{mڦu떭>{ʀ*êEU76\迱nѦM6 6ڪb+qk'ےf_wwtVQSpZVRۻ{K{49mש/ J>ߗZ:D;Tր4LkonnJmjknmn9t#G*j]zrlNN:ubS)Ŷu?}LSg}9u<| n~wP{gEM Screenshot 1010 694 2 144/1 144/1 1 V@IDATxxTE{#]z(UDEQzPAADi{' ! o]nvfM6;}*|TTI wHHHHHHbőhqdҥKԩS$Ī$@$@$@$@$@$@$3Y1s轫TVM ,(K.ޛn$@$@$@$@$@$@$E^͛7˃[}eHHHHHHH 4BҥKnt2oH$@$@$@$@$@$@QEF D;^HHHHHH@ y'O{QGrވHHHHHH "@9r;"-0K4"\.{ ]TR._IHHHHHH DzFv\$K"P#c$@$@$@$@$@$@@<:asNڵT^]'N,3gΔ #f> L J<@w=S7n :Tʗ/o @!`jnIZuU buyΜ9%mڴ/ϗK%      M=U M"ܧ[ VɓOsHHHHHHb (s7,2ѹ$IX<|PvHHHHHHH J -!ZlǴviY      m&qC$-O$@$@$@$@$@$@n#z6N.* ,Fϟ_>w\IHHHHHH ܒ>q[GI޽{~zn 43 &#FHpptI֭[&, K#䁰^z2k,ɓ'8p}Tye      pƵMxY      V/Ռ|HHHHHHH ($      wwY^HHHHHH@B PyI      p ywuIHHHHHH ($      wwY^HHHHHH@B PyI      p ywuIHHHHHH ($      wwY^HHHHHH@B PyI      p ywuIHHHHHH ($      wwY^7ɤId޼yQvMW.t3Lw@O_ qr/:GOμ]\!ߡOƕ  t =о'OH~2uTI"'4c0j(}իW-Z[8뫅|ť}h!PҦJ*% f Jb%g/lo)%^-,nu j>p0M$;œ>uܻ0q'^;(rM{OJ#Jfu HxVE-;{!+6oӧꤖV J)$<[lPcg%KRpFyII8Ax,瞨i I,٘{ ]D 0]ှ/Z{Jv&g.ݖSHS<_;][k(W4_:iZa;L?Qm{Yٴ HitNgmqݯ ڣOdz7] xg!{&pD}1b,{&$#~m{Pvx9'S϶`~xlEBBKmomw򍻊b~[R&O,/zF.^~]vL;6=~-'6 ct\;s}Yj%_~Ԫ3Lx3|:|]A\YSjNʷruM3}8VD0Bߓ$@$@$@ Pbu3sΕ;w"0#G~B~ٲe/Çk׮?~+IguaaHdI±۟RB葚${KiX{?aMjU C,-l{-"Ԭ\doVz_}G}@%,>iwHȃJ$f,GlR$K$zU}A{ .4/*^l*|0>Ec,]q\z*. gtݱYD<`ϵeۿWa.X|Des#:fUd'5uySʃjSEF=гyogd[ϙͪn!ߪ^Yv@N=.6ޑru "@D:UwJB] ǻ1}x_cKr^dj`'oA (b͆^# Իg؎HP>"=G֐wI1UŇ'x(%VՃImGOĠU/+']IHH'@!Ϛ5kИ^s$s$WX! =eʔ8qb-J7n(̞=|9m6޽Ș1k׮\~bl!#gΜTRpvv n*6m5j}80[ϓ]pA a|h;QO>jn<3:y@ٽ{js ZCij YZC@h}nάXW}Ifh0f!!v!1KH#U] w*woA%L_`[Բ6r>s7NA ={e<#G^{vSŐcµz"Nc1b9 Q""-u$4aC V~ MnhcEH;$.GlEj KH<<ىs)Cۖ9D?Q92p>ؖڝT$Z"\}s ?⨽U0bsBFYvdsq'n`92z{ӏ "\Om )$ fn>oox]pOFO&;o$x湲 ׳('6HHH b(l:aZza7}3gdfA,wY !֭W'CF|(0+Ge̘1_Y޽{`뭷[oA6z ި_v)=%A   vϧ_֞}Cs#$Lhxxǚ熈G9dz7 !ڑ Y%JH`lܹs:Aòg.SLEyzbvvg]#*OرB̓3~,h-\ës8~J_lJ}ԹF|8|3g0z[B-ldpKgspxlvhWis̸ 3{b*jXxY;c*\B-f6Uq_޼^Nfm aj+đP?!vvpFr9{p*ÒzC{VM5\rT%BGcOC,]f,ܠ!q}BޞATBL*JD* c iw[8NoW|dFD  dwdG>\"qv\zp+0Ph2vGOC1<~VWtZ*t'"LeJi m  R0bQ}>^=`̗sOFE?Ikͷ6 @4p^FsbyT^t\\$y:͚5B#_Yfam۶~] ,n.m#a[$pm0i_Jm}BjɱjMseFYw̴kTВ ! z;t @&iҮ#zW6nk>~vCJoTvuԇeJoQnCA6yԥ &!i+TS+{ * Ě?vZG>@ ~YjA{Aߐ9~Z ?QgpӶu;" OO xC-L >Xќ=ݨ7| HW8ʳprT=Ĉ0Cg}raԃ?N@2ٛe>E Z%K<U\W̶1xRX&F={K !͡ rl:A%\I7j^w3a    PȻ.B51 ìِpw[y t7$C;[C|fc0Pby+7mmd*~7v_T0Ʋi&)U?F3Ǎ{ czXY>S:A/٫!1{DXIc%v-+o1老 Gz >lbȞ!Sp_ꔌK0cZF= `FYMUGG]xgm[D_>4|TGx,mSt Ye7uOCKUxd?iČ}n* ωM,vFdA3 Lww $aPif!j`aI$D^7IHH z PG/ow-[:눉"ߴiS8Ϙ=G|۷9sk/Y yfnCCWzKey@7fz0 ۘՃAqQ.kv^Dzy&1 яÌ*gLL% wPp89kp0=sSLR^ gH%23 Xc)\ѣP5nh?D<ܥVĊvExz" pˆ(1U ͼ j8DgG$=A";}ǵnóL|ƥCW(@9G6zEҳbɕw 2nZ e4ҍI,l))v~F$@$@$37fKS|2#?hYfK}w!sg!}ƬqĎʛ3 K=s!l|pOLR:  Ku3FVq{J gkFҵ6YQK3| ~{=G4g s=f/;ܷ?[e7>Yq2~ئ쬹m HgC[fH]1dR0Ydx:\ _%-4[! ps5 @˥<+OXQ폽j$O[qSv~zO1G*c0v)#@ٳמUⸯ>nw \+ VO D1sX1̌3) ExE /̙  D9 (G ZJv!?jUuf߱_jUA 6 zH5Q7Jwz0sCl?<ڡC[<1V3JR#8ݍYLŘͅb8] :kTlQVK@7:u3ZYͬ uY;*9xa۰J,hLٶGwI;6){eu_W1{lnm{E/f{{S`sK_CИe,fSW,0 p[3(3Ad㘽]"}5? n5v4/VtV=(c{:{1=1AdG1CoG0yM[0$Xa>}r &0@ =D!߫a<پC ywZQ& ;y!@oq$@$@$@C tX=zŻ!v0a^V\$ @Dg7DiĬ-Amzh(C2[?wF-jje}f{X2ɣ x[ChG=*Jy,׋ ߵv9}$ p3̆^+v_lW̆xm#.|# Eb1!f=6nMv1@@ơeFB;70%uɿsc8| fcI}|Ph쀩=8V2uY3z2uM}½;Hjg66 b` s=bj`Ռ6֒ur]d1X>jBZϯg HnɈFa;, ddž[=Ce:G0[m$kU۹Q&2G)jBp 6D$f 鱗C\htyњSZ xU22A?JHu*F^rT<:ep)߯C^V월AB5lWGE%7n4R#v5h婰t{F|#~ہ_G+j@Y#,Gk6ZҠ?5Hz/Gjy?e_ke71讼Chw+IW@ *%"k3K\1<5_ ƽ\uI'mzV3]CʹHHH P;ڵRkGְV:օ1ĉ>m#10<0耵FYuK>Daӣƍ … Aҥw믿nTu 6aE7@鵹pF:c$ղ\ez}oㅑ.E+Y(V~S_LH(gf͘BϞCfGe >B k# pdȞoOȟSb5G/]?5h~Qio6.ݜ!|i06|5{_D9>oeU|!Xo>iW(Ch|%`A+5LXCƩM{/2k%掝(p} ޅԚXt* 9u&~T\Lٮ5=wT {cD n0  TNH,F+oUbaՠ#Id<;'39anz'"wRMyH|fCnJ&{vOXug\QA"gaDzn{q_VSP'q} \YRiqo\Ls $DHGBT xt\-5ąHH#  y1       p@:}[$      p+XHHHHHHb| mIHHHHHHPc      !./?[` 5% NF8˒ x8{bHHHHHHHLBL$@$@$@$@$@$@$(=y$@$@$@$@$@$@$`&@!om      p<      076 x8 y@l PțipHHHHHH<? 6HHHHHHwܱqIw\$ o/=    g_Ƨ> Zѱ$@$@$@$@$@$@/# /ǏKHHKgvHHHH2ex[8sa.XhQW^tF_uɓ'4ݻ駟ʆ dذaҪU+iB$@$@$@$@$: y'=yD>/|W?~rf|nK̙`ҠAI}Z&MAȯ^Z/1B[o% >\֭- NN>7Yl.YΌ3:Y3_c B<}T;V*M4bŊpBm7m$~e#n:9xt]:t,M$@$@$@$@$(|<2d_U6obɒ%eɒ%C7nܐ+Vzxd˖Mʖ-k9]iҤ q>k֬TR;E$@$@$@$@/3OJ*RrnE]t!CȣGojV.]$H>nC(,mڴO$@$@$@$@$8#pvCxbË'?r̛7O'@8.5kִe3:tHDҨQ#)S˾}t>bg9p$NXi+.8|q~r;ԩKRpѿutQ0o̙YF iܸ":vƅ_.f͒Ǐ͛7%{RZ5iݺh3?|PfϞ-w}D"> 8kO %Jlw0!G+ t u  PO2Ek킟3gN]""iӦzI̶rJ8p@|NZ&M*v풙3gJ~O>g}=dH:u@`bWvܩcy>cF=2ڶm+ӧYA7ʌ3t\{…-K$>v6ˉgAAA2~x׈`ezk׮}\r &ժUZYH¸FwyGf00 pPvUɝ;3\*c>H KYHHHHHs ĸ?5Pz\'ygK%? V!K0{fGvQ-dɢg{ (:uJ@${W;׃wpd' 1{Nl[>fvCģ裏t{ ^>Ce~mX`Eٰ̽T,PHo Ijժ8yfW[v/82c8< 1 {9) $KLwЙ @ 1 ǷJgm.YWrcr7! ۈAH5_|g!QϘ[>n8=KnmcVpƌ9"h * ?3}=zXJC*TH"q?|x;vL }-=XTƻYf Cģ=UǠ fkp!#??m4= bs7% *}m5IHHHH^L gDC;33o1)a0E_xu|lm۶mvٞ|X{$/3Q0o޼Ʀ/Z75g< 1{qhרQnAȢ>fSLGndX~я%0]vm},2?\afcƌ- 0` r}öWTI'[:ĝ;wN{t=J0𛳺Zp5aۆhǧ}zB,wA$ @"cmOlMHd6|p+q 7|S^ի-U4n]MBBro/r!7m s>om+qːpYy\Vь\eg$YģMc$. mX!o' z;'m!    !\lrhp%Gfs[C66YZ޽cZe`DR6KĔDŽ[70~mpOvۇ8k0~^q*Jv m߾*.pM`$sf۱c K3ư3u#Z+x'i$@$@$@$@$@qǹ֛o#._~'NH/2#AiӦ:nذfT1c-tx 4jHgGl<3gt;!9`0ݵkW=z>l BݸqConݺՊ֩72޻}0dKu,3GC۰_ǎu;wJҥ3 _d)M6gD/j#ϓ x>|ta[9sfЭUVZ?^$oHWL0;2zxdJС%A\Jp ~z#WnnIX Vdpa}͛7[>a|6N="믿EL/.2  ݻw+sr0(C}lٜrÌD}._IHHHH<@<%Z*ZqIyz!A+VLϼb=QD6Xڑ˾9c~~~$?֦D0c =twZDa&0˽3 гxFP $q1Ԯ];wފ׎A/D[ Gwqwh^Lz"^|pStFr'\m'E|6 VTTݻXuHZh1t5gϞ:y r+C߫W/c˗밈B E#xG     ('@!)a.| .Fr7UxXȼ ߠArAm۶|h$@$@$@$@$@qcγdOH^28K$@$@$@0F "a$@$@$@$@$@$@$@!wHHHHHHb XT      ;@$@$@$@$@$@$@|,zXl* P       XDB>=,6HHHHHH( @,"@!J$@$@$@$@$@$@|HHHHHHH EM%       y$@$@$@$@$@$@$$EmeSI Vp_ə%e8ZfE%eĶcdI?ٲﲴOT6,GNIv$~x1&ޔHHHH(4VO<~۷eԩ"E .{LwPҦJ z|/@Ɖ<7!W?UC˂y x yOx 1؆sJpp曒$Ij*y\zU (yş> mQ'MiMu[{&Yo&{g*y)i6 hR%W_}%nݒ-Z]cwyD<^g:^ ώL"yY?K1sRRxۿb{HHHc@IDATHb|piZ|y;$K,nk L[vG^s7_\ @TjzٳKժUe̙riذmV&L ooo0`Ν[`رzfcǎRdI3g:tHjԨ!7*s 5k=zT_'gΜRreiӦ$Jd=;h y==|pz >6c 9q_RN-K,]vٳg%}2rHKPwĉr5ڐ6m0q?1b8p@~W9}~jդSN _{yy>nZ*ٲe{SuҠAQiKy%{&/}Y|c?鋎˷wےr쬿͗^>\NkyQRzZ*?#Jf }k׆#bwID dhϊvǏ{ΓV:^dtܻ`dړUZͯiUŝɿk~29}rqeފ rΓNj.*䴺y'oB'H өw4    nx .":iҤZ BϞ=['#Ghq|r2a#>vDp$Ǐ"K.Vm&ݻw7cƌk׮+Vhq`I&ΦMÇz޺uď|5BG(L@;1p`65p|͚5rqsw<ڍ v=ZRL)'|ƍX}:g?JѢE'Oqݽ{Fp0UKK(س*k#7B>雂C?%Cr-·Lٮ\^#>=~XpX_w*C׿{Ov&+ e2_UaY|&Xr)TqA~[~\~5I=ݪbw 0ha+^mK$AnIKҤL"sBkTH[Q&UWBZ+`lHHHH<@ؿ=Yk;cUvHZ_ #V\)?6l:g|Cx4`V C Zfìg}&Ȍ ܹS?sQUT zrX.:O|ܵl|Ym};ʚߐ-Hu8rRTŠc̋M3ux\qH/Jy4R z NجU_V6-lZͦLzLY\;nr[ ]s6R{6 ߛTx_     Hs\np+VL)SFcPPg*A…͛Ɵ?^ϟ_0 _D 4G7B-Z$͛7 l]nxs0N &Mի[ڌΝ;}Л .@h>` {-8ch'|"~,XЙ*n/wzXg߹LBKȠ?_Kw `I "fLy 5xU5;.ʽE)7u|vY Kfv ̓H q.:^(o6.>Kݳ)/?xUL]p(:{ @2/dn1 ֭[7fk7ycǴk83IJr%ɓ'3/3̙3xiӦwn_^ 7o^}ҥKV aߪU+`Blxv\3KvW%krP>C=~]JV8X6 fo>Z譶 6dO-#߫l3{ >U$cʶji]?[|%OTZ 1v$@$@$@$@$ G]:Dfk֬)6lK ϟ1m }ҧO<n*T$õf]ӘiG a&3$teiv^^ܖd{fNP۫q؍ASW(E?~*˷?Vn a0q,OxXKxv+ x yzh b! B aodoٲE~~zA9MqX=.\e6 [@c^e\]:7:oB9#Q?WLլwG6< >2x:Dkcy3    p YRJRxq~߾}r9IYB߳gOid?eZ~Q8qNqc.t0>sQYJ\L^%G;$كO&ζjJVgBވyJ$Q/kk>NsHHHHb=qFxí v=[j` xd7 3p ̜Q6 c!,qFmaC`>~}_r}?gm׀Y*q9v>T|+ԌxT`>*{? h$@$@$@$@$ =0^˸!NI 2k7 &X%Ct;dgFB9@r~쭷My>xg01j(ywҀڇFw嗿H!w^t,ikm;~T! X ߅?yb 7*]0wZ]kն V5YVu/Gܴ*u~`nU! k>wUǶyfȚ4i"񇞑G":$?rv:ouه  L$IDlJF":T =p,UT2ydllIhРCYfRV-ɘ1l޼Y۱c^e0qDgyl͋j%ͬ6:dҜPvĿ۳Urw \[~R,^nK:=`>Q#K7X.pRq_TRc9EkO!R8O:QVn9/SuVp&ye qai 5-ʅ5sW/eYζ>IHHHH P{ө[%Ke:l%DeƌZ1joٲX… 2uTKv|$ɫQ㹐rXى?~<],jy8e…`y#,7QP!=ryW씈]=folfm{uG/Uf9s i#Ɉ>f1_IN6lzW"߰|Ќ1|9rò|fCf{}>ֺն͗N:^m.neUNfSƳ4IB)S8XF^R$@$@$@$@$SkP[z]iGθ!4[c"<{}```X{~Kz5dǚ2${OM8!$gEsx 8b=G$A$@$@$@$/_9shxXt\ (jU~R^=ZF;4"E~ @Tyww{ >H|N+<>aw0/[܃uHHHHH PGi'k׮ɀtNT} "|RD .!C1eXA*Pz>9u!@ϙ&.w}#    .>UHHHHHH #     (SeHHHHHH, 8h1      HB>.>UHHHHHH #     (SeHHHHHH, 8h1      HB>.>UHHHHHH #     (SeHHHHHH, 8h1      H a\DM`q)Y մ|NN%OϕZZ/( f[IHHHHH y{Tx#ܺuK/^,ҥ͛{D5虛2f.y<+Gf/;*ԿY* p)Ӿ׮K !@! x ___=z,Xc|]zY/SʥJ"]IHHHHHB1܈kn޼)wukf,>"GK2g#*[D<T(E(Wo>O g4h{={vZ̜9S\" 6mʄ - ܹs뻎;VJޱcG)Yݖ̙3G:$5jԐƍ[ k_zU+uԑ^{ͪy… kK%QFRLs1}={.[o9?bw 6LRHϣ?Wu/_.K.ׯKΜ9ERn]k]xQLݾ}[}$qĚKb̧d@nA)U(kXP{5u=~"oܑKÜ//؅kwœ     GBH[pNZf͚%I&Bj@>}ZxI$Iܹ#SN ӂ ?~]t:ݻ-[6-_?}tIQ\Rcoܵkxׯ`0Cy{B~ٲeO>"1:.]={fʔI3@ц?Pݸ Ǐ7i3ʵkش}ArHV7dvy䩌[E.\/&/{wFsOaA      gZWq}vѣ ݻ'Og9f+[7|S!<{u9?'Ym]RLL0e_?oq}iͼa #@!oJ,7al0\%J{B9p4\!BokӇlg-۴i#]vG3ʷ~+ $г}#=ޠA-q.|.:n85\)S?,5mTѣ(JF)Tu 0kZ>.%\*ݩ ҨPHHHHHHPdb6rnݴ%$$rcǎYl׮]r۶mZ:,1߷o_o@|{+VԂ/_6D;mڴ&MYkzltr*}es2C:݈ޕ2$@$@$@$@$@$ B-/5kI0żsb Ν;7<Ϟ!oauqpO<*vΞ=k|TD":y"@osY:6), 6e}MRH,?+B9ͼ. @"@!aw-Bb<!v[?duΘ[d7>ў"c~-ɒ&*U%ȍt[_A*ޘ j@&LZGHm>m     x!T/,&PR%\۷O0Aݽ{w3pGY1W\ڭ^B=0cÇơ{Ƴ;XuvW%{U+kJY= 2W};G2uHm)S8y 3(䝡e0+򈕇{;;ud B~ƍvgΜzpoI$K!^D m|eРAbT,U˚K[):jݑܕ2GEi\7HHHHHHIwTt0RrGַE6{GV@yZ-[,'w+W 2c 6a7|m$ăh߰a7iAv >k޼Nuݑٛ7_#H׬Y3=Ѷm[}OC#^Xozt҂1eC!OJTI2hRJ2tqޖ IHHHH P[𘽺uj!˖-nﯗ,!      %@!ﱏ #      (2      Xh0      KB>,!      %@!ﱏ #      (2      Xh0      KB>,!      %@!ﱏ #      (2      Xh0      KB>,!8xO; 7o^O>}a] p_3Ի;}1@_~G 8"@! @8U<{ SH-rT?yB\k]{$@$@$@$@$`CBwIOͼ'OR7H <F!O4QxxHHHHB/ @a^BEW.\U^VFWgIBe}'o   pX.yܽ^7edw虎Wb$@$@$@$ XtƂdž&8Pg.UV3gʕ+WaÆҶm[0a>|Xe;w0]v̙3G:$O<%JHfͤH"anܸ!f͒Gʭ[$gΜRreiӦ$Jdϕ:ׯ_9~@(ժU֭[KHHH̞=[#>>>RP!ڵ?^֭[':ubŊ]|j*ӧnӂ ^(wE A+}ɂ$]v/5h6ɞK**>^\ҦAAz~Mɝ5XVro3ʭZ!)Q ]qBWW/]U[E^-WfdƳڢdSmFB~ARH&fiI|ɖWΖJJ$mU 6ƠǚdrZv%ϛ#kaɟ+mqoN9u{5簔@"EkOK6':'Xݧ\ҩYQY(zUQZD9J,Mjwa$@$@$@$@6)PN/UEEN:U..ʛ7NZxI /,K,r}%dJ``.\X/__b|#K? UUU|՛NM);W7Vm:&o>Sҕ ~\92'T*bōvFBAظtX.ݐ 2Qd\_(?$im!!]jugJ&U;T7RN 0lC';$X%rKO0IMzB/{RCn'*o>*o-oVƃ2IߧKXO@8sEV~M[p8 HHHH k}$}P'O,˖-_%KYj˝;m|ؽ{nZŋ'#FuWX!#G 2|(VB ֭[ҿYr̚5K/_.+W]vInݬUB/JV$İad2e=Ƨ~Zv)G?лwo)RD[N+P$vx y饗7ߔ޾;?߸y[_C^OrtIed++k ٱ;}Y{S)Pt<(GOnzZ/]4SJ,{8·HEk[Wi%v弲bī2mY\(붝CyLJӶk%NXG=SmYCe9GykJ|ƴId__(92%0oG_7J<,~yY&XK\[ϬO[*V/ъ擕#^9S x' S;F$@$@$@$@n PwKrbK(a]{9F:wPoL2  8V{:ްWZ5lWԩ|XH'Oj6m,}I:uJƌ'&/OXCX;oW^_J\{*y> (^Njv(gW(ֵ*J_`H^e>n@XJɨήz(kWn)'tkޣpNKn O華T\*4SD )ς=χm,R6~׳?kɗV&;^C>oT*um2C8Vovܕds/ ?Mo(K|K$@$@$@$@~"72+ĉl<͛RfFIGܼU$Imy?~v73f('NRpL0 \]ȑ#f~ݼy>C !Mow@9x578-QgܾSm ba!7}A7njbG)-cb`crۇ+;V1!#4hZqۻTż:sVSM4}٤_11eӲ`P)BsxO2NL^/7}D]`oIHHHHLvH, x(Ɨ/_ *ZDv?Ny@*UJ'XNzgo,:h?3g}СCm\̦{ yT q6>el~}P!o,m# 2`&<;D⒊ f*( *ܼUrñ*/@)h&)W<ˬc\hF x~iڏ'U+9bבIOJL THNϭm,G$@$@$@$@N;QmHhuNƒoŋeԨQ2o<7{l]f͚W_y%a`ҤI-[6t/smV:XcR8qb濈pp~l+H&7bv_S.^G1/1MbI^҇&=KUxծ6?D,rtvkg%, U M׮xvaI\C&yO>\vS72n%Png9    p"թ6Ao1|ӮȔo2[& ė.]Z/7]7c;)Xb`}D98RGT 8O$CuX߭HX\zt_)eroTh@Kߕy4gC߭` EZX {^ǽۏ ?_h^*:^$񵇂3pfʣjYf~E6~'E>[dzI<!6    {H!˹!c; Kҥo` {N[F?|oR,w}6읓`y9Ȓ%K[ʇr}?}~O)U ުQ0Zĭc=xrfte|*׮u V{fRzZaUy݌}$C]q8I;=[ L@8|%    @ P\a&Ms>}ڣěׯ__[w`MCJϞ=swHH uYpzbE|, … @9:x4o\gԷg韫=K2+Wuz#ٲ92Gِ}}2nH e]FVxab )Y`);AN{;0uTxz^&|!iba1h2E`i*+|oJKZΨzq٬B*DtحҥIYiy|U*͟N\by \*JHM&${OJ@F|!lHgW9,;wEYpؘN 04ťo/ˑR># o2W    @ER1B $EGWX 7nXZu~7]gZ6dbԩc6@O^ &;vu &0qa h <և/Q=ZЯZJ<[w^3gD <P}&WhQXJEoKEa?nXO}JBסWkc9&0 OE\2א2MyL^GKa)Ji/UCOWMwG}7K{ @VV!EeuzOUۂ&x^奻uyHJ HHHH%rpOV*t*BΞ=+zi.yw ;SLa:֌:޹eϭp(Q"=iӦIcသ_„ ʚ9Uz}t3;# Qk8zA+$FD.%RKrzdU9nwBe?Kbέ9qInXK.)T#^D |6b.  ܇?އ J?2{#I"ύ c={.֭ Aɛ7oM m<<JhgJD/*?K8\DdQ#c}_< | ӏIBsE_mq; "@En /X@>C]vߴit]#5>(' ڱSKiZqWV0UpG}cⵇU(:":^?IHHHHF6 \poٲ]֣8qo!:uZΣI?R^ ԭ_j^u⟣*y2[U'I m{\=u_tk}tg$@$@$@$}Gg#kĬ3@py#~YZr5}{Jgϫ,iS% y?`( GG_&H"@Ey$@$@$@$`]wl+ @%@E>~5 x"̈́[HHHHHHH "cHHHHHH Pf-$@$@$@$@$@$@$c P_ F$@$@$@$@$@$@{3      د#      oT余p XTcWÁ 7*LHHHHHHb,*1HHHHHHHyo&a[]&!!!aHHHHHHp1cH%M6rpJr D xQMFrmꫯȑ#2bĈy 5 }CpԩSK W_˗ps D:*.)SF={,B$@$@$@$@$@$@G iҤѥ<4 @"mܸqu+W("$@$@$@$@$@$@$yȻ`ky$ @t"~֬YuSN("$@$@$@$@$@$@$yȻ`)S&)\޽[֬Y @"k=$eʔoJdƌ.k y,)"PCBBdȑ2b5YHHHHHHG ^𚺿[5k4mTg.͚5ŋ̣#     ȻZ`ԩĉGyXHHHHHHN.:tHN8!y D*.BIEi!      #@EOz衇\f      <T]r.*U*YHHHHHH"ylݫK͛Ei!      #@El~:c}ݺuQIHHHHHH r P͛aÆW#GpJs D>#cRwI:u)]$@$@$@$@$@$@$5ȇùf͚? t)A$@$@$@$@$@$@.PwEHHHHHHH "S HHHHHH\  !@J,C$@$@$@$@$@$@1Ep$@$@$@$@$@$@$y7XHHHHHHb*10HHHHHHH *n( Tca TPb      !ǐ/       7Ȼ2$@$@$@$@$@$@$C<2HHHHHHHh BBBA;k׮ ڤ @tG!N{'ɓ'ٳg֭[瞓B =A0`W)RȻ=6ot钴o^ϟ/;wupƌ#}TZUKI8qPe#$@$@$@$@$@$*>hA߾}^(Vǎ+ٳgTE>}xOl+E[oɖ-[K.z}ñcL҄רQCW_}%G#     j1Rwʒ"Yx׳gOkiӦrq1ֽ&KL0a`ɓܹseƍҰaCy}͛7eΜ9_ŋ ԩSK d׮]Z_|-[gA$@$@$@$@$@A F*|9Wtz&Z… {N0!nܸRdɰa=z4 2e8r;vMƏ/gϞzȱ\x6苊|xHHHHH 2dwC+ p(Iw! s'k.Phժ,ZHRJT4i}8& D5iGe/ߩSʼyd޽$Iɓ'.P@KjդN:kvZ޽[~ٰancĉ!Cmu={ׯ׊?ċ)'w0dСpBy'0Ac_u,+}xҶm[RkNr^Cz$s)hgYfU' M#     b"-<{״%=iҤaX,=n'A_|1R\hQڵ.j_~noX`[O`R!b Ok9>$ĄBxRti=ѸqEx\*UJO2DA dʔI7&_֬Y7 @<=6(pkGFtqK.}ezvA;a=s΅^d~_~mM|tL>/]d6{,v-[ <*Up8j(y+VLwfmG2eJJѡCvn$     pf?dukуvزeNfg#>'1.Жc2nA9Uz))X1/_WR9"$#G |f ^     lFϕ%E-/cꫯ bN9,Pv'L:W&;ڄ}YlD@D%A: ƍ'@b>p)L2EM&ՓKɒ%#uHдiSɞ=V/q     0b"xܹvG&w$ʦMRO81 &̙3 \0}k_AzLL ٿ[]OL+}d 2#q!&JreB$@$@$@$@$@QE &HilQo޼)P%J…vA9ĥC7VvA9vLAr.]h8O>DߺuK͛p62í~ƍAC &XC%$n'    41Z-J<#k=b׭[-^XcӚ؎LgΜ[-(yZjegdG={ +چyz,=7p@+]xL^xw}WI?ҦM#WAdH&MduvIHHHHH'ZJ a+rV.^/uիWÒ;wn2ݾb2K ?DžҧOĹ/rG4h !]l4 @Tq|T<ܹS?c2zO`r楗^[$2 @T? s/k֬IwC ͚5ӡAk K12FY kNr%SNաH ٻwnI&       е_b,O$@$@$@$@$@$@H] KIHHHHHH  PFHHHHHH%@E_b,O$@$@$@$@$@$@H|4g$@$@$@$@$@$@$/*cy      FT>&       P˓ @4"5 KXHHHHHHhϮIHHHHHH_T%$@$@$@$@$@$@$G#|vM$@$@$@$@$@$@"/1'      h$/]1BN:5{O'Obkk)ɂ5dSb硇bp$@$K ,^wX685g䐂xmNSz A’~L1Eұqi1ƼN[W8 My5u*>N={ʵk6mT+a͔)Sn߾-}ɜ9sdϞ=ҤI*^tB7MwĽo(e1uS)eݒ:E"ybLl`z0CѪ\q+[X('\ :pNn=!{_"ΗyUy =XE=W`g2{pjhtL^%S'tNYG%t|V ]_u0ܶөSu j!`z"],\A'LnͣR$:uV~hNH>V7Gddj6~nSAΕ:3WՒ?g(WKҨJ <(Sjgyrɔ=Yބ~;x H +E~ZQgz07eR2N$,g}eiϒ!WCJJjOcIqd@Rh,,M'KA7u*>yZ*-.]:`nHv' }$J}0ۏNj\y!Ę~9U)ċK^b8!ҴW +J@s }۱XyH+"Jaʣ?@LhWȊ+HB}QAl},Y< Z>[N&N(6mdɒI*U^zҩS']vɚ5̞=[6n(Ŋ>v 2DCQF˗}%HiF,>?2x`9|TVMׯ/=Xs%cѣGe&-*jՒB+6sLi֬`Le ;7[LRJ~d[*C7#ʫnR>Jó ;诙kä{bO}O?1_k2}q ]X |EC_|ooV9u0<K  gΜY+͓?CTWcǎ˭[*U*Yd7N+pwR[l)PСCeB-t|}9… J3ꣿI$1)Sj?QDILNիW1n޼Yv%p3m4}L.\q`|r͡k׮z lo09.lE75 \rSݥ.NɕRQ.ϸR=l@Q3doR>QةG]@J]ԕ"aT.+N%JOVo>.C'mf{+!~삛/E¥Ҷb ~\=#$u+ymL>|V!I W`ֻX~-\6AJUo6U7AWJbtYl={$M{7YLT`W ZZB7fi!$L?PהSJ*C$zR;pY5}'<tLv:#*Պ s ZF Ȩ>"gUIוOBÙ A*R˯Ѹۊ$^mV%@NMZ[_9#*?& ~{N0I~YʚG奢kqTܻTdR!9W~GYkݸ"rn(x=ctmVN+:d = %V乢p9ˇeoArzv8X 3^1UM6Y ;$(ą]9p=;ΡK'~O0 gUkrF?gCrdIHTs }a @ fXQȯI4E r'X 0=λ|&yJ tqmENv4{4cXn󽆺56O?}gIG6*A E={vߤ@ZO?$̃Ro$N_+-[JŵҿrJ)]:4["E=}Æ Vv}9}ѢEKǃno((Uy(zZ~O%:!'Ҵ|3bzJ۰vPx 7|$b OJ++N7,|uyN(IJV ;*?}^),HԟkMsjfR&Xˣ]LLviA0̻,H<\_O%#!p%x֓%$O 헕w=DŽψm$#)w$՝ԘTH]p%/dPrp{pm#qL~&DqLPF?@cqxUiWA/)egױ<ѰywxF[q? U2co3#Qy>>yE1 ^߫sdž X!R)mԄ4u߄HJ;>gܦ1_R|n}ĻCិc4xlL黹b`}vdVڛ߅WQ=g%K@w|F>Y?ard ir>.&fs+{t}{k s Vـ.{]/sV1_6-+E{woX!FCyi!FρOܠwoVLpÏ>_^{aɪ~𬀁.J:6n(CCčW^~e" >e 8P/%o {;,ݻwz 8!puON<۴iģ<}"z(QBǏja;#;wV?ҭ[0%ʔ) K/b;OFDFX-n@JOY1f>} f׻6-="Mnu{Y{~1 HrN[؆r&9un͟J<#崥}] !F@cTGTp#Ҟ7[0%m7KL8 L>ג.L$<P`@y&"r+ JuI6p({)Š>M>_n>;tqڋtsLUmjI,(ju7Zxڸ㞃 ga\?**Qy>Xu 7j}դIGݴɁI.qXÔx%rV>xA |ƺ>h\WcvwtV3ܯ=}ӔםU9P?RΡ||+;4Qp),˘0זcߔa_Wx>s݋b^П&|ɨەeן a sMQI:Υ /oT@LB!z*)3,‹@5NE>Hwܩ-Pr,[%mxv<ס ]V,X`vyɓG+^>_rEc#+`qx.f< X~ժU:uj7ZZ&71fpJA|/ɩba,Ws X+KWDdIk*\D1Aadz)$hqS|Bz:˘QӮ+nfx}N\`Bel:[S] 71LX _I &o-uɐ6AjƄk/뙙lE+֋ Bp-rr6~a5W^p퇅 QD1[;.˗;#<.׊r8%F|z}JU|ݧ}|,:γ*ƤbȔNmC磩2y6!x@x ߈JDn3V>W'KdUU r>X=&ZH~x٪;y]c|vX[}P+=>YaC]eo ݞ' <2D&.\mo>[c퐼ygҥKfCyN$-^\k }'z"+T.X'O,k?sϲu/ ˗/jvźH/Iuk?#+7􌽯 9㢏?\l*y].݉B8RB$9x eO+Iohwn*. eƪ^_w{%vHxF#į:<^'׀Q0 W Ǫ%=Hpעr3k+7>CGD ostZm8vrX>׮xL?[w^k a2zr^PY#%g LC?y~o 5 7}"i<ss<DŽ z>X=&VT66V1 'xp"uB>Ƌ\x_L OfK\eTK0m:}FP?; -&m4ΩYై=W;5lmT!btfZ5CL_1J,)+V3㢡 ҤI-[6l1p[Ŕ?q" +K?K_1[ )"rI]!=-rIGDNq˘&:ڦG{w2[\QI ~zAKμuubd_/.*w8(`b cE!ZkL@w_=@Ce הej+ .e9kdq>ĩ";/I/P/+|5._ͽVL>VdVd b `,Pؐ,Y`ُDw|ǐ*[ |p۾r퀄p߶./ߢM@DŽO;xLX:S}59 0V"k/70o8(=n˸uƣ1mNk8\,->}"HgM,z{1xb(@r;(Hw钷+ס,XУ|N&ܣUG":vd· d`*(wu{?cb\<7Rr?  ֳr( 溽|xM|6v+H<, Y+T'z7!G=X߱TP.c;eV@ĸծ6 @DT넳g# :W%5뵽b_q }b~#qp:NП$Avhܼ=HA.N!X"V^uZ |{$C,Ta]w#"`= 7&óO!m9 }|=>Bwa]!P40ZDAyƂ:{:inXK VaKF9X؍8o}Îu@D11J yDbk%˴YoRgϞ *ߤIzoc?GtYG9Ȳe<z,DCD 8Fi&:9a7o3c &bYb8MmjƯM` $R3ߛ:Q`,lanȰ ~<cٺ$\1V$:r^ާ3ڃ;y= n sr:cլKY{ #a-2$d͊yg-;G:v)&(O"Ŭ=c'lWVeRKE v7 KZ9tJ9"/*lU .XJd'PLF{xhY%kn##6ܛM0cvZV>}-y:&~UL 7n d[aеhj- t+6&ɚw"gk<'B~U9~r>V4ä~Q c~Ǫ_Z;l%y˜ƛFd}E[dYBnҫsu? l^jغ ȼ?[:v(&`o$K0"E ۷o+(PG);vuתUKDzUPoqgΜWTIc]m۶YzZڵk ֳ {Xbq*UJ ϝ;7"8drFx}dG@\͛u~a?S?ujZŋʿLTQ+ >ܧ ܂v}z-^/a !F K-N)REM`V+<>]UFVj6}ߥ2u^rD._lrX*uuݤSZ5an>ͭZ1o|:]s1dfZ+TkXk,Aqd CJCLRT N|",p}]-+whEl۹~)j=f#XӸrDҩo$˹KH)vQC2tiRVu-uK^QIƲX z7QTM\,&Yg. zP$|1ia]騔(A'u7<Z(&"+74SM@F_7Y%*χ/wv?, ;qnS!l_s赶]wRϪ(P*+=Ys*~U ad~9 ZZ0. ϰz(ZVKo(hafJ6I׻;4Xy(`{;Н⠬YN)Rlj0>+*GBO#(Rl:nVk?çl2S^'H(sE%Ar^yC=cc[̰zgBFo9 RysC]iox@.LW|"ob>b9C/2f^kۗgd/d֬YzI8A{NwG/ׯ|2vXXȷkJ-ZXx{< &wPL-[V{ 7l OI&q<Xم'mU4 ` 7>{X.Սb2tVf7,啭]Kk釯$@So٭r}?#v@f;'V4{[ >ٞ<אzXMq$Sd92T[0 % ?(#%9WK*}b@SKd!}z)Pu~:VAJYVqPU2WyAvBF*!C'1㰆攟jɷ*Dc:؈I}V fMr 4$u)r!da0|x\ń7^)^o)eu;Y´u1qY=<D3U1P( ;â @_cw{feWtU"ЬI) NTRnU#ŀڸޮ&pz_"[[ǵ>"/ކI*x&7A0Xs,C{ VX/֍ءNLVy(M73]U@!Ϝ9sʹsCĉX㴛 !5#Q v=̊_^m;M[k$KEW&x{_rBGx^gbb<"V ,Ó3jb)mR,B귙 ,H TuqBQq IXwo)tkK7ᚇGL^AIƎjVK &޽ă?2UgSJ:5y[cޭ{&SJUiqzUSn9澉{3̑I}>9ۦbWw#$CZ'eXݔq &0AVp]Uws}Wr:vLemseo[5+D<~3?)LC{Lyg. kw,p!R$H@Ǜn)Tyڔ!*A|TRSGCoVx| o qhn>nZ:uJ؏=ZICe1apS.?Itbż1xIB$ 7Ҙ(ȴ װ)床m5dh0$&sm+uEނI\A/EXH"T$qznnrʥbͶ?L.tH1I5B$@:X{~JL'@*zii?s~JQpzC7}ox>o$@ccȷxp,ɶsNI       *"vHHHHHHH PHHHHHHE|H      T2       `",lHHHHHH(.HHHHHHH X$!      ( @E>       *"vHHHHHHH PHHHHHHE|H A`㿧ߨ r5=kϷ/F  N){ dׁsccAq$@@X9j:=*-[GyD:w".6mrDdɤk׮e/^,}4h@ԩXwTUj\6e"YCZO[o<*;Y \Z%c$uS}dNT͟NzI9_Z$#{ %ORlӹ}s-6el~B,%2[5 Ibl̏N] vi:+nɴ{p4R8oZ~޺r\Xg|K vl˾y6Cn'C9"ur1;{$M_|X&~ w;0olyJď+Ej$Kd~۲Fs{_=FV[_}GlʒBڮIGO]u\.^SH٥f)zڼN"QRH$H'"Q$dϔZIH R {:! ʚ5kdϞ=ѮȯZJf͚ Cԩ}*˗/͛7 E~ȑr5y7$a„la+I-QIҕҤ~+E"^)7m{Hi|*~{s+ c`9"(PHO"o,TE_f\WL|9zT]R]`l|r~#DҩӍ!zRm̬g TS0i+dsa;T9kɖ]zc^~@~X~2I'ʌd]U$nu~=_+PlKvM^/snٙxw/97&N%]Rb&l$渟HJnPec1@9rDPu8j֬) H4i=䠌|(P@ʖ-k6^zٳg套^"7i)!}2;ɷh%fe8)᷃W˜ת?,/?cڍWJT<[Zi(|@'^{೛cB9_5dV}d{ JE \[n+/'Q+~?K_eLdIc$tKTH r x En_l=7TVM UM(e'Ni݆I&9)RHڵ%cZb|v8x𠄄\MdIBw<.k nwS$X];Op?l$J7lg<<9^# Yyp}ql[ Vw' S;UX(rGۃK]?&nі^*1ڏ(%8:~I[}ʺc{/UOI*Ŝp=Ǎ~_SN~ y#_rCTcB>@~PsƿzBGucwI]Ӎ:R١V @8zo~cJo'x@oX*@|o1wx՞󄱏L$@&@|8a 6m: 6}ĉ/C @T"m(Dcǎ('Ǐ <` ~… )S&u[+vaiҤ@R"Po/Wci֬VaN* zĈZ(8d˖ͧ" u2d |򉽪̜9SGb9ÎDŽjN<&;p 1qq}3F '7cV˙3H>CƟz$HLqN#*s1xcʕWȧ~"J۶mGAv킮ć۱;:O%<2[JH1f2n[ U2̍ W!5+vS\ǰQxPF@dfw5XV(6C VKM%򷱛$O'|TT2_ wa(%b;Gb?x${x'`r0ytRS;hܸ *[(XoeO鶽K+t Ti3&;>=_к=_m;M5?/Afl$koϣ?xwUEwE7*f٣X .ڼwT.];@ d}VĻGxˬrBQOhsIZ.ۃmJjdʧQ4obO{xQUZrr ^*Ԅ"B< eڂڗUr iXS )$@$ċ 1BI*bN4QC̹S29cq7JOݺu{-CnjX vҮp`鳩S ܦa5X@9v0mVq9;ŀ?s:,ȧ`L/zLx S~SןW|ߘ< B02eJ^n8]b v~ z䐰N(z+u&{$!C&dJּz|NY̊jֻVfo^~kp˽t\zKJAD iyI%%H$\X} V{wH9/:n8 UF #9[TK ~~`^sVY)Wwrd|B3bn[+cqXa" g<(0\(9 "dQ(bB(b # A$I zۻ۽ٙwNuUWMܨ]ۨHq%PKy7L/V.(PaяNa嘐ŪcT~mc'o.ļ,`Pݡ+˟Si `61KX{ܧϠy Vbg=^O1^ʛ JJ! p!@E>Hgĉ&_#X`5hʘH`>7jeo˗*poժv|Z%P:Bm}I0c\q:ҥKu8̷USŽ8?^H>'H\29@ATjP MMiLuiXVg#7nDē!}RAG/(Dt tAR/k{#қ}~lO϶ЎznKL@ t_9|Jmn,,rSy^P*c6я/p (Y: [T/(iUt}(9|5 𔊱8EiO.?ܣ( ǰwH6?N* e*,*e7i\R{LIH0ؙ| ð6g1bMTuK,C$@E|*ڇb*؍dm,n(i>|p[`lk޼ z(C%PzB9&L-ӧ]F@ зm:;`J<#L}bcY <7Yr4EUy8Lj\‹= ~fYhgՖt$lv2J#UUz(f;RW!m,dyS"@xH{+(Hpt?zⱏYbwf?*xؽYz++=Z\֢-##Ě©T)=[qG`sn[{!4!9cFL7N9BPԠ&[iO99|mHH d$ yG`|tDl{RdI]t-JQ&m1:.]ƀ?#":M߭}P[6sq [#@>S] 2 xpgik]ߪc?E"C|I;wSQUO#]ͺ,JFQQ~Gd--9Aeċ0rI{EI=j((Jm i+}KGj8>k)1 omaa=TOuTdIȺ'A bվmx\#u*{7x}^^7el\9EnbέxDkJ^ol @"$\n5:tHnn1ѣ-?`d|eʵU^*;vAʿL .\w{]rJ˖-!o=sB  Hska@$s󽉉rsw}WjO签!<0e1 1aÆf'R Yp,w=O+p795 ZV+-dG˴E%g4R_˳JQkdֲ}*0VAy]&e,>g~WzS> _w]SGB $! =IqI倹Ϗ_qd*.)c`w* U1[W-{_.flmO>zeȋ=h}Ӭ^QA\  5DnhU7!gs,N$@Fxk96 V[D2@ueݪo^Z# ,XP6nܨCIݻ-X۵kSa.Q@qRA(ֶa"0^6mj{ʙ Pfz֨Q#)g TÊknIcB89W+6u)(p'Gv ;H1pǠ R!0IXi˘ҀcA:{dX9K]yOZnauNMY_?q04k(`[:u  Xz@:/O6.%ОyǏRXcmCZnyUSSg1 p9QׅP1`}~])8u Vv:aKʯ w3nu-h^!dP'U1KGv*Rlie@yzg~nBɹ C m8Sd6=q5k(o2*'-)}at*FW`nm9} żHy56^7wp]S̽ Fś׿lQ)(XvW-k[٫PL8_rejU̫yOS}ѭ^.)h$H-H! P%D*/Jl8{cqD{>ZO1nPD!ԎN"@Epa<|R=wv?yX˽Ǡ<0~޼y|SOuo;xO]2+{,,]EGjXTĖ ݱӗ$wtNl?W׃`h',PBQ;Yԝ Gϫ{0mFN/g:7>˺b.l* @"G@$@$@$@$@$@$POD'J$@$@$@$@$@$ȇ9 $"T桒 ?*y$@$@$@$@$@$@DtyGAҥKA $Tι1۷o=zڵkC=$/jHHHHH $Q?  =?PF%m۶֭[KtСC2aٶm={V .,Փ~8JY늵k'|"ׯoVVje     DL $}GKiᡇ:SNI5x2m4N>]y}%C w^yԪUKƌ#ɒ%s+O<*U~c9n     H\Bҵ]eBJ`ɒ%jE۩nݺIeĉj*3g,\PJ,)rյ.[lRHYf;wε $@$@$@$@$@@H*P' 3Уz;v,}l̙oʕ+ꫯ͛Wz9s֕wyjڳn2 @$pGQG~P/-Z$P0nX^rl޼YRN-/lgxQ=/nݺ%wu<#RT){QǏ [ O<˔)St J ,"l٢ZLVlrHږ6mZrرc̘1CO^^D ǁ9֭Ӯ`VNG:#@3؋R5~׮]2eJ[]ʔ)W۷Ͼ);EM{Q p @#sv+p@1(cBӥK'w믿A?{n=M4IC)ٳ9;w .jVl*xRq< )8}I#fL{N$@$@$@$@$"<_j+5tXX""[ hΝv̋61?}ZRgoܸqCF-ʨλt" ,~-XrZ}|AI$̿+2p@)V._L?}OyѣGKjt :Ts^KP_{5Aa` J/{f͚/xI}ۃj/$O<QHHHHHH"}!(UVKѢE#GhP3[ohPJ;[̍F=pCu*V~m^Hrt^s,G_9|駂{(e˖>@oU ݟ{9g" [w 6l&@V8qB炿e˴>l=uɓ''XHHHHH  Eg!>yXNa&ׯ_իW G)jtX.M49p߷Pc_}'|ҺZ/H?_88FEif͚ڻsҲeKjAx?@ѿxbqq)Rv_ L@$kFo͛ŋ!C7Htq; @%D(pڵk{,dVR_hV{X^\A*c8CYv(PT֟up8,X1HܢE(b~<䥗^ +k9.]ڱLlD8)[۶m_bx($@$@$@$@$@@(sg`E E5w܎ű/U,]TÜx͝;WE}"4{oz d@|WxIoP?_ۉi9x@oc!`O?m8gP⡌: B;EA+><;e?^#    _aȇ_P!}d͚U~Do׮2 y k=9R W|9rc&* SbS (7|i iڐi.`z J17(V[5m*W^#Cw[07 ]y8"ݣ6mڸY͜z;x ),gQ nCp@FHhIXG[oXPgɒEm}6iD[iL%>A s     #ěӎ@mdޠA=)C4i>P~'EqZ˔)VLsr[g̘c`^<,pF}䭷 /Vx K8曯YFF4'k_1`ԴiSWdȐA͛'ׯ *9##FDO4 @رc*4hus,{Xoьidɒ:6:om-e     O $pTq`ĉe̘12n80a2gάc=Z9Au%tСcw#'=_}l"c=h ?,ofyԋ~A`q=,(]t#0@M\?1MU\[o9\|ٱ.ʃI2vE!'    G (zUg](.gϞD67|93gh:gΜxRAA/<gM{OepG|,x00ܸϟSbC0U10yfWhu S{ ܸqC6s=9s͛7ױ3o; B: dի4hݺBLAP]jN:jE$@$@$@$@$ȇ d@u@;oܸ1A?#~QHHHHHHk!O      ȇIbIHHHHHH"oHHHHHHH€08I" T ~ @"']$      C!O      T$$@$@$@$@$@$@$`P7$I$@$@$@$@$@$@a@|$vHHHHHH *?IHHHHHH P. !@Eސ' *apE      0$      0 @E> NNsE>nlyJwhׁ.FG x p\MQܺuK:v(Ν#FHڴiI+N"I̐J*;C$|9G9V עQ!"?er+Rkiy<)/|ۿZIg'i( ٴ2 Ni^*m[-J|zEɜ1RO;Coj@}}Q_9D+HHHHHbDsc/\R%[nիWرcڿtiRDѺZ3CJɒ1˘>ޚ,iR:lKyC5TDɒh /[Be5-%K^H~=ILK_ש)upX7 Dy/n+ gϖK4iH"ҪU+Gʄ dEu]#HRZ۲e|RdIyݶ/ӧOKJFN:fҊv֭[ߨeիVe̘1cԩd̘QN*ٳGd"{ v4hx;ȝw[QKbݵkWlk׮.\X1TZU5kf}\R͛Wx m y衇ҥKҫW/yg̦|fLB.,y3TJD%U=a>~eZ+~feʖVy- VGo?}ܬHHHH*͛7_ŋK)$z^8JC+gΜ)ݻwKΜ9"}ƍ'}ܵ Y ̘1Cx I.BAtP }EI&׮ժU2eȩS!vgp@<< y嗥qꫯz*U'w+KGdR]=yY;=piD?M>S$@$@$@$@$@qGP!>.]Z+a_~7q#w@q/4O??g2yd">j(ٻwY`0H7|z  %[;[n2l0`/JEacAsDJ?D7rRļww&uyYֲ$@$@$@$@$@L`2TkV[zjׯ+s!7opRڵ˵ VzX@C !-[Esϡ_V,J!}oJ>V\rƍ!90MM6مЪ[}vw.~ Y7?읎_p/IDu@/e]sHHHHH ND⤩j^yk;^F gLC ҉I ,8e##X䥗^ҟA[p̩%O(~#6N>!]b7[UΒ!7Jyg' dq}tܜ/udG0pli#    T=pF;̇G)S_BkV'tMi9ۃa H֬YuT.]hnPAPPxkePzJc> JbRdv])YF.:ɐ.$#ܼu[%[6/Y2 @" cX|wXݑ ~sw*THB!G:5h>\C˗ ȑí)SjtCyP0p{k`Ik;dɺC2tgso0HPhVٰwVJeǿveW /Αwu={2co]F`HEs]Y5~I 0 gո#u](  WDXw}k۶m5Q+rME Ejdsrԥ{o4`*~kJyj~ *'nH=0̙ٳgwmBqmCiUn|:u\ާ~*[lq+ yƇ9ր_pL 8|pT}A;;x|EpO>+}%lʼtIjc'iRęu;S Q:4I$@$@$@$@$"ZDW_{׵"Y\9|ΥyP1*>h"aÆz;Y(ۘcEӤgnw";R1BZhqӮ42iӞ/ڈ( 2СCM'?#: ]Tt}H㏻Znڴi:_VXZֺ2vX  n Z&Ex#\t]/K*)T~(M vۋ= ~7s ocԸ'ΞN68)[UH; .*V^]2c nE'O.=t-<5~ĉ2f7nL0%sz=,˗Y 8vG%쇠x7>`޺uKRN-*TΝ;kٔuۈoA< a ["ExEʖ-={V0W`#ʕ}-ʭrL*ސeKgX0wFfrs"퟼[߸yU.& ߛO/^U}+KάS#b%    >$:ѳ߯tr =B=(PSt#} J~TE0 I(Tq=6c"_yN?y˙^RHiIHHHH Pz M4 fϞ-ŊKt x$@$@$@$@$@$]8#{X1aΝzj8φHHHHHˆ-atrWv eʔNKc#     @"5tJ':>荳B     #ȇbWIHHHHHH `ɺIHHHHHH  `/B @">=%      "ϋHHHHHHˆ0:Y* P5@$@$@$@$@$@$@aD|,vHHHHHH       0"@E>NJ$@$@$@$@$@$@Ty @#mn @H8YxHHhOGG$@$@$@$@$@$PO`'C$@$@$@$@$@$ POGG!O!GvHHHHBP: $"gϖ|P4hJ$@$@$@$@1'@E> Yw}'o[ζ%q9r<_%n͛':t9rȐ!C=     PD`Æ 믿ʁ|*Nm&_Znϙ3G6o,{ҤIeذaRBĎO$@$@$@$@~".N֬Y#}+=c9rD{%,YR2eʔC$@$@$@$@qA A \zUə3gv̙3j;HHHH**^۷K4iH"ҪU+)V=v9pΐ!+WN[aseiӦɲejժm?~|gz[o _w.ɒ%>}h7~M9s˗Oe7oO?$ׯ[+m*Ug}VRLY-[$K,RlYyg$8O2Eby]wIÆ _xG?… KzQFQ>;&|l߾]N>-y5j?.)Rp+pB5k^k.b ڵ[?9n+՗-[JŊݾaڵyi„ dA4Eʋ/(ŋw<z!tK[{`}7QqRHHHHH'֊sW%sT{@xb %qʕ2i$ѣVUݺuK+jA\riEq2n8 g@IDATnݺ]dƍ?kծȟ?^oà"/ȍ7 /r(v9y0pO.PV1X1~x8qVhAAꫯj رCΝ+j7b2c(3fTR遉cJǎuk&PD1(`Svm5jqeA7xC0P.]:}o iӦu5<ʕ+СCrY?sn۫TUþ}u:ujݻWgϮtЇS]q}߹s\pAibKp@%c$@$@$@$@$k8ptv >3Ś"J|eСrwA |ץwRV- ~Ò .HXA1 oݺu `.~XOx |5x}ߴiSmO>Eim`*@`21X}a>Pcj]2 e"-Y$IeW^j/X X{=}ɓ' XtI?Ν;]mhARd4HgvjӦgϞOO`߿̘1|u }^~]>C=ԯ_?>})HÇW_=+05E!    @3 9>}@nSDlxl{]vRtiٳg)bCWf(͛7J<,P-?3Fԩ]ۭH2ΡCwߕRJ ,F6 @Ĕ3@?sҤI9sL`0ovq>H"/?x9:uJ+?@d˖M:=V.]xlGеwyG`cbYre0`z֭[)k z0Xc]{`|% f%    HL]lsDB zr +M1Ÿ*c>|f͚iEܺJ3< >7:R]fM=Ma5lڴI?O>#6\nSx݇R zXߍ` i(F0>!mg L *d]PͫXٹ ,{QlHHHHxw78ޔgl /}Õ,ReUZUDCP4^c$YfՊ",Pa% X=<ՉyӐ Of@pv-b۷ĉn hݻ15h .^xVeq8X(f]؎s' jӅB$@$@$@$@$Q};)f[\( xCp;( c9`|~( 󤈢;wNsV.o"#7t=𘈙2A9&(`=##(!sK_]x  ""7ʀ?u, $V!$ݪ̛uq[/X#pɓuyl3np!vXaqEt6bP(6)Pb AŖzo.톫cB:<\}Kj%v K@|*r0O ?DPEXw HHHHH?!1Gen]pAFdrz\ý|_z%  @BJ3U -oDu[0%JI, ց\McK0Ml)c>$ a9 |Yϡ bV%r3x88@9^|퇴 vIHHHH \ "FGCa;zh3gNskr#W,YH˖-2V?S]9ϭbl,#uZ1hh fna5 g(bpM7]6\.>N%Jgiԏ(8OyH/ڛ9by+,D@i"fߘ|XuT&6BL/DRHHHHH'rCk6Bqq: =(77h{05 I&Ɏ;G̉={V `TTI6 ݑ1A07=X (jPwu\W\/•ʹ Pnƍ:Rʔ)eX18`g;vm?RA09鱌AiGi8RA‰z8K0Hyԇc+Վ|Pj킀p( e#GE0?,\I0Įȡ/RC3~im-w LP1:10EǏ 0 CZn-, :`O{$vDj_d =ȃ#v7@8gNhN!5 G      $QmwSsil #>Bb8ڰV;uXvFqq*g]9P"͗6cڷo>i;(x(zDć'ѣGu<'kyX`/GQee#x!ஏT>upkL{D@C\C` @B"tXȇcI 43g7|#5kLGC    Ty% q  H]t9s J fHHHHHwT}gŒ$@A" XG!    Ί%IHB$@$@$@$@$Z$@$@$@$@$@$@$+~6N$@$@$@$@$@$@"/&      x%@E>^q      yx4 +*񊟍 NjIHHHHHH ^ PWlHHHHHH#@E?^,M$@$@$@$@$@$@J|g$@$@$@$@$@$@$*bi      WT?'      PK @"8 Gt;&C 6ѣG%cƌRD $C V+w3fDٿtR~(iŨ[$otҰFAreT*C++C_WU2O)6)}AٶvRJɣ# ϕ>2e.53fqqNyRlBo5.HӺEM?}|4fT,]lX"ƐS}gӼ^W tm-CE> s(V2EcPeݶʒ%c*W>xNF)4SϡTZKڻ/c(^&FqzMϬ*.F|>@+[{O%K7޸qõ_̙#7oV|O|*Uvxb6l{8/ܾ-:%&`ߪGeӲh!Ek#n|%ٱta|pr2}yjN5䪲jb9q0&6=߸%'lPp?ݫtkuG6_N kckϟcȟám:UrI{n HW-vMYz$O\u榸qw7ʃ>L2=ھ~r/ܖے.ҽJ=$6m_z.)VNeX4=g~ɕ5-hXguN弒%SPVc]D{nZ)"9;@8ۄ|5ye9*oȨU(݅ Z,ׯ_ Jʔ): BU^*qObC5!m iZ"~Kn޺-/Gߴ:r%/-w$?l1 $sS? t>kޔJi5]>,NwP;h|k¹[~|3gH׮]Ze~ڴil22ҲeKXb1]E|„ n:9y*UJԩ#Ջj{衇^z3<>hP+UK]څP4}6n?)-Rz~[ JrgK+?] я,T,ݣ7v_s? AHQ:ܕd]reA;*Q$ 9V!pyu=3$ V叜(ٔ[%hvQĩx@n޼-$lwϴr?tɺQiv ͙^.MxYdP ^S֤Ԝm{藝T\jfeZg3ԪcٱSs|VP MSkkktv9z`dvG 啅:&;w,'+\ѵi? ;nuJ_wgR]fgG@[o5W){oPs'OIE/7zU^:7v1ZMy*i)C@ 5]S1U'O7*3EN D붞 Z(~q-S._.eU 4 !\ŕeGJi Vϣ6O/T b`Q:mX%w…fCά+76nf#[߱ctAGG|O4I&N={M0}1;w "֮]+|׫#ßUi _)7nޒɓIFxD)ezHU(,0NbzpܺVbW<{V=(ďyq/߯ɻvK$AI+{}O":)ߨ(xXj5kZ^/Pϰu%YҘ+ԏhԤIHo/P}Pr+*P: \}-Cq d!cB ˉvZk9Y~gl.9xX>#7 R/fZOR;SWuLJ:b $x[LԋU29vV첺&p.iꐦ0y93K:*񸾺].ԋM:x"x֌6ԡTw[qP \a+X"k<{\.Њ5 Yd,c:M>x|àe)8ǀ JEߋ:ȰID;"pZ̜!t~)~EyYyaN5؂/5G(xJ<'bpPe˜Zg@[?)xV0[-,a v  K=yd P-"w" BFпpU}~Sϡ{&~/`wd*ہ^s@VXqp9DPѨQ#֖… 7|S^~eW;spڵkkɾ} {VD0 W_<7kc ժU}5x,G`yJFO?PJ^0bP(j>Z?2jkmaPڮ5o|HϑF5yZzO U,Sˌhbm20>`1U ^_U? DǠ^~)*/}^Ca%JF{an"'[OMJU  R.\.sjyyqP(kߠeJIJ/w^V3 xX_x ,O=r;P5b(o3uOԱE B(4}c9vZ;U5D)>]\Ȱwꨗze}2dQyx~qo` B>Uk 5ik&xaD:2Aу5z ֻCWOq_Q_jܓ[ B<>_xxuT^ Z?lo7Հ-Qص:$έϟO^AxB=$q{6ב@\H O^7ǜsNC[-ї5j %s=C#T KRϽV@}އŋZ6.6/r? *,bI0K?6ѽp)h /HPjBe\чU>(ؑV["{VUW KKL!(xs ģNpG#ff#.seƋ7Db~3Z!3OpCr +$F!ęuPX0>"D!n.|gNa ^]+;raԅ kҧpy+. /Gh tڳHK<zskεSʺ)fm`&p1yjr=xk6  2읺.MphD9=0 %J [X!pMQ85䴟?>{#Є`Q0dCd=f1 '(& `^(岊z@AuިfAi|_^PRIct(PUөw^J4."xljA! ~[0xTPRđAvo 8!,~_jq?8FL!gZwSN~M6 uRְ_}۫'!P$9ҦKGHwc6䝨Rz߲m+mBᎉ+} U*5l\^ظ/ Ą-1y{oE ŋ.k||m% E[0b,{]ޛW 3\7"m/b-z)3%vU,FOgQO6(-Ps ?>:4lOWwz^Q!Nچ|vw}`)JɲmV/vtpm\XݥˮT,ѯ:%RX~X:x 6i8s=8ݺ]j,䈩ꩆŕmFGWWt1'k|%\{9rU%bcޤLIB|Ay#޻Z4@|zUZu̗C0qs_[b֙{Snuh_g˺ I7](fS|.gGsx`)'%r"z1ܚok71H#q5>dĬ329LA9 1s=pKIU1l-kY9<0@Flѓg0+y*~cpM*`=pa$Wj!/cN;p.]ڱLKm KAl ~+e $&&<@<V$Gޔs*:Ur_U2 "5t[T}12^]RЏ]K+CQAK cXcw0oyR].^@Dno5d{yx{` SҊT\r ZGBޤwLv?c˼Uv]"5o"N_ޟ!5nHMSƗC\]z>{|OCy@0I`e8`5լ3r xxz86ټ㔎wV2k-Q6B@+vPt `)x <}Yo[< I X VXOsiܹs;m>\R!T0g!t[*$C<)f=?1,S`RY8!9T@4|##ʵ(̆OM2|ϋnޔ4"M^M%S T.9XQ ׃-_kї=IZuL۱{߬"]CbR+T>asJ+o?3Q "fA)Cf 4O+6R }*>/YPڼŴo(ވ$f=) paZ+)@s>\aJ RY7i6m?ͽAJ0ɓ0Vo}=^Y'SA;I؟{=./‰%뗰8$A.\rѣGe5BbQgt&1UAc%'"4]T\VJOsk!$G"L92 )A u} ѐ_Rn k4cs)Ο,~.aa 2ZA y:#z?ܱ/$S]֛k\+Pd10*X Sؔa-6n\KΛvԁTywX̟l{;|%χƍg56Y)bғ>#^ z(/{`p>}#n&b甽@sgwޘ>1R,UJOe,@zpS3 %&>&&7EC."oC0.db,&Ƃ6̏S7]fm;){/KF+[;L 9 r Z|2l! UN['A[)Tu􆨵D]˩OOǾf1}\rE`c{Tdl'1iI 贏: 2`.7|%{^>1QA2~B"4o1s|5I˺]{|0ה?<{|o}~TVJ[A_6ƫذ G `u͔'O䔇xzEu{LȲ/-Լ` ~1g]G[Rg/`6b{> TrspgOe˖-nztQGwz0ׯ_>}+"۷o76-n#x1e@8VzLr -NT޼ ,gf?|Ƭ_VQؽYW1RbϹ:%PG>xzkU0*"/6[/?1Y=9XAa)&mPx1E,DԵ ,Ͼ=&1ݵ<СC]ێ!2}6m\jߑ#]v2biѢ4nXJ(!T^˗ˡC2oҹ*,\RƎפIF dxATX{곯?Qk:&V>V* k9~oY'mߛ#U/SA]_ƛ34 ʻ,**O<Ýmu_Vǃ$/p",{݃gU Nms **!tfv-K,#D7m@]9<PCxNb0tۄR:͎H<\|%| !\H80s`o8W>Xk9Q]}NyJ[j τ YJw' "T߫WKת8C3hD\Ơ \͑FZ] 7KM. ݞ@~_2u@` 2{+e`@9XdtC]wɤL,@ 5ZzZySS*^X2 2$}: ߚu}sMʶpg(?\rE>, R G2%ϕ ׽kw?Wq(<ީĖ"{,pڮxA̓BNS#\Qf1WYvaٯ&zg1<-w :bk}}vyl/:Gꉭu\Q&pv6jXS/`Wm~:S\߰ cWA`@Xς1bo.[Fx ;bRLד "xPp94C\]>T@XÓl&~?qyADD|9i&v1]'}/ =`~nP(obڮ~?c:6D=S0m!;v$ LMqm,`\^e8>5x:wIb@ P 9կW%+o F}fBJI0Z=q(8 VJexs$=9gOZ c #!)!kXŮȇ(PH $c;L-T x0Y"O~xmJ\\/Sk≳='%nZg>wE4gH y@0'Li^Z^$3) T܇6MKkK'bP.PmWBB|>4^?x,5>%!;  M^&`t@T.@b"@E>1|Hj.5PrSu=7#ࡑ @#ܩ*6 Y[짐 ?L9snFn@b#@vb>Br *5*n1HH Q8]/QV#*&b.%AZI `'i\1+t#R"05FHHHHHH :T# $:HHHHHHH P#lHHHHHHA|0(      #T4!      `" HHHHHH8fHHHHHHH "       wMV2qUA(^EыqWT*E@dʐQeY,{es4 I?%;}t O'hN   @8á1@@@H't4   C@>@@@t O'hN   @8á1@@@H't,ݻw| ڵK)"kזwyG .}C ur} ҠV {!6ѺT,S(+paH}<S̞=[pM6Rr倏 ӧO;wJ͚573lx\Uϛc?oK{V" X_=i|Μ9#ʕK,pϙ3c?^M&ʕ *ƍGf ^fx)?)p?w~IȷhTNkGâU7S7v [6OIglM7B#M9w̟]:.@@  dH2ݐ;vȩSJ*'ORY~سڴiӰ3LLLCI2eydr'wNե{T/]"̑yaT|_c/ˁCg,;),$ l dP4q˗/oȑ&';6Wk{g{gR . &W_-wukwl2}QdŊ;wn_TyrYTtlZsS۔.Nh<|w/Z2֪4]Ryc'j;IQ)=!F-u泞UG\۸7I?Q%tu!痧M;RsoϜ9gw+}K/`ڒ-ιt`5{]l5UAͤAY  H^k@5izM:.0oyjeڵ#cccᅲy& ,Y"?TZUnk5p߻wLoĉg0~Ϟ=E-IlaA˖-eĈʕxQm)&&kB;ɹ&SO @BGOi3[lY뢅]׺ukP1ThAsmK. { gsQޒD$f,Z˶ɏ;/1#k#>[ʔ:̻_.٤\ns6sk[}rZ34-;}.m]X~9@IDATp$QV|F~\uyZ6tWtKnviʝݭ)@{g I)xqC`OURBp3=_ lk|9IRӠ>µ~?[ڇ_~Z~W:tw@ȿҮ];roO^8Iku;I &PbŊ@VZ@D %t. 53-Z.B[2DBzᡦ5 OIw۠be]6@.\Z?Wh8;6oӬf^kM=NqDԔn(3 TL^#>3Loeu5?˫fÉ2e؝RH^p> ޾k7|\}7> g9  U~.y {g|vO:*UG.\sp޸q=\սDRH۷_ 7f/_gGo)_G?.Ukb59}D~Tvo714ioI?  @x㘡iҁ"-9 uÇkKhف4M)rVH8] 422}愳! YC@>X{֠;+W#kvoM}`t% ..N ,h{&+/c { HjֳJ Cҧ u´L&Ļא  @V`z/_FGL ԩc?g:s=g{۠@v6mwAt`ŋ˱cR^s )6 Xg<, D8$rf AM:5g:u*|}*Eu@oi>fj @@ *ͷ]=ԩSKG/-K ^#Gʶmے꧟~Ύj l©5_`TQ;wlA%+L8x 2ĞgϞ>t7xC{1;o|6@ ¾ƍuI˖-]Miժy.\(GӾ @]Ւ {cN msC5bCxZ4۵LG״Puzp+ x-o)F-1v @v ; gȚEL4qNL?}ySl:?3z& gႦ^:ֈǘu _\<†|ֲinK)LYtkݛʕ@  l&2cm]+K^vl\@'$$8Qw%ʕ+h_u!L2| ?Sv~vI*m^ ZRv;/ I>EbΠliGTş=EϑDihˮ#)}|a84 &@nYDYs   Npjr,_Imk}e9   D|D2   y>E@@@ #v@@@ a-   %@ Q    _@޿k@@@(d@@@}X   @D G 3    Z@@@"J@>nA@@@"   Qu;    @@@ Af@@@/@ ߇   D@ΈM&رce߾})衇B X΂#~ -VلiZ4oP6d}۲[H"yeaPg˖ιt   nk vGԩS'|"ӦM7|SիX}WՍ@>>|Jٹa_eɟ{u:{g9tuCuiѨ}Wkss*Iu6 @@@0 ȇ 0C D^zɞ={\y2c YjY271˓-?_מM>׍̿eRjqSʘka*3?3=?ys6ު  (-Ϝɏ]nZa:ƤId޼y)ֹsgiҤIoe˖3<#gϞQFZܹsKEzWw^ˤUVҦMۻ/ܽ{|rq0`w}5UAXyL-Iz"2e؝Rb~ÖC^pX|<|w}9u\,fwW#GR   |Z q|mFߧأYf>%Kȏ?(UVÇ˩Sl஁Edĉv<`~ݺuһwo… KTT7Nt> _{5HgѣҥK$D tR4[uמOJ/{. ÉvJe I6h^}NtSM)   @ 0|w>}Ȃ \:tWkUWÆ Kv'NHϞ=eƍ6`̙#sεkE裏Jmm#}ݛ.N-D#!  ,@ AwG_|Ν6޽̙Ȣx5PwO#FM6I׮]_/_^}]ɞ=|Gxׯ|RV3ʂYo}i[KT wke@@@ s gyѫ˕+u{g6ϬiInzSHջ]kq|ΣKgFO ߵO@@@K$@ /ilٲk.;^Iӻ]\~9/9wNd^OkDi[S0@@@H yO>=MK twL4uɿn[UIr3 @@@4 OcHGA9rD< $>"  2 ˡF>BoLzfKkO|)W\=   J;Qx*a@@@H ĻB@@@!@    D|$   y0,F@@@ #'@@@|a1   (@ w`X   @$ G]!O    b@@@"Q@> yB@@@#   xW   >}D9s挟-X   @ ?~4nX+ ~d   #3}N1ҡC9{ 8Pv)cǎ͘B@@@25~neѢE[nҥKYp9@@@Hs7on`k6A@@@ -Vj۶ml&   |9r[5    v:|GB@@@R _|yվ}ؚM@@@H;l˔)#u֕XYti{    i#@ AH"r/,ӦM pO6C@@@ |Z֯__4?s挌7NƎl   @rPH3f̐^zIŊwҨQ}\   @D p[={v/m0nl   @hZ%..NUF   |k*VX[    i'@ sVٲe `k6A@@@ [EEE5    vnڴnUzf@@@N@":b :u֬F@@@ m?,sWT֬B@@@ ܒFr \{[ r6G@@P@ȇLǎ   |sF@@@B @@@H7   ,@ 2;"   o@@@Y@>d:vD@@@ ߜ3"   |t   @ d;gR3"   @(ȇ>   \"Ki@@@E@>5A@@@ _"xN   @(򡨱   H@sڬ#0:o+dѪ]Y+EH3,#q씵 *KƗ;\&ys.7}>O߮ǥF(s2ƚ-[tɉce]a!*GjW)*QWJϟrKX'~[%U.jK:%}%n pfm)oS$uՋߎc2uv9xTPDZ_YA__5>_LKbޟbWolUd;iigg?#ȡ'KFUz sq9f:Yjޣ[vZCjʏ9f>dӎR(nymn6^ki'^z B9b0P)f&;&-xÙ *O.i# ϑ5=$f|7cS'[ʊruU-ݳ=: kSl@L#vl3 њ5kd…Rn]i<]3dժUd@>5s50D^f@eK+v/&jP;)[@ -;g퇥hk}|o~chu$o5_¶wkJ' 斩ޣ `(9r\(q3m~bz`.X'oL2faa C\j3Gv)g>ZH9KwO_z^K6t r_AWU~&|L44pl@!wD9m o|'O=]V+yL~.!_O]'_}T,#k {r#~Kb͗7y!D~{g@2_v5K,J׮]}Ybm6lTJås&(פ?5i4o6%{kMh@.乫 uY t>ojk6k Vd@ϫEi40Z?/S) \߷ɧuARMFjGMZ37L_A*Ik^bm?sd:gKdҜX[}]>~lBlqzm5-+^2.wɛ7Kf)|=ޣ.wee)|9m>enS`׵Z}?](t{ӸiBAmU\gd-aR˘pȱrsSD kP֖M_zz>m]^RRQ|&9}&{}ÏYi{o8d 8tBjVAG P딒a/~?O%都|OѺܢJ:/N'8#w޺C?*Ic<"dȧ}T~7ix:@bb޽;ĽۭPYM_ץeÖCҲij:֤5GO:Gm¹44?fN^!xڮ@`iƩoJ uOkl`K'1{ ^ת\Tjͷl#m4M2n8?.zسɬXh-l$(E A5Ʉ_m-wK+Ss@ uPǚ}G9v{|^r&|Bu_)oB9q)ef=㽮s]$~־zo{='߭v՜{=y pN,?CGk㽵q-46.wo*slݠF{miIR\` .MJ|yiK?|j#W ^kmf9rk(p uEkHIڜSV-_86uKXAG>L{?&1sXmvi xmXin+nbv0-;dڌVkҷB樛MT2N^=p\,i~W! uݚH}c+ku&uSzkp`zpO=A;Xk 6Y X[:pzM }C\퐭nfƣK_kSM;KIXMy[M֓׸ C@hMI ĿIMB -xαRw0y1)dZ>{EiϦvڭIǺ5{Rimc,3>;I;,@ 1+ڲeh)!!|P)V7kk _ϟ/Nxg={@lٲҮ݅ZuI޽m_paرcm0k>Ƀ Z*THʔ)# Ge 60pQZZ07o?{.P4'N-lQ{-#&Lŋoa:Ͳׯ_/G&PK.M@~-\תMՇ<{m}v>_kzᩩliгdiҲ2o;nW,S0HźM0}Ԣ;ۺIRA;s{g\g}IvSwR3𖷔ZvоͽMh^ANkȇfJDvɶNy@^hzc}>x$Ԭ96BM-|Z死؀^ &is/&iw 5qm-x{]*+d /=bh6Z$m-\ YCp}OjL)M, tPSxD4rsvZkϩYh?h S/N8!={7:ޜ9sD_h0#kMӚٳKeΥ/upzAʕ+eQ fΜlE裏JM$,6o3V^IsONSn}$ga B3vsg;}=Y/6I:{Gշ꧵ඖUBpɐ21qxr _`M?Z|=ю{2 m~)h<IgHmrZugOG~{"M:obk=ϡ5 +vV:Y$y{iΦomg`}kONkVn{b4whm9IkU)&=jZf৿itmM1mfd򿡷%;KO>i,F{ɯ6b`Z$onW?)Twvy8a{uF BqӓwقBsZmc?JqӊiѠ}+2kr5!~@&@ M.k4 ?{N?|{jԨakscǎIGk~M4A+=#)4(Q>ڵ>'g"ERmիWOFy&:67Ց=}1dk -EkS@@:t0Eפ ̈:&)#uJ'i3\iZ$S tv羚E[E>GcuwsP:3i&B0t G M꿏 wP]^vi5wy~d-B&ZtuL>:yD@ w$2ȣ?|k^>rZmmz?c ݵyF}{=+l|Omtbkvm95ڌ]ϭ}#i00=s2lmmvm_v/1Z̏||оbөtNn ?}}_}YޢQ9#_ɪ|ξ8{Tt͆.kMΔC8X:hpF"ՈvKml*%MŚ;^1υ6L8Ԇ@z:Fp_:0NUڔ?O.[c98#;뜾셽LŨ˘|{QO4Ϙm.7}w/]~ /<}:3}uJKX5A I: KwRbߓz>-zhH  %ckaÆ]CޱcGw;nڵ/v@mW_}Վ?fkmM+W#mRl$HxoreScSGJJ'u~g]yᡔ)ʟ8:w6Qnrͭ쾍\k; m )i9͈=:I@^o2;7h+PR~|×2cĚu}i}ejTOWѻmY9-gܻhg~;w8Hka dc%{!歊͌gɯcn0J#w Aо:8Ì-pά 9]ͬl]txujHm9gdn5{rޤ5{y N&Hk{Ӭ(:Ǻ:t0<y))PFOyڢ =N%#WPArN>{z?5;ewjڨar/95g3W8IQ@{?}•Lbwp<-tԤKzOu{L֮]otY?4#RTQ=ni_~2Aͦs6EPGHJ|=O [kMM:g59xbjz]]%Rk!tׁӴq-΢:e۟m`Nː'5 N>kAkuf3o)υq³KG׼:]lϖm?NkGM&kUu]ls-m)_aGlׂ_i1EE)PM*C~f)\Ƈ_/ۘ8SjU)j -sv,iL{MM^_}}59߁|Oud=y5 5򎄏/\߸M[nmM6I޽ř2Mwۣ]GZpM#Gɓ'siu.x/]s׮][t9]u Gjit>@;RJv`S)ڶm+UVuI0-H[nE-j ~wqj#~`N׮];[ ~i%'`v͛p|qcQkV^x:I}M}gԶy_j$D_F۩tz%N^]ZvNgkͱlEpR@ҦEBǮxi肔%Mļ0!`R tLm䦫+8Vz:x|v 6]?_:pΣߚ-Lvg6-Ttz:I\Ԗ8tw_tž]б+g}m;IjZԚ'rdfJz'MATm hm6p6Os&LAI )Xk('w.gu~'7\U|D~hJḿOch!ADԑu|m/)k {rk8Zp߯-iWkm@En0k_g}:Abll:ʼ3Ҽf}Mo-&MNבu^u =:6z-OIZn32;sL _5.,J5=i°~fЖZ$@lf0Ӏ@\\LRQwdFGe߱c 5$ia¶mlmyɒ%@ʕ+>M>}dĉm&J*y#GxN1ý)Ѽ+-|[k/0 +WB=G =9Z\I1|8 i-r$\{WM|aHJkDL8q*;3;gj|L"\L@bBX@>b3J@@@0 0]19   i-@ @@@0 6zMOȡ.N:A@@"A>p    д>@(6C@@@ #.@@@ @@@H @@@b3@@@"A@>y@@@@ @ @@@H @@@@P@>@(6C@@@ #.@@@ @@@H @@@2u (gΜ @@@|Lȏ?^7n,}ȿ@@@ CrY8pܹSƎ#   k-*ݺu.]… @@@,y4o>v   @|bٶm[Id@@@G K9r\7   dH,w$@@@2@˗/oѾ}2"   H˔)#u֕XYt)@@@ +R>=IDATI6Ad<&&FxIHHN:ɵ^+ڵ l   2RO>]z-gΜkFƌs9@@@@ Al71cK*VhFe!   YS K;5_~Yvs   ] K v}vjժgw,G@@@5TX,~|@@@.%yg`lٲeE@@@@mⷛG@@Y"ߴiOիW#  dqL&LٳKN@@@2@cbb}ݻTT)/   rfwt13_*׆   Eek2@@@i};\    D@@@ #7@@@<=@x   @$ G!o   x{@@@H C@@@ %   ,Z0u IENDB`clog-1.7.0/gcp/correlated.png000066400000000000000000003504401476143451200160630ustar00rootroot00000000000000PNG  IHDR4 >iCCPICC ProfileHWXS[@hK "5ZIPb ;6tUDJ#Eł.ʛu_|?gsܙ{v# q!4:)2@-1cb",C˻WZE/@+C|+@S ER +!^(Yr\%rWfǂ %G%ӋYPCb'!O @o~$@R}F:Yp|.((q%?O2 Vlqht0o7s'K }Œh5! !F)ْD=j-`xp !EE(LA0bBЩBvz/+l6')| bSe~Kr |BS-NHE ) bU r6cYQC6bI4~ >V)Sؗ ۜ-`G)Py~6.G? v/d& R"= :Dq8Ey!R bׂxX<.H>)*Iljpb@`@@X3$}}N 8@ 8(ɲ!ƃb'D|P0<.@E:ʯ S[$ @AF %ǐ;V.7Vi 2 F2䑮6dI "CD[ŽxgCnOxB"<$\#tnM2tC`E.2~n5Ce\7+g7ȲqKBIo3i(NdK'?[b X;v;;5aQ)^]ek[,\#'+dSSy_! XDĂB:~t8"}}7ܼ?9>88x;v}p7lӡ fD\$pjpc`l|; hR}6\b0sA)(jl[N8 ΀ ^~|FP =0_$@T$BCʑzd RC9 <@z'CUP-BG x4 %Zݍ6' 5}`St0Sc`,,K2116 +*jk ֍aq"N\x"'z|'ހWx?@% ^6!EB(%TNýCxG$uDS9 z bqD"I>hTH*%#&']&>()+(9++) J*v)ST3YlI"GyimEr3EbM$Pr(s)k)uӔ7fʞʱ9k*U~QESN2NEDe [*oT՟F-.POQS?TU٪<٪ U_,՘jԊ*]TS'[9+՛oh4FkDkk,إqN&IJ3H9_s)G4fNcѸymӴ-[+G\kVVvTJ:['Og~:tt|Euu]O_ߨ735bA##Fq533nհp(HdQq*cƽ&4_*&t&=F754 5n14lfmhVbVovϜb04_ejoabi1â%ْamƲ򽕵UFgzlbZ6T?66Wm \ P;7lJ~}HHϑ‘#o880j88F886:e1*mQ999ms3Zst-_;9s+P]]f4rwntFst[]^aQqňa,f$xx<ݫk_޹޻m#3n_ofn?S?_CsvL[fs7eS8P{k&D X>~YpVpmp[7Fl.63-\%<>|}qDK$2ne01DWFߋs8[$nt܌xZ]&II$&%KIz";eT̔ Ԧ4RZRAcW6t㧎?7`Bބ&r&H''J‰Ts2U\w ϟ?\,'keVo_vEv%X/x)}nt|f0W6xI]"{Q{ՓHB-#!"yP[TYaJҔS5 vLhߦӹ[gΘ;L-YZgϞ?gNȜs)ss^Ty-ϙ藐_jKUKť7x/ش_(XعeѺExe˝+ʿ,.>_:$sIR ]_| +\ٰlWpشF{mڦu떭>{ʀ*êEU76\迱nѦM6 6ڪb+qk'ےf_wwtVQSpZVRۻ{K{49mש/ J>ߗZ:D;Tր4LkonnJmjknmn9t#G*j]zrlNN:ubS)Ŷu?}LSg}9u<| n~wP{gEM Screenshot 1076 700 2 144/1 144/1 1 |{[@IDATx|E_:{ ]D"(* R>T.*AzJ5g9.r$y^mٙ[* ! \9U       (hE       s(hĹG P;@$@$@$@$@$@$@$PЈs&      wHHHHHHH 'L$@$@$@$@$@$@$@A @#@A#=2NHHHHHHH       8GF{d0  $@$@$@$@$@$@$@q͛7#8$@$@$@$@$@$@$@&@ABCCeĈRR%ׯ 7IHHHHHH@b2d=zҦM_O D@ J\:|yV)RD̙7K$@$@$@$@$@$@qCNŸتU:$=DΗHHHHHH Oĉz+C  @#@A#&%s&      FWcyܿ_EA#֐s       @W99xU: X*ˑF~iɐ6yTyٳo2e; 0>=5oxzmwΝ;'H 2eJ qA"*m]vRF I47N'qG6 @'+({"Tx&:2VX˵~'Gy-       "eӥN&甿k!Nc[sŋeڴi1cF)UӼC$@$@$@$@$@$@$*iB̰sHHԩSGKc۶m`=m       ?#k!' mkN,TXQܹ#7n͡9 |3}m7r;}Ƞwޕ5jȍ7dٲeC4 C#|ĉO?`iӦ,]GÒ < u%}vn \HHHHHHH<"@ 0 ?OOs!       0 ?OOs!       0 ?OOs!       0 ?OOs!       0 ?OOs!       0 ?OOs!       0 ?OOs!      @bZ 1ɓ%K,+l.ߒ K tLresQiTAɝ-Ł=#0rRiIZgbU{z6cIRlJ+=T2,6mߑdq)^ <]1wlcpS]3A7%MR$_zN5I2cwҁ$@$@$@@F4@t]\"L2߽ŋ`5^9$#G{̧FХ[wH4ɵzY=4 ryⱬR|NsNgߔ/&lq:fI:|I!roM2a^I˕-UmɌWʺ,LãCXr9yHł5OyMU ICjapU| kQkKi\Ai%a?GZx%X6>#u@nuyI^XU%X . )o''ӔWİ֍U='%Jc!쐬|J&EGL,`xͻ πt_e7\ [H?w'+g ʇY |% ~Z9} p7kAoH=l^{ܹs^-]vIvPB2uT} 'wpp=CR}#*aGRtz ;=/}HCJbY7`tRPFk3so}|ݰf~sq7o,omSޥdQ&}<:-j[U꣯hsJK;`c d<%--pG\&{;.ƝחD""z!ZiHrEeP*Fnx°qT 7C"%xbQ';}C$nWȐ1giFMٮ g S xoX˄yD4;S[s8(EJz]B\{ [a+dњc %^[3%Ɯۺɹ %HsT*ѧ`.56joƍsе!C ؀bT1,_k#' 穩5s*zf[\yAgo8@X,u \ |`Rl;A'b}ǴpaUxS ":E={!D˛/bwGr~4$B~U^Ax< ˩/{?L%XGdGSx>I$ bpdq-XcwP?F=/_\P~QwyW^'m1I [o*ˆYQGZ<t] 2BKP/ǿw:IHHHN ~ꫯ.m#X?\BBBO?۷ĉz!_Z5iӦ^ػ{Y?~ݻW.]$sʕ+/,I}ҤIeAŋKZ駟v7>6fٿCҦM+gϖ 6Ç<  ym/_. .۸ڵkwz6l|;vȬYgG֬Yʔq;hՓ7ngвeˈzu a=!On<.oI|>zJy{QQ\{a5x)YQE!CʐM!,I-e@Bx`o登83DUMT ] Q⭷ޒCI4iyŠw+߲rJYNp j >p9v@Ԁ!ɓZp; B| w ZdW͛5OyͱX.X'7޲B^ 8ЁsXg!YUތa: hTvC*v Zyګ};< q"|9 G$D-@'!Z n٫MjE%J|\.k},`V٫Tv1p_ Q!v*wQ"y'`xưpGEw j8$>5$syO<|l_&[X'Wq;2$ ^+r\ OFЀJ eF[#i<1ج&c\(཈0f* &rdPnQ9]69+OZ@?! e=ZyBN# G,I_N*?c$A^#VقyNw0Ǚ9f\|f'A$@$@$@nPpœCXfmݻq *y mV &@S>_h߭[7pTaF^dٲe2h @t"GE֭-:uJ:wEGtgϞZx/hѢ9rp9!" [5O]9ʼocE$@$@$@E5dyȖ-'qbHdF@;T1֭[BxF@x@(U\=z9rD'DN9s  |>/ҤIQvn:"FtUҪU+bs"_)ot8p^-RBRjzȱ\ iiR^`aڇoQ*v@uT)C eTD|{ɷh3VEZ̀y"<"f_d_-Re>mZSE-Z +vxB73~ڠGu2a-XzCI8%SrjVILQ6S%=5k;n}~*a쟒X%[ݿ>qnIFoLu뵐`6AV2ЁUU8 ޓ>fy-jx|ULd?13h&멭U,U%pᝁRvn@D#f 7^,oRUsͳ6 p_?6v]@oO8t.O<sm qZ@#?c|ө_F05_.R{0'<NHj7πu~J?^?~\{kdMlC;1(6]c;E"rDX /<]H&GUPi?V7}TyU,ﴊ7e?"U0}݁oݑط8岿yY)Xbmkbψ5ZU_G%G.9R8@;mdm,C+'67 I44 jQ )JJj232/3WN)}@YN,ʣb}/,;(=;QɒyA*)+,`-ynODqs>[,g|@橅2*@hA &OJNs+v^&RV!sjJGŴ"htp{`}-udS%O$5L@tW;30x5ı1j$$nBؐalPŝyl]HHHH xPBSNeGQy0r #?&uIoV2e79w4wws5< YEC$BH'y[r- }>OSf 0p7O42m$@Ybڍ| @do["An4~"D Q%2vC?|rPvi/o?"ۣ.lSSz]So8 l. m #$5( z>*SD|7n6tfҴnߵx`!uWWfMy4p]YȮ4TxE ~(?X{xTS 8ald.,?,c*< Ku;V5"v7|?l\"z'%X,F%A,D!pbS[0}@7/BBLT4ۺ*ѦZW5e^CHҪ1.b,&ȻҸ VxX^z'~sE^YOl׫W],pSZ8rNhZXv$7p!l1~5="m۶֭+-[tWXQׯ/ .ԕ^p)RȪU2NuɸqQx|W۰f~D79O/?W-A I{>rn\Q>V^5_ZQn7U!4HX]1H`QA -7/A՚&lUIgo?c- /իW/yeС2g\rJ&M]i"^!3KV FV/ D cއ "ӧO3fh/ejot'\BD1N`2]>~.O-"J״Na]Mbx4j%a2>U>E @uxS$ D KT7X$VPID?VUbDKWC"X , Aަ=L{N)c(i.[ǜ7: 8dCEIba/Qkb!9{D#P-DQEˑVFj1U LV_>W%q55  Et7. a+dxSk\< ABGسydm6*གྷgOj2Yl;o$!xoVΫ@~-$E *Mv3H~cf!Hdwd4!_)Cp ?ہ }|_=ʛgѼxHHHb@v)Bŋ$ٲe$ Đ4ԩS)6x'}* #&YfS{BիW%:&OYBAT{Q{[oO*FD`3m'.&      A ( r` ;wD2I$dɒIɣԏIHHHHHH Ƹyx^r%      ~)h\~]OTRE%y-       +Arڵ(xa(S SflG$@$@$@$@$@$@Ho W^}AFJ4i(j< ϓ WxfILX4       K/ ̈jGA0&HHHHHHH n𹠁j&ѝԓG116HHHHHHH 𹠁Ҭ2_{$`'p= > 5ľ$b#oFD1t7Cɼy\&YD [q:yc?ϟo?P/_.f͚8     x 0 A/\'Oy[_K֬YH"R^= ȑ#]"<.BN^u۷w2bĈ8}?>'Nh'B`ӧx}     >@sAvCNM޽[NEBLɗ/UR}x$̜9Svܩ*UJׯ/ʕs1lٲE@c%iҤ:CΝE Biveq|޺uK&O((H֯_seQ5En 0IL :͛73fٳkdŊ2fXb%KLv횞DJ:TkTu~T١ߒ%K[nZ8ʓ'JJcѢEZJ2B"Ir *-e<1ꟼyzͫ6&7ʣjpv"     h 3A,v'ސ#6 >ba=Ht.`7"{j1#[l… Ћa$^ṢGjĉgyF x7pT!W_}%WPiеkWAl>< BˆhܳgO-fKLjf;yʭkO?i wJBANŭ ;-=zPjժz\8j*W;;/ T2h!xqA7 rĤ@Bz2?!     "B0>=5oxzmk;| qXvf{۶mzu!m䨀XEՆ " @g1d5amfމ }cǎ8-G:u:0x?Q^x-[#ްѸqc@c ^`eڴi3BF fO?udoQ9| k$@$@$@$@$@$`C sO=#@ቧiĈJL}.4Ju#TD&j6Q3b+B PtȑҴiShH6 M4NιswrmDdPBZ8|t#XCe'O:!l!bq20Jb=XO b=ztsTNp $L 7xЦM}Qy$KEHU|"b=Wğ E O\HHHHHH>4XL$'st(g.9n(# T°4I%t颏<ةZH^Ev[sŕ+W6~!lean=. [꒴9sĩh1o!\vZFA~?Ex )JZmݺu";~ OF *>NHHHHHH .Y `!A;w(B$41٣G7_~K5"HB@ZFt`gOv|޵kWkXۆB3=R~}]30?t萞'x3Iڵ>LF r={VoN^{5Go>0-_jtRཱུ r(۪U+lsRlYI\ʕ+F6{֘'     "3 *jv +89Ėe͚U'l֬^:T0pFrʹL~,Q䧟~#F*k꫎D.b@„ '* 揼X$cuճ0aRҥKG2((HVZ W=ET!tfĉz.<;vˬYt]a3Ŋ7 ‹6o,<1C0ȑ#']n IhؑHHHHH|D Zhl=,2ѕ?yJ,Dž{wHᩰry\rq͌3F{6"&-^A2(3JT 'U ŤZhC$@$@$@$@$@$#|.hஐ0888Fn0B@@={8B{8'Oj/\&ŁtR gIL (}C     &_{x7 dSN:/2(f+;va1;w#vgHHHHHH4)uSn$O6f`G5T@uU^]/ҭǸL9UTqnx?'K|d:\hѢ? H$@$@$@$@$@^3w,vM s,:?1#:Ly%8u$9׮.R^-~HHHHHHb_ ~c"Ft0s' @KAP%%5!&V$G$      [ALOPΝ;G/I,P=( 4 %䪀<6P}:AJ*e##iҤaHHHHHH⌠d["      @B/  $@$@$@$@$@$@$@-9#       >CρIHHHHHH%@@IDATA[rG$@$@$@$@$@$@$34| xK؏HHHHHHHg(h =&       oɱ PzL$@$@$@$@$@$@$-vd?  LY_;' g֍iYY?zIBCE I+͞)"edr۞IHHHHH >H,>].]YfI I&~{#{]ޛ/Jy>\:M2a^I˕-Um] DztmQƥ @|&@g}&E[A"_bFD+sJʚJ7ݸtL]*.g7keO&^(OZ{,ިV<@$@$@$@$@$@ =}x= fʑ$I-\-ZT -ԩS!w/"^~ei׮>fΜYkI(ְ^oذar]Q^=-,wz $ʕ+2 ɒ%%_4*9ҧOzjTFY.b_̩:8<2T"w( j<|q4 zh8;(P>FpҵkW5j4mTP Bo. .TARd*Ďŋ 8˵wUSP"I&:AMt5uaFTqZi޼/+.enϟw˖-++ucOLv }FU[kT熝 IHHHH' qשSG KGz=zХV!jL2EhEh ʕ˥? ? O?ϣꫯ*}K ƍ}!`n3f̐wy' L?7oj0 t'+I$TRS}40C`̝FtxHHHHH HƷ//B?ƌ##G^>}Z, zOZ@X'Ġ'׉JgΜ۷O >U&/$M~!"&LM6ɹshѢҮ];9z,]Tڴi#%K4h"y뭷O7r.$.I2MR}FYRI2eܽxԭG^WDU yK 6n\">WTJSjT)sa"-甐wer}iBIɡħgߔųHe%eGW[O /G)[,4WfXbuu:Ģ@4^I<{^_+G8wck>ƾ/9 O\a9}L[_ {j %J%d_hU׹ nQ6URiX~7p-#OCO;Z S +|s<.PMV| ɓ'lٲɭ[tWJbd ?G{  8P \fo^ dΜY}q}*THOyM%KHn$88X#RÇ… ̙3%eʔfZ m6)S&5q=A0?ԭ[ש76ld=Ş/iCd@e w _R4_z=yNdm;u\{KfܸuGi$gpiɁk-s~$MH.-Ԃ'JrlPLYq٫oK/W *qW@)hy Nj}rgK%WuΫ?Q'8A7L&W0낪2 4cV @acJw?T?UPS\oV `,v)sM4Im<@$@$@$@$@$J-v ϟ?D'Ou(5m4T Jx]>CBh B׮]8nݺˇ*q"رcظ{ܟ8w7xC{9{G ,ʋ"T0zJUz%8?XkԨcJ U>.i?tnh߾}C1w_ZFi6)kz"ǚzνPZL},0nsR/N -x|h๰c{u>|̭=ް΋ ĈЗߛ I_FyQ{:~w_}VP%r\;^xQ襫K7-ToJtpCtm8~qu՜rX=PГqЉˡ^M[89RGtwk!\ś-1aMGo8$    shj:Wռ^zCiѧOasX?^~7I8ګ'ൂ<N͎7L_ _| 0@RFߜgIu.Q0̛\̒$qBP$oz=soόR(/ڛ`ʂ}tzC(DtXAD (ov:'    p%L 7nܐ5kF8Gư~~w:&#'ԉ:kժZcۛ>sʯ֢;Sap|ܝv{[n/̝V tyK:A֨;wb?Ke*' 95VylW6m&8o5P@iۤdV#A\o ?S󖃧g;    dLs:/L#w%HU!Y|3m~2 X1}~[^.3'4reMϟ&8u`Q9DpY&    P\7_eP:9 ‰U@G}!dž h̙3[z CW\i=`Љ'XU^m}٪$ @.䟨S9b޴N!]c2sAiG)o78&q*GqDzdp:ʸdgW1?MN9=FMޮwINqQ:篵emxSoʂr5F>"Ȫ!iY٭BdjܭֿKeoկOJ$7oQ95yTgv_-6NĹȿ*iuUA^*qQ} R"dqjVr'^O9trb!heeiR=By?.J嵁/m^Er0cHHHHH b4"fwg1yd3f/:W&+W7|S8=Z7nyZEnMCӛ>3g'J߾}e֭ կ_?iӦؾ}-rJ-2[ҧI&KG7hOnؤy7 a4IHHHHHH _<HHHHHH0 qq$@$@$@$@$@$@$_ PЈOM$@$@$@$@$@$@q88u      (h'&      8LF~x: WIU-Km#] ՆRHQH){]&Lɒdm|yviyg23s΍l._# 3J\)ЉkcRrvɔ6qdk_3Q%њ'u!\O;oI˲MdK3Fi+%    G}~nZ_.CDEҖYޑKZ8p.? #h@ຯ-JJ׽h";w9&M$I&m|ry6>WZ%1c>U~ !Pf..\(3#9+A@ᅲĉKܸqHl2X:uYgwڴi}vɗ/_Ɓ4i& 0{"yR lec;"S.\ ]. _qO ;hwՕ)jk:南JώQǰI;uԳ۲vYyLf8bqŇOrٲdIirdV$R4d2n>7$Ӱ =XL 8 GNmK/sUir- A4J8~-]=|i)3D07.!K/CyEW{Y{]Y9y% )S8S9*0<95ٛu> }#:u!czh@]R]$ /Y@,PmK-Y>/^I ϊ{Jdiw=}] ǿ۸z^~$zIHHHH @A HX;ϟ_-ZT{ wN$<`#1':-q &Yǎ!&9rv~Q`Aq1g:uԩSG ,( CA> /vl(*T~Fh !;c#C۾+_%W\luf3K@I<$`Δzم+w'}T'\CM@y9J̺Lܸ}nkO;WrF0 @LIY%DyAt($O]!b,1?K6 $@A%ȹtR@= ͛ѣz bW}ðd:Ȱa\m-zt#wI1/vI?q1rnQLH)x.K|G%HF A#Eʫ#6bKW-y8|)h;?| ӌx*n2SEJ$@$@$@$@$EČ"d3MFK&H٤IϾΟ?_wG1_ILJ1S=nTʩ{(&H!r\=o!@U96̹2npǏM 5 ̕%jv[#8'ʚ/G60f9|nJpiEXv+qHHHHH 0$ Gs_`k~j֬)'O5jL#a'dN6M۬Y3WKݺueժUjë^xQŋ']tq P\f} A׆PU P؍o[۶հһwo2eC>}HNJ-Ν[A7oޔ^zb5+_:U5+O =J85mZL@QE^ U7MK-ԣlQJ(ð-{/c!#qy$ mJ֝F$_am~PL!GmVQyď[I%/*oVf[_HHHHH"OEfE#ЫW/-R 8PTW\@Pw޽{r DDQQfr pƇj[xp@ vr Z]^tI=l)F=ѢߪCгo밖dV F;J=rĊ @'@Hx);v#'zX?((H0 LhHugdz7KG& G Do4wF=*TH#U31T%K8qbzRR% E]-s00*Y,  `e$@$@$@$@$@$@$@$ӟl        2IHHHHHHJ_p       ,HHHHHHH(h/ '       2IHHHHHHJ_p       ,HHHHHHH(h/ '       2IHHHHHHJ_p       ,HHHHHHH(hݻwѣGa( xC7Ԟn3yd)ZtAܹ) 'b{2׵'PfMy|r7n "       zhkdɤI&oڵk_$@$@$@$@$@$@$@n&V+]^pV2       ɓ'ץ(E <rc1PL1X TR&MX Px!7=zT={v7*$@$@$@$@$@$@$@a%@A#1%f̘R~0IHHHHHH!@AJ.ٵk|'ϖ-[J̙]$@$@$@$@$@$@$@$ۗhe&?ԫWE}/ Dj'V;+&       /0 h܄HHHHHHH b PЈXHHHHHHH 4MHHHHHHH"IHHHHHH @A h܄HHHHHHH b PЈXHHHHHHH 4MHHHHHHH"IHHHHHH @A h܄HHHHHHH b PЈXHHHHHHH 4MHHHHHHH"IHHHHHH @A h܄HHHHHHH b PЈXHHHHHHH 4MGɽ{|3wI#     ?"z0n8t}ǒ8qbXpٳG^uɛ7?D,_~-Z( N x|d\xl߾]>yw]׃dѢE2i$Yr* &h$KL4i"bڵkL2.       DIAeXW#Tȗ/xMGXbIbl>{{tXҥ-wɓ'ҫW/>}\zUbĈa^h3Q63PHq xO J&D |Ң'OKBSNi`2_6mȊ+$iҤVcƌ+ew 7Gppv$@$@$@$@$@$@!%=4}2Dq}yUV`p1݁^`'5k&ˀU-[&_}sa5TVZfҴiSo} ,yZЀ`ROcƌqi.0$ğ? 낈0o s @4$*\~̚5KV^-ÇxtU._ly>,l۶M1sLI:N\9qDm0+#GV 2x@d(Y[\ҦM"ԦM\$@$@$@$@$@$@a!- =0 y2eJ}].1cF\H^o>vmUF_rȡsv ǭ[^"/ "[xT\} nݺO .,}Eѷo_I$1ҥ u.$     ufDʞ@ΌQF w`;T ޽['4F@ +3B!N8= qwDxi a/,y9(ʗ//s|}"T X(!F˖-Kv$4      6FP@#ڵK~mA Ϙ1Ca5FA0|^~]`+3C ōW@iӦ C*ARkD7|#gϖsJ dСRX16 DZh!2eҢF"EZ '     @4[n:# v镠q]"^x.]:Aof e10rAѩ:u GD ! F^/a$x`P4      +z߶Ңh?~|'1;mxX 6buu6|Hbڽ{w-Ce}:Çd5r1 Mo!*?u@hʖ- W8HHHHHH J QE1BhF9AΌ-[+Wp }+%W\-zH0 ]m$LcDlү_?AP?ub!&?X8^ /!\壏>_Z])RЌ_fx$O_U\     x Dِ3ɓ3a@4hm m !}g 6脕X˶_Ν;'UV5k |]tݻW  lQ^=QΝ[Љ_z1+H+͛7cx ~h!O}z_|)T.k͚5"sM E!ԪUn[>V1'e> xN J -f͛pׯ_oojJbŊsKL>]/ѱcG='Wcoe׉-z zCRD d֬Yz HѢEm۶RNjҲb yGy>L̆\ 'OQôR~}iӦn8~/Uo|1m/36FW=,HHHHH^d1'Q wQ#E%O ]y-oB92ܹ#OYzTE0,BQ Lx_6UT:ytF~`ȑ#gϞztG4      ruLeĉ>P R[g ^'4      IA}%FwYfi&eCOt^-[!>+ 94$!N:IPP̙3G a/ѣ~I'cE,HHHHHHCNp. @$&H|p4       k4p. @$&@A#6HHHHHHH k.K$@$@$@$@$@$@$ PЈM#      &@AÚ Db4"aHHHHHHH Pа¹$@$@$@$@$@$@$@H|p4       k4p. @$&@A#6HHHHHHH k.K$@$@$@$@$@$@$ PЈM#      &@AÚ Db#q"uƍ'.]rj,'vQdSy$El)u4Č#j [K$@Q-eNtfɓ5| $0q~tS'u$9uMjV&A"ᢠ局o>ׯFǎҦMɒ%S+ϟN:IڴisKղA!SN_%^+/K/v)Lp];bϛZޮ;Leqc  c蛦%6^w\.\ MG/N\{.7(hr0/^#;E*BSeLjlhΊesJ@<韽L_rHĊe)a9YdeTeRЀ37ВI2{1=ӣ{_!*-|[d ɗ/]sOusѢEo?3$ A`bpСJiv;ύ3Kp4.<$UhQ咙" 6^SԻZN1MO4{t趯uf^D'+[$ dJbv`= `%H+%M.OUjw=O`aXAmoxWyϪVۀ>!] >NC#@Yn cǎ( H>y5[l3gΝ;% @T" 4]/2d .۷K~8w5J`2ʗ/C:\r2rH9}TVM5j$A[]v<Ξ=+cǎ ,XPj׮-y:;e˖6M4Im+b^ >? !B7|Uu{ٶV؋Is2@Jɧ4W ם-{/G1YBN8{Sf,9,;URȑR"srZ3<|,][,mʄN3|GdP@)'4Ƽ}rE\a;yU8'͆Cnܺ?_ o2򎝽Oǎ^Sq/U(ԯS ڸcS[Xr:!!kˍ;#xzD}|I[5ϗFqʂrLWw l ֞goHqT{JȜԼp~j2ՍkcJ 'RaEd}Z|d˔T>V9E+3n>ٴM?Wdw^ʾd)}_6<'ן].Ib=Y0gJAtM+ Uϛ1szވ'svn.xR Tg.8﬎Ѥya#C 3Xg@C띚po߅о8~U\ڜSGx(2w<1u9A-kbm*|7XM-+":{_hKzN%K_m1n~U)aUzpq4䘀W4OF-_Rw0~=+6օ޿6lK"]tZ8XdzYʕ62etY>|;I&UVɴiӴX+Auu=V+ ,Z72gά˗ l%zv%ID !i;w>ڵK:$aw;wާ7n<`vZ͡gϞZ@5 DGBՃ:|-h?pcteŇE:o[j73$֫.t~X Ƕ.B ꂭO KGyj0[?nlٸ뼌GZSD>o,zkwCء:`N @X" )$]Tȫ [˜>zZ%)Ʒ4*MMpO b"zօACnn*U ^q% p繮*=B|}qmEΥn|uh+P5սy%:,XvU]̓;4|%A:tdʔIɕ+⫯$ay^ |?=zHÆ {n#J_{5)R?֯_/Jd74n޼E,3f@׮]WX!?tŮ˂ FOߵȄ Qzu-@쀀;|mV &-L2z>g@iw^焂hha@xXᄪcO*(zK /gz q,i B-f[ U)S(~&HӲRm6)/}{s>`[nչ[yi>w N˨_Ա0z,ZB R=Z}J>fWw 0op~J֐CρC ߦ oV= 03LD nxT,鸽7I0|yܒAiM fn^i:AԀ+ԭ[Ww1j Dz_g}#O>U#0f/^:tX _Ca'0KhѢ'NV#!)5[nq_ze3tҺ>|'O<'\'g-VVb ^Teig_Iy@}3D \_/_-" BHI<0Ɵ /BZf崘bC=a5\y"@~z-8V(a5<@Ȟ1M@xCPhsHwБPugurt X\uuʶ0A~ 15펜Y.S/\VƂc‡7x#W % !,v~~pV"=a20x-a@xGx&<-<s|GG%!,a1M=ps̛XjB?;|X&f>,`ex8^3`ųm1bZ~/~ԃאҝPa ² lޜ>) B|˓5$zI< ֑Sޗ1Y2:mk?X{n妎Gbr+bm:ڡuȾS=侈Ο|0݇/fhۼ<0`D07@7{ #kT 0>IW'!<[ 7߅;o!U+I3GU_lޜ!l! \xaqkm0 m~XŒ~}\FAAA8/˴6~p̣P<J A!;f.|\X6Z#W%Rȑ#}ٳ[)SB3 "$L.yI]PP׾}{-`ē+?:ŕ+W\mcOB۷u[\s W|$҄ؕ%}6rG´W74Zp76yTINIXk,j|axUei2KxI['[z BRhp Щ@7ķ[ :ƽvsj^Zc%cTŠͧU#,^3x F=|wNH ,*/  lޞ2򧑛pmXVjƽ^i]#x 9" 0^@IUS3^#߅;烻Z_8Ƕu>0JAo:1 #5^x|<箅9:g_rg;90ӻ}).y %Z5kȅCZ#ǐRF¶9_ AA% G[r3C"aW)y y\]e r#E9gԍՅ^?dLGj,VEdIqrȍj_۸f 9, P&VOĺ"?oV8Go >"!'4oWt{cվvXFS9bniwL #0vd3yxa0E:B\u>XjOH"5 _=_KxgBFmz.p5mx5VZט`l'$jBGt1ɪpqA6< aH-hTf[Y!;oஉQFo 7ZeÆ+%6ځuÈJ h$@C#2-:]%kXcpMvy8l9<r@  8ڃ+r  . D8Uh,FBƍjD0[ür$lIJ<mq;–1m V]y!R }=cLwn] 9=Ba1(ӛѳ(F2VLQR0;se sqax`j[_o*< L"|1Gh9x6jH|zm͛ظqc==l030/]r I'l͚5vmC Ap Ad>!./_+ԩS ͐[/#$2b\/ZwBw16:O>mXPpc4 q?@X)ۄYO%(+Lef*`VO2^U+x+{g.$6 P4!IqDU\-ڷt)j/Hwo!@üN֪M0rĂ5'F°7 21ڑ3v v]= 0b FE|M /Cn?,CNU='3(\ CWoqo{ Dcx-s~ pw%hf6!BF}-q8:g֧`17\`e}ݼ /ެWmT-& b}ڡ55U0dޜpX!ngus[h7R?6vco-e/0/i׿[1v #7pƋO( Ae:)&rf BQj׮s]6P_0B F?^^reb ٻwyUf ,G:ud4;իWmE QdIPxb` kڴNP/R AڨeZ(nn~ L-8B0UߥYFGe}mKʧ I.W*ގ +CBMxvT~)Ks0";`H|lĞ*'_*̨j Z!m{^HH sE82A_s<# k~voΕJPJ}* 8pN,ufVPNg}=¨/( ^x o_\BJ sVEモ T.rctU>CcSK޽eʔ) 1k>}SN kժΕGy;ƌ#j0T, eʔnݺI&M#l۶M^z%sGH˸qdĈ($y亾O?T RfHt a >O҇MIP 3$5N?wޥ7)ެ|~w˴ZrL2Z- G-x4oTX0o / l}:>.ҩdgZUC"."tT1xgoxp paGFm#tSvsS  HELtDܱa*g۳7Ixd[Vh}Z>_1?7ZlF oqm5S~zsNJSZ.nbyZ[S"Ղsp :L%Òt][Lt0AF6Nz91{Ϋd^{xVu3!w7^ iձuqΡV;Tޞ8FHV~w:.B%w I=78a|pU!X@ɨ$z>G9Aux_Wx##`Mt9{oZQJ710X޼o$? @)ܫ#ad 俬\11Gm-ܣ}a/2z [Ca/ a1FG <y]ҥJ$r&j//ܒs˾W{-cRFQ!z{(cfm. %mʄR,oji\3$pQzDVn9-=岘;6{Y9yMI,I:y >z,룧oȑS9!u6zūw䧑D5[}P\?zl4~4-iomgdrT1o5WJ-z2Cճ%'TסC;,ہ_%}A.(냷N)݇u-ʫCo$ Cv r=yV}Zر =&Y`|)+8AcȟF\[9HH==W׊F8 6m#GDaY`[t%KRXvڵK.]-ݻwޓxŇ+Ah@7H$agqcI1 ~ {- ;@tetDoҩT(i;<,Bn8;*xYˎ.HP@8*]ک%Pʸ2Ouќ߾&bٷQׅrF !ʖ=H3n>ԯ]ڮB/&<|,K֟) g^-#smVm3o1;Wq]u@U.:${\_ޛ0F•`V^ <zuSGվqV&? cr1shDCJ1W?µuuM4N AcwF{}ɢ/]eҿ}R&Szs}cV$)udו%v4g;ߎˌ/-b4o>%]6VbeOrpݾ BNB%NS p"v^tnDe':a8VEp @ <{cAbŴdV8r,ZwRwܩcNRv[I6J`J0pVeiw yj?٪ŌKvʘĴJ9`x];{Ώ7i%g椒Sy9n3B Y1Ӫ1}a5JP G--7VCBo( 8w~_q/dNB)B&:4]m6V[}CBRzwَ]ebN ܟ;~TBw$ a./x< ofQO:Wݕ0 yա]+iXS-M9qb `Ų3?ޜ(s٪%CGOǏK`dž\1йY >O61ɻ޾Roؤγ82*J yYW)s C']q1|ɚ!I]rG///T** -z{lW=&f` s}ٲfi [{f|V'KU)EN=8Bjy`=S'nKsGHxYq, yTgo^o5xo 1 gu~Sp7~sk#',z*Z87$@$@& s рkرc$H@5k&v)Ǝ{,XPj׮-y5vrL4I8sd˖Mo8k@8ټy\xQ_R%6KݍMmm/?`_ ɔAe"C0;/=zӪ%J :?| >\*TC9fΜ)mРčA[(~YOm+Z.sc;{-O^ʼn۷ZRoڍ 8M8~UΕ&Jɗ=v?~ƾCxcG5Y-'^|XmwŶOsMWfOX\lPMH38:-piToxG)ϑ:ZT9R} m.ˮ:`*f=4؆Veޜ(z ^bDyj |)!]b.Nu<+|b"HH(h):SLtҦO.3f̰+ EGѹsgqㆤMV4>"s?Xmm6i޼C!:z4Ί+!cK˖-u' I&\7nX / qǾ8Zƌ] hbԩSK7H(fx8}>a3+AgժUr-ɇ}vI0`_(`hQ~w= … X1tP)\9e& xO6M e1,_\, ̙S7[hjJ 5#7 1 o9|!?^'O#Fh6`%KU4 AˍVnۧoH;p2O~0$u4tތ)S=ve/gt. R|R1id~pH:yBeL@01{[ގ&5y{lݯٚޜgjHP{Y ِ 9Ww<=x3.B\$A̘` =-{/'zwx5! ¿}qrFuk7×Jo!08vU^qdW`1̛=s1eΚ1DDG3<4B\Y:=>xv7ͶHd 69 `c0׆xm' }W U3oYD^fÛm\֭-ZK*e^.]HƍuiFwJ 5w@;;bt?s-j+VL^0fcR.\3l3,4jHP7:/sO:Uom ܜy͛2aȔ)SjD>nݪ8qB*W,1:Æ B ɯ Uw <: nE={h1<' !+_Vn۪2Ou qe7o rE3Fʕ+Wv횞b /yۃzsh H{EE@i`ÂXPPP QEA"HA:47]}lf[UX̛7Ou&SNck׮ںh ppS>1a{;}MbL*U܍!b|~ocTq |1Dlttprn2Y djA  y":&gqXMaQL6Z H )uMJKܿyV׃`}5߯#Vmt+'RnINM@Fto&m{N{sq0e8|"Q2Q&NVɨO3X[q%rюi At[c>c;ӀG6o X F[  84޽D~֭[KٲepZYaՀ ޵kפ_~.eμJ*ҹsgJU`q =~饗2dɢ'Θ Z*ؽ{<ϼ_A `bm~t2=UNE bp*pu,| +_ㇺ`k܀h,&+Xbp}%XXeֱܽ{w  piҥK6qƝ诿8Lae =(q.]j:~5mڴq7w7(7՗}} So>m/t^& ސ?ݨS q1=>9 xFJOׁ몘am5c2li:YcVQHHB-40,Z'NM=G&)&xCV1?[z޾ŅQ..rdǎ%$1 6m' v@9v0pnFo)FDp]A#FYGyM+NWL]>1PY.3PO^oNq >(kdb׸1uψtkD拨^pT6O E70Pq[|X ˥7B%BEÛYXk̢&%.]6ᶌ }q'ʴۛ!m Ǐ\CPPJ;&p]+v~㦌c!v̛/(!&V'TV-:8%*AmѰVVT!E֞IPھc e໋4"dtaj&*uA\Pyj`&. "up7-dĿuӨ8~.BQC1_8J) ys}L.?Q 0R=Q>  ;@ @4&䈸V٭,- ןDbn c4 K$;K ɀIU`m#ԖKw2wX.pAQ ܐr1:.#(*&L,&.Ÿ`9ebzAL?ystTO8[hdU0|9PfhT S6EkAbM<&m ś<'wFq@,I [o6zxA`Ds AAjҫ2ńAv ] >#ޗKBv(NJjJ}?@y$|yXY%:[ V ~C)@_`R4&pVb=ZpGøI%UaeX rxĺ7Mz׋MKz+r0joR凪oT@>opw ݈KD! -Thx &n $nCa2Y u/P,}2@ ^\)vڥ|(k \8V$PHW~nmܸkxbT8` 쏩@q&",,IҦM{3bz_X~ 'O(L#:AK)E’;9ftu!+wBIE7rA{wX2w>٬\,0f ԩjFvA@](4`MpJbCVeAu[{*ZO!Nb/ou IU: @B#vZ/P WAPDD;*bX :Tpؖ͛ p;B(:({;n .7}ko PV_|6(2)l;:,=X,\}@LVe$14dyWa2ح $hYwo7ۯ=u ao]!aL~GD*4oM9~32 o)23@aҌf1)mS6?'yo2Spo@wLޝ\xu2U$U4g0Rş.,V^ZYࣘz+edvQe 9`wj;nEPXdSR.. 'X| #^2|W)^.`*VF q!xӏP >Xڇ@9Xe c _/{S:H EYf]edŪ>1(br`ׅ~G" 7w=7Nǂ'i@Ϯ@y  Z"6GGp4*Ym ڱةsWv3r,7; zXA\COocSg#gu_\G5 eˮSzQ|CS ?͖r*eK&J灋&'&r6lh6;~._\[38{h ctHj[X[}ʂ=s*ZU2cH1to[ٺq8XbZW)V2v;`2fC Dzuݕu&mvA(@q%ZtՀُz"Ul''6ܭDҺߺ ċ۔i|.'?^NzUq׀ddJ +\+jҺl7Z&U_Y &Nڜ<#.ĞV[÷W`2fyF)O,dm]*YhPq$jsC*Z(Xl sMGÕ ]I3xlOKʸi[ia݆=  %pWv- GLq.t@fd*&@Sڷo]84/ׯ3f){v눶m ŊL1J 0ňys/,*Ur+gv`R&52<>ш֮]&*X[ UxS,Ͼ}j܉N::+<,*:uX- 5/e+6EOYie\A@= 5y0p5;wBK40~C9Vfۤ9o C… uV] {Y``s-CJOOןHO d<dg-[6>HMVo.#;vɓ ERT)iϞ=]w6( $@$@$@$@$@$O Bq[n'J9~ɓ']&O<:Vxwܹs={vЀdҧOqtRiݺ\zUf>}z3gn JY2dv3fH׮]SH!|wұcGС[sdIxNnvF g(GpN{4i.Ǐ/[  Ν;u 7nvـrgϞQƜؾ}?^7cŦB*7͛`, NADu'42dz: Wai_k(*slD `"[o`2S ~BrnY|7ƍ2l0ma6K.2o<ׯxa7PZ=ԯ__%J-5ڴi#})RՖO_920ojժJ`b?E^:CAc2Zc /uAp1,*4,YN`sEۣx@_m      xB ^(40wR7xJ_.+W("իQ(+``LlSJ%k&ց \Zhaݬaq1 X"ԨQ#լYS[ ևU0чN 裏z9 nٲE[@ vˆ t[XjPHHHHHH dO|?SgXl M"vR%ebGVClRQ /f9`bn uMԪpҿsBlYG"{ z(-"nXPgʔI }6iD[sr`K@g     UarN 3hވ, 440AGLM:RS_~E`Ѹqc=͐!V:L4I[N*1uTg8f Ҿ}{kU/O>U(VZc; Ȥ[#>@quxMw9}  :uJ+g. )Rd޽zdDV66WK")$ ̍K-7w\b(H"fƍq,I$@$@$@$@$@F !'7nۅĆe֬Y y:S?HHHHH+ _mW^UV` vU[t)M-      Th0H^z:'b֯_S@ T RHHHHHH IBq/ ЈS       F 6<_      ЈS       F 6<_      ЈS       F 6<_      ЈS       F 6<_      ЈS       F 6<_      ЈS       F 6<_      ЈS       F 6<_      ЈS '\!'tv;9^CaHHHHH +?O?nݺ%;vgʰa$uAl=:~ rwrO̲}/Bl'{Z?r>cuCr9iBM^*oܒן.+ysx5r%y}-S*] u6-<`arOWސ"9*8I^ռn+r2 J _I\._,ܸqC:$Eӧ~3ʣ>epT)ܿVR$ui)4/-Wݔ["ӷ7\/6Oq)4* vx[P2BKlr]%y$e)x4 |$Jٚ<[     +,A^ "cܸqrhhҷo_)ZhPh&&U#B"5iS;+4& zXnݞ㤼kʓ^~8R"8 TҢhvcm4tڥH߱ЭieFGyɘ>RhwX*Ӕb}mԽ눯<     chE|'PBS+Wȑ#z4E{fZt%S/}zoĉ]۰/uJge!_8ۡ"NH+hp+9+&deQ]2eH1J$ûו eԤ܅kN\  p DAQnW=b̙w^I**THZlÇe̘1qF:pKʔ)#M6%JrӦM?H套^rgVYx4jHj׮m6OLq5khk2uu+g]5jl۶M:u$ӧɓ'_%vL2I޽%_|* ]ynwٷo 2DG  ]v_۶m`zu„ V*͚53E>/_Wr-o>ӧI&Mj\Yto+8rFr* E`˔.*/6+V#Kjih:_r<1>Џf{$@$@$@$@$@C ͛ҺukYp$KLͫF`b =zhņӧ˻+Νٳk=Z#O< &PL:U|II&r*>SٿtY+%mΝ.]:ɐ!رcDgϞ$.%K9ժUKܼy٥?'N>{lٺu6 8BJ`lԿ-ZEɓ'@A`iҤ$Mi% 8vUϾ}vWB k[x_lH "緽%[0d妣ZajڮrOvXB#.9HHHHH p&a9eFDz֬YڒaĈz KXmXʅzK.baٲeb h@ (:``͛7XZ.|͚5BzkN[U@qn: Xh.]Z{ʔ)gΝup>LM&3f̐oFrVs}[akUV鿟~IUf>˗/ZZ5)U8qB 8#>PxꫯJƍ^V,,׭GUUJ 3._!$Y㘬- jjHHHHHM BIy,|ADɒ%B<6]&OR@l֟<8qvzubȑ{ny_۩(r%PP¸}x4z{J>UXbxXu &ʚX@{eQEߺu&_~DPmvlZz*=Z%F]ኁavX>SZvqHHHHHb6.`VrJW?S a>\رck6`E V䩧n˅ ֱ)p!2G!Q)6XUȑC֯_)b /]UjJe-dQhQVfnw;p|ZI$J|)j $@$@$@$@$@$DY`Bi_J9shE5RL/)Ĕsb bW =*ca 'W^џp݀X$q%O(,>Cm!p8y MlYN:C^/TƠH 2O}i-KSNzzd fNuHHHHHI i"(e IV~)ǎGB\ oq&t4h 3gYp2eN۲eK`.#w}7:dРAqAKH#H랳]}[9< v]<:eSABUC:/{̑sJάidYx͚1n_-YHHHHHA )V^]|2uTM%MTqԩNjm.#cǎQFѣe̘1zwƌuX-[Zmf͚2ȑ#^'"Ā֭[2eJ)W[Zy`s͚5b; {B=LBUҥK8!O*P { TXjVn#rȥ+7dϙa:EڷWܸy˱GF'~J8 *y%{H!ey     D,p@ TLaqaO{;wNHP#F:׾~4@1M`k(3筘vűbxU9~ɞV'KiIHHHHB0 lI&f̙RH @!@3L l߾]P'G$@$@$@$@$@QFx3T ]+2@J*%ǏipC @F$PD dAM[hej$@$@$@$@$@$@aDa4X* @$A$@$@$@$@$@$@$@F p1HHHHHHH@E@$@$@$@$@$@$@$v!cIHHHHHH5@$@$@$@$@$@$@$v!cIHHHHHH5@$@$@$@$@$@$@$v!cIHHHHHH5@$@$@$@$@$@$@$v!cIHHHHHH5@$@$@$@$@$@$@$v!cIHHHHHH5@$@$@$@$@$@$@$v!cI atR:a- O  53gJAq}hHHHHH Pߺ8~xy7e͚5bt>ÇG}T*ϙ3G:t ٲe/">ρHHHHH 2P6=u.틾pزe|b {>k,ٸqOB(1'N,_~+W. 8B 7@VZ%}K+j*!mRxqɐ!C:7 @ @L͛Wr9sdϞ=V~~ƌc8lHHHHH P񋈈?S߻wJJ *$-["Exmt=ܣ̙ӣΔ)Sdɒ%:Bj=zT>SgsnJ$IO>ڽcڴi_ɩS$O<2tP:7oޔ_~E֮]+VPA{9Icu3nSO=%w}ۺ?V^ϿiӦӘ1cdѢE! ֭[KѢEڷC=$/^^z鱵 ֺjkB$@$@$@$@$@kƩW$c=F1Dp…z7,/_\ƍ'=zЊ AnݺeH9y޼y2zhN:*~z8qΝHB+h;رak׮`B FP$MZdȑr]_(x &M=?hJԩ]rJ ˗z?3+WR/={$eʔZ{nɚ5Vl'OUJ{W\۷ou(H-b:%    SjbҲوL(hPucKTLj D(˅pFM#z&XP&zR8DJ)QDÇQou5vێ5TjK}؀~Ŋx饗"Ԥ[Q JQeP^)"DzjەuGsNJi|J"%DRDҥKݞnrYM]T|57l&=lR|DTXQcԨQ׮]ӻ;3:ZEwR4;eڧZuÛP)qmc{u]r/C)\+xI&C_~=?PG\׮[ ( aȐ!AlM 7!4t2O_%:mʙLpŸfym۶RdIٵkk19>Ĥ@Ț5kj|*(̦??( Zh\4p0b)kb{ %(\KT ~iE :boS..>`,G̢JܹskVvqpATlٲqttHHHHH  30ʞC{j3_Xi &H1YjU8#Zo'ɜ90g5X-H O?DL`]`1Y+}]W.":~,@qAp˝;wj)$sjРc`%Ȅ A>oĪp]LS3^ѕ;{@' DE l8 pRj}q@_0 D LD *ݻKzPT mBBwY2r-,@ 3 p krpmDax( X㈬& 0zuw_D_=&,W|V쐾}z(mIHHHH/Rh`ª0Ja`?#c}$gaZ$ xd@#f2 ^l 2@㫘sRANdzMr0\Mp YxVfMq\#*s'r0O(`?UE X;QHHHHHH@Xаwܪ.:L{bZ]`tFHc4o>|.X@ԀUrʥW5u_0*nihAE1TL\M]eCqmwܜrq.p iӦ)1i/@HB$@$@$@$@$@ˉD9>1BƍC1Dq5`:oƍm۶ D#f̙3RBa` *mZJw~Ć@0RĮ@I +&̘eʔYC&N(/_ʕ@.ɓ'ks tn g!jEn>66(c{11=3fhiXaÆZyndܹ. ߤ3XDE:HR\+cdz %5Ը9sԫp04 ^?Bɾ$@$@$@$@$@$ ;9|իW_~E>c=FV&HکS'~OyDW^ڲc͚5z&|VO{,$*JL&(KM}5ۏ(I7> ~&p@'A| ym:U.@ygSP2@Eڄ 0E%?f ңGiժ  "P4?tPXz~=s2{,ZބVvAeV9@tށT)u!PQHHHHHHDjm'Fo[Vxn A@ΩubH`2ZeӞ={Np?k`S+Q"A-B+쇇ef˖C9e/봎  kS@! 01.!]=)q B$@$@$@$@$@Npm$@wsO.ԬY'    MTh渰W$ ݻW~iAFmJ֭4< 'Ȉ۹H`AY:A@R BN$@$@$@$@$@$@$@!O!?D v"\'      yTh$@$@$@$@$@$@$@vTh؉pHHHHHHH PC Pa'u       '@F;H$@$@$@$@$@$@$`'@IHHHHHHB!?D v"\'      yTh$@$@$@$@$@$@$@vTh؉pHHHHHHH PC Pa'u       'pW0tȑ#_ȺuÒ>}z)V|駒.])ܹSNQdɒR^=a䯛$w4ҰF~|册mT(Mܓ#NC]&?L,&皔վkluRWb$qWݔQ5]ñ=86l?!rųJr9:pV/q% fxl w{$]|;9%MNQUӒ6U2ܐ0ėg1Z<˘B#P#ŋ%sRxq|XBRNÇ3gJ~TRvء%?x+4&-U KWːSƚBcCkd ّ~59ƁBcLC)ReVm:*?.O/*KgRJEIVZ.;nEDHϖHD"ެ!%6x_t{dJ"F=. }ƶ/>Z :mC^oJ}F$l>m~|R>+4B|:X,4^׶9qz+ "9|N4ȡK=KQ2UVK$ItnܸZvYdƍڪÛBr2qDW ʗ_~Z{%)_©RVl<,w/ CN<e%<gڃ QvxǾ3f1}\+4N"ߋ$)wz~|>fd͘* 7t+]\_":&x*B qR~cK+9GjebG ةKf5N>}݌Ψjw}r-p qu9N\?#̉# @$NO͛rJI4tMq]Q.ׯ{=p |{u-BDH攸qCbm+"V #XBZWrdNMF4Beӗ)A]1dҠZٜ2[mɓ=U˷k *3ZOΜ*=uO` j%IHlͰءq;|,s{!O:ɟlɓEn0{H_& QFq˸ g̱uT"pA~ϟ_'OB޼y*W\3gH)9#o3# ӥN&.H7Y'L6wܼ!+m$N$勶\ T7b뼃jGj],X}c;$Spp,IOpcN}_} e=. SghBڵk姟~G>wbMV3|ܾZy=PQgC v=^Z鈜:{UY$/WU'K$6.nX)8_V߭>NU:Dgܳp]{y]ϙN_*x~MglMwb?Go*KVMKhy+HKdd4JYglWk4X{ H MAܙOsg )QT̚I,:=Ͳd~7<%'R\Z4(ZjFKuU.v΃qqs7`=ۥb\SW&5 F+Rѿo[2ůl,Ңa1mig"U[~7` >\CkM )uYT1Dk]w߮koUK;=klNMud6]/)gqϵ?Ld=@LD8 urA@PMoP7nl'K0NBc۶mҡCAdYʸqdرZ9ѳgO7}v9>Lwձz5s85]N p:|*%M"$eN jY]ypo #K'07r^D&LO0&\W}{ݪ0Y+4v82y=9pVWYU0]J59ެԃѓ{ON/x@̛38!u~߷[E .-}Aj7mn"sV{e̥{Ԥe**׼ʦb@Pp^7&X2`~񗮇X]\bRaZ(Qnm8zA{gC]ݏq^\BGqHDy&nc:Χ~R?%Ux3ߦ`w\o V~ RM3>#[rw`5j$ڒ`Fٛ7|S^}UW;dupիҮ];ٳg@qѲeKuM$py״Rq95kժU}5uЊjm5+'xzK % {?#Ȼ6uG t ~oTs{s-Q)eЦ.Ou|~z~h*ޜ@XY?b"՛ &xGPakBjlj@}E=|&PLGL6uۨ5/寿;*wyL]NK':Os* ?2. f Jm&&Jjexڢl=1a?o X H< 5QQo=b ʗ*|t5nP|8jne; Gړ:XpYdi EVEJ"G8>̄2Fv P;OM/;+jL|pNoXl9k5c߃E*sU) `6kzKzKKYN\SEL%?nWI"څO Ų/P@ (511;[v}4pu &1@}2"_t0E0QN)$C)%F2+UUzs4 i/UʊV(htބ8C^;xtm]Oyo2̴mٗsIu8k##޸`YaHʌJޢAJ">Jlf ):qσ=eqC#{sFZ K/<b|/0bq_DNmq gŷsK6GK2ꠅȑ#dye$W\gIĉeȐ!Q6r*El\ 0rz͵7!Ûؔi7t=pXxtY:*) VlWU7sȘ ! L?~˴ܑ2x ކ&!JXcߺ~#fOL nm ~@S?1ƛàNVZ9 yP]@%dQ!)"=Z #tyKx~R^L2oM;PJ@yQ(w2lݾ.Exzh|]?xP? C]*(Z(2( `ˍ-jl1KLarrP9y沶`iHI .뱛TbcC;piT3 Wo1"3oV4g/kvD] oLޛS_ [vW{\Pe2Wp8܋b*-9Lal 㞇\RF[60azL)ɠ2v F}X!&Jn3^Rarۏg֣;'((e(J e9,}j p·p}o6 Խ\2(3r*e@킕܇LaUS^0jWť@~: (pJ|D}9@W(D˅:b8@._f(ެfNDk9ebm ~Dabn f?xiZaǃ4_f#P1|hz,oLF!'v/rfᥚߛ&ԉUaSq2|! aLLة|a xYkqTž<ݰE`&h]lRoaP) qW({7V̛--=&rx u\Bf"譭DŽ]TUM|LlbS2(7 b!aL+@^E&}cO )dΊcK 2päp 3ᦀ?t<@ŦA# &)!xV ,oLtM92nC7Lz,x#@!&P& VG,)3~ʥz+x+ozZR%!f<8.W{qNūl~ӍkۛDwZxk×n[@dT6cImlmv=`r$m ~S%>ebzr[pk@[rd/ &*\?c]p+e|]{;mlhW{̽dS07.h{W UWuEcJ Ss0^zW&ym)(plnb|Lۢ >sVmC>l3S;YN<9H PʣsgϞn%9s:p= A6H $❀y؍2ۃh<\;L~gX'xhtP_Ԋ/u{~QmDCAs:p(bUq7m)Zx$RFn`3v*0R'`åˑo|5qΜO*3@ >y_AdAp\dׁEp]#0T[R8"дHdYS.朼|9/t\0OLljt  k߇u){((3.PhImQq}AB S("b"xaA{$MA .X?%#rЏk= !?;LJ@ ɓ'9rÇeС9Cv5x[k1/DUjK_7GǨV1Ț$ݔs*6ex\HwRA0@_ *p[̐ ?i'.>U=<7/!&&edzee?v.m }<*x!c[ʂ@0RQ 3F| (d DGD`X=7:Z [@)W`@C&!,-Q0U76燶*2Ҥ[JRhSޔ~El,=8Q/67;[eheS7oUL4׎]3b~&,GD |^xF]֕pP(o (6nmSf`1Q;Mv+W<$`#K̔>&\ɛM]Øƣ 9~**{vSαavʀIϦhq'&Prٕ蘷T0Gp8ei"Pa RvLy+v 8tdiLˣ{+f:pXdA֗8c`wXoNudle piwN &ƭ īh29 Pـ S dlMR ӣ?Q~(ZX=@QiMob.+U^ߺOE*Xm8Jܾ-TZ]G 45NpOC&b@q4۽-ԛ (zqoۿPN1Mo/6RA!f Ljpe~C/@B#\F*Ԭ08plʕ+ұcG$ׯK>}M6u8Ui2!#Tn-FNt?Gj"{l󀏢hK{/7 AE@@EPAAEtBC3{ZB.k<6߲~14x':.yx O)p2ǩ8 4fDrɺ7; cV-d- iU 3x_0Mw'5e~_{QF\ܫγq`&ch{Nq))Z3D{lƀ* mbVp6#YE'n)\cv. GVuDqfqfC̕VӿrLn4@}qG+[m+ 㞰 Bcajxv札ihJ50fm1/ϰ SKWoPR7 Po|yQ -ӊúو7Z0#_Ufx.׫E|,W>L%b/\衬J2O~7G {3g D5Ni?BQ7~b:9MwA ]ZсEAuhTy"(ңx'&@AQ_*˖-3`gD1zgϞs)ak6g^B 2p@9sꩽ')ReJݥQFW KN\"+-;aP?{p}fY(I;_֡Z=!0c 8RЀ! t kaڵU\g7B|JD5vHxl0{1\ >Fy+0͌Ư<]o! =͌s!ɧ#VIqn`0OyzĻJhc:sZ1Fٞ~"*x#8l=VބY $@IDATs]V\K*l+1M|qz_ag: ahҖg\Fp0zVE{:YrP#ߋaoߋ"x>}ӵ| ?;\&@#@ Pm4pMrq V/\'tڃa'/_3:yh|)%-Sn?|XC/7z*j  x=`FO c1.4ꍲ!EHcDᓗpwB|ݹGʝѥx~ۤ^]y1l٦-SZ9x8Wo|yэK4ㅡ2ԮҙSр`>c:e4J8D`TC WL0DuQs|W﨡xYcjaU1NA@F\$V?תۡW%cC۩EiyK}j<@Df?6G gC#4BpF] ϫikT 40.u c{\ ͸ uJufc2򚡑 xNCN{7YCctC=9ݥBt!x-zT  /GձP~P@D#ӄ:{ !9C gtu9yb‡q0uȯo=:h$@wܘ+ ` 9fs+[Uc۹L@!#oLA#0o6xUQ@2\?.@ xh#5 ބߨ M2o2 (hxI(/VSu8rQMsT|F)l$OgxA< E)W,.ΑB$be `Ǡ\,wh\WqnVsљ"^RGZD*f̩R&{1f#DDZݹsǾv/^,ijժ%yu;e>q*T!J J$N ? ňjJ,"w)zp' @'G|޽+֭$IH>}ĉL˶GݻCm0DmCCwAzj6m=yuezH0^xL/;Vۧ6aYh^ߡC:srبV>C2"… e۶m:pjRW^ў!FFZn]=ӦJ* 痜* XOl>v]KO*V ~϶OXt#Z{Og۶/\)Uesv   x\ PxW cęa A0mz~Ƣ ={H# 2eI<~z:u˨Q7gꠣ3fCE ;v#>2sL-T^]ƌ#!1[n塢2۱c]!`0㜌uk׮. 3er_gϞ]sx/}5k4ҟr08 6]Ѐ1C)YgebӲfI=V̅qY -6<-F7l|&-$J@Y/wYZrPϨ2jX;J8|΃x _V0d K 9lU±}Y[|7Or]hl1%BPPت'$i>~\ \[΂kJ2 ^p۠AݓSeLRׯag1=^{|-. 4 rؿbƔ^"Ν;':u;Fǎ~[AJ1> tM.]*Ç^F~XBbh 8Pիgn/ 1 A8;wn-.\X CgqjX'PJÄ7*z;_'Wݖkϰ2}Q~R 'ؽAg!2cqNRRncu71Ǿkt*0%đA7ȄYeJl0n{9bv^U^W3&]!sF6 i۷skO߭$geȯיw}:,    MӶk?;4۵kgȘ1}͛/pi֬Z̙3 o 3{}X-큁}5 fPƍk1q. \X'nL8s^7fz(`ƇjzNxBxnu{߼#?i3o6 oZ==)} QT(UREH$qBύa0rEn}F(-8gZԽ3pII7+J zSUIHHHkxL.?<@ P`GqصrJo gː!nË=ٝ:-e˖ŋG:Z|bŊHэ ,f0 a>[gJT{ᄂOc?~ͼۧ|A)!j̚J(O_t sfr0ӈeO-<`/0C%9r$Vàh$@$@$@$@$. YU`0/_>frtH c` X)S&I6%(a j+Wo_7•o?bT33b=؁(.k{HTˢZ6    pE+2v(!h\3#(gTB]tIZ*]\;ب}0WmT\2!$ɓ%*(b<F{1 ,L&[HHHH >@W=*} y3`h ϓa2ie5̙3*U**mZЬ`Ao!0 XkLZ6 s<<&   x<0(h]9sbgQhQ]%KgϞ:U)SoC0N]v\z5R3D "%x7lsFp7L8 "UΡޅaJUg}"G|ufO%)]MlHHHHH g"qxH"vsu%f$Ҿ}{-;V=PٳֳA'ËbժUλ|^Ǭ(͛7bƀD .1:v wyG; ֍FFGUCr-z 찊ub`ȂE6ڄk(!u? t>xd1Yѻ*%:gdCv`D$@$@$@$ pI]VZɘ1cd:FDbs"l%ޞZBÇ&MHݺuBl"SҧO/_~ׯgB:u E%˂?<, OD ֙&MA] {bɤId޽Rzuc޼y(/ԨQHիWuyjjX0 jQ,\}DN$Jӵ;}En8naGqG Xl߆YQ`.^oX" #WŔWA#k`CQxP"lyZ#ϔ%7nˢG%mdv^. Pj&HI*yd޻*; NxxzZ__$@$@$@$@ tӥK=1_`˜9tYJ,)_֭[7L" `ĉ f8\r<bp 6L>3 H'O-<`W6nh!%+lX5kW3@0 1۶m°xĹT1/29!ܔYSK Ոa#xeLԑlTFܖ"$_4(Rb >yY1IgJ VE   xXe      x |w <       "@A#.+K$@$@$@$@$@$@$4x  wXa        HHHHHHHd0  $@$@$@$@$@$@$@GF]2VHHHHHHH       #@A#.+L$@$@$@$@$@$@$@A @p&      {HHHHHHH PK P=@$@$@$@$@$@$@$p(h%cIHHHHHH(h       8'NHgoHԩ#mCreM%W'oܑ %JR#'-[JƴeɆcctlQZ&H˵HHHHHH )={D:+ⶠ1zh7o|WRDHe cldׂFč2⏭ұyi]dnw|3v\rS^~T)2ֽgu}Vg4?Ղen$      p/ƍ;u$O`ٶml޼4 )9A)ם9^RBĬ埅dR48GƤ9{d¬ݺ҅34rI434G$@$@$@$@$@{,%K"Æ -[H:u\'{}IT@R?Xw>S2hzYܺ}W%|lj3W69mn'U$VW H$@$@$@$@$@$ [#/JlbS> !Um_E2K J<:'r!-k2,$@$@$@$@$@$@>Gr̙bŊHh޼/_>vl믿dƍҽ{ww7N{u$MTJ,)O2/]?{+VLjԨ!jղLox)[\vM+-[4rTLdj8G%8g˲ J+sF6_Ljšb yqI}D'hW{VAI RJ OɠHHHHHHC8J)^2eʔHǪTKAc2uT QF۷b͚52c XYػwtYBCC%M4.]:4i )ĉ/B5Ea߾}raÆ4W8Q9xھ5cdսsn@yίn ;y|Na.d,HHHHHH K}YjAnyС۷o!f<acȑܼyS:v(.YD-[: j[$*RR~}Uڸ﫟ʥ7*4      GOƣn u:bR/EnВvI63J޽u~f3fI֭_a9sN&L(#F0gG~)\paѺ:F:'b.H`=IHHHHH WD #a(#G83t 6,XPPW:WW#nKQk$K :FI:a S޺uˡhπoa!8O?kANt9l|8O " xbΈq%=$GG2cI|;NI :z2^>t`{ )*S쉸@$@$@$@$@$@$(h(+^ٳg'O`2٦E 3ƿ% ;/?oYw )$TP @{HFAc12j hՠԪDzOȋ5K29$_4鸑HHHHHH PЈ9[2fDYh q[ [cRTv!zL[?'GO]YRJbYUbS̅_R79ٝPω?iޭO"GO_yZv,iB%%I<k{Ζ:RZcâuGe}dˤyy2g{JxV$3B Rgewޗ? uX]yI9ǝm}Λ#׬[_gxluZj\R!mrwNu  4ֿvwիWKťreCtZ`l۶M6o/e8Sc:(W _/[NkQz];j@OL7="ynXFܖ_-uOI$T2@0@C/>LFrwm1l_nmA%JWK2X@k: 4n߹')!erO]Q#26::7t)hY&XeNBҤJ*sUCh]~9IF5Gb ,hxz?GC A6uRY[yHw@->` `<|m.AV.EjZ}7<ւՇ̕Uz"_%I!YRIzLUߏɪA qw!|'Q𽂥TBt1醘fz%JEͫ"4 THVAwi-78}2-@uY>sAɳ/gsN91#qC=!9dqحwȩ2K"yͮD\!  `j Ǖ*_^/[X6llٲEԩWNzƓ徤R  gËvk1#kꝄg^ VϪl}GbF7+joGX< z;4+e6h-f4_v|J2nh(~3v|J;I=IyjdR=0xjdmJ% g^5jʭw]6phL\R}YFi;˺W pG%MPFUWиcVl:{',2X5{lߟ%w9CluH[oߓ>io[o*j rdWoIӞsb DW_("RQSu $9]_G}RKA` ]̄G!GuD7nܐSN詤Ni{TR=|4t1ٯz&W% HE`U(D{\edџpGC 1 TET/w.4Л^~lbvx΁0.^/FYDo$Grv1p'5A5B \TuMh˼wnke1M$mpP5< _!-/"ԗZDYpG  98;tyf6 /57%|เs4oǺa/vhHAqeۤvA{)-Q+81nռ2kKVKVƭc~v!UPɠDjQ v󤞮/cy ;<G*0bnWA7 Q9=pQEy' mكkL 1_]H.S._%v1goS B<l9geFg%[ 5o~PB53:迷;d0G dA³֕1=oN$@$@q@\Zŋܹsu8?WZ%{vAgΜ)+Vz;7o.^CBBZҟڒ1cFիo&nݒ^xAڵkgΪeƍrY)VԨQCjR=. y&M$8~dɒEi۶O-.s̑EIXXI_…{<]tC{OB i 6tAfu֕k׮I߾}e˖wi^|z5KC䢌}T 77Tf:#QCo`Lqlx1ЁF" <*0̤tts2蠥O86L^^ݧ,bjkhxvw-1gd#);':CcWdlv1(<% \/w,TG#P( <pLkc!os}߳myR:rR餆׋9] UA.UDs1ArmC%yUQQqt*FLa-&J2 Vb Vg\o0C@⋡Qk˲LsYﯳALY鸎 d `s/I+ ~qpcPGg3Ĉ!tERI/r CVN\m^n2Ap:Z*1ҁax>4  (hxq>,hî_?;&.؂ axɔ)S"Tk.~J`ߖZl8},g.=޻wtY iҤtibĉQ_1-4ޛ6mԩSKldݺuZt7nGJ~[a @1Cu)|4k[3C ڱcL6M֮]+S[ G߷o\b{ ߰aC߫b?W iyCBBpJ5`x`G XLA&'mQq2`HA.[q^8qd40/*h,F{eH ܀Y3A2\fg=K]^5=1aBFgm/FZw>=P?!03r Pheq w![^`&%ux )>@:Ӄ MJЀɧjz1Y3exgjhM 'GH~\][ vF-֠hZE_>@yNyA@` uNݸol<0D}Z>$Ä ;s!B7 be͛{[p6F܏c'Xt ğ x}¾wHiFC>xHHH >/"?+ pc\/04hr²e$E y +7oޔ;.YDdɒQ"ΆСIϟ/6mx8Cs-#FhP )a„gɹsO9@,7 ֭[eԨQ#ē ,?T"oԯ__}]4qa%u=ŹXiN|6r|0tF:?c#";{QTDwz> a`qq?xR!![>\SN +4}kxU#M{̑'E*oY 0M29bF%FQg0,5ߜ"ޝ7IZ-ni}  d8lx? NcƔ2dxb@WT)33FhӦVj#gΜwiO /KB8gndΝc`J̙u:oW_}U'eʇ=[k֢00)#oݥZjz^)R>C-O2>}\Ok.^6RЋl6*vDZ,^UL; }TF!Ur8 Lwl A01$>cVxgBQ3F_CpiB?w7=gPwRy Xήcx iR<㎙Q0Ӈ73J:6R]341H4j(샆/{%rӺ0WsC4D5囮UUPz6 =z/z NOhO[6wu_ +ejf2۬Ŷ=IԵ3?syÊ>jO`/UX7ðVZ7 aC`]ql0xHHHq&@A#><f w}9`:Va\zURKG:X|@7YlH/k߾}0)S&yNX#[ڴ_7ncbl߾]08y$19%`s=s@4~̂qb;0k;O&yZ\~G\my!pc{Dk B,1)SUs]xv7o2xuT U&ν8/?UX44E' ˩P"gu lCڿ<Sb"ŨJ T";=fAPK 9A0PvmU~^!k5e֓OkUk0 hXO id`QmA8!03W_]CD `yRy2q缸O>ZFi1K Yqdt80oHb!12sn*p?vXt8g 1lUA2\[^m+Xh$@$@$8>glG ؑ#Gxz}ڣÈQlYի=A}\0_U#5Ƥ!vG֬Yĉˁf%ݩjC`'QxգTԐ|G]tpoְ'Ao5SΦPl +in,c&Gi,jVWƉp@IDAT=\`;P70=+\mUyU< |<|8y0ٌ)ѫo=qB%*h`4R]䚠<){8z(N_-;N_ zNk.jN 0I׀N⿱{ڙfRrN<03 3kg!2Uy6S5ui!f! fc~`kpJQjjheK?D&M迻wA~=j֭5-*gk0aTZ! ĖFjb<+C'l=OzCT>繲\YmpF#@`,Uӹ #`9g3,4ܩsFIл'켼ۼT^7p~xAq0p={qcx hp9vz0?"yxx0̆CZ<_ V}sa-IBAC!tl*ލm%b1nxg`J:8VSV!*BH1[l8]T(kij33Ygk$հ? ؼ}js\&  Ǒ oĀ8d04eѲeKPB<7ʗ/Pbʕ+G*]~E#(&a3ʕK&}[ 8D;oCL gC# q ʗ#¥Ғ*(emGV ѐݩwƒVx < R瀕a?|kTtNfNB513 zh  O<0͹sƳ7{ AjR;'$:_yXC3њrHH+[P|=X8룠z\0L/ σ w *v*?i#4h;vج?Qz\ŚpC$IL/1q0$:u^wlΜ9* >.NHˇK6Sn|nT# /8;SSbL7 Fhqu?f]qH͌/!D~F~DՇM!LU o!b' (9NҼXB7m0+`5 -?1k52  ٲLgN#pٌ9F6ၮG~Vu=WٵL7UI8}g63nռZX`e}&xB}2Ls+>xjA7x@v0az/GA,S)Rr ^#`bzKmi<vq \=6e秌OLڱE)AY9 5*沧ZXI ~kU6&]ĂEjgߜubH ,!a( iKH\kzE$/uf֞ fyI騄.J0ib <V6+pcCif/ uzY=gT&i[`Kf3a$.^"F>'x u@qIZH gWKxh]>r!wzUC}w+aAzÃ&G%+ C>xr  lo%ٚI IHHHHHH @ d^lwr.)#      3(hęK KHHHHHHH g.+B$@$@$@$@$@$@$. b:       8CF (hKHHHHHHH  qR"$@$@$@$@$@$@$@.)#      3Ǚđd^/Ԅ       'pf9 zhVJ$@$@$@$@$@$@$(h$]M$@$@$@$@$@$@$#(hVJ$@$@$@$@$@$@$(h$]M$@$@$@$@$@$@$#(hVJ$@$@$@$@$@$@$(h$]M$@$@$@$@$@$@$#(hVJ$@$@$@$@$@$@$(h$]M$@$@$@$@$@$@$#(hVJ$@$@$@$@$@$@$d,M٫V㒺sHds}(G$@$@$KNl-{ʩ&UR)/ |I4jxf撃2%d$ܓ\YSɫ/w*eQhZ6y7C\9e|1mrY.[ J5)h f_]&wv42/O|4M)+~YR [ܽqfE aI tC^"-/gxUj:]?_vK~K?+nH쩥F\ҨVh_6/])Tg5^fVwYfu KŒY-:~Yt-׮ߖRHq㎬~JR&ObǝqwTnʛΞ}KҍыJ`I&vJH)M䷙eoySiJaNDH<%UP9~檜TbaPY?rQҥN&E5c9[x[戔(ѥq]is=tA'V%.{ZWv}YܼyWV*W۽\y*o[=Xz[W+q h.^wT:,]Iz 746Q7X Y#ՇejJp%h|9z3p*l؝ˑ tc>pcAN4탨fI{>ᣚ.p4O#{rDFMT?*V1}kK{F7: 4P~PO ~(䀹aW#nKǯia)i]dxk^A yu(ÛOt@@y'ϪK}Ʀ>:}Q9!\ט\$g ^0V? 4~LрE}tϰJ<+Acs2==SJI3jMݫm~w8xU 6q,Qba$|y|8rrl,6xKUlyg5֯_/֭[SIa=uPqEާ;|Aa{l}N]x@={e={ m^* r@WܦhGe4x乂ua)ĉ ץjﯭҵeHٻ Z"hLKHŏΜ=F}RKĢ-^}+{yZ +hbҢX2e\qMim-e0tf-fT+CxFL9ʻe+esp$߾}O~~ 8o*IusekԻ5hf>h-f4_v|J/޻~KaF~f)] lI"u|:>pqt/~eo<.$\s܃^NڿRR7Z%ڣQ %(bFTm ^!o);J٣*}pP3lSCZ<_nܼ&P"$b jP=عh{iڀghAH)hخGa6x'Z.f`+o8x[4ɤ/xVF%h`,8ޒ r1 6y2[zB+Occg=<ЉK:GTC:`H:+!+Zhp&~p?$$<*ʮU i=SJTzYA0z6Э}IW2pjx!f jx AYoA1 ۠Z@7UXYDO'ՃfFA ڋ/sПV޽{;6h u9rDFmV6m$!!!as(S2*_s7{3㙇g&^ޣ00詫 z,Fl}z>*Fb^Q`74VoHvA]/{V@JʆG~G!@0@hd.Đ!(΂Pyqp\7nwҨWLRÇuu1pBAd2eTRE }{W,P oQFə=[f̘!/ 2$ql";vSNId$G2sL6mT^]ƌ#;^K.I%MTrʥ3}t}ѣGKƌݛGDD;0 Wƨ1e"D"+ [4"EEd%(pX bpCE {"1" qQ?oT[]s{̈{ݏͦA]D)7)labNNotzI%BJEc _lC!lq\k6{\?}!l_038$ #-A|F9̢)@x/"o*vYFf`^_t' b` 1 A[\rw+!'mMT5pWe 2w-qo`iKF(*v}->õwԲެ}=sĆos\X7)v̠e̞cסMg`}ۮo4zdMmL@Ա (yN1&`xwq ks=rr}˗>(~Hʀ|Hl=uҪ郂Q3@ )̚\Aډ"/uůs5CN~ή#8/d !}Oi/ùGQ)VixocfL[Wty\UVe^Ֆ;GGdmfFaN>djGDMϞ=MNLZ v>D~@f4l̚5˒ t; (tb:v=*¹k6nh fN?t6ۘ 6A)SX"=z%3vj Z~{KذCɕW^o'rJw ||ſ|x bּ OJGnG3AP7ίy%38P٤(3"(AC&,؜c=9J# ;:/"PI2`Kjظ9>`a騒Gխ7޻ƒ1=Ͼxȍtj0O1L!\LJp3k(i \˦,3kkB#_nwM3nE+'FE+ O[X~PB_QϼFCHj H!kY4x6kK`ֱ Buڪ˧>mڿ 3QvD$ “ Nb7Ht e3H8p4D/o\a>r+q1͘s~u~ }u\mʜU K׃7PZ6{vQlIzBgzɕs?$Ł]g&~$aDQ>!UG/*iAKcSYE!v{}0zbڂi6P$CԠ CϔeM4oi }&M{~ *H~7Da,c pQfv_e:%NXNdHI;#V5Ķ/̸qMV v4i$CNQZZ%3X!-0fΜi}K}ٖڵkkFz .4M65ǏdCyw߿NtW7lSgܲ~%?)52ܱMC۹xϛp84tYQ4,95na@!ѐ:`&֑ӡ(h3a8tߘNgqEdETu@0Pf5P*{J:zugk k[ѱBc9)@r`v'K[6k\[5}R7W"Kf=DtXbnB0KD}gVqҐì_*|B c?vc^J3-σ*|(!\޷%-'-w?"MZ6||өBiCVPpSu2`!>e6߆݄HfBܑ 7I 2~dY2i`2#etJS6;j1IqAε%3>23 iqu.פ9w+5IrfKݺz㡒^u(+xTnC\ާMׯi;$CZ\|":AtQ9&y7tqT(MЈu.뜖-4ϾH;Rґ<$>XBgoi OC"3~5!dxJCÆ P}9=d' 5_'RII9餓*yhjnNv%+ ˖-Gm 5 JAYmCtFAtZg6/ϣCsI)gim6D9 s9{>I;gʭ{J_٣$O5p}%UAW?܏ÎoרA旅̌ M9B8\+'eLnnE!BKMPf᫢Bu6ՁgUܶsf0Tw~}'ݶ"h͕>BIqVϣ „(cI.nWv-~و>(3`ɧ_Bh _A9#% 6jѮX行>I^g(J qߓ{Fdy#%T ըtpO/+U?`ZlKr=$~\+SoJr&^x-3܏%*in@Pes)# UQ8W~"4$򐳚-ל'"O5@D3 $m7$z?HGL27[I-M{4EF\sNJ߇>B~GUI H:}\ӑRV]B3עo]eycCA*ܹs bhu|QF(믿n?IQ )]wufc"j%Z8\:ˆƝ#:,;J,Fn%nu.[+(hR>jX>q7W C)~v?g "al *(ޣOi$^1](ƊhCe┅bGpU/HY".s$SC:_EVϋJs97EJ^qp%շB}BtBLg^1x&GmG{Iٗ?bIn1|r 72{3_fvdH:>S@3ȡG%B!ƫ2KQG^*1Ԋ5nA-5ñ2#Q"370JCm9 )Of Cf M1W!*4\9ei;$Cp H`wbq߬^D61ω?LR33OΒƦ@Bq@of*+{fW1{KdķK4#/HzitnC[yO" iڋ4:I9OZ;5I #u旊/! J_L vE@_))z2u1?ի͌3-Ifu{eR֭M7vQet1f 1b/ܗ[ \H BD!JQJ,%jI@DeP#+r( 2C#t u1cIh4Q?pvJڧe|zپL#ge>74,džQ.U#͒jVlQgd`(] Q O#n'),YƱeQ7l!2][s,G unA9Bȃ#ÜTj?co;< IaRK0 II J$$"+NW4!+m ',# r- ",97D'DzHkL`'sBL敋@R?g(t?P&iK5g4˒l~)b5EJ);K^!M{~o炊^ђQʮx#Quio!ЈBXU7h J<8g]D8 D!;}][5g<(Je}cV8*[bBp,Tfx.Sw!nRt&ilيۙlC+d=_e5 _?˝ҹqw9a!mE " 6ǁ S>&d6ѝvR  *kбq=S-i@Lji|&)&uÜ`[sc6 k֤vMhOا٣j#4AbD(7%@מ9l(b3i *ÒnK@P5ïExBt$ZB(q}|w2PO Smr}gXP'NU-H{?lDmN56}3p䡘g:W|o-nD2TR2&9nY] ǁohW$Iۋ8i/筫$'.s!>l5^aNjӭy'I9lʕv ҈ƍcɒ%СCW_}e(44o?[^`5 [!xόg߲B=ᾖr̭~sc ߅ q ǏP[hܽƼ Bab}3yv'e(Ջy/h1Ct$;B;;K#j;&Go:j|{q>!6W߾Ҋn^yR8AW$[TDKŸ7qzF Sf:-H{?#Y TbaoV "/T@P?sK$oy%R թ Rߘ/8l'qV>94%RE1i/␦Hs? !1:( qmհ%7Da>D۪&w5jdO2_~YXJA2Q'Ab7]ֻwo+I v-2ϷUPwR,XVϾN6|qŹRNb؃K-;9x'=~n/ [$ o ɹ#(/'oIns혱e-%Ϯ|E:)_H ~>Cd0KyDX0*ە"W,(\$1b3;TotTzL$-&̓dG=!n=UGBc_S yrګQ1ᖿD3М6]SHj t!&-#پDDv /B9\a`]{%2n'>=.}HHunQ+aٔ '(i/r.j!4CKCmKcvѕ{{2)t&W*' c)I>b[FuZR~HU0"KЭ>iz ;Qs=I $M!QA(,;=jܧn2/&BD:Ώi/␦H{?f<"O"6QZF& E H7-ȉ"ruu-p{+bҮ];Kl 9`[ziGyL8@p,HŋKYDo쳏!Eeʔ):wlJJJlJɃ>h IFobƸ+9_|Ve˖ +V_|V: +;!Jeȑ6<8nMǖt|ܶ3;̾P^PCTDz ToI(R9MqSD*:Bzw=F:PD:Ҡr8Rdyc7!sI1:ehlXpx|IBnGFc+ _jD6w FBx6(A>{eb(dϊ"P|v;ΩfL9>7o j+9k#2..zVr]tCv!?IgFNI bA_|w 8me ia5>#h2iy@]EL;)B:@ETy`9v=v6h "&a@0v`f9K[1Pf(G QH{~mhpp.VK8g:ޤQ,7+zISS#(b`ĬleW <؜%ŸϴeD|2imgEE !6ecϻǶ~}7M 2/BH g{67g{Xܮ{ik+G ~øͪ5H{?MjI."%?kl6J@ ɢ>}P,yH5o8>e6 }Z.M{Ҷic[ʝ4xCG$ 1" ڥ_++,| AE{qk<׷1Ք(jJN:[[F=zwc9[fuرVN0Yƒ(A˒s̑NH9_[5ڡCQZZjIKH&M?~n!4֭s;Utѫoف=p0l6!E-%БKHǐ:BŲ$5~uU>g;WHV@a/|ghW~MWA|Va8C'<utfkO&fܬćP3:xs&m9f QcF9?$}(}"l>|L9P-S>oZBRIɻ>ΌJ'ՏzsK *@^iiwf8CVB8lnsB =BC;XPd+%:d BҬtC-oS8Sn&nq3i'7ϊFr;~'`.8>R':V:8$]tu{ 4ۼ+ 7%3ɽ8iIipW,(.lH|^, i/Hs?pn59ui}ig/:u$6x\ *BhҏՌ@HhTTzx"DF\[ D0+쒚"T- ۢi7U{F[(" >_NPE"4MvEc'2" OErEz d8Mň9QYCYMPE@P G@ 1=(@o#GYMPE@PE@PEbШ;B9(s7.)PQ i(I;rT+(ֹ~E@PE@PE@nTC#E@PE@PE@P\ 8qTPE@PE@PE@Pb#F)"("("(fG@ @PE@PE@PE@PFT("("("(r@W$L?*"("("(@"UJPE@PE@PE@PQ>nIDAT("("("(UUJPE@PE@PE@PQ("("("(UUJPE@PE@PE@PQ("("("(U_Jb!IENDB`clog-1.7.0/gcp/init/000077500000000000000000000000001476143451200141665ustar00rootroot00000000000000clog-1.7.0/gcp/init/init.go000066400000000000000000000006351476143451200154640ustar00rootroot00000000000000package init import ( "log/slog" "os" "github.com/chainguard-dev/clog" "github.com/chainguard-dev/clog/gcp" ) // Set up structured logging at Info+ level. func init() { level := slog.LevelInfo if e, ok := os.LookupEnv("LOG_LEVEL"); ok { if err := level.UnmarshalText([]byte(e)); err != nil { clog.Fatalf("slog: invalid log level: %v", err) } } slog.SetDefault(slog.New(gcp.NewHandler(level))) } clog-1.7.0/gcp/setup.go000066400000000000000000000032321476143451200147120ustar00rootroot00000000000000package gcp import ( "context" "log/slog" "os" ) // LevelCritical is an extra log level supported by Cloud Logging. const LevelCritical = slog.Level(12) // Handler that outputs JSON understood by the structured log agent. // See https://cloud.google.com/logging/docs/agent/logging/configuration#special-fields type Handler struct { handler slog.Handler } func NewHandler(level slog.Level) *Handler { return &Handler{handler: slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ AddSource: true, Level: level, ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.MessageKey { a.Key = "message" } else if a.Key == slog.SourceKey { a.Key = "logging.googleapis.com/sourceLocation" } else if a.Key == slog.LevelKey { a.Key = "severity" level, ok := a.Value.Any().(slog.Level) if ok && level == LevelCritical { a.Value = slog.StringValue("CRITICAL") } } return a }, })} } func (h *Handler) Enabled(ctx context.Context, level slog.Level) bool { return h.handler.Enabled(ctx, level) } func (h *Handler) Handle(ctx context.Context, rec slog.Record) error { if trace := traceFromContext(ctx); trace != "" { rec = rec.Clone() // Add trace ID to the record so it is correlated with the request log // See https://cloud.google.com/trace/docs/trace-log-integration rec.Add("logging.googleapis.com/trace", slog.StringValue(trace)) } return h.handler.Handle(ctx, rec) } func (h *Handler) WithAttrs(attrs []slog.Attr) slog.Handler { return &Handler{handler: h.handler.WithAttrs(attrs)} } func (h *Handler) WithGroup(name string) slog.Handler { return &Handler{handler: h.handler.WithGroup(name)} } clog-1.7.0/gcp/setup_test.go000066400000000000000000000010611476143451200157470ustar00rootroot00000000000000package gcp import ( "context" "log/slog" "testing" ) func TestHandler(t *testing.T) { ctx := context.Background() l := slog.New(NewHandler(slog.LevelInfo)) l.With("level", "INFO").Log(ctx, slog.LevelInfo, "hello world") // okay l.With("level", "INFO").Log(ctx, slog.LevelWarn, "hello world") // weird, but okay (info) // These should not panic. l.With("level", nil).Log(ctx, slog.LevelInfo, "hello world") l.With("level", 123).Log(ctx, slog.LevelInfo, "hello world") l.With("level", map[string]string{}).Log(ctx, slog.LevelInfo, "hello world") } clog-1.7.0/gcp/trace.go000066400000000000000000000065701476143451200146600ustar00rootroot00000000000000package gcp import ( "context" "fmt" "io" "log/slog" "net" "net/http" "os" "runtime" "strings" "sync" "time" ) func insideTest() bool { // Ask runtime.Callers for up to 10 PCs, including runtime.Callers itself. pc := make([]uintptr, 10) n := runtime.Callers(0, pc) if n == 0 { slog.Debug("WithCloudTraceContext: no PCs available") return true } frames := runtime.CallersFrames(pc[:n]) for { frame, more := frames.Next() if !more { break } if strings.HasPrefix(frame.Function, "testing.") && strings.HasSuffix(frame.File, "src/testing/testing.go") { slog.Debug("WithCloudTraceContext: inside test", "function", frame.Function, "file", frame.File, "line", frame.Line) return true } } return false } var ( projectID string lookupOnce sync.Once ) // WithCloudTraceContext returns an http.handler that adds the GCP Cloud Trace // ID to the context. This is used to correlate the structured logs with the // request log. func WithCloudTraceContext(h http.Handler) http.Handler { // Get the project ID from the environment if specified fromEnv := os.Getenv("GOOGLE_CLOUD_PROJECT") if fromEnv != "" { projectID = fromEnv } else { lookupOnce.Do(func() { if insideTest() { slog.Debug("WithCloudTraceContext: inside test, not looking up project ID") return } // By default use the metadata IP; otherwise use the environment variable // for consistency with https://pkg.go.dev/cloud.google.com/go/compute/metadata#Client.Get host := "169.254.169.254" if h := os.Getenv("GCE_METADATA_HOST"); h != "" { host = h } req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("http://%s/computeMetadata/v1/project/project-id", host), nil) if err != nil { slog.Debug("WithCloudTraceContext: could not get GCP project ID from metadata server", "err", err) return } req.Header.Set("Metadata-Flavor", "Google") resp, err := (&http.Client{ // Timeouts copied from https://pkg.go.dev/cloud.google.com/go/compute/metadata#Get Transport: &http.Transport{ Dial: (&net.Dialer{Timeout: 2 * time.Second}).Dial, }, Timeout: 5 * time.Second, }).Do(req) if err != nil { slog.Debug("WithCloudTraceContext: could not get GCP project ID from metadata server", "err", err) return } if resp.StatusCode != http.StatusOK { slog.Debug("WithCloudTraceContext: could not get GCP project ID from metadata server", "code", resp.StatusCode, "status", resp.Status) return } defer resp.Body.Close() all, err := io.ReadAll(resp.Body) if err != nil { slog.Debug("WithCloudTraceContext: could not get GCP project ID from metadata server", "err", err) return } projectID = string(all) }) } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if projectID != "" { var trace string traceHeader := r.Header.Get("traceparent") traceID := parseTraceFromW3CHeader(traceHeader) if traceID != "" { trace = fmt.Sprintf("projects/%s/traces/%s", projectID, traceID) } r = r.WithContext(context.WithValue(r.Context(), "trace", trace)) } h.ServeHTTP(w, r) }) } func traceFromContext(ctx context.Context) string { trace := ctx.Value("trace") if trace == nil { return "" } return trace.(string) } func parseTraceFromW3CHeader(traceparent string) string { traceParts := strings.Split(traceparent, "-") if len(traceParts) > 1 { return traceParts[1] } return "" } clog-1.7.0/gcp/trace_test.go000066400000000000000000000035361476143451200157160ustar00rootroot00000000000000package gcp import ( "log/slog" "net/http" "net/http/httptest" "testing" "github.com/chainguard-dev/clog" ) func TestTrace(t *testing.T) { // This ensures the metadata server is not called at all during tests. md := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { t.Fatalf("metadata server called") })) defer md.Close() t.Setenv("GCE_METADATA_HOST", md.URL) slog.SetDefault(slog.New(NewHandler(slog.LevelDebug))) for _, c := range []struct { name string env string wantTrace string }{ {"no env set", "", ""}, {"env set", "my-project", "projects/my-project/traces/traceid"}, } { t.Run(c.name, func(t *testing.T) { t.Setenv("GOOGLE_CLOUD_PROJECT", c.env) // Set up a server that logs a message with trace context added. slog.SetDefault(slog.New(NewHandler(slog.LevelDebug))) h := WithCloudTraceContext(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() clog.InfoContext(ctx, "hello world") // TODO: This doesn't propagate the trace context to the logger. //clog.FromContext(ctx).Info("hello world") if r.Header.Get("traceparent") == "" { t.Error("got empty trace context header, want non-empty") } traceCtx := ctx.Value("trace") if traceCtx == nil { if c.wantTrace != "" { t.Fatalf("want %s, not found", c.wantTrace) } } else { if traceCtx != c.wantTrace { t.Fatalf("got %s, want %s", traceCtx, c.wantTrace) } } })) srv := httptest.NewServer(h) defer srv.Close() // Send a request to the server with a trace context header. req, err := http.NewRequest(http.MethodGet, srv.URL, nil) if err != nil { t.Fatal(err) } req.Header.Set("traceparent", "00-traceid-spanid-01") if _, err := http.DefaultClient.Do(req); err != nil { t.Fatal(err) } }) } } clog-1.7.0/go.mod000066400000000000000000000000611476143451200135550ustar00rootroot00000000000000module github.com/chainguard-dev/clog go 1.22.4 clog-1.7.0/go.sum000066400000000000000000000000001476143451200135730ustar00rootroot00000000000000clog-1.7.0/handler.go000066400000000000000000000036001476143451200144150ustar00rootroot00000000000000package clog import ( "context" "log/slog" ) var ( ctxKey = key{} ) type key struct{} type ctxVal map[string]any // With returns a new context with the given values. // Values are expected to be key-value pairs, where the key is a string. // e.g. WithValues(ctx, "foo", "bar", "baz", 1) // If a value already exists, it is overwritten. // If an odd number of arguments are provided, With panics. func WithValues(ctx context.Context, args ...any) context.Context { if len(args)%2 != 0 { panic("non-even number of arguments") } values := ctxVal{} // Copy existing values for k, v := range get(ctx) { values[k] = v } for i := 0; i < len(args); i++ { key, ok := args[i].(string) if !ok { panic("non-string key") } i++ if i >= len(args) { break } value := args[i] values[key] = value } return context.WithValue(ctx, ctxKey, values) } func get(ctx context.Context) ctxVal { if value, ok := ctx.Value(ctxKey).(ctxVal); ok { return value } return nil } // Handler is a slog.Handler that adds context values to the log record. // Values are added via [WithValues]. type Handler struct { h slog.Handler } // NewHandler configures a new context aware slog handler. // If h is nil, the default slog handler is used. func NewHandler(h slog.Handler) Handler { return Handler{h} } func (h Handler) inner() slog.Handler { if h.h == nil { return slog.Default().Handler() } return h.h } func (h Handler) Enabled(ctx context.Context, level slog.Level) bool { return h.inner().Enabled(ctx, level) } func (h Handler) Handle(ctx context.Context, r slog.Record) error { values := get(ctx) for k, v := range values { r.Add(k, v) } return h.inner().Handle(ctx, r) } func (h Handler) WithAttrs(attrs []slog.Attr) slog.Handler { return Handler{h.inner().WithAttrs(attrs)} } func (h Handler) WithGroup(name string) slog.Handler { return Handler{h.inner().WithGroup(name)} } clog-1.7.0/handler_test.go000066400000000000000000000016521476143451200154610ustar00rootroot00000000000000package clog import ( "bytes" "context" "encoding/json" "log/slog" "reflect" "testing" ) func TestContextHandler(t *testing.T) { ctx := context.Background() ctx = WithValues(ctx, "foo", "bar") ctx2 := WithValues(ctx, "a", "b", "c", "d", ) ctx = WithValues(ctx, "b", 1) for _, tc := range []struct { ctx context.Context want map[string]any }{ {ctx, map[string]any{ "b": float64(1), "foo": "bar", }}, {ctx2, map[string]any{ "foo": "bar", "a": "b", "c": "d", }}, } { t.Run("", func(t *testing.T) { b := new(bytes.Buffer) log := slog.New(NewHandler(slog.NewJSONHandler(b, testopts))) log.InfoContext(tc.ctx, "") tc.want["level"] = "INFO" tc.want["msg"] = "" var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(tc.want, got) { t.Errorf("want %v, got %v", tc.want, got) } }) } } clog-1.7.0/log.go000066400000000000000000000076171476143451200135750ustar00rootroot00000000000000package clog import ( "context" "log/slog" "os" ) // Info calls Info on the default logger. func Info(msg string, args ...any) { wrap(context.Background(), DefaultLogger(), slog.LevelInfo, msg, args...) } // InfoContext calls InfoContext on the context logger. // If a Logger is found in the context, it will be used. func InfoContext(ctx context.Context, msg string, args ...any) { wrap(ctx, FromContext(ctx), slog.LevelInfo, msg, args...) } // Infof calls Infof on the default logger. func Infof(format string, args ...any) { wrapf(context.Background(), DefaultLogger(), slog.LevelInfo, format, args...) } // InfoContextf calls InfoContextf on the context logger. // If a Logger is found in the context, it will be used. func InfoContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, FromContext(ctx), slog.LevelInfo, format, args...) } // Warn calls Warn on the default logger. func Warn(msg string, args ...any) { wrap(context.Background(), DefaultLogger(), slog.LevelWarn, msg, args...) } // WarnContext calls WarnContext on the context logger. // If a Logger is found in the context, it will be used. func WarnContext(ctx context.Context, msg string, args ...any) { wrap(ctx, FromContext(ctx), slog.LevelWarn, msg, args...) } // Warnf calls Warnf on the default logger. func Warnf(format string, args ...any) { wrapf(context.Background(), DefaultLogger(), slog.LevelWarn, format, args...) } // WarnContextf calls WarnContextf on the context logger. // If a Logger is found in the context, it will be used. func WarnContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, FromContext(ctx), slog.LevelWarn, format, args...) } // Error calls Error on the default logger. func Error(msg string, args ...any) { wrap(context.Background(), DefaultLogger(), slog.LevelError, msg, args...) } // ErrorContext calls ErrorContext on the context logger. func ErrorContext(ctx context.Context, msg string, args ...any) { wrap(ctx, FromContext(ctx), slog.LevelError, msg, args...) } // Errorf calls Errorf on the default logger. func Errorf(format string, args ...any) { wrapf(context.Background(), DefaultLogger(), slog.LevelError, format, args...) } // ErrorContextf calls ErrorContextf on the context logger. func ErrorContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, FromContext(ctx), slog.LevelError, format, args...) } // Debug calls Debug on the default logger. func Debug(msg string, args ...any) { wrap(context.Background(), DefaultLogger(), slog.LevelDebug, msg, args...) } // DebugContext calls DebugContext on the context logger. func DebugContext(ctx context.Context, msg string, args ...any) { wrap(ctx, FromContext(ctx), slog.LevelDebug, msg, args...) } // Debugf calls Debugf on the default logger. func Debugf(format string, args ...any) { wrapf(context.Background(), DefaultLogger(), slog.LevelDebug, format, args...) } // DebugContextf calls DebugContextf on the context logger. // If a Logger is found in the context, it will be used. func DebugContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, FromContext(ctx), slog.LevelDebug, format, args...) } // Fatal calls Error on the default logger, then exits. func Fatal(msg string, args ...any) { wrap(context.Background(), DefaultLogger(), slog.LevelError, msg, args...) os.Exit(1) } // FatalContext calls ErrorContext on the context logger, then exits. func FatalContext(ctx context.Context, msg string, args ...any) { wrap(ctx, FromContext(ctx), slog.LevelError, msg, args...) os.Exit(1) } // Fatalf calls Errorf on the default logger, then exits. func Fatalf(format string, args ...any) { wrapf(context.Background(), DefaultLogger(), slog.LevelError, format, args...) os.Exit(1) } // FatalContextf calls ErrorContextf on the context logger, then exits. func FatalContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, FromContext(ctx), slog.LevelError, format, args...) os.Exit(1) } clog-1.7.0/logger.go000066400000000000000000000142321476143451200142620ustar00rootroot00000000000000package clog import ( "context" "fmt" "log/slog" "os" "runtime" "time" ) // Logger implements a wrapper around [slog.Logger] that adds formatter functions (e.g. Infof, Errorf) type Logger struct { ctx context.Context slog.Logger } // DefaultLogger returns a new logger that uses the default [slog.Logger]. func DefaultLogger() *Logger { return NewLogger(nil) } // NewLogger returns a new logger that wraps the given [slog.Logger] with the default context. func NewLogger(l *slog.Logger) *Logger { return NewLoggerWithContext(context.Background(), l) } // NewLoggerWithContext returns a new logger that wraps the given [slog.Logger]. func NewLoggerWithContext(ctx context.Context, l *slog.Logger) *Logger { if l == nil { l = slog.New(NewHandler(slog.Default().Handler())) } return &Logger{ ctx: ctx, Logger: *l, } } // New returns a new logger that wraps the given [slog.Handler]. func New(h slog.Handler) *Logger { return NewWithContext(context.Background(), h) } // New returns a new logger that wraps the given [slog.Handler]. func NewWithContext(ctx context.Context, h slog.Handler) *Logger { return NewLoggerWithContext(ctx, slog.New(NewHandler(h))) } // With calls [Logger.With] on the default logger. func With(args ...any) *Logger { return DefaultLogger().With(args...) } // With calls [Logger.With] on the logger. func (l *Logger) With(args ...any) *Logger { return NewLoggerWithContext(l.context(), l.Logger.With(args...)) } // WithGroup calls [Logger.WithGroup] on the default logger. func (l *Logger) WithGroup(name string) *Logger { return NewLoggerWithContext(l.context(), l.Logger.WithGroup(name)) } func (l *Logger) context() context.Context { if l.ctx == nil { return context.Background() } return l.ctx } // Infof logs at LevelInfo with the given format and arguments. func (l *Logger) Info(format string, args ...any) { wrap(l.context(), l, slog.LevelInfo, format, args...) } // Infof logs at LevelInfo with the given format and arguments. func (l *Logger) Infof(format string, args ...any) { wrapf(l.context(), l, slog.LevelInfo, format, args...) } // InfoContextf logs at LevelInfo with the given context, format and arguments. func (l *Logger) InfoContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, l, slog.LevelInfo, format, args...) } // Warn logs at LevelWarn with the given format and arguments. func (l *Logger) Warn(format string, args ...any) { wrap(l.context(), l, slog.LevelWarn, format, args...) } // Warnf logs at LevelWarn with the given format and arguments. func (l *Logger) Warnf(format string, args ...any) { wrapf(l.context(), l, slog.LevelWarn, format, args...) } // WarnContextf logs at LevelWarn with the given context, format and arguments. func (l *Logger) WarnContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, l, slog.LevelWarn, format, args...) } // Error logs at LevelError with the given format and arguments. func (l *Logger) Error(format string, args ...any) { wrap(l.context(), l, slog.LevelError, format, args...) } // Errorf logs at LevelError with the given format and arguments. func (l *Logger) Errorf(format string, args ...any) { wrapf(l.context(), l, slog.LevelError, format, args...) } // ErrorContextf logs at LevelError with the given context, format and arguments. func (l *Logger) ErrorContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, l, slog.LevelError, format, args...) } // Debug logs at LevelDebug with the given format and arguments. func (l *Logger) Debug(format string, args ...any) { wrap(l.context(), l, slog.LevelDebug, format, args...) } // Debugf logs at LevelDebug with the given format and arguments. func (l *Logger) Debugf(format string, args ...any) { wrapf(l.context(), l, slog.LevelDebug, format, args...) } // DebugContextf logs at LevelDebug with the given context, format and arguments. func (l *Logger) DebugContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, l, slog.LevelDebug, format, args...) } // Fatalf logs at LevelError with the given format and arguments, then exits. func (l *Logger) Fatalf(format string, args ...any) { wrapf(l.context(), l, slog.LevelError, format, args...) os.Exit(1) } // Fatal logs at LevelError with the given message, then exits. func (l *Logger) Fatal(msg string, args ...any) { wrap(l.context(), l, slog.LevelError, msg, args...) os.Exit(1) } // FatalfContextf logs at LevelError with the given context, format and arguments, then exits. func (l *Logger) FatalContextf(ctx context.Context, format string, args ...any) { wrapf(ctx, l, slog.LevelError, format, args...) os.Exit(1) } // FatalfContext logs at LevelError with the given context and message, then exits. func (l *Logger) FatalContext(ctx context.Context, msg string, args ...any) { wrap(ctx, l, slog.LevelError, msg, args...) os.Exit(1) } // Base returns the underlying [slog.Logger]. func (l *Logger) Base() *slog.Logger { return &l.Logger } // Handler returns the underlying [slog.Handler]. func (l *Logger) Handler() slog.Handler { return l.Logger.Handler() } func wrap(ctx context.Context, logger *Logger, level slog.Level, msg string, args ...any) { if !logger.Handler().Enabled(ctx, level) { return } var pcs [1]uintptr runtime.Callers(3, pcs[:]) // skip [Callers, Infof, wrapf] r := slog.NewRecord(time.Now(), level, msg, pcs[0]) r.Add(args...) _ = logger.Handler().Handle(ctx, r) } // wrapf is like wrap, but uses fmt.Sprintf to format the message. // NOTE: args are passed to fmt.Sprintf, not as [slog.Attr]. func wrapf(ctx context.Context, logger *Logger, level slog.Level, format string, args ...any) { if !logger.Handler().Enabled(ctx, level) { return } var pcs [1]uintptr runtime.Callers(3, pcs[:]) // skip [Callers, Infof, wrapf] r := slog.NewRecord(time.Now(), level, fmt.Sprintf(format, args...), pcs[0]) _ = logger.Handler().Handle(ctx, r) } type loggerKey struct{} func WithLogger(ctx context.Context, logger *Logger) context.Context { return context.WithValue(ctx, loggerKey{}, logger.Logger) } func FromContext(ctx context.Context) *Logger { if logger, ok := ctx.Value(loggerKey{}).(slog.Logger); ok { return &Logger{ ctx: ctx, Logger: logger, } } return NewLoggerWithContext(ctx, nil) } clog-1.7.0/logger_test.go000066400000000000000000000120621476143451200153200ustar00rootroot00000000000000package clog import ( "bytes" "context" "encoding/json" "fmt" "log/slog" "reflect" "testing" ) var ( testopts = &slog.HandlerOptions{ ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { // Ignore time to make testing easier. if a.Key == "time" { return slog.Attr{} } return a }, } ) func TestLogger(t *testing.T) { ctx := context.Background() b := new(bytes.Buffer) base := slog.New(NewHandler(slog.NewJSONHandler(b, testopts))) log := NewLogger(base).With("a", "b") log.InfoContext(ctx, "") t.Log(b.String()) want := map[string]any{ "level": "INFO", "msg": "", "a": "b", } var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } } func TestLoggerNilBase(t *testing.T) { log := NewLogger(nil) log.Info("") } func TestLoggerFromContext(t *testing.T) { b := new(bytes.Buffer) base := slog.New(NewHandler(slog.NewJSONHandler(b, testopts))) log := NewLogger(base).With("a", "b") ctx := WithLogger(context.Background(), log) FromContext(ctx).Info("") want := map[string]any{ "level": "INFO", "msg": "", "a": "b", } t.Run("FromContext.Info", func(t *testing.T) { var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } }) b.Reset() t.Run("clog.Info", func(t *testing.T) { InfoContext(ctx, "") var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } }) } func TestLoggerPC(t *testing.T) { b := new(bytes.Buffer) log := NewLogger(slog.New(NewHandler(slog.NewJSONHandler(b, &slog.HandlerOptions{ AddSource: true, ReplaceAttr: testopts.ReplaceAttr, })))) log.Info("") t.Log(b.String()) var got struct { Source struct { File string `json:"file"` Function string `json:"function"` } `json:"source"` } if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } // Knowing that the PC is from this test is good enough. want := fmt.Sprintf("github.com/chainguard-dev/clog.%s", t.Name()) if got.Source.Function != want { t.Errorf("want %v, got %v", want, got) } } func TestWith(t *testing.T) { ctx := context.WithValue(context.Background(), "test", "test") log := NewLoggerWithContext(ctx, nil) withed := log.With("a", "b") if want := withed.ctx; want != ctx { t.Errorf("want %v, got %v", want, ctx) } withed = log.WithGroup("a") if want := withed.ctx; want != ctx { t.Errorf("want %v, got %v", want, ctx) } } func TestDefaultHandler(t *testing.T) { old := slog.Default() defer func() { slog.SetDefault(old) }() b := new(bytes.Buffer) slog.SetDefault(slog.New(slog.NewJSONHandler(b, testopts))) t.Run("Info", func(t *testing.T) { FromContext(WithValues(context.Background(), "a", "b")).Info("") want := map[string]any{ "level": "INFO", "msg": "", "a": "b", } var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } }) b.Reset() t.Run("InfoContext", func(t *testing.T) { // Set logger with original value ctx := WithValues(context.Background(), "a", "b") logger := FromContext(ctx) // Override value in request context - we expect this to overwrite the original value set in the logger logger.InfoContext(WithValues(ctx, "a", "c"), "") want := map[string]any{ "level": "INFO", "msg": "", "a": "c", } var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } }) b.Reset() t.Run("Debug - no log", func(t *testing.T) { logger := FromContext(context.Background()) logger.Debug("asdf") if b.Len() != 0 { t.Errorf("want empty, got %q", b.String()) } }) } func TestContext(t *testing.T) { old := slog.Default() t.Cleanup(func() { slog.SetDefault(old) }) b := new(bytes.Buffer) slog.SetDefault(slog.New(slog.NewJSONHandler(b, testopts))) msg := "hello world" want := map[string]any{ "level": "INFO", "msg": msg, "a": "b", } ctx := WithValues(context.Background(), "a", "b") // These should all give the same output and be functionally equivalent. for _, tc := range []struct { name string fn func() }{ { name: "clog.InfoContext", fn: func() { InfoContext(ctx, msg) }, }, { name: "clog.FromContext.Info", fn: func() { FromContext(ctx).Info(msg) }, }, { name: "clog.FromContext.InfoContext", fn: func() { FromContext(ctx).InfoContext(ctx, msg) }, }, } { t.Run(tc.name, func(t *testing.T) { b.Reset() tc.fn() var got map[string]any if err := json.Unmarshal(b.Bytes(), &got); err != nil { t.Fatal(err) } if !reflect.DeepEqual(want, got) { t.Errorf("want %v, got %v", want, got) } }) } } clog-1.7.0/slag/000077500000000000000000000000001476143451200134005ustar00rootroot00000000000000clog-1.7.0/slag/flag.go000066400000000000000000000023601476143451200146410ustar00rootroot00000000000000// Package slag provides a method for setting the log level from the command line. // // func main() { // var level slag.Level // flag.Var(&level, "log-level", "log level") // flag.Parse() // slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: &level}))) // } // // See [./examples/logger](./examples/logger) for a full example. // // This allows the log level to be set from the command line: // // $ ./myprogram -log-level=debug // // The slag.Level type is a wrapper around slog.Level that implements the flag.Value interface, // as well as Cobra's pflag.Value interface. // // func main() { // var level slag.Level // cmd := &cobra.Command{ // Use: "myprogram", // ... // } // cmd.PersistentFlags().Var(&level, "log-level", "log level") // cmd.Execute() // } package slag import "log/slog" type Level slog.Level func (l *Level) Set(s string) error { var ll slog.Level if err := ll.UnmarshalText([]byte(s)); err != nil { return err } *l = Level(ll) return nil } func (l *Level) String() string { return slog.Level(*l).String() } func (l *Level) Level() slog.Level { return slog.Level(*l) } // Implements https://pkg.go.dev/github.com/spf13/pflag#Value func (l *Level) Type() string { return "string" } clog-1.7.0/slogtest/000077500000000000000000000000001476143451200143165ustar00rootroot00000000000000clog-1.7.0/slogtest/slogtest.go000066400000000000000000000041401476143451200165100ustar00rootroot00000000000000// Package slogtest provides utilities for emitting test logs using clog. // // func TestExample(t *testing.T) { // ctx := slogtest.Context(t) // clog.FromContext(ctx).With("foo", "bar").Info("hello world") // } // // This produces the following test output: // // === RUN TestExample // slogtest.go:24: level=INFO source=/path/to/example_test.go:13 msg="hello world" foo=bar // // This package is intended to be used in tests only. package slogtest import ( "context" "io" "log/slog" "strings" "testing" "github.com/chainguard-dev/clog" ) var _ io.Writer = &logAdapter{} type logAdapter struct{ l Logger } func (l *logAdapter) Write(b []byte) (int, error) { l.l.Log(strings.TrimSuffix(string(b), "\n")) return len(b), nil } var _ Logger = (*testing.T)(nil) var _ Logger = (*testing.B)(nil) var _ Logger = (*testing.F)(nil) type Logger interface{ Log(args ...any) } // TestLogger gets a logger to use in unit and end to end tests. // This logger is configured to log at debug level. func TestLogger(t Logger) *clog.Logger { return clog.New(slog.NewTextHandler(&logAdapter{l: t}, &slog.HandlerOptions{ Level: slog.LevelDebug, AddSource: true, ReplaceAttr: RemoveTime, })) } // TestLoggerWithOptions gets a logger to use in unit and end to end tests. func TestLoggerWithOptions(t Logger, opts *slog.HandlerOptions) *clog.Logger { return clog.New(slog.NewTextHandler(&logAdapter{l: t}, opts)) } // Context returns a context with a logger to be used in tests. func Context(t Logger) context.Context { return clog.WithLogger(context.Background(), TestLogger(t)) } // TestContextWithLogger returns a context with a logger to be used in tests // // Deprecated: Use Context instead. func TestContextWithLogger(t Logger) context.Context { return Context(t) } // RemoveTime removes the top-level time attribute. // It is intended to be used as a ReplaceAttr function, // to make example output deterministic. // // This is taken from slog/internal/slogtest.RemoveTime. func RemoveTime(groups []string, a slog.Attr) slog.Attr { if a.Key == slog.TimeKey && len(groups) == 0 { return slog.Attr{} } return a } clog-1.7.0/slogtest/slogtest_test.go000066400000000000000000000010451476143451200175500ustar00rootroot00000000000000package slogtest_test import ( "testing" "github.com/chainguard-dev/clog" "github.com/chainguard-dev/clog/slogtest" ) func TestSlogTest(t *testing.T) { ctx := slogtest.Context(t) clog.FromContext(ctx).With("foo", "bar").Infof("hello world") clog.FromContext(ctx).With("bar", "baz").Infof("me again") clog.FromContext(ctx).With("baz", true).Infof("okay last one") clog.FromContext(ctx).Debug("hello debug") clog.FromContext(ctx).Info("hello info") clog.FromContext(ctx).Warn("hello warn") clog.FromContext(ctx).Error("hello error") }