From 5ebd0993d16d06aaded8193a005f187c85ae8033 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 11:43:13 +0900 Subject: [PATCH 01/13] update import export --- server/internal/adapter/context.go | 24 +++++++++++++++---- server/internal/app/auth_client.go | 2 ++ server/internal/usecase/interactor/project.go | 17 +++++++++++++ server/internal/usecase/interactor/scene.go | 10 +++++--- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/server/internal/adapter/context.go b/server/internal/adapter/context.go index 9a60e4d53..9436e31a1 100644 --- a/server/internal/adapter/context.go +++ b/server/internal/adapter/context.go @@ -14,11 +14,12 @@ import ( type ContextKey string const ( - contextUser ContextKey = "user" - contextOperator ContextKey = "operator" - ContextAuthInfo ContextKey = "authinfo" - contextUsecases ContextKey = "usecases" - contextMockAuth ContextKey = "mockauth" + contextUser ContextKey = "user" + contextOperator ContextKey = "operator" + ContextAuthInfo ContextKey = "authinfo" + contextUsecases ContextKey = "usecases" + contextMockAuth ContextKey = "mockauth" + contextCurrentHost ContextKey = "currenthost" ) var defaultLang = language.English @@ -49,6 +50,10 @@ func AttachMockAuth(ctx context.Context, mockAuth bool) context.Context { return context.WithValue(ctx, contextMockAuth, mockAuth) } +func AttachCurrentHost(ctx context.Context, currentHost string) context.Context { + return context.WithValue(ctx, contextCurrentHost, currentHost) +} + func User(ctx context.Context) *user.User { if v := ctx.Value(contextUser); v != nil { if u, ok := v.(*user.User); ok { @@ -122,3 +127,12 @@ func IsMockAuth(ctx context.Context) bool { } return false } + +func CurrentHost(ctx context.Context) string { + if v := ctx.Value(contextCurrentHost); v != nil { + if currentHost, ok := v.(string); ok { + return currentHost + } + } + return "" +} diff --git a/server/internal/app/auth_client.go b/server/internal/app/auth_client.go index 3db36248a..3f46a126f 100644 --- a/server/internal/app/auth_client.go +++ b/server/internal/app/auth_client.go @@ -113,6 +113,8 @@ func attachOpMiddleware(cfg *ServerConfig) echo.MiddlewareFunc { log.Debugfc(ctx, "auth: op: %#v", op) } + ctx = adapter.AttachCurrentHost(ctx, cfg.Config.Host) + c.SetRequest(req.WithContext(ctx)) return next(c) } diff --git a/server/internal/usecase/interactor/project.go b/server/internal/usecase/interactor/project.go index 0c0e3ee47..e6af8a923 100644 --- a/server/internal/usecase/interactor/project.go +++ b/server/internal/usecase/interactor/project.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/internal/adapter/gql/gqlmodel" jsonmodel "github.com/reearth/reearth/server/internal/adapter/gql/gqlmodel" "github.com/reearth/reearth/server/internal/usecase" @@ -575,6 +576,12 @@ func (i *Project) UploadExportProjectZip(ctx context.Context, zipWriter *zip.Wri return nil } +func removeHTTPScheme(host string) string { + host = strings.TrimPrefix(host, "https://") + host = strings.TrimPrefix(host, "http://") + return host +} + func (i *Project) ImportProject(ctx context.Context, teamID string, projectData map[string]interface{}) (*project.Project, usecasex.Tx, error) { tx, err := i.transaction.Begin(ctx) @@ -616,6 +623,16 @@ func (i *Project) ImportProject(ctx context.Context, teamID string, projectData } if p.ImageURL != nil { + if p.ImageURL.Host == "localhost:8080" || strings.HasSuffix(p.ImageURL.Host, ".reearth.dev") || strings.HasSuffix(p.ImageURL.Host, ".reearth.io") { + currentHost := adapter.CurrentHost(ctx) + currentHostDomain := removeHTTPScheme(currentHost) + if currentHostDomain == "localhost:8080" { + p.ImageURL.Scheme = "http" + } else { + p.ImageURL.Scheme = "https" + } + p.ImageURL.Host = currentHostDomain + } prjBuilder = prjBuilder.ImageURL(p.ImageURL) } diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index 31fe3f60d..e8fca3cea 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -24,6 +24,7 @@ import ( "github.com/reearth/reearth/server/pkg/scene/builder" "github.com/reearth/reearth/server/pkg/visualizer" "github.com/reearth/reearthx/idx" + "github.com/reearth/reearthx/log" "github.com/reearth/reearthx/rerror" "github.com/reearth/reearthx/usecasex" "github.com/samber/lo" @@ -646,7 +647,8 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter url, ok := data["url"].(string) if ok { if err := i.addZipAsset(ctx, zipWriter, url); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Skip addZipAsset :", err.Error()) + // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } } } @@ -678,7 +680,8 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter continue } if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Skip addZipAsset :", err.Error()) + // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } } } @@ -705,7 +708,8 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter continue } if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Skip addZipAsset :", err.Error()) + // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } } } From 64a2858d1be56b26e50e55c7db1e175815007ad8 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 12:11:23 +0900 Subject: [PATCH 02/13] convert reearth env --- server/internal/usecase/interactor/project.go | 13 ++---- server/internal/usecase/interactor/scene.go | 44 ++++++++++++++----- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/server/internal/usecase/interactor/project.go b/server/internal/usecase/interactor/project.go index e6af8a923..dad27e075 100644 --- a/server/internal/usecase/interactor/project.go +++ b/server/internal/usecase/interactor/project.go @@ -576,12 +576,6 @@ func (i *Project) UploadExportProjectZip(ctx context.Context, zipWriter *zip.Wri return nil } -func removeHTTPScheme(host string) string { - host = strings.TrimPrefix(host, "https://") - host = strings.TrimPrefix(host, "http://") - return host -} - func (i *Project) ImportProject(ctx context.Context, teamID string, projectData map[string]interface{}) (*project.Project, usecasex.Tx, error) { tx, err := i.transaction.Begin(ctx) @@ -625,13 +619,14 @@ func (i *Project) ImportProject(ctx context.Context, teamID string, projectData if p.ImageURL != nil { if p.ImageURL.Host == "localhost:8080" || strings.HasSuffix(p.ImageURL.Host, ".reearth.dev") || strings.HasSuffix(p.ImageURL.Host, ".reearth.io") { currentHost := adapter.CurrentHost(ctx) - currentHostDomain := removeHTTPScheme(currentHost) - if currentHostDomain == "localhost:8080" { + currentHost = strings.TrimPrefix(currentHost, "https://") + currentHost = strings.TrimPrefix(currentHost, "http://") + if currentHost == "localhost:8080" { p.ImageURL.Scheme = "http" } else { p.ImageURL.Scheme = "https" } - p.ImageURL.Host = currentHostDomain + p.ImageURL.Host = currentHost } prjBuilder = prjBuilder.ImageURL(p.ImageURL) } diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index e8fca3cea..49a61152b 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/internal/usecase" "github.com/reearth/reearth/server/internal/usecase/gateway" "github.com/reearth/reearth/server/internal/usecase/interfaces" @@ -24,7 +25,6 @@ import ( "github.com/reearth/reearth/server/pkg/scene/builder" "github.com/reearth/reearth/server/pkg/visualizer" "github.com/reearth/reearthx/idx" - "github.com/reearth/reearthx/log" "github.com/reearth/reearthx/rerror" "github.com/reearth/reearthx/usecasex" "github.com/samber/lo" @@ -644,11 +644,13 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter actualConfig := *c data, ok := actualConfig["data"].(map[string]any) if ok { - url, ok := data["url"].(string) + u, ok := data["url"].(*url.URL) if ok { - if err := i.addZipAsset(ctx, zipWriter, url); err != nil { - log.Infofc(ctx, "Skip addZipAsset :", err.Error()) - // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + isReearth, u := convertReearthEnv(ctx, u) + if isReearth { + if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { + return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + } } } } @@ -679,9 +681,11 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter if !ok { continue } - if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - log.Infofc(ctx, "Skip addZipAsset :", err.Error()) - // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + isReearth, u := convertReearthEnv(ctx, u) + if isReearth { + if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { + return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + } } } } @@ -707,9 +711,11 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter if !ok { continue } - if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - log.Infofc(ctx, "Skip addZipAsset :", err.Error()) - // return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + isReearth, u := convertReearthEnv(ctx, u) + if isReearth { + if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { + return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + } } } } @@ -722,6 +728,22 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter return sce, res, nil } +func convertReearthEnv(ctx context.Context, u *url.URL) (bool, *url.URL) { + if u.Host == "localhost:8080" || strings.HasSuffix(u.Host, ".reearth.dev") || strings.HasSuffix(u.Host, ".reearth.io") { + currentHost := adapter.CurrentHost(ctx) + currentHost = strings.TrimPrefix(currentHost, "https://") + currentHost = strings.TrimPrefix(currentHost, "http://") + if currentHost == "localhost:8080" { + u.Scheme = "http" + } else { + u.Scheme = "https" + } + u.Host = currentHost + return true, u + } + return false, nil +} + func (i *Scene) ImportScene(ctx context.Context, sce *scene.Scene, prj *project.Project, plgs []*plugin.Plugin, sceneData map[string]interface{}) (*scene.Scene, error) { sceneJSON, err := builder.ParseSceneJSON(ctx, sceneData) if err != nil { From 6abf2d63341ccaab49c79a81ceba72f9fcd58af0 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 13:36:05 +0900 Subject: [PATCH 03/13] url change --- .../internal/usecase/interactor/nlslayer.go | 4 +- server/internal/usecase/interactor/scene.go | 4 +- .../usecase/interactor/storytelling.go | 6 +-- server/pkg/scene/builder/decoder.go | 43 ++++++++++++++----- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/server/internal/usecase/interactor/nlslayer.go b/server/internal/usecase/interactor/nlslayer.go index 79c894d15..2a13787be 100644 --- a/server/internal/usecase/interactor/nlslayer.go +++ b/server/internal/usecase/interactor/nlslayer.go @@ -871,7 +871,7 @@ func (i *NLSLayer) ImportNLSLayers(ctx context.Context, sceneID idx.ID[id.Scene] if err != nil { return nil, nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, schema, nlsLayerJSON.Infobox.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, schema, nlsLayerJSON.Infobox.Property) if err != nil { return nil, nil, err } @@ -888,7 +888,7 @@ func (i *NLSLayer) ImportNLSLayers(ctx context.Context, sceneID idx.ID[id.Scene] if err != nil { return nil, nil, err } - propB, err = builder.AddItemFromPropertyJSON(propB, schemaB, b.Property) + propB, err = builder.AddItemFromPropertyJSON(ctx, propB, schemaB, b.Property) if err != nil { return nil, nil, err } diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index 49a61152b..bd5a7faaf 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -773,7 +773,7 @@ func (i *Scene) ImportScene(ctx context.Context, sce *scene.Scene, prj *project. if err != nil { return nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, ps, widgetJSON.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, ps, widgetJSON.Property) if err != nil { return nil, err } @@ -817,7 +817,7 @@ func (i *Scene) ImportScene(ctx context.Context, sce *scene.Scene, prj *project. if err != nil { return nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, schema, sceneJSON.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, schema, sceneJSON.Property) if err != nil { return nil, err } diff --git a/server/internal/usecase/interactor/storytelling.go b/server/internal/usecase/interactor/storytelling.go index 29ebfce53..3c64d2c05 100644 --- a/server/internal/usecase/interactor/storytelling.go +++ b/server/internal/usecase/interactor/storytelling.go @@ -1035,7 +1035,7 @@ func (i *Storytelling) ImportStory(ctx context.Context, sceneID idx.ID[id.Scene] if err != nil { return nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, ps, blockJSON.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, ps, blockJSON.Property) if err != nil { return nil, err } @@ -1064,7 +1064,7 @@ func (i *Storytelling) ImportStory(ctx context.Context, sceneID idx.ID[id.Scene] if err != nil { return nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, ps, pageJSON.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, ps, pageJSON.Property) if err != nil { return nil, err } @@ -1101,7 +1101,7 @@ func (i *Storytelling) ImportStory(ctx context.Context, sceneID idx.ID[id.Scene] if err != nil { return nil, err } - prop, err = builder.AddItemFromPropertyJSON(prop, ps, storyJSON.Property) + prop, err = builder.AddItemFromPropertyJSON(ctx, prop, ps, storyJSON.Property) if err != nil { return nil, err } diff --git a/server/pkg/scene/builder/decoder.go b/server/pkg/scene/builder/decoder.go index fc38201ad..94fa9c4b8 100644 --- a/server/pkg/scene/builder/decoder.go +++ b/server/pkg/scene/builder/decoder.go @@ -4,7 +4,10 @@ import ( "context" "encoding/json" "fmt" + "net/url" + "strings" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/pkg/id" "github.com/reearth/reearth/server/pkg/property" "github.com/reearth/reearth/server/pkg/scene" @@ -106,7 +109,7 @@ func parseWidgetAreaPadding(paddingJSON *widgetAreaPaddingJSON) *scene.WidgetAre ) } -func AddItemFromPropertyJSON(prop *property.Property, ps *property.Schema, pj propertyJSON) (*property.Property, error) { +func AddItemFromPropertyJSON(ctx context.Context, prop *property.Property, ps *property.Schema, pj propertyJSON) (*property.Property, error) { for sgKey, value := range pj { if items, ok := value.(map[string]interface{}); ok { @@ -118,7 +121,7 @@ func AddItemFromPropertyJSON(prop *property.Property, ps *property.Schema, pj pr fieldID := id.PropertyFieldIDFromRef(&fieldKey) ptr := property.NewPointer(sgID, nil, fieldID) - pv, ok := parsePropertyValue(value) + pv, ok := parsePropertyValue(ctx, value) if ok && ps != nil { _, _, _, err := prop.UpdateValue(ps, ptr, pv) @@ -144,7 +147,7 @@ func AddItemFromPropertyJSON(prop *property.Property, ps *property.Schema, pj pr if fieldKey == "id" { continue } - ov, ok := parsePropertyOptionalValue(value) + ov, ok := parsePropertyOptionalValue(ctx, value) if ok { fieldID := id.PropertyFieldIDFromRef(&fieldKey) field := property.NewField(*fieldID). @@ -161,20 +164,40 @@ func AddItemFromPropertyJSON(prop *property.Property, ps *property.Schema, pj pr return prop, nil } -func parsePropertyValue(value interface{}) (*property.Value, bool) { +func parsePropertyValue(ctx context.Context, value interface{}) (*property.Value, bool) { if fieldObj, ok := value.(map[string]interface{}); ok { - fieldType, ok1 := fieldObj["type"].(string) - fieldVal, ok2 := fieldObj["value"] - if ok1 && ok2 { - return property.ValueType(fieldType).ValueFrom(fieldVal), ok + if fieldType, ok := fieldObj["type"].(string); ok { + if fieldVal, ok := fieldObj["value"].(string); ok { + if fieldType == "url" { + urlVal, err := url.Parse(fieldVal) + if err != nil { + fmt.Printf("invalid url: %v\n", err.Error()) + return nil, false + } + if urlVal.Host == "localhost:8080" || strings.HasSuffix(urlVal.Host, ".reearth.dev") || strings.HasSuffix(urlVal.Host, ".reearth.io") { + currentHost := adapter.CurrentHost(ctx) + currentHost = strings.TrimPrefix(currentHost, "https://") + currentHost = strings.TrimPrefix(currentHost, "http://") + urlVal.Host = currentHost + if currentHost == "localhost:8080" { + urlVal.Scheme = "http" + } else { + urlVal.Scheme = "https" + } + fieldVal = urlVal.String() + + } + } + return property.ValueType(fieldType).ValueFrom(fieldVal), ok + } } } fmt.Printf("property is unreadable %v\n", value) return nil, false } -func parsePropertyOptionalValue(value interface{}) (*property.OptionalValue, bool) { - pv, ok := parsePropertyValue(value) +func parsePropertyOptionalValue(ctx context.Context, value interface{}) (*property.OptionalValue, bool) { + pv, ok := parsePropertyValue(ctx, value) if ok { ov := property.NewOptionalValue(pv.Type(), pv) return ov, true From 46765a327efba0c0d6fd5dcd84f6bcc6197f41d6 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 14:48:31 +0900 Subject: [PATCH 04/13] update test --- server/e2e/gql_import_export_test.go | 35 ++++++++++++++------ server/internal/usecase/interactor/plugin.go | 3 +- server/internal/usecase/interactor/scene.go | 12 +++---- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index fd08c8bf1..d511c55d4 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -1,12 +1,17 @@ package e2e import ( + "fmt" "net/http" + "os" "testing" + "github.com/gavv/httpexpect/v2" "github.com/reearth/reearth/server/internal/app/config" + "github.com/stretchr/testify/assert" ) +// export REEARTH_DB=mongodb://localhost // go test -v -run TestCallExportProject ./e2e/... func TestCallExportProject(t *testing.T) { @@ -19,20 +24,28 @@ func TestCallExportProject(t *testing.T) { }, true, baseSeeder) pID := createProject(e, "test") - _, _, sID := createScene(e, pID) - createStory(e, sID, "test", 0) + fileName := "project_data.zip" + expor(t, e, pID, fileName) + + defer func() { + err := os.Remove(fileName) + assert.Nil(t, err) + }() + +} + +func expor(t *testing.T, e *httpexpect.Expect, p string, fileName string) { requestBody := GraphQLRequest{ OperationName: "ExportProject", Query: "mutation ExportProject($projectId: ID!) { exportProject(input: {projectId: $projectId}) { projectDataPath __typename } }", Variables: map[string]any{ - "projectId": pID, + "projectId": p, }, } - - e.POST("/api/graphql"). + downloadPath := e.POST("/api/graphql"). WithHeader("Origin", "https://example.com"). WithHeader("authorization", "Bearer test"). WithHeader("X-Reearth-Debug-User", uID.String()). @@ -45,10 +58,12 @@ func TestCallExportProject(t *testing.T) { Value("data").Object(). Value("exportProject").Object(). Value("projectDataPath").String().Raw() + fmt.Println(downloadPath) - // downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", projectDataPath)). - // Expect(). - // Status(http.StatusOK). - // Body() - // fmt.Println(downloadResponse) + downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", downloadPath)). + Expect(). + Status(http.StatusOK). + Body().Raw() + err := os.WriteFile(fileName, []byte(downloadResponse), os.ModePerm) + assert.Nil(t, err) } diff --git a/server/internal/usecase/interactor/plugin.go b/server/internal/usecase/interactor/plugin.go index df315405c..bf6eee16c 100644 --- a/server/internal/usecase/interactor/plugin.go +++ b/server/internal/usecase/interactor/plugin.go @@ -95,8 +95,7 @@ func (i *Plugin) ExportPlugins(ctx context.Context, sce *scene.Scene, zipWriter return nil, nil, err } - _, err = io.Copy(zipEntry, stream) - if err != nil { + if _, err = io.Copy(zipEntry, stream); err != nil { _ = stream.Close() return nil, nil, err } diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index bd5a7faaf..629e31086 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -642,12 +642,10 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter c := actualLayer.Config() if c != nil { actualConfig := *c - data, ok := actualConfig["data"].(map[string]any) - if ok { + if data, ok := actualConfig["data"].(map[string]any); ok { u, ok := data["url"].(*url.URL) if ok { - isReearth, u := convertReearthEnv(ctx, u) - if isReearth { + if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } @@ -681,8 +679,7 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter if !ok { continue } - isReearth, u := convertReearthEnv(ctx, u) - if isReearth { + if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } @@ -711,8 +708,7 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter if !ok { continue } - isReearth, u := convertReearthEnv(ctx, u) - if isReearth { + if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) } From 3ec99a8d03d34619f84eb69e83f45c11dba004f4 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 15:51:18 +0900 Subject: [PATCH 05/13] update --- server/e2e/gql_import_export_test.go | 45 +++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index d511c55d4..d5602cdd0 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -23,12 +23,12 @@ func TestCallExportProject(t *testing.T) { }, }, true, baseSeeder) - pID := createProject(e, "test") + pID := createProjectWithExternalImage(e, "test") + _, _, sID := createScene(e, pID) createStory(e, sID, "test", 0) - fileName := "project_data.zip" - expor(t, e, pID, fileName) + fileName := exporProject(t, e, pID) defer func() { err := os.Remove(fileName) @@ -37,7 +37,41 @@ func TestCallExportProject(t *testing.T) { } -func expor(t *testing.T, e *httpexpect.Expect, p string, fileName string) { +func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { + requestBody := GraphQLRequest{ + OperationName: "CreateProject", + Query: `mutation CreateProject($teamId: ID!, $visualizer: Visualizer!, $name: String!, $description: String!, $imageUrl: URL, $coreSupport: Boolean) { + createProject( input: {teamId: $teamId, visualizer: $visualizer, name: $name, description: $description, imageUrl: $imageUrl, coreSupport: $coreSupport} ) { + project { + id + __typename + } + __typename + } + }`, + Variables: map[string]any{ + "name": name, + "description": "abc", + "imageUrl": "https://test.com/aaaaa.jpg", + "teamId": wID.String(), + "visualizer": "CESIUM", + "coreSupport": true, + }, + } + + res := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithHeader("Content-Type", "application/json"). + WithJSON(requestBody). + Expect(). + Status(http.StatusOK). + JSON() + + return res.Path("$.data.createProject.project.id").Raw().(string) +} + +func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { requestBody := GraphQLRequest{ OperationName: "ExportProject", Query: "mutation ExportProject($projectId: ID!) { exportProject(input: {projectId: $projectId}) { projectDataPath __typename } }", @@ -64,6 +98,9 @@ func expor(t *testing.T, e *httpexpect.Expect, p string, fileName string) { Expect(). Status(http.StatusOK). Body().Raw() + + fileName := "project_data.zip" err := os.WriteFile(fileName, []byte(downloadResponse), os.ModePerm) assert.Nil(t, err) + return fileName } From 1080e20f9422f40200cd9f8005a8a80ba20584c6 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 16:52:15 +0900 Subject: [PATCH 06/13] test update --- server/e2e/gql_import_export_test.go | 39 ++++++++++++++++++--- server/internal/usecase/interactor/scene.go | 7 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index d5602cdd0..8296c103e 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -26,7 +26,35 @@ func TestCallExportProject(t *testing.T) { pID := createProjectWithExternalImage(e, "test") _, _, sID := createScene(e, pID) - createStory(e, sID, "test", 0) + + _, _, storyID := createStory(e, sID, "test", 0) + + _, _, pageID := createPage(e, sID, storyID, "test", true) + + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + + _, res := fetchSceneForStories(e, sID) + + blocks := res.Object().Value("data").Object(). + Value("node").Object(). + Value("stories").Array().First().Object(). + Value("pages").Array().First().Object(). + Value("blocks").Array().Iter() + + propID1 := blocks[0].Object().Value("propertyId").Raw().(string) + propID2 := blocks[1].Object().Value("propertyId").Raw().(string) + propID3 := blocks[2].Object().Value("propertyId").Raw().(string) + + _, res = updatePropertyValue(e, propID1, "default", "", "src", "http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") + + _, res = updatePropertyValue(e, propID2, "default", wID.String(), "src", "https://test.com/project.jpg", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://test.com/project.jpg") + + _, res = updatePropertyValue(e, propID3, "default", wID.String(), "src", "https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") fileName := exporProject(t, e, pID) @@ -52,7 +80,7 @@ func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { Variables: map[string]any{ "name": name, "description": "abc", - "imageUrl": "https://test.com/aaaaa.jpg", + "imageUrl": "https://test.com/project.jpg", "teamId": wID.String(), "visualizer": "CESIUM", "coreSupport": true, @@ -79,7 +107,7 @@ func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { "projectId": p, }, } - downloadPath := e.POST("/api/graphql"). + r := e.POST("/api/graphql"). WithHeader("Origin", "https://example.com"). WithHeader("authorization", "Bearer test"). WithHeader("X-Reearth-Debug-User", uID.String()). @@ -88,11 +116,12 @@ func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { Expect(). Status(http.StatusOK). JSON(). - Object(). + Object() + fmt.Println(r) + downloadPath := r. Value("data").Object(). Value("exportProject").Object(). Value("projectDataPath").String().Raw() - fmt.Println(downloadPath) downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", downloadPath)). Expect(). diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index 629e31086..8ebbf8c54 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -25,6 +25,7 @@ import ( "github.com/reearth/reearth/server/pkg/scene/builder" "github.com/reearth/reearth/server/pkg/visualizer" "github.com/reearth/reearthx/idx" + "github.com/reearth/reearthx/log" "github.com/reearth/reearthx/rerror" "github.com/reearth/reearthx/usecasex" "github.com/samber/lo" @@ -647,7 +648,7 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter if ok { if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Fail nLayer addZipAsset :", err.Error()) } } } @@ -681,7 +682,7 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter } if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Fail widget addZipAsset :", err.Error()) } } } @@ -710,7 +711,7 @@ func (i *Scene) ExportScene(ctx context.Context, prj *project.Project, zipWriter } if isReearth, u := convertReearthEnv(ctx, u); isReearth { if err := i.addZipAsset(ctx, zipWriter, u.Path); err != nil { - return nil, nil, errors.New("Fail addZipAsset :" + err.Error()) + log.Infofc(ctx, "Fail page block addZipAsset :", err.Error()) } } } From 6d82b489906dce579e922eadf5f590b91a41f470 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 18:03:39 +0900 Subject: [PATCH 07/13] update ImportNLSLayers --- .../internal/usecase/interactor/nlslayer.go | 30 +++++++++++++++++++ server/pkg/scene/builder/decoder.go | 6 ++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/server/internal/usecase/interactor/nlslayer.go b/server/internal/usecase/interactor/nlslayer.go index 2a13787be..80f7cefdf 100644 --- a/server/internal/usecase/interactor/nlslayer.go +++ b/server/internal/usecase/interactor/nlslayer.go @@ -3,7 +3,10 @@ package interactor import ( "context" "errors" + "net/url" + "strings" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/internal/usecase" "github.com/reearth/reearth/server/internal/usecase/interfaces" "github.com/reearth/reearth/server/internal/usecase/repo" @@ -17,6 +20,7 @@ import ( "github.com/reearth/reearth/server/pkg/scene/builder" "github.com/reearth/reearthx/account/accountusecase/accountrepo" "github.com/reearth/reearthx/idx" + "github.com/reearth/reearthx/log" "github.com/reearth/reearthx/rerror" "github.com/reearth/reearthx/usecasex" ) @@ -854,6 +858,32 @@ func (i *NLSLayer) ImportNLSLayers(ctx context.Context, sceneID idx.ID[id.Scene] nlayerIDs = append(nlayerIDs, newNLSLayerID) replaceNLSLayerIDs[nlsLayerJSON.ID] = newNLSLayerID + if nlsLayerJSON.Config != nil { + config := *nlsLayerJSON.Config + if data, ok := config["data"].(map[string]interface{}); ok { + if u, ok := data["url"].(string); ok { + urlVal, err := url.Parse(u) + if err != nil { + log.Infofc(ctx, "invalid url: %v\n", err.Error()) + return nil, nil, err + } + if urlVal.Host == "localhost:8080" || strings.HasSuffix(urlVal.Host, ".reearth.dev") || strings.HasSuffix(urlVal.Host, ".reearth.io") { + currentHost := adapter.CurrentHost(ctx) + currentHost = strings.TrimPrefix(currentHost, "https://") + currentHost = strings.TrimPrefix(currentHost, "http://") + urlVal.Host = currentHost + if currentHost == "localhost:8080" { + urlVal.Scheme = "http" + } else { + urlVal.Scheme = "https" + } + data["url"] = urlVal.String() + } + } + } + + } + nlBuilder := nlslayer.New(). ID(newNLSLayerID). Simple(). diff --git a/server/pkg/scene/builder/decoder.go b/server/pkg/scene/builder/decoder.go index 94fa9c4b8..3034e8f2e 100644 --- a/server/pkg/scene/builder/decoder.go +++ b/server/pkg/scene/builder/decoder.go @@ -3,7 +3,6 @@ package builder import ( "context" "encoding/json" - "fmt" "net/url" "strings" @@ -12,6 +11,7 @@ import ( "github.com/reearth/reearth/server/pkg/property" "github.com/reearth/reearth/server/pkg/scene" "github.com/reearth/reearthx/idx" + "github.com/reearth/reearthx/log" ) func ParseSceneJSON(ctx context.Context, sceneJSONData map[string]interface{}) (*sceneJSON, error) { @@ -171,7 +171,7 @@ func parsePropertyValue(ctx context.Context, value interface{}) (*property.Value if fieldType == "url" { urlVal, err := url.Parse(fieldVal) if err != nil { - fmt.Printf("invalid url: %v\n", err.Error()) + log.Infofc(ctx, "invalid url: %v\n", err.Error()) return nil, false } if urlVal.Host == "localhost:8080" || strings.HasSuffix(urlVal.Host, ".reearth.dev") || strings.HasSuffix(urlVal.Host, ".reearth.io") { @@ -192,7 +192,7 @@ func parsePropertyValue(ctx context.Context, value interface{}) (*property.Value } } } - fmt.Printf("property is unreadable %v\n", value) + log.Infofc(ctx, "property is unreadable %v\n", value) return nil, false } From 557dc49414d597afe5a0e20e857f88ff6c2272d1 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Tue, 29 Oct 2024 18:34:15 +0900 Subject: [PATCH 08/13] update test --- server/internal/usecase/interactor/nlslayer.go | 2 ++ server/internal/usecase/interactor/nlslayer_test.go | 4 +++- server/internal/usecase/interactor/project_test.go | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/server/internal/usecase/interactor/nlslayer.go b/server/internal/usecase/interactor/nlslayer.go index 80f7cefdf..3f5bcfbd3 100644 --- a/server/internal/usecase/interactor/nlslayer.go +++ b/server/internal/usecase/interactor/nlslayer.go @@ -3,6 +3,7 @@ package interactor import ( "context" "errors" + "fmt" "net/url" "strings" @@ -877,6 +878,7 @@ func (i *NLSLayer) ImportNLSLayers(ctx context.Context, sceneID idx.ID[id.Scene] } else { urlVal.Scheme = "https" } + fmt.Printf("==== currentHost %s \n", currentHost) data["url"] = urlVal.String() } } diff --git a/server/internal/usecase/interactor/nlslayer_test.go b/server/internal/usecase/interactor/nlslayer_test.go index 629945f33..5372f28c8 100644 --- a/server/internal/usecase/interactor/nlslayer_test.go +++ b/server/internal/usecase/interactor/nlslayer_test.go @@ -6,6 +6,7 @@ import ( "fmt" "testing" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/internal/adapter/gql/gqlmodel" "github.com/reearth/reearth/server/internal/infrastructure/memory" "github.com/reearth/reearth/server/internal/usecase" @@ -264,6 +265,7 @@ func TestDeleteGeoJSONFeature(t *testing.T) { // go test -v -run TestImportNLSLayers ./internal/usecase/interactor/... func TestImportNLSLayers(t *testing.T) { ctx := context.Background() + ctx = adapter.AttachCurrentHost(ctx, "https://xxxx.reearth.dev") db := memory.New() ifl := NewNLSLayer(db) @@ -323,7 +325,7 @@ func TestImportNLSLayers(t *testing.T) { "lngColumn": "lng" }, "type": "csv", - "url": "http://localhost:8080/assets/01j7g9gpba44e0nxwc727nax0q.csv" + "url": "https://xxxx.reearth.dev/assets/01j7g9gpba44e0nxwc727nax0q.csv" } }, "title": "japan_architecture (2).csv", diff --git a/server/internal/usecase/interactor/project_test.go b/server/internal/usecase/interactor/project_test.go index 7579f07b0..d9283e628 100644 --- a/server/internal/usecase/interactor/project_test.go +++ b/server/internal/usecase/interactor/project_test.go @@ -7,6 +7,7 @@ import ( "net/url" "testing" + "github.com/reearth/reearth/server/internal/adapter" "github.com/reearth/reearth/server/internal/adapter/gql/gqlmodel" "github.com/reearth/reearth/server/internal/infrastructure/fs" "github.com/reearth/reearth/server/internal/infrastructure/memory" @@ -149,6 +150,7 @@ func TestProject_Create(t *testing.T) { func TestImportProject(t *testing.T) { ctx := context.Background() + ctx = adapter.AttachCurrentHost(ctx, "https://xxxx.reearth.dev") db := memory.New() ifp := NewProject(db, &gateway.Container{ @@ -232,10 +234,10 @@ func TestImportProject(t *testing.T) { "publicImage": "", "publicNoIndex": false, "imageUrl": { - "Scheme": "http", + "Scheme": "https", "Opaque": "", "User": null, - "Host": "localhost:8080", + "Host": "xxxx.reearth.dev", "Path": "/assets/01j7g9d988ct8hajjxfsb6e1n6.jpeg", "RawPath": "", "OmitHost": false, From 634644b8fdb28dd5288dff3ac21f60d1aa74d775 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Wed, 30 Oct 2024 09:55:47 +0900 Subject: [PATCH 09/13] add ImportProject test --- server/e2e/gql_import_export_test.go | 64 ++++++++++++++++-- server/e2e/test.zip | Bin 0 -> 82273 bytes .../internal/usecase/interactor/nlslayer.go | 2 - 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 server/e2e/test.zip diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index 8296c103e..67bf46938 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -1,6 +1,7 @@ package e2e import ( + "encoding/json" "fmt" "net/http" "os" @@ -65,6 +66,59 @@ func TestCallExportProject(t *testing.T) { } +// export REEARTH_DB=mongodb://localhost +// go test -v -run TestCallImportProject ./e2e/... + +func TestCallImportProject(t *testing.T) { + + e := StartServer(t, &config.Config{ + Origins: []string{"https://example.com"}, + AuthSrv: config.AuthSrvConfig{ + Disabled: true, + }, + }, true, baseSeeder) + + filePath := "test.zip" + file, err := os.Open(filePath) + if err != nil { + t.Fatalf("failed to open file: %v", err) + } + defer func() { + if cerr := file.Close(); cerr != nil && err == nil { + err = cerr + } + }() + requestBody := map[string]interface{}{ + "operationName": "ImportProject", + "variables": map[string]interface{}{ + "teamId": wID.String(), + "file": nil, + }, + "query": `mutation ImportProject($teamId: ID!, $file: Upload!) { + importProject(input: {teamId: $teamId, file: $file}) { + projectData + __typename + } + }`, + } + r := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("authorization", "Bearer test"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithMultipart(). + WithFormField("operations", toJSONString(requestBody)). + WithFormField("map", `{"0": ["variables.file"]}`). + WithFile("0", filePath). + Expect(). + Status(http.StatusOK). + JSON(). + Object() + + r.Value("data").Object().Value("importProject").Object().Value("projectData").NotNull() + // projectData := r.Value("data").Object().Value("importProject").Object().Value("projectData").Raw() + // fmt.Println(toJSONString(projectData)) +} + func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { requestBody := GraphQLRequest{ OperationName: "CreateProject", @@ -86,7 +140,6 @@ func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { "coreSupport": true, }, } - res := e.POST("/api/graphql"). WithHeader("Origin", "https://example.com"). WithHeader("X-Reearth-Debug-User", uID.String()). @@ -95,7 +148,6 @@ func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { Expect(). Status(http.StatusOK). JSON() - return res.Path("$.data.createProject.project.id").Raw().(string) } @@ -117,19 +169,21 @@ func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { Status(http.StatusOK). JSON(). Object() - fmt.Println(r) downloadPath := r. Value("data").Object(). Value("exportProject").Object(). Value("projectDataPath").String().Raw() - downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", downloadPath)). Expect(). Status(http.StatusOK). Body().Raw() - fileName := "project_data.zip" err := os.WriteFile(fileName, []byte(downloadResponse), os.ModePerm) assert.Nil(t, err) return fileName } + +func toJSONString(v interface{}) string { + jsonData, _ := json.Marshal(v) + return string(jsonData) +} diff --git a/server/e2e/test.zip b/server/e2e/test.zip new file mode 100644 index 0000000000000000000000000000000000000000..f74690bb96dc29e9fdc5ac5adca70561aa743f46 GIT binary patch literal 82273 zcmV(=K-s@gO9KQH00;mG0000000000000000000003`qb0AX`;Wpr~dFfnRkVsdLS zbZ0eadS+*IH8*;9cX)Ygb}%k*ZfBI5*}j(@~wNirun@-4}O2Z_rZCczu-JO@!Fb7c-WNKNJvO{D$4R8BqXH9|AC2) zgoGqHfzFSFgoNrXtD=XAiHRA4X&Z-xgk%wt-dBT_4pM?pcsLBZq|2I{fR zAfaVt{U|{$XfvwM2EkyPYA=>@<}x&mvtjQkevR(0+3j*>j8 z46dgu&T7swP6&iYP>0AV5Xy@5<;XZ+Jq?k`S0Td6Lld^WxP%NtwRJRLOS};`8G6bs z#dofVEEyC~WxGq>aiV{>!^pVgLvoXVhrT}p@84$IOFwyEy{@pkJnyTju754v=O!-w zFTUYx7I%yPcinp1mGj)-Jg<2?+%AYci8F}&8F-2ITg!d9+IXee!g*=GTkOd>#vz@S zzHr;P7;9Rv_#pdS0zBaPteS!d75L#(QzO0A5w>xcJNC=L8#iBXC^P|@Kf;%y|BB#w zquKC!!ns{P`<>r&d`&qWexMcdBG3%B$k2VYcbn)(;zNbbvZ28-{ODSTUQre=&6G|g z$L5II|KzAE0yGYTL8^}P`GV;$*Me(n{d8DiZ~YBCXdTyT;bU(X{?hs953i38O<_aG zFX6Az9cIQ#yCOG*B;*njYz0i@65=0w zIXmJl@uA7WF$B+6Yl6VC5S1{GN6E3y2Z5femN0|I?C|HO!j zPqSXa57iR-VOhmo_FOiRV}bgd6FzhIaMyh*BC+4`N_I5*a?x`q{+hWM#*+W=`q zTEc&G_ku{4;?39SE<1nD1Po@SASi6AQ9V_Qp(=n>UF+jn<{F7-g68^S)Cw8g51eF%Lkg2!s@L2WKx{2yz6v@h@8yM(=MJa6Sc>~!{oH7~wZM!XKR zysjwNo%ruVd-(UNyeAI{$A^H8paB9EfE9#c2-DW@w}s8!qdufsnGf2k&Q|h$9ySu8 z`aSg-QcnuC4MlUbL0T5X#^js*y;w|;XXddW-6|#(1{b>nY}^`x+MM(6ij_viS6B&0CwkURyo7A z)83xS-p>4ce2#;+q-?Ie9ba%TZtmWWES@;5F*oe1LM`AJY{WxG;8fJ|M#d8P3)*U- zxk1uQ+OUWqeuk1L5T!QZJaDY%DNkLIBe6M2UDj^euXnr7_5?dVoGZL^x0=dEnL_h? zz0^Z|GC3)3-G=>JCCkz%e=d*q5TDsNvZ5$dm*qg71#x7}2`oD|Fb7SJkcVjRTjgvrV~ z;Q`b5cZuT*hCe5wx?t~Zr1#>d&kPk-eSsD5vg|_2ox!-aV8ne6LC^?AHP_G|TYg}G zHKwBpLTNG{N`$R%?!acs1;mk0=5{m-|>wIC@l z0pJkyQ`)sR-vE=1#sTbQCM$qz@ItrlZYp#w{K@|;1i5E1+-^~eYFhfDnl9J%@kUYK zAQP;*3&ZLfHe}-M7lQ~feN6<&s+tDvGW_$9h&W&QTKz@O5x9}&t>}WH42cPgoHc$Y z;=o%1EMeEjsOZ1nH7?SYvyaR zVMUz<-~`8GB!v_4!n>cll1k@Tx#5dUxa(v4%JDFgHG7Q>KM)5wlfoHT0rDkicAx_6 z5PEJg0SKoosVO5jpEiE$SDAaRw)iLhHu`w|$o0n27`77e3io)z%UmHi&&~B%+Q=ge zAqa707Uv)yGH#sts@t>;FUv1o&PkJ{|CeiNL;O?u(^vLrdZo}wwi4}??_V>S@*%>C zmPi$-jeU;HS;kH(^}qs%0=_5=H=0rKk9@)mIcjhvn6X$U32Vps;X+l7&zTe8Q@r`< zi*P!spC;jkaheUPAfIC38(+qpa-MZU+dP5fs3BP0(FHTqKq__~iBFzCA=snasJ4rp zHDey%__#$kA$&vW&4CqP^2(;?WbyUrKKkh~{Ixn?_^0$`nbe~=`@!otqMpev3y3A- zHXipSab_2`+zyUc6QS+>lh_+ajNmIIsQbvlJM^KwnU{hzn(>jgq{&u;3y$~B4I*Sy zYiv-^XnDtQ&0e&3XUv){67=&q37M8cElF}^zW5LUEKGl1hcT{*fiR=OqWRz3FlVI; zUx}@xS`W159ClpFGuZLBZ+eXw=~zkv0M%rDoX@nweM|XPDIKm9X9w@eLKg(ir(1z^Y%5yk!AQ6b2^nW?(u!&1MpD zWPwRRV!vLRS3jEn|(C{DByk)4#slV&$GJ8 zgB6(l-hJ7ZXW22;XjvzaqgT{QO7UxA8TMJfdy&@UGhbYhAk%$5@4o7}ugrh`DnI;& z|G%K7!r$l~t{I{>{t>+$=GS5+lsYYKRK%?pC2n2yGF(K6>e1vH{H>NCu zNXA9qt3)=Pv3Rj$R6G(k#UV7jp6o_EM4h}$HBO$BA09Kh-JD9jS8h|Qi0h7P^`pI# zrhS(xN^>SJ*GgrWBHx+L5rk;ziwtbeEMT8~t{^UDK7LmmfSfFI5uj=(m)-Yo1U*5{ z{&RaT{=+%L>KL4f05BW@SQdM9FXmAJ-D5-InK(xu7*{zqPwt@&ktl%4u5ewdt^~dp zl#LeYCBZq?^lfnwv+!qCrqfg3Fqh}d{D>n(DuH&!Z zCBr_hklit(K2UUN^p=GKu*Xw4MO`5UmQ?%=AXVPrHA{$9eHRB>X$r0rtSD#l3uK|4 zm+T9a$ygkHlM`1}hGax{k`y4La8D;vQFpbjyS0zetl-2%MGG{8RHB0K-&a@j3aAo2 zX?)SSqLA-R@HrOhz9v5~q@}Yuj+r>30K{x|aPJO`RW@Ar{AvsuTdH`f@OZtSa^V@5 z7WgTB+ZDch#OVCI&f zWREpkDk&_Td;0yl-}CSJfCm=#Z&6zO=iB4?TSIfrtAHKx3MHVkkA4}mz zrl?KlK(6#mr&>o4vX{-7kwG9l=`NrImjxsuRlk{$33R$!=Ix6Nyz0cqODVgRYp1c0U+nxwlZUKETztL$Fyx$d6S$Bl+8581*1k z8y0Hevf01yHb|55VBZSMf0YUpo@cwBYiqFVeVn`UULoe>I_Ehs74=h|DT1;*X5gmo z>3(4;?=Alleo#nC@!)&>Q7-m5Y(Lmn=S{Lx4GoE?&Op?x{3pVON(7v zH|l2U{(^Jfny;`!VTWI)_trMZ3Zr#;C!pI(ou!DP7LPh9pdyFDD1{BKQW=%hb)Si- z!;yHhH@Xd;u}hWEO=z$2L~MQ_xdAZjWY~gbNFJg>Xrk%prp;#G5QE?S#?UxAK=A8t z!huESARJDi@1_FS2`y$ve%akw%$my4aitjeP))+eR3;OLdL9qAscauPEx-TtQ9Ifq z!}WI)`&CciqV8ul^}VcfGeXi~BNh{Jn-7$s;@~T$KL$TnBi<+yIB~}=uybr_Tvxbz` z&@@+IF%X1MGsq>?1JIT0)_wl#4D2n!w}2auZO zpOcV{B1RcGCUHgnXJ0hF$;hM$-8yeUbe|NT32DsIsYlzeI@m$id2?Ws@l zX1nS95n@+Z7!z8_dP6Pg-unFl|NS~-@q+QTe;0zhbDQ6>E+F?-9t9F4>{Lqx?k~Ov^0r>2>|Qy;@Nq{u{tM693`KZXJZr$ zC}lQxTc~X85O|VOSqwEC=MbE3l9YZe7a2kd+peo5cWCpzgZ^pncTD6<;0fFR&=_-I z(cX_Z!bY1<+<9y=3pw}%fHj<)jn^u^Q{b%37QfRByuA%}EWu>B8l($^so3D)(<&ug z<-hK_xUPgnQ4dj)e#63-t{q-jfI_e077Z#h9;#9t3?XI|h>UW!944PnR+S0PVuODQ zgBBVn{`jyMT9kjN$3?51E%ZxT>YR=Qi;W(o*rY;gutOOJoH}wUF%K~E zb2dljKAYv7(!y~b0h746fM2sSIHubTd8ukJ*8n&ivhMk^!mV#cM8s*)p|OyFD29K| zaG&!IYX4{#$8a^UW6;(qqGYKv^qBj_9&pXACFzGo@Q*&a zH(C10UPm0w(a?o=0UXx6HTdtn#m&4gOOw@_UD(y~q6*(N9A9dDazSr?=ujuZ_q`1@ zALemE6U(rC!k4fvd+(rky;m|{Cq$Jbe-MRE`2>@hEb66YdoD#5RPt&7hf=&4(LcBm zvgM+EZ>`{Ejjw_dZ?wsa|QtD41~l9bogn~Dquo%yW7iMC?x=Znxw z1?5kLkUsL^hf6@qdZ)_9t)WRGaq2xkq0|kz4HiRTBAg<6GN(JU*GC`C2!|wg|Nh?8 zG-UFp8YzBguj9k{PJ@jp0t{E0%yjweuN8P*jZ!643^N)p!BkUC{*5zzo08Tbq+vEQ zpEUiH!bA7WHYNR*ArU#Nla`7EsmLbyI{XKZi>6C!+}^tIZ+qULb>GoZ4tew?(4v{s zel=u2TI5n{8@9K(2^o75AJ`_lW4IbJiLLrfMH{?}J(&?fE5Wh%fSc#8ec#MgCSPb$ zBcIzuYOu)WR;w}L<3hH>Sqk3$NWc-9)s3Wo(U{ed5cZvM#TZPD3d2-)BD_A^ccpJ7pt;J??N$BozH z-;Y@{`xs$==pL!0FVXN05g~qZ7fv6El+r>IJ`LaOs3 z3!AXPKS|X`Pz;ZgM9G8&W00nyOTh7|Tqha(48??!)D3xBIjZcHBu_W^$Mqh15s5*~ z891zY`~Dub2Tr^*ug^t3pvHC-;aVZjd+6;yao4!OI$IOp+q{6itO3_b?dH&O6kRJB z;*{i^B86i_*4u}vJpN-I8Y%XYc)TD1eeS%ta+{nKo^P^qaTz_E{Mzm}UP_`WglZuc zFj7oVB5Ls)m6kdvhgB6A@7H?yHp;=S`lvM{+3@IjUkqPabkIHv8` zN6f_VF~>;*cblWk=NSg8@mwH~-JZ;~d5=GZ#ZceVu~|17XPSbv$uKLQcPocw{y)a zF|&pem0!niqUbXVDV)l0{-nP9p`mo~!9|FHrJ{ZR-&(Na{1Vsirc#$+Xw0gAvQdpm z_kFg~$KF)!G&i2XU0VE1VywXZQNcQM1rE!=}_v*Hm zUCwG~Ji~>w?0!siV#Nc?fn&D9Rt@fLjXj$~x03E_Vu}PDhk4*0sUipWsk*jtgJ}()qGx9fGyR9FZ|}z43h_zh;M%Q*|d6p@wV@Ru@Ln z6crOS&6J5NSb$I5Y>q%R-@?{k^i$4nYMC>{PZ5QJ5{5tkq9{S^!WN){PFm9y!xrW{ z6UGm?fsiiyr@FLX?C+sYNkx7pcN=rT!T0!vtxmjDmdjktE~TF7kG`}p4njh%q~7knLY4px}&-jc|@ zrfFg`VTg1q{pz&<2*Qc~UdE{c5w(0Kb*op^q{=|>ky$4}XOI*k%K51_z{+$0Y&5T- z8;=wv(`&^ap&vsuwpQB8y$r znXBXmAY+9Uco-~IShZ()fdf7kDx+I;PL8hV2sJ3qv`|&pgV-Inel?}cU<_du6*l%I z?T39qYE$l5tU0~PK3MOg)G#wZJzrkVyLdDK?f%#0J)Wjzo*9EwOsQI&^_mlSNm7f*r z*m?j0wiz1 z;lF?OdJFZ2>W3m+lN5PDS7O7%YW8W^xpqbBEJBLa%0{A|(a(V$M@ONXA%FODMHh}W z!_Frm%ksp0MR?yHq6V!;XSOH+_K)2M7mkR_%Y=poq2HbCvNKzksrIu!wOcDnYiNM| zuj^k$);nXHVs6{*x>k5|HMNcFjQ#s2Vn_Zhpq5xRtq|BOM*+O%x|LucGWJ(ifGq@Cfe~%%vNY5nSc&) z3MqQB8bbuiUUD503RK_9on6fY)>aDhCKdNlnN-VB1L;X)3qH$bh7PR66f?U2#q3VI zm;Gg_OwQy}B&a^(uQeGx$;s|;Qdg6q;qsSJwPXtKux2&DhNH28oTJCEAkOStH7lDz z3WD5Vj9U-ej>}owA)S!@SMtZ|(G+wFIa%y+V#4lo72uYs!iA(Np!oog?qRe4urFzV z{wm-zMNu*4nvwc)*yE>xPoy~Lx~AQY6X`EpU+)^J>PpO4a=jmB-~Z4U4w~DpVhMsr zupUTe@|^z^3fYxQ2A?}3_PUHNO>q?E0o-OQ+ZTrrm7OegR@Z1;kz@pxEG8^4CSLQN zU}?i*T2QF_IBPxz%0DEt8e|@JD{S!l#M7@E{#0^m!-El_%hR1S$d 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

|X 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 W%1c2&{^u#!_uTouS_y)DpZ^be5@9O< literal 0 HcmV?d00001 diff --git a/server/internal/usecase/interactor/nlslayer.go b/server/internal/usecase/interactor/nlslayer.go index 3f5bcfbd3..80f7cefdf 100644 --- a/server/internal/usecase/interactor/nlslayer.go +++ b/server/internal/usecase/interactor/nlslayer.go @@ -3,7 +3,6 @@ package interactor import ( "context" "errors" - "fmt" "net/url" "strings" @@ -878,7 +877,6 @@ func (i *NLSLayer) ImportNLSLayers(ctx context.Context, sceneID idx.ID[id.Scene] } else { urlVal.Scheme = "https" } - fmt.Printf("==== currentHost %s \n", currentHost) data["url"] = urlVal.String() } } From ed0a37e9baf6e0e8af436f71860b647287bdd657 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Wed, 30 Oct 2024 10:25:40 +0900 Subject: [PATCH 10/13] update test --- server/e2e/gql_import_export_test.go | 88 ++++++++++++++++------------ 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index 67bf46938..1decfa26c 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -79,44 +79,18 @@ func TestCallImportProject(t *testing.T) { }, true, baseSeeder) filePath := "test.zip" - file, err := os.Open(filePath) - if err != nil { - t.Fatalf("failed to open file: %v", err) - } - defer func() { - if cerr := file.Close(); cerr != nil && err == nil { - err = cerr - } - }() - requestBody := map[string]interface{}{ - "operationName": "ImportProject", - "variables": map[string]interface{}{ - "teamId": wID.String(), - "file": nil, - }, - "query": `mutation ImportProject($teamId: ID!, $file: Upload!) { - importProject(input: {teamId: $teamId, file: $file}) { - projectData - __typename - } - }`, - } - r := e.POST("/api/graphql"). - WithHeader("Origin", "https://example.com"). - WithHeader("authorization", "Bearer test"). - WithHeader("X-Reearth-Debug-User", uID.String()). - WithMultipart(). - WithFormField("operations", toJSONString(requestBody)). - WithFormField("map", `{"0": ["variables.file"]}`). - WithFile("0", filePath). - Expect(). - Status(http.StatusOK). - JSON(). - Object() - r.Value("data").Object().Value("importProject").Object().Value("projectData").NotNull() - // projectData := r.Value("data").Object().Value("importProject").Object().Value("projectData").Raw() - // fmt.Println(toJSONString(projectData)) + r := importProject(t, e, filePath) + + r.Value("project").NotNull() + r.Value("plugins").Array() + r.Value("schema").Array() + r.Value("scene").NotNull() + r.Value("nlsLayer").Array() + r.Value("style").Array() + r.Value("story").NotNull() + + // fmt.Println(toJSONString(r.Raw())) } func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { @@ -183,6 +157,46 @@ func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { return fileName } +func importProject(t *testing.T, e *httpexpect.Expect, filePath string) *httpexpect.Object { + file, err := os.Open(filePath) + if err != nil { + t.Fatalf("failed to open file: %v", err) + } + defer func() { + if cerr := file.Close(); cerr != nil && err == nil { + err = cerr + } + }() + requestBody := map[string]interface{}{ + "operationName": "ImportProject", + "variables": map[string]interface{}{ + "teamId": wID.String(), + "file": nil, + }, + "query": `mutation ImportProject($teamId: ID!, $file: Upload!) { + importProject(input: {teamId: $teamId, file: $file}) { + projectData + __typename + } + }`, + } + r := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("authorization", "Bearer test"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithMultipart(). + WithFormField("operations", toJSONString(requestBody)). + WithFormField("map", `{"0": ["variables.file"]}`). + WithFile("0", filePath). + Expect(). + Status(http.StatusOK). + JSON(). + Object() + projectData := r.Value("data").Object().Value("importProject").Object().Value("projectData") + projectData.NotNull() + return projectData.Object() +} + func toJSONString(v interface{}) string { jsonData, _ := json.Marshal(v) return string(jsonData) From 000d27d59a67c979ed836d209c73ae12fb9599f5 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Wed, 30 Oct 2024 13:19:55 +0900 Subject: [PATCH 11/13] update test --- server/e2e/gql_import_export_test.go | 469 +++++++++++++++++++++++++++ server/e2e/test.zip | Bin 82273 -> 225316 bytes 2 files changed, 469 insertions(+) diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_import_export_test.go index 1decfa26c..a61ed6678 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_import_export_test.go @@ -90,7 +90,12 @@ func TestCallImportProject(t *testing.T) { r.Value("style").Array() r.Value("story").NotNull() + sid := r.Value("scene").Object().Value("id").Raw().(string) + + r = getScene(e, sid) // fmt.Println(toJSONString(r.Raw())) + + r.Value("id").Equal(sid) } func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { @@ -197,7 +202,471 @@ func importProject(t *testing.T, e *httpexpect.Expect, filePath string) *httpexp return projectData.Object() } +func getScene(e *httpexpect.Expect, s string) *httpexpect.Object { + requestBody := GraphQLRequest{ + OperationName: "GetScene", + Query: GetSceneGuery, + Variables: map[string]any{ + "sceneId": s, + }, + } + r := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("authorization", "Bearer test"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithHeader("Content-Type", "application/json"). + WithJSON(requestBody). + Expect(). + Status(http.StatusOK). + JSON(). + Object() + v := r.Value("data").Object().Value("node") + v.NotNull() + return v.Object() +} + func toJSONString(v interface{}) string { jsonData, _ := json.Marshal(v) return string(jsonData) } + +const GetSceneGuery = ` +query GetScene($sceneId: ID!, $lang: Lang) { + node(id: $sceneId, type: SCENE) { + id + ... on Scene { + rootLayerId + teamId + projectId + property { + id + ...PropertyFragment + __typename + } + clusters { + id + name + propertyId + property { + id + ...PropertyFragment + __typename + } + __typename + } + tags { + id + label + ... on TagGroup { + tags { + id + label + __typename + } + __typename + } + __typename + } + plugins { + property { + id + ...PropertyFragment + __typename + } + plugin { + ...PluginFragment + __typename + } + __typename + } + widgets { + id + enabled + extended + pluginId + extensionId + property { + id + ...PropertyFragment + __typename + } + __typename + } + widgetAlignSystem { + ...WidgetAlignSystemFragment + __typename + } + stories { + ...StoryFragment + __typename + } + newLayers { + ...NLSLayerCommon + __typename + } + styles { + ...NLSLayerStyle + __typename + } + __typename + } + __typename + } +} +fragment PropertyFieldLink on PropertyFieldLink { + datasetId + datasetSchemaId + datasetSchemaFieldId + __typename +} +fragment PropertyFieldFragment on PropertyField { + id + fieldId + type + value + links { + ...PropertyFieldLink + __typename + } + __typename +} +fragment PropertyGroupFragment on PropertyGroup { + id + schemaGroupId + fields { + ...PropertyFieldFragment + __typename + } + __typename +} +fragment PropertyItemFragment on PropertyItem { + ... on PropertyGroupList { + id + schemaGroupId + groups { + ...PropertyGroupFragment + __typename + } + __typename + } + ... on PropertyGroup { + ...PropertyGroupFragment + __typename + } + __typename +} +fragment PropertyFragmentWithoutSchema on Property { + id + items { + ...PropertyItemFragment + __typename + } + __typename +} +fragment PropertySchemaFieldFragment on PropertySchemaField { + fieldId + title + description + translatedTitle(lang: $lang) + translatedDescription(lang: $lang) + prefix + suffix + type + defaultValue + ui + min + max + choices { + key + icon + title + translatedTitle(lang: $lang) + __typename + } + isAvailableIf { + fieldId + type + value + __typename + } + __typename +} +fragment PropertySchemaGroupFragment on PropertySchemaGroup { + schemaGroupId + title + collection + translatedTitle(lang: $lang) + isList + representativeFieldId + isAvailableIf { + fieldId + type + value + __typename + } + fields { + ...PropertySchemaFieldFragment + __typename + } + __typename +} +fragment WidgetAreaFragment on WidgetArea { + widgetIds + align + padding { + top + bottom + left + right + __typename + } + gap + centered + background + __typename +} +fragment WidgetSectionFragment on WidgetSection { + top { + ...WidgetAreaFragment + __typename + } + middle { + ...WidgetAreaFragment + __typename + } + bottom { + ...WidgetAreaFragment + __typename + } + __typename +} +fragment WidgetZoneFragment on WidgetZone { + left { + ...WidgetSectionFragment + __typename + } + center { + ...WidgetSectionFragment + __typename + } + right { + ...WidgetSectionFragment + __typename + } + __typename +} +fragment PropertyFragment on Property { + id + ...PropertyFragmentWithoutSchema + schema { + id + groups { + ...PropertySchemaGroupFragment + __typename + } + __typename + } + __typename +} +fragment StoryPageFragment on StoryPage { + id + title + swipeable + propertyId + property { + id + ...PropertyFragment + __typename + } + layersIds + blocks { + id + pluginId + extensionId + property { + id + ...PropertyFragment + __typename + } + __typename + } + __typename +} +fragment FeatureFragment on Feature { + id + type + properties + geometry { + ... on Point { + type + pointCoordinates + __typename + } + ... on LineString { + type + lineStringCoordinates + __typename + } + ... on Polygon { + type + polygonCoordinates + __typename + } + ... on MultiPolygon { + type + multiPolygonCoordinates + __typename + } + ... on GeometryCollection { + type + geometries { + ... on Point { + type + pointCoordinates + __typename + } + ... on LineString { + type + lineStringCoordinates + __typename + } + ... on Polygon { + type + polygonCoordinates + __typename + } + ... on MultiPolygon { + type + multiPolygonCoordinates + __typename + } + __typename + } + __typename + } + __typename + } + __typename +} +fragment PluginFragment on Plugin { + id + name + extensions { + extensionId + description + name + translatedDescription(lang: $lang) + translatedName(lang: $lang) + icon + singleOnly + type + widgetLayout { + extendable { + vertically + horizontally + __typename + } + extended + floating + defaultLocation { + zone + section + area + __typename + } + __typename + } + __typename + } + __typename +} +fragment WidgetAlignSystemFragment on WidgetAlignSystem { + outer { + ...WidgetZoneFragment + __typename + } + inner { + ...WidgetZoneFragment + __typename + } + __typename +} +fragment StoryFragment on Story { + id + title + panelPosition + bgColor + isBasicAuthActive + basicAuthUsername + basicAuthPassword + alias + publicTitle + publicDescription + publishmentStatus + publicImage + publicNoIndex + pages { + ...StoryPageFragment + __typename + } + __typename +} +fragment NLSLayerCommon on NLSLayer { + id + layerType + sceneId + config + title + visible + infobox { + sceneId + layerId + propertyId + property { + id + ...PropertyFragment + __typename + } + blocks { + id + pluginId + extensionId + propertyId + property { + id + ...PropertyFragment + __typename + } + __typename + } + __typename + } + isSketch + sketch { + customPropertySchema + featureCollection { + type + features { + ...FeatureFragment + __typename + } + __typename + } + __typename + } + ... on NLSLayerGroup { + children { + id + __typename + } + __typename + } + __typename +} +fragment NLSLayerStyle on Style { + id + name + value + __typename +} +` diff --git a/server/e2e/test.zip b/server/e2e/test.zip index f74690bb96dc29e9fdc5ac5adca70561aa743f46..2502e6bcb754e52700286876976eb14dd80dbb82 100644 GIT binary patch delta 100142 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

YydN zABTP@pS5(Si}&{aa(VO%g+<8U|LO0+1d2mmkKo(;LC1{4j^F$H+2zrR2Z`X%)JRUytVl6C?+QX1v)E|8%lDk&>d1hMVxYrIyh^M5fNati`SlvONLw!LFeO z%~l0!{;?|EE}3f%xpM0$jADv1Z1PyS2v4pO7iSuj?h>?sLn;P++V%Hmpk8QYODY1! zTNRA-o{G$P+AB6oMCu?V2W@tkZvv9CU2H@MTZD;<+xTR9d7X^VPrwmt*lvvrYcKiO z3Pnex$`#d`C4f|U??c$Up5pxxb`cv3u4>DH({i3Gar;P`jwB&b{Lj0(wOGkr-f!Qr z+q9=@>FvW)m%tUg0jocAHYSTC(KM6euUPzr4 z`$x8t=uUYxbkZ#*wews67krnj54N{*FO#R{p+&2HTT{O)1z?#x-wSPFfX?i+*+URR zZVwm?Ja0Wq9rbs3ZeQ-dN_xSaq`nEyn~DDWfGrBVcs#`huTE^Ve$NuzATmo{X{2wO zPD*1C@r-R`@B1eJ)2Lpx{aUlu1)&O6@$Vw)RweZzT(N(^@icEzyo|eOza?M(J$pob zo#;*FLugz*4`6W-!8!c$@lngW|93*@x6rhra;5g+HDa*n@RDP&-g9(U`p#lm{BxpN zw2s6sA}rwe*fC}Ggs|%Z?~oM`1C`{KdtE5-J;TxPgkO)QQehKw`c5T z&-O#tfL9miH%Rt#QW2Z-y-07U2Z4y*tgh^MS=0+Z7Z_2`+$Q+)A%3I7<_Yp4M;WjD z^|3@QhJuoGf4;wGS*K&_g$I1cDU3iyuBojZxEP4P`xQKA#2UZ5BS?s}n=Jo+bt)~n z$cBf}QF!v$ET0HyN&;M+Vg2BJ^$Z;p7&|uqm$?Rp!>fvY@Vtk z5_$$d%4Ga-Aub^ruJcJR$ z&%CxjzBx=G|L`usy9dWQ(?(|e$9#Cv0~-#QCEokC1k!$iI7t0V6t-=n@34+&5yiTp zYTX9t3O-1?_=UCQ2QvOJ4x)<7nk(Ga@u>c70tYAmk%`}9|tuP z222sATG-U-2T30-PDKzSC}vE*jF0LmLs$92A0F?m%VmargFsr(3do;XM+YY# zJ2Wr_q{XLqyUEvAW~FUnw;%u+Ma?0e@$eKFv$ME>(EWRBI~Vq1YatgV~s0$MuM~n0O8syah7lU~VTPn}v;o1lX z+lh;G3vcp}f#ADXnkG#b0HL8Mh&KsQ|9yr4VPmW!BqQPflKIBW|I$J-!6xM^H2oxq zl^?GsCtnYpUpL>oW?3*`&=iQm$7p->@+tG_xA5$N{upu4Jn{TY(;xs2=&USpv`BI$ zEC;6#&JY%+Gi|EwpkSoZXca~sx)No-LI{zcTB9zIjfd5zMtQx?u!mU81fMN3`@d_bjMi#6qa1}`?SN1Tr!zt~!!TjRox7`px>L^A4_Q~3uYN+9x5{y z6j9`3pW3v1st9WGVJKOeyLlt&>M+1%L2h`6QUM~_cFvq2AB24zts6H&F27nB&$VBR zRqV!9>uaSU`KNOGn^zIIHb|;GS@XeeDOVEbSVX!8*6?|`{YeuzwMDPJA~(!Zu;@F} zE}OYX6`(_Ak0f>&(M%$(7&+h(+<-1UU`52BltHJ`LDnvU4`GIg+(Ml-(xNyk~CfcOSzN*Y$y?d3k=M+}Ux6z+uue*wk(H z6*KO+pM{RSbgcHTVVDKQ-w}iW~kPO}_4UhBYL>dGbL=j7px3&z-@goh0SUw&T`M+%WIeoyJ83_viK{b+xkv%hhn^l-UV$n81T`4%N zKN@y#5)wN)?W+BX&9g8$H)?Yi&nYU%Y<^=k8CI?d{kb8(T%u0LgM*|R`mPVi%Zu~b z^LO+Yd;yO0@t>W`o*gwIir*6Q_v@BODH#$UrCEs;ep}D$WsM)HO+9XZi$o>P_T|2K zNgxS8OSy=BO;;@6O|Ko8-SJpz{k?x0lb!?>2}#eBF{hp^mlQKX!2S)*mnaB9ZH@|G z@p1+0;b$$GNu*d5NZ8A$dTg6V%$B_P*<#)#q6k2Y9QKNt`TM9*S3aqPFXR$?I4?V^ zzT>0hW-cwh0ESCMqirX?ugC4FJ7N-Jh8ulUClxH*9Q)TZf8!_oG7m&76K}Lgf^HVa z@_!NMcB;y52y?yrY#0X+3 z4}Ho>O~nezq31C3~w!1Me_GMRsO=`Fz-HwO_nS>#yorF zqS+E{UXff4F|B1T>^D^S!b!wg9x2xbByyFeHrAvh zUx(=#X(!w#Q=gWyKYi8B0nmv$nX#K8dSpNz8Mdu+eitHneNWsVJNQMS-t;}Z$S&-z zK?!uukXKouqxAHv^VOQL(ogM4PPN$}r60nGIu4l>Z4?L!mF^PowjE30mnjh+Fw>$u zl}sU&j52|H5Ri1g=|#RLqwB#tTdN|?tP`PItPv;%M4Ryo%kT@!&4NtF)%khaUjOTV zV`@6i#=+h&njcg~@(QsA6!85z&|FgfBeXT3P_#)NJOrNbOAyZpJF`z&XOS+DYyx$@&Ntjv*?q zpXz(OI=fHFofgIEb17gx4$K+`4mn3gKk*Da4t!2_S0nKp1QfjV=+J&sd$ww541ZcF z=3OEVu%gHf7Z>&yE8!^y(Q0~;Dy=($p{q}*NR8T}XHUvdT3EpLvA>2w!iE4w#fD&U zK?ckaVM#1ucYQBjZ8wa4HY;w8R!0Bv)L(lo=R#^a4tSG$?Bw+KunIU`!U*TT3ecq{ z+Yhe^mm1hA#;%ImH;0|A`*^U}ZkQC4G8^g;$&E%}P*R;=`Dqt<8;TR0|GY<7x&L^; ztcWH?On4ncwNNKm)ksY_P5K51&~`W5;tS!PD`$-S`iVlYqiPzL)8vE{PqtLaL9cl7 zRx8d?TiYg~>6Tc5WGr#!&cLMI`r3knD~0=Cy#|5JMZfaFo~LM^9k%O@FkZ8sXg4_v z8h$I@i$a9F0rB{;Mtk3u+dANpt}`gBFda&~%bV?eki*UfizwOrF{c2qn_n+I?<=fa zsj6wmFe!;iZNAI$`iQn~viH~LMYzu#-nqx#i z=x#SebDIHKgF3HQh0ZCqtpVinQo0e}p^;rwSapbrGBA6p5J3^ukghHo@Fd%aN>#^D zk&P&)26@*g8jElSg>??_5XqLDIMq<1{zER0NfCz!i*~Ga?U8o;Z{!gj`)&}GjF+uD z=c!J!Fe){XEEP=0K1;4ty`*7#Nhwb)lxY9_xAiXU^Ufyc_qe-0N*qMs;_ZOHKPk}7E4(5`0qp~r^k}_|<}o!+O8I9v ziaG=6`8#Iixgr1cDZ=l$d5{!*D(_45HW}x$F89q-pmqrJbtp1C?V=D$pV*9K*YZeorhO*teEO&L2S?e0@&?4WAXXYEh|e`_3$xgX7~ zUjU%chVJiv6e0?GzYaaP$2yI>D}tw2XH^pzExDV)swl z-r0}TNeJD;EQm+&-Mxy;nLewpKP##q--S>V)s00Zy}su_Eu3$>4% zH1W;e(t{5?g|QgHcgKZ;-=tbK@_uWeOpHkf9tFB-dvqXmfwE39k7vrQdmNAV{M`kw zt*wnXs4TJXY<9IA%R;|H;uH5jQhcfEX|AIH;(0UB=QiN-O289AuslB1;cg>0N*ZBx z&4QF^aXl_HH;%AX@y8zv1oDLr6hTg%U!a5o9}<}iZJLfc`4A(ira2S-HEP5^$;#(JIat|jhxehE(j}U*7;U1`7 zdKZC~zOs0@b1p^0^B8nuoNf+7HRX7k*=F`W__cI5i`Y3Os=*Xd9rVZtdCA2qHvfPU zP|1zwJ;bAmM)qKj}8 zWj3y!<7h@SsvjFaZLB43=blg^hy@ z$|zyKDjNMq!$yXFcAyhF zf&9?mzWE1PPKI3{I$A!U_IKLL{m`Kxrs7mU(Jq6uf8ClcFT6k*;~A;z1kR%**#Rg_$P# z=NxbDw%j{!l-84fDO_bp%T@_I0;?HhDsi*_Fdl!2KKh36WRUVT%%MoiY-ss#^ARJ) zKXr)vA5t9ks(S>a%>B!ngUn!<8Oa>k9jmOzm!_)&V3=LDJ70@&NTp`QO+X?w$xaA1 zehLSULkf@mg)gL3 zRK99rEuSTX`0gB8=qV`Y2DalGdhHlL3pw*LY*AQ)wIFC2r^3wgT$6<2D$0cVY7?Z? zIp{Pf8F7wgumRemJh@3Y*tleAG`2N`cx--gzj-3cE7qtoDzomG zOr>RK;FtH-{C)Z%__xVM9TO6R)BA+lo$U%Ks$g?db+ZdxUvlN*OxpLqPr<6{*}aU* zXiIJ0e*m(PHR@?xj1X@06UfqP@#&fkx>-y2t&?b(Imf=h+4gcipu|c!NO}pyT2pQw zatahi)pKUZVDV>l?qLNhsMiy(Pp={E)egR#4uZ-}>ZeYF{FcAKUv*qsTa`UFN+9U{ z+zfpTnO=j9@9_$L*hez(x`eM)g2iklvylV8a+|NUpVfB@VNtJvg(0RgEz@7A%AUkr z2h6a2j(V^ixtM^)^iK;RAIT9AU4H<^Hg&u)TiRmoIe?^BKyKSUTqk@kPe0g%-no zOR|4%KYAzmWl#=>>~T59TLT^sKT{sfeGa3N-2yoh8zk`n&}Y{%4oJ{7C9=$UJ`9bQ zDN+o9tLmxHaV*_1NIbq$I10*Rkq^aW1~?mAqhwWxezaI&{5r@y=%+(gh7>{uf6~KA zR&j*(r43hatb@#+@=nN!jyB{S}x;csA=F3kKk(Fgu>-mhnM>pqZuEcYY z1{alpuSJIj)?)mMG%(k+aSyw*cdWRKlv z>^vRr_{Ape%Fb%mG2rKm1nM?1Oy6*G(rc7U(wA53Ht>13Dwj{wkI{y(=r-X?lrrir z)8WM!OyB5@JJ{I&BB1&rAQFRWMhrxByj$yaCuHmZD?}97SXIu|)>-zgkc!8qABG!` z!@ok&MQJ2bhDpK-aG!#7z&u&dP`Omy&o(ql-RF`ivzF>kAuBnyAkw^9#?Au0{Ogw> z4i%kbgmoQd*K5kSNj(Sn3@_q-QU}@j2{;>JM@RDNu>zcb z**3q)Il*}wwPj|G+~;ZneT z(0%dW4Mke}_Mt+s3V#a$^+P4B*lJj2DFe@7)>eP1bme7DeS2lKy7T&ELgMT~{)4Au zl2at-pnIXlR*t6T=c3OQh`WfllLVkqrpPm+Q!3X;xtozR87qJaW~u$*(rc}2p1u;5 zPP1*6k-U!(z#UnPo-{@!qn;_BN&29dL+D5FxOc^eT2LtSXk!&uNm2t87nX9suwwm$ zL1=BkUcylJN*6v0lX?`sSteuG{84Py-RXFdsu2bf06{1HwKio)9j3jcEd!!*$|_eX z2qo<5nZM~!tGku{kr(cgrBz#}Ki2VYFZ-)Pn#TkcLhZh%;!sg`@$9FCVQb7m&BSxy z(afOF;0JG3;en6i?X>KonKkVW$HDbS!;0_HB6NaFX^%`jcH_5X&_Zgv#gHJ0ac4b! zSvIlDbSlnxeyzdA!$w5a=_;URmGAN{RzbM(&-%(^X$Qw8Q?LJ8qNofl96$Uv8GVsWhAI7dJI`1diHjQnwv28ZCZQFK!`Ny^!G)AMwwrwHt=Gv{HR zXXec8v-duT{9c-T2N&8b;q=-Ge~?s~RQw^>Z8#g&so}> z{Eb&xLd%>%s$mVKHxJ`bwm*LvOOLSSXRO2r$wsjk9)Zo2`cUn}rR*48dcuk(HcIj; zW9(|7Rp5(GBuNqfOKs2YTLcj6^Wy{LT@KHVk1<%&QrLdE9F%kZ&`2Lun_tQBvUX$Q zZ$>+1_J%YuYh5;t=`d6Ek`x#eMnMkdCp7WT;YbbPrbp}ViC9uvF7T$0XW_gs`dYyaGpE>d%#tpBXbBw~M%8IRKBud>pq((?M9Anz== zVpZ%*;F;$)%CTjirAwqqxf8mI6YbF#aP` zKcyljPeIdd_z#vp&zsXn=WmriL>!N-oq|@T>STwk7M8-BI-&}T=f$U1BEu93W;|8?OFqaycD%433Dq^CEX6xxgtvb?fnYQj)!KSc;N` zBjVZDj;+8Zg*-D)t1qjS%*nUP z6_y@icjNejF-|W8M9f2r#M1pm0tsi+YmT3!_$uQEzSLR`_!UL7Qf2NZvoh; zlUyeuXW`~m2mqN2OmjU#h-1G1HEn3xL0?&MKr!LaN?*$->sr#0Ytwjb8NPwUwrQYp`c*_yF zVjaiwgK5907oPQ)Wv5T17>5*tLeJT|5-R+w2O1J_hZpjuq~4CV6TbuR5#Ny1{_h!7 zDGO;8hp^^obtEc9tCRRy1JUTzSIrdX7q7bP81jqW+VG&-G2y(|T=7>@F5C!Eha=3&q~EVz{wY-OsWn+MxAO2}jOyzs)j^jcwlt5TH*e`v|E z4}LTX+&4D26G9#{X61!qr_n7me18dFK9z{?!D;IydsaK|HE^LzNv=~C?9YUDSD^9& zTP!@8`a>jP*&m3d6~QGi>{Nba1N2J6x+|+6nC?+x1@7AAj2@JAAteYInsecvWNtLw z9`gJrLrnS|J_Z$Uf0+IW7$ixph{CFT!8BQ&e=sF#FxwwKn6E4uD!FE=l=%Mh==)yX zOfj;mjy40OI8J1&T4QrEDD4G_;}vNKLKL!8l<-GZ9H`3ZwmYb^e+Fv>0lJec`p+d9 z%6iX587z9wT^Y0b&x?8=P3Z;8H;q<7J658zladY&&Ny;G{l_?v;Iur z*RUf`V=6VNiP6hso~ga=@c1%)kq8Yn!m~AMJ3NiR0F*~-(t0LC&+IgWG-H@Cbo~5d z%Dl#&9Xg5}G)-9FME0-%zu`wt*}s7sz`UM zUQY)U088bndTz@5kwV$VY^M{oS}m$e4o@#5=I_+p^DKiWqxG-6@8*^F?-zG}+7w$- z9Ur^-Ej5U*i8@F5>|y!9k=$S!c0y~m^Lbf+u?Bv^bwRM&=WfvhSA?;EldedNzJTMp zis`+oDCrE-KnemvCI7<_*xl$wCX;Up`pA9>$jqo`#-$2SqW-Mpz`5DRVzf2R>z%hn zGn}kYA#>3iF_uw4jE48>#AS8<-kVg4gRv-vV<@9Qk6eV28j_lIS46EZ@<3o{r<-&D6p>QH}bYHCrG1dZ}U505kJ?QY6m~%oa!7Oipp%wgFDovX41#ai^BrOZ?xs zJY>5wyE6w>b8mBNbHYxd#}nz6MkDA|_N)yn*GN&pN=H-;l-q?m-%I=2mmK4s!>~Hv zO~cREs)*c67=zU>lEi@y3k+9!UAlxtEKU@3-;)NC=8P2c4(2 zzy5UCRsU+}IIa8@(_v>VK6=5Z8miZ+QWVizTlc4a@oK=zZmJzHs2lRq*U*%XH&c4}U*UZS@Eq{Zbg-et? z{SV)WS|P@3&@jT_=*jKf9j4YiVGq(Pcgs8CQax z;uK0oWj15+4M&BkXLT}0-*$offzMZnoA>YA za@rN>xmlBMTPAF% zxIWA3+O$Oq<#Pt*-!btAD&qV-L=aIxe7ppst~m90qo?VH{`M&6)-*5621J>&1AB}6 zKY30UgK#9qAxyq&^cFFY<2>F7qoSm|8+{0g1Y#k7J;FC)$^6pALfJPq4PqC+bI*1y zVF$r)wYmP-f)|JaNVDyIvrY*VB1m2@uKqFI))WV~kzqr>q&w+VF3fz+KJyT^+|Tr` zgU-dD)tzQPmASThxt%k4R-GQk);5!tNUIRdcF46u0sxF`fuDZ9I-tAICL!g(*~9>m zwa4V%x&`CZ?5Mq`{;Pk)y0$07ZLKog&VtB)MYzP?=YSx<$ie9S=~*GCX9J#+k*ByH zG^_<1v}u=wd)U)8?!8UKIA87r_5N!9WJTL)@Rx_f28tr#TSpWR`1yz zk2J3P*4;HIzo1}tX7+g~Fyw{j@gw2EaIE~H7C4CIdk>tWIIY|!^J9&(Sn9sFROwV2 zQ5Y48bYlkwKn|iIKA(JQ;+6UNtLlY*NBJ(lxt%u{LfK}}w>Lt)WyDn|%}5+tKTm|$ zoDrQ`Xqu7Y3$v@|`ZPhy%`8RZ)=`roZYc|GA{sp5=a-A8Mz!C!o1!OEjP|>UlG*as zMxZM4r!`yb)I9TW{v}KIrAc(@i*RmZnfTn0ZYy9lthbLUxeGolw-v5EG)@Ojsa#%k zH=r}`@~1eHp)nlw5g}JDg&QsEVS_Aj|N)?!kjh%Lb=}1 zPF$z|^cdx@D=7~}!?b#W5Dd#EcRn^)S8)IO8t*0+8wG#JzXzb5KI**(sEIgBpSEiB zV#@=8)lLvMQrm&8y`MbpC)=jq`$%SX`Lp??xz7-HOj!BnJQVu~HKs z;uA+B;-(2)TyDY76^4lB#mF=QrLesZiz&^tb5WByB_fo@Q8Ppk`Ip+NK61( zbNn6tB{?q#)A3j~5JfVxm7o$XmWKyD+2y~VR}Z=?`EsFOqS*?D@Fzx%WfEaivwoRq zX|iCpdPdXW_i;+5-sD9AMEBgM9^Jhu9o>n!7aHLFiMY4GLKZp!6asb(O{^I1U#pzG z0r^o>I4{_`=>w^#jPB||8Fr4?j{89V^m;SqyNo2$>t4s4@`4lOUCUOcWJ@DW?9|EV z&iT8JMV)I{5(Pxg8r6?SJO1+bSN?iuKx8h}Jklimw9 zU!oILIaCme)oo&lf=s^IJ3mVZQ9ll6^oP7;Mo70wEICC)sKqJjq+1Py(Uh#4tQw|y zw%^v%9|_|FI$h2A#;-@*8Hh6t>@OunGYtJnKl3lMQ|=<0VV;xW6dD&G*k%wlUlVh& zPaV|_zmUAGaBFFv9#r)$_yEhLK@)5D(q-~*@p~srR_}3>kJUOjn(GBSOTTA=(g%l6 zG%r{z0=caXDCKvWZn*MOs?n!&ow}*DDHkPt73*>{dQ9nNJS?66!RmFkN}K-(OC$r8 zbm=b%>M4kxa^pq5-g$)dz23s1jn9|5&-5Y`R!dv%Y8e?Yq;N{x2f+FtDGoQyy-d{o zS*inU!O19JU)h%3RHbe&{5{Cd{|$KJo)hGP6knNp7qa67JO>y1oa_6Gi#WZDo!6TQ z{}sYJ1bM`il$v`{|BegcsyVg06VkxbNw8;H{myklI|sMbV!eq5q)k55k z`vNkfj9xTQ-;ikrBS#8JhzL{TnL=RxyJTtCC>VM?oXA}bA@!w_@(o#*E&_@}*a{&H zESQY1mbP{Y_Q+>25*EFq$zYU6{tzCtue`HV2qb%j2T;B;w=*-1v#e`Lr;)vcVAxq` z9&|p3VbIyt9-!9eOspD5wI^rNabeQ4VVuSy_mq`>v4|_T^a#B53Ii=I33$#Sq4kGm zQcDP{y_*Qg$qs=0^@-Jm+gR8o+TKe2Kxz}`9G7GKHoZU7439uWFJvkc*TdmXG~<|^ zFcdB#z^B-Xi2CAheDv`*q4GHO-z%~y2M)*WgJ0P{7KUjsx6s(EZLxvLAWasjq+>+N zfT6bmq_B=BIRv76Eo+bXrB;G@T+VV_cl_4V2qaDU&Rk9rHs)9a)vhr3TX=kU#DX+g zRh16cd>x#hd^;&WL05r;YGx_W?G-Odiq|*D05fG1S*&&$f+&vL$G9G}ZU7kvF~7Wy zDCa+cDP~7WJ9E0`SK-FMpcRzXdYN}nS#)7n$t7)1{>Vqs>tL$XPW|%QZkPRyW4=%#*uK1;E zy=-6|kI;SNncUnmy%CJRdnAhF$8e&MMq50HB}Vhd{U@ods45Y^Q~)>A1&eqQFe%Pm8AA zai9peE>8Dk{KU_^<=@hFBiBNg);D`*v3RHGoXMj-CRTb&b-cG1$~;{&7TCNYQ1ENz zqCY@J=XEUMU&@##sIi+UieIt0ieQr8y5h=-(&r!qCGU7X%l)3j)u<2ArCvn$ zzOJQe_Y>`xn*>3Be!4z>Y$#Gp?t!*n17mawbPey@934!vM9Z#mQ@)r27$!0i5JcN? zW|OX=jQFx%7-qms&xr6;eqd(ce}UmbhVS|*;#vNe>y49qL#Nw+mzS3{|IK6)N$P`8 zXI}F-1suzO77I6`xBockDC!klG%+Q&l%>7_IBx;s0jdyni}h-O<*1%pP(|XOy!JBniX3nz~yqAw%T{44^E9WVlLu^ zY3F$&K3dnIwA$;|0PM@Cd3dodq^>cJB%6}hRxzAot_%<)!`Z09wOVa58wD$}I3GNl zrVx9cg9hW)!iu14Ti%EVIZpejdZsKUEMY3Vy1Lq;Zoa-9i2;J%H2os!VqYWIeMU+a zMO=KSd}#xVmC2K8$XhHlyi2H8>`Fnp&d5Ijsd&hzZJXC3z30o_J9>BE(Io`cuo*2E)p;%?d%c z_@opPQ*G3z7{I1pRsS$TuxpM1>$pw?b0XD+3+XTmRp(SF5c4djCd!Tvz{K!BxC$cD z2%gR&t?BF_VV~+-oTSN>=vtfve6!rLp%T_nuS#5J*IE;XNnF_dk!;Ql-^($jNPT3c zdNlbgI3@8@1;aC$StC8zlVHVRnnAC@uL|9v6y1Sp2Y_WifFJbarOzx0LyXleix?+Q zSf*xxDsAXjz@6U;NgH%^iNkY} zp_^ds0q8+ZKqw%Rz|1!g zYkYmwOL4i+I2T209xK9@z}Gze^PzKR0LHDR&S)s58L1$F>(z zi+4LjKHO?<&#i-i$fPqyN5`7WxifPcuR+GaNFo!rpuua)9>Fp?r+p>kbYrZl4;)Jz zlq<@fFvc6-t5zZ53=0#L&IaST%+TCnFn(pW&*^~2X^)HhlL4I=dQB@7o=Tm1tJD1D z1py~B95v_kNk#NYqO)%fs~Ba7;H|@CGpjp(~_P?BBal<@E~~1 zV@HFFm{D@*cwW9cGL;(r)1&PL5-`KSkFn4x3FQtRu1A%wl+5LXz%;;iPpaTeAVzzQ z2qh{~NAVVS-z^zuoU-mnG>F_Sfw$oz7Ek`_dUb;Lf<>d)Be5F5M`(vl(hb55D)kGO zW`;2OspzVfq)e<|Om0>TzrmYV0-@jVO~Wqa#}2$ITvMktLkK%_ch(WiZtkn6QZyN806^BFm6JX5UE(ClWW^E0LWL zA+BjPO^%LJ|3gTlh_fTf30aU4fg?S1)Ofd``iCfL3NhI|J2s1|{7VW*#*V^MfE?ig zUwnA5Xi?G#E~Y|5h|$Op6KK^CR?4w3HC0LR-pnM5#l1Kv*@Z0vWhvMKK3J@DafKPk3;?^M;D3IU9t*bn3kd?(<#A2^WU{@)&imF2DF?={pM8Gf^f!>sT&xi`x?Ok zy3{cbnN%Adg9;*tj**=Kg`o6>A-T`o1qmzOBFQvjweL2`mNP|W2wBs`NHU@*m|7>9 zQQ&V&=O#YNO5mzoa>4SmNeIclMGHam#{NsD@4+-@wsqCmz-V(;K~05igok;?GF^Kb zn7&r{JH&$(0q>^PO#kUjXuesXh?sI+3`d#P5l5M4wu%bXJiH|z*&Kg4W>w18H5KC` zdrwFvJkw39YKur@3Ar=V+CL=3=bqDOYT&lw=U$&~vlzD9)v0Bc!52!c8vIX>t5Xw< zQe54(tn05D04#AAKSHc7Cu%rWlihTDeW><)n+%63!QPb$LkOAtR7`p5^5~aAdD2nwB`ntxGzt?`}U?qsMeZByfq37=b(F{2C# zA!4(eJd|+(v5!5wEY|MU)9Ol>Op=cUI@nq=>$>n619r=HyxDVN8@n1!oaB1bAS#rj z*esk$cpeSaQ-XXp*gDosJ(iN$N6j>?jPUK_0QipHTh?rsZYIjLKP1@qg0Vf!&G~VX z-CSJ3M@N-&ZV&-OG|28NA+($*d%v}!?7Qbn9VO7!3k9?gC>ZWw#a)S^^-xLJJ!`O` z7czV*0hWdFm3p}jGIZ_cV_q12O7+Xh;#lz75=`baZx|}c2NQ@!lu=_wu5?IzvuIF| zD_g?tkj8`G@Nk~lg^ZkV(R(OR%xql}DU!p~J#Q}f!x7UKq4S%Q?ND8a@J{RBV0 zL>Cctcs?fdqoHbRmv1RjD^yw=ks9XrjI_2SkVa+t#yqiT$(`V42@S*7-x>CjLO4~b z6+X`CSvJ(WEz8A;N^op(Jn5mMHD#Xly)+W8Kl9EE<^>bKe94+VpjwGS{*;}V2FpTf z$kQP$`IHs=Tbc=Z?zH$b(`$a|!i&_@x`xMb5nS@^p;*QT!3Z!ua zoJ#z6F(oN$Y#@){usGBq*3y`-85u_!4SQm$H;30szHmSy=`#hTeVi|>v>X1BYms+^ zwr~i|v@|4~?I&IFt1H03oWEJkB$Z72FM5;eW8lMkowVS+efHySt$(j;Y`~P?f#o zG!+}Af?+un)U`*92cb8IL_k9&`q)kpC9;*JOTSfmm-=P_^TwK8Ccm}jOf)6pI6c{? ze^7I7=7sC>TCq!+<;+}jn%2^&xlzbw#SXM`_x|F^QiEEkkH_#+<@hoo&9R#YL?meh zPW0J(l2I?`v76wgj1cQ}R)$*59K21p!D(Xv3%7z3O@(l{-=4h3&E!u7EZfZbHSP0D zx%)or|1N(TE0)L2cIv9SDi-2%o`rmbN@)U%0jFC2m7m%U#YkMaQO}2G&qZ?TbDQ8D$+^SufpU zj84vbV-9#!5?%$hC z6w=;4YytqYZC$8NINEO#Z1~X1TD|6E8Ss5()#Qznx*c#VSaP)B=*>}}DD|JbEEiZM zh)@)%s7t(Ih#)A!{``#{Mvkb@^~M~H{+kAx+SaxO(3Frx;Z{_^P7EXoA7+m|YfBTI zi7{d9jN09euNGKsO8gNOb*aJfu5iV^ASl)4gHn)e5KJ{pov2Ppm)Lx*kHLJSt7pR< zF+IbM!XciLruwQUJc$eFVks$fzHjbRm=ZZ7t$bsl_MeX-0MoM+Ju3jU`!s`7m{sTD zX)s#QOqJC}+kWkezb7y~c>3pmUe{p%YB$y_A;2#^Y{G*6qed~Kl4O*zRG69Zp`NB1 zV%#%Tw!_OGvEDuO?8zQP{niwNBsG=a1}?-%5OY)S1il2oC@%_ncyV)U@J2Q*l-c!o&z@o9=2iY28!9G=!jVx7xa zGnzC?usD}F=;F`4zxbjnvE<6mUV9Auos?mh@ z?X(x8ujk(|d-cZ{&fQK@_bc^?C|b8yJ=4SLtYvyod@DJ5vt{>XV77MThWlKhdi)rF znl%OA-8B%$<%s+(erglHXpS%iZyawy2Q5=QMkwnS0F1b#s#dQ}PdL8N-U6w~U)9+m z6FJ~}Lz#)xX$vsjSO_OdOxX!UgIt$CWM@4wUFTau{XqwiO5KK!t;~;-YGf|U>P@4K ztp0jFg6fmWhB48u|LMOV@m+u@#orZ{R^lvAQ0#C|NMpmhrZ?gwcbNa+)w+3<3Jtw% z@LpVP0Yg!pgfg<#1pdpzk`XVJPQ?&H9)>KIz0+7bVh@ym9cZ5kvU%1ktpzS<+0WZT zu~}X(RPa-$Zmz!NTxLYjUKm*8w(n_G{GI}bhH2;M%g z-!^x=XF&;Z6m2*C>7JGa#*et)Mtizg78=+#{}oSbuWz9qPVicvea{5)G7FN$&)A4k z3B6x^IRgYnhyiruEAHA~x04s7Lx$ct$_gCOJfwfmX_NqXY>e)LZ zw~m=;?;$8R`-7ql6NN>uj#%1{J|)2-Ms$7#myJnq@I=|mkDr+9((tDV??Of9p9&hRw zihd1EA!UNjqGVUcLEb+u%UJ9-5UCc*o9pY2wg+bZPl?q5;vn)!uw2*ZENmSZPSNb) zFg_ff@omDq7*h*e>|A$QVv+f6wC(WXV1%(SjDKQ>RJg^}VM@o~_BTHgM8YWko(}et zO|6Eiky3feGHBgnWeHaG44#PPxMB==gv*`l;m4xGj8=n0n z&R$y7yp+{`IRkbIluvnIi%tUg!_{%a&^K(kuPVi1)2wbPFA>B|*p|)!*0Zj8T3Wt}UybdKG-{vSgeb9{FOkOja`Q`4{|PmOa~*PENMk5fPqq zxwf}SxqdKwkxqSb zz{j8v{}oH=jNvyE#JmJ68ucQIv~e_J}(PiuO(r#Y!jF{RT?RZ)u;acqAH!+R|o zAz9jg4TB$?pT*kGkmA3mFhiW@hlsi(b-~2Zn3)ou^1ksbeTBL_y7|Krt^jlWMzU-f zR#|{#5Nf#e%j-SV}P>mMy*RO`I zs&>?~_+ec)?Y46ra?sYgY5flT*Gh<`zIc*%!CbSrai<>G_%>UJ_A4^i`iY+6*Hq_B zT>PU!{Y>s5yHqZqesJFrF(n^_W;YwP+OM5mP3nt2kQSu|{Vl;k+;?Z{&m!jr>L`b@ zC>cyiOgf^l`|VDinL_mtE>TKW=OK7ebf=Vehz&uk1v&{zP=spGLqcpQEL!3!Efe2& zBe~n4ZrkgsF{Fz{(B&-gDi-eRrrz?Gsn-Dy!iqgamgG1U*^;~2(=j9!P2jD zikD4OxZ5CeRPdy&c7lAYIz4(+C>e$B*{grDN=V!yrChv9n4|@~=c=st_rEukw$aJ> z-(kYKZ)>qpicVtr*dYnHwLiu_T!?l1nc(8+g6_t~nIi;asGmp9}`XQax@Iu!KH&u(B5dO1{zNW8@j- zU_X3W7joh(gv^A5Q1g+!vJ!}yBaGF1tTv2QuD)~t$!x%Q1~nxf!X-ogOIMoY430$P zI35x8em^U|X|n7zh&pOqvGcDIchzn9#anO+xy{hIYugll)^}z{4?Ia*#9ywAYO?>i zP&ipn^73c3IZ@y+MjJ_Y=tU3mjsMYb2~`693{rx#^@MF8NP*6;j@6 zxk9D@Qd|i~jyqiSk^dqbuf&fPUe~;LJh;0Ez+$Hu6nB%E#a%^@+%-j2{P%P)h8Lw$ z@H&*nlr5xF#~0xul{%==*OE3guF4BHY;97eG)Nv7jV-Oog-agebd?B*(b_L^(hn zDy7RH>>^PvPTeya(%Y-o*X?<7)QpyAV0CSUnO)0=e;l=US0nR9iBB!Ai-_r)QNmFk z^Jq-=!C-5uN$n{HC-ZWt8)ua~+x3vr&aHkXxz%rG*{MPqj2XJ(DtEazDoE91S_9A? zpkRx9?Id;4EI3C~MCS?3Ek+JHj>)Iabs|DuUuAOEZIQltSd?q`0L5wq(73;;oe%3+Z zhNP!q3(9bppTk~;i76r!jP~SMrse|s1Yu$+t62fqMwY$|ZS#`6RMKW$)wtiDg?7KO z#l6Ql8s*c68muD9t{qy<19}EClL=?;p~SXt>-TO@yCMT3zlBS9N1z8t$*JixUvilR zOQh3wWQrXBGtV`XznK?Mo6irEJnndFB|dP_hOCrMfk*aXQ2udV5wXA$`aC2hdSA-6 zG>HdG_0{IK6V+w8>vu*&P(`E~!7p3FskVW3>vXC2b0(k@u?K?m5pWh~(KK#|+Y>FZ zQ6RfwhA08Emb^~wgfPH8UP>f-W205HGI$9~7)3~Kj8#i`6IyFInn^MU9=(v{eWa2l zU*&`({YMyql*pWYaq=^q33lN6ApxvCGTx)itgnZSE>eq3yUy-JKF+K+~3P~1wz zM-yEs7+CZD+q}W8Cy*@-;qgsPIj>LE^2gy7xU@=*Qzk?#gq0{x$cQ-@wXs{AP$$}n z>6#tse0*g<&HlF&^3lHJzU51l;se&U3*QdcV_5-eiOkw*PFJu`RU|x$l#=+;qCnnG zbfs3yj--#%*qm}j# zhA*V4)fpe|hCm&e6nzyMWrL1LRDq#+~{SZcSiO*Avt-*&nd#_&;yVBrHe76 zvVz!4C@@w*DP&s+nGqDGI*X@OG(X9Q=TO6jhy%v=#R2y9J+b7Rn>}m?j#S&hxYb0)?i#ty2 z=rr>mT4Z9@%edW#!3eD79fjcY?Qj1K)Q!@8#{}C?5DwdRr~+EjVE*!xf}mOzZ&!Eh zSwuHc#(}as_z=jH>N}`uP~fV(N|IGI-ptZBL{@sxTeLoUB}d+n4<{Xbeq#@!c)SE@ zZeU~*MBOdpEv=XjZBD-jr3pt|3qlPUaqvE-1!wA-8B5nK@-sHx6qsn9Y9 zD`hf4I`SG0S)vg(m6i@vsTyfaXkPi_XODW)in1)dJgKBZIDuKK$KR||_baqCAy9MY z{FT`%GIoE;GQ||OyeSc9#}Bei3(A8bVZfZ2ISI^t@t*oaR<3xc29mbrzGv-@$?1Eu zlS5*_AQ~-&ZvEJtifIgtm5+=x#NRKPy{Twc2*Cyq>`$IO%_q#@cHB#KPg7Z`hMuZ5Pz3euNGkVo-929wa1 z26|BujjLb3GRh)`#h)5w9Pn*isQ>EeF;|(0^dUii_Bxz{$jqYn_!yk~Pn)8LSzT%& zR~GAb^o{r|z*FiiKB925N9vFR4iJCVp`Gm2Y0zlv7W5E<6)?s5U2uy=!kG9x`F8bm zGM6nqo`Qo84t=f&z5$Eu-@Hd{->{t$%05nrTT9ZYp2qdnUCqH~V&?F#nNpe$@IxtC zuaCZo-J@<9m%V+n`Yy?v1vhF;#Q19iRKO1A8?GyLyevnuwlmIbx-}s&0wk38LeQkU zIuDWPqaj4nn6LwNr}qAsF@Cf0pxk{MhYN_PWV;6b+3|?rQ$mE0t8-`$xY{~??Zkie#511O%3+e@PfvZ_+s@tG^G^ z8!5R=Y>;S9;f+qih?G#&0*4w^Y)+MSJut83zxfG}XSpep+@bcpu}@F+14qC@3i4(w_#bt}$FPHp|Ih3joH~Ys)Sf_KxhUL@yO0MUM-C(!~`_26T6WvdFPiBB&~e zlsX*ir;a8*eLePC1@Fr~_JFAqFJG_DMJ)ci7(_u7@&SqX^$nl~wQqxeXGL~P_kN!m zgw30&12<>3p^^%=eFihJJyl4FwmY?MfW0~)k3K&{K2d2vDFoHfEjs;y;nt^ysPBIw z9WRm7ax8PpMweMn`)iLNN|Gmyuu<~EJC7m?VAf|J zX#Ti%zrAZ(_LG452c3Pazg*4>g$8xEY$Z6l(5-uR!+n{2h_3yNb$DS7;a66sc|`kQ z;?N5uX(_8-)+TS5@4#*PII8!2Syim;Z*4x8Ow{iIV9ZaQ!5Wc|Cq2$z-rKXY(H1a> zojonB=HDwu`A2>Jde0AkEDyLVDJv`E@;LL@f4FwJ);D^f4M-}-aq_$doo$=V&?akm z^7t;Cva`dvg+=p+tZ+ncV^!6xiVXLRW{}Ll?cwly?n}cjBsYgg9Sub9eQ7uO{xs}4 z+GA}E*n6Q@#Xg{mr9H{9#*uoz8_#!}?)3(_=?Ajg1o9*5Z-3}d$atE^q8Cfjt*4az z%82DUjMYR;O0Rv`8$~7AdK9Q76!yKk3VKWiM|91Z=!^48WTh}8sC{L~n)KW7TUOrj zfRxGLe4a7Mlpi^veA)ZkUyC)`h4n2rxkUB{U^oSeV?D^ErTsxa{D>8UY+FTuy!2k# z;c6XPy^IWnAMkqk1lk9^f2{X|k6`Oim4qkG4N`_QC`|2$9E2a;I89Q_)Fc#C`U^8D zu&|7rI7u=P+MG5Wgv%hU(K61#|Y(4eb}7$)Wr8VS-`m`{>_kiTP4-RWal2!*Nx zGk(;}gNqIG0jgKt?f9(&LSk5-3479=bUHj;~$B$R&uDG^h+6{VtIA^UJNl%ti)DteIk!rXteNb1&i z^vRwwuHlTBhNkq)`!FcftLnpYbTA&dpFBsSWE7jCnVSB~%tAKwjVu_hq!7B@nxVn- zeb8Z_ZOFjtp6izMAS}@8-LUD&kW+*$SzuQ>R2kb{B@F3{CV zMJ5-9gf%+WK@4FcJU=krw0lljfuO}R_7(%J3E4gP4c~LGF>66?YO*G36Goa~)2-tgiL?1D@CsXMYy7ux7Hx}+njZ%98*sxq#mW7 z#yeu2VrL2Qm#nLSzrD%>xLIqYr84$1QNQU9>b)1%m3YJ)XiooTf~jg2IgwuAPrJPh)6RPo=luMYeQtpbumvHT&g?GYd&eD-lZaXXk;Oi6BDUM0PnJeqM=~#mg%6L}8r7q;r}S>8f2FT^ zn>IVu3;dGUwyAXKE~=cK0oj&Th)Bk=RW~=veAbdnk^){~Hm^-zC+?j>IK-wyk-BmY zX7wuBTkR_JUidyYly?F-$4F9!v7|@^=d##dQoi?`ea(|F`vO3cCZ;^B z>WRY)!#n9#aPg5wZ{NA};pn4=_Eu)*>*|X1#1yr;@i(2-VmCE)3Kt*o*|E$Un*741 zu(TV>!(@P46lYn^?>5yfC@n>j!1{*ZCY2IIo#DkfC1+1y)}zlb>z=_}6qXF3q*xpm z!S;^hOHP~(EI7cTi`ltRbMZk42reVs1$Jwho7Obgrl99cG+U&}GR=SbZF>@S2s8L= zjc;}NH^ae?@SPs*CoGGcoa#O+Au4x3iX`ccNv7}OGm#sJqu21Oepc);xiCmSRqQFc zB)HHgjNa1xh43MgWnQ9$RpKE4)$u^drN&mR_5ld)j}c9 zuFXQs)@R`AYq4asY9v(ng-j6d=t#@;YAA~gT@iPoQLdtG>Q$MOs2wqC!8_nBA+dTt zVsYYcE=YusLms3~Yaxwiko9QL=7-StuaPsT*js{e!TV8*lomn)Rg4|kLg z1q<8&*0TM2isAhyfz!6EeZ8%Ugy3ICaxr}Tz`dJT)QB2pclsrj-5txPb>-i?)SjDk`%yj|$Yz|NH*wUP;OLx>RGESK=i(0xYUseD6#x99 zHRCx8`Wf{pd{(_$r|U_y_2A+r|EWPBUdQ=Bg%C7bg~=}^YBt@sP!XlP64LBot(Ru~ zVmi&q1YNs{peRafIq)G^^81$b>-7);BqD@3gX)+>UgRT{V-K}pAS*o1I|4*5@U7Zl z@=MhIxQzvEhP6-^Tw_Rt>)bJ(hp840e9Z>cZ&z}R;(le9+kSr7D>Ez=mX;Yvv(N?k zFu%zOTt@E!w^-&NM#}fE^1rs*OVdy9iXs*7-G4@MoIA2YI|P>hL>%PK`vbcfj~}8S)uD7eanmYjZu9vm?7SZK~g!5%f-{4S}VBlZHwcYoU*7 zqJ@FT(z@TzmNw|F4n_HRBc+=E9*V5$m*3jQsg4sE*Kpo{qTH3z8?hXzN{x#AX<+6) z1pDYSxNVua^~S2RKU^>9lL4_T_5SbRI`I8h1zUda`do?s0fs<%zhgQN;~yPD zx#%5+@DQiuw~X-(cN_9AI3bDpkT0A!O{kZsWJe%gV~J z31ZyX;`UztZH(KV1s0*)a#C-BT$eVRk7JYdS^%TRdM6j^XY+`AWpN^SucH=!aXN{f zvqmPy;=KkI01hE-#^t(pA%i|fmVINfJj(KubZ{tvocE2jb)}h3@5;j8E7{6tlF9Ri z%swb+b=A3gOg_8rXH!f!cBaASp+725C(Dc*9VF@sIyfX(2EuB{pt{)S73yOrnL@BN zvZXQRD?&&(@X}_}z?UnS%k=So{Xybg8Qb~x2A+FYd_!Jf=h9#lSn-8-g)9!aBxX$f>V?h3HXKgg*?? zYa621|1OA%&MfXW{%h;N`l^Pvqxb|LBWukZTN%Zmw-{7i>5f`C&UJO?Ms@L%j_axg zv~P2?akC4HXy5A1{&vV!*F|{}u-elKt7n>jWIyu`buVkD;!1VqkOgX{;y|}}P*+`*06q5(*#uqT-G9Hx zafpIl@6dq4uFy+ee87gkO0t2OO4n>K{rqhRj|NuiDJ(s==euO-TJ zh=Q**&3`R5FEQ#6ZEej#__MCb5Uy5#M^a4X4Rt0d8!KVU(oMI2EZumEJeXNF9hqro z#9J&pZ3K83nM{wu1kLuG_cr*-v=qGDqQ5!6J1E9AGK__XxJHhCfV{Ca;<0RLc^6h_ z>AK4;j1Wtyazaa+6M8~=gVX~B;n>ph>cNcVyyh(5TW`!LpQPVcJ)Gj4jo}vB7kXo4 z>3^%0GfW-dLi<>Mhb-DRMmV(8yW?8gX8^xoBh)1>?>@0VfP`;tUC7Ru>n|CiH@^ZYWQZgRDVFVOxtd?9qY8h71lu z2r1ZDvu%LjaH2ImgwbKv7;XASt|*z1XqdISGNiB1(WZ~H7H#>6jR?MQ#)>0lP*rzO zdfY4Bzj^e3aJ}ZfSUGYV-x|NI87ZlNgK}n1*iGD23I!;|!V{WTE%4#XG%`Q*?N-E!=I8{Znp^}h^IWNe17L(gXMoEXOUV^vY z;tqsuv4ybZt zj1`b%6_DV&zzwytXcc97ztz4`HQMOw*yeq+WWDb6O8`F#i&?wK zmdV&Fkl{1Y=)z)4A1K~72l{Hh>wfh$w&D!@!^?hdV1Bn?!q&R69y!Mk;qUS0?^M8x zLKR10a{WWqSR*UYMqO*K)KS7}(WuD3rQMEh0E*$lnqZYrc)s=u#%`2wf|00loa*UK^bo4l5H4xD{*PvrD2#Zt6kHf zl5d(Rclw5xOYo5p@!4bhgW&?9Z{CkLvWVrI-~?PBAjWW7ZVi4bw)h{g&7=ELDut)2 z7{{i~rI)JV8{QRgJJ3f7cO(E;rk3D;l`TOyaoucKdu73OMW$94+3adw92C)9NiAMZ zpbC9MMqWFJNe9P|bA@O5Fy6xXK8wTT3#%(`5+B`KNa$D{gp>!W`pgX@b01ZzQ5P85 z2t?u;%?}cIbxkS! zq|wp$pgH)ISp}cBm?Vl%@5ikccm?BA5+j^$6{WVMa0sJ5N=w%B9(7%h*Gu(8S4$dA znhjz~V$^4KWW#O7yJqdej5j1pu@)#!5Dt|KkPP9al3;MsqRlQ2*^-p1O72Kv+p5O0 z+73dvF*eklCHv2)&3QK_US~Rgrilli>)bBry;iJmrDzVVIaRKLV$uVt}b! z205!>EEn?l-a<$QxzyU7EY!oM85dfpR`))iqAO- z<%593$p{}0C(Z5%;e8T+^KyOR7<;&n_nYUMk4IXCu#bIwjsVQL-X8&d0p_`a`FMEU z%sJdgM0|Ef__|5NXG^5Ey2`9r=&YWan%^_6qdMtr@LMzO+ZL_xiK(%G4HO&tj5G6| zkzzwjJ_V|}2C>QDq;zdxpl127PZro9Os$Lgro#YvIe!p)Ars<%Lw#)Zwue(3BQGr9 zrKgs%F|6uU%}$vzu#73Hegae#Mmt;T6Fvui2nLn|1Dp_E2c`yB_3iKId$$kyZ|Qfd z%H6VFSJ+HSmAJY&3g(CXyK8+LfBUe^b^mP&<49W)cy;}m#_1(aa8WYtd!@X^YyMNt z+L+|)^{w7Ymii=rb75Gndgp3V&%x$eE3+~^p;Ujy=7gTB35^k+px|81(Ya7evEN=7 z47tzIAo0!(jhE3tsz1XYJ=0%#=eCtZX-I||aC_&)7gb-GvLpR_y_(s*n$`DeyM;lB zFdIo3rVl#|{|!(YqhaZf{K0iFvrHVyGb}0+lk>>BC~%H{@C*g4v&N~XuA#AXUC-_i zo7~iAJ^lWG#8+wo83wt0Ja%2Eu2bsHvf0Ed4uxK~oYrc|v>L4Il(DV~s^h@Ek#B>l z*U>|)1=R`#3^>LbjS_Q>%GH@_W6zLuu%fQxzMLLR~J5c z^ym@4QlT$@Sv=~B-}|oH$i;WhbsM4UI%hLFnMBF+G%b>}h>n+wMarM)ORMCH-_GE5 zDHMqB*mb?q-irGfx9=dcEjvibZt@Q6b79|uDc|a-gA`kNGqhfZ%_alsHhf>g-Ja5Q zmG#=oN#i+7!ZVIblVD+yExQA%Szk6^x@HnKn|OhLf(6{XP}LMA1mw;NB_^1r#S_)s zgsqz1dJVsi_;2r)jX-u{VoqjCM6q5snBW`*i8ry1YV7t>UH$et>q&8p@YtK!XCrl$ z3p~sjw-8M9@z8`J+vE<&Hraw~j9nSq?8*+ zjZE*t%WX-uv$3=gMVbn|>EQ)lpsjZd*`5K5VNx=9o7LXxtL$NFV=c`Dm^6#soGYMz zCQ6xAz!sL+Tg&0C7lA@^@x>k3+PFg)tbIadWH{z9N%`Pi7@Pi)0 z2`lAECmTj9rW+5-g#~!jFkCrkpCG1_$vYIpRX>y);lKghH*~kUx`<6D5OLLi(}bmr zdv>Rb`O7L^YFL1e&84;MZq08Ph@@7z)F`)v>t*65vdNn);RgQFbkMXkP`$R9&|3nw zFReYX+?cVU)z*?jElYzU)He*vYYA5>mYn2-C6Z%_DJ7(0yxh{ZZmR330gl`-mfAji zbKA5lq+p-s zBNyV4>T$RbyY^ThwKGm*{`VqFmkYK5Okfu%LK?HCCNzxG3;2NTfv(tJ*x6YtQyRsS zJmQ}hy8bD>SZ1u{X`1qe;0X@w$Y(0xmlvFM*&m<%xzGOe*q;aN&qMZqhrg@MexRNi z{3+(K`RGL)T|~(Qp52gdZ(wI0Qr4Aulq|&$Ji&pTBxHj~Qr-s#I{<@pQAil1au_VI z2(yrt%A+tF&){P$lJn(!9%k_TclkMR>n-q^`9QeXfQ!s{jAI!)BmBHWhRy<@rl0NL zuRH;v5)XpB)H_NskGW5ON41~)srHkTH27-YvcrFv?DRH zv|6s);I^-2r)9RqtLilBYa1=@BdaLwB9;nR+0}A~NIJJ5^TVRqy)9kYQnY;R+r;|M zTO<;x3a(Wu&Gmx!<`yeDui-eEjvi&!cW7?Ewx+ z2Vd9sf|6dfyLR)l?=}CO^4F|9$AN`UoZY>rCr^h?->7lnn~v+kX0zPOkY^J1bas2Y z!F9RCmC@sW4fMx z#46ZWxBz}wst|788N}x$^m#ZO7j5+0*r0mFm&x z{jei`yBf{s+_oB!VJ>v9@cXFLPEO|db8QcL=-)SL3#` z9j)-5@OGr;;DaSCmM%*EZmJxA|Be(?d(1hlmvhS3*JNBp&Y6}RA?f<26**@LK8vQ6 zWj+O#VOkM!roiJ&d~b?M(J$E4PA%Py-LOr6d8Tk~H?7DlQv{aZ*Y%C;mm67ruaQ}~ z#G+I}9I;LX6w2k{=#}*&B@6t)o7xL-im-hm{{7x8tlrE@B_8^Nk49fug{2bLtOUoV z-zwr1EB2cyO~oZ?3c$nm0zSy47)2p318V zK7y1{SMak{@Uu}+j^eWz#q(_R4jZ3D!qm z8560dT5_wj`AkpD-u5Bwm521KW=KmKcH@6m1<)4y8$wB0*eX-3$rAM*a_ zRVG`0U%Q&#Tdept2HraL$dU}P`!!~H@ld%cOM~{q{}b)dlw@92jAOZ zwf1n@y3gO-Fe(QN2UfR#7zO-vweiE)YF5^lHoG;|d`ot8 zAeX{2reYaulRH{POu1fe%cB-gDU(`B=q4t1npiq@^0BrGjR&z_?t_IlL4lW&ijA1s zS?bIQZ#Wjl-2Y87354QdgUq-7G)*nV)mRalM!2OcMl7%FyH>}4y^i6d>$e_W;&iYK z7Kn{?!lh@O{)(rMMS40|vY&<3fN6QGOGcExAUUyQYn`*OQcTO-SkEG9bZ}x@;!=8> zj;6*@58HB=neC%h#@+6vx01`UH`7g}zPAv@elhYED2OemKXJ*WOs_jwvRq)bnc@(u zhHRV7npkbIxjj*T841>8;ntcp3DQ*izK^WFr}e|kVVKLUzKs$qrQ$ieC!F>?;=jGl z0E{5VIMJPxCXiORGB(@%vC^k;efO6&S<8-p_(hw44PVL$lBHgl2p!i`QqdJlX=+@S zG;F3Bo8)BL`MUl#z$Ie7Ybp9;r0z#7r%eM=1HVE8X+jf!F6pfcy~bEHtMdh4hDFJO zRL@X3+ZNl>Sl{va7aORgRGsXH)DkU@*}lSeN8?RHOQ?uC#v_V`u#o>PB(wG<-f(%h zg4mj&ho#NQ&KK7sU#OI~-`Nn$wbyTmvd8IdSQm;*U$wY>X(RHa*{>ag@?)HX1tcLJlR&6+dYwd>!4U&$@&C*_vabmyVp&@n~dnUESK z;m|3Gm({?eUK5dR(L~g}xGy@nRGlnl(L5~Z7%a=pXLHPcE@;KUVC~(R8t<@n{oKi^ ziNLxDC1dcSYVO3g6IE)gD63w}zITjJkUb&y;Q>N_eSA1JFSV9?RX{1*KWtvtx`g?d zyErthcDMEDxi_viAReQDdyN&768jo+a`WJ9Lbp9(bV0=vMk~6(Q&YuqMJkTd^wJR3WTkqoYClRRY(k;f616p&Po>m?!NVV0vCDSPXSJ#!7m7ultnm>Fcu2$-| z)CK^5#y^rYn?zYOaX47th!A)jx+cQ&lFl_~R9cw>HR086Nem7nZ^qx1-PXz4cyg_X z+jZp$D1>YJhpI%uava4kb}48)P_8hR5l)N?SZw$W!-7oYfAszOD=E@{aqi8K^@fewRaj*|=n-UmLSH7rcEdFx8$NGYl!Eo2y z1C#}CzaLl0wWWjGI=)`dl-DaPbr?@(vvYWg8?qp4i~M$82nBh(j*eD zxA5fl+iKnxOxW_|R}CO)@=wa}p4`^+oPLW)+^lfz^$j`5AS`hE&0xkaZe>a;Emt0Y zLN{lI;uzI4oRxZ}%dD71nSy;@o%~9c_4>P0sJD0y0Dd&!R56Z0u-Uy$TKax(8gTip zx)iHp6QKHT_hm-L#-iXqQL|nwbBYU`G6-zppKqJ{M#o%+vU2<3``8D(`u890Si zt@x|nR=gWJ^lizI*O=bH^UhA{x+RBycvg!nwYul0_MTryx>?7}7ammySJZe458O-E z?54)dUi}E1Dg^3ZpSK5pAGnR@UW{CK8;C2Nt-gr)Or7NAQ4w7ge3ZI3m7n&&%V)|tW5<5) z9O=tMakI-)OE0IR+aGzCM^da)NZwZ^DHaY?&G*!;qmj#7jz+eLf80A&`P^i|@n$LT zMy-LRf=k7@|1EjcC9N%aG{P-^NKFlP=+wOY+7iw^(maBMcQrQLse&xsFNssOC zj%=^My7~ECq1X^hO|Sd6)vCnO9NUgK#wf_`$4ttSa8mP_NgV_Xsah&WOfmF}Np-$Z z(?c)Fos9SxcBYxJ*}@J`?`-XWvjUiw_UBuQU~1%h+QSr~l1CV2nVpn>bhmWs$@hu* z%j;5MDhh12>u{t4*jhDfHCxdhFS9I4ie1@x$%iB*4e!6ur|);?J3SHed`!uWp(4x@ z4{h)+B}w8*zc~o+^Dx|sH@3?p(S9d2vJ}{^50)_$9URa=`0g~VO1!EXqaFo@(Fn&R zF`jEnaj0L=>>CSLU%4KCdrLHky(J35>V)qS0TXVGV`jAtl}inK ziI^8rFy_~}?edm1Tk4e{chW=dg3#fTt8%~zDV=%?=?8l9cu_XQnUTeC0xqu`+JEYL zt-s}&PNrgzYEqKguIUauGv<7!ux1fwd{?2Q)s+lLvq>M5M0G2F*6+q7LppNZq;%8{ zU;-|HV%lt?z-zE9>$RD&Av41Dng$^;JPDKN-IF9kYCH*(=zZD8v=z7D37EL)BOF&= zf*C|GlprxiePD4~9qnseUv~y0gM<(jQ+*34wjR2PhDqt&7(OPo7E}hdAS}1W8IsC8 zxo@Wo=G@C2^er}j{NRoW9maqJtf6$ub_TV!!O3z;#&Q^A)ABlPbrJaX>!YyQ#A&P5 z2QwsY(8StQwn=QaY56E;5?I)5D%alQ1|h93x`~@jX-Pz<1C&HxO}}1ANvDy zw=+DxoMa)54My;WWeYOplNgWFcsWl*3=gzIoKB~CRESuA9%zO53?3Q@GU4W!2b(cI z-W`y$bngasxlFvwtk~&}Z53o$-hg9$ zA8nFmv&IJQY3Y=}ZYUX4I-DQ@<*o#7SHiQi!8Zbk9UE$`?nZL*l-z7^Oop6trDQn5 zAq(-;oZJY1av1Dm7*X(vE6Y!?p!LCL?+wDB&dnrCZ_}D{#I31>1f@uij;^8RpUU&uWAUu|? zv|mMDtU`FKQ!HiP0p3*&oltM)9oTmVXGTZfQs{=EO9ejYZ@pgd8wY$SSg{dU5XUnzYx>hs0wE=iaWVY&mBDSdyh@ z&dNTEeCr*63Xnmj*#yNB0}Wiz=MZj^14gs&5B#9ZAcleipw&W&&vHXSk-Ld1qaDbR zHJd@HzfjTw1Tmp223-YLi}g=diWtr+ukXfx)2*L4+VW|8Pj=Vq8zsZP=iBK4elI+J zTzeYzl^o5<=6gIIAsq79_Xxk&O`I?wO1ub#!+6oeE>QK_dVv7%LbbcPvNycHFW3*< z?KJgYJZ+cJgd)u%6LmjZ%k#Y^5AVIN_z-{Oi2VTg&AAIu%!*7s9=`*SC6%k^6F)j3b zqt_qED_r=bgI{U&WoPg)n0v2=g+DTXz&pQvtRiJf_B@0WpS;4a+Tt{Jz4pdc+3FR- zui8mCk6d?rXSF0Rfd;$2hk{q7U1PVj6^qa~i^2kQ2)ig4;~X!1yz7^tvM`}?;4uub zu4nI>=~In=xY;cH#~oM17O|&f&l>@|;3H-U!B<1P{pg{aj2xJhjE%a2Jnze(AYXAv4q-3TV|d1D1ERh| zlO4*o6Hclh`v%=6bjUM}3~H}`;#ys^#b-aX5BbO^ zJ~9-fZSj)c23}TAIr2qAD%4{frHs zAtf>2yz@(1jAwAh5avSNGX6$_)dwQCc5`30W44fS& zaQ+voqHX}spcSr5kuXY$`YCaCWUfgx4VQ5d)cX>O(T0*3q&l2&P^JoaS^INJ6VGvw zP$QjDa?|sJ*vGy5@b>|K{QVXFK4O0#bl`6n{zA?Nkn=$g{zCo-58>}G?C(QA_*iW4 zH%e|Eb%S@k4Sq+-&9LQ>~(P0XFnVKnic&u_`Sf7{NO{e!H3X)%!5(zi8a#`zxUzy z{{0}Nm}l?#!BNDjAC7zYLvMs1b%QZwwG5AX_(L(mkM0K%GxMi_&L;$u8JthX`1Bg^>8#oI3qX0Mwl@Taro_;NpE_8hYb=r#(;WB59vWskMJ#awl+iOBS`X*Fhv5O`XuzX9edD!Z!Mb+H zz2WI;=k&BVJxxwev(dc^-NH*MB$tSEaX}nMcFD6B^ zhCmJUlzAwBNTSOfxOW&akva3y^;&4i+7pQKVt9qBBf8|eUTn%O9YhFu_`v_=k?Ss+ zO`IqN+v0JosVAL!?>p@{%nQ!=FYuVW@3f<l~JlTK%@>&ZM1bRL8kk0&}w zHH9Y#;iyR_tp&m}PUCkv!HvlG@WF%o_gRLfL8Nyc1%M$-0POAy<7HpFFeFO-DCf z{BVQTJot?T?{_z-fA7M;-k+%X;&wZW7I8R^ygw-ZYQFyTRcWo*K8utNnsFEv47~q9 zE(S`h)Gop?0e?__hkIrE^;fx~UKCy;FTOEC*)?+ zo`w0F%S6&*J+42?_X)(>D;jF;xvrOx0v8ImUQjPV-h1jjV;^lv!8|11lVd~yYHf57 zGP&Cq*0J18k%dVtx%hg`{X`BZ`Cz>y2VNP@IarI&j)+f>xwQz3Ak6kf; z>uQ=@I3uB&y9t*?8q?%U5PP!@!ZP@l?LXr*4)#>k{yd}*R$gs`*vmTzgA>}{muV3N zF%$N1>B;n9PshBIw-s1qI*FdM?@16dInaoJzX!=Q4bpP#QB;H?R@#3+ah&oB7`Y2# zZYKK>@7NY!Sg7?ScpYfVOS7*UlN4XrIcWfOP7a&6mPviW~AAFAheFT z1=?{;4r1>(LD;ea4`OdWLBd4)#=zIyL%8bYIe4RRoae9*{>-l~igVvYdRC@{@*IB8 zYVe-3a4(~)a1xE_JdA@~e`~ha%XyU1aeWrv#;dxu^~^UHSMD8G)>g2pU2U`4)plK4 zG0*JPmwV^N(#yTW(z<)b*WELJbDc4m-L}e3wyd)KEvxL4US+K6@*2y%-MS^lqvZQZgh9d zgCizPOzA~Xh>b7g)M1Rdl7my8T8gxdNgq22|a`uHV(%Je0FzSQiOE>sLf1EYQ{ zu6#~?Y<3H|?$jTeF(aO@bZl5UHG={bThk3bL$Y?n*z~iuo&?doCmo}IX8N!ubE`Y* zdsBbd9j(_dJBat}3=6xLsXy$DI269L7ikVufr$I_UwrREH95F{7qODmsH9cR589jVC^1h(;`isQ;FQ#451^$B1IQAcrFRdT_9^|Ue&4cw~Hu(MvjB>XT=m*Y=4d)0D!M%L?Us=7x7 za?`%gQRAIYjsOKN)I7ZN4Wp53h6(R{I0wD1d) zF`|zw=KvnM0kcHl7Wj@UV4@{xlfSTR4Fyrw6%37ky41$imgRZ%7mPQuTa;18w#Sd2 zzu>bGoBNtQ?MuxR=)UEQRg(LNVdd+cp_>cWy)fW$hVa-58r6(Buq97r_8Z=4KO&WW z18+j7-Vr()c9dn`1$?-!_hn$t#RX=WP~aWeJG+@EY$S?VmR{~8(dEv5mZh2J?1o8_ z7CUf%OK9ixFQ>`dXga5V?RZY}qc0ukTo`XdUBGivsOg|!hZg_W|MtJO@PaXs?dWO|jSHGwJf~S+9GZI-Lw!~1|6%X% zd*n8r1^ZFVoioAfKEmSV>h(&l9x`C(IWg`p>_aC1h20PMI6A|Mdn)WZy<<+Dmv3ZK zpS{fr?(mze{Zw1Wy19L6X78fA+(F>u9deG=t2GniquZ1Ft^RP>vR#Kq7nSrJ;;@#pdDG^r);d!HTWWpT9XfWkTRwg1OpB^$i@_BT)b0j}HR*`vS;srNa>!ZE z?&!?{Mfu~qIT*D3ka!%Bpf}K4-ZAxGl%tpS0b_r8Cl9ar{nx;Gds*Xuu2oAYuZ$YSW&v?(!$$<(}B^+n-d~fk;#G9m3b2fPFZ)-YK~Y zGgdyYs%)_=rdChoIRu=ySeTzE1Uh$i^>S5Jy)iLozUU9}j!r8>>G+HEx5enC_NILL#<~Ag3mjkc zM3f_BU`IxIlMM0#E7;}0XZMv!2oH|WbJxW4pWcLZot0HPA6utyYV05RsM{8c7NUOA z-M)>eM@x(SZ$KWl98h#Aqz{x-x>7N9R(~fNiI2~Gz zElYbUF`ysF1YNG0YPZT42UT`aCdUW8^!C3n5h$oCjJ-QP%nv?9lWM;=tHZi6Iq;FW zcy%~=>d4Fe(K=bx;(gzcanKOu89w~@_*fQRXMyV(SuIC9bgzz@^OeyR>sOZ8D{Tn9 zqot?y(U!=Zd!&wkB7a#-)uy?l6}~)}xL(}Q@lT!{e4@gO?kNB9L3vcUjxFQE!=gKf z2lj(AU-I78b@a;>J9|e9y_HP)=n54^-!}-?dr{*iNW3+EJ4F?nw7sY&XS;h`8v7ip zXzcNyO8o6r{-=IOI@Vkd%6ib+<>g4bWm~7VZRM$}m4j}7SMRaLyB$#3{z=PZj5Rx+ zvd+QycHfcVp4?;TX*m3P*EIljIi`-@s6X{+)MUXe&R=K4E$*=47Ob=37CjqoHkg)| z$O78|TA>FcsHQd5ID>vQZLgZvR5K`-$^tyTt8Y4D&lzMtt(|3CR+Vb4o1#A+oW60U z&+||3IFoRZV*IDzj3%juF&E{g_ z>;+?(FD{!ox=*L`SM~l!+dgRjes9Bx<`q>zK9n}Q`W+sL)MuIt3a%`RC5C)!Qcn4DkVvlj{!iVT%k<1JC*@ShiSHH=jUPF%4dSCpO=^JI$TlxR@Mo^h7k0u@LuM*lAI{2EYii-WICb`!)`&_h)Xq-fO$1sN;go7w~?`@@oF#MbVItx3>@A zjuK;QwJaJ}ZLM$t?$mC9wx@rAmi6^wVYI9={S_ZIdzrqSDlOQhI zYJ1O?yQZ^xpL#b3dVP~x6HD)m>{&?8o72>~m{@om3YjB-u){;^bkvgFW3$;oyHjg| zCp~E$0acgIM5wk&9D^9^3lW;-z_br@z^rR9Y;Im06=bnSGGQ>ARe&@FX6 zF4?N4{g=m@y0Et0sea`}+0(Ao{LY8N`Cc<~ZER@9j%nI=c&hq+dh)Ukljz{!;6qbddcwfY$6TSbfbfUc1&Sv45zi zq0D7kpU=dow#UnwDD~~unWq>1Q)^nL3^-|Oy_nCdBCCy`VwE;X*^73tI9m;eD?@no zxbPVb4IVG7^F_KEj~1_y(_g0@IgQ~C3)^-U`>x>+z2UI;@O7MIU~PAQD%dM~gpAaS zRlD0cDvI;-V*b5lOkHNq^v>uhrex@k#CED3J*&-@FWstKwr<%L*VbeUlbZF+LD>h* zzBve{KbxG5%FQM_NmFmLS($(W-G6*WLpZ?&u+51Ecj}O~bB~1_4o}MSxiRIe%uL#2 z^>n2-^)J)rqUmw!CE)jeX0trf+2z}J_RVr>RqiZX&k8wzTbXnwy40m7cx+;^V^y{6 z+cqs2nLan06W{DFDR$#Q8nd(~?QnQ{+I-NRZrG;FdQ@LD6SG~k?UC-fZ@AG-8U6YE zyf{D#zh@-gr)gWKqX%dD)J5!=!GDV6ORXAX`7EGw_~;}}eI#*zR6sqo@vO!JSe>WM zMTvA}egwAWeb}l>eA2DhaJXyn?7!=f$lm>^d(k_(dk@QOJgl>ah3ZVVrE3aWI{V`G zO$?}I%Fupp%`0nct*W~zIa-^VJIqY4WlER#Rf_JWqd!&|x<20Y-j1j}Q`%d%GQIBr zwY~pm9_7_u`-WM6HfgO7hH*;8BbyGq@9bwgE3)aEERPq>grLFnvI~InCeGY;N^^D! z?o-$N?miuOF`wSNsRK1O?_}w(i+YOSaHRqjCskO&{c!H^SZnZOOY_(I%nWyz| z*kzHX9-o6cQ(l>RvUGl~4+tC|OdJy2Wp`3g4q&DD{qlp%5YI*0oBrj*nF8IOLDd(_ ziE8R>HXM$o)OtE2T7Glq1Xum3-SzXGEr!F(VW@p6tsWvM(PybQRyfUwVm=q4<^h3f!xLfUUc{& z+$(5vdTr>j9jQ~*<=Y^ln&X+wsQ$ql?PrGT4ll-k12t~xOyOcD61TC{fx>B;e(h~G z@cRqz%x+Fkox`$7fJJQFcaCQxa<4Qdl&xO;)j*K&byU@FGOL{QQMYkz^Mc3nn=b`Je6oSTe(dq)G5g&FlH z{inTS_{w5r-|EDfb?W-gRgrqmqDXz`vPijq(|T#()Lt4ojh9AF>7~M1)oJX^>Qp*^ z@U$CcSyY#4YR%E3ZJopI_^O(}$f~bq<$OAeNNr zhh(6hWy?`%clq3|igr{g{pg}{=99Dq8GQHnxWQF{F84uRkJXp;Xzsvw@N`jVFMO7N z)}xCFya4P|n%!W2Ihfn(R^G)xva9Q<#@SG=Vv>gepy^S{C+XYoF#lt)i++hgHY;= zY;jjF$+3K*<{ok z%B;77zbvmltJ~f@S@gu}icl~`R}w4QZ=sq{9o^{&Tj$qaTBIMo6lS&xd*s>9Bc588 zbF0q)8$S_SkW+477B|cB$6~AYpE`fw@VQ}(3Lgq&9w!}2Y&Iu__Bvb@PCGGws`L{< zfh&bh(<~ie3VR_es4ME>UMvdd5ueaZP(RG8%ib#hF7u-Gx)%gG=2hK$^+nb_Z+g$4 z6kQu7KJU^%bSf!z(>{kD){}An6^4btt5prJpriF<>r_QLx_}9>(+@%PyefvnQA?g4 zqEgmogZE23NYApJheS=B+G#p}ic+Sdxs!GG%ha6D==uiK5abbKmRqMv=R|C3BsOzH zY-%Jna}+x-GG{qS|G?o^9{|wN8kI0;u3s(Ha=j?8N&wF+oz>1No%ha?BMqD;)eMp1 zgwzPfK>zG+!{%2vi$Vp}tZHBigLXbx>LAO3b-J|AR%o^D*S)IMv494DNy^bhUW59z z?H**#3ZEGASYD2ncK3eiTrkGw6DV}11>uW{vq-y-dlX?x6k(-Kfg4RblCbDVD7LXT zV|xgVP4}mbI)EjW-InHz_GGFXl~#SP5)^M9T~Zw&jJ3m|)y{wO>UBqpeMR%W*;q4fVZ_eS zVvo&&Y&N&X;yb>umW?~Fs~c;wrA#8mB4f-j$76tcS#i350>&%4_szv}LT=K$JGMk) zIhh-B+gWH6LH-&q>@@uqA1(Hxp|I04V>Gw{%CSBk{j^ZJ^SbAxJUyL#kgm_{+nb&j z?dDFm3wqA5$%h)K>K^#i<9f7oX0|?Q`(fHYr1If0#romac5dE)R(HipwOx4B^mH^+ zm@qpCj{>NF!*47MkwTytt1dRZ?l)V*341aeJ~`qEd9v$e(@^#>ebQL~pB&o}`*1jXxEJ^GP{+Mk18e+b?@*9C zeWLpX8DlppJLjtRL;>52d%N9k%jvjPk!{mMd*5n**Z!S5FHA;_7bt>cYOp71>M8l- zZX#R|6WM9M4-U)miMO-Fmxk6H3y^!g{q&YG_L!rdG#&59+r5GOm)ptq?r2`;&JoUE z7i)?Wnvq5S&blYsrM0M2%`<>ufGE9_G;Z*v=*0u%+6`%OM z0Kn%v-7I=-*Y;k3zSid&O6Nw0bPvjUP(ZtXlOSlm1C6IM26TGp)Us zTv6+KJ-0{E`yPS798tWN($6XNtCN$_BQdJ&;jrj!qpO`BF;<@D^G3T-N^^L4KSc6N zVK(aY_s~D;kE0iza{!v4)7&gDjg3Bt`LYJ)`8$!Gc+MZa^u%{Q7pb*;SuU(@Kwk)d zqfAqxLe1;iK5m#6>ysU^wn=NJPFs6irmZmmm_TR0^DpXAX*=_@Id}cBf0m63ebV5? z#2)n)A{#B8+*x&=p`~eO**7PSZ?`?HTB!Bv()H2jv$QLq*^Xg_=GoX3s`pEv>YyA@ z$1@5{9SaIs<_Q0KJ}m|#>vTl%AE%?)x%Gi{e>yw0KD2;s+ozUoZH>k~?Z!S;=h)BE z%i6hd*3J_c;^?H^Y$}?TK9lW0W;h(p((l9w1e29*J2N^+?vI`^U!dp0(i9W`VmTZx zyO5S!&Fq#?@P&CX970_uY5KXqlwRv})SSQAXU}8Tw@>HJlXS)Md7WqN=!Jc@{?PS@ zf5Y_$2c^$Cp5MK@Skno5X*PNY1Gh)Eb7O{~arSJj*YoDWpY#w3ZpZ7>xjFG{*55Am zT_0f%=(Jh>qF3R??}SrK#)?s#U)JM`qPO*=^7b&qshs&+VTsPC>CDsCDbv~>kE*nF z=4tJeX=6KxgO!t^d36Uly6C9z6p-=7#L+E`=gzzaeP1a`4pd56BW3n>`s&a#v_c-ZP^^wz9sT;e8JEsf>p!cz^`El^+8w9%X0t%U$MLs&HFzU@K|e*glWY}1wVB7Mw9PmGw+p?{j8mbkK=7aD^f^U+EZ z$zJzX^~-wxs{WKlwAp+rY&DEtVC$&IKPZspXcuwz^b4hAcGAu4gXuoSx=AxOuZz+2 zVm5JBIB_>P1GC|9dVz-`>D8xw*2CfGWS8LF*r0p1eLV)l5on{p?>&8Kf7{M$ztj@5 zt^2l4Z~7rMXY1i`ebCOjYiDhIy!*|ZFM4XwcwvGb3~^obXzMQ(WhhKs%y2kryC9jT z&8X-f6ZDNLPckVcr6@pB0_CL(S)qG21MZ9_6uSLbjStNw^r$m@^u&Rl!fT^3|6tZ? zBM&tF!=UHs4xsEr&Ro=!f3v$i+Ra_s%6z*$Y=1bc_BZ?1z1TkIF~{sNyPW~Cv}4Sr z5&X*CfNXa(fYgrFn`g`3Z2E8XqFAT;XHa$(LxyL7te=1R2G@Ulp0(^It zr+ZY=jpO%T7mw>X6lH5tw6x0DRi|m1Y&Nw@LEU0Dq5YC({>Y`+_P6$WyOX83J;u|Z zrCG`9wo|5$LA7zJ^k9$v@o33rJ8m|cDX zT(tAXsoTy7((WhP*;&jTC&lhExAyp2AF5yjJ-bk52z))Uf3{Au+YBbw+ibdzPI@0v zmnT-Iw8JFT=}ha*j)jZWtnzl=ST^QZ>^;Hr>$=-+#)d;v#qk1;RW2Xvn@5)x8EAIv zKBp#Z*d zZi{+#T{IX1e{|xh^a?9;PsmWSx}c;Xm{ME4+}h*zf~uLMU6HL*?e|3Qs_gmztg`EV zO|o6vC6K}%+KQZ`y_DXViMXgITjw8yX=qT4>|2;O)RY`llAJ8fnkzi{VR_+AoMq}e zdG|<%@~zU7ohbdRw>xJz9Ieu9ry|gXZ@11e<+d}*e~2+|Hu~F>o<*eh%s@FP&{=xB zwa=Cx&1O`k zHC);D`KSWj@5FcJDKL~4NGGT-_81>D>cK6*&Pe+%Yez5SxEQURIlz`}YrVDnz*@6)u=Wh5X4glb?DX(yROlu#Y(p(Z znjVn0&F1*`NL;W%5JL{rC6ei{_pWSAA~vVtw=8>PMh8~t9o2Jt7S26 zx>FhY_QpM1rxpy$?jUY8Me`jPIvSjDV8b0`f6GCYE!%+xE(cG`wod2vS%zuk9BhAA z=Vy%d)c)e)^t4jD(x8VJJ8?T7nZ)^9rNJydD2?U1lPAKb-G`sGntKBUWjjwav}#QpbOj`4+<^ z&~MW-zo6ng9M)>6t1jwbWpA_1W`stzb_U|Qnj*U0VX^cG;~mG#L0K=`tj^K12vc@m zj+XYg8ZG-uR5_Z%T4eTZz1fT~+hwaCfAxx0qq%)s($dY1z2};zw=c3~ft2D;!kLy0 zUj9)y#rG{<{$4oW&C7cHTj4B=#n^ga^%FIBX9n~)I;#Qpa`qjCfcGsB=nVJ|u2;*J zmY%+P-##nQ*+L4U=YYuG3&D0O#6SbQn~nBCq_{&+-+ib*P^m>r*F`7AUidT+f0{7H z!BqBbotCFMEu`XbAAnL-VLnlKX~41hz&p3BahHyng1Vt&I;zjI=%fx9K$f<~RCo4M zIyCP(G{+7(85&xT)zj`g%3Rkz&+zjmE$#6rgN`-nykig`5H#maIv+QxoS8*uXQT!g z{wTDh3ybCyy|vJ@z-Ss;Xszznf3cxyaNYXIG}OImXzbfIt#?;tvl%t%iPy$JuHn7y;78)T{J=Xe({@~`{fSlTf7|1dfB-mF z7t8m7x7pMms2v3A#~%($U<0nYXioh;9GAOiJ_#V7MgfHd)Yh@Kry0ZST(lG0fxnok zv+hoyfoJ3T)Oui@Vxc~)sUomGzX83nr$P0mUCSCr*G|!iLXHaOq!Y^P9v}{fCoT5M zVisuVohrUtV_`6qs)lb)e^cv$Wjigv(P=&IY3A6XF=XK>Q+-H4q<5Bjy5=9Gy_D#% z>}LM#eGr-3Cf~b)6N=%?(lFlc0?)|^)^P6nYH@A!ho0c0;Se5ilJr$uAMnklIZ0E# z+0?rT*Ny!IpzO}~oZj!$`XM#4OzSRD@uSNT&fM}OO?#E!E@mQK!Mi1y z9CTs#usRU6=P#@ee(RHFMs{~t3N${XgTc``I{c~2}plsRgA5>I%`2^zy9*`eg~KNthg=)@ZoEl z{rbz#pFjEd(}!PR!0TWw@$JN(;h zDya%76aRKxr|lR|Tfj4)^H%hhkadR>HIXnc}9b8V73UaId1Ym*xSsq26T+ z$DD#*f3-Rx$h;}0dxuV(o;DvmDfaz$Rr;j3XeMVEJ5&#cHAN0-6-M0>c|*PLqMD?@ zMa^uVUogg?+++-Y?JdQ}7_(q)Kk1#vfVLm3r<|nqMLDszS4BI}D>d4;!{T^g;(IYD z*PNO1=DqgmZkbj|@>d}3Bsf!=) zqdkM@qb)c=6Gr=a`3-P6U7ch9^|6EWvu}xZ;0XeQS7kdJJo}a*N5R^XS9~&Txdwtj$oFFSliVIls@Rny0I8e{}@mcDL9L11tF6$7XzZ5*hSAHIGiMv2{uh zosxmT(Y>=B(`A2`TpR0Lxiveq+Fkge(1T9vv&Q`;Rd3Cjb`S9gY0M3dJh1^dRq`Su zHaY4F_sx?Z7sgVBa;L$nYtEL%;wV~S#C?ZUC|e^d98Ak8@_NeNhi7Y3JtPWtf6YGZ znmsA**9OW?{W|9DYwLJICsPl)x|-r2R%KHx2hYBR?i!OSzIgRa9TPKr;fow|NnR^2~f4qCT9L(j8=wsh5SBs(Nf zF&!S>f0VUtmd}c&6ISwLUtTsv@sF6)|NGSS^|Sdu7WGasz&OmDYh96-#mQ&+3$Y! z+3!C4>Q7j5i{L$KRqh}?uVx$kyr5&LdZ@73v>hsHs_@mpF~R zV>d>X({oeN&~d{$&QWHcH5iq$bh2K&sglA;5Fb|Jm1 z@8Wv89YgJbx&pUY0d?t7JKF?=^iGo9**Qie$CxL3W%S0e{n)DWY}DH0`KUd}&wb2+ zzQTi72V@;Vf5FrUgVv6m-(QBjZ&JdaW0mj(F52?CSnAihx6i(Hun(|MgITs5)J56OipH|fvQf@dEw+<0{RL`l`X(hotb5Qa z*pCFrVCLvx5(*f}JLo-FQYEjfKFIfl#6_B4tR`nb`M392)@)FfpdVZg)Hq(Vwg7%B z>f-{0f8=RTc3t$2TSaMSF(K(Dw{NHELU~Th%h5DVQ`fiEF)tT60OhI&)2p6~s4Civ z85Fpgq$@>j)@gGwom}{nvrmfA+8z!+DMmBeUPTkVc4oHiK%w*^chu+Gtq!eNN+o`e z?2eF`A%52Bg}q>j4g-%)rplRwnVeA30|1(@e_GV@fH&?=<3~Sp8=Bzmw(_{w$|0ud zG*4Mo_38vD91!swDAqe~*t2K#$4!y7pk_lA=FQ-;Y?iGvcyWUjfwEh+4-bTv zf9m7PKh4KwS(nQhV9D~P&e`B=m9LA`c{QdT>et_XnoHWc231e%9q&$lKlNT2ZnSQ% z?Ksw61l>yZH@zPC;x?Pvu5W2}zt-<Iezfqs%&Sg7a#;YXo~BsdHLP) zK~rRT>t3sbS`S`S^A``Uv$B4W&$9Zef2ihH?0RZBc?&A~s>Qu$d)ZC!?D9*QKKT0) zwsgKJn|yh`p*)tG@2?jN`xg&N=US#0x0lWQdTeFO_OaqXxF^0TuIKB*eX+W_x^ZXi zb>)_|>6A-|YHc0;^+6YYbS=Nb#0m57SvM?%`oW#WK$p#gCn4Wi(XPqFPJU{GF;t6;S(H zaNFg<*RV{zPYE{lmoQBH%x&kdudOQUmtSSgRnhK@1Rl5a*c4s#!Be%To-fB^U%p)x zlTJFg+B^4t51gG^KT}We>>)jL^hlKOKp**`PKwnNizf#iA_*oDYl_*;f1*$ezuDxi zv&5%8aKNXzdHN-O@rbr$p5HRYj=n+htKE)Qt+PrCwtQJG01KT(TCi39s>v3gm>xM( zc-Whq&1Nc{S-O-X8;wqXEa`ViKfe%8PFI=j+@!<@wH2$`Ig>|ku59{8j6DQ#;ab|t zq)b-hQQFr~Dg4sE|(G%x| z?R?aXo;bI^YO*V6X#5e=mre&fUmRqR>@bRK>9@%E+ zrh53WzjO1E2|@Zkf9=1xcr6cb!w}q27{;2RiJ1n@+V^^Lt96 z^~iZ>+uQByhLX1DC+)HN$Mf^~(dU%$`)BbS|Q@Kki^+^ZT*s_sKng{0=<#jR-fBw#*w3=lvrmz=7yxCA3 zZTn%l+0^Q?-fS9m*=#nKlC=eh`Mqdi5X3D@39MH#9o;Unt72Sq`Es0j{V`mRYdlhr z;=!`3;(4nw#AH`Zfs6MX9-A4&6FjlrTP*Qh9ZxrIwrSy%X_bC>TaPM6++Szq=^SQ+ zkt3oSJyKy^e^$l!1Nh_S^J-AG#r4w7F+uU*m3z6Ws=-yZaKrv?O|0vURpG@IXgyR< ze=q3y>#CrS7H&A0xxP1;uZ!lgn!j>y+-%j(2Sz@lWDllNs`9FKZhL!9?X5k2ZFhGD z{M~BVmX|mBw(AU#5BK|O@Z!q7YO))bdtR?)>xaMoe+NJO^?&){FaPTgfBAR+^zZ#Q z|MVaJ7eD;@KmFm)|LqTd{x?7T;GAo|F=K<`M><(&;Q8}fBsiL{Qv)ALHC{4uiR_;znnE?{nGW0ES<{mq=@5@ zv`z@7e;{j(%iiH()^+3ZLB491^Tu7wOH5;}yEw9zi>$VK({KILfBYZ)@BixG{_yAj z?1#Vn8*6J%@c*rI^QL3CzL&2*Cu=R=cnH_cks_V(Llw%rA93DR)->78AX^TeeGB-H zYJbPiZsgk@xplL5_IoVFZUy%-(akI_HEAq`|R1XZ>ca`Da+NfXWu^i#jUPx ze~b6u8c2MqIh=id;*VdMI~{x~(+jl7SPmIxtcmk6JgeuIbCBh&iStnIoF4SqF2mkz z9!jT9TN4qz+-#mmrvaR3u{F~dLofgpyiw_N60v!On~G_}RR3(rtlR8c_0wj}n&Psr z9yF?g&YN~n90 zJC*IM(tJ2P*|));U*wZqS#k&1hkd7tV}|lQ004-_V1e zcv{h+HT#E;RC|Yy+}O4=?QN9VDFFRRFBoIfiS5kxUsCJo%!r%{F?6^5pj$+oEM|k9&3#KsFUIDkk_uK zcM59PQzNCd+wNS$`^i3UFZS$c@8gS$&!lrpYcRH+zo@eMrR6k5HMZ*cd{NXzGXPEQ zvS=FM;*&{NXA6SI)_E*b42~INf0~mA%k|ai_t%y4UXU->SMPD}RXJ^E>HBfQ-+zyL zv!cA3wdwnzC*gKo7O#Fe|2}=+dyjkYFHZP-+*5Ba%c@G>ujh3Eci&%E^)h`Qh{*WC zgIBL!u~z|`H&+k1=XucX`|kzCdqKX)+Sz;Do2Ku75lhD9d)(uKMWI{=e@uijhh}`{ z2ZHfP;B^>t{0(ArKl54Sg*i)nu6pJ(?hBWN36%-BbUBNB?y|rOUFJ!b#X`D_hb~JJ z?y@l8F7rZ(#YG}q=KItRzLn~7=K751E(-)a@$`2hR99gr*Dm(_Qyk9IYnLKm**U)Lse?(U%_Ia;N?DMDBo*OaVDFi zu$Zr1ymaCE>9x-S9GGN+hq=o*53y-4lrED#%vZpoh`Ry9#brUn84sZxi(wu22K;aZaGKe=gp9Dq<$((`(Lx zKw#ss4A%nMnqdtvlpqil)kn+kNtl_K#j#iiEDD4!N;kS`{e@r=ht>B&Cc>Nv92Lz# zLcg@|uo(Cw175K>P@~LU79wQ%!sQJAz|3(bVi`VGgc8#n(@-Bj(Ex#w~Ew1BA;!f8eSI1et+ARDrq@CS(pB zr;&#W7&r^0z780#e8vIee3)JjmL!&;ixY%PNlO$!0|+h=K7D!}0Q|!TxyEYG1N@*C z0-_fP0rahpeP>+4(nIZlBre0%_I*xM1~Up1k1G$T^7M-&f*K_Y!d#)1&pgC6#CQ!2 z1bKq+CGcTbe|`X+7l51rG%XW=y}*YSd4yoc0lau9vBj7(!2ATJ7wKEx5kBZUl0Rw> z0M(DX8T1K=a)d-CHTi>LH2?Su;1JO)Lf1H=C}&>4-IxgpWEUnRcUc7UBRI4vJqbi9 zfL;fI!jsB{!ay@}fKi~x*ka5TGE3Q82b|!i*FZZZe^eGA@bd&wIET4l0Y{=F0}kjy zLykC%NihQ-C?*YF{dzu;7T=W7s1GB@S0Yl)<5US20T=|aK)MgZ3}J+E4C@jJ>4r!j z2)hxMT}2i{`pZKC5JfCPf+GMUzgwSMylq*8$Oc2d!ojex=hET7VD-|dN zfNuz{h%hh=7H~o(m~$kD2moS@U^DZ5CL-#u3flv@fv3~QbK?q@ilaA7UD=yI03OGfI$*m0GC%q!hm;0aFGBW z)VxX&!u;bx@r34|)`>&UT|_+zzyK2)K|vA)5&$sZOo11!)eZ7J?lUgKnF~Y-&@KSp z3c|r!g5WblY(%Mp)(>$rB<%2@j2F(3e~e-oFZ|RGJ*HTh8vxVvT7NfwbLLOcvb9t2P-3&Ng~MK};PPF#?q-~lTVNJY4y>nJzke=}LAGxIpBKpk`HGOfBButdp&AW941h$!&{T%v#jqA9H)5K5M44hLkCBrkz{Ow-gD z+5-GaKv+UWAP`zu0wD)kI4~YxGa_I(QiO`ofGVJeMU;&m3Ry9U;umlUpq&x&ERd&t zB^-xHgA!O#E#iU1E456J;6kZse+#kKftqg5Q@n;4n9q+clmfC4#Rg6s4F%N%J4?bC zR#PeIMK4yU`36_q0C9YVqh1rj<9fm59IltIL^I$)AtRZTOIIq68^QF@az%oLlEu6e zZ#fN60#GAf#0*t7Vm*?Hke1yn7YZUg?8&xnr1%|YVUAU*>ba36Bbu35e-(q}hZbC5 zqOf4GVcd$hN3dX$B)tlGG^{N_h74T zhJoq_ffEXEGNR=UCCTkLm9e0ijQN48;P-I6lc)d~L&E}qogve#aO^}>I7%ZSU};VR zKtU&9Tp}4lF^sBCNLzvCe*==20D%;)VV7N{uZJXy6XC%XA`z}~Y33779EDiEpoK;F z$Z=#!>DLmoT2S=^APiNzED2Fu2Cc_M(Z)r^odb-Jw1R9mQeuXbat*@YEG9mJ*KVxY zNQjbc>;vQCa)wIl8v8mU4OW3aNqB1?;f46XH$LzRf&ee?L8CMFD8xFpc^`OIE%cW92a^x}lW7u>(GfG}r-;i;sr=o zNz^L>Yy)q;;haT^&wJ2~fUiRa(}2(X@5@AA!;lkETBLNn}i`l@e54| zpmL);W{9236hM=7e;pBZ=Aezl0)$H-_yiu zp;W&lO)N zFWZ~+eI}##AMDuv@O`tYiuC*}AvG_;$mId!f_L}6$9%LSc&;xQ z=Rm@vFoAMFM?JerZCs5&jM9oT?JmDp9A9`q5jCf39N-WobU_KW!9y34WU8AAW zY5W8~1gQ&vO}c)Bs2;K~PF#=@L+Fw(5*L_He=UX=M#T9D_dLcEqOFm{`G{B)2Sj-#$tPqA1*u8|NE(zG!e@~m_8ugR`&zm6 z1>+z+BNTC;c>$nlNHVeHu^X`fmoR323_}u8Xzn6dz_m-=2B{)uf#(C87ZFWe@QnzW z;5-Md7Q|c*Uj=cjM1sim6P9r5RUn}!QV<;Te;`IO9TPBuRAz1?77FBBJP3AiHVnf( z^hA^knTLxj6Xr`)sAQbvsG)1qNeqie$R$D_ZbYAp%+!;uXN86cMhw#AOeFbV~Rz zP7>XBRMb$I<%D}^i;Uu!i70lJ#R))Be{?r8p`pqgCWncb`BIev{Xj{=vCo1yVxgYK zIADpEY;T zs1*z5DZM2Mq0|~R2v8?t7!V?u2mys%92#7KycxtGUWF)M;;hCX(sAkP20_eDSQHSw z@CcVe@>HNRLBMnZf`rVELRuKOnt|kuj*ZY*LTSxHjz)E8D3LhkjDs$Qe|$<`n02Rx z!O{`>Ttb;efCi+F%XkM!0Obg!LJ#G6Pc4*>Fdi!tE6AH6lZvo~BCLF-sTt3GbTFwI zMp>PvgBWdsI&47IdgxR0wbLO$7cFV%UJUZ7jAa%w9ESSokBo64aPFR7OVs+H2H>y2 z@)|p1=q)80YGO(KLxzmHg)fx$hRzKvAHbI+ z;<1>#C}bK#)KMOCCOzI8D}YC!SPhIB863?nb}A%t9wsvLJ(g$@kuLfs^^gga^g}6f z7%19v6f8#}dLIQ7QyL19^-uu@ zk7=x&S3ZkDE5hl(g+U!FK?6#NHn6}$pRy;OUW1&3pdj&$4`9S|#J32wDP>$!HYi_n zfe_tspyVgInaD@;4Z2xe0#zI>kRbsaKm_!-*Mu*b#AxCV%iVCNJz$wl-I^=Z4u=dEkIFVw3V3{Z&~$ z)MbPMoS3tsCZ3Oe1460DgSCpJf)Rm^F+?+h8_P3X@2C zL-bn&EL1+hBoR58pF9QoE(xQ^(8PG?TSRA zUj#jFEI}KdT*pj?vxrIbk&)~mDIx_?Ek=HY{0GN|3^ewMwEE<>(1_2tk8(qVcA5|< zv?7;?#z=k$deKc9>SzfMF_v6doE%7r6htc4Fgvr5;yUo!#T$_0y^w?#Uy8M0os3%3LR{@YUA(<~>`pEkZ zOes-P3vg237}67Dzd|XlNep7Ilod+RE;+rReB9BXYoK(BN35Y7 zfMP<9Sc1hQMBMPv`V+=Eb~*8t!35-8VXlGZqM+-CIcW||NZ~3TCj+%6C@xmS3P=#< zf1p0W2RRElEFn|stQUqXp_PVjl%&hiBZIU$#zugR%TOxXitdsM1q{FktUjWky&OJJ z7G_^*jJV_kR35QZnaGM}F7yET(C*T0VAl!xtf^e+VG(;6okp(|O=ORI}fac?XVu~V!TXf*6kSGp<7LpqwXCRIP zv4Crk3q1bxS_}5x8kP-X-l%_J1Vt1f@i0WjQ#z3l9D$Adpy_~^3A7LxGEE$;e>@>= zgiaYPdI}Z=(v4W?OC9Y7Vl3erkYWM~v=gaugY*|iLg{NN)JKa^1pGdWIj>lZ*qf^W zx(M+-h?LBwqOVYKpr&D#0sbPj96l;{LJCb5(M&{82hx`g*hA~=(WO#a7{zX>P&9&h z>@49kR#RzFLob$gO9y~4fCMw7e^G0UBAbykbZn^P_bk*r1Hs#+`rJERyDQV>{Dl1T&MBFA0(J`;&%Qgmb3BR4T8u@stWe|nO4RMV5> zGL1Nh8@X%P7ln#yw=cyh1q8y#NIBzy++{7IkJjXeAQ>r8UMkMw2;e>D2y_uhPsE>5 z8TWlOn0OrU14zA$QI-l>sGU+l$b2raX)c6T{EVt4Fj7kO8I*QKYjABy>8V_rbcr!} zpuy3gB9ebu$a5T(5-GK*e@@BgN-PPIu!5>x(7^V4$e@#Sz~8sB z5^zM$#Lvn41j|Q?lhP3p;spw9k*E|y#GxU3Mj1C^J_e|ut0UkPe?dU{FnWDw2$X9i z%QJ$|wbsbdkm&V_cv2PlCh?dT!_cL~a1FT*84Nt|L*V~7?!d?BTj{$<-~mX&km4}| zmLw>p2&|qI*OY!AEa~~HM-gZk0@|}K};BK90eLK-~q9g0MJGP)az6+fl9e|$tVM#Q@In1l*}Mka|0IY6&3iS43SA7GACfFH^KGEr7d)C!@~ zD9CaAA4ou;qfIcNBs5A!;0tpdds=Y;g$+%KG0Gt*O%jHCye`8Sck7Wo=66p;E!5ZBO zbn?(OkVIHU)A$#D42XpYigbL240VmPbw=D31j~>Uio-O5l(I&<=`3P#xOV9ph>?<0 zflL8#0%Xs871-?oyv-!VN6-xrfwfD;T#Ug6fFa$^gK?}eVs++wjMJ8e2-Q5ieR}OD zC;}uHqDfYhe~2NbL@J08kRb|%@}Puk9KcL45v^%3fD!^N)N!P=2w%}B#BR}r1{)~} zRiugxzd;~!lnMxq5`n_MG&~ngC>2HsVCVpG5??JbXckCtGR+e72TTSS0YRo& zkBoCl-vnyH1=;LKXaZ?RFye}UQGTpIF*lM&s3g8Xf9>huiY_NghCriT6l$9tkw!#h zA&CeAK}JWOz(IvvlDQR@1W0KNxVXl-n31`kCT2#)e^?IEX#sk-|q}sBBL6a~t zq-aqPf6h?UUNchv;nHO$EXJ4SH5a}2oPvQl${N1lYZL=!q(zfVK(VqUxO)PHx&KdF zks?%~$auX*9dw46wI+phrWu`!CJT}gB4v_@SrBQ9L`??3U_1;-c_BkEjx1Md8!9+7%urdMqMjlhG47FCi~4?!jJwm5 ze?kmD^0oCB9VZn^DvBxs1py%zP*XAGK;+6jM#E4Vz0?vH@}eLDc^=*2NkBno5edD( zgIFSaDj#4g(lt{HRfh?Jx1j>4ltf7rSgW! zH5Qt|LyrVTL4oXnhmm>Gmx@|MC}%1B3|K4(ViRSCj|pUxSP5GMV?7&r3_?&M(V)q3 zw+|WSL)^4NIz8$pZj9_mF_MslutaLWxIPpHk$@WD0%br5!$4P>Js%ZIDWN$yHQ% zt$0=lyM7{agbkp!CW&O2>f86N~%kK&lG(MmG|8FEdW6oe@WOpynC#u5~} ze2OoPecVGR$Rr_?T!{q)KiVA@e}H!4YJ5bfN78_H%TO8%G5Jx*ro~mrgh#G8WvdEf zK#?S_kW#4Fcb51lfS`#7#ZztW!JDVoN<9df1O-_}z)=M%$Z$<^k=fQN<=sV)&W?2FA0thIh(@5z861_$e^75k0g4p^ zp~{upP^qYXOxx2G-9zaI$P6kJ0dS{IosB3wU+-6odw#hHBWw~yucXH-fRg~}8aa%) z*Yzte;`CfX6HE8=5e%|a)EV=qU?rtnBL*c?EeA zs<2eWc1ha=3a$)`p3*hZ;%AiX1f!nFc$J01Ln5GmJ3K{SAW(W3OhmJk#JHITEgUMW z%4ZVyFDn@^R`DiE2}MVg6xyYLoA_cE!w1Roq4tDuP|uXvO#A(De+XfRO^S3OiULss zRw6J`P@wJxQb-uk)=n137?%|)cSRIyIPfE+10gb+aE)7jW-Rg7wEJh~vc!iG3qjMr z1_CyN)mytUjI*ME5fTDqNb;*s9?*zM9|HjWP_aCUDKWk?y5LeVIxZ#Fqufl$@_?Ir z_yy8yjD%xx?lX#V z0xCv;&xsJ}5DGz787@ty+n3(Ei0xj)Hjk2i#5Rw3 zKVqAQF^jlZySm5!oFUsNeDWZ87qk8LG23ewMcwFMO3*e+_5UKHwhuf0*0e>3Z2L+0 ze|OAwq5_#|e{yzXwlQG%pDSoPNDiX5)w%}&ju_V?b>}f?J2@V-E$$53rm@EVLV~s> z1#Jgi(00%TZ6`;9wxgtr+K!ULu)#b7`wJ^}%D^1p7zV-=iF*-}GFE4LDSaUFC_E;CC(0#-*U%*Z&KQW< z8Z>38XI%pMm?fw+)3usHDuueY3B&|8utsCI@;cBpQg+IzchHKi0uw&PWc#g1DI zDR?aVZnYrx`);)W$p3xaYVvNkTDa#{6Zded{S>d7?0ePtj#uryU8h>~r)fWCsa&oBQ*Y<8}+q+p(CPuBj6K~Ia`s>t==SrT&`Y?|jrIkYXAgeH4%_uQu?&>tzD!r!4UyKbV%Jzi81)!k7yyYmy z(j=>tq{@Ck!|{~~FABqoB_RcE<;a+czPh2xB8ygUI&Kwovslp@f0DbADj@)K&_NQF z-bkIrgc2>q9U+TX_9!1SSS4LbZpwb8vx5f=Ax-EMTM5s6P!o`o>Whxu3Y8!%WPuk} zI-?y@jXYppsEH(~(k7Xpz`SvxNzoc2R_Y)&N==)8dfsV9;SFQD^V={cSNtzzYnIwwLeh-)%S5-m{j zMXYlrnmYnI&!wco8leLPK=_KQBwUmyJ5n5jP8!yCfy$*#f7W4r#;~uLpHxbyFl8`Z zpxdPlrW|>MrlCqkD3M=aenmItaJr$SKrPtLda?$CH9oCAH6#aXhQd|v~EIewxVopkwP#GnG z42)IDtkRm-vXm4h^AU9A)SvgH`OFG) zC2R0GLA3jcZmz67oQIe8m;sYAl5b1z{#KqKB~|rS(c#M5t-@0xh%TX!XLbg?@9Rg2 zMPexbaRK80h$(8es+;d(J^zqod5D-VkYxfIeGJUAf~#}ia1D>U6$VEHm#a)%!-aYyp8u!thR!=M&EvQ&%F#>q8z&>?@5m_1|F!-f6m#RNV_C^i(@ z#FXu7@yafKj3fRu+bTvFHp;b{iTXDz?aC+S6Dj*=g=36LjaMacm3Rj)a*zQ3E;hr| znD%tMgz;6_8n(4ku9kOAXEmDWnUf}aavqai9t|bObkR<)5(+QlyJ=3V^$&-(tW2Pb zCul1_xuy2`Xw%rhQxMF72|XW6nGc|MeGayxzodM-^weAn4LSF(bNMJa6%*~VBU17h z_vLS;b4hR(;a#exewF3(K2ER1Z41-1|V>hoc zk_Z0NgK9iiLuE%nFtl&%vyibEJG{m0}On1*Qdj(9CbGTrA}U`1%xZ1 zi>AIaizNG%NlHf+sW^4e9x2?fLzs}YCN`6~i`U$N3twcZssLSW>DWr`V}GL0I8=>7 zO6Sry2+{zo_obaSmI1|IY~$Q9WT+29!~GJkeh zrfaF(9fr@LLspdnNzhH~5dZlx-Y)iX<9dqvvJ8Q@*vUIjjdk8xDo3{~Kj9z^A8nR%&eh|(u4d3n1C3i8fCAJ z5^JrG2|p`v8Hte?rT@h`ej$x*q>9kPMGL?NEe?+2(}+aemGM#&A2i&=hdpuiP^Ed^J7nnx z@iQ=mdqwl`7>9{Gyi*Fn?5g2%GNb}XU$)f+&%a5RYY{)j=*eTaIx~t!+TGM{128-| zT?><}iDyD8adnQNv%v|Z=_nqoaSVtaxv)!g1tAZ*=te$4>reVrWqBB{lnb@n5vcK? z^7$2Dys7O>t`iYje>RVfpTd4c1LwiJx&O$_D~AWeXOa!kQ(vbyl?#sTF)%O&{*ng4 z_Q5m0HSuFdPizIls&xr|oDq&>;q{=oska(<~AH5;}Z$ z(}F&+|J1Dgf&C3aI+eY+{)nh4w?Wsfqj01c)s#Ktu6u#^9$b|L#Hi|3T4L?=kmydO zJfaxf(DIN*kaM83HF`wBaz1&3u)x;+*;uY)4n)dQ)l`}z(z8Qt|4Sm#`!2ib22fRh z$zCdClTM=?12)RqZzD^PL|{ni5gH_yu00HH{Rp|LS3OD2I62=@Sz9 zw_Bf1F}&C(U5b*>@ZUQ{3QslRGYbXwZ*Wm)e(knZMgqL zzg^@U*AZuY!)RBE2G7>I#0P(>vXp=(PQAZ@ks&`n+%~)#?18*X@P)Q&nhUEhIoOnd z*=pTUvfp&OrPSrV;-5xzw6xJgMt!qJ{%9PJP++e0WhOc2$u?41)_ zuw&>1Yp%R`xSR`U-j@`|?`nTe2Ilym8e7J5)y>zgWp<|_fC-n0M8miip=6=quB}Kn z&am8&HO8|yN||Cx1E121TtH z;V&V(G>I-jn+)(3nDjXug8V#Rmrxq^5i^rDRFdCepM9kFJLq0gD*^+7fNe#hTFn>F z+wRJWoQ~gy+GVN^>u2%ai^6tR)mLN}h4_HlTQcHk5yaOF^_F zCo-sxc>->j#D|WP#3W1-G<*L^N&y5T+gz_XrK%!$vX;(EE-wpsgf!26sjAb;Juxax$b*R{H07kip{%Qie*2Z<(>0pkBq1sOVJCGDiJ{U#}&kHc( zBIGbOg!ceoxN66;d>|DIDe*cBoN^FnpQj7LLzzJ^nR9`_jR``LMU*EF+XM%3xCe~j zKoiKFnW%3z=CQXeYCyU-HekH1@lc7G6S+A%Llr|2keKHG4H~e&TBB2_xylJQ54jor z4|H+|X!2ks{<&Gl1!XorGC)hMCfT1X+>Dk)$!dV*qWg|!RMP3CXVVJ?<@6xlAUu^t z|9rgoZGpm4X7V1ld%bJOPw&mc9ht^3nF@J17w3q642_+mHj1Y_m!qMrGOX%DMpnCr zv(o}FTK%?Nd%-9yKnDM03Xy331vPgs4xX@8WZK(a_Zq@eIqIH~fFejEf2X#kNI4H~ zpQD4R6IsXHzuGm%sOb*)C+El$k$VaYhj}b$<5|Y~{Bx3sR7#hV#P5Vj;j=xJ%;yQn zkbGRI-=^4kxm=Z)L`sNwiK{?F7!+4&sp7)x8u7|V{h}HRLlQ7#dNv*L^g)gP?#QD8CCJJ@|mrrOTS1if~XBWjZ%RqC_P zw}yilx}|KV36!kJv)0ry@+bnhWf=8reLY((M2M$4h|x&Z%v5TY!ltGH9~a8eca;bd zF(ho3W|1}GoJq`+ug5Pb+AkN&j<{id@6;*l1_Z_HHO_LJo#cNkh~~!@EbJ}zCB81j;5#&7+5&yO0XT*Acojj4UJpL z_*FvVp2Kkr5`9d0Z*?7uj)y_IQn<*_z=%AS38fS@PKhDPLgYvx;*TFtv8G^2?(!<9 zx=`;AU1=#u)RYGJ?Mm?_GJR~O&~IghyvH0A(zvJ5?X5$|hlk&Z9e&y9|JqpJk-I%q zkeN{!F8h~`ujn{>HBWS8nm)N*dxZ{y44bCgrCnA!((%)SRXSU%0YjEhl6kX#tHN2FJin26%yuR2IXd)wS|2j1 z)^5%hX5zx zl=CD?PDi`A0C+IbPQ`mhC0JX`&GC*06C-rjO+++~l1A=)v@ToES&|b=d#)pREC8P* zXMRd&u++CE>3S5Kt-3;;@9qqV~EfW&%*PO9W{CfqZ#OtaeF~H_=t+B_Zb&DWjxO`+CQ`yI&qs z+9&6!a?S>(o$l4|irwXhr}B6UDn3#teV|U{AZW;LvuK9dRK<`fN1c8v1F&rCaIY*U z$)mV8Q!?zleEdi2j$ zX@098*dt&^NuVl%EZG||bl!rkljC|WZ?$rvRNYPE1!iX5cfK+ZaR%a&sFp3#bUo)h zy>E(5Qzv0v!lQRjBdQ3rLcI&3k7I&q1K}DrMg5!UEww6HCf!zn6S1Z zc6b!NV2abLmi`j8i{ZVHg45pINEsrrwheKwX#ZqmJA4SfJxCMz5 z1Ga|!nK;1oUaz46i{Q$mHTo*b2W4E8sL>M*P!olcX_Z3ko1w+MsMry;xF#Gw1 zBLb9F5t@SP-F%|S;D5TbQ%s5oT`+Huz6lXfDVLt4e%3*@C46t<=|X>>nAQ&dQf9_3 z4cZy>KPm66Q&NWihaykn(a_vS)4428?r@&vy-;CMI81NdNG2cdi{u$6pMh^P2WtwJ z+l*@Wp4GAI5ZWOdlN9p~xidQ?MeK_a>)sBTcOEbZ!k0h`^YPZUzQKJzdYV01&tAed z11_zEpQG!bzNsj1oU?k&ZF~kwc6_=pW3%a*SQ} zEX|eWYrECi@D%7-qBok<@`!i~1589up7U8*%?2Gla#>$s+7LsrMS0;y_=Z1wD>vh7 zq4?B6XvPh3q}5R^H%`ZHdX*AAU8D$UqtuJo4Eto2h%`-KgDg`8Vr3J9v34PQsVY=} zFet+tveq0`Ha2V7iS#!{AqSreOmUwbeeHM~bJ@RI(-UEYv(D*MJ8z8Un(kN90_x`LR|C3LNRmlV3rJL_~)g6aUP=5BFqM@vQ_JFhw!bC+*i1nCxxzjG|XPQs$Zo(-DJM})h2s3g#baE z{-x7(${%ud#Qkuphj5$$%Hu-t)HJde1^yT~_Q`Td!DouymG~jYH3IJGc%PU2bOxdVc7=E(WQ`mrONKv@m~NH{r{Qcm zcm?thC4KgA4XsU=y6}3&%3h{9t%i=lOyKN0R#8yeU09>7a8;Hz12y;e$U5OI)Tf{) z*{N`{Z%XQ?u&_vo`7R0}GOKJ1M#3@=s`7Hi7zgMhBt5$82f4pACWE7{1VdG)j~Zk} zmGD^4F>8g8woX##f_0ITim5BD;&V$Tdr0JnvciHYVNe$T!sqWyLb}F6op#d1Cc_J9 zi|ac#aMjU@b-6!=J?Owpx&vjZQ<+Y$S0hzI;TRh<7z}TbgjiKcZa}3_`XY_WrrV_i z`rh)U$$|(95%diu8R<Las@Kw;Kh0ORR&zdDN+=Z|Vh5#uoE4`hR z#2dl%B0>=_q9%f_RrWA_Aha`to6E~&FSNiel++jkYzy>N?uQ+-yw-%JDUP)jtgsHs z9RjMK%^*4=?w+e*|2*z4E>&3aOwB5`AoA)yLZ${FukePNvA(RoTBZ$$z9$wI!(dVe zP0}+uK&IJCby|mR6Pjz`Opy6>{2#Y~ou1!FGUSv2TEh_g3$`KI6Tk{3BwDcF}z(Foi3CE&6u&Dqr!7nHGBPiy?zW8>ckB)UQNZYAA?L1tpIk6$ zQA7es_AJYvQMPF_#EAstvmR1U^}^I=rV0NbaVj#;OCEUSy_$*$)fiuo_A6fuU)(2S zU1KV*fzTeZQjLNYu!K)}`WlS56s=tDk|N9P`k62XzFTGBy);T}V^8%^;G$#57pJ4I zARO(BYlmu$22c?}>x=`p<)+?mtp5v`EC$zJ27Y4raF;IjF6EQ53|DgyYrrUGH(O&Z zdGYS8Y-x7e;DGosd`NI2H*B(KSryKsrXrLFzs2qwlwb+mmb$+6WQR2abto21*=qhF zHCGL*q8Bc97b@YAYy1gmvu;Oo&?!L!9V|;7YOD?k<1{{*)fpz88(gKQY1Jl-9xaYo z+sjvrdU=v>Rg&CV#Y+V35Wu8iq8Es zNbcu-mz^YTzJPT75^09w6>*(&WtkzNo?!cEts0#HrX{bC(MRs!#1yHV1NtJX+^DYvRt`)Q>)9yit-w~(dZc$Y-Cf6?Qk|z%crH>rurMEf^fO>4dSL53q4vd-U_)P@n{Cok6IKs4 zaRP`peMO`-iuY3F7C1UJhcD&w@*w|#-|pP<5Vk|clWa4RBNX`vx0Q$R%)48fe)F*F zeEZ%U+Hn718!8ZcG1eA>EBn0!2pYYb3MB3v{oxVS69wZfXqt3H{hJ3S`3K9jh_^F7 z$4T%$H$tceU+YW>#{9T#n&teYj+~x*eQLf=4cvz|ir)W|JDFYauVkdWjZlXb)-t8h z%B|m<5?pr&fPUJteyvk4*ecuNJ4;Yi0`n3s7g<_p4GV zMvqSi2f^+XUiB0yb_3N!-hq4;!72nKq{Zr_fhP|f&pJ~8r<)vpa^XKpggz{%NKFE7 z19eEJ5R^(J&dmNoiWd1|>He(Q8-voq-*{YEN7mDSk<>B(_t+0V!Qds8 zRhrU*S*=qYVYM%qk{wR-GZFi}8hpxuN-Lo6R;k&~$O7GM1{|a!v=Kx8-5c0T1Dj{}gv~@nNI)Mbs+A zJ`=2$a%M&G++`Ue7;BKbPq59cxnzUJ&v7ss7MkYn>;tHEt!2{3v^bolLKO*Lmib#| zEEI9FyZCK5#YBW>n10r1c)KohiO3Jpa}l7gNMY=KV4!tJ?!V)Ur|?>X*-STg-(?=i zq97I&uy1B9_5vJJdzma8>*js$yp@7zdY9iJ7N;bds~qbv9W#iyNM;gx-%-S&e=g*M z<``AcFe*g*m_!~pf>(k1n_dW(n@%K_;;z5_Sc7%O9R!kMbB!fNsBm?TGWZ*l>$+Qb zxN~9`a_5(8>ZpC3+SPGjH=(){m`XZ?G7ZrT$+73z>7^>KeX{l(JHEEXx~qx`7^baC zjA-ZH69*tp!(T-CDmz;v%HpkrO92I$7bmT+xDLR8+IPsH`^H)xu-Xxs`U``6InqhM>-f8M%;hqN%ONlAb{P zr$AJ}8hXdug;xEaFo7QxqPsB%b8G$Vn0XP`~nq++@Vtz~nq#~1w6nI$}Q+Q>3Oj>|wK7m;Its9na z6}REnoJafG;n46cPLL4MhlHtP?BB~+Ol9A+bLtI<)M?g(`BE|pQb&O)zZU=Pf&G7*PIFJX z|1JDU(vh(jUHf;rd)>bHm{t?_HG?clD->^?6vgP}Ruw)VkgbXq)8tSZo|CeGeu5}m zeHo?4UqncoonysRtI-~&O=}{O>4nv_H}G>Fwoc=u#i&IUw4PG81$r+=umUE?fw8kM)_?oM7J_luB3smV>OT*K#Zd4j1GI3IGOD2#(*8kqAcxtklD=m?v%5eQjw$l zsYDHLhw3#Gdm3jACM~iG;$3UU8}1NDYIXNCGlb`UqS)xTB{Kw8B&n#U%k$ldRpmIP z3%IZ}2g;jsI)?imEnWr{lIQb&Gvg#0lce85}RCR8F=Gq+6)6Tn3N znP>+aX@<~>**X(5)-W_UTPEjISXm$M=e*u+oU6 zoIOIf%1g{g@|Gy`NZ#j7lCqPQ2lj@+z$%LW9S`K44r)%?Pt%aUeA9BGO_Z?|1ov-7 zA4-j<6CE+duzUl~{LLj+%(}$sNk#P^qqgy>I$5<;s9khexNIx7U%LF1y`ElYt9lg& zzm*=Yaym0`chX>vH4&kn-O1SioY?8iwEfm}y>9(Bf34TpZuiS6Y0%CW8%BX|v(X{i z7PreLW^=_il|>BZ>J;sGEy8pCK~e0a8jrVd12#Sho|^{fPp2~aDfoz~-RdzB?F)}M z*)aob0sdXwqh4JY6`a>!`~@m5l9UUl2dV+omgED;LXQM2uq1QbV$B)id5%^hl z8}JTE&hS3&gJ|0lW3y}lO#8F1Okeg+xRYv&j2o_wn3@#6ZwcQRq6c8YNZ_{h6QL&dcsCCo6RiS#+-6%~lfO6=+`S&DnAX^rMwV2RAn{<1=4B zWR>Y|VSLFu#pxPRnr9|d$^jtUc&U6QEywtPC0p%=^EGKQSM9#U1QrH3O3445&eh99 zEX$DzZigBrOon3^#4n*4%-9OGo$-N;Ou7+~vlyi<%+el#fX%G>->t$;&>!Y4sj{0m zdby+c%6ts5O?b*5iXF13a;zG0qk8Md{l4c{$wJqa9U6&@2rHSmNRmkXP!xA4UDC3= zsKs(~0sek52q0)Rj3C!0tgD+=r=GIz2mY0u12-n4_68fauc*ZB1;s6j-~w}8u_?p* zLj?ZZf6psu;Har|W|G)>GTC6Im?v2b7OZTwB(RUjWkJ)v3`uT8XPQgX!(zI%JXOJ_ z{XDJ!t-c(7lTwT1%tiRNPxA<`NJp%;UJ*{BKv#HMg#Q7+isk%9ZD_(|Eu90+OQmwi#mGuY8{)uro-g#n8R0C#Q^0)6b9t@0i@ zHoR0jXL|lyAbBCvK75aLW#{uvY%wvm9boTJ}&qAvD0_`cg(JM}WJP4ui`Im*r9& zn`)*0EP>zrE3N|g0u=G{9IdkwLUC?H@)(AxdS$z>vHUmD`TSHi)3)b;Nc**0O2ug! zJ6R7s6I52j3wkx^L`Oi}>U55Tb_RouP$zq44s1=*0tII3g@ebwMf zGK@cVQiUfq5&t3Nw>MuML5xYMT3muuwC+|U?rG9d0_i9s#ppOy6^KcPk!I~LMQT@t zc!_+#$*bafu7saB=697B=f-B+GBjRzT;DMEyj(q)E8TXQZSEC_?PQ}=IJd<7NfK@2 zV0wt$qb|R`EZkNYqEYWwOe%}#P-}DSsW4OCv?E**7J`TQyY{i~z+rAxEm>xW_+2j6 zqra1UY`BNvm7{q;gpe3Z3WxDao(KKcoBF^{2v+4sd^)ofI0tED%4nP&UfHNedM$=? z`I8!^q+VyDKbx-v@L1`jd31H`sut0tVaQUe?gh->$PigJ&XM_G@XX#WdLNwI{~W8@ zWHL>M2j^S3s@gKB8CaTfaeVjE?6?@>agbD-gUewwn$KC?xL@Oa*D)!C=G! zE>4?k$1%P&UK1p~zUV?tU5nh0@BZq!L62I5-a`L1#CJH{px#P2CWZE46oOIjvMGDm z%fl&q`09CcC-(YcIsVvAkhp#;V5vA0j{FH{<#ofI}Zec)NUYf$>CB zcbO||%54RFb8yrN*Wt9L8Bmg7(yG8jX@t4FGZXy z(|f#*3!Np7i)8{H2lHa!k$qUt^_N%iEo88w2<7;9oh% z_R(Y&S_<@fw7?Kr1o4K_SQ#jdi;>&9VC2h1`^C#n;1t_RR!Fn^#46oxUmGMh)vK_O zDobEC<|8ym^@;u_=FqbT6i@|;oEO{Ih#3>&DeCy1;dkG=&Q)nLhq6)GQi{&ig!|q+ zKh^J1q{ztrWH(=?!r2I>aKyA={0_xqEogK)3JHgk_}_UISWOzpk-1=;Dv7rO{_-*R zwCnu$rFU=*8QJZBy3^ZF6#AjIJ`ZBfBrUmqERN#jn9Y)+_ifaOif(lb=ORy6X(m`k zp?0o!0v@uv<=i$WD86S3#pl<+A#lL{IauP2sV|) z&tG^iQ#_v zv<_(Ise;;uj0W+kfG`%l7Ly-)8PbqRN-!b3{ zq*~jnC-)74rmr6s4*M`xliParEhEBl0ojs~C{m<>CLy07*wp-@^dA{>5a-~FuDsFM zGF51+Wk1lH@2q$#&q@TcrZRnaFf5qJ(>W9x)=hDv&gpd*6k|}8H!?44Zl9%cFe_s* z&qxjb(U@Vs_|`alJkRK;Z^ry1MR-o0i%m0@On8Q%`~4MI{^=JFO*9xfIb&Ds2kzDr z$hncehWxwbOmc}(J4vFAI%psko!mRL(U~JV!x@iZKrvfrLY*c9uI za z{)K7f2vH;un+av7RYlJyJ&9%dXqK7=H1U!+L><0%O*#{uHvuW(3D{W@WxrztzFXCm zQH`*tq1Y$84olE6Qruar`D&zbDR1ym1;)V)HZ_~Y%0q1Kt&hIs3C7LKaoFNEG1JB3 zU2~2R>T%+DwN;b_BN=2YnOm8WNLX`> zJMi`@Jt*3(I<_LKXCSE?4mJgV^Qw8yn91*Vs-e%1iZ-70pb3Ez0P9B90Ip;6=_;aEj$}w&Pbw3IuspP!Sgr z7)_PCe4HOjfYj;CRd3N3R=Cm$aL=tBdVy$W2go#pT8R9bC zlY6QZ=6G`uTc> z*pIlBJf{eJjXMnC|Iq=WOnh5jcH2%9EFD%w(^6gDHzjqGsR-A={t`)BNlB0W1j(l}qX-UnW*DvKeW49Uq#K<(82 zex_yg9coYl-aV~XfM{pR!+^6R;cUCydfq3(zoVagCKhZ;m{bawtMsr*+%PBw3BB3h z>a!2xS^1@2xnb#F5y2@sNmF}N+g0z^ydDO8VpaD4q{V0vd?hX|zN+Y(zvUxlDjAZo z!Q2w6Xle?mlUijc>MGqGiRj%x$1_062R`proK8+3AY7TemjsF#d-5dsl_!qnyWz?mJK?8ld%`=8 z)YpDPJ!F1lf9i!YrBJ{;^5+(ln^o3!De_J|ygE3)`lxq_5BuQh$TMs4Dn)-VXMQvGmaqtziaG3c%V`$0{(5&Mm zz&uc%+&!Wa``M$$vIS1uQohUjH+_^QXWu+7U>Q`2ZH1yo#u4y)HFvGECXtPejjoc7 zRZ{Xq%uuv5z2~NiQvu*Y)zelvSjLi7&ix*BinO<=MIvV=;XsZP<2;fc9tTcmqfY#H z8~T9r)3Y6KoU^lgvc$>`{EIPGYukv)^I|k=E$%BsP=X+fN@X@Qfzi8h# zbrl?AgK+(*r6dgoD-}Q)#94M`2u)3zY+SD+v3{WXvlfFj-wXvf=d8iK8X9+hyhv!Z zd+gh|)^pA-gPNO55S9JuM*^#|!vryH23rzeIl+%d)v(Y_gmMb6>jB1IE2{W$*k;3u zj5`a~3w#QdqJmxi_~X5k1)dTmiXqNf+07#zq-AcE@S%;LprRqgo51cd&D3*Klpd3W z!c#8fB;NWk_7!Vmh<-Hu(rLZeatm>nP+?gCM+NOI>aENV?TEBzw(3FmClwpB4r*5S z!Nb#{BQfRj>Q677j+}YaU_J&Q?2wj{QR_-40(wREcB2s!yU{c%@JUvSMamps*26Be&O@&fI_#~=UDka{+y8XVLT^@I z9g9g9 zGaCj>AGminu4XpfJq!yR^}>JVv#qESWPWHtdnXtX0>_;V@JD9#p2|4a1T~dQ3(6+% zAuo{fk>V9d3Kx>?)St-c^>2m}(UH^TM}bpw2oJcMCdTzZO}J^zS0OPrGTnp61KrtS zG0F^0j2aKU?VJ+xlv) zc{jGv#>wTQxg6t*(~vKTsNJWCoAt&yjk((>#<683WgRvlB_V7<6vDgtU}l zN^A-dQ_myo{^EiAsc9q4A?V$Asn{xobFAfB0MZl-rdq8anGtbhn)9F0=&x@O#)BGR%w3SGeNpw7ucHqu z*Ctd0h{n*0`*l~t=&+(Itc^brV+b?#3I1BMQN8O>e!Z3sKcg;GWSNTk;pkc#LjR5RF5qc@maUkI5q#^7g2hgodk3{@H!IvG`Nb1y%K zcsa`mlorF)h;m*+Z14YHp&OErs>3J;HfNyNGT*kypC+_0|5>a`in~+fFRHANCl4F+ zz9I%otIAV286~>L+ZDlkCUdQnQF{pPadWa{eCv6-EQrU9YA8}@6I-H3Wd&XFn5*&{ zSijGN?S4~sYrg{_FBGJ&gapKb_$=j{t_~_`e0tNaA58&NZFeC?bAHx&(bp zSRFa~mh^iXozYkXH(UVhT39d#Q;+OnrdhECGjZe&eRAF8P3)6eZR|1sP4Rz=Sb`jn z$3Axsk=6ilu?_NJo|8p(XUy7X3Tr~tB6#Iy9`fk8%+n;K89 zwxd42jHU`tp%`v_U9j(*<5E1^{Y~Mh2(`vpN!$yVE*Bdnj0{Rs9I{figxpXYwW@G^ z!DhS3r!k-Ym+ro!hhhMhO05VjmR4n|x~kON3jNgNhT>PPrYd|8ZTOcP zZv0V@e_cZpI=^?~}8Zr;8NY9JzV%%+8z;xM4N}!y-UW>!0=*Km4JI z(__SUF*F94YoChPa*^e%R9^_tX!i7)r~zD6BuM(ex*EIB?XP*WTwG0`)2{6^&pshw zceW<}?aFFMH{cdcW2OOpK#1jS!fuM^H+TVZ5C;?SsF;c|9@dp@B0y^2=dTrU5pp#D z<3DBS5Ik?qox&Q=br{5Lnx03?ZgsCIXhbkSJ2Bwg7-7nZ%wT#{v8RjV^0&CU9#{IL zy8$d*c{FOV=fO!8#8#be)%bK2<M-DxTm6>SXRtQ|9=e)0>GvV;R_D{L;SIWf$9D?&Ai8|PE)s8q+B zo?#B^T)Be=mv)9NITIJq|KUxRvLt;?fD%!(GPza5a`DP8l3+9EACTLM`u(CKw2W$* zTk=Lkyybd!FcWE;p+J`8VwRii@(um_q95}iB-g4Ck=5I=8(R1%Y&F_Fg_?PsPY`41Gu_|25Hsx zyt^MJ!9?XN(v`)E02@X?=dEhxdh6rOtc`OqL8k2Uj1K0`bSjDVpyaOnIDXt^Q3Ozg zp z3OW)lAmgSqNw#l>IvF*mF^St@Q1)jeRiLQSl+>0!t*3%SOFM?5J~RU=)lT03Ok|Zr z-`ssAF@ZQ0`=!^ac8c?bHQFyj*Ubl(p?gVAEK{8sR=F%Vbit1<*fAQzGFHu5zKico z1}>y{Aiq4xw5r~Vt%?_LR!|wXS5O$T0Cz?SXudjhLbFnJN<{ej#0Zhm=DjXiHs{q4 zB_;5kRD>9XAcVx2agQFeje4-pMCjaTFYlR)+DW+S6m@`_z{qQ3qX;Sw%n4H7gdcXw zVt%FdtT{`~WR^D#PTO{uOA}V7`~0V&YM_$jv^cKloAMsE)j0u-ztrNV^9RQSwUWmI zQA$*(kG&3)&5h!x+L(UE&dq}Xlk^GB96SoLG@b!eHmF+u2NaP17PMgTlwH8fzqWOg z&4Zb$rup-Xcab}1O<$XU40J@j!@$3Sj5Dh?yLSRRq}5v!81D^rzJi&KF4)0G^*;A4 zFULA{mU=c9+n4KYU)tLQADXNxqEK4(a_xEM+0h$&yquKG`Bfkyy-FV`BXlt+qvP5L z4BhhoBneZsi5j(N{uc+sSKu5B7pAKp?McDTqH`!?W>{ARAgUU~T9`{Q zn$%p&5Q#iyY-LM{kXlz(-()`PE-TOlq+Vk>{Cx(y*6Er80wK!$nDV zH$;zE{-ZP@=UHHj*g~84h4o351K(`WXr5j(ADG> zS4szss?4b6OVRG3TyM>!>(i)M1T*P9l&=oHh2leV7!8%bpxMB3zEIR%wDX|gK$2-@ z`a)f5nowJ5sg4j-wmmnUR{G&=b}Qj;X8rTEnI<)ib1g77(u#gX6>77>Jsu02gHEoH zq~Ym|b^}-AztRR}SYyE4q+1rDm@)cijD~TgF)2L$4I^bYVq{fx*I2SaN_j_TGEb@D z@^Wo3f_l(4BZ^$&`*@9}rg*)|T#g;{ncjK149%sA;o6&_|64w=pFYL%K;V5~DOdjr zEI04n-(cnF&u@~^ZMoAIRXB}nTjK2d!AiVhpOZ!h)8J=b4L4gz!Xh>xUjbC{)UBin z&PKx4b|^s;$S3^&)b;;z9hI0U!c^p*4e&wI}~_l|FTcaf37-kXvAknH_ibFKMg&0NVm>RkzY{1{{k z*`T!>EuB0zJG+Ph>yVcATqO*ASR&&AJ9tCQG@~Eb=U?`2J6LX1rg<*vx%nGpskKiM zBjJF}s8p26sTr6sJ8!;f8^1e2*L7B4Nj>yFz+6%-7ECv5j<{dpJ$w=s&z3PgFCE4ZuGCd1Y_!S4a$2?E7L;gkeUL@4d{QB>Y3@7t? zRX_LohejtBUSxuwpgQUCx^B9zRe+%4o)_L%6554x>PhQ`>DNlOX3wRZ$XpRX_iCkv z?YK#;L2B-JBw^l$VW`Ov?x~CBPxC|UF;Cb_D*veVxsgc=8nRfAwr?YjW**oRqo10h z(FVHWFXNNiZOSI(w0}KhJ0RHXzW#!XA8n0c>hoo`&`$NfmYP)@w- zf*0QMmcla_WgWux8^@u8%zvZZGa#krlZ5>TEu0@#9pYg3P?NZhMk|ap`yL7w8SL~c0z-!hRJZ#VJN zj6J3Q9Cze%bMo7Y%EL;k_Omh2y==7M7aD!3_5kc;E?5@uiIecF0TpTE%HX@AZ~Q$$ zx#=};9bpSCi{)0VagRF3s@)PoQptbwSK|3}db>C{#Y+%SJn^KHn{;)&Ibn|5C+W(q6nwy3JCDC@oj-Ud$6UXj9nueCD%5ba{m7JnQS<}T zD~Y4Q(24Ex2y?AacdVPH1UNr6JYha^&~I&H(|_h?8kJuPL+RsP^7Q>m_I4_VsCd&B z#p+|WdO(OWQAOb?wi%~vL2|AleoAxUN*GGJ33usZw5gB7-$;#^_|rzhOs?ZDH^)$- zrvnmygpe!!blQB)^!<4i203ZxNiD*l*@rEfeSo^HR5&o8y&t3Wl|ypd z=d*mU8mnCOH=_||-O~N_=-nKnM;8V8(Q*-eZxs1i1e45PEoxRg_%Q+S2Mo|j1a)eV zz6ntO*1nTz`%^WZ7dzZ>+|rCcDH-y+T-24V%rowrE+%D}=a-*pP%<~@yG4A5B9^4b zZuX4_`VAjRS9ao1OAO#Z(_s~>MMo`*o|5CCs>R0&b12?tdhCnplRVDdt^kf-+vcW0 zoHL2tZ&#w2S3`?PU+z;3j?fTb20sLSWmQ|`PMRTCqOHqW%#v8ac#Rq*%#Gz6N$e2x z*5k8iF18-o>Vtj)c8fQjGSNt|47V<*i!J@-f!F|4#1N;Z*@kJz1$i?3?TXY2{12-g zp7)PK8?Kanwt#C`kNa7oA5R0B-qEPe#Teb-&?pzd%uKr2#6di8xNE~&N==UgN?Ca$-KXJ` zrUG~H`-_Anr3huEiyp{D|KRG$iB>3NGJ7p_(xO}lS{h+!uen5dcfaH8alKv@uGuC7tF_*Cc6uEs+y;4 z@`W}vYd7vTk~KlLs62m7hw`Nfc#qd*>jA<7hPxeN(BfvO+vfb>=*IQx=`9}gGN@q} zrf|PExB`kJIxD`{@+M@BA|D0>w4^M!5{2rV@?X*UW0?Kqk#gRqqT@&3`S z;nF;|pj`y~`T6Lz(E>62>NfEvzp-%*15e3;?P45Hd$#r|s8HWZo$YhR@1ML7zWILW z&g$s-!;&jMyhcy2I;j4>X2+{4k)t1WfnxEBjukU3W(0f0#IiTDT95JbS0cb{gqvxrAogoXN zOwjA}dvkO8&>~1VZyI?*V)dkq4PVaLVXeE>!Ia5W6Q^c<#Vt4uu4wjW&&tCk{nT_8 z)oObN-y5xbV9xjE%C6Mv%M?G=z^bL zxV2A@EdWU&XG4B!lL_-NU7Mcg_hx`k^NmfD-_67_Q6)Z360P$`FULGjnd*# zIuZae78>$-)8n(@yW}=^*Tf)1D=0OMJpJYhFV)8sG$G~%y*HaWZE0Q2# zF%}_<>u3Jg%WYcr;RDrMVr;>Y>4O<13>!ri%z2PL*@naB!d*wv47?ceNtG@5rPh4* z#<_2e;1UJPdFc4y>V}1zf+}EmuXMlX16qTD-Q0CRtKlBr!QTpO_D^pICl5T&DSuy+ zD8rp^_MK9Ka47AZ?!C`|Z8PSaVOBwx%EtQI1w&Vd>bwo!o==+fz7T#f&w2zLxWPm8 zATGu3#>MV05T{GG9*7Iz5_DgRxB?J)$kK@SFe=0}aNUDA_ski-ugvqQn`<&C9*SJ_ z^{M6FQ0t%EyF0(#N*UjvqHH1!zdO8NIlMpf8Gu>#tPaM;0Ykytnm3bI2Ngm~>7@}= z6jUIpw6t^&2cf(JjeLx?z`G+4gkuja-^SJ9kahpv;Lha1Has+RfBxZ(J+zK9w5O#` zdp{C**N>QCqI&V_Zgy3X=yu7YsU}T8*JE>gZ(fOyQF5HP;$rkBA#{VvaE(uljq`qV z8hLZyLN>C2HK0nLHL|qS5_zpxXkwHz$+a|oJ)ZkcDw3X-Y8db4f3n?E4MToX{Z#W| zY(+3`>$loV;A@#CXe1XmKM|9Nf+rLJE3*N2mXk!OnAn9vZ z>JEHht{yzozuz2Og<3T5do`x`=Hx;``z*W-V(&v?dl=oSl}Edi2Obz6E1;$pZ5Ab9 zQABsph%_Ap67zR+i*Ta26I9$$!Bv_w7zR>;wm>4DBdKk8+;X8l52S#c{7Ba6P^2iS zxWWE=j={zLG~`t-Yi_JR-mY`FIjHH~RA4bSym)tF=ImPzJ&4GQoNmCtW9I?RcG+$= zx@^kz?%W%oic<|H*y$NXtn`gffUUzqXcx@+V&mM*t)J-5?G63Pnd|i>gYx}>`n8ub zaDsNfG|rH50%uTGQo4}MV{lnSz+#X*zd#!|b>(NS3HUtpmW);?YGh1B0V`#4wW zh_3y9uy?8FJH%uT&%odXvqUrwC+Z&got3Z9?sl(Qx)>3?p z@74C*+1VZ*28c>|hn-%XA0_nacuVZ&3gmY@jX;2IPg*Y75S#s=yK6qgW(~;iuBPRt z2652hUF}&XtkdM(Bzkv8#cR1W&xbhc+BmR5oX>jz8gtrPQVLfqc|DM`+q*9J8n20x zrX+)E*#%)Q=PM|%2^-Iwa!r_qgzg`#`Y1E!Eid%%&hFf7eGsQlAJTwdSg>=DKtP<{{;3OEI4sJp+I;3|zYmCywM(o?KI$R%E;3 z(@NOwO9+M5168wNHqTyLh1?7hs@(lmq{f7e3XlV0|9o}*rc_jKXmZb{gpw`T>CZU~ zL{jr$8}PzB<&10Mr9r;o1h#Zxj*^D!ndDKC#rRO5>28JL^#zFmg20xN&B;r2Wb+E& z!wa}R{pAEbF}0;6IXv`?1{F2mjrhb`=1;Tny(ab;_pf2`Ik`QP4u-k%-rqgkcet&G zwjl1#Pko*Ba~8bM_A@TaHr^{z^rdulZR{j$HT31SGtB6*PmWexuikrmp1k+ubU38=eLg)iN)E3WABO=C?IQW+ zYY4b@2N<;Q#w*9i8I(&zIhLSjeB;($V+T6~T;4CHBM~E^BPpe&c`>jx&eo-Yd1Xts zt;16H(y{D|1Z|-jO5dmvwwr{!t-Chsm_qpEhV!unk4_p}4MSne-98)8EaC$Z0i_+% zhgu)|n+rIaFS^afOcuAq+5#s*7{tpmrIu{U!+=%inPO3Y%FMvz+F*=~-;D&Wyq~Mpw5jk>yE?S^b?)-wPZgfSTI5;u>OESy`Z| ze#X#{((m5c=PdYab^Y|B@N6{Z41BS9GMbms+|G8h-?f`}SvUxDcJr?j6udr303p`5 zW0d>HZ~gsyc6Bu1E+=*siT)SRt;>t-$me%_c?slwu4arPFYYT-xztqgC<$4b{oGuS z#+wbzM8!&o1z2-|R)Z~t=i|HXdBd`w?6g>?W;mi`}alzgY&z;OzyZ|Ek8^dMLi*v%#QJ?qMnJ2Tl;ek^zr0^>l_RZ>u!) z>&?ljuha3tC8Y3bV{o6_&y@$XbiZQZ%yYMAbAQ#hS5EOW zVhUlOFfgR9twa&X9>Aczlu9^Jf3Ot&CkF-EjC=ET&yI&PPg+w7h=*E8C}Y42SI!9uTcZuQW7uRh~bBr%`J zukARD2LKxte)me;jl8hF7!N8vu6fanMjw)e@jPXC3Z zH#}WxX}RIjl-|Uek(XB^D=-~UxLmrq1!+ktwE#p~67TGqeSAd$E`f|<3t|Y=?&kJ1 z%bOzIK82kut?jdk6nkfLJ=sGql85hDAjtCaUwaAzffj>be7|C2XX z8!q|oq!)S$0$gs`G*m{d$HQGQu_oqDp^ zy*{?Dy3YBSD%z!O*0twlszT7v`&pIT+f9Dv;4JmZw#`fjyjR8~x){5~=NprY-VE_< zT>`|>?$nEvU)#hR-3x?&?;A^FOZA*g#e{k^##Es9yKdV_s&MFPp*y?7i)(?Cx#)|; zaL6Z)9Ad6w%QV&Q%WeHuJ%NTM?sf%+l(-MgdtWAR_Z-PLs%CU7n?B6mIQkHhWshuJ z%;sl;BRh?0=cHpQs_r8Kq{Fhu7aPdSzd3|UIg#s{6Bj>Lf^y*N1>r~Ya_nw{@uZ#P zij)`Mnhxv-Xyek7t%VP9EKvgQTKP>>=yzis@Mug01J!x?6IS;nV)^vmu7oMgv!{lqHdQft7L85w@yH{SX@MX5j5!Ud!m(`UsA$Vai~n$m?D~*nqaF$Wf%hIoE7n^xCZxlPT5=^t$U-V>`0Yd9W?BJ0uXJ} z`lVva$w1594PNsy3>FD;yt#;pIlRAXfCU@EH!K=%J2qfcfR+oz?~9o6>B4@4ySDkw zAgX%oyi$5C>>Fi|U1XG<4WFFPW@BZoCXQJHfq4t3LkCA!S9w#urb*i-ds9m}#h)K1L9vMmk}CTII*LQUZBfuP~}R=Sw`joaP6(mV)g zFp^EPu&WCIL-&>0N}s2Ui-A8uS;+P`KyMxOEo2G7-JH@?9!zh87R8Dc5X?aG~&tql>XM zKmF0h=YQOV%DmRi2Iz3$hhB|$;hEBcZ#SsE^8tDT8U6w~r~DT$-jDd7&mJGU3O;(h zUU(&TyL-`6e{g?xv-Hhli9)#)v2vVl9lEjU>V_OK)*$B&49`ln8iv`H(%2Y4iZ@Vi zH^Y($p4xPKi-btxCBK@(;cA9ZMNqEe$)H`Vn-6!A{t!dTmD$~zdewdNuQ^|_ptTC% z3b;mT&LU*zh8#nyw_;5DVC2KN=wf=Jlnm}*3j@&`Wv*)~&(Va{F2#(3;T>jV%zx0l z?#OT`P%9fOke9R`N7)4Ucvt9&&0TCv7lt;cPp)l2&UQ}EyghnKuR>>ETk`1KU%q0U ze`N?#rkY%Nz|P6|!Zoq?S;%_Zr}zDzfU}w-j&NcfW8gkz*h-&d9hG zLl#*@AXMZrFxlV_{BAW-QL3ZSP*mg}q7kAX7u-bo_oj{9;b`Y(X$^K^W9P6jF*CI> z^)}`-apJJ#HDTv56X15T^5*t;Ha9nRcC}*p+n)kp7E=d%dpEGPsj;iI1DM6k+}^>T zgO#0?oz27A%+lQT&tX;@mm*Dr$X)KIeut$bfhq)GhdFZ(&{!^B>*F_2qL9$ehm!SR zVZ|cFy&#sz7>@G!6c*&|2g2H=V4voDZ~L`@MD&c!2WS z75JdEXU(#WYPkO_lZMk$IAC^x)IDs6Cg7$=r|Hn{McbKd*L^qI0i__k{E=vE?4SzU%qJdST@+BOHV~yUIx~InqB-$jygVX0P zEPAUGnRC;NKjeq+*wX4L#~ep1ZJMcNl0UX(-aZcCKTq_8>zhM^%4?)WwX94k6qLf)IWM%aozKd4r)pqQ8DX!Gh+YzM9Pl`I zp@CFy+>fGl^tjVc6-P63OxLL*fCE=FW}AE~jJP)xc-&**WnW-)@O3q0ns&gxc?z18>O4OJC6`W0Ji`kRC6UX!%AI*6Dw z`auTrmj62p#XeyaBV;Z z|NA?GZkEswjP5H5SmFhzS?wEWD47#(JdnbwOpHsL1Qed{kJhjjSQfh9I^G$Uw{RdK zVX zs#FT|`3*R#rWjpRL6BqU&$789t1^Wx3)`fj@VE{?{gPTqMZh!Sv6_cg_b+j%jK0$( z1riRbdGH|%Yki?GR;S&GFyTLN(6C)Dn#SL3%Kig~;?oHd2i?EH;ajU7UTqR2Vu9<8 z%wufku&qs(8wwXQJ%zD4OIxCy#vro3p)u*koEV*?r>}e3lha%;Fe)Z0i z)kQo3CX|ViH+nk01tnBQm`K9LpV#rep^+s;_v$)HFhZw(8^z*R$}LSc^7i#U{*#tK zQSQW6Iy3&EmzSa;`lxS1`|O>!Ob{60x@EbBsi*iAyT+`sN|hv8Ry0p0m>wr#gvprB ziQmEa>L2|R4h3Bt3dP^_gs z2ON4UuyeQQ*u%YN3<;*FB+zj)se|R7)*r>&5qLvTTM=$O%d*=r-L=PFS@OL~c;V(_ z;~{*KqTd@&JAC1r}$RPfORJKj>+fS(_HbNvusssG8SN&AO8AAu-{>=9jL*dma z$mMTVajc2*#ZqKL96IMKoRp^qj|PahMla(06rsI$Cf7xXwr9Q*232o-0n+ZOH%hK- z;li>&eemuZo$$?oE=LLn3~{?3BucV*1N;NwL*%#d;q(#x7uSv%S5D?UazmImi%B@# zLP`;(RXcm7uiazPUwQnBrVvps(d^1uWB&%Ap2s?YWS{RcE8f_ekKAMZ6Ah11Gif4_ zXqf#k&;a}^h%oqfHvE4?1B;2dtMPvwLO>(tc?p`9@)C!s9?OTnI&|j)_$oF~6p4!i zn8~;wd8-oQutd!q=^f)KiWVy zDmiU#?ZQD3FX=Zi(PEOgIGSWdm80S6Hmyw)=+Je%(<}$rgBpTurW5fLjf$(5rLw|@ z5jD{oL~@5!_(BhRJfC*}a__#K?91(0_)qI1!v{@{g*%n2;%_Q8*~n#B-)C?!+9;XM zY$}-YdH4fwalk7EEg`on6EK6S-RaD-R*f34-di`y4(R^A2g{S+8XuzkunQ$~hI>Y? zCa}O$vGyNF&DPOKdF&InE<%-M(l~Ibq;;lJe@b(;t>C@ont)pa{)gm@^UUezWw(q$ zbp@C;Mvp_!q9dNeks-w9-$IDz@_#~zAAxnY@mRlA_!txPdFHdbhUvA|AnaKSlwF18vas-U7wQU)rHcNtTW=Ct7%-GNz>1?Gjraoz+Z!Bp zvln4o>cdmOn+a(*p6KwrKF{|I5Kcyw^DjK{)W%}(RkJ2;z~=-3bWC3tfTv%gGz}b| zm*vKIV|()b=+D`qPCIdWBDCQtRC(5(+orVSLWX9qMa}=vU7ZfxaM96b)EEi|6Haa9R z6WK(6QYT3eWA1ErE7zwSxx<8pm@?jO#~l$I{%~EPR8h`@M#8AtPq+fSUmXj6sX84! z+^F{vct)2j9fU>u{=phNMgUiDrust>G!TtkT;}}COV>@2S-~SP#Ye=>b^u@#k;n2T z%2F_R{qm(AJxjP1%lfPLF3LqrvnaG#+{?9JK>Ib3Vf>8G7F$UIIU0`{X%?*4zhO1! zxYyM56|s;j*XNdLjZvRcVblnsJb!E;ubjLA26h*zse;pz(W~|s;KrSQxN@jWHGFL? zX0a6H!q)mBzuWRWu!3_UV^D8!dewZgHsQ|3`zIWb zo5k2XNVUxeZcs3wTuW_Ou-AJ%rnl@_<2cCtYw?j8$HE6Ihwff8j#ONwO#fsi52-Bx zqu!&d&N~>?^tFYmSo|0nfi%TLSZH0IC12<|Lq%~p=jSp8FH|?~Z5L%Xsp8&sjA^rU zFa1J=IW-HUp4a?x%Iw$D5gJO^TzYmZn6ugE+(J-Jsu!Z-fxI{}Sc`w{fpcVXS zsukUUyNT%=E0RPs`0t}M>^xRH*xspDuD2+DTvY8y;<6lae8(vLL*dyp^VApZ$Yw*- zfy&u<{ubnTM&UyQ)P`~Ud2=0|xQxb-=Ywf=2W>3yqU|{zy`u{QU%1ya+Eh2DKWpXj z6+-tJqbl&I^yiE=e>WU0UQ$)#Fu{Zir(x&^rg@dp@+JdmHEq^}j9a*Tw8)m+L@Iq5 zYhoMtVD&tNOur-8|5+C_YaF8vHl11CIZz3V#;4L^>$ECJf*6EJ4`SOVA!w>~XHS1c~boFnsj`ka=H z9so5e^M{GlK5b^aSaxZWiW*w4COzlE@?0yJQXYH&Y1;}g>=Dz^zJcsph&|OV|CYbc zp!#@Y;*kTYrC@$fpvS9v1v5NYR3xYtYnU*mnOMWj?aM-^Kyont{>hrVglwKSRoCaS zVB+;|cOrp;(U(j*=fWf%n6KV#83)p-KGy&q+c%D6I~Y~t6Yzh*Zs5T7CztkT{sEgb zckUSk9@Z#0+TXT5egwPXW{7a+-p?ZW;mrNyu{BEAm&%S`2<#w>0M|A~@clQ?I~`N1 z+_5V<%6)R_yBT>JDkkn~oo=6QhuGVr{AP)xLy92QJyPACx&oCc3Et|!XWhCJZ=@~( zQ1bQZv)9~JtK-YO?TPqOCjDq*++S9X`^ew2*v-G00!uum6pyxN#7sk1t|og_gWC$Y zoxW`3yBU9;(CeZuUJt}k#KgaC#NP=plX*E6w}(xe<=W|l(^7Z%l+;Cyy73crSkMt` zPKc9flr8;bU_Eq^-lf`#{~-B?;roWyfbZU|4TiSODT|0zd`q!UurG<5jbNeuR(hmK zw?F|1;d$#jp?tw{Cz=YNvP$xZj%y)DKwcFNJfN@BAJ#zUp)gWE^PL0cX4a-X(BrN5 zXz0cj(BViRw0Z8m148!E;h@J)IQvSx=TErEuDV0O7POrQlH)@h)p4Yi)j$fErgS;a zc?Dcsvo7GIwQMgEZS9I6cEUUEw$bDwFoR(f9^4JBrPGZy(Yxoz%v=|6Zz_3&o(t7H zLgNSXdt0}sfaUYGX0Jl;fl~Ki1MnM>@!ik`5x9EI$2_WDEx{HW{?n6;kI??nq0A0J zmQOM_eE;OpV7r&jC4dBy2!@vQSl_cn{nwr_3@9c5#yIy5xj(cX8RKSmrrL=K;B3$aG{c04bj$i?6O z6Oi=(3n111XCT>}Q~eD{z+Z{vR2&kUA2_XM$4tKF^*}!BbwQ1Mc~X#prRwJjT?R*Z zD7Id-%Fd7aZo0m7XF3}t0&U^}BR&r&A8DMDKatVu!3ZpE;na3S+r&b*h9^7s-SX!3 zbzb}O=<-s3>zI&H(PR)R-?*vSCzz_xV7wm%Hba~yiOXfn zOyz_xJRPVlV^*hb)X#;1h4$5HGz(q)19qPH!bcPXmISuR!}L@AYfFQ~`q|XNQaD^o zTrXm?tvT6h!POY>rI7*p@Zp6ZUXpMW)_3PLqMY{nnp?|F36JURGtJ?o_8z)6Vf}NS zW2u1Xj_=b(p@ltUeDth}UI3R|Vfneu4FQ+gaN+=cK(TuM*BzT2GUb%xSS5FJ^~{|o zwk%tp?{Yp%n^!~kFdi^zKC8NWDVLR6zs$0%fN`dM1eQ+tx<^fMa{PpEEy-l;BJf*L zNmL5IEL`P>LGu#p_O`}hcB0DlQP{!^GCTr!$dL0e>FA~;#%M6%fil|PfpS^l#NMYw z1DYle@}i89-s9m#(?oedv&qN{_~t= zRNC42z!B>svqDwJT@>HaY>btz*^KI1>GYHbV|NXEiIv=|aVmJUOb^OS%q(AG{d^T+ zd)eU^+?yElcm)UBnENvywM^KHPx=5?8}Y>cId2j~ro(BP@Jwz_X2o<%OQ=;X+W{s4 zxwVH1t#{hRo~ zwmo|DzKYw?BS+gCQc6uJEakS{GC5T4={;DOo1OY_Po_j8` z=yS=}d!Pzn14Q*H9Mw9^d1=J?8Jq3Uk*ml91E=OicLC>v?$IM3V7*|tsFO*Bn?TP1g zfbUOuVUQFX0&Av;d>>n|h-{owyApwf(BEfqp1F}UTp_olkw}UnOCS|SeG2Ru_&LlA zMnV%J(dI{u>V|4agy#uWB^_Ta_6d|fP?`7g$253e1y8}lY&eU~MyU-~KY z+21~G;AwvFg16cEv6_0al!D5#{6j`+BS{k@LN$&zJap{YN*}u{u{%D#BwOC#+xtdc zn>k|XgXuJ0n%bj{_KQ?Xt^KmxXvDlX=a!@K?$)XDyCBn!=+~(4zBIix2EgTVgS@r) zF*ff{%p~3%4 z*h!ybCdLrf!Q@+)RySFaOQ7=+VKRunoelrA#>tS6uAV2Hx{g3GatC(h6kKQ+}Lrv);&NgaE%t9?YMlj|9kebZ8qN@ ze~rL7*)4(HKdxiF43+Zv8sU6@p^V2v)01l5E5{2*_|g}-tJcIzMZh)s(faE+OzMcK zcUijvzJ`&xF1V#GSyGRO_Pxn8Kfa)P`3R9N`Z}_&CFRv`M}&~)t9I8bbXM!q=ya0u z&NFgN!i;mD+Weww_e?=KQ=KfsQr>mF07~XXc_%4}5`DMh&Lw3p9~2=uKd-h3&1Gwk zp>EX-N%qb*5;Eb)z9m4aiDOT?cyZ!Y(=V(tnMA{09$s?pVOo|DUlcUbX|5gp7lebx z*V4+}Ezd&kVpCi%nO@R9E@KSB!6pr!)*yRVP*lxEc=dxWa{XQ$hRc1X_I(~mxOtc~ zJI~C0G4uiBo8ZV?f`QE4QaCE>b7Xh#SW!P$TLT_<_D(E$CHmf)2vBqvNDr< z5+hRUUe|g`mOOz0GP~!iWaIr#z199`s*OUXeNq}xk&iA3jUL_)W3LXve9%;dTQz;# zThB9gnqwpiNG_WzRix@L5D_cz!+uagnZrPzPmb?5;dUq>n}aHV3P&RJy5{ z9=%SU+yAB52L!aPe+VA>IcLi#QcUL&2L|oBC98$xue|&8WJ7KD^uy0-Sf!9$OI~#{ zKCZqNS+8Q>G)&x3sz*2?k6&@Ex6UQXbp?XpyI(b z>^Vc2_}=yp*9imzNgj3*rvy`V-Rwv#gWb)&l`fj3s)1L(nb;a0ZuDo68=jnwwc3saF_V*p`H?2Jq#b-#FOIf~Z-a z(idV%QK+M$3rW7#36}>zZDJ1alZ!Xh@E8)Z92{ORPy^0U?H0PeedHE~({2WP*)h#zFWt0a~3X}Z^hqVYSmS9_N z>)HS<8PN^-j&W4c{-%zlzrIVe+`Kht7){No5i#&;ea1M_%53r^*9D`MJ$9CEU4kIM zvi#1N^Hz=+GS!!yRJ)?g{p)L^?q~Ef@0Y2SG|IewQlt1WtIq2*2^~c;$DsO%_#_e( zly`vb0YO9sM;H3N@6Tr@iPUN5nn5*T5!K};8^uo_+L8 zKQ;2o*F-}xu$W5?x;|els<6eI*MFu0Zo)f2U3bNlwBi{70_P<79DF9nhgKGu7=m_<@BlKtGXXbCq_ zx@*-~A?MwakNr6xL8$EX$D67Q#Xd(%;PZ)9lHXdKsC6DVkVpNn&0iM6{Q=g?6kj*0 zAVclZo%m{jxK26kz9R4A@q)&wm4LOq>=^2GK|8J^ZVapi;l^z5$kDZvyHEcux?xfQ)^S}BWb1|FcTOO@cAg_F(i#UAzIlS&EU*d--n z6(d)n5)SAR{Cqfr8bUcd4jwm!@y>#18#~Zg79Mhw>_s|~cTka484X7L z5w#x!)6%a$|LCASH-+^Yum&iP0as#t%z_n*2L(^Wz7f8--p6{!8t;@N0o`NUY@Yl& zcRvQ}KbN~sB6e=n(2`Ekbz#$g(@N4&E;u`M9C5@D)E0ATb8psne{w*3F#X=3@BPf} z`j^9xnYBOq52JE(=AC3DuBBAHpC$$>F46Ug3Z>gpRbv$2lZPbnMfs2+Y-9dZO_>taYL`5s7Vom$_vQbn2rFR99tKPtqTA6-c;V1ke zdDAg@_NyNB`z*^7porA#6!8l#reRTxD&+!g+~!R+P2R10nG=-skk8!#H0he_xzedG z<>cn{=A0+;p$6Z7Ha{5hwDG3aYzyivuAP++5te*n(pyLsz4CxyK*hW!xB?mrh5`_u`THto2rv1F0 zFNb90HNM<96ic!d1hl+!wG!!;vNB)ha~MeuNtD=Ru&Y_}G|QZ7;vv_e zo4HW9moNsm4kOb8*AzW9tXxu)Da1aQyYYqp)$2RXg^HpU{HB5Vp>MTN2oVtlNZ$wQ zanH2{{Mx*9?mgYmA}#@x}5Ag}c_#!XmTL>7sd1V`oQ z6yXm!8(V;TeP{m1#b5-}`P#@E&e-3M_J-FVf|)oVJC1%-i~hd+5A{h4#mGu%`b)8i z-7L}%9D-m0k8l1f}bR2f;A=2|)tK1Lbrl67#gD6FmZ&Cv>55se37 zC0mO2luABkh1}>#9Mh*I1;f-ozF;op{nYC~lJp*Mpu(ed^5Srue_%JNfwaQY-&2d+uZYb6T^;FONcd*$)36uHtuK)WFjMF1pj)t9$ z-HO7cz}~cdir?PLG?OoVEVBy#lDzS+6B53F?QKHeEyzFY;(yPO3f- z;gIVkGi)ZfEjtch-HO9Lj1zd5JKXfn`gT64vs9B;EKBX4RVB3?yLo;K$Q+^hEo>r5 zN9&0KxAyc1qOBr(^8y$2_5JF=o1DuREgy*DwIsg_&W)+{4fb_Kv=cTQSJnyklWPi| zL1Tb}>$#%R!D+*k!zld>retBx7T$uNKS;$4shqdvxAw~Vs)~RI77>^a2QWdxsw4AEYPRv z9R&6y=aeB|=9$vK*cHl%JnH39I?8q&3cnd3&fuLO;P`B^-2cFijFVH@KZB`6wq? z_=c1mg-dFK1I1#E@^hEQn2xyy<|E3}j922+N^D1-a|FQD<##_#aTgD7nN{wi70UW- zz_T_rCsF4u3uYEV;dM}ys1JGT=Vd9(JBIsA!kOC%&gdwkQ}RbMJQ>zc(MhAJGAM(? zRiC2sqGv&v>FY)6!io+an4avR7B$Rruf7r*!4ZEU>Tt?RpOm5ZR`s^Fmwr1*WjO`K zQt>=v&v*?!UUp0<#>}_;(DwIbh&<-;LqJvPb!Iz#>T}$jlAX)`%(^vVmoJfb;L(T1 zQX%l2-Lh5!hG}E{?$-}r8t;&kc=on@a!Ev8?XS7PyUmzTicw#G<*>=4DY4A6;OR`q zFT4(?`sHIpjic-Aq}d?9!F&=R^UK%hnDS&_O(57;0ux(0;nAu{4%Z1Ml)u&TYX$J| z#W8(&>nbRQ%8c8}&ORaBXC05sd5w}89mgC4hfawk;~=Oe)g71QXD8&zc>#AqW8lVG zxv2Kj7hR|ZeH<*zAI+O2tWk?_S9e|>JUtc+Dg0E6P?lJr_I8-+bbPra3NUpHiDli{ z&Xc;&{L&+P^R#ejuyLg!ss3jc*!nf_Fb8a%uSX`wRg2uQFh4!L3EG$wrd{-@;noOy zy<3fr;B&Ce&+VBG687Ycn|WhN*mT^nS}Njq+;M%AF&?^` zj}&y#(X~_@x~NjaHzA=<(b*;#GB00&yZSqIt?!Sp!?DG(IG2o;F5_VUu)3b+71%S* z2fO5p7x{zWL5H?GyutN@S=dp?C$P)w!FA-evjYf}0>s(EktKMcn<@giMK36Bml{X2 z3f}B$2G>t!G0*+dqu9|5*78oOS7Obda6742GMw&{ce-bq?%TBp79p7!#C3yojHW$w zgGfR5R4|;}o?`62WCpYK35GDaL@;1D1#dUWLpqeEnhX*82oQ2&{O_|?XqhWgUic^| zS@{Xp;;2GoW;WjL?6#K1mR#H}d|u{eTwY!#j<&3hV9Nwsanv^n+v2Er&;RC5S> z-^&30JGbcnAmgvu)qhv<*Uax9m&w1Hp8S8M0{EXjtN)dX|JHQ!?^^zr_4!BA=TEBn zUu{n{&zipo$>vXYWmaukrX%5_@|)%|MdJT^YkByr~god z@^?!yTBhhfZ)X$~?7u7e$McRhQjxQRjk&2S@|t%5tH?h>|8wXu^2Z4c1trZE`Oc#J EFOYM9Q~&?~ delta 1306 zcmZ4TfcIe&>jX`)q@rxYl62FIsvc_sz|FCy#jA`^>jF z5x^nYD6(?Lvmg7<3qJ5xpZRj8-DUr_MP8*p_x*a3zR2ZdMWV-#uNM`)PBXiB97;cw zEF^T@`ptK%&mRg_tZrDRk>QqkZdZpz%j~s%L2-^ghg!IpuYKv0lFRk>*)I5r>s);O zH}&7mjIkGFJUmWJ{W(o4*jtwWnFq6L$94~=N4x(eJ=!T;U;LhR;cm{qUrS!D`}Z`@ z>AEVPX6T=3>;KyP_;oM;h+^`&WtmcsCP?@!+3BR$t*9(IXV$~OsnrJ;SNAckGjjmvF+`v{sWPb%_WoKvK|!copQ zCVx`KO#gq;Tzcx(dMpo8{v~d@YGJEU{Y7@|@yofMmd6$U-Z-GXQu)VLmb>$O%eTn! znmwAlOsAcxzJ0rORJ?Q_pW}j`XIuR;-!5IPo?~Mk`g57@wXbbL?ICxjgnT&1*SP2Z zj@^|%YG$qUe4A;#BqFLO?|t6BocH!o^E`NW2WhUH*s{XAfJ3B2|H1t)G1^&Dse2O4 zmACT*t<_Cuug|k}^{;>Dmg*QDeqmdMh03d- z5AqYs-}zr}+#a#^{GZS$tqV79wVYtR5n8jeZf(47^3u@9s*!h&&GhfP%N{(i$E|@#{w)jNF*b>s0s2>6F`ak11@wD}JX1y!tkk>q=dM*cOl7>M`5S zK6{z)`{-)hoh3=#i{Gq`tIyI;XG{@nZj+t%ImfemJ(ffM)EQVEv zs_xHI^JA~R(Y|&>T6Rlp0L$I}?`el_zR^+pzo+HT8o?`hQ-0pN6s><&>1`Od?f;L0 zHS+gZJ|BoaYBjv{ zwu?oVoR$jfeZ5OSXSPfE)zDVu?l)6(#CQBW#QUDTYL`=)WWtnrUX?PlZzcX-HYYqM zn0>XCS8;TT=hhe33VzmKI_?wue$uy@PeRhah1IBO7EDv(w7ssVHuY=3!H*fi|NidY zu>aK?Uh{^3)eH;_|NjSgvvVkaHF#>o!oa}8#lSHALpHP4^yAsg{5T4w>GnCydefzH znEBnor4~lfq*sua9^lQ$B*GxVzyX9HfNTQ~SOiA=w`QEqSimgG$IQUY@Bk>9?Z5~m E0muYT1^@s6 From 31d38f66708c1103aa74b4cb54440192be3b56dd Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Wed, 30 Oct 2024 13:33:45 +0900 Subject: [PATCH 12/13] split test --- server/e2e/gql_project_export_test.go | 130 ++++++++++++++++++ ...ort_test.go => gql_project_import_test.go} | 119 ---------------- 2 files changed, 130 insertions(+), 119 deletions(-) create mode 100644 server/e2e/gql_project_export_test.go rename server/e2e/{gql_import_export_test.go => gql_project_import_test.go} (69%) diff --git a/server/e2e/gql_project_export_test.go b/server/e2e/gql_project_export_test.go new file mode 100644 index 000000000..5c2575945 --- /dev/null +++ b/server/e2e/gql_project_export_test.go @@ -0,0 +1,130 @@ +package e2e + +import ( + "fmt" + "net/http" + "os" + "testing" + + "github.com/gavv/httpexpect/v2" + "github.com/reearth/reearth/server/internal/app/config" + "github.com/stretchr/testify/assert" +) + +// export REEARTH_DB=mongodb://localhost +// go test -v -run TestCallExportProject ./e2e/... + +func TestCallExportProject(t *testing.T) { + + e := StartServer(t, &config.Config{ + Origins: []string{"https://example.com"}, + AuthSrv: config.AuthSrvConfig{ + Disabled: true, + }, + }, true, baseSeeder) + + pID := createProjectWithExternalImage(e, "test") + + _, _, sID := createScene(e, pID) + + _, _, storyID := createStory(e, sID, "test", 0) + + _, _, pageID := createPage(e, sID, storyID, "test", true) + + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) + + _, res := fetchSceneForStories(e, sID) + + blocks := res.Object().Value("data").Object(). + Value("node").Object(). + Value("stories").Array().First().Object(). + Value("pages").Array().First().Object(). + Value("blocks").Array().Iter() + + propID1 := blocks[0].Object().Value("propertyId").Raw().(string) + propID2 := blocks[1].Object().Value("propertyId").Raw().(string) + propID3 := blocks[2].Object().Value("propertyId").Raw().(string) + + _, res = updatePropertyValue(e, propID1, "default", "", "src", "http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") + + _, res = updatePropertyValue(e, propID2, "default", wID.String(), "src", "https://test.com/project.jpg", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://test.com/project.jpg") + + _, res = updatePropertyValue(e, propID3, "default", wID.String(), "src", "https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") + res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") + + fileName := exporProject(t, e, pID) + + defer func() { + err := os.Remove(fileName) + assert.Nil(t, err) + }() + +} + +func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { + requestBody := GraphQLRequest{ + OperationName: "CreateProject", + Query: `mutation CreateProject($teamId: ID!, $visualizer: Visualizer!, $name: String!, $description: String!, $imageUrl: URL, $coreSupport: Boolean) { + createProject( input: {teamId: $teamId, visualizer: $visualizer, name: $name, description: $description, imageUrl: $imageUrl, coreSupport: $coreSupport} ) { + project { + id + __typename + } + __typename + } + }`, + Variables: map[string]any{ + "name": name, + "description": "abc", + "imageUrl": "https://test.com/project.jpg", + "teamId": wID.String(), + "visualizer": "CESIUM", + "coreSupport": true, + }, + } + res := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithHeader("Content-Type", "application/json"). + WithJSON(requestBody). + Expect(). + Status(http.StatusOK). + JSON() + return res.Path("$.data.createProject.project.id").Raw().(string) +} + +func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { + requestBody := GraphQLRequest{ + OperationName: "ExportProject", + Query: "mutation ExportProject($projectId: ID!) { exportProject(input: {projectId: $projectId}) { projectDataPath __typename } }", + Variables: map[string]any{ + "projectId": p, + }, + } + r := e.POST("/api/graphql"). + WithHeader("Origin", "https://example.com"). + WithHeader("authorization", "Bearer test"). + WithHeader("X-Reearth-Debug-User", uID.String()). + WithHeader("Content-Type", "application/json"). + WithJSON(requestBody). + Expect(). + Status(http.StatusOK). + JSON(). + Object() + downloadPath := r. + Value("data").Object(). + Value("exportProject").Object(). + Value("projectDataPath").String().Raw() + downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", downloadPath)). + Expect(). + Status(http.StatusOK). + Body().Raw() + fileName := "project_data.zip" + err := os.WriteFile(fileName, []byte(downloadResponse), os.ModePerm) + assert.Nil(t, err) + return fileName +} diff --git a/server/e2e/gql_import_export_test.go b/server/e2e/gql_project_import_test.go similarity index 69% rename from server/e2e/gql_import_export_test.go rename to server/e2e/gql_project_import_test.go index a61ed6678..e7fc5b3e6 100644 --- a/server/e2e/gql_import_export_test.go +++ b/server/e2e/gql_project_import_test.go @@ -2,70 +2,14 @@ package e2e import ( "encoding/json" - "fmt" "net/http" "os" "testing" "github.com/gavv/httpexpect/v2" "github.com/reearth/reearth/server/internal/app/config" - "github.com/stretchr/testify/assert" ) -// export REEARTH_DB=mongodb://localhost -// go test -v -run TestCallExportProject ./e2e/... - -func TestCallExportProject(t *testing.T) { - - e := StartServer(t, &config.Config{ - Origins: []string{"https://example.com"}, - AuthSrv: config.AuthSrvConfig{ - Disabled: true, - }, - }, true, baseSeeder) - - pID := createProjectWithExternalImage(e, "test") - - _, _, sID := createScene(e, pID) - - _, _, storyID := createStory(e, sID, "test", 0) - - _, _, pageID := createPage(e, sID, storyID, "test", true) - - _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) - _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) - _, _, _ = createBlock(e, sID, storyID, pageID, "reearth", "imageStoryBlock", nil) - - _, res := fetchSceneForStories(e, sID) - - blocks := res.Object().Value("data").Object(). - Value("node").Object(). - Value("stories").Array().First().Object(). - Value("pages").Array().First().Object(). - Value("blocks").Array().Iter() - - propID1 := blocks[0].Object().Value("propertyId").Raw().(string) - propID2 := blocks[1].Object().Value("propertyId").Raw().(string) - propID3 := blocks[2].Object().Value("propertyId").Raw().(string) - - _, res = updatePropertyValue(e, propID1, "default", "", "src", "http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") - res.Path("$.data.updatePropertyValue.propertyField.value").Equal("http://localhost:8080/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") - - _, res = updatePropertyValue(e, propID2, "default", wID.String(), "src", "https://test.com/project.jpg", "URL") - res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://test.com/project.jpg") - - _, res = updatePropertyValue(e, propID3, "default", wID.String(), "src", "https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png", "URL") - res.Path("$.data.updatePropertyValue.propertyField.value").Equal("https://api.visualizer.test.reearth.dev/assets/01jbbhhtq2jq7mx39dhyq1cfr2.png") - - fileName := exporProject(t, e, pID) - - defer func() { - err := os.Remove(fileName) - assert.Nil(t, err) - }() - -} - // export REEARTH_DB=mongodb://localhost // go test -v -run TestCallImportProject ./e2e/... @@ -96,70 +40,7 @@ func TestCallImportProject(t *testing.T) { // fmt.Println(toJSONString(r.Raw())) r.Value("id").Equal(sid) -} -func createProjectWithExternalImage(e *httpexpect.Expect, name string) string { - requestBody := GraphQLRequest{ - OperationName: "CreateProject", - Query: `mutation CreateProject($teamId: ID!, $visualizer: Visualizer!, $name: String!, $description: String!, $imageUrl: URL, $coreSupport: Boolean) { - createProject( input: {teamId: $teamId, visualizer: $visualizer, name: $name, description: $description, imageUrl: $imageUrl, coreSupport: $coreSupport} ) { - project { - id - __typename - } - __typename - } - }`, - Variables: map[string]any{ - "name": name, - "description": "abc", - "imageUrl": "https://test.com/project.jpg", - "teamId": wID.String(), - "visualizer": "CESIUM", - "coreSupport": true, - }, - } - res := e.POST("/api/graphql"). - WithHeader("Origin", "https://example.com"). - WithHeader("X-Reearth-Debug-User", uID.String()). - WithHeader("Content-Type", "application/json"). - WithJSON(requestBody). - Expect(). - Status(http.StatusOK). - JSON() - return res.Path("$.data.createProject.project.id").Raw().(string) -} - -func exporProject(t *testing.T, e *httpexpect.Expect, p string) string { - requestBody := GraphQLRequest{ - OperationName: "ExportProject", - Query: "mutation ExportProject($projectId: ID!) { exportProject(input: {projectId: $projectId}) { projectDataPath __typename } }", - Variables: map[string]any{ - "projectId": p, - }, - } - r := e.POST("/api/graphql"). - WithHeader("Origin", "https://example.com"). - WithHeader("authorization", "Bearer test"). - WithHeader("X-Reearth-Debug-User", uID.String()). - WithHeader("Content-Type", "application/json"). - WithJSON(requestBody). - Expect(). - Status(http.StatusOK). - JSON(). - Object() - downloadPath := r. - Value("data").Object(). - Value("exportProject").Object(). - Value("projectDataPath").String().Raw() - downloadResponse := e.GET(fmt.Sprintf("http://localhost:8080%s", downloadPath)). - Expect(). - Status(http.StatusOK). - Body().Raw() - fileName := "project_data.zip" - err := os.WriteFile(fileName, []byte(downloadResponse), os.ModePerm) - assert.Nil(t, err) - return fileName } func importProject(t *testing.T, e *httpexpect.Expect, filePath string) *httpexpect.Object { From 25c10c7998e8d5f22819562bb8011c3464f1c9b5 Mon Sep 17 00:00:00 2001 From: tomokazu tantaka Date: Wed, 30 Oct 2024 14:33:35 +0900 Subject: [PATCH 13/13] modify value --- server/pkg/scene/builder/decoder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/pkg/scene/builder/decoder.go b/server/pkg/scene/builder/decoder.go index 3034e8f2e..d0972a6d1 100644 --- a/server/pkg/scene/builder/decoder.go +++ b/server/pkg/scene/builder/decoder.go @@ -167,9 +167,9 @@ func AddItemFromPropertyJSON(ctx context.Context, prop *property.Property, ps *p func parsePropertyValue(ctx context.Context, value interface{}) (*property.Value, bool) { if fieldObj, ok := value.(map[string]interface{}); ok { if fieldType, ok := fieldObj["type"].(string); ok { - if fieldVal, ok := fieldObj["value"].(string); ok { + if fieldVal, ok := fieldObj["value"]; ok { if fieldType == "url" { - urlVal, err := url.Parse(fieldVal) + urlVal, err := url.Parse(fieldVal.(string)) if err != nil { log.Infofc(ctx, "invalid url: %v\n", err.Error()) return nil, false